feat(session): 增加当前群话题会话列表 - #1194
Conversation
自动评审初步意见(PR #1194)先说结论:这个 PR 质量高于平均,建议小改后合入。四道安全闸(invoker 绑定、转发/篡改防护、locate 竞态闸、四条件过滤)设计正确,我们做了反变异验证——逐条改坏生产代码,对应测试都变红,说明这些闸是真在起作用而不是装饰。刻意不渲染 workingDir / 完整 session ID / 终端链接的处理也很干净,未发现越权、跨群或跨 bot 泄漏。 以下两条建议 + 一条 nit: 🟠 F1:
|
F2 选项更正(替代上一条评论里的「建议二选一」)抱歉,上一条评论里的选项 ② 表述有误,在此撤回并给出收敛后的最终菜单。 为什么撤回 ②上一条写的是「将 所以照字面实现 ② 需要新造「内置默认」这个概念,而它改变的是所有已部署 bot 的默认权限——收敛面是整个 fleet,不止 若要达成 issue #1193 原意,有收敛面更小的替代选项 ③:在统一闸之前特判 如实标价——这不是照抄既有先例:
安全面我们已核过,是有界的:p2p 被 handler 的 最终菜单(以此为准)
交由你与维护者定夺——这属于产品决策,我们不代为选择。F2 之外的 F1( 以上仍是自动评审的初步意见,最终以维护者审阅结论为准。 |
0c1f5bf to
b8c752c
Compare
|
已按评论更新,并 rebase 到最新
本地验证:相关 6 文件 405 passed;locate IPC 7 passed / 192 skipped; |
二轮评审:
|
b8c752c to
582804f
Compare
|
已整理并推送当前完整版本,head 为 相较二轮评审时的版本,本轮新增/收敛:
最终验证: |
三轮评审:新增改动质量在线,1 条建议 + 1 条 rebase 提醒先说结论:代码层面没有阻断项。 这轮从「只读列表」扩展到「可操作管理卡」(含首个写操作 resume),权限边界处理得很稳 —— 我们特别检查了容易出问题的地方,都没踩:
上轮三条也已全部闭环:F1(locate 对象判定)✅、F2( 🟡 F3(建议修,非阻断):
|
- daemon 新增 POST /api/sessions/:id/resolve-thread-id:仅重读本地 owned session,thread + om_ root + 缺合法 omt_ 时才查飞书,经 fillNativeTopicId 持久化并发布 feishuThreadLink SSE patch(active/persisted/closed 均覆盖)。 - 中央 GET /api/sessions 返回快照后后台按 larkAppId 路由 owning daemon 触发 回填,非阻塞、in-flight 去重、失败 5min 冷却、并发上限 4。 - 新增 lazy-topic-link-backfill 及单测。 Co-authored-by: TRAE CLI <traecli@bytedance.com>
582804f to
bb97f6e
Compare
|
已完成本轮修订:
验证: 最新提交: |
|
🚀 Released in v3.19.1 |
) `docs-deploy` 自 #1194 起 8 次 run 全部失败,零成功。报错是 rspress 的 `Dead image found`:文档里 `` 会让 rspress 去 `docs-site/docs/public/img/` 找(`rspress.config.ts` 是 `root: 'docs'`), 而截图实际提交在 `docs-site/static/img/`,没有任何步骤把它们拷过去。 `markdown.link.checkDeadLinks` 开着,于是一张缺图就让整个站构建失败。 `docs/public` 本来就是「构建前生成」的目录(已在 .gitignore 里,`prebuild` 的 prepare-assets.mjs 会往里拷 logo),只是这个脚本只管了 logo。改成整个 `static/img/` 目录一起拷,以后加截图不用再动这个脚本——现存 4 张死图 (sessions-command-card、quota-fallback-dashboard、 quota-fallback-cycle-recovery-dashboard、streaming-card-button-settings, 分别由 #1194 / #1283 / #1323 引入)一并修好。 `static/img` 仍是唯一事实来源;生成出来的 `docs/public/img/` 加进 .gitignore, 避免同一批图在仓库里存两份。目录不存在时按 ENOENT 跳过而不是让 prebuild 崩掉: 没有截图的构建是合法的,该由 rspress 的 checkDeadLinks 去管「文档引用了但缺图」。 验证(本地无法跑 rspress:worktree 内不装依赖): - `node scripts/prepare-assets.mjs` rc=0,5 张图拷进 docs/public/img/,与源逐字节相同 - 文档里 4 个 `/img/` 引用全部解析到实际文件(unresolved=0) - 删掉 static/img 重跑 rc=0(不再 ENOENT 崩),恢复后仍拷齐 5 张 - 生成目录已被 .gitignore 忽略(`git check-ignore` 命中) 真正的绿要靠 CI 跑一次 docs-deploy 确认。 Co-authored-by: Claude Code <noreply@anthropic.com>
背景与实现
Closes #1193
/sessions,只展示当前 bot、当前群的threadscope 会话。omt_的历史会话由中央列表后台按 owning daemon 懒回填并持久化,失败带去重、并发上限和冷却。/sessions仍固定在群顶层展示;真实话题内调用仍回复当前话题。/sessions与会话卡片的状态颜色(等待输入保持绿色),并更新/help、中英文 i18n、命令文档和截图。权限与安全
/sessions是只读群级命令:new-topic 与 thread-reply 两条生产路由均单独按canTalk判权;其它 daemon 管理命令仍默认要求canOperate。larkAppId + chatId + thread scope重新过滤;实时查询只允许认证 caller 读取其自身 bot 的行。null、标量和数组统一返回400 body_must_be_object;既有 Dashboard{}调用保持兼容。(larkAppId, chatId, invokerOpenId)隔离,不会撤回其他成员正在查看的卡片;撤回失败不影响新卡可用。影响面
涉及公共命令路由、飞书卡片回调、Dashboard/daemon IPC、会话恢复卡片生命周期与 session 行投影。未改动 CLI adapter、PTY/tmux/ZMX/远端 backend 的执行语义;普通群 chat-scope 会话及其它 bot/群均不会进入列表。
界面
验证
upstream/master(37652bf0c)✅bun run build✅card-handler-resume-receiptcommand-handlerdaemon-internal-apidaemon-rename-routedashboard-ipcgroup-sessions-card-dispatchgroup-sessions-card-storegroup-sessions-cardlazy-topic-link-backfillgit diff --check✅