Repository navigation
umbrella: 补齐 cindy_helper 会话操作工具面(移动/置顶/删除/导出/新窗口/分叉/分支) #4385
Copy link
Copy link
Closed as not planned
Description
背景
cindy_helper control 类目此前只暴露了「改名」「归档」两类会话操作。真实踩坑:agent 要把一个已存在的 session 从对话型移到某个项目下(改 workingDir + workspaceKind),GUI 有「移动到项目」,但工具面没有,agent 只能绕过 app 直写 SQLite,跳过 renderer 广播与 upsertRecentWorkdir 等副作用,界面要重启才刷新。
调研结论:GUI 会话菜单里 agent 缺失的操作有 移动到项目/对话、置顶、删除、导出分享包、在新窗口打开、Fork、会话分支;「复制任务链接」不需要工具(固定 cindy://session/<id>),Rewind 是作曲器内交互式改写,不暴露。
#4383 是一次性完成全部工具的参考实现,已于 2026-09-17 关闭(内容已被本 issue 的拆分 PR 全面取代,逐文件核对见该 PR 的关闭说明;分支 cindy/sincere-kalam 保留,需要对照可重开)。本 issue 把它拆成可独立评审的小 PR。
共同约束
- 必须复用主进程既有 session 写路径(
local-db:sessions:update业务体 / session-share 导出编排 /forkSessionAtMessage),不另造绕过广播与副作用的写入链路。 - GUI 守卫在工具侧复现:远程(SSH)会话不支持;运行中(含 Orca lead 的 worker)拦截;IM 接管中(
bindingStore.findByTarget)拦截;已归档 / 已删除、空草稿、review 会话按各操作口径拦截;不允许对当前 session 自己做移动 / 删除。 - 工具契约与
archive_sessions同风格:批量 + 失败码NOT_FOUND/PRECONDITION_FAILED/INVALID_ARGS/HOST_NOT_READY/INTERNAL;批量先全量校验、任一不过整批不写。 - 不新增 schema / migration;main 不用动态
import();package 不反向依赖 main。 - 每个 PR 带单测;提交前跑
pnpm test:unit:related+ 相关 packagetypecheck;git commit -s(DCO)。 - 参考实现可从 feat(helper): 补齐会话操作 MCP 工具(移动/置顶/删除/导出/新窗口/分叉/分支) #4383(分支
cofyc:cindy/sincere-kalam)按文件 cherry-pick 对应 hunk。
当前状态(2026-10-17)
统一 PR:#5524(cofyc:cindy/session-ops-tools)。本 issue 由该 PR 的 Closes #4385 在合入时关闭;当前已推送 head 02b00b3db 已合入 main 91634b555,GitHub 显示可合并。该精确 head 的全部已出现的检查 SUCCESS,Greptile 5/5、未解决线程 0(已核对无后续分页);#5528 仍需维护者人工 Approve,尚未合入。
- T1 refactor(localDb): 抽出 updateSessionInDb 供非 IPC 调用复用 #4388、T2 refactor(mcps): 抽出确认 token 编解码供多个工具复用 #4387 已合入 main。
- 原 T3–T8 拆分 PR refactor(helper): 会话操作工具共用的 host 骨架 #4389、feat(helper): 新增 pin_sessions / unpin_sessions 置顶工具 #4391、feat(helper): 新增 delete_sessions 会话删除工具(dry-run + 确认 token) #4392、feat(helper): 新增 export_session 分享包导出工具 #4390、feat(helper): 新增 open_session_in_new_window 与 get_session_branches 工具 #4394、feat(helper): 新增 fork_session 工具并收口会话操作能力说明 #4393 均已关闭,由 feat(helper): 补齐会话菜单操作的 cindy_helper 工具 #5524 取代;历史评审保留在原 PR。
- feat(helper): 补齐会话菜单操作的 cindy_helper 工具 #5524 以 main 的
move_session为基础,合并置顶/取消置顶、删除、导出、新窗口、分支查询、分叉及共用 host 接线、逐次审批和回归;原move_sessions已取消,能力说明已并入。 - 最新 head 修复当前 IM 任务置顶/取消置顶的发送锁重入:仅 validated pinnedAt-only 条件写绕开路由锁,SQL 同时检查 active 与 pin 状态,保留账号围栏与移动/删除锁。新增 7 项回归,合并后数据库与审批策略共 137 测试通过。精确 Node 22.22.3 / pnpm 10.33.2 下,必需根
pnpm test:unit:related全 required workspaces、Desktop typecheck、DCO 与 diff check 全通过。 - 根门禁新发现的 macOS hygiene CLI fixture 路径问题已按 DCO fixture 的 realpathSync 模式修正,4 项测试通过,断言和门禁命令不变。此前 helper SIGSEGV / takeover ENOENT 未在成功根运行中复现,未声称其根因已修复;未改 runtime pin、未重启安装中的 app。当前 head 的 CI 与 Greptile 复审已完成:全部已出现的检查 SUCCESS、Greptile 5/5、0 未解决线程,GitHub MERGEABLE / REVIEW_REQUIRED。证据见 CI、Greptile 与 P1 修复回执。没有批准或合并;PR #5524 需要维护者确认:agent 代办会话菜单操作工具(product + arch) #5528 仍由维护者人工决定。
原拆分与统一 PR 的对应关系
| 原任务 | 原 PR | #5524 中的内容 |
|---|---|---|
| T3 | #4389 | 会话操作共用骨架;move_sessions 取消,沿用 main 的 move_session |
| T4 | #4391 | pin_sessions / unpin_sessions |
| T5 | #4392 | delete_sessions 预览、确认 token、软删除 |
| T6 | #4390 | export_session |
| T7 | #4394 | open_session_in_new_window / get_session_branches |
| T8 / T9 | #4393 | fork_session 与 capabilities.ts 能力说明 |
后续独立跟踪事项(不由 #5524 解决)
- 远程 SSH 会话适配:删除、导出与分叉显式拒绝 SSH 任务,后续需要远程链路;置顶、新窗口与分支查询沿用宿主元数据/路由。
- 批量置顶可能并发触发多次摘要生成;在共享摘要模块加并发闸门。
-
move_session与 Orca Worker 派发之间需要跨会话串行化,避免工作目录移动竞态。 - 工作目录授权需要在 lazy resume 前重验真实目录身份,防止路径被替换。
- 运行中判定需要跨 Desktop 进程同步,避免另一实例仍在运行时修改共享会话。
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels
Activity
dash-s-cindy commentedon Sep 13, 2026
更新/判断:让 agent 经应用正式入口整理、导出和分叉任务有明确用户价值;当前 head
02b00b3db的 CI 汇总verify已核实成功,Greptile 也已针对同一 head 完成 5/5 复审,下一步应收口维护者确认与交付验收,不再重复要求修复旧门禁。CI、复审首要行动:维护者与现有作者 @cofyc 接续 #5528,在 #5524 收口可验收的产品承诺。 推荐保留既有权限档位:Ask 逐次真人确认、Auto 统一审阅、Full Access 免操作审批。当前审批策略明确档位仍生效,
prompt-each-time不代表所有模式都弹真人确认;应修正 PR 的“每次经用户确认”表述,并补齐capabilities.ts对七工具的说明及当前调用任务不能分叉自身的边界。删除 token 只证明已预览,不替代授权。若希望跨档位强制真人确认,应另作明确产品决定,不直接改变现有行为。需要修订就在 PR 正式 Request Changes,说明与实现一致后 Approve;新提交须核对新 head 的必需 CI。审批策略、能力说明口径收敛后,作者/QA 在含修订的 Desktop 构建做一次真实入口验收。 使用合成任务,合并准备、执行和记录:
working_dir: null移出分组仍保留目录。不要把删除/移动守卫套到其他操作:保留 SSH、运行中及 IM 接管任务可置顶,以及 GUI 原有密码和覆盖导出行为。留下构建号、调用回执和界面/产物结果;失败回同一 PR 修订,通过后记录包含能力的发布版本,不以合并作为交付完成。
范围与交付状态:#4592 已合并并提供
move_session,当前 main 也有注册入口,应沿用它而非恢复move_sessions或直写 SQLite。#5524 当前仍 open、merged=false;正文中的“合入 main”是分支同步主干,不是七工具已经进入主干。作者/维护者应将远程 SSH 链路,以及已列摘要并发、移动与 Worker 派发协调、目录授权重验、跨 Desktop 运行态同步保留为独立记录,不随Closes丢失,也不以本次验收为前提;本轮不追加新的限制方案。核查边界:main
cd213ea65ffb1368f4b3c8b44a6c1d8bac4df31a、PR02b00b3db,上述关联记录的现有评论页已读完。本轮只读静态核查;根门禁、137 项数据库/审批测试与 IM 锁修复回归成功为作者报告,尚未取得真实入口验收与发布证据。此前 SIGSEGV/ENOENT 未在成功根运行中复现,不据此宣称根因已修复。test(helper): 覆盖置顶工具输入与错误
test(helper): 覆盖 export_session 工具
feat(helper): 新增 move_sessions 会话移动工具
fix(helper): tighten move session preconditions
test(desktop): 覆盖会话置顶守卫
feat(helper): 新增 fork_session 工具并收口会话操作能力说明
feat(helper): 新增 move_sessions 会话移动工具
refactor(mcps): 抽出确认 token 编解码供多个工具复用
feat(helper): 新增 delete_sessions 会话删除工具(dry-run + 确认 token)
feat(helper): 新增 pin_sessions / unpin_sessions 置顶工具
test(helper): 覆盖置顶工具输入与错误
test(desktop): 覆盖会话置顶守卫
feat(helper): 新增 move_sessions 会话移动工具
feat(helper): 新增 fork_session 工具并收口会话操作能力说明
281 remaining items
feat(helper): 新增 delete_sessions 批量软删除工具
feat(helper): 新增 export_session 会话导出工具
feat(helper): 新增 open_session_in_new_window / get_session_branches 工具
feat(helper): 新增 fork_session 会话分叉工具
feat(helper): 新增 delete_sessions 批量软删除工具
feat(helper): 新增 export_session 会话导出工具
feat(helper): 新增 fork_session 会话分叉工具
feat(helper): 会话操作工具共用的 host 骨架
feat(helper): 新增 delete_sessions 批量软删除工具
feat(helper): 新增 export_session 会话导出工具
feat(helper): 新增 open_session_in_new_window / get_session_branches 工具
feat(helper): 新增 fork_session 会话分叉工具
MagicLizi commentedon Oct 10, 2026
你好 @cofyc,同步一下这条的进展 🙏
umbrella 只交付了一部分:移动(move_session)与两处共用重构已进主干,置顶/删除/导出/新窗口/分叉/分支仍在 open 的 PR #5524 中,尚未合入,需保留跟踪。
已经合入的部分先同步到这里,剩下的部分我们继续跟进,这条暂时保持 open。感谢你的耐心~
cofyc commentedon Oct 18, 2026
Closing at the author’s request following cancellation of the associated PR. This is a cancellation, not a claim that the requested functionality shipped or the reported bug was fixed.