Skip to content

fix(dashboard): 收敛群级 Pin 管理边界 - #1183

Open
TWT233 wants to merge 18 commits into
deepcoldy:masterfrom
TWT233:fix/dashboard-pin-followups
Open

fix(dashboard): 收敛群级 Pin 管理边界#1183
TWT233 wants to merge 18 commits into
deepcoldy:masterfrom
TWT233:fix/dashboard-pin-followups

Conversation

@TWT233

@TWT233 TWT233 commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

背景

这是已合入 #1155 的 correctness / safety follow-up,落实合入后 review 指出的响应体积、鉴权与异步快照一致性问题。

改动

  • 对 inChat:false 的 synthetic member row 省略三个可选 Pin 状态字段,避免在大型 chat × bot 矩阵中复制无消费价值的数据。
  • 新增真实 HTTP 鉴权回归:private 与 publicReadOnly 模式下匿名 PUT 均返回 401,且不会转发 daemon。
  • Group Manage 按 chatId 跟随最新 accepted snapshot,同步 Pin effective 状态、Oncall pristine 字段和 leave 成员集合,同时保留用户脏草稿。
  • 快照采用 latest-successful-result 语义:较晚失败不会丢弃较早成功;接受的成功会同步共享缓存并清除过期错误。
  • 最新快照中群已消失时保留只读展示,但禁用并在 stale handler / confirm 回调中阻断 Pin、Oncall、退出和解散操作。
  • Oncall 保存期间锁定 toggle、working directory 与保存按钮,避免旧保存结果覆盖期间的新编辑。
  • 路由集成测试改用 proxy-safe loopbackFetch,并读取隔离 HOME 中实际 .dashboard-port,消除 Bun 1.4 + inherited proxy 与 reserve/release 端口竞态。

影响面

仅调整 Dashboard 群组矩阵 payload、Group Manage 客户端状态与相关测试;不改变 daemon 的 per-chat Pin 配置语义或实时卡生命周期。

验证

  • Dashboard focused matrix:259 passed / 1 skipped。
  • Group Manage component:20/20 passed。
  • Bun 1.4 native route/auth tests:均通过。
  • 最新 master 白板交叉测试:whiteboard CLI 12/12,其他 whiteboard tests 通过。
  • mise exec bun@1.4.0 -- bun run build:通过。
  • git diff --check origin/master...HEAD:通过。
  • Spec / Standards 复审 findings 已补测试并修复。

Follow-up to #1155.

TWT233 and others added 14 commits September 1, 2026 20:02
Co-authored-by: TRAE CLI <traecli@bytedance.com>
Co-authored-by: TRAE CLI <traecli@bytedance.com>
Co-authored-by: TRAE CLI <traecli@bytedance.com>
Co-authored-by: TRAE CLI <traecli@bytedance.com>
Co-authored-by: TRAE CLI <traecli@bytedance.com>
Co-authored-by: TRAE CLI <traecli@bytedance.com>
Co-authored-by: TRAE CLI <traecli@bytedance.com>
Co-authored-by: TRAE CLI <traecli@bytedance.com>
Co-authored-by: TRAE CLI <traecli@bytedance.com>
deepcoldy#852 将会话存储引擎换为 per-bot SQLite 后,daemon 侧仍保留整套 JSON 写实现(save() 整图序列化、JSON CAS、tmp+rename)。本 PR 删除这套实现,daemon 落盘改为行级 upsert。

跨进程读与离线写刻意保留 db-else-json 回落:npm 升级后 postinstall 立即替换 CLI,而持有会话行的 daemon 仍运行旧代码(自动更新默认关闭),该窗口无上界,期间对应 bot 目录不存在 .db;若跨进程读改为只认 SQLite,窗口内所有 botmux send 都将无法定位自身会话。

一并修复与加固:
- 读写方式打开 SQLite 会创建空库,而导入门判据是 existsSync(db),空库会使 daemon 跳过一次性导入并丢失迁移前全部会话。读路径对不存在的库直接抛错,离线写在 open 前复检。
- 导入按文件原 key 而非行内 sessionId:两条记录可能携带同一 sessionId,INSERT OR REPLACE 会让 closed 幽灵覆盖活行,且导入只跑一次、JSON 随后冻结,不可逆。
- close / reactivate / mojo journal 改为先落盘再合并回内存,替代原先失败后逐字段手工还原。
- 删除白板时的会话解绑:原按文件名扫描 sessions*.json,deepcoldy#852 之后匹配不到文件,clearedSessions 恒为 0 而 whiteboardId 仍指向已删的板。改走 store,daemon 在线时经 IPC 带 CAS 解绑,不在时离线写;无法解绑的会话计入 unresolvedSessions 而非谎报 0;IPC 增加超时。
- 屏蔽 Node 22 加载 node:sqlite 时的 ExperimentalWarning,避免污染 CLI stderr 与全屏 TUI。

影响面:主要涉及 session-store、whiteboard-store、dashboard-ipc-server,新增 services/session-offline-write.ts;cli.ts 私有的 daemon 发现实现收敛到 utils/daemon-discovery。updateSession 等签名不变,Pty/Tmux、话题会话/群会话、adopt/restore、sandbox 开关仍走同一套 store 导出。沙盒授权维持目录级(单文件 bind 会钉死 WAL sidecar 的 inode)。

验证:tsc --noEmit 干净,bun run build 通过,门禁 CI 全绿;PR 触及的 21 个测试文件逐文件单跑共 558 条通过。对核心不变量做 10 处反变异,8 处如期变红(升级窗口回落、解绑 CAS、409 分支、unresolvedSessions 计数、durable-first 提交顺序、导入不重键、owner:false 不得 bootstrap、实验特性警告过滤);其余 2 处为 TOCTOU 竞态防护,单线程测试无法构造触发窗口,已另行验证守卫有效。bun-test 为 continue-on-error 非门禁项,其失败经本地实跑对照确认为既有 flake。

Co-authored-by: TRAE CLI <traecli@bytedance.com>
…lowups

Co-authored-by: TRAE CLI <traecli@bytedance.com>
…lowups

Co-authored-by: TRAE CLI <traecli@bytedance.com>
…lowups

Co-authored-by: TRAE CLI <traecli@bytedance.com>
Co-authored-by: TRAE CLI <traecli@bytedance.com>
@TWT233
TWT233 requested a review from deepcoldy as a code owner September 1, 2026 14:22
@TWT233

TWT233 commented Sep 1, 2026

Copy link
Copy Markdown
Contributor Author

补充说明:该 PR 保持 #1155 的 per-chat negative override 语义不变,只收敛合入后 review 暴露的 Dashboard correctness / safety:

  • 缺席 Bot 行不再复制 Pin 策略字段,降低大型矩阵响应;
  • anonymous PUT 在 private 与 publicReadOnly 两种模式都先返回 401;
  • Group Manage 采用 latest-successful snapshot ordering,并同步共享缓存;
  • 群从最新快照消失后保留只读展示,但所有旧 handler / confirm 回调都禁止写操作;
  • Oncall 保存期间锁定输入,避免旧请求完成覆盖后续编辑;
  • HTTP 集成测试使用实际 .dashboard-port 与 proxy-safe loopback 请求。

@TWT233

TWT233 commented Sep 1, 2026

Copy link
Copy Markdown
Contributor Author

本地最终验证补充(当前 HEAD 1a634c2):

  • Dashboard focused matrix:259 passed / 1 skipped;
  • Group Manage component:20/20 passed;
  • Bun 1.4 native route/auth:均通过;
  • 最新 master 白板交叉测试:whiteboard CLI 12/12,其他 whiteboard tests 通过;
  • build / diff-check:通过。

GitHub build job 的失败来自 test/mojo-close-worker-journal.integration.test.ts,不在本 PR diff;同一 job 的 compile/build 步骤已通过。

TWT233 and others added 3 commits September 1, 2026 22:58
Co-authored-by: TRAE CLI <traecli@bytedance.com>
Co-authored-by: TRAE CLI <traecli@bytedance.com>
…ollowups

Co-authored-by: TRAE CLI <traecli@bytedance.com>
@TWT233

TWT233 commented Sep 1, 2026

Copy link
Copy Markdown
Contributor Author

更新后的本地验证(当前 HEAD 1296dd16,已合入最新 master 7db4b936):

  • 新增两组 race hardening:全局 latest-success cache ordering(412b23d4)与 Manage dialog async lifetime / Oncall reconciliation(7b1e4797);
  • 补充测试隔离(1296dd16):重置模块级 full/names cache、in-flight 与序号,并用 epoch 阻止旧 promise 在 reset 后回填;
  • Dashboard focused matrix:5 files / 46 tests passed;
  • Group Manage component:正常顺序 24/24,shuffle seeds 11/29/47 各 24/24;
  • whiteboard CLI:12/12 passed;
  • node scripts/run-bun-tests.mjs --self-check:1/1 passed;
  • Bun 1.4 build:通过;
  • git diff --check origin/master...HEAD:通过;
  • 与最新 master merge-tree:无冲突。

本轮修复覆盖四个可复现竞态:跨 consumer 的共享缓存回退、Oncall 保存后被旧快照覆盖、已卸载弹窗继续 disband、旧操作完成误关新弹窗。测试顺序依赖也已用 shuffle 复现并修复。最终 Spec 与 Standards 复审均无 Critical / Important finding。

Co-authored-by: TRAE CLI <traecli@bytedance.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants