Skip to content

feat(desktop): 任务级上下文窗口档位 UI:ContextWindowBudgetChip - #7011

Merged
MagicLizi merged 4 commits into
makecindy:mainfrom
zyjisdog:feat/session-context-window-ui
Oct 25, 2026
Merged

MagicLizi merged 4 commits into
makecindy:mainfrom
zyjisdog:feat/session-context-window-ui

Conversation

@zyjisdog

@zyjisdog zyjisdog commented Oct 24, 2026 •

Copy link
Copy Markdown
Contributor

feat(desktop): 任务级上下文窗口档位 UI:ContextWindowBudgetChip
---HEAD: feat/session-context-window-ui

拆分说明(#4598 review 2026-10-23):本 PR 是三拆分的第 2 部分(chip UI)。
它叠在另外两个 PR 之上:内核 #4598(存储 / 边界 / 引擎接入 / device-link)与基建 #7006(focusTraversal / statusBarCards / popover portalContainer)。在两者合入前,本 PR 的 diff 会包含它们的提交;合入后本分支 rebase 到新 main,diff 自动收敛为 UI-only(仅最后一个提交)。

这次改了什么

摘要

给任务底栏加「工作上下文窗口档位」chip:↕ + 当前档位百分比,悬浮展开档位卡(与「用量明细」卡同款 Popover、互斥、非模态),档位枚举「模型默认 + 有效上限的 25%/50%/100% 比例档」,每档标注该档输入价带(仅本地任务:远程任务的价带隐藏,本机报价不代表被控端的连接与价格覆盖);保存即应用到活实例(空闲冷重建 / 回合中登记 pending)。

  • 档位规则:基准 = min(目录物理上限, 该路由模型级上限);round(基准 × 百分比) 精确换算;低于 200K 或与默认档重合的不出现;最多三档、优先保留大比例;显示 25% · 250K(K 一位小数 / M 两位,落库精确整数)。
  • 边界权威:本地走 maker:get-context-window-bounds,远程走 device-link 同名通道;百分比分母只认申报上限;renderer 永不自行推导窗口(消费 main 下发的 defaultEffectiveWindow / maxEffectiveWindow / budget)。
  • 远程任务:控制端经隧道读写被控端预算;拿不到权威边界时只提供调小档并明示;被控端上报不支持时整卡只读提示。
  • 只读任务:chip 的只读形态(档位行禁用 + 卡内原因说明、Tab 走廊仍可达)由用例锁定;实机可挂到 chip 的只读视图目前只有远程 worker 面板不可达态,伙伴历史/只读回放视图不渲染底栏(chip 不挂载,见「未执行的验证」)。
  • bounds 共享缓存:TTL 60s + 跨实例失效(提交实例跳过、其它实例重读)+ 取消的查询不写缓存 + 过期重开必拉新。

变更类型

  • feat 新功能

范围

UI 变化

  • 引用的设计规范:docs/design-rules/DESIGN.md §2(颜色一律语义 token:chip 标记与货币 chip 的 ¥ 同 token,档位行选中态走主强调色)、§4(复用标准 Popover 原语,不新造浮层几何)、§5(chip = 按钮 → 胶囊,不新造外层卡片)、§10(Light/Dark 均由 token 覆盖,无单模式补丁)、§11(微文案:menuHint 说明「只影响本任务,下一条消息生效」)。
  • 触发器:↕ + 百分比文本,绝对值进 aria-label;字号/字重与货币 chip 同级。
  • 交互与「用量明细」卡一致:指针悬浮展开(300ms / 宽限 200ms,常量在 lib/statusBarCards.ts),键盘 Enter/Esc 可用且保留 focus 指示;两卡互斥;选中档位后卡片不自动关。

亮/暗色截图(fork pr-assets/feat-session-context-window-ui 孤儿分支,diff 只留代码):

怎么验证的

自动验证

  • tsc --noEmit 通过;chip 53 例全过(含:过期重开拉新、取消查询不写缓存、跨实例失效、>100% 档、远程收紧口径、只读可达、Tab 走廊边缘交还);check:test-hygiene PASS。

手工验证

  • dev 实机:档位保存后 reserveTokens 生效(500K 预算 + 90% 阈值 + 1M 容量 → 550000);点击 chip 不收卡、Tab 能走出卡外、只读任务可达不可改、两卡互斥(第 8 轮用户实测报障的四项交互均已修复并回归用例锁定)。

未执行的验证

  • 只读形态没有实机截图:本次截图时发现伙伴历史/只读回放视图整个底栏不渲染(CCAgentSessionView 的状态条被 botChatIdentity 分支裁掉,chip 不挂载),实机能挂上 chip 且只读的视图只剩「远程 worker 面板不可达」一种,本机没有第二台设备可摆拍。只读行为由「locks the card read-only…」「remote-readonly…」等用例锁定(行禁用 + 原因说明 + Tab 可达)。
  • 价带为分档计费模型才有的多价展示;本次实机模型(z-ai/glm-5.3-flash@xd)只有单一输入价,截图展示的是「每档标注输入价」列本身。分档模型会按档位落点显示不同输入价。
  • 远程任务(device-link)不显示价带:gateway 报价与本地参考价都来自本机配置,被控端使用自己的 provider 连接与价格覆盖,同名模型的价可能不同。拿不到被控端报价时宁可不显示。

风险

风险分类

  • 无已知风险
  • SQLite / migration(无)
  • system prompt
  • 协议兼容(消费 feat(desktop): 任务级上下文窗口档位(内核) #4598 的 channel)
  • 权限 / 安全 / 用户数据
  • 存量插件兼容
  • 原生层 / fingerprint / OTA
  • 跨平台差异
  • 其他:档位变小会提前触发压缩(卡片内有 shrinkWarning 明示)

影响与回滚

renderer 独占(挂载 + i18n),revert 单提交即回滚;无预算任务不渲染档位行为差异。

提交前检查

  • 已读 docs/design-rules/DESIGN.md、docs/design-rules/design-governance.md(本 PR 为非迁移类普通 UI 改动)、docs/product-rules/task-and-conversation-naming.md(文案「任务/对话/消息」口径)。
  • pnpm check:dco 通过。

@zyjisdog
zyjisdog requested a review from a team as a code owner October 24, 2026 01:23
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 24, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ⚠️ Failed 2026-10-24T01:26:46.961879Z
We couldn’t complete this review. Comment @codex review to try again.
71fe9c9 PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@zqchris zqchris 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.

拆得清楚,UI 这层方向没问题,挂载点和 i18n 也干净。先不批,差两件事:

  1. 截图补全:现在两张都是暗色,缺亮色;档位卡那张也没拍到正文说的输入价带和只读形态。请补亮/暗各一套(chip、档位卡含价带、只读任务的卡)。另外正文「未执行的验证」写暗色没实机目检,但截图恰好是暗色,麻烦对一下口径,改成实际没验的那一项。
  2. 等底下两层先合:这条叠在 #4598 和 #7006 上,#4598 我提的四处修改还没收,现在批会把内核一起批进去。等两者合入、本分支 rebase 到 main、diff 只剩最后一个 UI 提交后,我再看一遍,截图齐了就批。

@greptile-apps

greptile-apps Bot commented Oct 24, 2026 •

Copy link
Copy Markdown

RetriggerView in GreptileConfidence Score: 5/5

[Medium impact] 本轮圆角调整未发现需要阻止合并的问题。

Summary

本 PR 新增任务上下文窗口档位卡,支持本地与远程预算读写、边界缓存和五种语言。

  • Task status bars let people choose a context window for each task.

Reviews (6) · Last reviewed commit: "fix(desktop): 档位行高亮圆角改用 8px inner 档(#701..." · Reviewed by Greptile

@MagicLizi

Copy link
Copy Markdown
Contributor

【维护者确认】本 PR 命中维护者确认门(product:feat + 生产 UI 路径;rules:新增 docs/dev-rules/maker-core-and-agent-behavior.md 的规则语义;arch:核心路径 2559 行、整 diff 5345 行),且是新功能而非 bugfix / 机械编辑,无法按既有语义豁免放行。

请维护者直接在本 PR 上 Approve 表示确认;如需修改请 Request Changes 并写明要求。详细说明见对应讨论 issue。

讨论 issue:#7016

@MagicLizi MagicLizi added awaiting-discussion 等待维护者讨论(review-pr) touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示) touches:large-diff 改动量较大(review-pr 自动维护,仅展示) touches:product-ui 改动碰到产品 / UI 面(review-pr 自动维护,仅展示) touches:rules 改动碰到规则 / 规范文档(review-pr 自动维护,仅展示) labels Oct 24, 2026
zyjisdog added a commit to zyjisdog/cindy that referenced this pull request Oct 24, 2026
1. claude-code/index.ts:删掉合 main 时残留的顶格注释
   「上游:sdkEffortForModel 多带 providerId…」。
2. docs/dev-rules/maker-core-and-agent-behavior.md:删掉新段落结尾的残句
   (「本机占用 ≥ 100%…」半句与原句连写两遍),恢复为一句。
3. Pi 切模成功后的 writePiRuntimeSettings 显式带 sessionContextWindowBudget:
   顶层保留量的预算来源不再依赖调用方把它预折叠进 workingContextWindow;
   补「有预算时连切两次模型仍是 hot」回归用例(含切后盘上 modelOverrides
   仍按预算的断言)。
4. PR 正文按第 1/3 部分收口(另在 GitHub 上直接改正文:UI 在 makecindy#7011、
   基建在 makecindy#7006、合入顺序写明)。

验证:pi-native-auto-compact 55 例全过(含新用例);tsc 见 CI。

Signed-off-by: Zhang Yunjin <zhangyunjin@zju.edu.cn>
zyjisdog added a commit to zyjisdog/cindy that referenced this pull request Oct 24, 2026
1. 跨窗口旧预算:提交路径在按缓存判「no-op」时先直查权威值复核 —— 另一窗口
   刚保存/清除过时,本地新鲜缓存仍是旧值,点「模型默认」会被 no-op 吞掉。
   真变更不走这次直查(提交后 refresh 本就会重拉)。
2. 菜单旧上限:hook 订阅 maker.onProvidersChanged,目录/模型级上限变化即失效
   当前路由缓存重查(远程边界来自被控端,不订阅本机事件)。
3. 不支持设备仍可编辑:CHANNEL_NOT_ALLOWED 后记住状态,整卡只读并在卡内
   说明原因;换设备后重置。

顺手修了一个真 bug:queryAuthoritativeBounds 抽出后 effect 里残留的二次
normalize 会把老被控端的 effectiveWindowsReported 从 false 翻成 true
(normalize 非幂等:'键存在' 判定被首遍归一化补出的 null 键污染),档位表
随之放开到 modelLimit —— 「老被控端 tighten-only」用例当场抓住。helper 成为
唯一归一化点。

新增三条用例(no-op 复核直查 / providers 变化失效 / 拒绝后整卡只读);
chip 53 例全过,tsc 过。

Signed-off-by: Zhang Yunjin <zhangyunjin@zju.edu.cn>
@zyjisdog

Copy link
Copy Markdown
Contributor Author

两条都收到:

  1. 截图补全:在做了。当前四张是 chip/档位卡 × 亮/暗,确实还没拍到「含价带」与「只读形态」——我会补成:chip 亮/暗、含价带的档位卡亮/暗、只读任务的卡亮/暗,共六张;正文「未执行的验证」也会按实际验过/没验过的项改口径。
  2. 等底下两层先合:同意,本来就是这么排的——本分支叠在 feat(desktop): 任务级上下文窗口档位(内核) #4598 + feat(desktop): 底栏状态卡基建:focusTraversal、statusBarCards、popover portalContainer #7006 上是拆分时的过渡形态,两者合入后我会 rebase 到新 main,diff 收敛为最后一个 UI 提交,届时再请你过一遍。

另外 Greptile 三条 P2(跨窗口旧预算 / 目录变化旧上限 / 不支持设备仍可编辑)已在 564264e 逐条处置并补了用例(chip 53 例全过),线程里已分别回复。

@zyjisdog

Copy link
Copy Markdown
Contributor Author

截图项的处置结果(1/3 节的回复汇总):

已补:档位卡亮/暗两张已重拍,现在每档都带输入价列(正文「UI 变化」里的两张卡链接已更新,同名替换)。chip 亮/暗两张不变。

只读形态没能实机截图,如实说明:摆拍时发现伙伴历史/只读回放视图(BotHistorySessionView / BotSessionView)走 botIdentity 分支,整个底栏都不渲染——chip 在这些视图里根本不挂载。实机里「挂上 chip 且只读」只剩「远程 worker 面板不可达」一种状态,需要第二台设备才能摆。只读行为(档位行禁用 + 卡内原因说明 + Tab 走廊仍可达)由用例锁定(locks the card read-only after the device rejects the budget channel 等)。正文「未执行的验证」已按此改口径。

顺带抛个产品问题:只读回放里看不到底栏(包括档位卡)是有意的吗?如果只读任务也应该能看到档位与价带(不可改),那需要把状态条从 botChatIdentity 分支里拆出来——超出本 PR 范围,可以另开 issue。

另外 Greptile 三条 P2 已在 564264e 处置并补用例(chip 53 例全过),CI 对该提交全绿。等 #4598 / #7006 合入后我会 rebase 本分支收敛为 UI-only diff 再请你过。

zqchris commented Oct 24, 2026

Copy link
Copy Markdown
Contributor

收到,档位卡带输入价的亮/暗截图可以了。只读形态说明成立:历史/回放视图本来不挂 chip,剩下的远程 worker 不可达状态由用例锁住就够,不用再摆第二台设备。等 #4598 和 #7006 合入、rebase 成只剩 UI 提交后我再过一遍,没问题就批。

@zyjisdog

Copy link
Copy Markdown
Contributor Author

@greptileai review

zyjisdog added a commit to zyjisdog/cindy that referenced this pull request Oct 24, 2026
Signed-off-by: Zhang Yunjin <zhangyunjin@zju.edu.cn>

makecindy#7011 是 makecindy#4598 的后续版本,把预算对账重构为 sessionContextWindowBudgetApplier(变更即应用、锁内重读会话行、按 live 收敛),废弃 pendingSessionContextWindowBudgetReconciles + replayPendingSessionContextWindowBudgetUnderLock。10 个冲突文件里 9 个取 PR 侧,pi/index.ts 取本地(保留 makecindy#4856/makecindy#5044 的思考档位与图片能力对账符号,PR 侧不含)。补两处 makecindy#7011 未覆盖的落地:删掉调用已删除函数的两处重放;fork.test 的 beforeEach mkdtemp 改成 await(原 fire-and-forget 让用例体里 userDataDirRef 仍为空串,预算写入点与读取点不一致,2 条 fork 预算用例随机读回 null)。验证:desktop typecheck、sessionsUpdate 110 + fork 89 + ordering/chip/budget 208 + pi-native-auto-compact 54 全过。
按维护者要求(makecindy#4598 review 2026-10-23)拆出的第 2/3 部分:chip UI,依赖内核
PR(makecindy#4598 拆分后:存储/边界/agent 接入)与底栏基建 PR(focusTraversal/
statusBarCards/popover portalContainer)合入后开放。

- ContextWindowBudgetChip:↕ + 百分比 chip、悬浮档位卡(300/200ms Popover、
  非模态、两卡互斥)、枚举档位(模型默认 + 25%/50%/100% 比例档、200K 地板、
  ≤3 档)、价带展示、只读任务可达不可改、远程收紧口径提示
- 边界权威走 maker:get-context-window-bounds(本地)与 device-link 同名通道
  (远程);百分比分母只认申报上限;bounds 共享缓存 + TTL + 跨实例失效
- CCAgentSessionView 挂载;i18n 五语言(zh-CN/zh-TW/en/ja/ko)
- 亮/暗色截图走 fork pr-assets 孤儿分支(diff 只留代码)

验证(A+C+B 叠层):tsc 通过;chip 50 例全过。

Signed-off-by: Zhang Yunjin <zhangyunjin@zju.edu.cn>
(cherry picked from commit 95999de)
1. 跨窗口旧预算:提交路径在按缓存判「no-op」时先直查权威值复核 —— 另一窗口
   刚保存/清除过时,本地新鲜缓存仍是旧值,点「模型默认」会被 no-op 吞掉。
   真变更不走这次直查(提交后 refresh 本就会重拉)。
2. 菜单旧上限:hook 订阅 maker.onProvidersChanged,目录/模型级上限变化即失效
   当前路由缓存重查(远程边界来自被控端,不订阅本机事件)。
3. 不支持设备仍可编辑:CHANNEL_NOT_ALLOWED 后记住状态,整卡只读并在卡内
   说明原因;换设备后重置。

顺手修了一个真 bug:queryAuthoritativeBounds 抽出后 effect 里残留的二次
normalize 会把老被控端的 effectiveWindowsReported 从 false 翻成 true
(normalize 非幂等:'键存在' 判定被首遍归一化补出的 null 键污染),档位表
随之放开到 modelLimit —— 「老被控端 tighten-only」用例当场抓住。helper 成为
唯一归一化点。

新增三条用例(no-op 复核直查 / providers 变化失效 / 拒绝后整卡只读);
chip 53 例全过,tsc 过。

Signed-off-by: Zhang Yunjin <zhangyunjin@zju.edu.cn>
@zyjisdog
zyjisdog force-pushed the feat/session-context-window-ui branch from 564264e to 8b0f6c5 Compare October 25, 2026 01:21

@zqchris zqchris 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.

rebase 后 diff 只剩 UI 两个提交(chip + 用例、CCAgentSessionView 挂载、五语言 i18n),全在 renderer,内核和底栏基建都已在 main 上。亮/暗截图齐了,只读形态由用例锁定的说明也成立,Greptile 三条 P2 的处置合理。批了,CI 保持全绿就好。

只读回放不渲染底栏那个问题,有需要可以另开 issue 讨论,不挡这条。

@zyjisdog

Copy link
Copy Markdown
Contributor Author

收到,按你说的做完了。

#4598 / #7006 都已合入,本 PR 已 rebase 到最新 upstream/main(784e8c477e),现在只剩两个 UI 提交:

提交 内容
771f9968e0 ContextWindowBudgetChip 组件 + 挂载 + 五语言 key + 53 例测试
8b0f6c56c7 Greptile 三条 P2(跨窗口旧预算直查复核、目录变化重查边界、不支持设备只读)

Diff 收敛为 UI-only:8 文件 +2392 行(chip 组件、组件用例、CCAgentSessionView 挂载点、5 个 locale 的 common.json),内核与基建的改动全部来自已合入的 main,不再出现在本 PR 里。

冲突原因就是上游前进(784e8c477e),已解。验证:chip 53 例全过、tsc --noEmit 干净、check:test-hygiene 与 check:i18n-glossary 通过。GitHub 侧现在是 MERGEABLE(BLOCKED 应该只是 #4601 那个确认门)。

可以过一遍了。截图仍在 PR 正文里(chip 亮/暗、档位卡亮/暗,卡内含每档输入价带;左侧侧边栏已裁掉)。

@zyjisdog

Copy link
Copy Markdown
Contributor Author

@greptileai review

Comment thread apps/desktop/src/renderer/components/status/ContextWindowBudgetChip.tsx Outdated
Comment thread apps/desktop/src/renderer/components/status/ContextWindowBudgetChip.tsx Outdated
@MagicLizi MagicLizi removed awaiting-discussion 等待维护者讨论(review-pr) touches:rules 改动碰到规则 / 规范文档(review-pr 自动维护,仅展示) labels Oct 25, 2026
Greptile 2026-10-25 两条:

P1:组件换设备时不重挂,旧设备的保存请求在切换之后才返回
DEVICE_LINK_CHANNEL_NOT_ALLOWED 时无条件置 remoteUnsupported=true,
把新任务(尤其切过去的本地任务)误锁成只读。用 activeDeviceIdRef 记住当前
设备,catch 里比对后才置位(换设备时同一 effect 已重置状态)。

P2:价带用的两份报价(gateway 服务端报价 + 本地参考价/用户覆盖)都来自本机
配置,被控端用它自己的 provider 连接与价格覆盖,同名模型价可能不同 —— 远程
任务不再显示价带(拿不到被控端报价时宁可不显示),本地任务照旧。

用例:新增「远程隐藏价带、本地照旧」「旧设备迟到拒绝不锁新任务」(rerender
切成本地任务后再 reject)。chip 55 例 + tsc + hygiene 全过;两条都做过反向
验证(改回原实现立即红)。

Signed-off-by: Zhang Yunjin <zhangyunjin@zju.edu.cn>

@zqchris zqchris 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.

新提交看过了:换设备后用 ref 比对再记「不支持」,迟到的旧设备错误不会再锁住新任务;远程任务不显示本机价带也是对的,宁缺勿错。改动小、两条用例都锁住了。继续批,CI 绿就好。

@zyjisdog

Copy link
Copy Markdown
Contributor Author

@greptileai review

@zyjisdog

Copy link
Copy Markdown
Contributor Author

CI 红了一条 ,原因是环境类 flake,不是本 PR:

Error: ENOTEMPTY: directory not empty, rmdir '/tmp/cindy-import-host-test-jq6frS'
src/main/bot-import/__tests__/host.test.ts > keeps the source paused and execution deferred when the ready marker write fails after activation

本地单跑同文件 107 例全绿,且本 PR 的改动(8 文件:chip / 用例 / 挂载点 / 5 个 locale)与该文件零交集——是临时目录清理竞态。重触发一次 CI 确认。

@zyjisdog zyjisdog closed this Oct 25, 2026
@zyjisdog zyjisdog reopened this Oct 25, 2026
@MagicLizi MagicLizi added the status:ci-failed CI 失败(review-pr 自动维护,仅展示) label Oct 25, 2026
@zyjisdog

Copy link
Copy Markdown
Contributor Author

CI 红了一条 Linux unit tests (3/4),是环境类 flake,不是本 PR 的代码:

Error: ENOTEMPTY: directory not empty, rmdir '/tmp/cindy-import-host-test-jq6frS'
src/main/bot-import/__tests__/host.test.ts > keeps the source paused and execution deferred when the ready marker write fails after activation

本地单跑同文件 107 例全绿,且本 PR 的改动(8 文件:chip 组件 / 用例 / 挂载点 / 5 个 locale)与该文件零交集——并行跑时临时目录清理竞态。已关闭重开触发新一次 CI。

@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.

PR #7011 独立代码审查报告(head 721497aa,base 08d1788,tier=standard)

Findings

  • [P1] apps/desktop/src/renderer/components/status/ContextWindowBudgetChip.tsx:749 — TierRow 档位行的 hover / 焦点高亮层使用 rounded-sm(本仓该类解析为 4px:tailwind.config.ts 的 borderRadius.sm = calc(var(--radius) - 4px),默认 --radius=0.5rem),而权威规范要求行高亮走 8px inner 档:docs/design-rules/DESIGN.md §5 Step 2「Inner control (8px) — …plus selected/hover row highlights in dropdowns/menus」、§4 Select & Dropdown「Row highlights use the 8px inner tier」。4px 是「不入档」值:design-decision-log 2026-08-29 裁决 (3)(6) 明确「4px 不入档,存量登记为债,新代码禁止再写」,且禁令覆盖 rounded / rounded-sm 等一切解析后等价于 4px 的写法,并写明「机器拦截随棘轮 PR 落地,此前靠 review 按 §5 执行」。影响:新增档位行在 12px 卡片面板内以 4px 高亮圆角渲染,与全站菜单/列表行 8px 高亮不一致,属明确禁止的新写法;pnpm check:design-colors 也把该行标为 [report/visible-layer-radius] 待分类。建议修复:rounded-sm → rounded-lg(8px,与 components/ui/dropdown-menu.tsx 的 ROW_BASE、menu-row.tsx 的 8px 行高亮一致)。验证方式:改后重跑 pnpm exec vitest run src/renderer/components/status/__tests__/contextWindowBudgetChip.test.tsx、pnpm check:design-colors(该 report 条目应消失)、pnpm --filter desktop run typecheck。

(同文件 559 行触发器的 rounded-full 属 §5 Step 2「control frames: buttons → Pill」,与 TodaySpendChip 触发器同款,不构成问题。)

Rule coverage

  • AGENTS.md / docs/dev-rules/development-workflow.md / .github/PULL_REQUEST_TEMPLATE.md:三大段齐、风险分类与回滚说明如实、验证口径完整(正文写 53 例、实测 55 例,属计数漂移,不构成描述不实)。
  • docs/design-rules/DESIGN.md(UI 强制):§2 颜色全部语义 token(--msg-tool-card-chevron / --text-primary / --text-secondary / --focus-ring / --border-default / --warning-fg / sidebar-item-hover),无硬编码色对;§3 字号 11/12/13 在白名单、字重仅 400/500、行高均为比例写法(无固定 px 行高);§4 复用标准 Popover 原语与 statusBarCards 互斥基建,未自造浮层;§10 颜色均由 token 覆盖、无单模式补丁,附亮/暗截图;§11 微文案遵守「动作带宾语、错误说明失败对象、无成功填充词」。仅 §5 圆角一处不符(见 Findings)。
  • docs/design-rules/design-governance.md §13 + DESIGN.md §5(圆角分类审查):Trigger 层(胶囊档)合规;TierRow 高亮层未按 inner control(8px)定档,落在被禁的 4px 等价写法(见 Findings)。
  • docs/dev-rules/engineering-conventions.md §5(i18n):五语言 key 完全一致(check:i18n 全绿),check:i18n-glossary 无新增违规;文案遵守 task-and-conversation-naming 的「任务/对话/消息」口径(「任务上下文窗口」「只影响本任务」等)。zh-TW readOnlyHint 的「價差」与其余语言「价带 / 価格帯 / 요금 구간」略有语义差,属非阻断观感项,不作 finding。
  • 远程 / 协议边界(remote-and-mobile-adaptation / protocol 口径):maker:set-context-window-budget / maker:get-context-window-bounds 均为 #4598 已合入的既有通道(packages/device-link/src/allowlist.ts:254,258、preload/main 既有 handler),本 PR 未改协议、allowlist、main 侧与持久化 schema;无新增依赖、无网络外发、无凭证或用户数据落盘改动。远程拿不到权威边界时降级为「只允许收紧」并明示,被控端不支持时整卡只读,错误路径有 toast + 日志且回滚简单(revert 单提交)。
  • 测试:新增 55 例覆盖档位推导、缓存 TTL/过期重开、取消不写缓存、跨实例失效、目录变化重查、跨窗口清预算直查、迟到错误不锁新任务、远程不显示价带、只读与 Tab 走廊等关键路径,check:test-hygiene 通过。

Verification

(本 PR 审查 worktree 内实际运行,日志完整落盘并保留命令自身退出码)

  • pnpm install --frozen-lockfile --prefer-offline → EXIT=0
  • pnpm --filter desktop run typecheck → EXIT=0
  • pnpm exec vitest run src/renderer/components/status/__tests__/contextWindowBudgetChip.test.tsx → EXIT=0,55/55 通过
  • pnpm check:test-hygiene → EXIT=0(PASS,361 files within baseline)
  • pnpm check:i18n → EXIT=0(五语言 13581 key 一致)
  • pnpm check:i18n-glossary → EXIT=0(无新增违规)
  • pnpm check:design-colors → EXIT=0,但输出 2 条 [report/visible-layer-radius](559 rounded-full、749 rounded-sm):前者分类为按钮胶囊档合规,后者为本报告 P1
  • pnpm check:design-inventory → EXIT=0
  • 未执行:heavy 档恶意代码/数据外发专项与 security-scan.mjs(本 PR 分档 standard,不适用);实机 UI 渲染与亮/暗实机目检未执行(静态审查 + 作者附的四张亮/暗截图作证据,截图内容与 diff 一致)。

Intent alignment

  • 描述来源:PR 标题与完整描述(#4598 review 拆分的第 2 部分「chip UI」,2026-10-25 读取),关联讨论 issue #7016(已关闭)与维护者 zqchris 的 PR 讨论意见。
  • 原目标:任务底栏「工作上下文窗口档位」chip——档位枚举(模型默认 + 有效上限比例档)、每档输入价带(仅本地任务)、保存即应用到活实例、远程/只读任务降级、bounds 共享缓存;明确不含内核(#4598)与卡片宿主基建(#7006)。
  • 初始实现 SHA:771f9968e0(拆分后首个 UI 提交,基线 08d1788);已实际读取该 revision 代码及其到 head 的累计 diff。
  • 最终行为(head 721497aa):8 个文件 2466 行,全部为 chip 组件 + 测试 + CCAgentSessionView 挂载 + 五语言 i18n;#4598/#7006 内容已随 rebase 收敛为 UI-only,满足讨论中「rebase 成只剩 UI 提交」的要求,维护者 zqchris 于 2026-10-25 两次 Approve 放行确认门。
原目标/初始行为 最终行为与影响 代码/提交证据 变化依据或待确认问题
档位卡 + 价带(仅本地)+ 保存即应用 + 远程/只读降级 + 缓存 全部保留;挂载点自初始实现起未变 771f9968e0 → 721497aa,ContextWindowBudgetChip.tsx / CCAgentSessionView.tsx:6307 一致,无变化
远程任务价带展示 改为远程不显示价带(防误导) head ContextWindowBudgetChip.tsx:408-413(提交 721497aa) 在 PR 描述既定边界「仅本地任务:远程任务的价带隐藏」之内,且经维护者讨论确认,属已获同意的调整
老被控端错误处理 迟到的 DEVICE_LINK_CHANNEL_NOT_ALLOWED 不再锁住换设备后的新任务 head ContextWindowBudgetChip.tsx:113-125,485-492 Greptile P1 缺陷修复,服务于原目标,非扩范围
  • 结论:一致,无原意偏离;核心目标(档位选择、权威边界、降级口径、缓存一致性)均已落实并有用例锁定;无存疑项。

Overall

changes-requested:发现 1 条 P1(档位行高亮圆角使用新代码禁止的 4px 等价写法 rounded-sm,应为 8px inner 档)。除该项外,安全、i18n、测试覆盖、远程边界与原意一致性均通过。

Comment thread apps/desktop/src/renderer/components/status/ContextWindowBudgetChip.tsx Outdated
MagicLizi review P1:TierRow 的 hover/焦点高亮层用了 rounded-sm(解析为 4px),
而行高亮属于 DESIGN.md §5 Step 2 的 inner control 档 = 8px(§4 Select & Dropdown
亦写明「Row highlights use the 8px inner tier」),4px 是 design-decision-log
2026-08-29 裁决明确禁止新代码再写的不入档值。

改为 rounded-lg,与 components/ui/dropdown-menu.tsx 的 ROW_BASE、
components/ui/menu-row.tsx 的 COMPOSER_MENU_ROW 一致。chip 55 例全过。

Signed-off-by: Zhang Yunjin <zhangyunjin@zju.edu.cn>

@zqchris zqchris 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.

看过新提交:档位行高亮从 rounded-sm(4px)改成 rounded-lg(8px),和 dropdown-menu、menu-row 的行高亮对齐,MagicLizi 提的这条圆角问题已经解决,其它没动。继续批,CI 绿就好。

@zyjisdog

Copy link
Copy Markdown
Contributor Author

MagicLizi 的 P1(档位行高亮圆角)已修(6fdf9a73b7),线程内已回复明细。

改动:TierRow 的 rounded-sm(4px,不入档)→ rounded-lg(8px inner 档)。依据是仓库内的三条硬证据:DESIGN.md:540「Row highlights use the 8px inner tier」、components/ui/dropdown-menu.tsx 的 ROW_BASE、components/ui/menu-row.tsx 的 COMPOSER_MENU_ROW。只动行高亮层,卡片面板(12px)与 chip 胶囊不变;注释里写了为什么是 8px,避免后人再抄回 4px。

复核:pnpm check:design-colors 里 [report/visible-layer-radius] rounded-sm 条目已消失;chip 55 例、tsc --noEmit、check:test-hygiene 全过;CI 15/15 全绿。

@MagicLizi 麻烦再扫一眼,谢谢。

zyjisdog added a commit to zyjisdog/cindy that referenced this pull request Oct 25, 2026
该文件是 makecindy#7011 独占的新文件,本地无其他 PR 改动,作者本轮又推进了远程设备状态对账与下拉项圆角;全取 PR 侧。desktop typecheck + chip 55 用例通过。

Signed-off-by: Zhang Yunjin <zhangyunjin@zju.edu.cn>
@zyjisdog

Copy link
Copy Markdown
Contributor Author

@greptileai review

zyjisdog added a commit to zyjisdog/cindy that referenced this pull request Oct 25, 2026
干净线重建第二步。上游已合并 makecindy#4598 内核,本 PR 的 UI 与内核改动与其自动合并成功。

Signed-off-by: Zhang Yunjin <zhangyunjin@zju.edu.cn>
@MagicLizi MagicLizi removed the status:ci-failed CI 失败(review-pr 自动维护,仅展示) label Oct 25, 2026

@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.

PR #7011 独立审查报告(auto · standard 档)

  • PR: #7011 — feat(desktop): 任务级上下文窗口档位 UI:ContextWindowBudgetChip
  • head: 6fdf9a73b7bb97986891e88c8b7ca06996198d85,base: 08d178868cdf2803e7618f18d8f882265492d065(main),diffHash: 12429abd…
  • 审查范围:8 个文件、2469 行(组件 1010、测试 1374、CCAgentSessionView 挂载 20、五语言 i18n 各 13)。

Findings

没有 P0/P1。

(仅 P2 级观察,按规则不报告、不阻断:测试文件里保留了一份已不再被组件引用的
@/components/ui/dropdown-menu mock;PR 描述写「50 例 / 53 例」而当前测试为 55 例,
均为陈旧描述,不影响事实性。)

Rule coverage — 读取的规则文件及逐项结论

  • AGENTS.md(仓库边界、Git 交付、安全底线):改动仅 renderer + i18n,无凭证/密钥、无跨仓、无破坏性操作,符合。
  • .github/PULL_REQUEST_TEMPLATE.md / docs/dev-rules/development-workflow.md(PR 模板事实源、验证真实性、P0/P1/P2 口径):描述三大段(这次改了什么 / 怎么验证的 / 风险)齐全,风险分类勾选「其他:档位变小提前触发压缩」并在卡片内配 shrinkWarning 提示,diff 与描述一致;验证声明可复核(见 Verification)。
  • docs/dev-rules/electron-security-and-process-boundaries.md(Renderer/IPC 边界):renderer 只经 preload 暴露的 maker.getSessionContextWindowBounds / maker.onProvidersChanged / deviceLink.invoke('maker:set-context-window-budget'|'maker:get-context-window-bounds') 读写,通道均已在 apps/desktop/src/main/maker-ipc/channels.ts 与 packages/device-link/src/allowlist.ts 登记(内核 PR #4598 侧落地,本 PR 仅消费);无新增特权面、无 eval/动态脚本、无远程数据外发;渲染层不自行推导窗口,一律消费 main/被控端申报值。
  • docs/dev-rules/engineering-conventions.md(日志 / i18n 落地):五语言 key 全量一致(check:i18n 13581 key 通过);warn 日志只含 sessionId 与错误消息,无敏感信息。
  • i18n/GLOSSARY.md / 术语门(check:i18n-glossary):文案用「任务 / 下一条消息」,符合 task-and-conversation-naming 口径;术语门无新增违规。
  • docs/design-rules/DESIGN.md + cindy-design-system.md(UI 强制):颜色全部走语义 token(--msg-tool-card-chevron、--text-primary/secondary、--focus-ring、--border-default、--warning-fg、bg-sidebar-item-hover、foreground),check:design-colors 0 违规;圆角分档符合 §5:chip 触发器 rounded-full(胶囊)、档位行高亮 rounded-lg 8px inner 档(与 dropdown-menu.ROW_BASE / menu-row.COMPOSER_MENU_ROW 一致,4px 问题已在 head 6fdf9a73 修复);浮层复用标准 Popover 原语 + portalContainer(#7006 基建),未自造浮层几何;行形态沿用既有菜单行几何;微文案 menuHint 明示「只影响本任务、下一条消息生效」。Light/Dark 由 token 覆盖,无单模式硬编码补丁;PR 附亮/暗色 chip 与卡片截图四张(fork pr-assets 孤儿分支,仅代码留 diff)。
  • docs/product-rules/task-and-conversation-naming.md:「任务」= session、「消息」= 单条往来,本 PR 文案一致。
  • docs/dev-rules/remote-and-mobile-adaptation.md(device-link / 远程入口):远程保存走隧道命令而非写本机镜像库;DEVICE_LINK_CHANNEL_NOT_ALLOWED 整卡只读并说明;迟到错误按 activeDeviceIdRef 归属比对,不污染新任务;拿不到权威边界时降级「只允许收紧」且文案如实,不拿本机目录冒充被控端。
  • docs/product-rules/core-product-principles.md:能力归属合理——边界/存储/引擎接入留在内核(#4598),本 PR 只做展示与选择,未重复实现内核能力。

固定问题逐条:① 单一目的(chip UI + 挂载 + i18n),描述/测试/风险一致;② 共享符号(sessionContextWindowBudget、sessionContextWindowBounds、statusBarCards、focusTraversal、modelPriceQuote、useModelContextLimit)均追踪到定义方与调用方,错误路径(查询失败缓存 null、保存失败 toast + 保留旧选中、通道不支持只读)齐备,回滚=revert 单提交;③ 无凭证/用户数据新流向、无权限放宽;④ 未放松安全边界、无新增第三方依赖;⑤ UI/i18n 有实际测试与截图证据;⑥ 未把流程塞进 Core;⑦ UI 证据与 diff 一致、无 DESIGN.md 硬伤;⑧ 不涉及 mobile 原生配置;⑨ 无 P0/P1。

Verification — 实际运行的命令、结果、未执行项及原因

在 PR head 检出的审查 worktree(REVIEW_PR_REPO_ROOT 指向该 worktree)内运行:

命令 退出码 结果
pnpm install --ignore-scripts --prefer-offline 0 安装依赖供本地验证(跳过下载脚本)
pnpm --filter desktop run typecheck(tsc --noEmit) 0 通过(与描述一致)
pnpm --filter desktop exec vitest run src/renderer/components/status/__tests__/contextWindowBudgetChip.test.tsx 0 55 tests passed(描述写 50/53 例,实际 55 例,多出的为后续修复补的用例)
node scripts/check-i18n.mjs 0 zh-CN/zh-TW/en/ja/ko 13581 key 全一致
node scripts/check-i18n-glossary.mjs 0 无新增违规(18 处既存 proposed 术语告警,非本 PR 引入)
node scripts/check-test-hygiene.mjs 0 PASS(361 files within baseline)
node scripts/hardcoded-color-audit.mjs 0 raw=0 / unexpected=0(2 条 report 级 visible-layer-radius 提示,已由 §5 分档核对:胶囊 chip + 8px inner 行)
node scripts/check-dco.mjs 0 4 commits 全部 Signed-off-by

CI:client-ci、pr-design-basis 均 completed/success(双源全绿)。未执行:heavy 档安全扫描(standard 档不跑,security 扫描 0 hard/0 soft 已由前置门给出);未实机渲染截图逐项对照(UI 证据按规则顺带核对,不强制下载渲染)。

Intent alignment

描述来源:当前 PR body(含 #4598 review 2026-10-23 拆分说明,已随修复更新);讨论 issue:#7016。
初始实现:771f9968e0(feat:ContextWindowBudgetChip 与挂载;该分支唯一功能主体提交,前序为已合入 main 的 #4598/#7006 依赖);待合并 head:6fdf9a73(4 个提交:功能主体 + 3 个审查修复)。

原目标/初始行为 最终行为与影响 代码/提交证据 变化依据或待确认问题
任务底栏 chip:档位「模型默认 + 25%/50%/100% 比例档」、每档输入价带、保存即应用 不变,且落点口径经修复更精确(档位表上限按 main 对显式预算的夹紧口径) 771f9968e0 → 8b0f6c56c7(ContextWindowBudgetChip.tsx options 注释与档位上限) Greptile 修复,缺陷修复不改目标
远程任务走被控端边界与隧道命令 不变;新增「通道不支持整卡只读」「迟到错误不锁新任务」「远程隐藏本机价带」三处边界处理 721497aa80、resolved thread PRRT…fH9/fIA 均为已 Resolve 的 bot/维护者意见,边界加固在原目标内
视觉遵循 DESIGN.md(token、8px inner 行高亮) 一致;4px rounded-sm → 8px rounded-lg 6fdf9a73b7(head) MagicLizi [P1] thread 要求,属权威规范修复
讨论 issue #7016 的行动项:先合内核 #4598、rebase 收敛 diff 为 UI-only、吸收 Greptile 三项、维护者复核亮暗色后 Approve 全部落实:#4598 已合入 main(b123c3d3ce),本 PR diff 已收敛为 8 文件纯 UI;Greptile 三项均有用例锁定;zqchris 于 2026-10-25 三次 Approve(最终 03:01:19Z)放行 product/arch 触发 issue #7016 评论、signoff.triggers released=github-approve 无未落实项

结论:一致。核心目标(任务级上下文窗口档位 UI、权威边界消费、保存即应用、远程/只读边界、价带展示)在最终 diff 中完整可见,多轮 bot/维护者修复均为缺陷与规范修复,无功能删减、反转或无关扩范围;无待裁定的核心方向问题。

Overall — pass

没有 P0/P1,原意一致性复核通过,可以进入 guarded Approve + 合并。
备注:机器人静默期按超时放行(copilot-pull-request-reviewer、chatgpt-codex-connector 未在窗口内表态),这两家的意见可能在合并后才到。

@MagicLizi
MagicLizi merged commit cf789a5 into makecindy:main Oct 25, 2026
16 checks passed
@zyjisdog
zyjisdog deleted the feat/session-context-window-ui branch October 25, 2026 06:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示) touches:large-diff 改动量较大(review-pr 自动维护,仅展示) touches:product-ui 改动碰到产品 / UI 面(review-pr 自动维护,仅展示)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants