Skip to content

feat(desktop): support manual /compact context compaction - #3744

Open
betterkite wants to merge 1 commit into
makecindy:mainfrom
betterkite:betterkite/desktop/manual-compact-slash
Open

feat(desktop): support manual /compact context compaction#3744
betterkite wants to merge 1 commit into
makecindy:mainfrom
betterkite:betterkite/desktop/manual-compact-slash

Conversation

@betterkite

@betterkite betterkite commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

这次改了什么

摘要

在 SessionView 的两条发送路径(NewMaker 首条 pending 消费与 handleSend)精确拦截 /compact 控制指令,复用既有手动压缩通道:claude-code 走输入协调器 maker:input:compact,pi 走能力感知 compact-session 通道;codex、SSH 远程及不支持场景给出明确提示。不在共享命令面板暴露 pi compact 目录项(移动端发送面未适配)。补桌面回归测试与五语言文案。

变更类型

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

范围

  • Related issue: Fixes 支持通过 /compact 指令手动触发上下文压缩 #3711
  • Included: 实现要点:1) isExactManualCompactCommand 仅匹配精确 /compact(带参数仍走原路径);2) maybeCompactSession 在 palette dispatch 前拦截,与既有 /context 处理同构,steer 模式不拦截;3) 复用 compactRequestGuard 防重入,纯代码前移;4) codex 会话提示服务端自动压缩,pi 回合运行中提示等待,SSH 远程 pi 提示不可用;5) NewMaker 首条 pending 消费路径与 handleSend 共用同一拦截并消费交接副本;6) 不向共享命令面板暴露 pi compact 目录项(listAgentCommands 返回空,移动端发送面未适配,feat(desktop): support manual /compact context compaction #3744 review);7) claude 路径接受后不提前报成功,由既有 compact_boundary 投影呈现完成。
  • Not included: Work outside the listed files.
  • User-visible change: 在 SessionView 的两条发送路径(NewMaker 首条 pending 消费与 handleSend)精确拦截 /compact 控制指令,复用既有手动压缩通道:claude-code 走输入协调器 maker:input:compact,pi 走能力感知 compact-session 通道;codex、SSH 远程及不支持场景给出明确提示。不在共享命令面板暴露 pi compact 目录项(移动端发送面未适配)。补桌面回归测试与五语言文案。
  • Breaking change: No.

Remote and mobile adaptation

  • SSH remote workspaces: Not affected.
  • Device link: No channel or protocol change.
  • Mobile: Not affected.

UI 变化

无新增视觉样式:未新增任何组件、颜色、字号或圆角。用户可见变化仅为交互/文案层——/compact 命令入口复用既有 composer 命令解析与命令面板交互,全部反馈提示复用既有 toast 组件,文案走既有 i18n 通道。

  • 引用的设计规范:DESIGN.md §4 (Component Stylings) 与 §7 (Do's and Don'ts)——本 PR 复用既有 toast / 命令面板组件,不引入新组件或新视觉样式,不新增色彩、圆角、阴影与字重;§7 的 Don'ts(无渐变、无装饰动画、≤150ms 功能性状态过渡)对新增提示同样适用。

怎么验证的

自动验证

pnpm --filter desktop exec vitest run src/renderer/__tests__/manualCompactCommand.test.ts
Result: passed.

pnpm --filter desktop exec vitest run src/renderer/__tests__/sessionAgentSwitchRemoteRouting.test.ts
Result: passed.

pnpm --filter @cindy/maker-core exec vitest run src/agents/pi/__tests__/pi-compact.test.ts
Result: passed.

pnpm --filter @cindy/maker-core exec tsc --noEmit --strict --skipLibCheck --module esnext --moduleResolution bundler --target esnext --esModuleInterop --isolatedModules src/agents/pi/commands.ts
Result: passed.

pnpm --filter mobile run --if-present typecheck
Result: passed.

pnpm check:dco
Result: passed.

手工验证

Not run.

未执行的验证

  • desktop 全量 typecheck 与全量单测未在本地验证容器执行:desktop 工程 tsc 需 8GB 堆、全量单测在本地 Docker VM(约 3.9GB 内存)bind-mount I/O 下超出部分文件遍历型用例的 vitest 5s 超时,均属环境限制而非代码问题;CI(Linux/Windows)会完整执行。本地已在容器内运行与改动直接相关的全部聚焦用例(见上)并对新增 maker-core 文件执行严格 tsc。
  • 手工端到端压缩流程(macOS/Windows 桌面客户端实际触发 claude-code 与 pi 会话压缩)未执行:无对应本地客户端环境。

风险

风险分类

  • 无已知风险
  • SQLite / migration
  • system prompt
  • 协议兼容
  • 权限 / 安全 / 用户数据
  • 存量插件兼容(批准状态 / 指纹 / manifest 校验 / 安装布局 / 包格式)
  • 原生层 / fingerprint / OTA
  • 跨平台差异
  • 其他:

影响与回滚

  • Impact: Limited to the files listed in this pull request.
  • Risk: No known risks.
  • Rollback: Revert this commit. No data migration or cleanup is required.

提交前检查

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

@betterkite
betterkite requested a review from a team as a code owner September 1, 2026 11:15
@greptile-apps

greptile-apps Bot commented Sep 1, 2026

Copy link
Copy Markdown

Greptile Summary

此 PR 为桌面 SessionView 增加精确 /compact 控制指令,并复用 Claude Code 与 Pi 现有的手动压缩通道。

  • 在普通发送和 NewMaker 首条 pending 消费路径中统一拦截无附加载荷的精确 /compact
  • 按 agent 能力、运行状态和远程类型选择压缩通道或显示明确提示
  • 使用会话级请求 guard 防止重复压缩,并补充五种语言的提示文案
  • 避免在尚未适配的共享命令面板中发布 Pi compact 命令

Confidence Score: 5/5

此 PR 看起来可以安全合并,先前报告的载荷丢失与 SSH 错投问题在当前代码中均已消除。

当前版本没有遗留的阻塞性故障。

Important Files Changed

Filename Overview
apps/desktop/src/renderer/features/cc-agent/CCAgentSessionView.tsx 新增两条发送路径共享的 /compact 拦截、能力与远程门禁,以及会话级防重入处理;此前反馈的载荷丢失和 SSH 错投均已修复。
apps/desktop/src/renderer/lib/slashCommands.ts 新增仅匹配独立 /compact(允许首尾空白及大小写差异)的判定函数,带参数文本仍走普通发送路径。
apps/desktop/src/renderer/tests/manualCompactCommand.test.ts 覆盖精确命令识别、附加载荷回退、SSH 门禁和 NewMaker 首条消息拦截。
packages/maker-core/src/agents/pi/tests/pi-compact.test.ts 补充 Pi 不向共享命令面板发布 compact 内置命令的回归断言。
packages/maker-core/src/agents/pi/index.ts 仅调整类型导入格式,不改变运行时行为。

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
  A[用户发送消息] --> B{精确 /compact?}
  B -- 否 --> C[普通发送路径]
  B -- 是 --> D{存在附件或引用载荷?}
  D -- 是 --> C
  D -- 否 --> E{压缩通道可用?}
  E -- 否 --> F[显示不可用提示]
  E -- 是 --> G{SSH 远程或 Pi 正在运行?}
  G -- 是 --> H[显示阻止原因]
  G -- 否 --> I{Claude Code 或 Pi}
  I -- Claude Code --> J[输入协调器 compact]
  I -- Pi --> K[compact-session]
Loading

Reviews (4): Last reviewed commit: "feat(desktop): support manual /compact c..." | Re-trigger Greptile

Comment thread apps/desktop/src/renderer/features/cc-agent/CCAgentSessionView.tsx Outdated
Comment thread apps/desktop/src/renderer/features/cc-agent/CCAgentSessionView.tsx
@MagicLizi

Copy link
Copy Markdown
Contributor

@betterkite 👋 这个 PR 还有 2 条 review conversation 没 resolve(apps/desktop/src/renderer/features/cc-agent/CCAgentSessionView.tsx),auto-review 因此暂时跳过、没法继续审查 / 合并。

如果你已经按评论改完或回应了,请到对应 thread 上点 Resolve conversation;全部 resolve 后,下一轮 auto-review 会自动重新审查这个 PR。

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

Copy link
Copy Markdown
Contributor

这条 PR 会让输入 /compact 变成宿主控制命令(不再当普通消息发出),已提交维护者确认。球不在你这边——请等维护者在 PR 上 Approve;如果要改,维护者会 Request Changes。讨论 issue:#3747

@MagicLizi

Copy link
Copy Markdown
Contributor

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

@betterkite
betterkite force-pushed the betterkite/desktop/manual-compact-slash branch from a75681b to 85a98ff Compare September 1, 2026 12:31
@betterkite

Copy link
Copy Markdown
Contributor Author

收到。关于界面效果证据的补充说明:本 PR 无新增视觉样式——未新增任何组件、颜色、字号或圆角;用户可见变化仅在交互/文案层(精确 /compact 拦截与既有 toast 反馈),全部复用既有组件与交互模式,无新界面可以截图。本地验证容器里也没有可用的桌面客户端 GUI 环境,无法产出真实截图/录屏;如实补录会依赖可运行客户端的环境,如维护者认为需要,我可以在具备环境的机器上补录。"@awaiting-discussion" 的行为变更确认(#3747)已知悉,等待维护者在 PR 上的结论。

@betterkite

Copy link
Copy Markdown
Contributor Author

Windows unit tests (1/2) 失败定性(按仓库 CI 跟进流程,未改代码,只记录证据):

失败的 5 项用例全部不在本 PR 触碰的文件里(本 PR 只改 renderer 会话视图 + maker-core pi + i18n,共 11 个文件):

  1. src/main/__tests__/windowsPackagedInstanceBarrier.test.tstimed out acquiring Windows packaged-instance barrier(跨进程互斥锁获取超时,2337ms;同一文件其余用例通过);
  2. src/main/reviewer/__tests__/reviewSourceLease.test.ts ×4 — Test timed out in 20000ms(实际 37-48s,SQLite lease 在 Windows runner 上锁等待超时;同文件 block 共 181s);
  3. packages/lizi-im feishu outboundFile/streamingText ×6 — 文件 key 复用链断言失败(与 renderer/pi 无 import 交集)。

环境性证据:

我没有上游仓库的 admin 权限,无法重跑该 job。请维护者重跑 client-ci / Windows unit tests (1/2) 取证,或在裁决 #3747 时一并判断是否属于 Windows runner 的间歇性抖动。

@betterkite betterkite closed this Sep 1, 2026
@betterkite betterkite reopened this Sep 1, 2026
@betterkite betterkite closed this Sep 1, 2026
@betterkite betterkite reopened this Sep 1, 2026
@betterkite
betterkite force-pushed the betterkite/desktop/manual-compact-slash branch from 85a98ff to 5ab6e75 Compare September 3, 2026 11:12

@MagicLizi MagicLizi left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

审查发现 P1 ×2,请在当前 head 上修复后再请求 review。

  • [P1] apps/desktop/src/renderer/features/cc-agent/CCAgentSessionView.tsx:4036 — NewMaker 首条 /compact 不走拦截。草稿 pending 只调用 maybeDispatchDesktopSlashCommandcompactagent-builtinhandled=false),再 sendMessage(pendingText),从不调用 maybeCompactSession。拦截只挂在 handleSend。从新建任务发出的精确 /compact 仍当普通 prompt;Pi 会经 escapeLeadingSlashCommand 变成字面 /compact 写入首条用户消息。请让 pending 消费与 handleSend 共用同一拦截。验证:新建 Pi 任务输入 /compact 发送,不得出现字面 /compact 用户消息。

  • [P1] packages/maker-core/src/agents/pi/commands.ts:3 — Pi 把 compact 写进共享 listAgentCommands 白名单,桌面/手机命令面板都会展示;真正拦截只存在于桌面 handleSend。Mobile 发送路径没有对等拦截,会把该命令当普通 prompt。这比原生 Pi 更难用,也与 Description 写的 Mobile: Not affected 不符。请所有发送面都拦截并走 compactSession RPC,或在未适配面不要暴露 Pi compact 目录项。

@MagicLizi MagicLizi removed the awaiting-discussion 等待维护者讨论(review-pr) label Sep 4, 2026
@MagicLizi
MagicLizi dismissed their stale review September 4, 2026 17:23

这些问题已在当前 head 的后续 commit 中修复(格式门/安全门已通过),自动 dismiss 旧的 CHANGES_REQUESTED 以解除合并阻塞。

@MagicLizi MagicLizi added the awaiting-discussion 等待维护者讨论(review-pr) label Sep 4, 2026
@MagicLizi

Copy link
Copy Markdown
Contributor

@betterkite 👋 这个 PR 现在在等维护者确认,确认之前流程不会合并它 —— 不是卡住了,也不是在等你再改一版(你推的改动流程都读到了,判的就是最新一版代码)。

  • 在拦的是:维护者确认门(产品 / UI 变更)。
  • 讨论 issue:维护者确认:#3744 输入 /compact 手动压缩上下文 #3747
  • 通过方式只有一个:维护者在本 PR 上 Approve。维护者觉得要改会直接 Request Changes,那时候球才回到你手里。
  • 这期间如果还有 review 意见没处理完、CI 没过,照常修就行,不影响这条等待。

这条是流程自动发的状态提醒(同一版代码只发一次),不用回复。

@betterkite
betterkite force-pushed the betterkite/desktop/manual-compact-slash branch 2 times, most recently from d274ef8 to 37ba0f2 Compare September 5, 2026 06:59
@betterkite

Copy link
Copy Markdown
Contributor Author

两条新 P1 已在 head 37ba0f2a 修复:

1. NewMaker 首条 /compact 不走拦截
pending 首条消费路径(约 :4036)与 handleSend 现在共用同一 maybeCompactSession 拦截:精确 /compact 在首条位置也走宿主压缩通道,不再经 sendMessage/Pi 的 escapeLeadingSlashCommand 落成字面用户消息;拦截后经 deliverRecoverableHandoff 消费交接副本(与命令派发同口径,副本删除仍只有这一条路),带载荷的首条不拦截、载荷随原发送路径消费。验证:manualCompactCommand.test.ts 新增 pending 共用拦截断言;newMakerOrcaCreateOrder.test.ts 的副本删除调用点计数同步为 4(拦截路径也走 deliver,未绕过)。

2. Pi compact 目录项在未适配面暴露
按 reviewer 给的第二选项处理:移除 pi/commands.ts 目录项,listAgentCommands 回到空(桌面+移动面板都不再暴露);桌面发送面的精确 /compact 拦截不受影响。这样「Mobile: Not affected」重新成立——移动端行为与 PR 之前一致。pi-compact.test.ts 反向断言 Pi 不发布该目录项,防止回归。

容器内验证(run 65a53419):聚焦单测(含 newMakerOrcaCreateOrder / manualCompactCommand / sessionAgentSwitchRemoteRouting / pi-compact)、maker-core 严格 tsc(index.ts + md-raw 环境)、mobile typecheck、DCO 全部通过。

@MagicLizi MagicLizi added awaiting-discussion 等待维护者讨论(review-pr) and removed awaiting-discussion 等待维护者讨论(review-pr) labels Sep 5, 2026
@MagicLizi

Copy link
Copy Markdown
Contributor

@betterkite 👋 这个 PR 现在在等维护者确认,确认之前流程不会合并它 —— 不是卡住了,也不是在等你再改一版(你推的改动流程都读到了,判的就是最新一版代码)。

  • 在拦的是:维护者确认门(产品 / UI 变更)。
  • 讨论 issue:维护者确认:#3744 输入 /compact 手动压缩上下文 #3747
  • 通过方式只有一个:维护者在本 PR 上 Approve。维护者觉得要改会直接 Request Changes,那时候球才回到你手里。
  • 这期间如果还有 review 意见没处理完、CI 没过,照常修就行,不影响这条等待。

这条是流程自动发的状态提醒(同一版代码只发一次),不用回复。

@MagicLizi

Copy link
Copy Markdown
Contributor

@betterkite 👋 这个 PR 目前与 main 有合并冲突,auto-review 因此暂时跳过、没法继续审查 / 合并。

请在本地 merge 最新的 origin/main 解决冲突后推送;冲突解除后,下一轮 auto-review 会自动重新处理这个 PR。

在 SessionView 的发送路径上精确拦截 /compact 控制指令,复用既有手动压缩
通道:claude-code 走输入协调器 maker:input:compact,pi 走能力感知的
compact-session 通道。codex 及不支持压缩的场景给出明确提示,不静默吞掉
指令;pi 回合运行中与 SSH 远程会话分别给出阻塞/不可用提示。NewMaker 首条
pending 消费路径与 handleSend 共用同一拦截;不在共享面板暴露 pi compact
目录项(移动端发送面未适配)。补桌面回归测试与五语言文案。

Closes makecindy#3711

Signed-off-by: betterkite <1240167669@qq.com>
@betterkite
betterkite force-pushed the betterkite/desktop/manual-compact-slash branch from 37ba0f2 to f359b21 Compare September 6, 2026 11:46
@betterkite betterkite closed this Sep 6, 2026
@betterkite betterkite reopened this Sep 6, 2026
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.

支持通过 /compact 指令手动触发上下文压缩

2 participants