fix(session): 让 delete 与 daemon 关闭状态对齐 - #563
Conversation
deepcoldy
left a comment
There was a problem hiding this comment.
发现 1 个会造成“删除成功但实际没删”的兼容性问题,建议修复后再合并。其余 daemon-first、fail-closed、鉴权和 close barrier 方向均合理;本地 pnpm build 通过,8 个定向测试文件 175/175 通过。
closeSessionForDelete 原先在会话缺 larkAppId 且仅一个 daemon 在线时,
会把会话路由给该唯一 daemon。但 daemon 的 sessionStore.closeSession
只写当前 appId 的 sessions-<appId>.json,不会碰 legacy sessions.json,
导致 getSession 跨文件读到 wasOpen=true、closeSession 静默 no-op,
daemon 返回 {ok:true},CLI 不走本地收口,legacy 记录仍是 active。
修复:无 larkAppId 的会话一律走本地收口 closeSessionOffline,
其 saveSession 能正确写到 legacy sessions.json。
补回归测试:legacy 会话 + 单 daemon 在线 → CLI 不调 daemon、本地收口。
|
维护者跟进:已将修复提交 修复内容:缺少 复核结果:
原 P2 技术问题已修复;仍按话题约定,等待申晗对兼容性/端到端语义确认后再决定合并。 |
上一轮修复只在 descriptor 查找处按 larkAppId 决定是否路由给 daemon,但 current-session 的 injected-port 兜底(BOTMUX_DAEMON_IPC_PORT)是独立计算的, 不看 larkAppId——于是"无 larkAppId 的会话不得路由给 daemon"这条不变量只挡住了 一扇门,injected-port 是没上锁的第二扇门。虽然实际不可达(daemon 托管的当前会话 必带 larkAppId),但这是靠"当前会话必有 appId"的隐式耦合,不是显式保证。 改为在函数入口用一个权威守卫:无 larkAppId 一律走本地离线收口,descriptor 和 injected-port 两条路都被同一条不变量覆盖。合法的沙箱当前会话关闭(必带 larkAppId) 不受影响。 回归测试:新增"legacy current session + injected daemon port"用例,验证 daemon 永不被命中、legacy 文件被正确标 closed。已确认该用例在修复前会失败(会话被 injected port 路由给 daemon)、修复后通过。 验证:pnpm build、tsc --noEmit 通过;4 个定向测试文件 90/90 通过(原 89 + 新增 1)。 Co-Authored-By: Riff <noreply@riff.dev>
补充修复 ·
|
deepcoldy
left a comment
There was a problem hiding this comment.
复核通过,无 blocking finding。
1c35ec03把!s.larkAppId守卫提升到 daemon 路由入口,descriptor 与BOTMUX_DAEMON_IPC_PORTinjected fallback 共用同一不变量;合法的带 appId 当前会话路径不受影响。- 新增 legacy current-session + injected-port 回归覆盖了上轮遗漏的旁路。
- PR head 定向回归:4 文件 90/90 通过。
- 与当前
origin/master做真实--no-commitmerge:无冲突;合并态同组回归 99/99、pnpm build通过(含 tsc、dashboard bundle、domain/dist audit)。 - 工作树已恢复干净,未改代码、未合并。
代码层面 merge-ready;按话题约定由 Claude2 执行 merge。
背景
botmux delete原先只在 CLI 侧直接终止进程/tmux 并写入关闭状态,不会同步移除 daemon 内存中的activeSessions条目。删除当前会话时,如果先 kill 再通知 daemon,执行命令的 CLI 本身会随 backing session 一起退出,IPC 没有机会发出。方案
botmux delete先调用已有的POST /api/sessions/:sessionId/close,由 daemon 统一执行 worker/backend 回收、activeSessions删除、持久化关闭、订阅清理和生命周期事件。delete all将当前会话放到最后,避免自删除提前终止批处理。TUI 删除也走同一条路径。本 PR 不新增
botmux session close-self命令或新 IPC 路由。验证
corepack pnpm build通过。tsc --noEmit通过。git init -b失败;使用 Git 2.31 对对应的 3 个文件复跑为 31/31 通过。/procPID namespace 的进程发现与超时用例;已在未修改的origin/master(ec4d3407) 临时工作树上按相同签名复现 7/7。