Skip to content

fix(desktop): group forked tasks in sidebar - #3739

Open
Stella-xixi wants to merge 1 commit into
makecindy:mainfrom
Stella-xixi:codex/fix-issue-1998
Open

fix(desktop): group forked tasks in sidebar#3739
Stella-xixi wants to merge 1 commit into
makecindy:mainfrom
Stella-xixi:codex/fix-issue-1998

Conversation

@Stella-xixi

@Stella-xixi Stella-xixi commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

这次改了什么

摘要

为 Desktop 任务侧边栏补充基于现有 session family 元数据的会话树展示,解决 fork 出来的任务与父任务散落在列表中、难以辨认归属的问题。

  • 复用现有 parentSessionId,递归构建可折叠的任务组,不新增 schema 或 migration。
  • 任务组默认展开;父任务可折叠全部后代,子任务仍可继续形成嵌套层级。
  • 任务组按组内最近活动时间参与主列表排序,组内保持稳定顺序。
  • 自动化分组继续优先;父任务缺失、被过滤、已置顶、跨设备或形成环时,子任务安全降级为独立条目。
  • 置顶区继续沿用现有扁平顺序,不改变置顶语义。
  • 折叠按钮放在 SessionItem / SessionCard 原生拖拽行之外,避免与 feat(desktop): CC Agent 任务视图支持递归分屏拖拽布局 #1632 的排序、置顶和分屏拖拽命中区冲突。
  • 右键菜单新增“移出任务组”,通过受限 metadata 更新路径清除 parentSessionId;支持 device-link 路由,失败时回滚并提示。
  • Main IPC 只允许清空父任务关系,拒绝借此任意重设父任务,同时不刷新任务活动时间。
  • 五种语言同步更新,并补充任务树排序、降级、持久化和远端路由回归测试。

Fixes #1998

变更类型

  • feat 新功能
  • fix 缺陷修复
  • refactor / perf 重构或性能优化
  • docs / test / chore 文档、测试或工程维护
  • 其他:

范围

UI 变化

  • Windows Desktop 实机验证:已在隔离本地数据目录验证亮色与暗色模式下的父子/孙级缩进、父级与嵌套折叠、右键移出任务组,以及父任务置顶后的降级显示。
  • 拖拽兼容:折叠按钮位于可拖拽条目之外;DOM 检查确认其不存在 [draggable] 祖先,不截获现有排序、置顶和分屏拖拽入口。
  • 引用的设计规范:
    • docs/design-rules/DESIGN.md §10「Light / Dark Dual-Mode Delivery Gate」:新增控件复用现有语义 token 与主题样式,亮暗两种模式均完成本地目检。
    • 沿用侧边栏现有条目、图标按钮、上下文菜单与 hover/focus 状态,不新增硬编码颜色或平行组件样式。
    • 层级仅通过紧凑缩进与折叠 affordance 表达,保持现有列表密度;折叠交互与条目拖拽命中区物理分离。

界面效果

任务树分组与折叠

1-1 1-2 1-3

移出任务组

右键子任务选择「移出任务组」:

1-4-1

移出后任务恢复为顶层独立条目:

1-5

怎么验证的

自动验证

pnpm test:unit:related
结果:通过;Desktop 相关单测全部通过。

pnpm --filter desktop exec vitest run src/renderer/__tests__/mainListModel.test.ts src/main/localDb/ipc/__tests__/sessionsUpdate.test.ts src/renderer/__tests__/makerTransportRouting.test.ts
结果:87/87 通过。

pnpm --filter desktop run --if-present typecheck
结果:通过。

pnpm check:i18n
pnpm check:i18n-glossary
结果:通过;仅存量非阻塞告警。

pnpm check:dco --base origin/main
git diff --check
结果:通过。

手工验证

  • 环境:Windows Desktop,本地隔离实例(独立 userData)。
  • 创建父任务、两个子任务及孙任务,确认递归层级和缩进正确。
  • 折叠父任务,确认全部后代隐藏;仅折叠子任务,确认只隐藏其孙任务。
  • 右键将子任务移出任务组,确认 parentSessionId 清空且条目恢复顶层位置。
  • 将父任务置顶,确认子孙任务仍在普通列表独立可见,置顶区保持现有扁平顺序。
  • 切换 Light / Dark,确认两种模式下折叠按钮、层级与菜单显示正常。
  • 检查折叠按钮 DOM,确认不位于 draggable 祖先内。
  • 验证结束后已删除临时任务数据,工作区保持干净。

未执行的验证

  • 未在 macOS Desktop 目检;本次 Renderer 结构与样式为跨平台共享实现。
  • 未执行真实指针的排序/置顶/分屏拖拽手势回归;本次未修改 feat(desktop): CC Agent 任务视图支持递归分屏拖拽布局 #1632 的拖拽处理,且折叠控件在 DOM 结构上位于 draggable 命中区之外。相关列表模型与既有拖拽路径由单测和结构检查覆盖。
  • scoped ESLint 命中触及的存量文件既有 12 个基线问题(未使用变量/import 与缺失 react-hooks 规则),本次新增代码未产生新的报告项;仓库提交门禁要求的 related unit、Desktop typecheck、i18n、DCO 均已通过。

风险

风险分类

  • 无已知风险
  • SQLite / migration
  • system prompt
  • 协议兼容
  • 权限 / 安全 / 用户数据
  • 存量插件兼容(批准状态 / 指纹 / manifest 校验 / 安装布局 / 包格式)
  • 原生层 / fingerprint / OTA
  • 跨平台差异
  • 其他:侧边栏排序、折叠与拖拽交互回归风险

影响与回滚

  • 影响范围:仅 Desktop 主任务列表的展示投影、任务条目上下文菜单,以及清空 parentSessionId 的本地/远端更新路径。
  • 数据边界:不新增 migration;移出任务组只清空现有 parentSessionId,Main IPC 拒绝任意 reparent,且不会刷新任务活动时间。
  • 兼容边界:自动化分组优先,置顶区保持扁平;异常、缺失或跨设备父关系均降级为独立条目。
  • 回滚 / 降级方式:回滚本提交即可恢复原扁平列表与菜单;已由用户执行“移出任务组”的任务不会自动恢复原父关系,但任务内容不受影响。
  • 存量插件影响:无;未修改插件批准状态、指纹、manifest、安装布局或包格式。

提交前检查

  • 已 review 完整 diff
  • 每个 commit 都带 DCO 签名(git commit -s,见 DCO
  • UI 改动已在「UI 变化」注明引用的设计规范章节(不涉及 UI 则跳过)
  • 未提交凭证、令牌或授权文件
  • 已补充必要文档(本次无需新增产品文档,行为与边界由 UI 文案及测试覆盖)
  • 已确认测试结果或说明未执行原因

Build collapsible task families from the existing parent session metadata, preserve pinned and drag behavior, and allow branches to detach through the narrow metadata update path.

Fixes makecindy#1998

Signed-off-by: Stella-xixi <2559689615@qq.com>
@Stella-xixi
Stella-xixi requested a review from a team as a code owner September 1, 2026 10:49
@greptile-apps

greptile-apps Bot commented Sep 1, 2026

Copy link
Copy Markdown

Greptile Summary

本次变更为 Desktop 侧边栏增加基于 parentSessionId 的递归任务树展示,并提供本地及 Device Link 场景下的安全脱组操作。

  • 自动化分组后继续构建 session family,支持递归折叠、异常关系降级及按组内最近活动时间排序
  • 在任务卡片和列表项菜单中增加“移出任务组”,通过乐观更新、失败回滚及受限 IPC 持久化完成操作
  • Main 进程仅允许清空父任务关系,并保持原有活动时间不变
  • 同步更新五种语言及任务树、数据库写入和远端路由测试

Confidence Score: 5/5

未发现需要阻止合并的具体问题,本次变更看起来可以安全合并。

任务树投影保留了自动化、项目、置顶和设备边界,脱组写入也由 Main 进程限制为仅清空父关系并具备失败回滚。

Important Files Changed

Filename Overview
apps/desktop/src/renderer/features/cc-agent/lib/automationSidebarGrouping.ts 新增 session family 树构建,处理设备边界、缺失父节点和循环关系,并保持输入顺序。
apps/desktop/src/renderer/features/cc-agent/lib/mainListModel.ts 将任务 family 纳入主列表投影、活动时间排序、会话展开和设备分段逻辑。
apps/desktop/src/renderer/features/cc-agent/sidebar/SessionEntryList.tsx 新增递归任务树渲染和节点级折叠状态,并将折叠控件置于原任务拖拽行之外。
apps/desktop/src/renderer/features/cc-agent/sidebar/useDetachSessionFromFamily.ts 实现本地与远端共用的乐观脱组操作、写入失败回滚及用户提示。
apps/desktop/src/main/localDb/ipc/sessions.ts 扩展受限 metadata 更新链,仅允许清空 parentSessionId,并广播 family 状态变化。
apps/desktop/src/main/localDb/mapper.ts 将 parentSessionId 映射到数据库 patch,同时允许调用方禁止刷新 updatedAt。
apps/desktop/src/renderer/lib/sessionService.ts 扩展本地及 Device Link metadata 写入类型,使脱组沿用 sticky session origin 路由。
apps/desktop/src/renderer/tests/mainListModel.test.ts 覆盖 family 排序、父任务缺失降级和跨设备关系隔离。
apps/desktop/src/main/localDb/ipc/tests/sessionsUpdate.test.ts 覆盖脱组持久化、不刷新活动时间以及拒绝任意重新挂载父任务。

Sequence Diagram

sequenceDiagram
  participant U as 用户
  participant R as Renderer 侧边栏
  participant T as Session 路由
  participant M as Main / 远端 Main
  participant D as 会话数据库
  U->>R: 选择“移出任务组”
  R->>R: 乐观清空 parentSessionId
  R->>T: patchMeta(sessionId, null)
  T->>M: 本地 IPC 或 Device Link 转发
  M->>M: 校验仅允许清空父关系
  M->>D: 更新 parent_session_id
  M-->>R: 广播 sessions:patched
  alt 写入失败
    R->>R: 恢复原 parentSessionId
    R-->>U: 显示失败提示
  end
Loading

Reviews (1): Last reviewed commit: "fix(desktop): group forked tasks in side..." | Re-trigger Greptile

@MagicLizi MagicLizi added awaiting-discussion 等待维护者讨论(review-pr) touches:product-ui 改动碰到产品 / UI 面(review-pr 自动维护,仅展示) labels Sep 1, 2026
@MagicLizi

Copy link
Copy Markdown
Contributor

这条 PR 会改变侧栏里分叉任务的展示和「移出分组」交互,已提交维护者确认。球不在你这边——请等维护者在 PR 上 Approve;如果要改,维护者会 Request Changes。讨论 issue:#3746

@MagicLizi

Copy link
Copy Markdown
Contributor

命中 UI 路径(apps/desktop/src/renderer/features/cc-agent/lib/automationSidebarGrouping.ts / apps/desktop/src/renderer/features/cc-agent/lib/mainListModel.ts / apps/desktop/src/renderer/features/cc-agent/sidebar/SessionCard.tsx 等)但 description 未附界面效果证据——建议补充改动后效果:截图/录屏,或改动后界面的 HTML 页面(```html 代码块、.html 附件或在线预览链接),便于确认界面符合 DESIGN.md 设计规范

@Stella-xixi

Copy link
Copy Markdown
Contributor Author

命中 UI 路径(apps/desktop/src/renderer/features/cc-agent/lib/automationSidebarGrouping.ts / apps/desktop/src/renderer/features/cc-agent/lib/mainListModel.ts / apps/desktop/src/renderer/features/cc-agent/sidebar/SessionCard.tsx 等)但 description 未附界面效果证据——建议补充改动后效果:截图/录屏,或改动后界面的 HTML 页面(```html 代码块、.html 附件或在线预览链接),便于确认界面符合 DESIGN.md 设计规范

已在 PR 描述中补充了界面效果截图,包括任务分组、展开/折叠以及移出任务组的效果。感谢建议!

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

Labels

awaiting-discussion 等待维护者讨论(review-pr) touches:product-ui 改动碰到产品 / UI 面(review-pr 自动维护,仅展示)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

建议:从主对话分支出去的任务会话默认归属到主对话下(树形分组),而不是平铺在侧边栏根级

2 participants