Repository navigation
Releases: ggg123124/vrchat-assistant
Release list
v3.4.0 — Web Dashboard 图标/位置体系大修 + 群组写侧 6 工具
v3.4.0 — Web Dashboard 图标/位置体系大修 + 群组写侧 6 工具
窗口:v3.3.0(2026-09-23)→ 2026-10-12 · 19 天 / 109 commits / 33 个合并 PR
MCP 工具:122 → 128(+6,零移除) ⇒ 与 v3.3.0 的调用方完全兼容,无破坏性变更
本版看点
- Web Dashboard 图标/头像体系收口:上游把
currentAvatar*改名后,5 处仍读旧名导致写入恒空(#251/#259改用iconUrl);全站 15 处头像改为「用户图标优先、无则回落模型图」(#257);「换模型」不再被记成「更新了头像图标」(#263/#265/#267按 file 的 tags 与文件同一性判定)。 - 位置行渲染口径统一:
traveling:traveling规范化、私人房间给人话、左端「从哪」的世界名/图改走world_cache(#250/#261/#262)。 - 采集侧静默停更修复:应用层静默检测修半死 WS 连接(
#248)、同世界同实例重复位置事件去重(#254)、对账窗口下界改用「最后一次能证明在线的时刻」(#252)、在线计数含网页在线 + 对账周期化(#253)、watchdog 启动宽限期修重启风暴与磁盘暴涨(#243)。 - 群组写侧成体系(本版新增工具):群公告 + 群帖子写侧,追加式发帖根治「发新帖顶掉旧帖」。
- 日志子系统一条因果链:运行期目录被删后自愈 + 失败去重 + 降级报生效值(
#279)、测试清理改非递归不再删线上monitor.log(#281)、prepare_image.py --mode square崩溃修复(#283)。 - 数据语义与可达性:简介改走
/profile端点(未知 ≠ 空,#273);VRC Search 过 Cloudflare + RLVRC 时区按北京时间 + limit 截断未来优先(#271)。
新增工具
set_group_announcement(#270)+delete_group_announcement:群公告发布 / 覆盖(可传空串清除)与删除- 群组帖子 4 工具(
#272):get_group_posts/create_group_post/update_group_post/delete_group_post:帖子读写——写侧为追加式发帖,根治「发新帖顶掉旧帖」
合并的 PR(33)
| PR | 作者 | 领域 | 标题 |
|---|---|---|---|
| #243 | @Sand-85 | 监控/watchdog | fix(watchdog): 加启动宽限期,修「杀掉正在初始化的服务」导致的重启风暴(含磁盘占用暴涨根因) |
| #246 | @sansuiUwU | Dashboard | fix(dashboard): 动态页筛选 chip 文字溢出——.star-btn 由固定宽度改为最小宽度(issue #244) |
| #248 | @psenY | 采集/WS | fix(ws): 加应用层静默检测,修半死连接导致的动态流静默停更(issue #247) |
| #249 | @psenY | Dashboard | fix(dashboard): 头像图标不再可点击放大预览(原始大图造成巨图) |
| #250 | @psenY | Dashboard | feat(dashboard): 位置行显示「状态 → 状态」+ 取不到世界名时给人话(私人房间) |
| #251 | @psenY | 管道/图标 | fix(pipeline): 模型变动检测与图标字段改用 iconUrl(上游移除 currentAvatar* 后两处恒假) |
| #252 | @psenY | 对账 | fix(reconcile): 对账补记离线的窗口下界改用「最后一次能证明他在线的时刻」 |
| #253 | @psenY | 监控/在线计数 | fix(monitor): 在线计数含网页在线(加开关)+ 对账周期化,修 WS 间隙错过的事件漂移 |
| #254 | @psenY | 管道/去重 | fix(pipeline): 同世界同实例的重复位置事件去重(修「换模型被呈现成一直换世界」) |
| #255 | @psenY | Dashboard | fix(dashboard): 三处图标类在 primeicons 里不存在,渲染成空白 |
| #256 | @psenY | Dashboard | feat(dashboard): 动态页顶栏去噪(删导出按钮 / 删「数据库共 N 条」/ 去掉计数徽标 / 修计数贴不到右) |
| #257 | @psenY | Dashboard | fix(dashboard): 头像显示改为「用户图标优先、无则回落模型图」(全站 15 处) |
| #258 | @psenY | Dashboard | fix(dashboard): .uicon 规则被 .world-link 吞成后代选择器,事件行头像失去 26px 约束 |
| #259 | @psenY | 图标 | fix(icons): 用户图标改读 iconUrl(上游改名后 5 处仍读旧名,写入恒空)+ 文案改为「更新用户头像」 |
| #260 | @psenY | 文档 | docs(dashboard): 补记 2026-09-25 的界面改动与同批后端修复 |
| #261 | @psenY | Dashboard | fix(dashboard): 规范化 location=traveling:traveling,修「公开 · 传送中」荒谬渲染与左端缺「从哪」 |
| #262 | @psenY | Dashboard | fix(dashboard): 位置行左端「从哪」的世界名/图改走 world_cache(与右端同口径) |
| #263 | @psenY | 管道/图标 | fix(pipeline): 换模型时不再重复产出「更新了头像图标」(bannerType=avatarBanner 时 iconUrl 即模型图) |
| #264 | @psenY | Dashboard | fix(dashboard): 模型名补全——载荷未带新模型图时用同事件缩略图回落;无可用图时保持「未知模型」(不跨事件猜测) |
| #265 | @psenY | 管道/图标 | fix(pipeline): 换模型不再记成「更新了头像图标」——按文件同一性区分模型图与用户图标 |
| #266 | @nixi-agent | 工程 | fix(scripts): dump-tools 插件加载失败时响亮退出,不再吐出残缺工具清单 |
| #267 | @psenY | 管道/图标 | fix(pipeline): 图标 vs 模型图改按 file 的 tags 判定,修「换模型被记成更新了头像图标」 |
| #269 | @nixi-agent | Dashboard | fix(dashboard): 左侧头像按该行当时的图 + 模型名只采信可信值(承接 #268,含 img-util.js 追加冲突解析) |
| #270 | @nixi-agent | 群组(新工具) | feat(groups): 新增 set_group_announcement MCP 工具(发布/覆盖群公告) |
| #271 | @nixi-agent | 事件/可达性 | fix(events): VRC Search 走 core 有头浏览器过 Cloudflare;RLVRC 时区按北京时间;limit 截断未来优先 |
| #272 | @nixi-agent | 群组(新工具) | feat(groups): 群组帖子写侧 4 工具(追加式发帖,根治「发新帖顶掉旧帖」) |
| #273 | @psenY | profile 语义 | fix(profile): 简介(bio)改走 /profile 端点;载荷缺该字段不再误报「已清空」 |
| #274 | @psenY | Dashboard | feat(web-dashboard): 动态流类型筛选服务端化(修「筛选简介加载慢 / signal timed out」) |
| #276 | @268500tao | 文档/X 抓取 | docs+fix(x-worlds): X 博主世界推荐抓取经验 + 三行格式非 ASCII 作者名修复 |
| #277 | @psenY | 文档/skill | docs(skills): 修 SKILL.md 里不存在的函数名 extractWorldRefs(+ mokkei 行解析要点) |
| #279 | @EMeowAGENT | 日志 | fix(logger): 运行期日志目录被删除后自愈 + 失败去重 + 降级报生效值(修 #278) |
| #281 | @EMeowAGENT | 日志/测试 | test(logger): 生产日志目录清理改为非递归,跑一次 npm test 不再删线上 monitor.log(修 #280) |
| #283 | @EMeowAGENT | 脚本 | fix(scripts): prepare_image.py --mode square 报 UnboundLocalError(issue #282) |
相关 issue
| issue | 状态 | 标题 |
|---|---|---|
| #244 | closed | [dashboard] 动态页筛选 chip 文字溢出:.star-btn 固定 30px 宽度被复用到带文字按钮 |
| #245 | closed | fix(dashboard): .star-btn 固定 30px 改为 min-width+auto |
| #247 | closed | [ws] 连接显示 connected 但长时间零消息(半死连接)⇒ 动态流静默停更 |
| #268 | closed | fix(dashboard): 左侧头像按该行当时的图 + 模型名只采信可信值 |
| #278 | closed | fix(logger): 运行期日志目录被外部删除后文件日志永久停写 + 每行刷 ENOENT |
| #280 | closed | test(logger): test/logger.test.mjs 的 after 钩子递归删除 <仓库>/logs |
| #282 | closed | fix(scripts): prepare_image.py --mode square 必崩 UnboundLocalError |
| #275 | OPEN(已知限制) | 搜索结果预览的简介恒空(bio 已不在 user 对象里)—— 已登记为跟踪项 |
贡献者
| GitHub | 角色 | 本版 PR 数 | 领域 |
|---|---|---|---|
| @psenY | 核心贡献者 | 22 | Web Dashboard 图标/头像与位置行体系、WS 静默检测、对账与在线计数、profile 语义 |
| @nixi-agent | 维护者(agent) | 5 | 群组写侧新工具、事件可达性(Cloudflare/时区/截断)、Dashboard 收口与文档 |
| @EMeowAGENT | 贡献者(agent) | 3 | 日志子系统因果链(目录自愈 / 测试清理 / prepare_image 崩溃) |
| @Sand-85 | 活跃贡献者 | 1 | watchdog 启动宽限期(修重启风暴与磁盘暴涨) |
| @sansuiUwU | 核心贡献者 | 1 | Dashboard 筛选 chip 宽度修复 |
| @268500tao | 贡献者 | 1 | X 博主世界推荐抓取实测定标 + 非 ASCII 作者名修复 |
验证
npm test:437 / 437 全绿(0 fail / 0 skip)python scripts/check-doc-drift.py:✅ 无漂移(工具登记 128/128、AGENTS 覆盖、无数字残留、plugin.yaml 版本同步、GitHub 描述无过时工具数、历史记录 PR 状态与 GitHub 一致)- 版本文件三处同步:
package.json/package-lock.json(root +packages[""])/hermes-plugin/plugin.yaml - 未合并 PR:0;open issue:1(
#275已知限制,已在docs/history登记为跟踪项)
升级
零破坏性变更(无工具移除、无参数破坏)。直接更新即可;docs/history/2026-10.md 有本版逐域记录。
v3.3.0 — Web Dashboard 大修 + 4 个新官方插件
v3.3.0 — Web Dashboard 大修 + 4 个新官方插件(红线是「失败不再伪装成正常」)
自
v3.2.0-beta(2026-09-03)以来 21 天 / 260 commits / 87 个 PR / +18 个 MCP 工具(104 → 122,无移除)。
主线
1. Web Dashboard 大修
- 性能:首屏第一波 4 个接口合并为一次往返 —— 公网反代路径首屏 6-9s → 2.20s(#237)
- 架构:前端产物出库 + 安装期构建(#187,issue #186);插件第三方依赖机制(#141,契约 v1.2)
- 稳定性:页面级错误边界 + 鉴权守卫(#230,修「进过某页后全站空白」与「登录页打面板接口」);失败不再伪装成正常结论(#228,全局失败横幅 + 同类彻查 + 基线冻结闸门);动态流展示上限语义撤销(#238);手机端横向溢出(#227)
- 安全:面板令牌改走
Authorization头、不再进 query string(#220,issue #217);safe-mode 语义统一为云端不可逆保护(#170) - 非好友追踪页成体系:删好友即时入列 / 加好友自动移出(#164)、备注(#173/#235)、信任等级(#222/#232/#236)、当前模型名(#223/#226/#229/#233)、状态译名与视觉(#171)
- 资料弹窗:非好友可看群组/共同好友(#231)、布局与文案(#234)、信任等级取最高档(#232)
- 新视图能力:VRChat 官方活动日历双源(#177)、群组帖子浏览(#178)、日志页文件来源聚合(#139)
2. 可观测性(v3.2.0-beta 主线的延续)
- 外部调用留痕:VRChat API / 限流 / WS 与 PlanetVRC / X / BOOTH / Google Calendar / IMAP-OTP 的失败·超时·兜底全部可见(#191)
- 与 systemd/journald 协同:级别前缀 + 文件开关 + 单元护栏(#200)
- 日志降噪:慢等待去抖聚合(#193/#194)、头像变更降 debug、测试进程不写生产日志(#189)、事件管道分级(#174)
3. 新官方插件 4 个
redeem—— 兑换码 / 礼包领取 / 库存查询(#207)emoji-notes—— boop emoji 个性化备注 + 中文 STT 噪声鲁棒检索(#142)friend-removals—— 「谁把我删了」(#148)presence-status—— 按自己是否在游戏内自动切换自定义状态(#206)
4. 新增 MCP 工具(+18,零移除)
| 域 | 工具 |
|---|---|
| redeem 兑换域 | redeem_code / get_redeemable_bundles / claim_bundle / get_inventory_items / get_redeem_history(#207) |
| emoji-notes | get_emoji_notes / resolve_emoji / set_emoji_note(#142) |
| friend-removals | get_friend_removals(#148) |
| 动态状态 | get_dynamic_status / set_dynamic_status(#166) |
| presence-status | get_presence_status / set_presence_status(#206) |
| 群组/物品 | get_mutual_groups(#176)/ get_group_invites / get_inventory_global / get_inventory_drops(#179) |
| 好友统计 | get_friend_world_stats(#165) |
5. 工程与安全基建
- 回归门禁补齐:
npm test全量 + 3 个离线安全套件进 CI(#195);.cmd/.bat纯 ASCII 断言门禁(#219);registry 冒烟进 CI(#211) - 插件安全契约兑现:插件 DB 白名单 / destructive 消费 / 鉴权 fail-closed(#159)、schema.sql 纳入白名单(#161)
- 其它:X GraphQL UserTweets 抓取通道(#196,闭环 Nitter/SearchTimeline 双源失效)、
plugin_api.py安全修复(#143)
完整 PR 清单(87)
| PR | 作者 | 标题 |
|---|---|---|
| #133 | @psenY | fix(dashboard): 事件分类补充 group-role-updated 映射 + 通知摘要增强 |
| #134 | @psenY | fix(dashboard): see/hide-notification 详情富化(反查原通知 + 摘要拼类型/发送者) |
| #135 | @psenY | fix(dashboard): 通知页增强——历史头像 + 消息折叠 + 群组通知显示群组名/图标 |
| #136 | @psenY | fix(dashboard): 日志页详细化——认证/WS 打点恢复 + 时间显示修复 |
| #137 | @Sand-85 | docs: add BOOTH purchase automation skill (real-item checkout) |
| #138 | @Sand-85 | docs: add auto-purchase warning-reduction clause to BOOTH purchase skill |
| #139 | @psenY | feat(web-dashboard): 日志页新增 monitor.log 文件来源聚合 |
| #140 | @psenY | chore(log): 服务日志 emoji 正式化 + fix(logger) 多行消息按行落盘 |
| #143 | @anupamme | fix: fix security issue in plugin_api.py |
| #141 | @nixi-agent | feat(plugin-base): 插件第三方依赖机制 + 连字符表名引号修复(契约 v1.2) |
| #142 | @nixi-agent | feat(emoji-notes): 官方插件 —— boop emoji 个性化备注 + 中文 STT 噪声鲁棒检索 |
| #147 | @psenY | fix(tracked): 追踪在线判定改用 location + 记录上下线/换世界事件(#145 #146) |
| #148 | @CyberNekokoya | feat(friend-removals): 官方插件查询「谁把我删了」+ get_recent_events 类型检索修复(friend-delete) |
| #149 | @psenY | feat(ui): 通知/公告/群组页图片与头像显示修复 |
| #150 | @psenY | fix(auth): 裸域名访问根路径 401 JSON → 重定向 /dashboard |
| #151 | @psenY | chore: 清理 tmp/ 审查遗留物(217 文件)+ gitignore 防混入 |
| #152 | @psenY | fix(ui): 移动端触控与可读性优化(时间显示/触控热区/世界补名) |
| #153 | @CyberNekokoya | docs(agent-review): AGENT-REVIEW §2.7 补充「APPROVE 后落实建议请求复核」可选复测语义 |
| #154 | @psenY | fix(dashboard): recentWorlds 补名负缓存占位加 24h TTL——瞬时失败可自愈重试 |
| #155 | @psenY | fix(ui): 移动端 tabbar 改 in-flow 布局——Android Chrome 工具栏不再遮挡底部标签栏 |
| #156 | @psenY | docs(history): 回改 #150/#151/#153 状态标注为 MERGED |
| #157 | @psenY | docs(development): 补插件依赖安装提示 + AGENTS.md 工具清单补全 |
| #159 | @nixi-agent | fix(core): 兑现插件 API 安全契约——插件DB白名单(R1)/destructive消费(R2)/鉴权fail-closed(W1) |
| #161 | @nixi-agent | fix(core): schema.sql 纳入插件DB白名单(R1)——_applySchema 走 rewritePluginTableNames 白名单校验(issue #160) |
| #164 | @psenY | feat(tracked): 好友关系变化联动非好友追踪——删好友即时入列、加好友自动移出 |
| #165 | @psenY | feat(stats): get_friend_world_stats 好友地图统计——好友群体世界热度聚合(发现好玩的图) |
| #168 | @psenY | test+docs: #167 批次1——安全测试纳入 npm test glob + W1 fail-closed 行为文档 |
| #163 | @psenY | fix(dashboard): tracked 搜索添加按钮失效——搜索结果字段 id 与 addTracked 读取的 userId 不匹配 |
| #169 | @psenY | fix(plugin-api): 沙箱白名单扫描器批次2——表值函数放行/VACUUM+ATTACH拒绝/PRAGMA补全/RENAME TO校验(#167) |
| #166 | @psenY | feat(status): 动态状态引擎——按在线好友数量自动更新自定义状态(带开关,默认关闭) |
| #170 | @psenY | fix(dashboard): safe-mode 语义统一为云端不可逆保护——软删放行+取消收藏补拦+UI confirm(#162) |
| #172 | @psenY | fix(dashboard): 非好友追踪列表加权威源兜底——friends 表排除已好友(#164 补漏) |
| #171 | @psenY | feat(dashboard): 非好友追踪状态变更行对齐动态页视觉 + 状态种类译名统一官方中文 |
| #173 | @psenY | feat(dashboard): 非好友追踪备注功能——tracked_non_friends.memo + 编辑 UI |
| #174 | @nixi-agent | feat(logging): 日志信噪比增强——事件管道分级日志+工具清单降噪+错误带stack |
| #175 | @psenY | fix(scripts): api-live-audit 按当前客户端重写——_request 原语+规范路径清单 |
| #176 | @psenY | feat(tools): get_mutual_groups 共同群组——MCP 工具+用户对话框共同群组 Tab |
| #180 | @psenY | fix(legacy-client): 状态译名对齐官方 statusLabels——#171 审查遗留收口 |
| #181 | @psenY | fix(pipeline): 网页端在线落库真值——friend-active(platform=web) 清残留世界 |
| #179 | @psenY | feat(tools+dashboard): 群组邀请列表+物品栏查询——get_group_invites/get_inventory_global/get_inventory_drops |
| #178 | @psenY | feat(dashboard): 群组帖子浏览——groupPosts 服务+路由+群组对话框帖子 Tab |
| #177 | @psenY | feat(dashboard): VRChat 官方活动日历接入——EventsView 双源切换 |
| #183 | @nixi-agent | fix(world-kb): 恢复兜底行元数据回填——add_to_backlog/mark_world_visited/rate_world/set_world_sleep 补 world_name/author/created_at(#76/#77 语义在插件化重构中丢失) |
| #184 | @psenY | fix(dashboard): 动态流 friend-active(platform=web) 语义化显示「转网页端在线」 |
| #185 | @psenY | fix(pipeline+ui): 好友上线不再硬编码 status=active + RightBar 分组唯一 key(用户实测两 bug) |
| #189 | @nixi-agent | fix(logging): 日志噪音治理——头像变更降 debug、测试进程不写生产日志、stdout 捕获文件加轮转 |
| #188 | @psenY | fix(mcp): GET /mcp 返回 405(消除 MCP 客户端每 1s 无限重连刷屏) |
| #191 | @nixi-agent | feat(observability): 外部调用留痕——VRChat API/限流/WS 与外部服务(PlanetVRC/X/BOOTH/Google Calendar/IMAP-OTP)失败·超时·兜底可见 |
| #187 | @psenY | feat(build): 前端产物出库+安装期构建(issue #186 方案 A) |
| #193 | @psenY | fix(limiter): 慢等待日志改为去抖聚合(issue #192,含持续饱和兜底) |
| #194 | @psenY | docs+fix(limiter): #193 合并后收口——审查遗留两条纯文案 + idle 路径用例 |
| #195 | @nixi-agent | ci(tests): 回归门禁补齐——npm test 全量 + 3 个离线安全套件入 CI,修正测试命名指引(issue #190) |
| #197 | @psenY | docs(history): 2026-08 条目纠正「官方 OpenAPI」表述(VRChat 官方从不提供 API 文档) |
| #196 | @nixi-agent | fix(x-world): 新增 X GraphQL UserTweets 抓取通道(cookie 鉴权),闭环 Nitter/SearchTimeline 双源失效 |
| #198 | @psenY | docs: 登记 X 抓取通道的环境变量(#196 审查遗留·我承接的收口) |
| #200 | @EMeowAGENT | feat(logging): 与 systemd/journald 协同——级别前缀 + 文件开关 + 单元护栏 |
| #202 | @psenY | fix(world): 世界改名后展示层不再永久陈旧 + 世界分组按房间标注(issue #201) |
| #203 | @psenY | fix(world): 修复 #202 引入的 FriendsView「同世界」分段运行时回归(g 未定义)+ 失败冷却解耦 |
| #204 | @Lian-Hu-Agent | feat(social): support self-pair queries in get_friend_pair_screen |
| #206 | @XiaoCoaiX | feat(presence-status): 按自己是否在游戏内自动切换自定义状态描述 |
| #207 | @XiaoCoaiX | feat(redeem): VRChat 兑换码与礼包领取插件(redeem_code / get_redeemable_bundles / claim_bundle / get_inventory_items / get_redeem_history) |
| #210 | @nixi-agent | fix(redeem): get_redeemable_bundles 补 offset 分页 + 修 SKILL.md 翻页示例数值 |
| #209 | @psenY | test(test-registry): 安全模式断言改为事实源推导 + 修空转断言 + CI 补安全模式步骤(#208) |
| #211 | @psenY | test(test-registry): 命名守卫与 §7 契约同源(#209 审查 |
| #215 | @sansuiUwU | fix(service-windows): setup-windows.cmd 改为纯 ASCII,修 cp936 控制台下的解析错位(issue #212) |
| #214 | @sansuiUwU | fix(dashboard): 未启用鉴权时不再强制登录门(issue #213) |
| #219 | @psenY | ci: 为「.cmd/.bat 必须纯 ASCII」加断言门禁(issue #216) |
| #220 | @psenY | fix(dashboard): 令牌传输改走 Authorization 头(新+legacy 双 UI),不再进 query string(issue #217) |
| #226 | @psenY | fix(img-util): 收敛剩余 4 处内联 fileId 旧正则(含好友详情模型名恒空) |
| #232 | @psenY | fix(dialog): 信任等级取最高档(原来取的是最早那一档 ⇒ 弹窗显示 New User 与卡片不一致) |
| #223 | @psenY | fix(img-util): avatarFileId 同时支持 /image/ 形态(模型名解析失败的根因) |
| #221 | @psenY | fix(self-presence): 出游戏判定加墙钟确认窗口,修私人房瞬断误写挂机文案(issue #218) |
| #228 | @psenY | fix(dashboard): 失败不得伪装成正常结论(全局失败横幅 + 同类彻查 + 基线冻结闸门) |
| #229 | @psenY | fix(dashboard): 模型名补名负缓存 + 头像回退(修「深层翻页越翻越慢」与非好友头像空白) |
| #227 | @psenY | fix(ui): 手机端横向溢出(顶栏图标组把页面撑到 429px/视口 390) |
| #231 | @psenY | fix(dialog): 非好友也可查看群组/共同好友(实测无 403;含 Tab 与 TabPanel 两处门禁) |
| #234 | @psenY | fix(dialog): 信息页布局与文案(玩家 ID 单占整行 / 复制 ID 贴行右 / 按钮右下角 / 非好友隐藏恒空行 / 「上次资料变化」) |
| #238 | @psenY | fix(dashboard): 撤掉动态流对用户可见的「展示上限」语义(手动加载更多不受限) |
| #240 | @psenY | fix(profile): 删除 /users/{uid}/friends 死调用(其结果无消费者,只产生必然 404 的 WARN) |
| #222 | @psenY | fix(friend): 信任等级变更跟踪(事件 diff + 逐好友权威刷新 + 看板呈现) |
| #233 | @psenY | feat(tracked): 非好友的当前模型名(iconUrl → /file/{id} → parseAvatarName) |
| #236 | @psenY | feat(tracked): 服务端信任等级列(幂等迁移 + tags 计算 + DTO 暴露) |
| #235 | @psenY | feat(dialog): 备注改到资料弹窗里编辑(替代卡片上会引发白屏的常驻 Dialog) |
| #230 | @psenY | fix(dashboard): 错误边界与鉴权守卫(修「进过某页后全站空白」与「登录页打面板接口」) |
| #239 | @psenY | test(dashboard): catch 守卫加两道自检(扫描非空 / 基线不得有僵尸)+ ROOT 基于 import.meta.url |
| #237 | @psenY | perf(dashboard): 首屏第一波 4 接口合并为一次往返(域名路径 6-9s → 2.20s) |
| #242 | @psenY | fix(tracked): 失效 userId 连续失败退避与软删除(修 #241 的每小时必然 404) |
相关 issue(本窗口关闭 22 个)
| issue | 提出者 | 标题 |
|---|---|---|
| #241 | @nixi-agent | [tracked] 失效 userId 每小时无限重试(每小时 2 条必然 404 WARN)—— _refreshTrackedNonFriends 未按 404 软删除/退避 |
| #225 | @psenY | fix: 收敛剩余 4 处内联 fileId 旧正则(其中 dashboard-services.js:1337 会让好友详情模型名仍为空) |
| #224 | @psenY | fix(img-util): avatarFileId 只认 /file/ 形态、漏 /image/ ⇒ 模型名解析全部失败 |
| #218 | @XiaoCoaiX | fix(presence-status): 出游戏判定被 VRChat 私人房瞬时 offline 误触发,状态文字来回跳(附实测数据) |
| #217 | @nixi-agent | [security] dashboard 前端 apiUrl() 把访问令牌拼进 query string(既有代码,PR #214 审核附带发现) |
| #216 | @nixi-agent | [service-windows] 为「.cmd/.bat 必须纯 ASCII」加 CI 断言门禁(PR #215 审核遗留 💡) |
| #213 | @sansuiUwU | ... |
v3.2.0-beta — 结构化日志模块 + Web Dashboard/监控修复集群
v3.2.0-beta —— 结构化日志模块 + Web Dashboard/监控修复集群
定位:结构化日志模块(零依赖、生产级)落地 + 过去一周(#113-#132)Web Dashboard 与监控域修复集群。自 v3.1.0 起共 17 个 PR 合入。
🎯 主线:结构化日志模块(PR #132)
此前 vrc-monitor 没有日志模块——日志全靠裸 console.log(25+ 文件),Hermes 插件仅把子进程 stdout/stderr 重定向到 monitor.log 捕获,非应用自身日志能力。排障只能 grep 一坨 stdout,无法分级、无法轮转、无法按组件定位,且任何输出都可能泄漏 cookie/token/授权码。
新增 core/logger.js(零第三方依赖):
- 分级输出:debug/info/warn/error/silent,
VRC_MONITOR_LOGGER_LEVEL - 双通道(stdout + 文件)+ 双格式(text / json JSONL),
VRC_MONITOR_LOGGER_FORMAT - 日志轮转:达阈值压
.gz,保留 N 份,命名monitor-YYYYMMDD-HHMMSS-<pid>.log.gz - 敏感脱敏:cookie/token/邮箱/密码/IMAP 授权码一律
[REDACTED](覆盖 JSON 引号/Bearer/meta 嵌套/中文授权码/TOTP code 等形态) - 命名子 logger + 惰性初始化(import 零副作用)
经 4 轮 × 2 位协作审核者 8 批次加固,单测 21/21、全仓 55/55 通过。
📋 本周期全部合并的 PR 与贡献者
| PR | 作者 | 内容 |
|---|---|---|
| #113 | @nixi-agent | 周报 daily 每日足迹带当天同屏伙伴 |
| #115 | @psenY | 在线口径与 MCP 一致 + 非好友追踪导入上限(issue #114) |
| #116 | @psenY | 抽取 event-types 常量 + 补 Vitest 单测 |
| #117 | @nixi-agent | rateLimiter 挂死根治:socket 超时 + 队列任务级超时 |
| #119 | @nixi-agent | events 队列占满根治:删预热钩 + 群组缓存 + 每日离线刷新(fix #118) |
| #120 | @nixi-agent | Dashboard 头像体系:图片磁盘缓存 + user_icon 优先 |
| #121 | @psenY | Dashboard 登录页 + 40 项改进(UI 统一/移动端/数据 bug/运行时) |
| #122 | @nixi-agent | Dashboard SSE 增量改造,去掉高频全量轮询 |
| #124 | @psenY | tracked 时区解析 + 最近变化语义(parseTs 统一) |
| #125 | @psenY | avatar 模型名解析修正(imgProxy 编码后 fileId 失配) |
| #126 | @psenY | WS 推送缺缩略图时从 avatarImageUrl 推导模型缩略图 |
| #128 | @psenY | 好友截断误判非好友 + upsertFriend 空串覆盖(fix #127) |
| #129 | @268500tao | x-world 解包 t.co 短链,恢复被 X 压缩隐藏的世界推荐 |
| #130 | @nixi-agent | 离线好友空名回填 + friend-delete 移除好友(fix #127 补漏) |
| #131 | @psenY | 收藏夹编号偏移+乱序修复(VRChat tag 从 1 开始) |
| #132 | @nixi-agent | 结构化日志模块(本次主线) |
(#112 亦在本窗口期合入:核心数据服务下沉 + 非好友追踪 + Web Dashboard 全家桶,汇总 #108-#111 四个 issue。)
🔗 相关 Issue(本周期关闭)
| Issue | 标题 | 状态 |
|---|---|---|
| #108 | 核心数据服务下沉 + 非好友追踪闭环 | ✅ 已关闭 |
| #109 | Web Dashboard 完整实装(24 视图) | ✅ 已关闭 |
| #110 | Dashboard 文档体系 + 运维检查脚本 | ✅ 已关闭 |
| #111 | Agent 技能集(30+ 技能) | ✅ 已关闭 |
| #114 | 跟进 #112 复测遗留:在线口径 + 导入上限 | ✅ 已关闭 |
| #118 | events 插件持续占满 rateLimiter 队列 | ✅ 已关闭(#119 根治) |
| #127 | dashboard 右侧栏好友误判/离线显示 ? | ✅ 已关闭(#128/#130 修复) |
👥 贡献者
@nixi-agent(结构化日志/事件系统/核心服务)、@psenY(Web Dashboard 前端/协作审核/监控修复)、@268500tao(X 世界推荐抓取)。评审协作:@CyberNekokoya + @psenY。
安装
# 如需从源码运行:git clone && npm install && node start-monitor.js本版本为预发布(beta),经 core 只收 fix、功能进插件边界的架构约束下验证。正式版转正另行发布。
v3.1.0 — favorites 收藏夹管理补全 + auth-guard 鉴权/Docker 化 + events 社区活动聚合
v3.1.0 — favorites 收藏夹管理补全 + auth-guard 鉴权/Docker 化 + events 社区活动聚合
🎉 从「架构转身」进入「功能补全 + 部署形态完备」的 3.1 阶段:验证插件化贡献模型的实战产出,补齐部署三大形态(Linux systemd / Windows pythonw / Docker 容器),并完成运行时数据目录化迁移闭环。
🔌 新增 MCP 工具(+10,92 → 102)
-
favorites 收藏夹管理补全(#99/#100/#101/#105,@CyberNekokoya) —— VRC+ 专属收藏夹从不可见不可写到完整管理:
- 动态分组发现(world + vrcPlusWorld)取代硬编码 tag 清单
- 按收藏时间排序(sortBy=added)
/worlds/favorites一次拉全,首调从 15-20 分钟降至秒级- 新增 4 工具:
unfavorite_world/move_world_group/update_favorite_group/clear_favorite_group - capacity 改自
favoritelimits(已实测环境:真实 VRC+ 订阅账号全链路验证并还原)
-
events 社区活动聚合官方插件(#107,@268500tao) —— 首个明确面向「Agent 消费 / PDF 渲染管道」输出的数据管道插件:
- 多源聚合 VRChat 各社区(中文/日文/韩文/国际)近期活动,按音乐 / DJ / VTuber 偏好筛选
- 3 工具:
fetch_community_events/get_community_events_config/set_community_events_google_key - 多源采集 + 三级群组深挖 + 双列时区(start_local/start_bj)标准化
- 使用者 Google API Key 存于本地数据库
plg_events_config(不随代码进入 Git 仓库、查询接口不回显明文)
-
auth-guard 公网鉴权插件(#98,@psenY) —— 核心底座支持 + 3 安全工具:
- 3 工具:
auth_get_status/auth_generate_token/auth_verify_token - Bearer/X-API-Key/?token 三方式令牌提取 +
crypto.timingSafeEqual常量时间比对防侧信道 - 未配置 Token 时默认放行(本地零配置体验不变)
- 3 工具:
🛠️ 修复与稳定性
- data/ 目录化迁移闭环(#104,维护者) —— 修复升级启动崩溃 + 历史数据「假丢失」(issue #103):
Storage.init自动建目录 +migrate-legacy-data一次性迁移引导 + 回归测试 - Windows 常驻服务静默化(#97,@psenY) ——
pythonw.exe探测优先,解决计划任务每分钟控制台窗口闪烁 - 测试配套修复(#106) ——
test-safe-mode.mjs死引用:安全模式回归防线恢复 - events 代理作用域修复(88bdb12) —— 采集函数改用模块级代理
httpGet,修复日/韩 Google Calendar 源未实际走代理
📦 其他变更
- chore(#102,@CyberNekokoya):注册仓库
skills/为项目级 skills - Docker 容器化部署(#98):docker-compose 一键部署,补全 NAS / 路由器场景
🚀 安装 / 使用
与 v3.0.0 一致,按 README / AGENTS.md 指引配置即可。服务端重启后新工具自动生效(MCP 工具集为启动时快照,重启后新工具可见)。
- 项目主页 & 文档:https://github.com/ggg123124/vrchat-assistant
- 贡献/规范:见 DEVELOPMENT.md & AGENTS.md
⚠️ 注意事项
- 需 Node ≥ 22(events 插件零外部依赖,仅 Node 内置 fetch)
- auth-guard 的 Token 鉴权:未配置 Token 默认放行;配置后公网访问需带令牌
- events 插件需使用者自备 Google API Key(未配置时 VRCEve / VRCEvent-KR 源优雅跳过,VRC Search + RLVRC 照常工作)
v3.0.0 — 插件化架构重构(正式版)
v3.0.0 — 插件化架构重构(正式版)
定位:v3.0.0-beta(08-23)转正为稳定版。核心已完成从「三件套集中式工具注册」到插件式架构的转身,工具数维持 92。行为兼容基线(91 工具逐字节一致 + 新增 set_world_sleep)持续守住,调用方式与返回结构不变。
自 beta 以来的关键改动
- Nitter/SearchTimeline 2026 双源失效后引入 Playwright 浏览器抓取
- 补齐 Anubis challenge 处理 + 通道自动探测 + env 时序重构
- 双数据源降级(主力失败自动切备源),修复单源漏抓
Node 22 对齐(#95)
- engines 与 CI 矩阵从 18/20 收窄到 22(匹配插件零依赖契约口径)
协作体验增强
- 群组公告自动联查发布者真实用户名(authorName)
- 逛过即自动移出待逛列表(visited 首次置位同步清 backlog,#91)
CI 加固(#93)
- dump-tools 计数断言去硬编码,行数与 tool-order.json 动态对齐
文档治理
- 三语 README 对齐 Node≥22;plugins/index.json 去工具数;drift-check 数字残留扫描纳入 plugins/+docs/
架构回顾(v3.0.0 主版本)
- 工具自声明 + 注册表自动生成(
core/registry.js),移除旧三件套(mcp-definitions.js/rpc-router.js/handlers/*) - 插件化:
core/plugin-loader.js+core/plugin-api.js+ 8 官方插件 + 35 核心服务,契约docs/PLUGIN-API.md - 贡献模型切换:功能一律进插件,
core/只收 fix 与底座演进 - storage 底座拆分:按域拆 4 模块 + 独立社交分析域,1582→523 行(行为等价,快照基线守护)
- 安全模式(#84):
VRC_MONITOR_SAFE_MODE=true移除破坏性工具
使用说明
- 行为兼容:92 个工具全部保留,调用方式与返回结构不变
- 新功能提交走插件形态(
docs/PLUGIN-DEV.md为入口) - 自用插件放
plugins/local/(gitignore),分享走plugins/index.json索引 PR
贡献者
- @ggg123124(作者 / 维护者)
- @nixi-agent(插件化重构 PR-1/2/3、转正发布)
- @Menaed(#84 安全模式)
- @CyberNekokoya(世界知识库增强 #74/#75/#77/#80)
v3.0.0-beta — 插件化架构重构
v3.0.0-beta — 插件化架构重构(架构大版本)
定位:核心从「三件套集中式工具注册」迁移为插件式架构。工具数 91 → 92(+set_world_sleep)。行为兼容非重构基线(91 工具逐字节一致),调用方式与返回结构不变。
关键改动
- 工具自声明 + 注册表自动生成:每个工具在所属文件内自声明
def,新增core/registry.js,移除旧三件套(mcp-definitions.js/rpc-router.js/handlers/*) - 插件化落地:
core/plugin-loader.js(扫描/依赖拓扑/热加载回滚/失败隔离)+core/plugin-api.js(6 面 API)+ 8 个官方插件(booth/favorites/groups/media/planet/recommend/world-kb/x-creators)+ 35 个核心服务 - 贡献模型切换:功能一律做成插件,
core/只收 fix 与底座演进;插件模板 + 社区插件索引 + CI + 解冻公告 - 契约:
docs/PLUGIN-API.md(v1.1-experimental,合并即冻结)
安全模式(#84)
VRC_MONITOR_SAFE_MODE=true时自动移除破坏性工具(core/safe-mode.js,tools/list 过滤 + tools/call 拦截)
- 主题/安静图关键词匹配纳入 tags
- 新增
set_world_sleep手动标记睡觉图工具 - 兜底插入信息回填(world_kb 信息恒空修复)
- 移除 world_kb.source 死列
使用说明
- 行为兼容:92 个工具全部保留,调用方式与返回结构不变
- 新功能提交改走插件形态(
docs/PLUGIN-DEV.md为入口) - 自用插件放
plugins/local/(gitignore);分享走plugins/index.json索引 PR
贡献者
- @ggg123124(作者 / 维护者)
- @nixi-agent(插件化重构 PR-1/2/3 提交)
- @Menaed(#84 安全模式)
- @CyberNekokoya(世界知识库增强 #74/#75/#77/#80)
v2.3.0 — 好友域三件套 + 认证自愈链 + 作者维度查询
v2.3.0 — 好友域三件套 + 认证自愈链 + 作者维度查询
🎉 本版 +12 个 MCP 工具(77 → 89,无移除):好友域从只读升级为可操作(资料变更追踪 / 通知收件箱 / 收藏分组管理三件套),认证自愈链完整闭环(TOTP 双通道 → 运行期 401 自动重登录 → 状态真实透出),世界查询补齐作者维度。注:#44/#45/#47 于 v2.2.0 发布当日合并,其代码随本版首次可用(v2.2.0 tag 早于其合并)。
✨ 新功能
- 好友域三件套(@CyberNekokoya):
- 好友资料变更追踪
get_friend_profile_changes(PR #56):Avatar/Bio/状态/头像图标/代词变更历史,type 与 VRCX 迁移 feed_avatar/feed_status/feed_bio 对齐——迁移前 10 个月数据打通(实测 48331 条) - 通知收件箱(PR #57):
get_notifications/see_notification/hide_notification/accept_friend_request/decline_friend_request——好友请求接受/拒绝不再依赖客户端手动操作,不可逆操作带 confirm 护栏 - 好友收藏分组管理(PR #58):
get_friend_favorite_groups/favorite_friend/unfavorite_friend/move_friend_group——只读工具补齐写闭环
- 好友资料变更追踪
- TOTP 两步验证登录
submit_totp(PR #45,@CcendercatcC):Authenticator 应用账号(更安全的 2FA)此前完全无法登录,本版起按requiresTwoFactorAuth数组自动分流 emailOtp/totp get_worlds_by_author按作者列出全部世界(PR #53,@CcendercatcC):get_world_name补返回 authorId,修复 upsertWorld 未持久化 author_id——「给当前作者全部图加权重」类工作流的前置能力
🔧 修复
- 运行期 API 401 自动重登录,TOTP 账号免重启恢复(Issue #51 → PR #52,@CcendercatcC):cookie 过期不再是服务致命伤——请求层拦截 401 + single-flight 防并发重认证 + 冷却防循环;需要 TOTP 时进入待验证态交给 submit_totp
- needsTotp 状态真实透出(Issue #59 → PR #60,@CcendercatcC):/health 与 get_server_status 在待验证态改报
authenticated: false+needsTotp: true,不再掩盖「内部已失联」;采用计算修正而非清空 authUser,不破坏 get_weekly_report 等依赖 authUser?.id 的本地查询 - favorite_world 请求体契约修正(Issue #54 → PR #55,@Menaed):
favoriteId必须是被收藏对象本身的 ID(wrld_...),分组由tags指定——修复前传分组名/分组 ID 恒 400/404,云端收藏从此可用 - 8799 端口占用预检前置(Issue #49 → PR #50):双实例并存 OTP 验证码互抢循环(邮箱轰炸 2.7h 事故)根因修复——启动时端口预检即退出,杜绝「看似启动成功实则已在运行」
- migrate 补迁 gamelog_location 自己的位置历史(PR #47,@CcendercatcC):get_companions 恢复迁移前同屏数据(实测 userInstanceCount: 104)+ 显式传 userId 迁移 0 条修复
📚 文档
- chill/放松向世界过滤规则入 vrchat-world-queries skill(PR #44,@Sand-85):排除随机聊天/轮盘配对社交向,聚焦 sleep/onsen/居家/小憩系,备注当前人数
- pr-review 公共 skill 新增 + review-workflow 重命名扩展覆盖 issue 审核(直推 main)
📦 变更
- 新增 12 个 MCP 工具(77 → 89,无移除):
submit_totp/get_worlds_by_author/get_friend_profile_changes/get_friend_favorite_groups/favorite_friend/unfavorite_friend/move_friend_group/get_notifications/see_notification/hide_notification/accept_friend_request/decline_friend_request core/event-pipeline.js_handleUpdate:friend-update 完整 user 对象快照 diff 落库(此前只存 displayName)core/storage.js:friends 表幂等迁移新增 bio/user_icon/pronouns 列core/handlers/notifications.js+core/handlers/friend-favorites.js:新增 handler 模块- 版本引用点:package.json / package-lock.json / hermes-plugin/plugin.yaml 三处同步
🙏 感谢贡献者
v2.2.0 — 协作审核协议(AGENT-REVIEW)+ OTP/keepalive 健壮性加固
v2.2.0 — 协作审核协议(AGENT-REVIEW)+ OTP/keepalive 健壮性加固
🎉 本版为小版本(无新增 MCP 工具):确立协作审核协议(AGENT-REVIEW)作为外部贡献接入规范,迁移/分析脚本支持跨平台自动探测 VRCX 数据库路径,并修复 MCP 协议合规(ping 响应)与 OTP 自动登录链路。
✨ 新功能
- 协作审核协议 AGENT-REVIEW(
AGENT-REVIEW.md+scripts/agent-review.py):多 Agent 通过「认领评论」分担 PR/issue 审核的协作机制(认领标记、有效认领计数、满员不重复劳动、24h 失效补位、完成不释放名额)——含审核视角条款(§3,按自身环境与使用者习惯个性化 review)与重要关联豁免(与自身/背后使用者有重要关联的 PR/issue 不受满员限制,判定权在自己、诚实自评)(PR #43,nixi-agent) - 迁移/分析脚本跨平台自动探测 VRCX 数据库路径:
migrate-vrcx0.mjs/analyze-db.mjs支持 Windows / macOS / Linux(含 Wine 运行 Windows 版)自动探测(PR #40,@Menaed)
🔧 修复
- MCP 服务端响应
ping方法,修复客户端 keepalive 反复超时 → parked → 工具调用挂起至 300s(Issue #37;协议合规基线:ping 必须返回带原 id 的 JSON-RPC result,空响应 = 长连接客户端永远等不到) - OTP 自动登录支持
VRC_MONITOR_PYTHON指定解释器路径 + 含空格路径自动加引号(Windows cmd 首 token 截断,避免重试循环刷爆验证码邮件)(PR #38,@Heimo0520) - 归一化 IMAP SEARCH 空结果形态(163
'(none)'/ Gmailb''/ 失败态),移除重复赋值(PR #41,@Menaed)
📚 文档
- 署名规则同步:DEVELOPMENT.md §1/§2-13 —— 署名与口吻分离——Agent 提交者署名可使用背后使用者的 GitHub 账号/邮箱,但所有文字必须以 Agent 自身口吻书写,不得以人类第一人称发言
- 演进记录维护 ×2(v2.1.1 skill 拆分 + ping 修复 #37;署名规则同步)
📦 变更
- 无新增 MCP 工具(工具数不变)
core/vrcx-db-paths.js新增:VRCX 数据库路径候选/探测模块(跨平台)scripts/agent-review.py:509 行协作审核参考脚本(scan / status / claim / withdraw / mine)- 版本引用点:package.json / package-lock.json / hermes-plugin/plugin.yaml 三处同步
🙏 感谢贡献者
- @Heimo0520 —— OTP 自动登录解释器路径可配置(PR #38)
- @Menaed —— 跨平台 VRCX 数据库路径探测(PR #40)+ IMAP 空结果归一化(PR #41)
v2.1.1 — 公共 Skill 按对象域拆分 + 文档治理
v2.1.1 — 公共 Skill 按对象域拆分 + 文档治理
🎉 本版为纯文档/规范更新:将公共 Agent Skill 从单一巨型总纲重构为「总纲 + 按对象域拆分」的结构,无代码改动、无新工具、无行为变化。
📚 文档与规范
- 公共 skill 按对象域拆分(对应本地 Agent skill 结构):
vrc-monitor-agentv2.0.0:收敛为总纲——全部 MCP 工具清单(唯一权威)+ 通用陷阱 + 服务健康检查 + 子 skill 路由索引- 新增
vrchat-social-queries:好友/社交域工作流(在线五要素/同屏/上线规律/画像/关系 + 全部社交写操作) - 新增
vrchat-world-queries:世界域工作流(挑新世界/backlog/推荐/PlanetVRC/情报挖掘/X 博主) - 新增
vrchat-group-queries:群组域工作流(群组查询/公告 403 分诊/join/leave/peek) - 删除
vrc-monitor-companion-query(内容并入社交域)
- 去敏感化:公共 skill 全量扫描——真实 userId / 群组 ID / 邮箱 / 本机路径 / 个人昵称 0 命中,全部替换为占位符或通用表述
- AGENTS.md:安装说明同步新 skill 列表
- docs(history):PR #35 状态标记 OPEN→MERGED
📦 变更
20330c7docs: 重构公共 skill 按对象域拆分(社交/世界/群组)53feb9cdocs(history): PR #35 状态 OPEN→MERGED
📥 安装
mkdir -p "$HERMES_HOME/skills"
cp -r skills/vrc-monitor-agent "$HERMES_HOME/skills/"
cp -r skills/vrchat-social-queries "$HERMES_HOME/skills/"
cp -r skills/vrchat-world-queries "$HERMES_HOME/skills/"
cp -r skills/vrchat-group-queries "$HERMES_HOME/skills/"
cp -r skills/booth-query-display "$HERMES_HOME/skills/"
cp -r skills/vrchat-assistant-development "$HERMES_HOME/skills/"v2.1.0 — 在线好友信息增强:世界名 + 停留时长 + 在线时长
v2.1.0 — 在线好友信息增强:世界名 + 停留时长 + 在线时长
小版本发布:get_online_friends 信息增强 + PR #36 审核收尾,无新增 MCP 工具。
✨ 新功能(get_online_friends 三连增强)
- 世界名
worldName:未缓存时批量 API 查询并回填world_cache,不再留 null - 停留时长
durationMinutes/enteredAt:基于进入事件统计房间停留 - 在线时长
onlineMinutes/onlineSince:新增在线时长统计,并修复停留时长跨会话污染(session 边界判定)
🐛 修复
- 采纳 PR #36 审核建议 W1/W2/W4(friends.js + storage.js 收尾)
📝 文档
skills/vrc-monitor-agent/SKILL.md工具表登记在线时长新字段- 演进记录更新:在线列表五要素固定输出 = 昵称 | 世界 | 房型 | 在线时长 | 房间停留
📦 安装
按 AGENTS.md 部署。