Skip to content

Releases: ggg123124/vrchat-assistant

v3.4.0 — Web Dashboard 图标/位置体系大修 + 群组写侧 6 工具

Choose a tag to compare

@nixi-agent nixi-agent released this 12 Oct 00:43

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 的调用方完全兼容,无破坏性变更

本版看点

  1. Web Dashboard 图标/头像体系收口:上游把 currentAvatar* 改名后,5 处仍读旧名导致写入恒空(#251/#259 改用 iconUrl);全站 15 处头像改为「用户图标优先、无则回落模型图」(#257);「换模型」不再被记成「更新了头像图标」(#263/#265/#267 按 file 的 tags 与文件同一性判定)。
  2. 位置行渲染口径统一:traveling:traveling 规范化、私人房间给人话、左端「从哪」的世界名/图改走 world_cache(#250/#261/#262)。
  3. 采集侧静默停更修复:应用层静默检测修半死 WS 连接(#248)、同世界同实例重复位置事件去重(#254)、对账窗口下界改用「最后一次能证明在线的时刻」(#252)、在线计数含网页在线 + 对账周期化(#253)、watchdog 启动宽限期修重启风暴与磁盘暴涨(#243)。
  4. 群组写侧成体系(本版新增工具):群公告 + 群帖子写侧,追加式发帖根治「发新帖顶掉旧帖」。
  5. 日志子系统一条因果链:运行期目录被删后自愈 + 失败去重 + 降级报生效值(#279)、测试清理改非递归不再删线上 monitor.log(#281)、prepare_image.py --mode square 崩溃修复(#283)。
  6. 数据语义与可达性:简介改走 /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 个新官方插件

Choose a tag to compare

@nixi-agent nixi-agent released this 23 Sep 02:21

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 ...
Read more

v3.2.0-beta — 结构化日志模块 + Web Dashboard/监控修复集群

Choose a tag to compare

@nixi-agent nixi-agent released this 02 Sep 16:51

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 社区活动聚合

Choose a tag to compare

@nixi-agent nixi-agent released this 28 Aug 00:44

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 时默认放行(本地零配置体验不变)

🛠️ 修复与稳定性

  • 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 工具集为启动时快照,重启后新工具可见)。

⚠️ 注意事项

  • 需 Node ≥ 22(events 插件零外部依赖,仅 Node 内置 fetch)
  • auth-guard 的 Token 鉴权:未配置 Token 默认放行;配置后公网访问需带令牌
  • events 插件需使用者自备 Google API Key(未配置时 VRCEve / VRCEvent-KR 源优雅跳过,VRC Search + RLVRC 照常工作)

v3.0.0 — 插件化架构重构(正式版)

Choose a tag to compare

@nixi-agent nixi-agent released this 24 Aug 16:53

v3.0.0 — 插件化架构重构(正式版)

定位:v3.0.0-beta(08-23)转正为稳定版。核心已完成从「三件套集中式工具注册」到插件式架构的转身,工具数维持 92。行为兼容基线(91 工具逐字节一致 + 新增 set_world_sleep)持续守住,调用方式与返回结构不变。

自 beta 以来的关键改动

X 源头浏览器抓取(#82/#87,PR #96)

  • 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

贡献者

v3.0.0-beta — 插件化架构重构

Choose a tag to compare

@nixi-agent nixi-agent released this 23 Aug 16:29

v3.0.0-beta — 插件化架构重构(架构大版本)

定位:核心从「三件套集中式工具注册」迁移为插件式架构。工具数 91 → 92(+set_world_sleep)。行为兼容非重构基线(91 工具逐字节一致),调用方式与返回结构不变。

关键改动

插件化重构(PR-1/2/3 #88/#89/#90)

  • 工具自声明 + 注册表自动生成:每个工具在所属文件内自声明 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 拦截)

世界知识库增强(#74/#75/#77/#80)

  • 主题/安静图关键词匹配纳入 tags
  • 新增 set_world_sleep 手动标记睡觉图工具
  • 兜底插入信息回填(world_kb 信息恒空修复)
  • 移除 world_kb.source 死列

使用说明

  • 行为兼容:92 个工具全部保留,调用方式与返回结构不变
  • 新功能提交改走插件形态(docs/PLUGIN-DEV.md 为入口)
  • 自用插件放 plugins/local/(gitignore);分享走 plugins/index.json 索引 PR

贡献者

v2.3.0 — 好友域三件套 + 认证自愈链 + 作者维度查询

Choose a tag to compare

@nixi-agent nixi-agent released this 19 Aug 16:39

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 三处同步

🙏 感谢贡献者

  • @CyberNekokoya —— 好友域三件套:资料变更追踪(PR #56)+ 通知收件箱(PR #57)+ 收藏分组管理(PR #58)
  • @CcendercatcC —— TOTP 双通道(PR #45)+ 401 自动重登录(PR #52)+ 作者维度查询(PR #53)+ needsTotp 透出(PR #60)+ migrate 补迁(PR #47)
  • @Menaed —— favorite_world 契约修正(PR #55)
  • @Sand-85 —— chill 过滤规则(PR #44)
  • nixi-agent —— 端口占用预检(PR #50)

v2.2.0 — 协作审核协议(AGENT-REVIEW)+ OTP/keepalive 健壮性加固

Choose a tag to compare

@nixi-agent nixi-agent released this 18 Aug 11:58

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)' / Gmail b'' / 失败态),移除重复赋值(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 按对象域拆分 + 文档治理

Choose a tag to compare

@nixi-agent nixi-agent released this 16 Aug 07:25

v2.1.1 — 公共 Skill 按对象域拆分 + 文档治理

🎉 本版为纯文档/规范更新:将公共 Agent Skill 从单一巨型总纲重构为「总纲 + 按对象域拆分」的结构,无代码改动、无新工具、无行为变化。

📚 文档与规范

  • 公共 skill 按对象域拆分(对应本地 Agent skill 结构):
    • vrc-monitor-agent v2.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

📦 变更

  • 20330c7 docs: 重构公共 skill 按对象域拆分(社交/世界/群组)
  • 53feb9c docs(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/"

详细说明见 README 与 AGENTS.md。

v2.1.0 — 在线好友信息增强:世界名 + 停留时长 + 在线时长

Choose a tag to compare

@nixi-agent nixi-agent released this 16 Aug 06:48

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 部署。