Skip to content

umbrella: 补齐 cindy_helper 会话操作工具面(移动/置顶/删除/导出/新窗口/分叉/分支) #4385

Closed as not planned

Description

@cofyc

背景

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 + 相关 package typecheck;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,尚未合入。

原拆分与统一 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 进程同步,避免另一实例仍在运行时修改共享会话。

Activity

  1. dash-s-cindy commented on Sep 13, 2026

    @dash-s-cindy

    更新/判断:让 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 构建做一次真实入口验收。 使用合成任务,合并准备、执行和记录:

    • 从 agent 入口覆盖七工具发现与调用、对应权限档位及审批拒绝无副作用;删除 token 校验与预览后 dirty 状态变化拒绝;分享包可经现有入口导入、同路径不覆盖、不支持硬链接时明确失败且无最终残包;新窗口/分支结果正确;其他任务分叉成功,当前调用任务分叉自身明确拒绝而不挂起。
    • 重点从真实 IM agent 轮次对当前任务置顶/取消置顶,关联同一轮的工具回执、发送完成与侧栏结果。通过条件是工具在该轮发送结束前返回、界面即时更新,不依赖锁超时;保留生产式发送锁租约与真实 host 装配的回归,确认账号围栏、终态拒绝、幂等和广播。
    • 原移动场景复验无需重启刷新,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、PR 02b00b3db,上述关联记录的现有评论页已读完。本轮只读静态核查;根门禁、137 项数据库/审批测试与 IM 锁修复回归成功为作者报告,尚未取得真实入口验收与发布证据。此前 SIGSEGV/ENOENT 未在成功根运行中复现,不据此宣称根因已修复。

  2. 281 remaining items

  3. MagicLizi commented on Oct 10, 2026

    @MagicLizi
    Contributor

    你好 @cofyc,同步一下这条的进展 🙏

    umbrella 只交付了一部分:移动(move_session)与两处共用重构已进主干,置顶/删除/导出/新窗口/分叉/分支仍在 open 的 PR #5524 中,尚未合入,需保留跟踪。

    已经合入的部分先同步到这里,剩下的部分我们继续跟进,这条暂时保持 open。感谢你的耐心~

  4. cofyc commented on Oct 18, 2026

    @cofyc
    ContributorAuthor

    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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions