Skip to content

feat(web-shell): show context usage as a mini progress pill in the status bar - #8794

Merged
wenshao merged 9 commits into
mainfrom
feat/web-shell-context-usage-pill
Aug 10, 2026
Merged

wenshao merged 9 commits into
mainfrom
feat/web-shell-context-usage-pill

Conversation

@wenshao

@wenshao wenshao commented Aug 9, 2026

Copy link
Copy Markdown
Collaborator

What this PR does

Adds an always-on context-window indicator to the Web UI composer: a compact circular progress ring in the toolbar's right cluster, immediately left of the voice actions and the send button. The ring's arc fills with occupancy and follows the same thresholds as the /context panel (accent up to 60%, warning above 60%, error above 80%), with the arc visually capped at 100% while the accessible label keeps reporting real overflow. Hovering shows the full detail in a tooltip (e.g. 53.6k / 1.0M tokens (5.4%)), clicking opens the /context breakdown, and the full "X% context used" wording stays on the accessible name so the value is never conveyed by color alone. The indicator ships as a new contextUsage entry in the composer toolbar's public action list, so embedders can hide it the same way as other toolbar actions; it stays hidden while usage is zero or the context window is unknown, and it follows the toolbar's existing mobile-voice hiding behavior. No new i18n keys.

A related transcript glitch — the per-round usage_update frame having no normalizer handler and leaking into the assistant turn as a raw-JSON debug bullet (visible in the Before screenshot) — was originally fixed in this PR and has since landed on main independently via #8790; after merging main, this branch carries no SDK delta and the toolbar ring remains the sole surface for context occupancy.

Why it's needed

Context occupancy is invisible in the stock Web UI until the user types /context, so long sessions drift toward auto-compaction with no warning. A glanceable indicator inside the composer toolbar — the same area as the other input-related live controls — lets users see how full the context window is while a turn is streaming, and the threshold colors give an early nudge before hitting the limit. The data was already flowing (usage arrives with every model round); only the presentation was missing.

Reviewer Test Plan

How to verify

  1. Start qwen serve and open the Web UI, then send any prompt. After the first model round completes, a small progress ring appears in the composer toolbar right cluster, left of the voice/send buttons. Before this PR, nothing appears there and /context is the only way to see occupancy.
  2. Hover the ring: a tooltip shows the full detail in the form used / total tokens (pct%). Click it — the /context panel opens and its "Used ... (X%)" line agrees with the ring.
  3. Threshold colors: with a model whose effective window puts usage above 60% or 80% (easiest via a contextWindowSize override in the model's generationConfig settings), the arc turns warning orange above 60% and error red above 80%; above 100% the arc closes fully while the accessible label keeps the real percentage.
  4. Embedder control: passing a composerToolbarActions list without contextUsage hides the ring; with usage 0 or an unknown context window it never renders.
  5. Transcript regression (now covered on main by fix(sdk): hide ACP usage updates from transcripts #8790): the assistant turn must not contain a raw usage_update: { ... } bullet after the reply — the Before screenshot shows the pre-fix(sdk): hide ACP usage updates from transcripts #8790 behavior.

Evidence (Before & After)

Real stack: qwen serve built from this branch (and from main for Before) + real model (deepseek-v4-flash) + headless Chromium, one real prompt per screenshot; percentages are live values from usage_update after the round.

Before (main) — no context indicator anywhere in the default layout, and the raw usage_update debug bullet leaks into the assistant turn:

Before: composer with no context indicator

After — ring in the toolbar with hover tooltip (34.3%, accent):

After: toolbar ring at 34.3% with tooltip 34.3k / 100.0k tokens (34.3%)

After — above 60% (68.6%, warning):

After: ring at 68.6% in warning orange

After — above 80% (91.5%, error):

After: ring at 91.5% in error red

After — dark theme (all colors come from the existing semantic tokens, so the ring adapts with no theme-specific code):

After, dark theme: ring at 91.5% in error red

After — click-through to /context (ring at 34.3% agrees with the panel's Used 34.3k/100.0k = 34.3%, and the assistant turn is clean — no debug bullet):

After: /context panel matching the ring percentage

The shared tooltip's arrow is now positioned by Radix (review round 2), so it keeps pointing at the ring even when collision avoidance shifts the content at the right viewport edge — measured tip-to-ring-center misalignment 0px with the content center shifted ~15px left. Measured live values during the runs: arc stroke rgb(0,51,255) (accent) at 34.3%, rgb(154,106,0) (warning) at 68.6%, rgb(192,54,44) (error) at 91.5% in light theme and rgb(252,129,129) in dark; tooltip text 34.3k / 100.0k tokens (34.3%) / 34.3k / 50.0k tokens (68.6%) / 34.3k / 37.5k tokens (91.5%).

Unit evidence: 8 new tests — ring position before the voice actions, composerToolbarActions show/hide, hidden at zero/unknown usage, click-through to /context, tooltip detail on focus, threshold classes, >100% cap with real overflow on the label, and the tooltip formatter — the usage_update transcript-drop test now lives on main (#8790). Full web-shell suite (173 files / 2984 tests after merging main), webui (454), and sdk-typescript suites pass; typecheck, eslint, prettier clean.

Tested on

OS Status
🍏 macOS
🪟 Windows ⚠️
🐧 Linux ⚠️

Environment (optional)

macOS, qwen serve from the branch build (Web UI served from its own dist), real Anthropic-protocol model endpoint, headless Chromium via Playwright, isolated QWEN_HOME.

Risk & Scope

  • Main risk or tradeoff: one more item in the composer toolbar's right cluster — mitigated by the contextUsage toolbar action (embedders can hide it) and by not rendering until real usage arrives; the percentage source (tokenCount / contextWindow) is unchanged, so models without a known context window never show the ring.
  • Not validated / out of scope: split-pane composers don't wire usage data yet, so the ring stays hidden there; mobile narrow-width behavior follows the toolbar's existing hiding rules.
  • Breaking changes / migration notes: none; composerToolbarActions is additive (contextUsage joins the default list), and embedders passing an explicit list keep their current set — they opt in by adding contextUsage.

Linked Issues

None.

中文说明

本 PR 做了什么

为 Web UI 输入框增加常驻的上下文窗口指示:composer 工具栏右侧、语音操作与发送按钮左边的紧凑圆形进度环。环形弧线按占用比例填充,阈值与 /context 面板一致(60% 以下主题色、60% 以上警告色、80% 以上错误色);超过 100% 时弧线视觉封顶,但无障碍标签继续如实报告溢出。悬停显示完整详情 tooltip(如 53.6k / 1.0M tokens (5.4%)),点击打开 /context 明细,完整的"X% context used"措辞保留在无障碍名称上,数值不单靠颜色或环形传达。指示以新的 contextUsage 项加入 composer 工具栏公开 action 列表,embedder 可以像其他工具栏项一样隐藏它;usage 为 0 或上下文窗口未知时不渲染,并沿用工具栏现有的 mobile voice 隐藏策略。没有新增 i18n key。

相关的转录缺陷——每轮 usage_update 帧在归一化器中无对应分支、以原始 JSON 调试行泄漏进助手回复(见 Before 截图)——最初由本 PR 修复,期间已经由 #8790 独立落到 main;合并 main 后本分支不再携带 SDK 改动,上下文占用统一由工具栏圆环呈现。

为什么需要

默认 Web UI 中上下文占用完全不可见,只能手动输入 /context 查看,长会话会在毫无预警的情况下滑向自动压缩。把指示放进 composer 工具栏——与其他输入相关的实时状态和操作同区——让用户在对话流式进行时一眼看到窗口占用,阈值配色在逼近上限前给出提醒。数据链路本来就有(每轮模型调用都会带 usage),缺的只是呈现。

审阅者测试计划

如何验证

  1. 启动 qwen serve 打开 Web UI,发送任意提示。首轮模型调用结束后,composer 工具栏右侧、语音/发送按钮左边出现小进度环。本 PR 之前该位置没有任何显示,/context 是唯一入口。
  2. 悬停圆环:tooltip 以 used / total tokens (pct%) 形式显示完整详情。点击后打开 /context 面板,其 "Used ...(X%)" 应与圆环一致。
  3. 阈值配色:让有效窗口使占用超过 60% 或 80%(最简单的方式是在模型的 generationConfig 设置里覆盖 contextWindowSize),超过 60% 弧线变警告橙色,超过 80% 变错误红色;超过 100% 弧线闭合但无障碍标签保留真实百分比。
  4. embedder 控制:传入不含 contextUsagecomposerToolbarActions 列表可隐藏圆环;usage 为 0 或窗口未知时不渲染。
  5. 转录回归(现由 main 上的 fix(sdk): hide ACP usage updates from transcripts #8790 覆盖):助手回复后不得再出现 usage_update: { ... } 原始 JSON 行——Before 截图即 fix(sdk): hide ACP usage updates from transcripts #8790 之前的表现。

证据(Before & After)

真实栈:本分支构建的 qwen serve(Before 用 main 构建)+ 真实模型(deepseek-v4-flash)+ 无头 Chromium,每张截图对应一次真实对话;百分比为该轮 usage_update 的实时值。截图见上方英文部分:Before 无任何指示且转录泄漏调试行;After 依次为工具栏圆环 34.3% 蓝(含悬停 tooltip)、68.6% 橙、91.5% 红、深色主题 91.5% 红(配色全部来自既有语义 token,无主题特判代码),以及点击圆环打开的 /context 面板(数字一致、转录干净)。运行中实测:弧线颜色浅色主题下依次为 rgb(0,51,255) / rgb(154,106,0) / rgb(192,54,44),深色主题错误态为 rgb(252,129,129);tooltip 文本依次为 34.3k / 100.0k tokens (34.3%)34.3k / 50.0k tokens (68.6%)34.3k / 37.5k tokens (91.5%)。第二轮 review 后共享 tooltip 的箭头改由 Radix 定位:右侧视口边缘 content 被碰撞回避左移约 15px 时,实测箭头尖端与圆环中心偏差 0px。

单测证据:新增 8 个用例——圆环位于语音操作之前、composerToolbarActions 显隐、0/未知 usage 不渲染、点击直达 /context、聚焦展示 tooltip 详情、阈值类名、超 100% 封顶且标签保留真实溢出、tooltip 格式化函数——转录丢弃 usage_update 的用例现随 #8790main 上。web-shell 全量(合并 main 后 173 文件 / 2984 用例)、webui(454)、sdk-typescript 套件全部通过;typecheck、eslint、prettier 干净。

已测试平台

macOS ✅;Windows / Linux 依赖 CI ⚠️

环境

macOS,分支构建的 qwen serve(Web UI 由其自带 dist 提供)、真实 Anthropic 协议模型端点、Playwright 无头 Chromium、隔离 QWEN_HOME

风险与范围

  • 主要风险/权衡:composer 工具栏右侧多一个元素——通过 contextUsage 工具栏 action(embedder 可隐藏)和"真实 usage 到达前不渲染"缓解;百分比数据源(tokenCount / contextWindow)未变,窗口未知的模型不会显示圆环。
  • 未验证/超出范围:分屏 pane 的 composer 尚未接入 usage 数据,圆环在那里保持隐藏;窄屏行为沿用工具栏现有隐藏规则。
  • 破坏性变更/迁移说明:无;composerToolbarActions 为增量变化(contextUsage 加入默认列表),显式传入列表的 embedder 保持现状,按需自行加入 contextUsage

关联 Issue

无。

@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 9, 2026

Copy link
Copy Markdown
Collaborator

Qwen Triage finishedview run. See the stage comments in this thread for the result.

Qwen Triage 已完成 —— 查看运行。结果见本线程中的各阶段评论。

@qwen-code-ci-bot qwen-code-ci-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Thanks for the PR, @wenshao!

The description doesn't follow the PR template — all of the required sections are missing:

  • ## What this PR does
  • ## Why it's needed
  • ## Reviewer Test Plan — with ### How to verify, ### Evidence (Before & After), and ### Tested on
  • ## Risk & Scope
  • ## Linked Issues
  • a Chinese translation inside <details><summary>中文说明</summary>

Could you update the PR body to fill in the template? The summary and test plan content you already wrote maps cleanly onto it. One section matters especially here: Evidence (Before & After). This is a user-visible status bar change, and the screenshots section currently says real-stack verification is still in progress — before/after screenshots (or a short recording) of the pill, ideally including the warning/error color states above 60% / 80%, would make this much easier to review.

中文说明

感谢提交 PR,@wenshao

PR 描述没有使用 PR 模板,所有必填章节都缺失:

  • ## What this PR does
  • ## Why it's needed
  • ## Reviewer Test Plan——包含 ### How to verify### Evidence (Before & After)### Tested on
  • ## Risk & Scope
  • ## Linked Issues
  • <details><summary>中文说明</summary> 中的中文翻译

请更新 PR 描述,填写模板。你已经写好的 summary 和 test plan 内容可以直接对应填进去。其中 Evidence (Before & After) 部分尤其重要:这是用户可见的状态栏改动,而 Screenshots 部分目前写着真实环境验证仍在进行中——补上 before/after 截图(或短视频),最好包含 60% / 80% 以上时的 warning/error 颜色状态,会让 review 容易得多。

Qwen Code · qwen3.8-max

@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 9, 2026

Copy link
Copy Markdown
Collaborator

🖼️ web-shell visual preview

Rendered against a mock daemon (no real backend): the PR base vs this PR head 68dd352. Only screenshots that changed are shown (flows below, if any, are head-only) — refreshes on every push.

Screenshots · before / after

ℹ️ No screenshot changed against the PR base — but this PR edits 7 render-shaping files:

  • packages/web-shell/client/App.tsx
  • packages/web-shell/client/components/ChatEditor.module.css
  • packages/web-shell/client/components/ChatEditor.tsx
  • packages/web-shell/client/components/MessageList.tsx
  • packages/web-shell/client/components/messages/ContextUsageMessage.tsx
  • packages/web-shell/client/components/messages/TasksStatusMessage.tsx
  • packages/web-shell/client/components/ui/tooltip.tsx

Either the change has no visual effect (logic, plumbing, a state the scenarios never reach), or no scenario renders this UI — in which case the preview cannot see it, and an empty result is a coverage gap rather than a clean bill of health. To make it visible, add a scenario to packages/web-shell/client/e2e/visuals/screenshots.spec.ts that seeds whatever state the UI is gated on; it then appears here as a head-only (NEW) capture.

Full-resolution recordings (.webm) are attached to the workflow run.

Qwen Code · web-shell visuals

@github-actions

github-actions Bot commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 83.82% 83.82% 89.75% 83.02%
Core 87.85% 87.85% 89.39% 86.35%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   83.82 |    83.02 |   89.75 |   83.82 |                   
 src               |   84.97 |    81.29 |   88.49 |   84.97 |                   
  cli.ts           |   95.68 |    84.11 |     100 |   95.68 | ...60-561,565-566 
  gemini.tsx       |    72.8 |    77.39 |   80.76 |    72.8 | ...1299-1303,1424 
  ...ractiveCli.ts |   86.74 |    81.15 |   88.13 |   86.74 | ...2955,2961,3026 
  ...liCommands.ts |   89.33 |     85.6 |      90 |   89.33 | ...01,518,552,674 
  ...ActiveAuth.ts |     100 |     87.5 |     100 |     100 | 66-80             
 ...cp-integration |   71.19 |    73.65 |   90.84 |   71.19 |                   
  acpAgent.ts      |   70.59 |    73.45 |   90.37 |   70.59 | ...29,12234-12236 
  ...k-reporter.ts |     100 |    80.95 |     100 |     100 | 77,80,115,135     
  authMethods.ts   |      92 |       60 |     100 |      92 | 33-34             
  errorCodes.ts    |     100 |      100 |     100 |     100 |                   
  ...ion-skills.ts |     100 |    88.23 |     100 |     100 | 17,32             
  generation.ts    |    97.1 |    81.25 |     100 |    97.1 | 109,112           
  ...DirContext.ts |     100 |      100 |     100 |     100 |                   
 ...ration/service |   97.04 |    95.71 |   93.33 |   97.04 |                   
  filesystem.ts    |   97.04 |    95.71 |   93.33 |   97.04 | ...21-122,242-243 
 ...ration/session |   91.49 |    86.98 |   96.71 |   91.49 |                   
  Session.ts       |   90.51 |    85.18 |   95.94 |   90.51 | ...90,10717-10721 
  ...entTracker.ts |    96.8 |    89.36 |      90 |    96.8 | 137-143,221       
  ...projection.ts |   98.57 |    93.29 |     100 |   98.57 | ...76,333,344,356 
  ...stop-guard.ts |     100 |    98.07 |     100 |     100 | 37,127            
  ...eplay-page.ts |   93.44 |    91.74 |     100 |   93.44 | 74,85-88,115-125  
  ...y-replayer.ts |   98.54 |    95.65 |     100 |   98.54 | 241-243           
  index.ts         |       0 |        0 |       0 |       0 | 1-40              
  ...ssionUtils.ts |   89.76 |    87.32 |     100 |   89.76 | ...54-270,326-328 
  ...lure-guard.ts |   98.32 |    97.75 |     100 |   98.32 | 294-295,340-341   
  tasksSnapshot.ts |    94.3 |     87.5 |     100 |    94.3 | 65-71             
  ...on-tracker.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...ssion/emitters |   96.01 |    94.15 |   96.66 |   96.01 |                   
  ...ageEmitter.ts |   95.95 |       96 |     100 |   95.95 | 52-59             
  PlanEmitter.ts   |     100 |       90 |     100 |     100 | 66                
  base-emitter.ts  |   78.26 |       75 |     100 |   78.26 | 23-24,26-28       
  index.ts         |       0 |        0 |       0 |       0 | 1-10              
  ...ll-emitter.ts |   99.18 |    96.47 |     100 |   99.18 | 355-356           
 ...ession/rewrite |    91.8 |    89.13 |   94.44 |    91.8 |                   
  LlmRewriter.ts   |    82.4 |     86.2 |     100 |    82.4 | ...,88-89,166-170 
  ...Middleware.ts |   96.96 |    88.09 |     100 |   96.96 | 144,152-154       
  TurnBuffer.ts    |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 src/agent-view    |   89.03 |    81.31 |   89.09 |   89.03 |                   
  ...t-cli-argv.ts |     100 |      100 |     100 |     100 |                   
  protocol.ts      |     100 |      100 |     100 |     100 |                   
  ...sor-client.ts |   80.38 |       72 |   76.66 |   80.38 | ...22-626,652-656 
  ...or-process.ts |   96.61 |    89.47 |   84.61 |   96.61 | 129-130,150-151   
  ...sor-runner.ts |    84.9 |     75.6 |      85 |    84.9 | ...44,468,471-481 
  ...sor-server.ts |   85.71 |    83.06 |   95.45 |   85.71 | ...67-468,471-488 
  ...isor-store.ts |   97.73 |    81.16 |     100 |   97.73 | ...92,594,607,643 
  ...nal-bridge.ts |   93.98 |     91.3 |   83.33 |   93.98 | 228-238           
 src/commands      |   90.81 |    79.71 |   66.66 |   90.81 |                   
  auth.ts          |     100 |    83.33 |     100 |     100 | 11,14             
  channel.ts       |   55.55 |      100 |       0 |   55.55 | 18-22,30-40       
  extensions.tsx   |   96.77 |      100 |      50 |   96.77 | 39                
  hooks.tsx        |   66.66 |      100 |       0 |   66.66 | 20-24             
  mcp.ts           |   95.45 |      100 |      50 |   95.45 | 31                
  review.ts        |   98.66 |      100 |      50 |   98.66 | 86                
  serve.ts         |   89.84 |    77.45 |     100 |   89.84 | ...50,853-856,868 
  sessions.ts      |     100 |      100 |      50 |     100 |                   
  update.ts        |   98.13 |    94.44 |   66.66 |   98.13 | 82-83             
 ...mmands/channel |   88.91 |     88.5 |   90.54 |   88.91 |                   
  channel-cwd.ts   |     100 |      100 |     100 |     100 |                   
  ...l-registry.ts |   95.21 |    96.73 |   88.88 |   95.21 | ...18-221,266-269 
  ...entry-path.ts |      75 |       50 |     100 |      75 | 8-9               
  config-utils.ts  |   95.87 |    96.35 |     100 |   95.87 | ...08-213,271-274 
  configure.ts     |    14.7 |      100 |       0 |    14.7 | 18-21,23-84       
  daemon-worker.ts |   93.96 |    85.44 |   94.23 |   93.96 | ...1229,1236-1237 
  loop-runtime.ts  |   91.66 |      100 |      50 |   91.66 | 15,22             
  ...classifier.ts |   98.49 |    96.51 |     100 |   98.49 | 115-116,161       
  ...tact-store.ts |   93.51 |    87.65 |     100 |   93.51 | ...71,288-289,337 
  pairing.ts       |      75 |      100 |      50 |      75 | 22-28,59-70       
  pidfile.ts       |   95.55 |       90 |     100 |   95.55 | ...50-251,315-316 
  proxy.ts         |     100 |      100 |     100 |     100 |                   
  reload.ts        |    77.5 |    86.95 |      75 |    77.5 | 72-84,93-97       
  runtime.ts       |   82.43 |    86.44 |     100 |   82.43 | ...87-191,251-253 
  set.ts           |   75.72 |    85.71 |      50 |   75.72 | 65-83,111-116     
  start.ts         |    85.8 |    82.17 |      88 |    85.8 | ...85,591-594,606 
  ...ure-format.ts |   93.65 |    82.45 |     100 |   93.65 | ...42,48-49,74-75 
  status.ts        |   78.57 |    59.25 |   66.66 |   78.57 | ...36-137,150-161 
  stop.ts          |   57.83 |    82.35 |      50 |   57.83 | ...3,74-76,85-111 
 ...nds/extensions |   88.82 |    87.64 |   87.09 |   88.82 |                   
  consent.ts       |   72.53 |       90 |   42.85 |   72.53 | ...86-142,157-163 
  disable.ts       |     100 |       90 |     100 |     100 | 30                
  enable.ts        |     100 |    91.66 |     100 |     100 | 38                
  install.ts       |   82.95 |    81.57 |      75 |   82.95 | ...96-199,202-211 
  link.ts          |     100 |      100 |     100 |     100 |                   
  list.ts          |     100 |     87.5 |     100 |     100 | 18                
  new.ts           |     100 |      100 |     100 |     100 |                   
  settings.ts      |   99.15 |      100 |   83.33 |   99.15 | 151               
  sources.ts       |   93.42 |    87.09 |   92.85 |   93.42 | ...4-66,96-98,167 
  uninstall.ts     |   74.57 |       40 |   66.66 |   74.57 | 45-47,60-67,70-73 
  update.ts        |   96.71 |    97.05 |     100 |   96.71 | 114-118           
  utils.ts         |      75 |    53.84 |     100 |      75 | ...27-131,133-137 
 ...les/mcp-server |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-60              
 ...amples/starter |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-64              
 src/commands/mcp  |   90.31 |    84.61 |   83.33 |   90.31 |                   
  add.ts           |    99.3 |    96.07 |     100 |    99.3 | 154-155           
  approve.ts       |   76.19 |     87.5 |   66.66 |   76.19 | ...,89-99,114-124 
  list.ts          |   93.15 |    84.84 |      80 |   93.15 | ...78-180,198-199 
  reconnect.ts     |   78.85 |    66.66 |   85.71 |   78.85 | 42-55,169-191     
  remove.ts        |     100 |       80 |     100 |     100 | 21-25             
 ...ommands/review |   87.49 |    87.89 |   88.33 |   87.49 |                   
  agent-prompt.ts  |   93.45 |    91.63 |   97.22 |   93.45 | ...2399,2513-2593 
  base-tree.ts     |   76.16 |    80.76 |   77.77 |   76.16 | ...50-371,373-386 
  capture-local.ts |   68.57 |     90.9 |      75 |   68.57 | 107-111,158-189   
  ...k-coverage.ts |   50.71 |       35 |   66.66 |   50.71 | ...40-245,279-289 
  cleanup.ts       |   89.12 |    82.22 |   83.33 |   89.12 | ...99-504,506-507 
  ...ent-status.ts |   93.03 |    83.87 |   83.33 |   93.03 | 291,531-551       
  ...ose-review.ts |   96.33 |    91.85 |      96 |   96.33 | ...1916,1944-1966 
  cost-ledger.ts   |   94.67 |    95.86 |   78.57 |   94.67 | ...04-505,545-555 
  drive.ts         |   76.07 |    85.71 |   81.81 |   76.07 | ...90-492,497-499 
  extract-step.ts  |   91.36 |    90.62 |   88.88 |   91.36 | ...90-707,714-729 
  fetch-pr.ts      |    76.7 |    68.75 |   63.63 |    76.7 | ...95,417,450-455 
  findings.ts      |   89.35 |    89.13 |   95.45 |   89.35 | ...15-918,927-928 
  load-rules.ts    |   26.41 |      100 |   16.66 |   26.41 | ...41-153,155-156 
  match-remote.ts  |   85.54 |     92.3 |   66.66 |   85.54 | 67-72,131-136     
  mock-provider.ts |   95.44 |    90.25 |   89.47 |   95.44 | 145,690-709       
  parse-args.ts    |   99.66 |    96.55 |     100 |   99.66 | 404               
  plan-diff.ts     |   64.04 |      100 |   66.66 |   64.04 | 127-163           
  pr-context.ts    |   81.77 |    80.86 |   92.85 |   81.77 | ...1043,1072-1074 
  presubmit.ts     |   83.75 |    92.72 |   88.88 |   83.75 | ...77-578,655-685 
  ...ish-assets.ts |   77.18 |    82.14 |   71.42 |   77.18 | ...85-531,533-544 
  repo-context.ts  |   94.92 |    90.82 |     100 |   94.92 | ...67-368,376-377 
  ...ve-anchors.ts |   77.77 |    88.88 |      75 |   77.77 | ...77-182,194-211 
  run.ts           |   82.16 |    87.12 |   91.66 |   82.16 | ...52,468-516,529 
  save-artifact.ts |    89.9 |    81.81 |   94.11 |    89.9 | ...08-311,404-407 
  script-lint.ts   |   83.67 |    78.41 |   88.88 |   83.67 | ...59-773,775-797 
  submit.ts        |    84.1 |     84.7 |    90.9 |    84.1 | ...66,555,582-618 
  test-delta.ts    |   87.13 |    91.46 |      75 |   87.13 | 206-237,477-485   
  test-efficacy.ts |   88.04 |    84.12 |   95.45 |   88.04 | ...2602,2610-2630 
  test-plan.ts     |   91.44 |    91.39 |   89.47 |   91.44 | ...38-839,903-920 
 ...w/__fixtures__ |     100 |      100 |     100 |     100 |                   
  ...r-default.mjs |     100 |      100 |     100 |     100 |                   
  ...der-empty.mjs |     100 |      100 |     100 |     100 |                   
  ...der-named.mjs |     100 |      100 |     100 |     100 |                   
 ...nds/review/lib |   96.95 |    94.77 |   97.68 |   96.95 |                   
  agent-briefs.ts  |   98.96 |      100 |      50 |   98.96 | 719-720           
  anchors.ts       |     100 |    94.79 |     100 |     100 | ...33,169,178,225 
  assets.ts        |     100 |      100 |     100 |     100 |                   
  authorization.ts |    92.4 |    92.59 |     100 |    92.4 | 127-133           
  budget.ts        |     100 |    96.29 |     100 |     100 | 370,401           
  coverage.ts      |   94.48 |    94.57 |      96 |   94.48 | ...72-489,526-537 
  deadline.ts      |   97.68 |    91.22 |     100 |   97.68 | 140-141,190,352   
  diff-flags.ts    |     100 |        0 |     100 |     100 | 63                
  diff-plan.ts     |   98.73 |    93.01 |     100 |   98.73 | ...41,264,290-291 
  effort.ts        |     100 |      100 |     100 |     100 |                   
  gh.ts            |   86.42 |    91.83 |      75 |   86.42 | ...52,289-290,317 
  git.ts           |   97.64 |    95.65 |     100 |   97.64 | 180-181           
  heavy.ts         |     100 |      100 |     100 |     100 |                   
  inline-counts.ts |     100 |      100 |     100 |     100 |                   
  ledger.ts        |     100 |      100 |     100 |     100 |                   
  local-diff.ts    |    84.4 |    88.46 |     100 |    84.4 | ...63-473,475-483 
  ...ry-context.ts |   96.19 |    94.93 |     100 |   96.19 | ...90-491,496-499 
  merge-base.ts    |     100 |      100 |     100 |     100 |                   
  path-rules.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |     100 |     87.5 |     100 |     100 | 92                
  prompt-record.ts |   97.88 |    93.87 |     100 |   97.88 | 260-261,267       
  receipt.ts       |     100 |      100 |     100 |     100 |                   
  remote-match.ts  |   97.26 |    91.42 |     100 |   97.26 | 49-50             
  report.ts        |   94.68 |    93.75 |     100 |   94.68 | 189-193           
  ...ry-context.ts |     100 |    98.66 |     100 |     100 | 184               
  retirement.ts    |     100 |     92.3 |     100 |     100 | ...37,317-318,457 
  review-footer.ts |     100 |      100 |     100 |     100 |                   
  roster.ts        |     100 |    95.71 |     100 |     100 | 145,163,208       
  shell-quote.ts   |     100 |      100 |     100 |     100 |                   
  stale-bundle.ts  |   98.11 |    94.04 |     100 |   98.11 | 416,457,497-498   
  test-utils.ts    |     100 |      100 |     100 |     100 |                   
  transcripts.ts   |   96.59 |    94.56 |     100 |   96.59 | ...08,297-298,323 
  ...pace-scope.ts |     100 |    96.96 |     100 |     100 | 172               
  workspaces.ts    |     100 |     95.9 |     100 |     100 | ...27,452,499,512 
  worktree.ts      |     100 |      100 |     100 |     100 |                   
 ...mands/sessions |   91.56 |    86.95 |   83.33 |   91.56 |                   
  common.ts        |     100 |      100 |     100 |     100 |                   
  list.ts          |   90.96 |    86.66 |   81.81 |   90.96 | 208-219,221-222   
 src/config        |   94.84 |    89.73 |   96.22 |   94.84 |                   
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   89.35 |    83.56 |     100 |   89.35 | ...97-298,314-315 
  ...eMcpImport.ts |   87.91 |    81.52 |     100 |   87.91 | ...63-371,453-454 
  compile-cache.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   88.93 |    88.59 |   83.33 |   88.93 | ...2451,2453-2461 
  ...cy-monitor.ts |   88.75 |    76.19 |     100 |   88.75 | ...3,90-92,98,101 
  ...ust-policy.ts |   83.02 |    88.88 |     100 |   83.02 | ...02-209,232-240 
  ...heme-names.ts |     100 |      100 |     100 |     100 |                   
  environment.ts   |   96.42 |    93.22 |      95 |   96.42 | ...69-570,624-625 
  ...le-watcher.ts |   90.86 |    83.65 |   95.83 |   90.86 | ...23-325,370,418 
  ...resh-state.ts |   90.57 |    97.29 |   93.75 |   90.57 | 137-142,146-152   
  ...ime-reload.ts |     100 |    69.69 |     100 |     100 | ...12-113,122-123 
  hot-reload.ts    |     100 |    89.13 |     100 |     100 | 47,172-178,238    
  keyBindings.ts   |   97.43 |       50 |     100 |   97.43 | 236-239           
  ...ngsAdapter.ts |     100 |    94.11 |     100 |     100 | 64                
  ...ig-watcher.ts |   95.17 |    83.05 |     100 |   95.17 | ...78,200,292-293 
  ...er-secrets.ts |   98.97 |    96.87 |     100 |   98.97 | 85                
  mcpApprovals.ts  |   96.55 |    95.55 |     100 |   96.55 | 223-224,229-231   
  mcpJson.ts       |     100 |      100 |     100 |     100 |                   
  mcpServers.ts    |   92.85 |     87.5 |     100 |   92.85 | 46-47             
  ...idersScope.ts |      95 |    94.73 |     100 |      95 | 11-12             
  ...abledTools.ts |     100 |      100 |     100 |     100 |                   
  ...comparison.ts |     100 |      100 |     100 |     100 |                   
  ...n-settings.ts |   99.15 |    93.75 |     100 |   99.15 | 63                
  sandboxConfig.ts |   93.33 |    93.33 |     100 |   93.33 | ...42-147,216-217 
  session-id.ts    |     100 |      100 |     100 |     100 |                   
  ...ings-cache.ts |   96.52 |    93.93 |     100 |   96.52 | 90-91,201-202     
  settings.ts      |   91.27 |    92.64 |      90 |   91.27 | ...1030,1032-1033 
  ...ingsSchema.ts |     100 |      100 |     100 |     100 |                   
  ...ngsWatcher.ts |   95.54 |    88.34 |     100 |   95.54 | ...28,277-278,293 
  ...d-env-keys.ts |     100 |      100 |     100 |     100 |                   
  ...l-settings.ts |     100 |      100 |     100 |     100 |                   
  ...paths-lite.ts |   89.47 |       88 |     100 |   89.47 | 43-44,53-54,56-57 
  ...precedence.ts |   98.79 |     92.3 |     100 |   98.79 | 62                
  ...tedFolders.ts |   92.53 |    93.47 |     100 |   92.53 | ...36-337,373-384 
 ...nfig/migration |   95.23 |    77.77 |   83.33 |   95.23 |                   
  index.ts         |   95.65 |     87.5 |     100 |   95.65 | 117-118           
  scheduler.ts     |   96.55 |    77.77 |     100 |   96.55 | 19-20             
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...ation/versions |   94.91 |      100 |     100 |   94.91 |                   
  ...-v2-shared.ts |     100 |      100 |     100 |     100 |                   
  v1-to-v2.ts      |   81.75 |      100 |     100 |   81.75 | ...28-229,231-247 
  v2-to-v3.ts      |     100 |      100 |     100 |     100 |                   
  v3-to-v4.ts      |     100 |      100 |     100 |     100 |                   
  v5-to-v4.ts      |      96 |      100 |     100 |      96 | 94-95,99          
 src/core          |     100 |      100 |     100 |     100 |                   
  auth.ts          |     100 |      100 |     100 |     100 |                   
  initializer.ts   |     100 |      100 |     100 |     100 |                   
  theme.ts         |     100 |      100 |     100 |     100 |                   
 src/dualOutput    |    71.8 |    70.31 |   66.66 |    71.8 |                   
  ...tputBridge.ts |   71.95 |    70.96 |   68.42 |   71.95 | ...08-409,417-420 
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/export        |       0 |        0 |       0 |       0 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-7               
 src/generated     |     100 |      100 |     100 |     100 |                   
  git-commit.ts    |     100 |      100 |     100 |     100 |                   
 src/hooks         |     100 |      100 |     100 |     100 |                   
  ...elete-hook.ts |     100 |      100 |     100 |     100 |                   
 src/i18n          |   85.98 |    81.92 |   89.65 |   85.98 |                   
  index.ts         |   73.45 |    77.77 |      90 |   73.45 | ...70-271,294-299 
  languages.ts     |   93.07 |     92.3 |   85.71 |   93.07 | ...35,164-169,184 
  ...nslateKeys.ts |     100 |      100 |     100 |     100 |                   
  ...lationDict.ts |   93.33 |    66.66 |     100 |   93.33 | 15                
 src/i18n/locales  |     100 |      100 |     100 |     100 |                   
  ca.js            |     100 |      100 |     100 |     100 |                   
  de.js            |     100 |      100 |     100 |     100 |                   
  en.js            |     100 |      100 |     100 |     100 |                   
  fr.js            |     100 |      100 |     100 |     100 |                   
  ja.js            |     100 |      100 |     100 |     100 |                   
  pt.js            |     100 |      100 |     100 |     100 |                   
  ru.js            |     100 |      100 |     100 |     100 |                   
  zh-TW.js         |     100 |      100 |     100 |     100 |                   
  zh.js            |     100 |      100 |     100 |     100 |                   
 ...nonInteractive |   80.98 |    77.27 |   84.12 |   80.98 |                   
  session.ts       |   84.97 |    76.31 |   96.07 |   84.97 | ...1048,1057-1067 
  types.ts         |    42.5 |      100 |   33.33 |    42.5 | ...31-632,635-636 
 ...active/control |   75.54 |    89.83 |      80 |   75.54 |                   
  ...rolContext.ts |    6.06 |        0 |       0 |    6.06 | 57-99             
  ...Dispatcher.ts |   91.95 |    92.98 |   88.88 |   91.95 | ...54-372,392,395 
  ...rolService.ts |    6.89 |        0 |       0 |    6.89 | 46-188            
 ...ol/controllers |    44.9 |    66.19 |   55.26 |    44.9 |                   
  ...Controller.ts |    42.4 |      100 |   83.33 |    42.4 | 101-105,140-223   
  ...Controller.ts |       0 |        0 |       0 |       0 | 1-56              
  ...Controller.ts |   55.01 |    67.14 |   58.33 |   55.01 | ...15-624,639-644 
  ...Controller.ts |   49.23 |       60 |      50 |   49.23 | ...07-108,111-121 
  ...Controller.ts |   37.92 |    60.71 |   46.66 |   37.92 | ...41-653,662-691 
 .../control/types |       0 |        0 |       0 |       0 |                   
  serviceAPIs.ts   |       0 |        0 |       0 |       0 | 1                 
 ...Interactive/io |    98.1 |    94.13 |   95.23 |    98.1 |                   
  ...putAdapter.ts |   97.98 |     93.2 |   98.07 |   97.98 | ...1415,1431-1432 
  ...putAdapter.ts |      96 |    91.66 |   85.71 |      96 | 51-52             
  ...nputReader.ts |     100 |    94.73 |     100 |     100 | 67                
  ...putAdapter.ts |   98.49 |      100 |   90.47 |   98.49 | 85-86,126-127     
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/patches       |       0 |        0 |       0 |       0 |                   
  is-in-ci.ts      |       0 |        0 |       0 |       0 | 1-17              
 src/remoteInput   |   87.31 |    75.32 |   88.23 |   87.31 |                   
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  ...putWatcher.ts |   88.01 |       76 |   93.33 |   88.01 | ...49-350,361-364 
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/runtime       |   99.61 |    95.04 |     100 |   99.61 |                   
  ...livery-ipc.ts |     100 |     90.9 |     100 |     100 | 94,106,134        
  ...l-delivery.ts |     100 |      100 |     100 |     100 |                   
  cpu-percent.ts   |     100 |      100 |     100 |     100 |                   
  ...erver-name.ts |     100 |      100 |     100 |     100 |                   
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...-summaries.ts |   86.66 |       50 |     100 |   86.66 | 11,19             
  ...ber-errors.ts |     100 |    95.32 |     100 |     100 | 53,93-94,172,192  
  ...ls-mapping.ts |     100 |      100 |     100 |     100 |                   
 src/serve         |   87.51 |    83.76 |   90.46 |   87.51 |                   
  ...tp-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   93.43 |    93.05 |     100 |   93.43 | ...20-321,324-326 
  ...em-adapter.ts |     100 |      100 |     100 |     100 |                   
  capabilities.ts  |     100 |    98.07 |     100 |     100 | 672               
  ...cp-command.ts |     100 |      100 |     100 |     100 |                   
  ...horization.ts |   92.79 |    93.33 |    87.5 |   92.79 | 75-80,135-136     
  ...op-mcp-ipc.ts |   81.06 |    73.68 |   94.11 |   81.06 | ...37-242,267,289 
  ...nt-service.ts |    94.1 |    86.89 |     100 |    94.1 | ...75-477,484,486 
  ...-selection.ts |     100 |      100 |     100 |     100 |                   
  ...ings-store.ts |   88.59 |    93.68 |   96.29 |   88.59 | ...95-207,451-454 
  ...ebhook-ipc.ts |    98.5 |    86.66 |     100 |    98.5 | 47                
  ...iagnostics.ts |     100 |      100 |     100 |     100 |                   
  ...worker-env.ts |     100 |      100 |     100 |     100 |                   
  ...rker-group.ts |   87.27 |     85.2 |     100 |   87.27 | ...10,816-820,838 
  ...er-manager.ts |   89.39 |    83.88 |   93.33 |   89.39 | ...98,711,722-724 
  ...tartup-ipc.ts |   97.72 |    96.66 |     100 |   97.72 | 88-89             
  ...supervisor.ts |   92.42 |    84.44 |    97.1 |   92.42 | ...1466,1520-1524 
  ...e-grouping.ts |     100 |    94.28 |     100 |     100 | 71,137            
  core-runtime.ts  |     100 |      100 |     100 |     100 |                   
  ...ub-session.ts |    90.1 |    77.83 |   94.73 |    90.1 | ...1014,1021-1026 
  daemon-logger.ts |    82.2 |    77.42 |   91.76 |    82.2 | ...1720,1747-1753 
  ...y-pressure.ts |     100 |    96.96 |     100 |     100 | 135               
  ...trics-ring.ts |     100 |      100 |     100 |     100 |                   
  ...s-provider.ts |   68.04 |    52.77 |     100 |   68.04 | ...44-249,282-290 
  daemon-status.ts |   98.57 |     90.8 |     100 |   98.57 | ...1411,1413-1414 
  debug-mode.ts    |     100 |      100 |     100 |     100 |                   
  demo.ts          |     100 |      100 |     100 |     100 |                   
  env-snapshot.ts  |   93.37 |    85.18 |     100 |   93.37 | 114-117,195-202   
  ...-scheduler.ts |   87.34 |    83.87 |     100 |   87.34 | 33-36,48-50,79-81 
  ...d-provider.ts |   92.06 |    86.95 |     100 |   92.06 | ...72,287-293,316 
  ...-path-argv.ts |     100 |      100 |     100 |     100 |                   
  ...h-settings.ts |   94.89 |    90.25 |     100 |   94.89 | ...24,702,718,728 
  fast-path.ts     |   90.99 |    81.38 |   95.45 |   90.99 | ...33-542,608-609 
  ...ration-sse.ts |   42.55 |    33.33 |     100 |   42.55 | 23-24,30,33-56    
  health-query.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-144             
  ...e-observer.ts |   89.89 |    83.24 |      96 |   89.89 | ...11-512,541-543 
  ...back-binds.ts |     100 |    88.88 |     100 |     100 | 32                
  ...-workspace.ts |    90.9 |    85.71 |     100 |    90.9 | ...30-131,142-143 
  ...iders-edit.ts |     100 |    82.14 |     100 |     100 | 58-60,65,81       
  ...ory-picker.ts |     100 |    86.95 |     100 |     100 | 36,66,92          
  ...sion-audit.ts |     100 |      100 |   93.33 |     100 |                   
  rate-limit.ts    |   92.77 |    88.42 |     100 |   92.77 | ...93-295,307-309 
  ...qwen-serve.ts |   83.96 |    80.01 |   75.26 |   83.96 | ...7435,7441-7442 
  ...tup-errors.ts |     100 |      100 |     100 |     100 |                   
  ...-keepalive.ts |   94.22 |    87.96 |     100 |   94.22 | ...27,531-532,572 
  ...-lifecycle.ts |     100 |      100 |     100 |     100 |                   
  server.ts        |   90.58 |    91.18 |   71.81 |   90.58 | ...2718,2732-2736 
  ...-admission.ts |   98.24 |    94.73 |     100 |   98.24 | 79-80,303-304     
  ...on-helpers.ts |     100 |      100 |     100 |     100 |                   
  ...t-event-id.ts |     100 |    95.23 |     100 |     100 | 12                
  ...-admission.ts |   98.71 |    89.65 |     100 |   98.71 | 68                
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ion-limits.ts |     100 |      100 |     100 |     100 |                   
  ...t-sessions.ts |    93.3 |    76.83 |     100 |    93.3 | ...20,823,836-838 
  ...l-resolver.ts |   90.32 |    66.66 |     100 |   90.32 | 16,45-46          
  ...ell-static.ts |   92.18 |    88.37 |     100 |   92.18 | ...21-224,267-270 
  ...ace-agents.ts |   66.13 |    70.57 |   92.68 |   66.13 | ...2246,2256-2266 
  ...generation.ts |    95.4 |    82.35 |   66.66 |    95.4 | 55-56,78,92       
  ...-git-state.ts |     100 |    91.93 |    90.9 |     100 | 161,172,202,265   
  ...ace-inputs.ts |     100 |      100 |     100 |     100 |                   
  ...ace-memory.ts |      83 |    74.54 |     100 |      83 | ...30-537,597-604 
  ...ers-status.ts |   98.58 |       79 |     100 |   98.58 | 106,134,174,177   
  ...tion-store.ts |   89.67 |    88.27 |   92.59 |   89.67 | ...91-400,411-414 
  ...e-registry.ts |   93.89 |     87.5 |     100 |   93.89 | ...18-519,525-526 
  ...e-remember.ts |   98.23 |    92.51 |     100 |   98.23 | ...36,340-345,386 
  ...te-runtime.ts |   83.98 |    90.29 |     100 |   83.98 | ...48-156,216-237 
  ...me-storage.ts |     100 |      100 |     100 |     100 |                   
  ...management.ts |   72.63 |    72.72 |      96 |   72.63 | ...88-889,896-900 
  ...lls-status.ts |     100 |    95.45 |     100 |     100 | 152               
  ...reconciler.ts |   91.63 |    84.26 |     100 |   91.63 | ...71-273,306-307 
 ...serve/acp-http |   77.89 |    79.56 |   93.03 |   77.89 |                   
  ...r-registry.ts |   96.92 |    94.87 |     100 |   96.92 | 184-187           
  client-mcp-ws.ts |   54.85 |    58.62 |   72.72 |   54.85 | ...99-300,304-305 
  ...n-registry.ts |    98.2 |    88.55 |     100 |    98.2 | 1015,1041-1052    
  dispatch.ts      |   73.19 |    76.77 |      94 |   73.19 | ...5165,5213-5219 
  index.ts         |   82.23 |    80.11 |   91.07 |   82.23 | ...2341,2425-2426 
  json-rpc.ts      |     100 |    96.96 |     100 |     100 | 92                
  safe-ws-send.ts  |   52.94 |    71.42 |     100 |   52.94 | 33-42,47-55       
  sse-stream.ts    |   93.96 |    88.57 |   84.61 |   93.96 | ...57-159,161-163 
  ...ort-stream.ts |       0 |        0 |       0 |       0 | 1                 
  ws-stream.ts     |   91.86 |       80 |     100 |   91.86 | 45,50,96,100-103  
 src/serve/auth    |   86.86 |     79.7 |   93.87 |   86.86 |                   
  device-flow.ts   |   96.35 |    80.57 |   97.61 |   96.35 | ...1358,1453,1519 
  ...w-provider.ts |   44.24 |    74.07 |   71.42 |   44.24 | ...23-284,297,301 
 ...rve/cdp-tunnel |   87.73 |    76.21 |    97.5 |   87.73 |                   
  ...r-emulator.ts |   93.27 |    77.77 |     100 |   93.27 | ...53-256,282-283 
  ...verse-link.ts |      88 |    76.19 |     100 |      88 | ...28-329,420-423 
  ...l-registry.ts |     100 |      100 |     100 |     100 |                   
  cdp-ws.ts        |   76.28 |    61.29 |    87.5 |   76.28 | ...13-217,223-228 
 ...nel/acceptance |    6.12 |    57.89 |   46.15 |    6.12 |                   
  ...helpers.d.mts |       0 |        0 |       0 |       0 | 1                 
  ...e-helpers.mjs |   97.64 |    70.96 |     100 |   97.64 | 22-23             
  ...mcp-smoke.mjs |       0 |        0 |       0 |       0 | 1-124             
  ...cceptance.mjs |       0 |        0 |       0 |       0 | 1-473             
  ...re-server.mjs |       0 |        0 |       0 |       0 | 1-59              
  ...ols-smoke.mjs |       0 |        0 |       0 |       0 | 1-268             
  real-tab.mjs     |       0 |        0 |       0 |       0 | 1-218             
  ...al-chrome.mjs |       0 |        0 |       0 |       0 | 1-223             
 src/serve/fs      |   86.39 |    80.74 |     100 |   86.39 |                   
  audit.ts         |     100 |    96.15 |     100 |     100 | 204               
  errors.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...x-registry.ts |     100 |      100 |     100 |     100 |                   
  paths.ts         |   77.64 |     73.8 |     100 |   77.64 | ...65,594-598,611 
  policy.ts        |   90.42 |    89.18 |     100 |   90.42 | 161-169           
  text-cursor.ts   |   88.23 |       90 |     100 |   88.23 | 74-77,92-95       
  ...ile-system.ts |   86.16 |    79.55 |     100 |   86.16 | ...2510,2520-2521 
 src/serve/live    |   77.28 |    69.21 |   89.91 |   77.28 |                   
  ...en-context.ts |   95.74 |    81.25 |     100 |   95.74 | ...0,66-67,99-100 
  ...-workspace.ts |   88.63 |    82.53 |     100 |   88.63 | ...40-241,253-254 
  discovery.ts     |   85.77 |    76.92 |      90 |   85.77 | ...49-250,255-256 
  ...structions.ts |     100 |      100 |     100 |     100 |                   
  ...oordinator.ts |   82.67 |    76.75 |   97.01 |   82.67 | ...1319,1351-1353 
  ...-installer.ts |   45.17 |    81.96 |   68.18 |   45.17 | ...80-381,395-407 
  ...oordinator.ts |   76.17 |     64.4 |   85.36 |   76.17 | ...1858,1949-1950 
  ...controller.ts |   67.82 |    79.31 |   72.72 |   67.82 | ...66-278,287-295 
  ...ak-to-user.ts |   96.66 |      100 |   83.33 |   96.66 | 37-38             
  ...sk-service.ts |   86.22 |    59.64 |   93.33 |   86.22 | ...1152,1175-1182 
  ...task-tools.ts |      99 |      100 |   85.71 |      99 | 205-206           
  ...redentials.ts |   96.26 |    93.47 |     100 |   96.26 | 91-94             
  ...me-session.ts |   65.63 |    57.24 |   88.88 |   65.63 | ...2270,2275-2282 
  ...up-context.ts |   94.83 |    77.58 |     100 |   94.83 | ...18,327-330,350 
  ...ion-source.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/serve/routes  |   85.52 |    79.98 |   94.72 |   85.52 |                   
  a2ui-action.ts   |   96.84 |     88.5 |    87.5 |   96.84 | ...70-272,309-311 
  capabilities.ts  |     100 |      100 |     100 |     100 |                   
  ...nel-notify.ts |   86.45 |       88 |     100 |   86.45 | ...,83-87,103-104 
  ...l-webhooks.ts |   93.56 |    84.09 |     100 |   93.56 | ...42,292,332,334 
  daemon-status.ts |   85.71 |    83.33 |     100 |   85.71 | 101-108           
  goals.ts         |   98.92 |     90.9 |     100 |   98.92 | 146               
  health-demo.ts   |   95.65 |    88.88 |     100 |   95.65 | 63-67,186         
  live-setup.ts    |   33.33 |     37.5 |      50 |   33.33 | ...18-123,130-135 
  live.ts          |    82.4 |    71.42 |     100 |    82.4 | ...-94,96-101,121 
  permission.ts    |     100 |     92.3 |     100 |     100 | 50,98             
  ...uled-tasks.ts |   87.29 |    82.94 |   92.59 |   87.29 | ...1275,1318-1319 
  ...on-runtime.ts |     100 |    90.47 |     100 |     100 | 58,94             
  session.ts       |   85.41 |    81.79 |   91.04 |   85.41 | ...4730,4732-4733 
  sse-events.ts    |   86.82 |    85.71 |   94.11 |   86.82 | ...16-927,930,937 
  usage-stats.ts   |     100 |    95.45 |     100 |     100 | 118               
  ...space-auth.ts |   85.55 |    75.64 |     100 |   85.55 | ...21-326,331,345 
  ...el-control.ts |   86.26 |    78.94 |     100 |   86.26 | ...17-318,339-347 
  ...management.ts |   90.92 |    79.69 |     100 |   90.92 | ...81-482,501-502 
  ...d-contacts.ts |     100 |      100 |     100 |     100 |                   
  ...controller.ts |   83.11 |    79.31 |      90 |   83.11 | ...1033,1039,1042 
  ...extensions.ts |   88.15 |    74.95 |   92.98 |   88.15 | ...2027,2072-2073 
  ...-file-read.ts |      91 |    80.91 |     100 |      91 | ...20-621,624-625 
  ...file-write.ts |   84.44 |    64.51 |     100 |   84.44 | ...73-275,355-357 
  ...t-branches.ts |   75.43 |    66.66 |     100 |   75.43 | ...13-618,627-634 
  ...e-git-diff.ts |   97.32 |    90.56 |     100 |   97.32 | 161-162,189-191   
  ...ce-git-log.ts |     100 |    93.18 |     100 |     100 | 52,77,188         
  workspace-git.ts |   77.08 |    89.65 |     100 |   77.08 | 97-118            
  ...github-prs.ts |   88.26 |    63.46 |     100 |   88.26 | ...38-239,264-265 
  ...-lifecycle.ts |   95.23 |    75.75 |     100 |   95.23 | ...50-151,186-187 
  ...management.ts |   87.41 |    84.13 |     100 |   87.41 | ...1660,1680-1685 
  ...cp-control.ts |    73.2 |    67.54 |   85.71 |    73.2 | ...27-633,644-645 
  ...ace-models.ts |   95.53 |    89.74 |     100 |   95.53 | ...52-157,296-297 
  ...ermissions.ts |    77.9 |    72.41 |     100 |    77.9 | ...69-277,298-316 
  ...e-settings.ts |   75.04 |    72.99 |     100 |   75.04 | ...79-690,696-697 
  ...tup-github.ts |   77.97 |    70.58 |   84.21 |   77.97 | ...46-352,397-398 
  ...ace-skills.ts |    76.9 |    87.15 |     100 |    76.9 | ...29-354,360-394 
  ...ace-status.ts |   82.94 |     74.5 |     100 |   82.94 | ...84-486,490-491 
  ...pace-tools.ts |   75.94 |    69.69 |   66.66 |   75.94 | ...59-164,193-194 
  ...pace-trust.ts |   78.92 |    66.21 |      80 |   78.92 | ...38-343,351-352 
  ...pace-voice.ts |   91.33 |    80.92 |     100 |   91.33 | ...70-673,676-678 
 src/serve/server  |    90.8 |     88.4 |   96.57 |    90.8 |                   
  access-log.ts    |   98.68 |     97.1 |     100 |   98.68 | 115,186           
  ...er-helpers.ts |   63.82 |    77.96 |   81.81 |   63.82 | ...16,330,332-347 
  ...w-registry.ts |    98.8 |    81.81 |     100 |    98.8 | 107               
  ...r-handlers.ts |   97.29 |       75 |     100 |   97.29 | 17                
  ...r-response.ts |    86.5 |    72.48 |     100 |    86.5 | ...47,764,827-836 
  fs-factory.ts    |     100 |    92.59 |     100 |     100 | 34,42,103,159     
  ...branch-ops.ts |     100 |      100 |     100 |     100 |                   
  ...t-deadline.ts |     100 |      100 |     100 |     100 |                   
  ...iter-setup.ts |      65 |    73.33 |   33.33 |      65 | 30-35,38-43,47-48 
  ...st-helpers.ts |   95.13 |    95.09 |     100 |   95.13 | ...66-168,423-428 
  self-origin.ts   |   76.19 |       80 |     100 |   76.19 | 45-54             
  ...e-features.ts |      95 |     87.5 |     100 |      95 | 182-188           
  ...on-archive.ts |   89.55 |    87.83 |   97.14 |   89.55 | ...32-836,888-889 
  ...ion-export.ts |     100 |    94.44 |     100 |     100 | 64                
  session-list.ts  |   93.55 |    91.01 |     100 |   93.55 | ...79,681-687,827 
  telemetry.ts     |   99.02 |    97.43 |     100 |   99.02 | ...25,639,781-783 
 src/serve/voice   |    92.7 |    91.48 |   97.67 |    92.7 |                   
  ...ice-config.ts |   84.81 |       30 |     100 |   84.81 | 91-100,104-105    
  voice-ws.ts      |   91.58 |    93.44 |      96 |   91.58 | ...68,483,521-523 
  ...oordinator.ts |     100 |    98.21 |     100 |     100 | 176               
 ...kspace-service |   90.65 |    87.73 |   91.11 |   90.65 |                   
  index.ts         |   90.13 |    87.04 |   89.74 |   90.13 | ...1464-1468,1471 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services      |   92.48 |    89.33 |      98 |   92.48 |                   
  ...mandLoader.ts |     100 |    88.88 |     100 |     100 | 105-118           
  ...killLoader.ts |   97.19 |    85.29 |     100 |   97.19 | 142,153-154       
  ...andService.ts |   98.73 |      100 |     100 |   98.73 | 107               
  ...mandLoader.ts |   86.83 |    83.87 |     100 |   86.83 | ...30-335,340-345 
  ...omptLoader.ts |   79.55 |    88.29 |   83.33 |   79.55 | ...48,178,245-246 
  ...mandLoader.ts |   97.77 |    92.15 |     100 |   97.77 | 176,183-184       
  ...nd-factory.ts |   91.42 |    91.66 |     100 |   91.42 | 128,137-144       
  ...ation-tool.ts |     100 |    95.45 |     100 |     100 | 125               
  ...ndMetadata.ts |   98.23 |    96.72 |     100 |   98.23 | 83,87             
  commandUtils.ts  |      96 |     90.9 |     100 |      96 | 48                
  ...and-parser.ts |   90.69 |    85.71 |     100 |   90.69 | 63-66             
  ...ionService.ts |     100 |      100 |     100 |     100 |                   
  prompt-stash.ts  |   96.66 |    92.85 |     100 |   96.66 | 34-35             
  ...tree-lease.ts |   88.23 |    86.48 |     100 |   88.23 | ...94-199,232-233 
  ...low-loader.ts |     100 |    96.15 |     100 |     100 | 88                
  setup-github.ts  |    90.8 |    80.95 |     100 |    90.8 | ...49-450,457-458 
  ...-args-file.ts |   93.93 |    91.66 |    87.5 |   93.93 | 208-210,224-230   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |   98.64 |    95.89 |     100 |   98.64 | 116,142-143       
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  voice-service.ts |    90.4 |    87.87 |     100 |    90.4 | ...81,288,353-358 
  ...e-settings.ts |     100 |    95.23 |     100 |     100 | 19                
  ...ranscriber.ts |   91.77 |    87.11 |   97.22 |   91.77 | ...99-901,904-906 
 ...rvices/insight |     100 |      100 |     100 |     100 |                   
  dates.ts         |     100 |      100 |     100 |     100 |                   
 ...ght/generators |   88.91 |     86.8 |   96.15 |   88.91 |                   
  DataProcessor.ts |   88.28 |    86.77 |   94.73 |   88.28 | ...1362,1366-1373 
  ...tGenerator.ts |   98.24 |    85.71 |     100 |   98.24 | 47                
  ...teRenderer.ts |     100 |      100 |     100 |     100 |                   
 .../insight/types |       0 |       50 |      50 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 | 1                 
 ...mpt-processors |   97.27 |    94.04 |     100 |   97.27 |                   
  ...tProcessor.ts |     100 |      100 |     100 |     100 |                   
  ...eProcessor.ts |   94.52 |    84.21 |     100 |   94.52 | 46-47,93-94       
  ...tionParser.ts |     100 |      100 |     100 |     100 |                   
  ...lProcessor.ts |   97.41 |    95.65 |     100 |   97.41 | 96-99             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services/tips |   97.27 |    84.61 |     100 |   97.27 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  tipHistory.ts    |   92.59 |       70 |     100 |   92.59 | ...24,146,153,162 
  tipRegistry.ts   |     100 |      100 |     100 |     100 |                   
  tipScheduler.ts  |     100 |    91.66 |     100 |     100 | 55                
 src/startup       |   88.99 |    83.47 |    90.9 |   88.99 |                   
  ...p-prefetch.ts |   98.09 |    94.23 |    87.5 |   98.09 | 50,209,225-226    
  ...reeStartup.ts |   80.53 |     74.6 |     100 |   80.53 | ...94,403,409-412 
 src/test-utils    |   94.09 |    79.16 |   77.77 |   94.09 |                   
  ci-env.ts        |      88 |     62.5 |     100 |      88 | 22-23,28          
  ...omMatchers.ts |   69.69 |       50 |      50 |   69.69 | 32-35,37-39,45-47 
  ...mised-lock.ts |     100 |      100 |   66.66 |     100 |                   
  ...andContext.ts |     100 |      100 |     100 |     100 |                   
  render.tsx       |     100 |      100 |     100 |     100 |                   
 src/ui            |   73.08 |    75.43 |   67.41 |   73.08 |                   
  App.tsx          |   33.33 |       75 |   33.33 |   33.33 | 32-86             
  AppContainer.tsx |   74.29 |    72.05 |   68.57 |   74.29 | ...4112,4228-4234 
  ...tionNudge.tsx |    9.58 |      100 |       0 |    9.58 | 24-94             
  ...ackDialog.tsx |    30.3 |      100 |       0 |    30.3 | 26-76             
  ...tionNudge.tsx |    7.69 |      100 |       0 |    7.69 | 25-103            
  colors.ts        |      60 |      100 |   35.29 |      60 | ...52,54-55,60-61 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  keyMatchers.ts   |   95.91 |    97.14 |     100 |   95.91 | 25-26             
  ...tic-colors.ts |     100 |      100 |     100 |     100 |                   
  ...ractiveUI.tsx |   70.08 |    71.73 |   66.66 |   70.08 | ...01,324,377-382 
  ...inePresets.ts |   96.27 |    83.87 |     100 |   96.27 | ...97,402,410-412 
  textConstants.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/auth       |   58.53 |    66.18 |   51.06 |   58.53 |                   
  AuthDialog.tsx   |   59.01 |     42.1 |   16.66 |   59.01 | ...25,332-354,358 
  ...nProgress.tsx |       0 |        0 |       0 |       0 | 1-64              
  ...etupSteps.tsx |   60.21 |    70.73 |   57.69 |   60.21 | ...90,794,803,806 
  useAuth.ts       |    94.6 |    73.52 |     100 |    94.6 | ...21-222,241-247 
  ...rSetupFlow.ts |   43.18 |    33.33 |      50 |   43.18 | ...78-399,416-459 
 src/ui/commands   |   82.67 |    83.11 |   89.15 |   82.67 |                   
  aboutCommand.ts  |     100 |      100 |     100 |     100 |                   
  agentsCommand.ts |   83.78 |      100 |      60 |   83.78 | 30-32,42-44       
  ...odeCommand.ts |    93.1 |    95.23 |     100 |    93.1 | 77-82             
  arenaCommand.ts  |   63.89 |    65.71 |   65.21 |   63.89 | ...01-606,691-699 
  authCommand.ts   |     100 |      100 |     100 |     100 |                   
  branchCommand.ts |     100 |      100 |     100 |     100 |                   
  btwCommand.ts    |   94.32 |    77.41 |     100 |   94.32 | 35-36,114-119     
  bugCommand.ts    |     100 |    77.77 |     100 |     100 | 27,61             
  cdCommand.ts     |    92.3 |    82.75 |     100 |    92.3 | ...,94-99,178,187 
  clearCommand.ts  |    80.9 |    70.83 |     100 |    80.9 | ...24-125,133-142 
  ...essCommand.ts |   68.06 |    54.05 |      75 |   68.06 | ...96-197,211-214 
  ...astCommand.ts |   84.17 |       75 |     100 |   84.17 | ...,91-97,125-130 
  ...ig-command.ts |   93.12 |    88.42 |     100 |   93.12 | ...07-315,321-323 
  ...extCommand.ts |   69.07 |     72.6 |   84.61 |   69.07 | ...78-611,622-623 
  copyCommand.ts   |    98.7 |    96.29 |     100 |    98.7 | 66-67,172,272,323 
  ...or-command.ts |   85.95 |    80.55 |   88.88 |   85.95 | ...68-274,298-309 
  deleteCommand.ts |     100 |      100 |     100 |     100 |                   
  diffCommand.ts   |     100 |    87.87 |     100 |     100 | ...63,231-232,245 
  ...ryCommand.tsx |   81.64 |    87.67 |    90.9 |   81.64 | ...73-278,325-332 
  docsCommand.ts   |     100 |     90.9 |     100 |     100 | 25                
  doctorCommand.ts |   65.37 |    81.88 |   94.11 |   65.37 | ...85-535,538-672 
  dreamCommand.ts  |   85.45 |    88.88 |     100 |   85.45 | 58-65             
  editorCommand.ts |     100 |      100 |     100 |     100 |                   
  ...rt-command.ts |   82.97 |    78.57 |     100 |   82.97 | 47-52,67-70,91-96 
  exportCommand.ts |   98.25 |    91.02 |     100 |   98.25 | ...81,198-199,364 
  ...onsCommand.ts |   52.31 |    56.25 |   69.23 |   52.31 | ...09,277-329,390 
  forgetCommand.ts |     100 |       90 |     100 |     100 | 59                
  forkCommand.ts   |     100 |    94.11 |     100 |     100 | 96,147            
  goalCommand.ts   |   72.81 |    86.84 |   66.66 |   72.81 | ...63-168,277-280 
  helpCommand.ts   |     100 |      100 |     100 |     100 |                   
  ...oryCommand.ts |     100 |      100 |     100 |     100 |                   
  hooksCommand.ts  |   81.13 |    65.71 |   85.71 |   81.13 | ...,86-93,131-132 
  ideCommand.ts    |   60.75 |    64.28 |   41.17 |   60.75 | ...05-306,310-324 
  ...figCommand.ts |   52.83 |    81.25 |      70 |   52.83 | ...74-319,321-330 
  initCommand.ts   |   91.86 |       80 |     100 |   91.86 | 48,83-88          
  ...ghtCommand.ts |   77.87 |    71.42 |     100 |   77.87 | ...44-245,250-272 
  ...ageCommand.ts |   94.44 |    90.14 |     100 |   94.44 | ...13-214,241-251 
  learn-command.ts |     100 |      100 |     100 |     100 |                   
  lspCommand.ts    |     100 |    86.95 |     100 |     100 | 31,101-102        
  mcpCommand.ts    |     100 |      100 |     100 |     100 |                   
  memoryCommand.ts |     100 |      100 |     100 |     100 |                   
  modelCommand.ts  |   84.78 |    82.47 |     100 |   84.78 | ...1071,1105-1110 
  ...onsCommand.ts |     100 |      100 |     100 |     100 |                   
  planCommand.ts   |   78.82 |    76.92 |     100 |   78.82 | 30-35,51-56,68-73 
  quitCommand.ts   |     100 |      100 |     100 |     100 |                   
  recapCommand.ts  |   21.81 |      100 |      50 |   21.81 | 24-73             
  ...ns-command.ts |   98.83 |    81.81 |     100 |   98.83 | 100               
  ...berCommand.ts |     100 |     87.5 |     100 |     100 | 46                
  renameCommand.ts |   89.06 |    88.37 |     100 |   89.06 | ...72-176,202-209 
  ...oreCommand.ts |   90.96 |    86.04 |     100 |   90.96 | ...41-146,177-178 
  resumeCommand.ts |     100 |      100 |     100 |     100 |                   
  rewindCommand.ts |   81.25 |      100 |      50 |   81.25 | 20-22             
  ...ngsCommand.ts |     100 |      100 |     100 |     100 |                   
  ...hubCommand.ts |   89.47 |       75 |      80 |   89.47 | 54-59             
  skillsCommand.ts |   78.82 |    81.81 |     100 |   78.82 | 37-52,78,97       
  statsCommand.ts  |   90.65 |    76.73 |     100 |   90.65 | ...30-733,825-832 
  ...ineCommand.ts |     100 |      100 |     100 |     100 |                   
  ...aryCommand.ts |   73.04 |     82.3 |      90 |   73.04 | ...20-547,561-565 
  tasksCommand.ts  |   77.22 |    72.13 |     100 |   77.22 | ...46-150,172-177 
  ...tupCommand.ts |     100 |      100 |     100 |     100 |                   
  themeCommand.ts  |     100 |      100 |     100 |     100 |                   
  toolsCommand.ts  |     100 |      100 |     100 |     100 |                   
  trustCommand.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...te-command.ts |     100 |    94.11 |     100 |     100 | 74,148            
  vimCommand.ts    |   54.54 |      100 |      50 |   54.54 | 19-29             
  voice-command.ts |   93.57 |       88 |     100 |   93.57 | 35,97-102         
  ...owsCommand.ts |   92.92 |       85 |   66.66 |   92.92 | ...72-177,276-281 
 src/ui/components |   71.52 |    79.07 |   79.85 |   71.52 |                   
  AboutBox.tsx     |     100 |      100 |     100 |     100 |                   
  AnsiOutput.tsx   |   65.57 |      100 |      50 |   65.57 | 69-90             
  ApiKeyInput.tsx  |       0 |        0 |       0 |       0 | 1-97              
  AppHeader.tsx    |    88.7 |       75 |     100 |    88.7 | 36,38-43,45       
  ...odeDialog.tsx |   87.24 |    72.22 |   33.33 |   87.24 | ...85,233-238,245 
  AsciiArt.ts      |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |   95.65 |    66.66 |     100 |   95.65 | 27,52             
  ...TextInput.tsx |   88.65 |    90.41 |     100 |   88.65 | ...84-286,300-302 
  Composer.tsx     |   94.49 |    66.66 |     100 |   94.49 | ...-72,84,139,153 
  ...entPrompt.tsx |     100 |      100 |     100 |     100 |                   
  ...ryDisplay.tsx |   75.89 |    62.06 |     100 |   75.89 | ...,88,93-108,113 
  ...geDisplay.tsx |   68.42 |    57.14 |     100 |   68.42 | 16-17,31-32,42-50 
  CronPill.tsx     |     100 |    93.75 |     100 |     100 | 19                
  ...ification.tsx |      84 |       60 |     100 |      84 | 23-24,40-42       
  ...gProfiler.tsx |       0 |        0 |       0 |       0 | 1-36              
  ...ogManager.tsx |       0 |        0 |       0 |       0 | 1-598             
  DiffDialog.tsx   |    53.5 |     37.5 |   69.23 |    53.5 | ...32-737,747-760 
  ...ngsDialog.tsx |       0 |        0 |       0 |       0 | 1-195             
  EffortDialog.tsx |   97.36 |      100 |     100 |   97.36 | 55-56             
  ExitWarning.tsx  |     100 |      100 |     100 |     100 |                   
  ...hProgress.tsx |    87.8 |    33.33 |     100 |    87.8 | 28-31,56          
  ...ustDialog.tsx |     100 |      100 |     100 |     100 |                   
  Footer.tsx       |   76.99 |    66.66 |      50 |   76.99 | ...96,233,255-260 
  ...ngSpinner.tsx |   68.42 |    85.71 |      50 |   68.42 | 35-52,73,80-81    
  GoalPill.tsx     |   93.51 |    81.81 |     100 |   93.51 | 37-38,106-109,123 
  Header.tsx       |   98.65 |    94.73 |     100 |   98.65 | 173,175           
  Help.tsx         |   98.33 |       90 |     100 |   98.33 | ...25,382,448-449 
  ...emDisplay.tsx |   79.28 |    66.99 |     100 |   79.28 | ...08,511,514-520 
  ...ngeDialog.tsx |     100 |      100 |     100 |     100 |                   
  InputPrompt.tsx  |   83.26 |    82.23 |      80 |   83.26 | ...2231,2257,2331 
  ...Shortcuts.tsx |     100 |       88 |     100 |     100 | 98,119            
  ...Indicator.tsx |   98.18 |    97.82 |     100 |   98.18 | 161-162           
  ...firmation.tsx |   91.42 |      100 |      50 |   91.42 | 26-31             
  MainContent.tsx  |   96.28 |     94.8 |      50 |   96.28 | ...01,459-463,466 
  MemoryDialog.tsx |   86.59 |    80.15 |     100 |   86.59 | ...34-435,485,553 
  ...geDisplay.tsx |       0 |        0 |       0 |       0 | 1-41              
  ModelDialog.tsx  |   81.95 |    71.27 |     100 |   81.95 | ...1045,1050-1066 
  ...tsDisplay.tsx |     100 |    97.22 |     100 |     100 | 270               
  ...fications.tsx |       0 |        0 |       0 |       0 | 1-56              
  ...onsDialog.tsx |       0 |        0 |       0 |       0 | 1-1004            
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...icePrompt.tsx |   92.64 |    85.71 |     100 |   92.64 | 102-106,134-139   
  PrepareLabel.tsx |   91.66 |    77.27 |     100 |   91.66 | 73-75,77-79,110   
  ...atePrompt.tsx |       0 |        0 |       0 |       0 | 1-134             
  ...geDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ngDisplay.tsx |       0 |        0 |       0 |       0 | 1-39              
  ...hProgress.tsx |   85.25 |    88.46 |     100 |   85.25 | 121-147           
  ...dSelector.tsx |   92.79 |    82.65 |     100 |   92.79 | ...19-323,354-370 
  ...ionPicker.tsx |   83.66 |    72.13 |     100 |   83.66 | ...96,402,444-466 
  ...onPreview.tsx |   93.58 |    83.78 |     100 |   93.58 | ...,70-71,195-197 
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...putPrompt.tsx |   92.06 |    86.36 |   83.33 |   92.06 | ...,70-72,120-123 
  ...tedDialog.tsx |     100 |      100 |     100 |     100 |                   
  ...ngsDialog.tsx |   71.49 |    73.89 |   69.23 |   71.49 | ...1244,1250-1251 
  ...ionDialog.tsx |    92.3 |    96.15 |   33.33 |    92.3 | 60-63,68-75,164   
  ...putPrompt.tsx |    15.9 |      100 |       0 |    15.9 | 20-63             
  ...Indicator.tsx |   57.14 |      100 |       0 |   57.14 | 12-15             
  ...MoreLines.tsx |       0 |        0 |       0 |       0 | 1-40              
  ...iewDialog.tsx |   97.77 |    87.67 |     100 |   97.77 | ...97,305-307,324 
  ...tsDisplay.tsx |   95.86 |       75 |     100 |   95.86 | 67-71             
  ...ionPicker.tsx |       0 |        0 |       0 |       0 | 1-172             
  ...tivityTab.tsx |    3.94 |      100 |       0 |    3.94 | 27-275            
  StatsDialog.tsx  |    8.64 |      100 |       0 |    8.64 | ...76-111,130-322 
  StatsDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ciencyTab.tsx |    78.9 |    56.52 |     100 |    78.9 | ...26,213,262-288 
  ...atmapView.tsx |    8.98 |      100 |       0 |    8.98 | 20-107            
  ...essionTab.tsx |      80 |    66.66 |     100 |      80 | ...70-277,283-300 
  ...ineDialog.tsx |    93.5 |    85.18 |     100 |    93.5 | ...05,267,287-289 
  ...yTodoList.tsx |   96.36 |    88.23 |     100 |   96.36 | 138-141           
  ...nsDisplay.tsx |   95.67 |    87.09 |     100 |   95.67 | ...24-125,275-277 
  ...inalImage.tsx |     100 |    93.93 |     100 |     100 | 75,129            
  ThemeDialog.tsx  |   89.95 |    46.15 |      75 |   89.95 | ...71-173,243-245 
  Tips.tsx         |   93.54 |       75 |     100 |   93.54 | 39-40             
  TodoDisplay.tsx  |     100 |      100 |     100 |     100 |                   
  ...tsDisplay.tsx |     100 |     87.5 |     100 |     100 | 31-32             
  TrustDialog.tsx  |     100 |    83.33 |     100 |     100 | 72-87             
  ...ification.tsx |   36.36 |      100 |       0 |   36.36 | 15-22             
  ...Indicator.tsx |    92.5 |     87.5 |     100 |    92.5 | 50-53             
  ...ackDialog.tsx |       0 |        0 |       0 |       0 | 1-134             
  ...xitDialog.tsx |   80.36 |    43.47 |      60 |   80.36 | ...24-238,248-251 
  ...odeVisuals.ts |   97.22 |    85.71 |     100 |   97.22 | 25                
  ...s-helpers.tsx |   66.25 |    81.25 |      50 |   66.25 | 25-32,46-53,62-72 
 ...nts/agent-view |   55.05 |    69.09 |      50 |   55.05 |                   
  ...atContent.tsx |    9.09 |      100 |       0 |    9.09 | 54-275,281-283    
  ...tChatView.tsx |   21.05 |      100 |       0 |   21.05 | 21-39             
  ...tComposer.tsx |   69.48 |    33.33 |   66.66 |   69.48 | ...51,269,277-279 
  AgentFooter.tsx  |   15.38 |      100 |       0 |   15.38 | 28-65             
  AgentHeader.tsx  |   15.38 |      100 |       0 |   15.38 | 27-64             
  AgentTabBar.tsx  |    87.9 |    63.88 |     100 |    87.9 | ...88,110-118,136 
  ...oryAdapter.ts |     100 |    91.83 |     100 |     100 | 103,109-110,138   
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
 ...mponents/arena |    42.3 |    68.69 |   73.68 |    42.3 |                   
  ArenaCards.tsx   |   73.06 |    71.79 |   85.71 |   73.06 | ...83-185,321-326 
  ...ectDialog.tsx |   83.48 |    69.86 |   88.88 |   83.48 | ...88-392,409-410 
  ...artDialog.tsx |       0 |        0 |       0 |       0 | 1-166             
  ...tusDialog.tsx |       0 |        0 |       0 |       0 | 1-288             
  ...topDialog.tsx |       0 |        0 |       0 |       0 | 1-213             
 ...ackground-view |   85.34 |    84.91 |   92.98 |   85.34 |                   
  ...sksDialog.tsx |   81.87 |    82.77 |   85.71 |   81.87 | ...1853,1965-1971 
  ...TasksPill.tsx |   78.84 |    94.28 |     100 |   78.84 | 64,109-129        
  ...gentPanel.tsx |   97.08 |    86.31 |     100 |   97.08 | 132,442-446,520   
  agent-forest.ts  |    99.2 |    93.93 |     100 |    99.2 | 258               
  ...Visibility.ts |     100 |      100 |     100 |     100 |                   
  ...e-overlay.tsx |    88.2 |    76.47 |     100 |    88.2 | ...36-138,140-142 
 ...nts/extensions |   84.32 |    76.78 |   83.33 |   84.32 |                   
  ...gerDialog.tsx |   82.15 |    76.08 |     100 |   82.15 | ...91-198,258,260 
  TabBar.tsx       |   97.29 |    88.88 |     100 |   97.29 | 33                
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...tensions/steps |   46.26 |       85 |   58.82 |   46.26 |                   
  ...ctionStep.tsx |   95.12 |    92.85 |   85.71 |   95.12 | 84-86,89          
  ...etailStep.tsx |       0 |        0 |       0 |       0 | 1-145             
  ...nListStep.tsx |   75.26 |    88.37 |   66.66 |   75.26 | ...53,174,203-209 
  ...electStep.tsx |       0 |        0 |       0 |       0 | 1-83              
  ...nfirmStep.tsx |   16.32 |      100 |       0 |   16.32 | 28-74             
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
 ...xtensions/tabs |   71.92 |    68.21 |   70.83 |   71.92 |                   
  DiscoverTab.tsx  |   68.22 |    67.66 |   55.55 |   68.22 | ...93,656-660,664 
  InstalledTab.tsx |   75.49 |    67.44 |   83.33 |   75.49 | ...77,782-783,820 
  SourcesTab.tsx   |   71.67 |    70.47 |   77.77 |   71.67 | ...28,547,621-633 
 ...tensions/views |   50.97 |    52.38 |   20.83 |   50.97 |                   
  ...tionsView.tsx |   73.75 |    56.36 |   66.66 |   73.75 | ...30,353,369-374 
  ...tionsView.tsx |   43.45 |    44.82 |    6.66 |   43.45 | ...98-405,408-420 
  ...etailView.tsx |    9.56 |      100 |       0 |    9.56 | 40-67,70-158      
 ...mponents/hooks |   87.11 |    81.37 |   91.89 |   87.11 |                   
  ...rListBody.tsx |   95.29 |    85.18 |     100 |   95.29 | 95-98             
  ...etailStep.tsx |   75.32 |    71.42 |      60 |   75.32 | ...56-169,173-186 
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entHeader.tsx |     100 |    85.71 |     100 |     100 | 47                
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...abledStep.tsx |     100 |      100 |     100 |     100 |                   
  ...sListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   72.29 |    70.49 |     100 |   72.29 | ...51,563-568,572 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-13              
  ...erGrouping.ts |     100 |      100 |     100 |     100 |                   
  sourceLabels.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...components/mcp |   40.91 |    63.44 |   70.58 |   40.91 |                   
  ...ealthPill.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   32.09 |    26.19 |      40 |   32.09 | ...12,914,927-933 
  ...valDialog.tsx |   15.06 |      100 |       0 |   15.06 | 40-109            
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-35              
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |      97 |       95 |     100 |      97 | 24,113-114        
 ...ents/mcp/steps |   53.94 |    73.51 |   57.14 |   53.94 |                   
  ...icateStep.tsx |    5.65 |      100 |       0 |    5.65 | 40-66,69-308      
  ...electStep.tsx |   10.95 |      100 |       0 |   10.95 | 16-88             
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...eListStep.tsx |   99.09 |    97.36 |     100 |   99.09 | 71                
  ...etailStep.tsx |   62.83 |       60 |   33.33 |   62.83 | ...87-296,307-332 
  ...rListStep.tsx |   88.53 |    81.25 |     100 |   88.53 | ...64,170,175-180 
  ...etailStep.tsx |    10.3 |      100 |       0 |    10.3 | ...1,67-79,82-140 
  ToolListStep.tsx |   69.29 |       50 |     100 |   69.29 | ...23,126,135-144 
 ...nents/messages |   90.26 |    86.89 |   85.57 |   90.26 |                   
  ...ionDialog.tsx |   89.23 |     84.9 |   81.81 |   89.23 | ...75,593,611-613 
  BtwMessage.tsx   |     100 |      100 |     100 |     100 |                   
  ...upDisplay.tsx |     100 |    94.73 |     100 |     100 | ...43,289,402,432 
  ...onMessage.tsx |   92.06 |    82.35 |     100 |   92.06 | 58-60,62,64       
  ...nMessages.tsx |   94.11 |    95.91 |   76.92 |   94.11 | ...47-349,352-355 
  DiffRenderer.tsx |   93.17 |    86.02 |     100 |   93.17 | ...07,235-236,302 
  ...tsDisplay.tsx |   97.08 |    77.77 |     100 |   97.08 | 95,97,106         
  ...usMessage.tsx |   81.73 |     65.9 |      75 |   81.73 | ...10-214,222,245 
  ...tsDisplay.tsx |   95.52 |    88.31 |     100 |   95.52 | ...40,142,175-180 
  ...ssMessage.tsx |    12.5 |      100 |       0 |    12.5 | 18-59             
  ...edMessage.tsx |   21.05 |      100 |       0 |   21.05 | 23-39             
  ...sMessages.tsx |   59.04 |       50 |    37.5 |   59.04 | ...21-126,147-159 
  ...ryMessage.tsx |   13.63 |      100 |       0 |   13.63 | 23-64             
  ...onMessage.tsx |   91.87 |    82.63 |     100 |   91.87 | ...49-651,658-660 
  ...upMessage.tsx |   98.38 |    95.38 |     100 |   98.38 | 188-191,422       
  ToolMessage.tsx  |   93.06 |    86.32 |   93.75 |   93.06 | ...1037,1082-1084 
 ...ponents/shared |   86.29 |    82.41 |   94.17 |   86.29 |                   
  ...ctionList.tsx |     100 |      100 |      75 |     100 |                   
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  EnumSelector.tsx |     100 |    96.42 |     100 |     100 | 58                
  ...rBoundary.tsx |     100 |      100 |     100 |     100 |                   
  MaxSizedBox.tsx  |   84.71 |    86.95 |      90 |   84.71 | ...67-568,685-686 
  MultiSelect.tsx  |   93.58 |       75 |     100 |   93.58 | ...43,199-201,211 
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  ...ontroller.tsx |     100 |    83.33 |     100 |     100 | 73,93-95          
  ...eSelector.tsx |     100 |       60 |     100 |     100 | 40-45             
  ...lableList.tsx |   81.48 |    84.84 |     100 |   81.48 | 46-66,73-76       
  StaticRender.tsx |     100 |      100 |     100 |     100 |                   
  TextInput.tsx    |    80.8 |    67.24 |      80 |    80.8 | ...36-240,252-258 
  ...ontroller.tsx |     100 |    81.81 |     100 |     100 | 59-62             
  ...apsedTime.tsx |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |     100 |      100 |     100 |     100 |                   
  ...lizedList.tsx |   91.49 |    86.66 |   83.33 |   91.49 | ...18-846,859,959 
  text-buffer.ts   |   85.98 |    81.81 |   97.91 |   85.98 | ...2664,2762-2763 
  ...er-actions.ts |   73.93 |    67.22 |     100 |   73.93 | ...32-733,934-936 
 ...ponents/skills |       0 |        0 |       0 |       0 |                   
  ...gerDialog.tsx |       0 |        0 |       0 |       0 | 1-681             
 ...ents/subagents |       0 |        0 |       0 |       0 |                   
  constants.ts     |       0 |        0 |       0 |       0 | 1-71              
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
  reducers.tsx     |       0 |        0 |       0 |       0 | 1-190             
  types.ts         |       0 |        0 |       0 |       0 | 1-125             
  utils.ts         |       0 |        0 |       0 |       0 | 1-102             
 ...bagents/create |       0 |        0 |       0 |       0 |                   
  ...ionWizard.tsx |       0 |        0 |       0 |       0 | 1-299             
  ...rSelector.tsx |       0 |        0 |       0 |       0 | 1-85              
  ...onSummary.tsx |       0 |        0 |       0 |       0 | 1-331             
  ...tionInput.tsx |       0 |        0 |       0 |       0 | 1-177             
  ...dSelector.tsx |       0 |        0 |       0 |       0 | 1-63              
  ...nSelector.tsx |       0 |        0 |       0 |       0 | 1-58              
  ...EntryStep.tsx |       0 |        0 |       0 |       0 | 1-78              
  ToolSelector.tsx |       0 |        0 |       0 |       0 | 1-253             
 ...bagents/manage |   14.14 |    53.19 |    37.5 |   14.14 |                   
  ...ctionStep.tsx |       0 |        0 |       0 |       0 | 1-103             
  ...eleteStep.tsx |       0 |        0 |       0 |       0 | 1-62              
  ...tEditStep.tsx |       0 |        0 |       0 |       0 | 1-124             
  ...ctionStep.tsx |   35.61 |    59.52 |     100 |   35.61 | ...21-433,438-440 
  ...iewerStep.tsx |       0 |        0 |       0 |       0 | 1-73              
  ...gerDialog.tsx |       0 |        0 |       0 |       0 | 1-341             
 ...mponents/views |    70.1 |    72.89 |   61.11 |    70.1 |                   
  ContextUsage.tsx |   71.49 |    64.86 |      80 |   71.49 | ...30-436,473-567 
  DoctorReport.tsx |     9.8 |      100 |       0 |     9.8 | 25-54,57-131      
  ...sionsList.tsx |   88.05 |       75 |     100 |   88.05 | 70-77             
  McpStatus.tsx    |   92.01 |     73.8 |     100 |   92.01 | ...36,175-177,262 
  SkillsList.tsx   |   20.51 |      100 |       0 |   20.51 | 17-20,27-57       
  ToolsList.tsx    |     100 |      100 |     100 |     100 |                   
 src/ui/contexts   |   84.16 |    81.83 |   85.13 |   84.16 |                   
  ...ewContext.tsx |   64.83 |    88.88 |      50 |   64.83 | ...16-219,225-235 
  AppContext.tsx   |      80 |       50 |     100 |      80 | 19-20             
  ...ewContext.tsx |   93.83 |    68.51 |   42.85 |   93.83 | ...44,281-285,317 
  ...igContext.tsx |   81.81 |       50 |     100 |   81.81 | 15-16             
  ...ssContext.tsx |   85.65 |    84.85 |     100 |   85.65 | ...1612-1614,1620 
  ...owContext.tsx |   91.07 |    81.81 |     100 |   91.07 | 47-48,60-62       
  ...deContext.tsx |     100 |      100 |      50 |     100 |                   
  ...onContext.tsx |   80.77 |       80 |    92.3 |   80.77 | ...31-434,443-446 
  ...gsContext.tsx |     100 |      100 |     100 |     100 |                   
  ...usContext.tsx |     100 |      100 |     100 |     100 |                   
  ...ngContext.tsx |   71.42 |       50 |     100 |   71.42 | 17-20             
  ...utContext.tsx |   85.71 |      100 |   66.66 |   85.71 | 13-14             
  ...edContext.tsx |     100 |      100 |      50 |     100 |                   
  ...nsContext.tsx |   88.88 |       50 |     100 |   88.88 | 156-157           
  ...teContext.tsx |   86.66 |       50 |     100 |   86.66 | 235-236           
  ...deContext.tsx |      80 |     87.5 |      75 |      80 | ...11-112,118-120 
  ...rtContext.tsx |     100 |      100 |     100 |     100 |                   
 src/ui/daemon     |   88.35 |    73.51 |   95.45 |   88.35 |                   
  ...ui-adapter.ts |   88.35 |    73.51 |   95.45 |   88.35 | ...74,792-793,879 
 src/ui/editors    |       0 |        0 |       0 |       0 |                   
  ...ngsManager.ts |       0 |        0 |       0 |       0 | 1-67              
 src/ui/hooks      |   85.46 |    82.98 |   88.01 |   85.46 |                   
  ...dProcessor.ts |   85.53 |    85.13 |     100 |   85.53 | ...-970,1017-1018 
  ...ention-ref.ts |   97.72 |       84 |     100 |   97.72 | 65                
  keyToAnsi.ts     |    3.92 |      100 |       0 |    3.92 | 19-77             
  ...esourceRef.ts |     100 |      100 |     100 |     100 |                   
  ...completion.ts |     100 |    95.45 |     100 |     100 | 95                
  ...ention-ref.ts |     100 |      100 |     100 |     100 |                   
  ...dProcessor.ts |   94.62 |    73.58 |     100 |   94.62 | ...87-288,293-294 
  ...dProcessor.ts |   85.75 |     68.4 |   81.81 |   85.75 | ...1464,1485-1489 
  ...rt-command.ts |     100 |      100 |     100 |     100 |                   
  ...sced-flush.ts |     100 |      100 |     100 |     100 |                   
  ...ng-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...oice-input.ts |   92.36 |    81.95 |   66.66 |   92.36 | ...00,502-503,658 
  ...ke-repaint.ts |     100 |      100 |     100 |     100 |                   
  ...amingState.ts |   12.22 |      100 |       0 |   12.22 | 54-157            
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...dScrollbar.ts |     100 |      100 |     100 |     100 |                   
  ...ationFrame.ts |      42 |       75 |     100 |      42 | 42-44,53-59,62-87 
  ...odeCommand.ts |   58.82 |      100 |     100 |   58.82 | 28,33-48          
  ...enaCommand.ts |      85 |      100 |     100 |      85 | 23-24,29          
  ...aInProcess.ts |   27.92 |       80 |      25 |   27.92 | ...69-170,173-175 
  ...Completion.ts |   86.44 |    88.48 |     100 |   86.44 | ...14-515,525-541 
  ...ifications.ts |   87.82 |    96.77 |     100 |   87.82 | 138-152           
  ...tIndicator.ts |   88.28 |    81.57 |     100 |   88.28 | ...66,175,179-187 
  ...waySummary.ts |   96.26 |       75 |     100 |   96.26 | 126-128,170       
  ...ndTaskView.ts |   94.89 |    77.55 |     100 |   94.89 | 164-168,257,263   
  ...chedScroll.ts |     100 |      100 |     100 |     100 |                   
  ...ketedPaste.ts |    23.8 |      100 |       0 |    23.8 | 19-37             
  ...nchCommand.ts |   95.45 |    83.01 |     100 |   95.45 | ...60-161,285-288 
  ...ompletion.tsx |   97.09 |    87.09 |     100 |   97.09 | ...23-324,334-335 
  ...dMigration.ts |    92.1 |    88.88 |     100 |    92.1 | 42-44             
  useCompletion.ts |   96.29 |    90.56 |     100 |   96.29 | ...17-218,222-223 
  ...nitMessage.ts |     100 |      100 |     100 |     100 |                   
  ...extualTips.ts |   78.26 |       50 |     100 |   78.26 | ...2,75-79,96-104 
  ...eteCommand.ts |   89.52 |    90.69 |     100 |   89.52 | ...98-106,114-115 
  ...ialogClose.ts |   36.11 |       10 |     100 |   36.11 | ...89-195,202-207 
  useDiffData.ts   |       0 |        0 |       0 |       0 | 1-87              
  ...oublePress.ts |   53.12 |       75 |     100 |   53.12 | 33-35,41-54       
  ...orSettings.ts |     100 |      100 |     100 |     100 |                   
  ...Completion.ts |   99.12 |    97.67 |     100 |   99.12 | 182-183           
  ...ionUpdates.ts |   93.72 |    92.98 |     100 |   93.72 | ...87-291,314-320 
  ...agerDialog.ts |   88.88 |      100 |     100 |   88.88 | 21,25             
  ...backDialog.ts |    63.9 |    76.47 |   66.66 |    63.9 | ...66-168,190-191 
  useFocus.ts      |     100 |      100 |     100 |     100 |                   
  ...olderTrust.ts |     100 |    93.33 |     100 |     100 | 62                
  ...ggestions.tsx |   96.47 |    78.94 |     100 |   96.47 | 121,155-156       
  ...miniStream.ts |   86.08 |    81.23 |   76.92 |   86.08 | ...5198-5200,5202 
  ...BranchName.ts |     100 |    94.44 |     100 |     100 | 54                
  ...oryManager.ts |   98.38 |    98.85 |     100 |   98.38 | 141-144           
  ...ooksDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...stListener.ts |     100 |      100 |     100 |     100 |                   
  ...nAuthError.ts |   76.19 |       50 |     100 |   76.19 | 39-40,43-45       
  ...putHistory.ts |   92.59 |    85.71 |     100 |   92.59 | 63-64,72,94-96    
  ...storyStore.ts |     100 |    94.11 |     100 |     100 | 69                
  useKeypress.ts   |     100 |      100 |     100 |     100 |                   
  ...rdProtocol.ts |   36.36 |      100 |       0 |   36.36 | 24-31             
  ...unchEditor.ts |   22.58 |      100 |      50 |   22.58 | 11-32,44-85       
  ...gIndicator.ts |     100 |    96.66 |     100 |     100 | 109               
  useLogger.ts     |      16 |      100 |       0 |      16 | 15-45             
  useMCPHealth.ts  |   10.52 |      100 |       0 |   10.52 | 36-75             
  ...cpApproval.ts |   93.12 |    86.11 |     100 |   93.12 | ...24-127,139-140 
  useMcpDialog.ts  |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...moryDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...oryMonitor.ts |   83.14 |    78.57 |     100 |   83.14 | 54-63,74-79       
  ...ssageQueue.ts |     100 |     97.4 |     100 |     100 | 175,262           
  ...delCommand.ts |     100 |       96 |     100 |     100 | 61                
  ...ouseEvents.ts |   94.89 |       95 |   83.33 |   94.89 | 78-82             
  ...raseCycler.ts |   84.74 |    76.47 |     100 |   84.74 | ...49,52-53,69-71 
  ...rredEditor.ts |   58.33 |    22.22 |     100 |   58.33 | 23-27,29-33       
  ...derUpdates.ts |    87.4 |    78.78 |     100 |    87.4 | ...71,321-333,381 
  useQwenAuth.ts   |     100 |      100 |     100 |     100 |                   
  ...lScheduler.ts |   89.48 |    88.88 |     100 |   89.48 | ...54-456,489-499 
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-7               
  ...umeCommand.ts |   95.26 |    77.14 |     100 |   95.26 | 120-121,223-228   
  ...ompletion.tsx |   90.67 |    83.33 |     100 |   90.67 | ...02,105,138-141 
  ...ectionList.ts |   97.12 |    96.22 |     100 |   97.12 | ...92-193,247-250 
  ...sionPicker.ts |   92.87 |    90.35 |     100 |   92.87 | ...99-501,503-505 
  ...earchInput.ts |     100 |    97.29 |     100 |     100 | 82                
  ...ngsCommand.ts |   18.75 |      100 |       0 |   18.75 | 10-25             
  ...ellHistory.ts |   93.28 |    80.95 |     100 |   93.28 | ...96,153-154,164 
  ...oryCommand.ts |   85.48 |    58.33 |     100 |   85.48 | 22-28,40,71       
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...Completion.ts |   82.85 |    85.13 |   94.73 |   82.85 | ...78-680,688-724 
  ...tateAndRef.ts |     100 |      100 |     100 |     100 |                   
  ...tatsDialog.ts |     100 |      100 |     100 |     100 |                   
  useStatusLine.ts |   97.13 |    93.33 |     100 |   97.13 | ...78-382,478-485 
  ...eateDialog.ts |   88.23 |      100 |     100 |   88.23 | 14,18             
  ...mInProcess.ts |   27.35 |       80 |      25 |   27.35 | ...82-183,186-188 
  ...tification.ts |     100 |     87.5 |     100 |     100 | 50                
  ...alProgress.ts |   67.34 |    58.82 |   66.66 |   67.34 | 52-53,61-68,79-85 
  ...rminalSize.ts |     100 |      100 |     100 |     100 |                   
  ...emeCommand.ts |   67.01 |    29.41 |     100 |   67.01 | ...10-111,115-116 
  useTimer.ts      |   97.59 |    94.73 |     100 |   97.59 | 17-18             
  ...lMigration.ts |       0 |        0 |       0 |       0 |                   
  ...rustModify.ts |     100 |    90.47 |     100 |     100 | 112,134           
  useTurnDiffs.ts  |   95.12 |    78.57 |     100 |   95.12 | 133-134,156-157   
  ...elcomeBack.ts |   87.36 |     90.9 |     100 |   87.36 | ...,94-96,114-115 
  ...reeSession.ts |   93.75 |    72.72 |     100 |   93.75 | 47-48,72          
  vim.ts           |      74 |    67.56 |   69.23 |      74 | ...1854-1861,1869 
 src/ui/layouts    |    91.2 |    89.47 |     100 |    91.2 |                   
  ...AppLayout.tsx |    90.9 |     87.5 |     100 |    90.9 | 60-62,110-115,151 
  ...AppLayout.tsx |   91.66 |    92.85 |     100 |   91.66 | 75-80             
 src/ui/models     |   80.72 |       80 |   71.42 |   80.72 |                   
  ...ableModels.ts |   80.72 |       80 |   71.42 |   80.72 | ...,61-71,125-127 
 ...noninteractive |     100 |      100 |    6.66 |     100 |                   
  ...eractiveUi.ts |     100 |      100 |    6.66 |     100 |                   
 src/ui/selection  |   86.47 |    79.88 |   96.66 |   86.47 |                   
  screen-buffer.ts |   94.73 |    64.28 |     100 |   94.73 | 51-52             
  ...ion-coords.ts |     100 |      100 |     100 |     100 |                   
  ...ction-span.ts |   92.72 |       90 |     100 |   92.72 | 37-38,67-68       
  ...tion-state.ts |   85.71 |      100 |   88.88 |   85.71 | 51-58             
  ...ction-text.ts |   92.85 |    92.45 |     100 |   92.85 | 30-34,114-115     
  ...selection.tsx |   80.31 |    59.64 |     100 |   80.31 | ...13-314,330-331 
 src/ui/state      |      95 |    81.81 |     100 |      95 |                   
  extensions.ts    |      95 |    81.81 |     100 |      95 | 69-70,89          
 src/ui/themes     |    98.5 |    73.17 |     100 |    98.5 |                   
  ansi-light.ts    |     100 |      100 |     100 |     100 |                   
  ansi.ts          |     100 |      100 |     100 |     100 |                   
  atom-one-dark.ts |     100 |      100 |     100 |     100 |                   
  ayu-light.ts     |     100 |      100 |     100 |     100 |                   
  ayu.ts           |     100 |      100 |     100 |     100 |                   
  color-utils.ts   |   99.23 |    97.05 |     100 |   99.23 | 277-278           
  default-light.ts |     100 |      100 |     100 |     100 |                   
  default.ts       |     100 |      100 |     100 |     100 |                   
  ...inal-theme.ts |   88.59 |    85.96 |     100 |   88.59 | ...57-261,266-270 
  dracula.ts       |     100 |      100 |     100 |     100 |                   
  github-dark.ts   |     100 |      100 |     100 |     100 |                   
  github-light.ts  |     100 |      100 |     100 |     100 |                   
  googlecode.ts    |     100 |      100 |     100 |     100 |                   
  no-color.ts      |     100 |      100 |     100 |     100 |                   
  qwen-dark.ts     |     100 |      100 |     100 |     100 |                   
  qwen-light.ts    |     100 |      100 |     100 |     100 |                   
  ...tic-tokens.ts |     100 |      100 |     100 |     100 |                   
  ...-of-purple.ts |     100 |      100 |     100 |     100 |                   
  theme-manager.ts |   88.68 |    84.52 |     100 |   88.68 | ...83-392,397-398 
  theme.ts         |     100 |    38.02 |     100 |     100 | ...34-449,457-461 
  xcode.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/utils      |   87.13 |    85.34 |   95.62 |   87.13 |                   
  ...Colorizer.tsx |   80.31 |    85.41 |     100 |   80.31 | ...00-201,313-339 
  ...nRenderer.tsx |   79.84 |     75.6 |     100 |   79.84 | ...66,270,328-329 
  ...wnDisplay.tsx |   92.87 |    93.46 |     100 |   92.87 | ...,955,1002-1020 
  ...idDiagram.tsx |   87.79 |    95.34 |     100 |   87.79 | 156-179           
  ...eRenderer.tsx |   92.38 |    81.91 |   95.23 |   92.38 | ...43-746,799-804 
  ...odeDisplay.ts |   94.28 |    85.71 |     100 |   94.28 | 23,40             
  asciiCharts.ts   |    96.7 |     87.5 |     100 |    96.7 | 170-177,278       
  ...dWorkUtils.ts |     100 |      100 |     100 |     100 |                   
  ...boardUtils.ts |    52.9 |    74.15 |    92.3 |    52.9 | ...29,632-641,644 
  commandUtils.ts  |   98.38 |    92.38 |     100 |   98.38 | 108,136-137,343   
  computeStats.ts  |     100 |      100 |     100 |     100 |                   
  customBanner.ts  |   90.68 |    91.22 |     100 |   90.68 | ...13,324-327,334 
  displayUtils.ts  |   73.84 |    73.91 |     100 |   73.84 | ...34,36-40,42-46 
  formatters.ts    |   94.87 |    98.18 |     100 |   94.87 | 116-119           
  goal-runtime.ts  |   91.42 |       95 |     100 |   91.42 | 32-34             
  gradientUtils.ts |     100 |      100 |     100 |     100 |                   
  highlight.ts     |     100 |      100 |     100 |     100 |                   
  ...gap-notice.ts |     100 |      100 |     100 |     100 |                   
  ...oryMapping.ts |     100 |       95 |     100 |     100 | 44,103            
  historyUtils.ts  |   96.03 |     97.1 |     100 |   96.03 | 103-106           
  ...mage-parts.ts |   97.75 |    94.87 |     100 |   97.75 | 82-83             
  inline-math.ts   |   98.48 |    95.23 |     100 |   98.48 | 129-130           
  input-mouse.ts   |     100 |    85.71 |     100 |     100 | 48,93             
  isNarrowWidth.ts |     100 |      100 |     100 |     100 |                   
  ...olDetector.ts |   68.81 |       75 |   66.66 |   68.81 | ...27-132,160-161 
  latexRenderer.ts |   94.95 |     73.8 |     100 |   94.95 | ...76-178,184-187 
  layoutUtils.ts   |     100 |      100 |     100 |     100 |                   
  list-mouse.ts    |     100 |      100 |     100 |     100 |                   
  ...ightLoader.ts |     100 |       95 |     100 |     100 | 81                
  ...nUtilities.ts |   98.72 |    94.36 |     100 |   98.72 | 145-146           
  ...t-position.ts |     100 |     87.5 |     100 |     100 | 85                
  ...geRenderer.ts |   86.51 |    70.16 |   95.12 |   86.51 | ...1286,1326-1332 
  ...alRenderer.ts |   86.69 |     71.9 |     100 |   86.69 | ...1476,1513-1519 
  ...lsBySource.ts |     100 |    95.23 |     100 |     100 | 84                
  mouse.ts         |   92.85 |    74.19 |     100 |   92.85 | ...38,145,149-152 
  osc8.ts          |   90.43 |    78.33 |     100 |   90.43 | ...59,244,248-249 
  ...red-height.ts |   98.38 |    97.14 |     100 |   98.38 | 195-197           
  ...mConstants.ts |     100 |      100 |     100 |     100 |                   
  restoreGoal.ts   |     100 |      100 |     100 |     100 |                   
  ...storyUtils.ts |   82.73 |    79.48 |     100 |   82.73 | ...84-606,737-738 
  ...ickerUtils.ts |     100 |      100 |     100 |     100 |                   
  ...evel-label.ts |   77.77 |    66.66 |     100 |   77.77 | 18,22-24          
  ...are-cursor.ts |   89.47 |    85.71 |     100 |   89.47 | 39-44             
  ...ataService.ts |   93.17 |     79.1 |     100 |   93.17 | ...14,227,254-256 
  suggestions.ts   |     100 |      100 |     100 |     100 |                   
  ...izedOutput.ts |   94.94 |      100 |   88.88 |   94.94 | 112-117           
  ...nal-buffer.ts |     100 |      100 |     100 |     100 |                   
  ...e-renderer.ts |   90.61 |    83.44 |     100 |   90.61 | ...80,482-484,607 
  ...wOptimizer.ts |     100 |    96.77 |     100 |     100 | 69                
  terminalSetup.ts |    4.37 |      100 |       0 |    4.37 | 44-393            
  textUtils.ts     |   97.94 |    95.45 |   94.11 |   97.94 | ...82-283,443-444 
  ...background.ts |     100 |      100 |     100 |     100 |                   
  todoSnapshot.ts  |   90.42 |    92.85 |     100 |   90.42 | ...06-207,240-241 
  ...isplay-map.ts |     100 |      100 |     100 |     100 |                   
  updateCheck.ts   |     100 |    92.75 |     100 |     100 | 227-239,331       
  ...ow-keyword.ts |     100 |      100 |     100 |     100 |                   
 ...i/utils/export |   75.03 |     60.3 |   94.59 |   75.03 |                   
  collect.ts       |   71.27 |    66.38 |      96 |   71.27 | ...90-633,655-656 
  index.ts         |     100 |      100 |     100 |     100 |                   
  normalize.ts     |   80.42 |    50.68 |     100 |   80.42 | ...59-364,376-378 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
  utils.ts         |     100 |      100 |     100 |     100 |                   
 ...ort/formatters |   52.92 |    47.22 |   71.42 |   52.92 |                   
  html.ts          |   84.61 |       50 |     100 |   84.61 | ...53,57-58,62-63 
  json.ts          |     100 |      100 |     100 |     100 |                   
  jsonl.ts         |   82.45 |     37.5 |     100 |   82.45 | ...48,50-51,65-66 
  markdown.ts      |   36.32 |    47.05 |      50 |   36.32 | ...16-219,233-295 
 src/ui/voice      |   81.27 |    79.92 |   81.94 |   81.27 |                   
  ...d-recorder.ts |     6.2 |      100 |       0 |     6.2 | ...33-159,162-163 
  ...o-recorder.ts |   84.61 |    93.33 |   57.14 |   84.61 | ...16-117,131-136 
  ...me-session.ts |   91.09 |     92.1 |     100 |   91.09 | ...99,305,316-319 
  sox-recorder.ts  |    92.7 |    71.87 |     100 |    92.7 | ...34-135,153-154 
  ...ailability.ts |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |     100 |      100 |     100 |     100 |                   
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  ...e-recorder.ts |   88.29 |    67.74 |   81.81 |   88.29 | ...,98-99,112,115 
  voice-refine.ts  |     100 |    93.33 |     100 |     100 | 92                
  ...ream-retry.ts |   86.79 |       70 |     100 |   86.79 | 16-18,48-49,59-60 
  ...am-session.ts |   88.02 |    66.66 |   84.61 |   88.02 | ...26,343-345,363 
  ...ranscriber.ts |     100 |      100 |     100 |     100 |                   
 src/utils         |    81.5 |    87.04 |   92.57 |    81.5 |                   
  ...p-profiler.ts |   98.39 |    92.59 |     100 |   98.39 | 141,185,235       
  acpModelUtils.ts |   97.36 |    95.19 |     100 |   97.36 | ...09-210,214-215 
  apiPreconnect.ts |   96.74 |    94.59 |     100 |   96.74 | 167-170           
  ...ol-call-id.ts |   84.61 |       60 |     100 |   84.61 | 26-27,37-38       
  ...ng-failure.ts |     100 |       95 |     100 |     100 | 72                
  checks.ts        |   33.33 |      100 |       0 |   33.33 | 23-28             
  ...-api-error.ts |     100 |    96.42 |     100 |     100 | 14                
  cleanup.ts       |   84.05 |    94.11 |      80 |   84.05 | 80,111-121        
  commands.ts      |   97.45 |    96.66 |     100 |   97.45 | 153-155           
  ...Calculator.ts |     100 |      100 |     100 |     100 |                   
  cpuProfiler.ts   |   70.73 |    73.23 |   88.88 |   70.73 | ...27,430-431,438 
  deepMerge.ts     |     100 |    89.65 |     100 |     100 | 41-43,49          
  ...re-runtime.ts |     100 |      100 |     100 |     100 |                   
  ...ScopeUtils.ts |   97.56 |    88.88 |     100 |   97.56 | 67                
  doctorChecks.ts  |   70.31 |    74.57 |     100 |   70.31 | ...95-301,325-341 
  ...putCapture.ts |   90.65 |    86.31 |     100 |   90.65 | ...73,371,373-374 
  ...arResolver.ts |   97.14 |    96.55 |     100 |   97.14 | 125-126           
  errors.ts        |   97.56 |    94.64 |     100 |   97.56 | 69-70,304-305     
  events.ts        |     100 |      100 |     100 |     100 |                   
  ...on-mention.ts |   88.48 |     82.6 |     100 |   88.48 | ...56-160,164-168 
  gitUtils.ts      |   92.85 |    86.66 |     100 |   92.85 | ...13-116,164-167 
  ...AutoUpdate.ts |    93.1 |       94 |      90 |    93.1 | 103,108,179-190   
  ...tyWarnings.ts |     100 |      100 |     100 |     100 |                   
  ...lationInfo.ts |   97.68 |    94.28 |     100 |   97.68 | ...64,381-382,427 
  jsonc-editor.ts  |   93.18 |    92.72 |     100 |   93.18 | ...80-381,384-385 
  languageUtils.ts |   98.88 |    97.05 |     100 |   98.88 | 184-185           
  load-undici.ts   |     100 |      100 |     100 |     100 |                   
  ...npm-update.ts |   89.31 |    77.33 |     100 |   89.31 | ...87,303-304,344 
  math.ts          |       0 |        0 |       0 |       0 | 1-15              
  ...er-mention.ts |     100 |    66.66 |     100 |     100 | 14,30,44-46       
  ...iagnostics.ts |   94.57 |    83.01 |   88.88 |   94.57 | ...05,311,315-317 
  ...serMessage.ts |     100 |      100 |     100 |     100 |                   
  ...onfigUtils.ts |   94.25 |    91.17 |     100 |   94.25 | ...30,436,439-443 
  ...iveHelpers.ts |   95.13 |    91.79 |     100 |   95.13 | ...53-454,552,565 
  osc.ts           |   97.18 |      100 |    87.5 |   97.18 | 182-183           
  package.ts       |   88.88 |    85.71 |     100 |   88.88 | 31-32             
  ...uggestions.ts |   84.29 |    70.83 |     100 |   84.29 | 70-76,92-103      
  processUtils.ts  |    92.3 |       80 |     100 |    92.3 | 45-46             
  readStdin.ts     |   93.67 |    94.11 |   85.71 |   93.67 | 79-83             
  relaunch.ts      |   95.87 |    89.28 |     100 |   95.87 | 103-105,131       
  resolvePath.ts   |     100 |      100 |     100 |     100 |                   
  runBudget.ts     |   99.35 |    96.77 |     100 |   99.35 | 119               
  sandbox-path.ts  |     100 |      100 |     100 |     100 |                   
  sandbox.ts       |   45.87 |    56.93 |   76.92 |   45.87 | ...1040,1052-1075 
  ...xImageName.ts |     100 |    77.77 |     100 |     100 | 10,18             
  sandboxMounts.ts |     100 |      100 |     100 |     100 |                   
  sessionPaths.ts  |   90.84 |    90.56 |     100 |   90.84 | ...81-182,185-186 
  settingsUtils.ts |   82.35 |    89.57 |      90 |   82.35 | ...25-743,750-758 
  spawnWrapper.ts  |     100 |      100 |     100 |     100 |                   
  ...ate-verify.ts |     100 |      100 |     100 |     100 |                   
  ...one-update.ts |   39.81 |    77.44 |   62.16 |   39.81 | ...1193,1196-1215 
  ...upProfiler.ts |   98.47 |    94.66 |     100 |   98.47 | 132-133,308       
  ...upWarnings.ts |     100 |      100 |     100 |     100 |                   
  stdioHelpers.ts  |     100 |       90 |     100 |     100 | 23                
  systemInfo.ts    |   95.12 |    90.27 |     100 |   95.12 | ...54-255,260-264 
  ...InfoFields.ts |    87.5 |    65.85 |     100 |    87.5 | ...24-125,146-147 
  ...alSequence.ts |     100 |    97.61 |     100 |     100 | 60                
  ...iffPreview.ts |   76.47 |       25 |     100 |   76.47 | 13,17,23-24       
  ...on-handler.ts |    73.8 |       75 |     100 |    73.8 | 17-18,25-26,67-73 
  ...e-relaunch.ts |   89.61 |    86.66 |      50 |   89.61 | 56-61,83-84       
  ...entEmitter.ts |     100 |      100 |     100 |     100 |                   
  ...ansionHook.ts |     100 |      100 |     100 |     100 |                   
  ...upWarnings.ts |   87.75 |       75 |     100 |   87.75 | 47-48,53-54,57-58 
  version.ts       |     100 |    66.66 |     100 |     100 | 11                
  ...ingHandler.ts |     100 |      100 |     100 |     100 |                   
  windowTitle.ts   |   95.45 |    93.33 |     100 |   95.45 | 54-55             
  ...WithBackup.ts |   65.04 |    77.77 |     100 |   65.04 | 97,112,133-172    
 ...s/housekeeping |   91.63 |    91.02 |      95 |   91.63 |                   
  cleanup.ts       |   95.77 |    95.83 |     100 |   95.77 | 70-72             
  ...eractionAt.ts |     100 |      100 |     100 |     100 |                   
  scheduler.ts     |   91.91 |    90.47 |    87.5 |   91.91 | 58-62,73,131-135  
  throttledOnce.ts |   86.66 |     86.2 |     100 |   86.66 | ...99,105,137-138 
-------------------|---------|----------|---------|---------|-------------------
Core Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   87.85 |    86.35 |   89.39 |   87.85 |                   
 src               |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/__mocks__/fs  |       0 |        0 |       0 |       0 |                   
  promises.ts      |       0 |        0 |       0 |       0 | 1-48              
 src/agents        |   90.38 |    84.54 |   94.85 |   90.38 |                   
  ...transcript.ts |   87.63 |    83.52 |     100 |   87.63 | ...80,588,594-598 
  ...ent-resume.ts |   85.59 |    77.55 |   83.33 |   85.59 | ...1793-1797,1800 
  ...ound-tasks.ts |   94.63 |    90.13 |   96.38 |   94.63 | ...1773,1793-1796 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ent-result.ts |    96.8 |    92.68 |     100 |    96.8 | 106,129-131       
  ...n-registry.ts |   94.79 |     87.7 |     100 |   94.79 | ...1067,1081-1083 
  ...w-snapshot.ts |   92.12 |    77.14 |     100 |   92.12 | ...65,189,196-198 
 src/agents/arena  |   76.32 |    67.71 |   78.94 |   76.32 |                   
  ...gentClient.ts |   79.47 |    88.88 |   81.81 |   79.47 | ...68-183,189-204 
  ArenaManager.ts  |   75.11 |    64.51 |   78.57 |   75.11 | ...1887,1893-1894 
  arena-events.ts  |   64.44 |      100 |      50 |   64.44 | ...71-175,178-183 
  diff-summary.ts  |    87.5 |    72.34 |     100 |    87.5 | ...32-133,137-138 
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...gents/backends |   78.09 |    85.23 |   76.28 |   78.09 |                   
  ITermBackend.ts  |   97.97 |    93.93 |     100 |   97.97 | ...78-180,255,307 
  ...essBackend.ts |    90.9 |    85.36 |   93.33 |    90.9 | ...70,672,674-675 
  TmuxBackend.ts   |    90.7 |    76.55 |   97.36 |    90.7 | ...87,697,743-747 
  detect.ts        |   31.25 |      100 |       0 |   31.25 | 34-88             
  index.ts         |     100 |      100 |     100 |     100 |                   
  iterm-it2.ts     |     100 |     92.1 |     100 |     100 | 37-38,106         
  tmux-commands.ts |    6.64 |      100 |    3.03 |    6.64 | ...93-363,386-503 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...agents/runtime |    91.1 |    86.68 |   89.23 |    91.1 |                   
  agent-context.ts |     100 |      100 |     100 |     100 |                   
  agent-core.ts    |   85.07 |     76.8 |   77.77 |   85.07 | ...2291,2337-2339 
  agent-events.ts  |     100 |      100 |     100 |     100 |                   
  ...t-headless.ts |   93.49 |    89.41 |   83.33 |   93.49 | ...96-497,500-501 
  ...nteractive.ts |   81.01 |    82.35 |   76.66 |   81.01 | ...33,535-538,541 
  ...statistics.ts |   98.29 |    82.55 |     100 |   98.29 | 141,165,206,239   
  agent-types.ts   |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ool-policy.ts |   98.34 |      100 |    92.3 |   98.34 | 81-82             
  ...low-budget.ts |     100 |      100 |     100 |     100 |                   
  ...-scheduler.ts |   97.43 |    96.36 |     100 |   97.43 | 128-130           
  ...ow-journal.ts |   91.76 |    75.86 |     100 |   91.76 | ...38-139,179-181 
  ...chestrator.ts |    92.4 |       90 |   83.78 |    92.4 | ...1862,1911-1914 
  ...ow-prompts.ts |     100 |      100 |     100 |     100 |                   
  ...low-runner.ts |   94.85 |     87.5 |   92.85 |   94.85 | ...93,260,280-283 
  ...ow-sandbox.ts |   96.85 |    91.28 |     100 |   96.85 | ...1705,1711-1712 
  ...flow-saved.ts |   96.51 |    94.36 |     100 |   96.51 | 134-135,234-237   
  ...flow-stall.ts |    97.9 |    83.33 |     100 |    97.9 | 138-139,236       
 src/agents/tasks  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/agents/team   |   82.04 |    84.17 |   88.97 |   82.04 |                   
  TeamManager.ts   |   72.02 |    79.41 |   79.24 |   72.02 | ...1632,1655-1656 
  identity.ts      |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...sionBridge.ts |     100 |      100 |     100 |     100 |                   
  mailbox.ts       |   96.02 |    87.23 |     100 |   96.02 | 352-358           
  ...ptAddendum.ts |     100 |      100 |     100 |     100 |                   
  tasks.ts         |   89.24 |    82.82 |     100 |   89.24 | ...-994,1038-1039 
  team-events.ts   |   60.52 |      100 |      50 |   60.52 | ...40-144,151-155 
  teamHelpers.ts   |   92.02 |    94.91 |   95.23 |   92.02 | ...31-332,368-378 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...eam/test-utils |   94.39 |    94.26 |   98.21 |   94.39 |                   
  ...on-harness.ts |   96.49 |    84.21 |     100 |   96.49 | 128-129,141-142   
  fake-agent.ts    |   98.49 |    95.08 |     100 |   98.49 | 201-203           
  fake-backend.ts  |   86.46 |    97.61 |   95.83 |   86.46 | 124-146           
 src/config        |   84.98 |    87.13 |   75.37 |   84.98 |                   
  approval-mode.ts |     100 |      100 |     100 |     100 |                   
  ...xtDefaults.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   84.29 |    86.85 |   73.79 |   84.29 | ...8350,8354-8355 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  models.ts        |     100 |      100 |     100 |     100 |                   
  storage.ts       |   94.39 |    91.57 |   88.23 |   94.39 | ...45-446,449-450 
 ...nfirmation-bus |   98.27 |    97.14 |     100 |   98.27 |                   
  message-bus.ts   |   98.14 |    97.05 |     100 |   98.14 | 42-43             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/core          |   92.34 |    88.04 |   93.26 |   92.34 |                   
  baseLlmClient.ts |    88.4 |     83.8 |   81.81 |    88.4 | ...59,672,678-680 
  client.ts        |   91.95 |    87.18 |   91.56 |   91.95 | ...3928,4026-4027 
  ...tGenerator.ts |   86.34 |    87.34 |   84.61 |   86.34 | ...96-497,542-548 
  ...lScheduler.ts |   90.04 |    84.67 |   96.15 |   90.04 | ...6215,6243-6259 
  geminiChat.ts    |    94.7 |    90.12 |   95.53 |    94.7 | ...5052,5100-5101 
  geminiRequest.ts |     100 |      100 |     100 |     100 |                   
  genai-compat.ts  |     100 |      100 |     100 |     100 |                   
  ...MediaLimit.ts |     100 |       96 |     100 |     100 | 96                
  ...htProtocol.ts |    9.09 |      100 |       0 |    9.09 | ...9,62-66,69-110 
  ...ream-error.ts |     100 |      100 |     100 |     100 |                   
  logger.ts        |   87.41 |    87.02 |     100 |   87.41 | ...64-568,614-628 
  ...lay-buffer.ts |     100 |      100 |     100 |     100 |                   
  ...dispatcher.ts |     100 |      100 |     100 |     100 |                   
  ...tyDefaults.ts |     100 |      100 |     100 |     100 |                   
  ...olExecutor.ts |   93.54 |    83.33 |      50 |   93.54 | 49-50             
  ...on-helpers.ts |   93.49 |    78.57 |     100 |   93.49 | ...10-211,228-229 
  ...issionFlow.ts |   98.97 |    96.96 |     100 |   98.97 | 107               
  ...try-policy.ts |     100 |      100 |     100 |     100 |                   
  ...ell-policy.ts |   94.89 |    88.54 |     100 |   94.89 | ...51-252,297-298 
  prompts.ts       |   93.64 |    91.42 |   83.33 |   93.64 | ...1209,1412-1413 
  ...ing-effort.ts |     100 |      100 |     100 |     100 |                   
  ...n-recovery.ts |   95.13 |       80 |     100 |   95.13 | ...06-107,142-144 
  ...t-profiler.ts |    97.9 |    81.15 |   88.23 |    97.9 | 117,124-125,130   
  ...port-retry.ts |     100 |      100 |     100 |     100 |                   
  tokenLimits.ts   |     100 |     92.1 |     100 |     100 | 87,122-139        
  ...reparation.ts |     100 |      100 |     100 |     100 |                   
  ...tion-guard.ts |   90.38 |    94.73 |     100 |   90.38 | 68-72             
  ...allIdUtils.ts |   98.41 |    93.47 |     100 |   98.41 | 36,45             
  ...okTriggers.ts |   99.45 |    92.43 |     100 |   99.45 | 182,193           
  ...terruption.ts |     100 |     92.3 |     100 |     100 | 86,104            
  turn.ts          |   98.67 |    93.12 |     100 |   98.67 | ...79,707-708,755 
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   96.33 |    88.12 |   96.15 |   96.33 |                   
  ...tGenerator.ts |   97.24 |    86.72 |   94.87 |   97.24 | ...1429,1458,1469 
  converter.ts     |   96.19 |    89.25 |     100 |   96.19 | ...1329,1550-1552 
  index.ts         |       0 |        0 |       0 |       0 | 1-21              
  usage.ts         |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   88.78 |    72.36 |   89.47 |   88.78 |                   
  ...tGenerator.ts |   87.18 |    71.83 |   88.88 |   87.18 | ...58-364,382-383 
  index.ts         |     100 |       80 |     100 |     100 | 50                
 ...ntentGenerator |    95.6 |    88.74 |    92.3 |    95.6 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |   95.52 |    87.88 |   91.89 |   95.52 | ...1195-1196,1224 
  ...tDetection.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   91.63 |    90.43 |   95.61 |   91.63 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  converter.ts     |   91.15 |    89.32 |   96.87 |   91.15 | ...1914,2083-2098 
  errorHandler.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |   60.31 |       75 |      50 |   60.31 | ...71,74-78,90-94 
  ...tGenerator.ts |    66.4 |    70.58 |   88.88 |    66.4 | ...51-157,168-169 
  pipeline.ts      |   95.45 |    91.18 |     100 |   95.45 | ...1301,1309,1408 
  ...ix-caching.ts |   95.23 |    92.85 |     100 |   95.23 | 45-46,69-70       
  ...ureContext.ts |     100 |      100 |     100 |     100 |                   
  ...ingOptions.ts |       0 |        0 |       0 |       0 | 1                 
  ...CallParser.ts |   92.24 |     92.4 |     100 |   92.24 | ...28-529,549-552 
  ...kingParser.ts |     100 |    96.87 |     100 |     100 | 42                
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...rator/provider |   97.19 |    90.44 |   98.36 |   97.19 |                   
  dashscope.ts     |   98.36 |    92.99 |   95.65 |   98.36 | ...93-494,636-637 
  deepseek.ts      |   94.91 |    89.36 |     100 |   94.91 | ...31-132,145-146 
  default.ts       |   99.16 |    96.96 |     100 |   99.16 | 198               
  index.ts         |     100 |      100 |     100 |     100 |                   
  mimo.ts          |   94.11 |    66.66 |     100 |   94.11 | 29,52-53          
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  mistral.ts       |   96.07 |    73.33 |     100 |   96.07 | 32-33             
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 |                   
  utils.ts         |     100 |      100 |     100 |     100 |                   
  zai.ts           |   92.13 |    82.14 |     100 |   92.13 | ...,39-40,135-137 
 src/extension     |   87.27 |    84.01 |   92.52 |   87.27 |                   
  ...ive-safety.ts |     100 |      100 |     100 |     100 |                   
  ...-converter.ts |   80.55 |    73.66 |     100 |   80.55 | ...1133,1179-1180 
  corruptFile.ts   |     100 |       50 |     100 |     100 | 40-45             
  ...-converter.ts |     100 |      100 |     100 |     100 |                   
  ...me-refresh.ts |     100 |      100 |     100 |     100 |                   
  ...sion-store.ts |   90.85 |    86.38 |   97.87 |   90.85 | ...1218-1224,1268 
  ...ionManager.ts |   82.24 |    80.14 |   81.52 |   82.24 | ...2730,2752-2753 
  ...references.ts |     100 |     90.9 |     100 |     100 | ...05,129,197,200 
  ...onSettings.ts |    92.3 |     94.4 |     100 |    92.3 | ...98-501,570-571 
  ...-converter.ts |    75.9 |    85.36 |   85.71 |    75.9 | ...98,202,214-248 
  github.ts        |   90.42 |    82.66 |     100 |   90.42 | ...0,990-991,1001 
  http-client.ts   |   84.61 |       80 |     100 |   84.61 | 20-21             
  i18n.ts          |   78.26 |       96 |      50 |   78.26 | 104-110,116-123   
  index.ts         |     100 |      100 |     100 |     100 |                   
  marketplace.ts   |   88.39 |    83.11 |     100 |   88.39 | ...08,494,507-508 
  ...ork-policy.ts |   89.72 |       90 |     100 |   89.72 | ...36,148-154,156 
  npm.ts           |   89.02 |    81.81 |     100 |   89.02 | ...86-688,695-700 
  override.ts      |   94.11 |    93.33 |     100 |   94.11 | 63-64,81-82       
  ...-converter.ts |   94.89 |    90.41 |     100 |   94.89 | ...50-151,222-224 
  redaction.ts     |     100 |      100 |     100 |     100 |                   
  settings.ts      |   66.26 |      100 |      50 |   66.26 | 81-107,141-146    
  ...ceRegistry.ts |   94.01 |    83.14 |     100 |   94.01 | ...38-344,365-366 
  storage.ts       |     100 |      100 |     100 |     100 |                   
  ...ableSchema.ts |     100 |      100 |     100 |     100 |                   
  variables.ts     |   88.95 |    84.21 |     100 |   88.95 | ...32-235,238-241 
  ...extraction.ts |   85.77 |       81 |   89.47 |   85.77 | ...02-205,260-261 
 src/followup      |    79.9 |    78.92 |    90.9 |    79.9 |                   
  followupState.ts |   98.44 |    95.74 |     100 |   98.44 | 236-237           
  index.ts         |     100 |      100 |     100 |     100 |                   
  overlayFs.ts     |   96.29 |    88.88 |     100 |   96.29 | 78,108,122        
  speculation.ts   |   71.76 |    64.76 |   71.42 |   71.76 | ...53-654,661-662 
  ...onToolGate.ts |   97.97 |     87.5 |     100 |   97.97 | 105,110           
  ...nGenerator.ts |   72.03 |    81.15 |   83.33 |   72.03 | ...68-219,331-333 
 src/generated     |       0 |        0 |       0 |       0 |                   
  git-commit.ts    |       0 |        0 |       0 |       0 | 1-10              
 src/goals         |    93.3 |    89.05 |    94.6 |    93.3 |                   
  ...eGoalStore.ts |   87.61 |    88.88 |   86.66 |   87.61 | ...85-188,196-204 
  ...t-verifier.ts |   96.27 |     90.9 |     100 |   96.27 | ...20,143-146,163 
  ...checkpoint.ts |   81.48 |    76.19 |     100 |   81.48 | ...02-105,115-118 
  goal-evidence.ts |   88.79 |     88.5 |   96.42 |   88.79 | ...04-805,828-831 
  ...projection.ts |   66.66 |    72.97 |   33.33 |   66.66 | ...83,186,190-192 
  ...ersistence.ts |   87.73 |    84.84 |      80 |   87.73 | ...-94,97,101-106 
  goal-protocol.ts |   95.74 |    93.33 |     100 |   95.74 | 154-155           
  goal-reducer.ts  |    93.4 |    90.65 |   96.96 |    93.4 | ...27,501,519-520 
  goal-runtime.ts  |   97.62 |     89.9 |     100 |   97.62 | ...1049,1169-1170 
  goal-tools.ts    |   98.22 |    93.02 |      95 |   98.22 | ...46-147,248-249 
  ...rn-context.ts |     100 |      100 |     100 |     100 |                   
  goal-verifier.ts |   92.46 |    92.85 |     100 |   92.46 | ...69-172,185-187 
  goal-wire.ts     |       0 |        0 |       0 |       0 | 1-28              
  goalHook.ts      |   96.91 |    92.42 |     100 |   96.91 | 115-120,221-222   
  goalJudge.ts     |   95.84 |    87.09 |     100 |   95.84 | ...55-356,448-449 
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/hooks         |   88.07 |    86.23 |   88.54 |   88.07 |                   
  ...okRegistry.ts |   86.48 |    77.08 |     100 |   86.48 | ...41-344,362-369 
  ...bortSignal.ts |     100 |      100 |     100 |     100 |                   
  context-usage.ts |     100 |      100 |     100 |     100 |                   
  ...terpolator.ts |   96.66 |    93.33 |     100 |   96.66 | 66-67             
  ...HookRunner.ts |   96.68 |    87.23 |     100 |   96.68 | 110-112,231-233   
  ...Aggregator.ts |   96.57 |    91.48 |     100 |   96.57 | ...20-321,402,404 
  ...entHandler.ts |   95.57 |    84.76 |   94.73 |   95.57 | ...1040-1041,1051 
  hookPlanner.ts   |   87.55 |    85.54 |   86.66 |   87.55 | ...22-226,233-244 
  hookRegistry.ts  |   92.53 |    85.43 |     100 |   92.53 | ...39,458,462,466 
  hookRunner.ts    |   62.65 |    72.34 |   66.66 |   62.65 | ...70-771,780-781 
  hookSystem.ts    |   87.64 |     98.5 |   70.83 |   87.64 | ...58-759,765-766 
  ...HookRunner.ts |   79.06 |    66.66 |      80 |   79.06 | ...33-434,452-456 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...edCallback.ts |     100 |      100 |     100 |     100 |                   
  ...HookRunner.ts |   94.19 |    84.37 |   81.81 |   94.19 | ...76-384,458-459 
  ...SkillHooks.ts |   78.75 |       75 |   66.66 |   78.75 | 62-66,137-152     
  ...oksManager.ts |   94.87 |    88.88 |     100 |   94.87 | ...84,325,327-329 
  ssrfGuard.ts     |   86.45 |    87.91 |     100 |   86.45 | ...85,289-295,301 
  stopHookCap.ts   |     100 |      100 |     100 |     100 |                   
  trustedHooks.ts  |      90 |    52.63 |     100 |      90 | ...53,66-67,97-98 
  types.ts         |   94.25 |    96.09 |   88.88 |   94.25 | ...46-547,632-636 
  urlValidator.ts  |     100 |      100 |     100 |     100 |                   
  ...it-context.ts |     100 |      100 |     100 |     100 |                   
 src/ide           |   76.98 |    85.03 |   79.03 |   76.98 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  detect-ide.ts    |     100 |      100 |     100 |     100 |                   
  ide-client.ts    |   69.16 |    84.65 |   68.29 |   69.16 | ...1068,1097-1105 
  ide-installer.ts |   89.06 |    79.31 |     100 |   89.06 | ...36,143-147,160 
  ideContext.ts    |     100 |      100 |     100 |     100 |                   
  process-utils.ts |   84.84 |    71.79 |     100 |   84.84 | ...37,151,193-194 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/lsp           |   58.96 |    70.57 |   66.14 |   58.96 |                   
  ...nfigLoader.ts |   80.55 |       72 |   95.45 |   80.55 | ...02-504,508-514 
  ...ionFactory.ts |   42.81 |    73.07 |      50 |   42.81 | ...76-427,433-450 
  ...Normalizer.ts |   23.09 |    13.72 |   30.43 |   23.09 | ...04-905,909-924 
  ...verManager.ts |   75.73 |     80.1 |   79.66 |   75.73 | ...1346,1352-1382 
  ...eLspClient.ts |   32.78 |       80 |   16.66 |   32.78 | ...89-293,299-300 
  ...LspService.ts |      60 |    73.36 |   78.26 |      60 | ...1575,1635-1645 
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/mcp           |    82.3 |    77.81 |   78.33 |    82.3 |                   
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...h-provider.ts |   86.95 |      100 |   33.33 |   86.95 | ...,93,97,101-102 
  ...h-provider.ts |   79.31 |    58.06 |     100 |   79.31 | ...26-933,940-942 
  ...en-storage.ts |   98.78 |    97.95 |     100 |   98.78 | 106-107           
  oauth-utils.ts   |   73.61 |    85.48 |    92.3 |   73.61 | ...46-366,392-421 
  ...n-provider.ts |   89.83 |       96 |   45.45 |   89.83 | ...43,147,151-152 
 .../token-storage |   82.12 |    88.19 |   89.28 |   82.12 |                   
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   87.08 |    87.03 |   95.23 |   87.08 | ...00-201,214-215 
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   68.14 |    82.35 |   64.28 |   68.14 | ...81-295,298-314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/memory        |   87.83 |    83.94 |   90.47 |   87.83 |                   
  ...y-document.ts |   89.52 |    84.61 |     100 |   89.52 | ...24-325,329-330 
  ...nel-memory.ts |   97.36 |    96.63 |   96.42 |   97.36 | ...91-293,367-368 
  const.ts         |   94.28 |     92.3 |     100 |   94.28 | 66-67             
  dream.ts         |    64.6 |    72.22 |      50 |    64.6 | ...04-109,124-165 
  ...entPlanner.ts |     100 |    83.33 |     100 |     100 | 136,146           
  entries.ts       |   75.59 |    84.84 |   83.33 |   75.59 | ...56-157,172-180 
  extract.ts       |   92.41 |    79.41 |     100 |   92.41 | 56-61,100,119-122 
  ...entPlanner.ts |   91.59 |    76.74 |     100 |   91.59 | ...05,114-117,293 
  ...ionPlanner.ts |       0 |        0 |       0 |       0 | 1                 
  forget.ts        |   81.83 |       75 |   83.33 |   81.83 | ...51,474,478-507 
  indexer.ts       |   94.14 |       84 |     100 |   94.14 | ...32-233,334,337 
  ...kill-agent.ts |   97.94 |    89.36 |     100 |   97.94 | 82-83,179-180     
  manager.ts       |    78.4 |    82.29 |   77.77 |    78.4 | ...1482,1495-1497 
  ...ent-config.ts |   86.99 |    82.69 |   86.36 |   86.99 | ...69,389,396-402 
  memoryAge.ts     |   90.47 |       80 |     100 |   90.47 | 50-51             
  paths.ts         |     100 |      100 |     100 |     100 |                   
  ...ing-skills.ts |     100 |       72 |     100 |     100 | 31-35,73-78,97    
  prompt.ts        |   97.26 |    87.03 |     100 |   97.26 | ...10-218,222,225 
  recall.ts        |   82.06 |       75 |    90.9 |   82.06 | ...59-364,395-406 
  refresh.ts       |   93.58 |    89.58 |     100 |   93.58 | ...75-176,183-184 
  ...ceSelector.ts |    93.1 |    81.81 |     100 |    93.1 | ...25,127-128,136 
  remember.ts      |   98.89 |    90.19 |     100 |   98.89 | 50,70             
  scan.ts          |   93.12 |    77.41 |     100 |   93.12 | ...08-109,154,157 
  scopes.ts        |     100 |      100 |     100 |     100 |                   
  ...et-scanner.ts |     100 |      100 |     100 |     100 |                   
  ...entPlanner.ts |   77.24 |    74.07 |   72.22 |   77.24 | ...52-456,459,465 
  status.ts        |   10.52 |      100 |       0 |   10.52 | 41-98             
  store.ts         |   92.92 |     82.6 |     100 |   92.92 | ...16-117,147-148 
  ...git-status.ts |     100 |     87.5 |     100 |     100 | 30                
  ...cret-guard.ts |     100 |      100 |     100 |     100 |                   
  ...emory-sync.ts |   94.24 |    82.85 |     100 |   94.24 | ...34-236,246-247 
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ontextFile.ts |   81.21 |    81.53 |   81.81 |   81.21 | ...63-277,291-296 
 src/mocks         |       0 |        0 |       0 |       0 |                   
  msw.ts           |       0 |        0 |       0 |       0 | 1-9               
 src/models        |   92.55 |    88.97 |   91.13 |   92.55 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...tor-config.ts |   97.77 |    91.83 |     100 |   97.77 | 155,161,171       
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nfigErrors.ts |   74.22 |    47.82 |   84.61 |   74.22 | ...,67-74,106-117 
  ...igResolver.ts |   98.71 |    93.33 |     100 |   98.71 | 166,328,334       
  modelRegistry.ts |     100 |    98.11 |     100 |     100 | 177,261           
  modelsConfig.ts  |   89.36 |    86.93 |   88.09 |   89.36 | ...1404,1433-1434 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/output        |     100 |      100 |     100 |     100 |                   
  ...-formatter.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/permissions   |   83.79 |    91.17 |   71.07 |   83.79 |                   
  autoMode.ts      |   97.66 |    93.13 |     100 |   97.66 | ...82-589,635,712 
  ...transcript.ts |      98 |       84 |     100 |      98 | 200-201           
  classifier.ts    |      94 |    94.54 |     100 |      94 | 158-165,389-393   
  ...erousRules.ts |     100 |    89.36 |     100 |     100 | 110,133,147,175   
  ...alTracking.ts |     100 |      100 |     100 |     100 |                   
  ...e-commands.ts |   86.77 |     73.8 |     100 |   86.77 | 131-141,210-214   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...on-manager.ts |   86.63 |    89.01 |      80 |   86.63 | ...1111,1217-1221 
  rule-parser.ts   |   94.49 |     92.7 |     100 |   94.49 | ...1447,1481-1483 
  ...-semantics.ts |   70.44 |    91.09 |   46.66 |   70.44 | ...2237,2311-2314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...sifier-prompts |   99.04 |    95.23 |     100 |   99.04 |                   
  system-prompt.ts |   99.04 |    95.23 |     100 |   99.04 | 220               
 src/prompts       |   83.63 |      100 |    87.5 |   83.63 |                   
  mcp-prompts.ts   |   18.18 |      100 |       0 |   18.18 | 11-19             
  ...t-registry.ts |     100 |      100 |     100 |     100 |                   
 src/providers     |   83.71 |     78.5 |   81.25 |   83.71 |                   
  all-providers.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  install.ts       |   93.11 |     84.5 |     100 |   93.11 | ...56-257,330-331 
  ...der-config.ts |   75.85 |    73.84 |   78.26 |   75.85 | ...73-474,502-503 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...viders/presets |   97.82 |    91.66 |   63.63 |   97.82 |                   
  ...oding-plan.ts |   87.34 |      100 |       0 |   87.34 | 82-84,87-89,91-94 
  ...a-standard.ts |     100 |      100 |     100 |     100 |                   
  ...token-plan.ts |     100 |      100 |     100 |     100 |                   
  ...m-provider.ts |   97.05 |    81.25 |      75 |   97.05 | 118-119           
  deepseek.ts      |     100 |      100 |     100 |     100 |                   
  grok.ts          |     100 |      100 |     100 |     100 |                   
  idealab.ts       |     100 |      100 |     100 |     100 |                   
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  openrouter.ts    |     100 |      100 |     100 |     100 |                   
  requesty.ts      |     100 |      100 |     100 |     100 |                   
  zai.ts           |     100 |      100 |     100 |     100 |                   
 src/qwen          |   85.41 |    78.52 |   95.89 |   85.41 |                   
  ...tGenerator.ts |   98.64 |    98.18 |     100 |   98.64 | 105-106           
  qwenOAuth2.ts    |   82.79 |    73.29 |   90.62 |   82.79 | ...1205-1221,1251 
  ...kenManager.ts |   85.36 |    76.61 |     100 |   85.36 | ...52-757,778-783 
 src/resources     |     100 |      100 |     100 |     100 |                   
  ...e-registry.ts |     100 |      100 |     100 |     100 |                   
 src/services      |   89.66 |    84.54 |   96.92 |   89.66 |                   
  ...ionTrailer.ts |     100 |      100 |     100 |     100 |                   
  ...llRegistry.ts |   97.68 |    85.71 |     100 |   97.68 | ...96,119,490-491 
  ...ionService.ts |   97.51 |    96.15 |     100 |   97.51 | ...,929,1072-1080 
  ...ingService.ts |   91.41 |    85.15 |   95.65 |   91.41 | ...2116,2143-2144 
  ...ttribution.ts |   91.73 |    87.71 |      90 |   91.73 | ...80-685,826-827 
  ...utSlimming.ts |    97.2 |    93.93 |     100 |    97.2 | ...39-340,378-381 
  cronScheduler.ts |   94.17 |    90.45 |      98 |   94.17 | ...1333,1736-1737 
  cronTasksFile.ts |   96.31 |    91.81 |     100 |   96.31 | ...11,336-337,483 
  cronTasksLock.ts |   94.44 |    89.47 |     100 |   94.44 | ...02-103,132-133 
  ...eryService.ts |   96.22 |    93.54 |      90 |   96.22 | 121,155-156,161   
  ...oryService.ts |   88.17 |    79.02 |    92.3 |   88.17 | ...1303,1344-1347 
  fileReadCache.ts |    97.5 |    96.07 |     100 |    97.5 | 349-350,363-364   
  ...temService.ts |    92.8 |    84.68 |   94.11 |    92.8 | ...41,467-474,519 
  ...ratedFiles.ts |      96 |    88.23 |     100 |      96 | 119-120,146-147   
  gitInit.ts       |     100 |      100 |     100 |     100 |                   
  ...reeService.ts |    73.7 |    68.49 |   95.83 |    73.7 | ...2196,2225-2226 
  ...on-service.ts |   87.38 |       72 |     100 |   87.38 | ...01-305,343-344 
  ...references.ts |   98.39 |    88.76 |     100 |   98.39 | 154-155,215-216   
  ...ionService.ts |   98.26 |    97.35 |     100 |   98.26 | ...13-714,761-762 
  ...ticsDumper.ts |   98.37 |    95.23 |     100 |   98.37 | 185-186           
  ...ureMonitor.ts |   95.82 |    90.52 |   97.05 |   95.82 | ...60,861,875-877 
  ...orRegistry.ts |    97.3 |    91.22 |     100 |    97.3 | ...53-454,611-612 
  ...ttachments.ts |   97.74 |    90.85 |     100 |   97.74 | 298-308,646       
  ...ersistence.ts |   90.95 |    78.75 |     100 |   90.95 | ...78,963-964,992 
  ...on-service.ts |   94.49 |    92.26 |   97.14 |   94.49 | ...98-600,656-664 
  ...ce-service.ts |    98.5 |    94.11 |    90.9 |    98.5 | 64-65             
  ...ipt-reader.ts |   94.55 |    89.78 |   96.66 |   94.55 | ...1353-1354,1422 
  ...est-helper.ts |       0 |        0 |       0 |       0 | 1-65              
  ...iter-lease.ts |   82.45 |    74.11 |   97.61 |   82.45 | ...2433,2445-2448 
  sessionRecap.ts  |   67.56 |    43.47 |     100 |   67.56 | ...60,178,180-183 
  ...ionService.ts |   88.79 |    83.72 |   97.18 |   88.79 | ...2477,2553-2573 
  sessionTitle.ts  |   94.19 |    73.21 |     100 |   94.19 | ...43-246,277-278 
  ...ionService.ts |    84.4 |    78.45 |   97.18 |    84.4 | ...2493,2499-2504 
  ...pInhibitor.ts |   97.42 |    92.77 |     100 |   97.42 | ...30,169,369-370 
  ...Estimation.ts |     100 |    88.23 |     100 |     100 | 118-119           
  ...ageService.ts |   97.76 |    91.59 |   93.75 |   97.76 | ...61-262,366,567 
  ...UseSummary.ts |   94.63 |    88.46 |     100 |   94.63 | ...62-164,214-215 
  ...rd-service.ts |     100 |    88.37 |     100 |     100 | ...29,145-146,241 
  ...oryService.ts |   90.72 |    84.07 |     100 |   90.72 | ...06-509,561-562 
  ...reeCleanup.ts |   14.42 |      100 |   33.33 |   14.42 | 58-186            
  ...ionService.ts |   87.98 |    86.95 |     100 |   87.98 | ...38-439,455-456 
 ...icrocompaction |    98.9 |    95.08 |     100 |    98.9 |                   
  microcompact.ts  |    98.9 |    95.08 |     100 |    98.9 | ...40,749,758-759 
 ...s/visionBridge |   98.81 |    92.12 |     100 |   98.81 |                   
  ...capability.ts |     100 |      100 |     100 |     100 |                   
  ...part-utils.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |   98.72 |    82.35 |     100 |   98.72 | 65,71             
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...ge-service.ts |   98.61 |     94.7 |     100 |   98.61 | ...06,666,679-680 
 src/skills        |   89.29 |    85.89 |   93.61 |   89.29 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...activation.ts |     100 |    93.33 |     100 |     100 | 93,112            
  skill-curator.ts |   89.71 |    81.54 |     100 |   89.71 | ...01-902,904-907 
  skill-load.ts    |   94.84 |     87.5 |     100 |   94.84 | ...03,223,235-237 
  skill-manager.ts |   84.82 |    85.29 |   83.33 |   84.82 | ...1243,1250-1254 
  skill-paths.ts   |   90.42 |     87.5 |     100 |   90.42 | ...19-120,125-126 
  symlinkScope.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |   97.91 |    98.03 |     100 |   97.91 | 277-278           
 ...ataviz/scripts |   80.06 |    95.23 |   88.23 |   80.06 |                   
  ...te_palette.js |   80.06 |    95.23 |   88.23 |   80.06 | 261-296,306-328   
 ...s/bundled/loop |   97.48 |    95.77 |     100 |   97.48 |                   
  ...omous-loop.ts |     100 |      100 |     100 |     100 |                   
  ...-task-file.ts |   94.85 |     92.4 |     100 |   94.85 | ...56,367,375-376 
  ...k-resolver.ts |     100 |      100 |     100 |     100 |                   
 src/subagents     |   87.72 |    89.01 |   96.55 |   87.72 |                   
  ...ter-schema.ts |     100 |    98.07 |     100 |     100 | 99                
  ...tin-agents.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nt-manager.ts |   84.48 |    85.91 |   94.87 |   84.48 | ...1582,1659-1660 
  types.ts         |     100 |      100 |     100 |     100 |                   
  validation.ts    |   92.46 |    95.18 |     100 |   92.46 | 47-52,63-68,71-76 
 src/telemetry     |   81.73 |    83.97 |   84.83 |   81.73 |                   
  ...ty-tracker.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...on-metrics.ts |   99.08 |    80.95 |     100 |   99.08 | 185,199           
  ...on-tracing.ts |   76.31 |    74.62 |   73.68 |   76.31 | ...80,387-389,405 
  ...attributes.ts |   95.15 |    87.27 |     100 |   95.15 | ...97-198,216-217 
  ...ag-metrics.ts |     100 |    77.77 |     100 |     100 | 21,40             
  ...t-loop-lag.ts |   96.85 |    85.71 |     100 |   96.85 | 170-173           
  ...-exporters.ts |   65.78 |    83.33 |   55.55 |   65.78 | ...04-105,108-109 
  ...ai-content.ts |    74.5 |    66.41 |   91.66 |    74.5 | ...1480,1493-1502 
  ...i-provider.ts |     100 |       99 |     100 |     100 | 99                
  ...ai-request.ts |   87.52 |    92.79 |   83.78 |   87.52 | ...55-561,564-570 
  gen-ai-usage.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-111             
  ...-processor.ts |    99.1 |    95.72 |      95 |    99.1 | 145,369-370       
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-128             
  loggers.ts       |   60.03 |    76.51 |   66.07 |   60.03 | ...1484,1501-1521 
  metrics.ts       |   80.37 |    82.35 |   80.95 |   80.37 | ...1150,1153-1164 
  otlp-urls.ts     |     100 |      100 |     100 |     100 |                   
  ...attributes.ts |     100 |      100 |     100 |     100 |                   
  ...ime-config.ts |       0 |        0 |       0 |       0 | 1                 
  sanitize.ts      |      80 |    83.33 |     100 |      80 | 35-36,41-42       
  ...rters-grpc.ts |     100 |      100 |     100 |     100 |                   
  ...rters-http.ts |     100 |      100 |     100 |     100 |                   
  sdk-impl.ts      |   91.06 |    87.15 |   68.75 |   91.06 | ...32,482-483,499 
  sdk.ts           |   82.12 |    90.47 |   66.66 |   82.12 | ...90-194,232-254 
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...on-tracing.ts |    91.1 |    88.68 |   96.77 |    91.1 | ...1737,1768-1771 
  ...etry-utils.ts |     100 |      100 |     100 |     100 |                   
  ...l-decision.ts |     100 |      100 |     100 |     100 |                   
  trace-context.ts |     100 |      100 |     100 |     100 |                   
  ...e-id-utils.ts |     100 |      100 |     100 |     100 |                   
  tracer.ts        |   98.56 |    88.63 |     100 |   98.56 | 52,101            
  types.ts         |      83 |    94.32 |   86.36 |      83 | ...1467,1471-1478 
  uiTelemetry.ts   |   97.18 |    93.93 |      88 |   97.18 | ...70,314,461-462 
 ...ry/qwen-logger |   74.23 |    80.53 |      70 |   74.23 |                   
  event-types.ts   |       0 |        0 |       0 |       0 |                   
  qwen-logger.ts   |   74.23 |    80.35 |   69.49 |   74.23 | ...1122,1160-1161 
 src/test-utils    |   96.02 |    98.41 |   82.92 |   96.02 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  ...st-helpers.ts |   94.11 |       90 |     100 |   94.11 | 69-70             
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...mised-lock.ts |     100 |      100 |     100 |     100 |                   
  mock-tool.ts     |   94.85 |      100 |   78.78 |   94.85 | ...53,227-228,241 
  ...aceContext.ts |     100 |      100 |     100 |     100 |                   
 src/tools         |   86.24 |    84.99 |   88.72 |   86.24 |                   
  ...erQuestion.ts |   89.71 |    80.76 |   91.66 |   89.71 | ...66-367,374-375 
  ...-registrar.ts |    77.7 |    66.66 |   66.66 |    77.7 | ...72-277,292-294 
  ...ub-session.ts |   89.67 |     91.3 |   81.81 |   89.67 | ...03-304,315-322 
  cron-create.ts   |   90.64 |    92.85 |   72.72 |   90.64 | ...,73-74,223-231 
  cron-delete.ts   |   97.56 |      100 |   83.33 |   97.56 | 31-32             
  cron-list.ts     |   98.23 |    95.34 |    87.5 |   98.23 | 57-58             
  diffOptions.ts   |     100 |      100 |     100 |     100 |                   
  display-image.ts |   87.42 |    84.84 |   88.88 |   87.42 | ...29-134,194-195 
  edit.ts          |    82.7 |    86.77 |   81.25 |    82.7 | ...43-744,863-913 
  ...r-worktree.ts |   83.14 |    67.56 |    87.5 |   83.14 | ...84-187,278-279 
  enterPlanMode.ts |      85 |     82.6 |    87.5 |      85 | ...28-133,161-175 
  exit-worktree.ts |   83.29 |    83.65 |   94.44 |   83.29 | ...14-515,537-538 
  exitPlanMode.ts  |      95 |    85.29 |     100 |      95 | ...21-325,344,378 
  ...permission.ts |     100 |      100 |     100 |     100 |                   
  glob.ts          |   96.33 |     88.5 |     100 |   96.33 | ...24-225,373,376 
  grep.ts          |   90.73 |    86.61 |   85.71 |   90.73 | ...76-677,727-728 
  ...adTracking.ts |     100 |      100 |     100 |     100 |                   
  image-gen.ts     |   91.66 |    77.41 |    90.9 |   91.66 | ...13-214,221-222 
  list-agents.ts   |   94.02 |    82.35 |   83.33 |   94.02 | 31-32,47-48       
  loop-wakeup.ts   |   99.27 |    92.85 |     100 |   99.27 | 45                
  ls.ts            |   96.74 |    90.27 |     100 |   96.74 | 176-181,212,216   
  lsp.ts           |   72.71 |     59.5 |   90.32 |   72.71 | ...1212,1214-1215 
  ...nt-manager.ts |   82.13 |    80.47 |   85.71 |   82.13 | ...3234,3236-3237 
  mcp-client.ts    |   79.87 |    85.58 |   89.47 |   79.87 | ...2259,2263-2266 
  ...ry-timeout.ts |     100 |      100 |     100 |     100 |                   
  mcp-errors.ts    |     100 |      100 |     100 |     100 |                   
  ...pool-entry.ts |   79.21 |    85.71 |   81.57 |   79.21 | ...1341,1349-1350 
  ...ool-events.ts |       8 |        0 |       0 |       8 | 132-158           
  mcp-pool-key.ts  |   97.46 |    93.93 |     100 |   97.46 | 176-177           
  ...ce-content.ts |   96.55 |    91.17 |     100 |   96.55 | 80-82             
  mcp-retry.ts     |   97.67 |    95.65 |     100 |   97.67 | 131-132           
  ...ion-config.ts |     100 |      100 |     100 |     100 |                   
  mcp-status.ts    |     100 |      100 |     100 |     100 |                   
  mcp-tool.ts      |   98.35 |    93.71 |     100 |   98.35 | ...-990,1045-1046 
  ...sport-pool.ts |   83.98 |     80.3 |   88.46 |   83.98 | ...1409,1416-1420 
  ...ace-budget.ts |   87.27 |     82.6 |     100 |   87.27 | ...00-305,340-345 
  memory-config.ts |     100 |      100 |     100 |     100 |                   
  ...iable-tool.ts |     100 |    84.61 |     100 |     100 | 101,108           
  monitor.ts       |   91.82 |    83.09 |   88.46 |   91.82 | ...99,612,810-815 
  notebook-edit.ts |   85.69 |    77.08 |   81.25 |   85.69 | ...95-911,957-958 
  ...escendants.ts |   36.17 |    64.51 |   55.55 |   36.17 | ...46-310,385-390 
  ...nforcement.ts |   83.21 |    90.69 |     100 |   83.21 | 147-158,207-220   
  read-file.ts     |   95.49 |    88.52 |   86.66 |   95.49 | ...49,464,536-537 
  ...p-resource.ts |   96.85 |      100 |   91.66 |   96.85 | 92-96             
  ...d-artifact.ts |   91.18 |    86.71 |    87.5 |   91.18 | ...26-427,441-453 
  ripGrep.ts       |    94.6 |    87.26 |   95.23 |    94.6 | ...33-734,740-741 
  ...-transport.ts |   71.42 |    55.55 |   71.42 |   71.42 | ...36-137,143-144 
  send-message.ts  |   81.13 |    89.74 |    62.5 |   81.13 | ...80-286,363-371 
  ...n-mcp-view.ts |   94.07 |    91.89 |    90.9 |   94.07 | 131-139           
  shell.ts         |   78.81 |    84.22 |   91.91 |   78.81 | ...5035,5098-5099 
  skill-utils.ts   |     100 |      100 |     100 |     100 |                   
  skill.ts         |   91.39 |    92.55 |      90 |   91.39 | ...84,488,534-556 
  ...eticOutput.ts |   95.12 |      100 |      80 |   95.12 | 87-88             
  task-create.ts   |    94.4 |    93.33 |   81.81 |    94.4 | 45-49,63-64,95    
  task-list.ts     |   73.38 |    77.77 |   83.33 |   73.38 | ...02,105,109-116 
  task-stop.ts     |   93.14 |    96.15 |   85.71 |   93.14 | 39-40,54-64       
  task-update.ts   |   82.89 |    83.92 |    92.3 |   82.89 | ...14-422,454-465 
  team-create.ts   |   97.22 |    85.71 |   83.33 |   97.22 | 48-49,129-130     
  team-delete.ts   |   86.74 |    83.33 |   83.33 |   86.74 | 37-38,42-48,72-73 
  ...n-approval.ts |   92.14 |    96.77 |   77.77 |   92.14 | 38-39,42-43,93-99 
  todoWrite.ts     |   95.13 |    87.85 |   93.33 |   95.13 | ...23-527,540-545 
  tool-error.ts    |     100 |      100 |     100 |     100 |                   
  tool-names.ts    |     100 |      100 |     100 |     100 |                   
  tool-registry.ts |   78.57 |    79.59 |    82.6 |   78.57 | ...89-990,998-999 
  tool-search.ts   |   96.19 |    89.72 |   93.33 |   96.19 | ...09,259-264,426 
  tools.ts         |   93.11 |    92.53 |   91.66 |   93.11 | ...69-570,586-592 
  ...reapproved.ts |   99.27 |    94.11 |     100 |   99.27 | 170               
  web-fetch.ts     |   96.05 |    90.54 |   96.77 |   96.05 | ...85-786,800-801 
  web-search.ts    |   90.58 |    83.57 |      80 |   90.58 | ...1025,1083-1086 
  write-file.ts    |    86.7 |    84.92 |   88.88 |    86.7 | ...24-827,864-899 
  zoom-image.ts    |   95.76 |    93.75 |      90 |   95.76 | 54-59,203-204     
 src/tools/agent   |   87.22 |    87.68 |   88.69 |   87.22 |                   
  agent.ts         |   85.84 |    86.59 |   86.31 |   85.84 | ...4315,4337-4347 
  fork-profile.ts  |   93.65 |       90 |     100 |   93.65 | ...33-134,171-174 
  fork-subagent.ts |   98.73 |       95 |     100 |   98.73 | 101-102,173       
 ...tools/artifact |   95.78 |    92.51 |   88.63 |   95.78 |                   
  artifact-tool.ts |   91.46 |    88.46 |   71.42 |   91.46 | ...13-314,322-325 
  ...-publisher.ts |     100 |    85.71 |     100 |     100 | 32                
  ...-publisher.ts |   96.74 |    97.72 |    87.5 |   96.74 | 29-30,156-157     
  html.ts          |     100 |    96.77 |     100 |     100 | 122               
  ...-publisher.ts |     100 |       80 |     100 |     100 | 30                
  oss-publisher.ts |    98.1 |    91.48 |     100 |    98.1 | 43-45             
  publisher.ts     |     100 |      100 |     100 |     100 |                   
 ...s/computer-use |   90.21 |    82.17 |   78.08 |   90.21 |                   
  bootstrap.ts     |   59.42 |    80.95 |   41.66 |   59.42 | ...35-339,341-345 
  client.ts        |   80.11 |       90 |   77.77 |   80.11 | ...97,242-243,274 
  constants.ts     |     100 |    94.73 |     100 |     100 | 129,256           
  downloader.ts    |   65.29 |    52.77 |   58.33 |   65.29 | ...99-300,316-355 
  index.ts         |     100 |      100 |     100 |     100 |                   
  install-state.ts |   94.44 |    72.72 |     100 |   94.44 | 44-45             
  ...n-detector.ts |     100 |     87.5 |     100 |     100 | 50                
  schemas.ts       |     100 |      100 |     100 |     100 |                   
  tool.ts          |    96.3 |    85.71 |     100 |    96.3 | 75-76,184,252-258 
 ...tools/workflow |   86.24 |    84.81 |      75 |   86.24 |                   
  workflow.ts      |   86.24 |    84.81 |      75 |   86.24 | ...61,506,508-509 
 src/utils         |   92.89 |    89.62 |   96.87 |   92.89 |                   
  LruCache.ts      |     100 |      100 |     100 |     100 |                   
  ...Controller.ts |     100 |      100 |     100 |     100 |                   
  ...ssageQueue.ts |     100 |      100 |     100 |     100 |                   
  ...cFileWrite.ts |   94.94 |    92.47 |     100 |   94.94 | ...43-544,651-655 
  bareMode.ts      |   81.81 |      100 |      50 |   81.81 | 18-19             
  ...ry-content.ts |   98.45 |    95.45 |     100 |   98.45 | 132-133,159-160   
  browser.ts       |   86.84 |    78.94 |     100 |   86.84 | 34,36-37,65-66    
  btwUtils.ts      |   13.95 |      100 |       0 |   13.95 | 17-31,34-55       
  bundlePaths.ts   |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...igResolver.ts |     100 |      100 |     100 |     100 |                   
  ...engthError.ts |   91.06 |    89.47 |     100 |   91.06 | ...46-147,154-155 
  ...n-branches.ts |   95.88 |    94.11 |      95 |   95.88 | ...98-499,511-524 
  ...tion-chain.ts |     100 |      100 |     100 |     100 |                   
  cronDisplay.ts   |     100 |    97.61 |     100 |     100 | 46                
  cronParser.ts    |   95.34 |    93.33 |     100 |   95.34 | 41-42,47-48,70-71 
  debugLogger.ts   |   96.66 |    96.61 |   88.88 |   96.66 | 192-196           
  editHelper.ts    |   93.63 |     83.9 |     100 |   93.63 | ...27-428,462-463 
  editor.ts        |   97.65 |    95.45 |     100 |   97.65 | ...35-336,338-339 
  encoding.ts      |     100 |      100 |     100 |     100 |                   
  env.ts           |     100 |      100 |     100 |     100 |                   
  ...arResolver.ts |   94.28 |    88.88 |     100 |   94.28 | 28-29,125-126     
  ...entContext.ts |   96.63 |    90.13 |   96.66 |   96.63 | ...42,444-445,512 
  errorParsing.ts  |     100 |      100 |     100 |     100 |                   
  ...rReporting.ts |   95.65 |    93.33 |     100 |   95.65 | 37-38             
  errors.ts        |   83.01 |    95.03 |    61.9 |   83.01 | ...62-378,382-388 
  fetch.ts         |   90.68 |    82.51 |     100 |   90.68 | ...72,483-484,503 
  file-identity.ts |     100 |      100 |     100 |     100 |                   
  fileUtils.ts     |   94.87 |    92.95 |   96.15 |   94.87 | ...1907,1915-1916 
  forkedAgent.ts   |   92.45 |    82.35 |   93.75 |   92.45 | ...34,642,647-654 
  formatters.ts    |     100 |      100 |     100 |     100 |                   
  ...eUtilities.ts |    92.4 |    86.95 |     100 |    92.4 | ...52-158,168-169 
  ...rStructure.ts |   94.39 |    94.28 |     100 |   94.39 | ...29-132,343-348 
  getPty.ts        |   31.57 |       50 |     100 |   31.57 | 26-38             
  git-branches.ts  |    91.6 |    84.21 |    92.3 |    91.6 | ...90,405-410,570 
  ...fig-safety.ts |   97.01 |       80 |     100 |   97.01 | 53-54             
  gitDiff.ts       |   95.19 |    81.36 |     100 |   95.19 | ...1073,1419-1420 
  gitDirect.ts     |   98.84 |    94.28 |     100 |   98.84 | 234,318           
  ...noreParser.ts |   94.48 |    93.22 |     100 |   94.48 | ...23-124,158-159 
  gitUtils.ts      |   78.02 |    81.25 |   85.71 |   78.02 | ...22-123,147-198 
  github-prs.ts    |   95.74 |    82.27 |     100 |   95.74 | 216,314-322       
  iconvHelper.ts   |     100 |      100 |     100 |     100 |                   
  ...rePatterns.ts |     100 |      100 |     100 |     100 |                   
  image-view.ts    |   95.12 |    93.33 |     100 |   95.12 | ...68-172,240-244 
  ...ionManager.ts |     100 |     90.9 |     100 |     100 | 27                
  ...lPromptIds.ts |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  jsonl-utils.ts   |   95.27 |     93.1 |     100 |   95.27 | ...16-317,359-362 
  ...-detection.ts |     100 |      100 |     100 |     100 |                   
  ...iconv-lite.ts |     100 |      100 |     100 |     100 |                   
  ...simple-git.ts |   96.77 |    91.66 |     100 |   96.77 | 38                
  ...m-headless.ts |      96 |    88.88 |     100 |      96 | 34                
  ...iagnostics.ts |    96.4 |     94.2 |     100 |    96.4 | ...66,293-294,376 
  ...yDiscovery.ts |    92.4 |    89.13 |     100 |    92.4 | ...28,331,522-525 
  ...tProcessor.ts |   94.01 |       90 |     100 |   94.01 | ...47-353,445-446 
  ...Inspectors.ts |     100 |      100 |     100 |     100 |                   
  modelId.ts       |   98.96 |    98.21 |     100 |   98.96 | 153               
  ...kerChecker.ts |    90.9 |    91.66 |     100 |    90.9 | 73-79             
  notebook.ts      |   94.57 |    89.91 |   95.83 |   94.57 | ...21,333,385-387 
  openaiLogger.ts  |   91.66 |    89.74 |     100 |   91.66 | ...26-228,251-256 
  osc8.ts          |   54.26 |    64.86 |   83.33 |   54.26 | ...72-195,197-257 
  partUtils.ts     |     100 |    98.64 |     100 |     100 | 211               
  pathReader.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |   93.61 |    92.42 |     100 |   93.61 | ...62-563,565-567 
  pdf.ts           |   92.17 |    85.81 |     100 |   92.17 | ...64-565,606-611 
  projectPath.ts   |     100 |      100 |     100 |     100 |                   
  projectRoot.ts   |   71.73 |    78.57 |     100 |   71.73 | 54-66             
  ...ectSummary.ts |   89.62 |    72.41 |     100 |   89.62 | ...40-145,196-199 
  ...tIdContext.ts |     100 |      100 |     100 |     100 |                   
  proxyUtils.ts    |     100 |      100 |     100 |     100 |                   
  ...rDetection.ts |   71.15 |       86 |     100 |   71.15 | ...-90,96-101,147 
  ...noreParser.ts |   92.63 |    91.66 |     100 |   92.63 | ...77-178,197-198 
  rateLimit.ts     |   93.75 |    89.62 |     100 |   93.75 | ...13,218-219,262 
  ...text-range.ts |   96.98 |    87.15 |     100 |   96.98 | ...87-688,763-764 
  readManyFiles.ts |   95.75 |    80.86 |     100 |   95.75 | ...05,558,568-572 
  retry.ts         |   96.09 |    92.52 |     100 |   96.09 | ...67,558-559,577 
  retryContext.ts  |     100 |      100 |     100 |     100 |                   
  ...sification.ts |   97.63 |    97.11 |     100 |   97.63 | ...17,251-252,278 
  retryPolicy.ts   |   97.72 |    90.56 |     100 |   97.72 | 130-131           
  ripgrepUtils.ts  |   90.04 |    93.43 |   95.45 |   90.04 | ...55-565,598-599 
  ...sDiscovery.ts |   97.46 |    93.05 |     100 |   97.46 | ...04,182-183,202 
  ...iagnostics.ts |   83.08 |     67.5 |   92.59 |   83.08 | ...23,543-544,550 
  ...tchOptions.ts |   84.87 |    86.71 |   96.29 |   84.87 | ...71,696,725-734 
  ...odelPrefix.ts |     100 |      100 |     100 |     100 |                   
  runtimeStatus.ts |    97.5 |    89.74 |     100 |    97.5 | 162-163           
  safe-mode.ts     |     100 |      100 |     100 |     100 |                   
  safeJsonParse.ts |     100 |      100 |     100 |     100 |                   
  ...nStringify.ts |     100 |      100 |     100 |     100 |                   
  ...-child-env.ts |     100 |      100 |     100 |     100 |                   
  ...aConverter.ts |   98.03 |    97.75 |     100 |   98.03 | 100,102-103       
  ...aValidator.ts |   92.09 |    83.65 |   90.47 |   92.09 | ...60,882-883,896 
  ...r-launcher.ts |   96.35 |    93.97 |   85.71 |   96.35 | ...35-336,347-348 
  sedEditParser.ts |   91.78 |    92.18 |     100 |   91.78 | ...66-569,645-646 
  ...nIdContext.ts |     100 |      100 |     100 |     100 |                   
  ...orageUtils.ts |   95.98 |    83.96 |     100 |   95.98 | ...70,386,466,485 
  ...-pager-env.ts |     100 |      100 |     100 |     100 |                   
  ...fety-rules.ts |     100 |     89.7 |     100 |     100 | ...01,304,309-311 
  shell-utils.ts   |   86.07 |    88.34 |     100 |   86.07 | ...2269,2276-2280 
  ...lAstParser.ts |   98.27 |    91.38 |     100 |   98.27 | ...1321-1323,1333 
  ...ContextEnv.ts |     100 |       92 |     100 |     100 | 50-52             
  ...nlyChecker.ts |   96.33 |    96.57 |     100 |   96.33 | ...83-284,292-293 
  sideQuery.ts     |   86.82 |    86.66 |     100 |   86.82 | ...79-185,187-193 
  ...pEventSink.ts |     100 |       80 |     100 |     100 | 61                
  ...tGenerator.ts |     100 |      100 |     100 |     100 |                   
  ...ameContext.ts |     100 |      100 |     100 |     100 |                   
  symlink.ts       |   77.77 |       50 |     100 |   77.77 | 44,54-59          
  ...e-encoding.ts |   85.96 |    76.47 |     100 |   85.96 | 58-61,64-65,78-79 
  ...emEncoding.ts |   96.36 |    91.17 |     100 |   96.36 | 59-60,124-125     
  terminalSafe.ts  |     100 |      100 |     100 |     100 |                   
  ...Serializer.ts |   98.72 |       90 |     100 |   98.72 | 42-43,134,201-203 
  testUtils.ts     |   53.33 |      100 |   33.33 |   53.33 | ...53,59-64,70-72 
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  textUtils.ts     |      65 |      100 |      75 |      65 | 56-75             
  thoughtUtils.ts  |     100 |    95.65 |     100 |     100 | 99                
  ...-converter.ts |   95.23 |    85.71 |     100 |   95.23 | 36-37             
  ...name-utils.ts |     100 |      100 |     100 |     100 |                   
  ...-finalizer.ts |   97.66 |     90.9 |     100 |   97.66 | 165-166,168-172   
  tool-utils.ts    |    95.2 |    93.61 |     100 |    95.2 | ...58-159,162-163 
  ...ultCleanup.ts |   54.62 |       64 |      75 |   54.62 | ...03-105,108-134 
  ...Compaction.ts |   96.13 |    96.42 |     100 |   96.13 | ...34-339,341-346 
  ...pt-records.ts |    87.5 |    86.02 |     100 |    87.5 | ...76-480,510-525 
  truncation.ts    |   90.56 |    90.43 |     100 |   90.56 | ...35-443,480-486 
  windowsPath.ts   |   89.47 |    79.31 |     100 |   89.47 | ...57-58,62,90-91 
  ...aceContext.ts |   96.74 |    91.04 |     100 |   96.74 | ...69,196,299-301 
  xml.ts           |    97.8 |    87.69 |     100 |    97.8 | 98-99             
  yaml-parser.ts   |   83.87 |    77.27 |     100 |   83.87 | ...31-234,239-240 
 ...ils/filesearch |   83.94 |    80.72 |   94.73 |   83.94 |                   
  crawlCache.ts    |     100 |      100 |     100 |     100 |                   
  crawler.ts       |    82.9 |    76.81 |   95.08 |    82.9 | ...1563,1597-1598 
  fileSearch.ts    |   93.78 |    87.67 |     100 |   93.78 | ...71-272,274-275 
  fzfWorker.ts     |       0 |        0 |       0 |       0 | 1-109             
  ...rkerHandle.ts |   84.05 |    75.43 |   89.47 |   84.05 | ...30-334,340-341 
  ignore.ts        |     100 |    97.36 |     100 |     100 | 187               
  result-cache.ts  |     100 |    93.75 |     100 |     100 | 49                
 ...uest-tokenizer |   69.76 |    75.47 |   85.29 |   69.76 |                   
  ...eTokenizer.ts |   65.72 |    74.02 |    92.3 |   65.72 | ...65-466,479-533 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tTokenizer.ts |   68.39 |    69.49 |    90.9 |   68.39 | ...24-325,327-328 
  ...ageFormats.ts |   76.92 |      100 |   33.33 |   76.92 | 46-49,56-57       
  textTokenizer.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
-------------------|---------|----------|---------|---------|-------------------

For detailed HTML reports, please see the 'coverage-reports-22.x-ubuntu-latest' artifact from the main CI run.

…atus bar

Replace the plain "X% context used" text in the status bar with a compact
pill: a 52px progress bar plus the bare percentage. The fill follows the
same thresholds as the /context panel (>60% warning, >80% error), the fill
width caps at 100% while the number keeps reporting overflow, and the full
wording moves to aria-label so the accessible name is unchanged. Clicking
still opens the /context breakdown.
@wenshao
wenshao force-pushed the feat/web-shell-context-usage-pill branch from 986fb96 to e226bf9 Compare August 9, 2026 07:33
@github-actions

github-actions Bot commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

Please do not rebase or force-push to an active PR as it invalidates existing review comments. Note for future reference, the bots always squash all changes into a single commit automatically as part of the integration.

中文

请勿对活跃的 PR 执行 rebase 或 force-push,因为这会使已有的评审评论失效。另外,供日后参考:作为集成流程的一部分,机器人始终会自动将所有改动压缩(squash)为单个提交。

The ui normalizer had no case for the usage_update session update, so the
frame fell through to the debug default and every model round appended a
raw-JSON bullet to the assistant turn in the web UI. Context occupancy is
surfaced by the status bar pill; the transcript drops the frame like
current_mode_update.
@ytahdn

ytahdn commented Aug 9, 2026

Copy link
Copy Markdown
Collaborator

整体方向赞同:usage_update 在 SDK normalizer 中不再进入 transcript 的修复建议保留。UI 部分希望做以下调整:

  1. 不放在 composer 下方的 StatusBar。请将 context usage indicator 移到 ChatEditortoolbarRight,紧挨语音操作左侧,也就是 LiveVoiceButton / VoiceButton 之前、send button 之前。这样与输入相关的实时状态和操作处于同一区域,也符合截图中的预期位置。
  2. 视觉上改为紧凑的圆形百分比进度环,不使用横向 pill。可以沿用当前 60% / 80% 的 warning、error 阈值和 semantic colors;进度建议对超过 100% 的值做视觉封顶。
  3. hover 使用 Web Shell 现有的 Tooltip primitives,展示完整详情,例如 53.6k / 1.0M tokens (5.4%)。点击仍可打开 /context 查看 breakdown,并保留完整的 aria-label,不要只依赖颜色或环形进度表达数值。
  4. Web Shell 已有公开入参 composerToolbarActionsComposerToolbarAction item 列表。建议新增 contextUsage action,加入默认 action 列表,并通过现有的 showToolbarAction 控制渲染。这样 embedder 可以按需隐藏;当 context window 未知或 usage 为 0 时仍不展示。
  5. 移动后请移除 StatusBar 中新增的 usage pill,避免两处重复显示。窄屏以及 mobile voice active 状态可沿用 composer toolbar 现有的隐藏策略。

建议补充测试覆盖:indicator 位于 voice action 之前;composerToolbarActions 可显示/隐藏;tooltip 展示 used/total/percentage;点击触发 /context;阈值与超过 100% 的显示;未知或 0 usage 不渲染。

当前 SDK 对 usage_update 的结构化处理是必要的,以上建议主要是调整 Web Shell 的展示位置、形态和公开配置方式。

@doudouOUC doudouOUC left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed — no blockers. Suggestions are inline.

中文说明

已审查——无阻断问题。 建议见行内评论。

— deepseek-v4-flash via Qwen Code /review (v0.21.8)

Comment on lines +178 to +183
const contextFillClass =
pct > 80
? `${styles.contextFill} ${styles.contextFillError}`
: pct > 60
? `${styles.contextFill} ${styles.contextFillWarning}`
: styles.contextFill;

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] Threshold constants (80/60) duplicated between StatusBar.tsx and ContextUsageMessage.tsx — Failure scenario: A developer changes the thresholds in ContextUsageMessage.tsx (e.g., to 85/65) but forgets to update StatusBar.tsx. The status bar pill and the /context panel then show different colors for the same usage percentage — a silently inconsistent UX. The comment is a hint, not a compile-time or lint-time guard, so no tool catches the drift.

Suggested change
const contextFillClass =
pct > 80
? `${styles.contextFill} ${styles.contextFillError}`
: pct > 60
? `${styles.contextFill} ${styles.contextFillWarning}`
: styles.contextFill;
const contextFillClass =
pct > CONTEXT_ERROR_THRESHOLD
? `${styles.contextFill} ${styles.contextFillError}`
: pct > CONTEXT_WARNING_THRESHOLD
? `${styles.contextFill} ${styles.contextFillWarning}`
: styles.contextFill;
中文说明

建议: 阈值常量(80/60)在 StatusBar.tsx 和 ContextUsageMessage.tsx 之间重复。

失败场景: 开发者在 ContextUsageMessage.tsx 中修改阈值(例如改到 85/65)但忘记更新 StatusBar.tsx。状态栏胶囊和 /context 面板在同一百分比下显示不同颜色——无声的视觉不一致。注释只是提示,不是编译期或 lint 期保障,没有任何工具能检测到漂移。

建议修复: 将阈值提取到共享模块,让两个组件共同引用。

— deepseek-v4-flash via Qwen Code /review (v0.21.8)

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

此评论针对的 StatusBar pill 实现已按 maintainer review 整体移除(9934b1f 起指示改为 composer 工具栏圆环,StatusBar 还原为 main 版本)。对应关切在新实现中已覆盖:阈值常量共享(utils/contextUsage.ts)、60/80 双侧边界用例、0/未知窗口不渲染用例、完整 aria-label 与 tooltip。

Comment on lines +87 to +100
it('escalates the fill color at the /context panel thresholds', () => {
mockConnection.contextWindow = 100;

mockConnection.tokenCount = 61;
mount();
let fill = contextButton()!.querySelector<HTMLSpanElement>('span > span')!;
expect(fill.className).toContain('contextFillWarning');
act(() => root!.unmount());
container!.remove();

mockConnection.tokenCount = 81;
mount();
fill = contextButton()!.querySelector<HTMLSpanElement>('span > span')!;
expect(fill.className).toContain('contextFillError');

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] Missing boundary value tests for fill color thresholds — Failure scenario: Someone changes pct > 60 to pct >= 60 (or pct > 80 to pct >= 80). The existing tests at 61 and 81 pass unchanged. At the boundary, 60.0% now incorrectly shows warning colour and 80.0% shows error colour. The /context panel's ContextUsageMessage uses strict >, so the two components drift apart.

Suggested change
it('escalates the fill color at the /context panel thresholds', () => {
mockConnection.contextWindow = 100;
mockConnection.tokenCount = 61;
mount();
let fill = contextButton()!.querySelector<HTMLSpanElement>('span > span')!;
expect(fill.className).toContain('contextFillWarning');
act(() => root!.unmount());
container!.remove();
mockConnection.tokenCount = 81;
mount();
fill = contextButton()!.querySelector<HTMLSpanElement>('span > span')!;
expect(fill.className).toContain('contextFillError');
it('keeps normal fill colour at exactly 60%', () => {
mockConnection.contextWindow = 100;
mockConnection.tokenCount = 60;
mount();
const fill = contextButton()!.querySelector<HTMLSpanElement>('span > span')!;
expect(fill.className).toContain('contextFill');
expect(fill.className).not.toContain('Warning');
});
it('keeps warning fill colour at exactly 80%', () => {
mockConnection.contextWindow = 100;
mockConnection.tokenCount = 80;
mount();
const fill = contextButton()!.querySelector<HTMLSpanElement>('span > span')!;
expect(fill.className).toContain('contextFillWarning');
expect(fill.className).not.toContain('Error');
});
中文说明

建议: 阈值颜色切换缺少边界值测试。

失败场景: 有人将 pct > 60 改为 pct >= 60(或 pct > 80 改为 pct >= 80)。现有测试在 61 和 81 处仍然通过。但在边界处,60.0% 会错误地显示警告色,80.0% 会显示错误色。/context 面板的 ContextUsageMessage 使用严格 >,两个组件会不一致。

建议修复: 添加两个边界值测试用例:精确在 60% 时显示普通色,精确在 80% 时显示警告色。

— deepseek-v4-flash via Qwen Code /review (v0.21.8)

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

此评论针对的 StatusBar pill 实现已按 maintainer review 整体移除(9934b1f 起指示改为 composer 工具栏圆环,StatusBar 还原为 main 版本)。对应关切在新实现中已覆盖:阈值常量共享(utils/contextUsage.ts)、60/80 双侧边界用例、0/未知窗口不渲染用例、完整 aria-label 与 tooltip。

Comment on lines +129 to +133
it('stays hidden until a token count arrives', () => {
mockConnection.contextWindow = 1000;
mockConnection.tokenCount = 0;
mount();
expect(contextButton()).toBeNull();

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] No test for contextWindow = 0, tokenCount > 0 state — Failure scenario: If someone accidentally removes the contextWindow > 0 check (e.g., refactoring to (tokenCount > 0)), the button would appear when contextWindow=0, tokenCount>0, showing "0.0%". The existing tokenCount=0 test would still pass. The correct behaviour is to hide the button when no context window size is known — a "0.0%" pill is misleading without a known capacity.

Suggested change
it('stays hidden until a token count arrives', () => {
mockConnection.contextWindow = 1000;
mockConnection.tokenCount = 0;
mount();
expect(contextButton()).toBeNull();
it('stays hidden when context window is unknown even if tokens arrive', () => {
mockConnection.contextWindow = 0;
mockConnection.tokenCount = 100;
mount();
expect(contextButton()).toBeNull();
});
中文说明

建议: 缺少 contextWindow=0, tokenCount>0 状态下的测试。

失败场景: 如果重构时不小心移除了 contextWindow > 0 检查,按钮会在 contextWindow=0 时显示,展示 "0.0%"——在上下文窗口大小未知时,这个百分比是有误导性的。现有 tokenCount=0 的测试仍然会通过。

建议修复: 添加测试用例,验证 contextWindow=0 时按钮保持隐藏。

— deepseek-v4-flash via Qwen Code /review (v0.21.8)

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

此评论针对的 StatusBar pill 实现已按 maintainer review 整体移除(9934b1f 起指示改为 composer 工具栏圆环,StatusBar 还原为 main 版本)。对应关切在新实现中已覆盖:阈值常量共享(utils/contextUsage.ts)、60/80 双侧边界用例、0/未知窗口不渲染用例、完整 aria-label 与 tooltip。

Comment on lines 351 to 357
<button
type="button"
className={styles.contextButton}
onClick={onShowContext}
title={t('contextUsage.title')}
aria-label={t('status.contextUsed', { pct: pctDisplay })}
>

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] Missing aria-haspopup on the context button — Failure scenario: A screen-reader user navigating the StatusBar hears "33.8% context used, button" with no indication that activating it opens a dialog. The other interactive buttons in the same bar — all of which open dialogs or listboxes — announce their popup role, making this omission inconsistent.

Suggested change
<button
type="button"
className={styles.contextButton}
onClick={onShowContext}
title={t('contextUsage.title')}
aria-label={t('status.contextUsed', { pct: pctDisplay })}
>
aria-haspopup="dialog"
aria-label={t('status.contextUsed', { pct: pctDisplay })}
中文说明

建议: 上下文按钮缺少 aria-haspopup 属性。

失败场景: 屏幕阅读器用户会听到 "33.8% context used, button",但没有任何提示表明点击它会打开对话框。同一状态栏中的其他交互按钮(设置、模式、快捷键)都声明了弹出角色,此处的遗漏不一致。

建议修复: 添加 aria-haspopup="dialog" 属性。

— deepseek-v4-flash via Qwen Code /review (v0.21.8)

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

此评论针对的 StatusBar pill 实现已按 maintainer review 整体移除(9934b1f 起指示改为 composer 工具栏圆环,StatusBar 还原为 main 版本)。对应关切在新实现中已覆盖:阈值常量共享(utils/contextUsage.ts)、60/80 双侧边界用例、0/未知窗口不渲染用例、完整 aria-label 与 tooltip。

Comment on lines +138 to +145
.contextButton {
display: inline-flex;
align-items: center;
padding: 0;
gap: 7px;
padding: 2px 8px 2px 6px;
margin: 0;
border: none;
border: 1px solid var(--border);
border-radius: 999px;

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] CSS hunk has no visual regression test — Failure scenario: Reverting this CSS hunk on its own leaves every test green. The CSS changes (gap, padding, border-radius, hover states, new classes .contextBar, .contextFill, .contextFillWarning) are purely visual — no test asserts these styles. A future change that accidentally breaks the pill's appearance would not be caught by this test suite.

中文说明

建议: CSS 改动没有视觉回归测试。

失败场景: 单独回退这个 CSS 块不会导致任何测试失败。CSS 的改动(gap、padding、border-radius、悬停状态、新增的 .contextBar、.contextFill、.contextFillWarning 等类)纯粹是视觉层面的——没有测试断言这些样式。未来如果意外破坏了胶囊的外观,这个测试套件无法发现。

建议修复: 添加 Playwright 截图测试来验证胶囊外观,或确认已有 E2E 视觉测试覆盖了此场景。

— deepseek-v4-flash via Qwen Code /review (v0.21.8)

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

此评论针对的 StatusBar pill 实现已按 maintainer review 整体移除(9934b1f 起指示改为 composer 工具栏圆环,StatusBar 还原为 main 版本)。对应关切在新实现中已覆盖:阈值常量共享(utils/contextUsage.ts)、60/80 双侧边界用例、0/未知窗口不渲染用例、完整 aria-label 与 tooltip。

… as a ring

Review rework: replace the status-bar pill with a compact circular
progress ring in the composer toolbar's right cluster, immediately left
of the voice actions. The ring keeps the /context thresholds (>60%
warning, >80% error) and the visual 100% cap, hovers a Tooltip with the
full used/total detail (e.g. 53.6k / 1.0M tokens (5.4%)), keeps the full
wording on aria-label, and still opens /context on click. It ships as a
new contextUsage entry in composerToolbarActions so embedders can hide
it, hides while usage or the window is unknown, and follows the
toolbar's mobile-voice hiding. The StatusBar changes are reverted so the
indicator lives in exactly one place.
@wenshao

wenshao commented Aug 9, 2026

Copy link
Copy Markdown
Collaborator Author

感谢 review,五点已全部按建议落地(9934b1f):

  1. 位置:指示已从 StatusBar 移到 ChatEditortoolbarRight,位于 LiveVoiceButton / VoiceButton 之前、send button 之前,测试断言了 DOM 顺序。
  2. 形态:改为紧凑的圆形进度环(SVG 双圆弧),沿用 60% / 80% 的 warning / error 阈值与 semantic colors;超过 100% 时弧线视觉封顶、aria-label 保留真实百分比(如 150.0% context used)。
  3. hover / 点击:使用现有 Tooltip primitives,展示完整详情(实测 34.3k / 100.0k tokens (34.3%));点击仍打开 /contextaria-label 保留完整的 "X% context used" 措辞,数值不单靠颜色/环形传达。
  4. 公开配置:新增 contextUsage action,加入 DEFAULT_COMPOSER_TOOLBAR_ACTIONS,经现有 showToolbarAction 渲染,embedder 可按需隐藏;context window 未知或 usage 为 0 时不渲染。
  5. 去重:StatusBar 的改动已整体还原(回到 main 版本),指示只在 composer 工具栏一处;圆环带 data-hide-during-mobile-voice,沿用工具栏现有的窄屏 / mobile voice 隐藏策略。

测试按清单补齐 8 个用例:位于 voice 之前、composerToolbarActions 显隐、tooltip 展示 used/total/percentage、点击触发 /context、阈值与超 100% 表现、未知或 0 usage 不渲染、tooltip 格式化函数。SDK normalizer 对 usage_update 的处理保持不变。

PR 描述中的截图已更新为圆环形态(浅色三态 + 深色 + tooltip 悬停 + /context 对照),均为真实 daemon + 真实模型 + 无头 Chromium 实拍。

@ytahdn

ytahdn commented Aug 9, 2026

Copy link
Copy Markdown
Collaborator

看了 summary 里的原始截图,Tooltip 箭头确实没有对准圆环中心,不是视觉错觉:尖端大约落在圆环中心左侧 35–40px。

根因不在 ContextUsageRing,而在共享 TooltipContent:当前箭头由固定在浮层 left: 50%::before 绘制。这个 tooltip 靠近 viewport 右边缘时,Radix collision avoidance 会把 content 向左平移以避免溢出,但伪元素仍停在 content 的几何中心,因此不再指向 trigger。

建议不要给 context usage 单独加 right / transform 偏移,也不要关闭 collision avoidance;这两种方式都比较脆弱。请在共享 tooltip primitive 中改用 TooltipPrimitive.Arrow(并移除对应的 before:* 箭头样式),让 Radix 根据 trigger 和碰撞后的 content 位置计算箭头偏移。这样右边缘、左边缘以及其他 Tooltip 都能正确指向触发器。

修改后补一张右侧边界 hover 的截图,确认箭头尖端与 context ring 中心对齐即可。

@qwen-code-ci-bot qwen-code-ci-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed — no blockers. Suggestions are inline.

中文说明

已审查——无阻断问题。 建议见行内评论。

— qwen3.8-max via Qwen Code /review (v0.21.8)

Comment on lines +527 to +530
const valueClass =
pct > 80
? `${styles.contextRingValue} ${styles.contextRingValueError}`
: pct > 60

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R1-1: The >80%/>60% color thresholds are hardcoded in two places — ContextUsageRing here and ProgressBar in ContextUsageMessage.tsx (usedPercentage > 80 / > 60) — with parity maintained only by the comment above; no shared constant or helper exists. — Failure scenario: someone tunes the panel thresholds in ContextUsageMessage.tsx (e.g. warning to 70%, or aligns them with the autocompact buffer) and the composer ring keeps escalating at 60/80 — the toolbar ring and the /context panel disagree about severity for the same session. The new test pins 61/81/60 against the ring alone and never compares the panel's values, so the drift passes CI.

Suggested fix — extract a shared classifier/constants consumed by both components:

// in ContextUsageMessage.tsx (or a shared module)
export const CONTEXT_USAGE_WARNING_PCT = 60;
export const CONTEXT_USAGE_ERROR_PCT = 80;
// or: export function contextUsageSeverity(pct: number): 'normal' | 'warning' | 'error'
中文说明

[建议] 80%/60% 颜色阈值目前硬编码在两处——此处的 ContextUsageRingContextUsageMessage.tsxProgressBarusedPercentage > 80 / > 60)——仅靠上方注释维持一致,没有共享常量或工具函数。失败场景:若有人在 ContextUsageMessage.tsx 中调整面板阈值(如 warning 改为 70%,或与自动压缩水位对齐),输入框圆环仍按 60/80 变色——工具栏圆环与 /context 面板对同一会话的严重程度判断会不一致。新增测试只固定了圆环自身的 61/81/60,无法发现这种漂移。建议抽取两处共用的常量/分类函数(如上)。

— qwen3.8-max via Qwen Code /review (v0.21.8)

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

已处理(30d7248):新增共享工具 client/utils/contextUsage.ts,60/80 阈值与 getContextUsageLevel 由 composer 圆环和 /context 面板的 ProgressBar 共用,两处不会再漂移。

Comment on lines +509 to +510
export function formatContextUsageDetail(used: number, size: number): string {
const fmt = (n: number) => {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R1-2: This adds web-shell's sixth token-count formatter, inlined in the component, while client/utils/formatTokenCount.ts is the dedicated shared utility. It also drifts from the /context panel: this formatter renders 1,000,000 as 1.0M, while the panel's formatTokens (ContextUsageMessage.tsx) has no M branch and renders the same value as 1000.0k. — Failure scenario: on a 1M-token context window, the ring tooltip shows the window as 1.0M while the /context panel shows 1000.0k — two surfaces describing the same session disagree. Every future formatting rule change (rounding, units, locale) must now hunt down six copies.

Suggested fix: host the formatting in the shared util and import it here — e.g. extend client/utils/formatTokenCount.ts with a one-decimal + M variant and reuse it in formatContextUsageDetail, so token formatting has one discoverable home.

中文说明

[建议] 这里新增了 web-shell 的第六个 token 数格式化实现,且内联在组件里,而包内已有专门的共享工具 client/utils/formatTokenCount.ts。它还与 /context 面板不一致:此格式化器把 1,000,000 渲染为 1.0M,而面板的 formatTokensContextUsageMessage.tsx)没有 M 分支,会把同一数值渲染为 1000.0k。失败场景:在 1M token 上下文窗口下,圆环 tooltip 显示窗口为 1.0M,/context 面板却显示 1000.0k——描述同一会话的两个界面不一致;以后任何格式规则变更(取整、单位、本地化)都要找齐六处副本。建议把格式化收敛到共享工具(如为 formatTokenCount.ts 增加一位小数 + M 的变体),在此处导入复用。

— qwen3.8-max via Qwen Code /review (v0.21.8)

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

已处理(30d7248):formatter 移入共享的 client/utils/formatTokenCount.tsformatContextTokens / formatContextUsageDetail),/context 面板的本地 formatTokens 一并替换为共享实现——1M 窗口现在两个界面都显示 1.0M,不再出现 1000.0k 的分歧。

Comment on lines +10272 to +10274
tokenCount={connection.tokenCount ?? 0}
contextWindow={connection.contextWindow ?? 0}
onShowContextUsage={handleShowContextUsage}

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R1-3: The new App-level wiring (connection → ring props, ring click → showContextUsage('/context', false), 'contextUsage' entering the default toolbar actions) has no test, although App.test.tsx already mocks ChatEditor, captures latestChatEditorProps, mocks getContextUsage, and asserts visibleToolbarActions for other actions. The test-efficacy probe confirmed the gap: deleting each ?? 0 fallback on these two props individually left every test green. — Failure scenario: ChatEditor's own tests inject these props directly, so a regression at this seam ships green — swapping the two props renders an inverted ring (arc capped at 100% with a nonsense >100% label on a near-empty session); rewiring the handler to the detail variant opens /context detail instead of the compact breakdown; removing a fallback renders NaN from undefined before the first usage frame arrives.

Suggested fix: add App.test.tsx cases asserting latestChatEditorProps receives the connection values and visibleToolbarActions contains 'contextUsage'; invoking onShowContextUsage calls getContextUsage with { detail: false }; and with the usage fields left undefined the ring stays hidden (pinning the ?? 0 / tokenCount > 0 guard).

中文说明

[建议] 新的 App 层接线(connection → 圆环 props、点击圆环 → showContextUsage('/context', false)、默认工具栏动作加入 'contextUsage')没有任何测试,而 App.test.tsx 已有现成脚手架:mock 了 ChatEditor、捕获 latestChatEditorProps、mock 了 getContextUsage,并对其他动作断言过 visibleToolbarActions。测试有效性探针证实了缺口:分别删除这两个 ?? 0 兜底,所有测试仍为绿色。失败场景:ChatEditor 自己的测试直接注入这些 props,因此这一层的回归会静默通过——两个 props 互换会渲染出颠倒的圆环(近空会话显示满环 + 大于 100% 的荒谬标签);把 handler 误接到 detail 变体会打开 /context detail 而非简版面板;删掉兜底则在首个 usage 帧到达前渲染 NaN。建议补充 App.test.tsx 用例(如上)。

— qwen3.8-max via Qwen Code /review (v0.21.8)

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

已处理(30d7248):App.test.tsx 新增接线用例——默认 visibleToolbarActions 包含 contextUsageconnection.tokenCount/contextWindow 传导到 ChatEditor props、onShowContextUsage 点击触发 getContextUsage({ detail: false })

The shared TooltipContent drew its arrow with a ::before pinned at the
content's horizontal center. Near a viewport edge Radix collision
avoidance shifts the content, so the arrow stopped pointing at the
trigger (about 35-40px off for the composer's context ring, which sits
at the far right). Replace the pseudo-element with TooltipPrimitive.Arrow,
which computes the offset from the trigger and the collision-shifted
content, keeping the tip on target for every tooltip and side.
@wenshao

wenshao commented Aug 9, 2026

Copy link
Copy Markdown
Collaborator Author

已按建议修复(ed5ea4d):共享 TooltipContent 移除 before:* 伪元素箭头,改用 TooltipPrimitive.Arrow,由 Radix 根据 trigger 与碰撞位移后的 content 位置计算箭头偏移;没有给 context ring 加任何单独偏移,也没有关闭 collision avoidance,所有 tooltip / 各 side 通用。

右侧边界 hover 实测(真实 daemon + 无头 Chromium,1180px 视口):

Tooltip arrow aligned with the context ring at the right viewport edge

程序化测量:ring 中心 x=1102,箭头尖端中心 x=1101.97,偏差 0px;同一帧里 content 几何中心 x=1086.5(被碰撞回避左移约 15.5px),确认箭头不再跟随 content 中心而是锚定 trigger。并补了一个回归断言(tooltip 打开时必须存在 Radix tooltip-arrow 元素,防止回退到伪元素方案)。

@qwen-code-ci-bot qwen-code-ci-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed. Suggestions are inline. Not reviewed: reverse audit — stopped before round 2 by the review time budget.

中文说明

已审查。 建议见行内评论。 未审查:反向审计——评审时间预算不足,未能开始第 2 轮。

— qwen3.8-max via Qwen Code /review (v0.21.8)

Comment on lines +1411 to +1413
.contextRingValue {
stroke: var(--agent-blue-500);
transition: stroke-dashoffset 0.25s ease;

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R2-1: The ring arc's transition: stroke-dashoffset 0.25s ease is not guarded by prefers-reduced-motion, although this same file already contains two @media (prefers-reduced-motion: reduce) blocks suppressing comparable decorative motion (.specularEffect::before { transition: none; } ~line 773 and the .loadingIcon / .sendBtnArmed animations ~line 1722) — Failure scenario: a user with prefers-reduced-motion: reduce set at the OS level sees the arc visibly sweep on every usage change; connection.tokenCount updates after each model round, so the decorative 250 ms animation re-fires every turn while streaming.

Fix: add to one of the existing reduced-motion blocks:

.contextRingValue {
  transition: none;
}
中文说明

圆环弧线的 transition: stroke-dashoffset 0.25s ease 未在 prefers-reduced-motion 下关闭,而同一文件已有两个 @media (prefers-reduced-motion: reduce) 块抑制同类装饰性动效(约 773 行 .specularEffect::before { transition: none; }、约 1722 行 .loadingIcon / .sendBtnArmed 动画)。失败场景:系统设置了 prefers-reduced-motion: reduce 的用户会在每次 usage 变化时看到弧线扫动;connection.tokenCount 每轮模型调用后更新,流式期间该 250ms 装饰动画每轮重播一次。修复:在现有 reduced-motion 块中加入 .contextRingValue { transition: none; }

— qwen3.8-max via Qwen Code /review (v0.21.8)

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

已处理(30d7248):为 .contextRingValue 增加 @media (prefers-reduced-motion: reduce) { transition: none; },与文件内其它装饰性动画的抑制方式一致。

Comment on lines +445 to +447
const warn = renderChatEditor({ tokenCount: 61, contextWindow: 100 });
const error = renderChatEditor({ tokenCount: 81, contextWindow: 100 });
const normal = renderChatEditor({ tokenCount: 60, contextWindow: 100 });

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R2-2: The threshold tests pin the 60% boundary from both sides (60 → normal, 61 → warning) but the 80% boundary only from above (81 → error), so the one-line mutation pct > 80pct >= 80 in ContextUsageRing survives — a probe over all actual test inputs shows the mutant is observationally identical to the original across the whole suite — Failure scenario: with exactly 80.0% occupancy the mutant draws the arc in the error color instead of warning, diverging from ContextUsageMessage's usedPercentage > 80 that the comment above ContextUsageRing explicitly promises to mirror; no test input distinguishes the mutant from the original at that boundary.

Add a case pinning the boundary from below:

const exact = renderChatEditor({ tokenCount: 80, contextWindow: 100 });
// assert exact's arc class contains Warning and does not contain Error
中文说明

阈值测试对 60% 边界做了双侧钉住(60→normal、61→warning),但 80% 边界只从上侧钉(81→error),因此 ContextUsageRing 中的一行变异 pct > 80pct >= 80 可以存活——对全部现有测试输入的探针显示变异体与原实现行为完全一致。失败场景:恰好 80.0% 占用时,变异体会把弧线画成 error 色而非 warning 色,与 ContextUsageRing 上方注释承诺镜像的 ContextUsageMessageusedPercentage > 80 分叉;没有任何测试输入能在该边界区分两者。修复:补一个恰好 80% 的用例(断言弧线含 Warning 类且不含 Error 类)。

— qwen3.8-max via Qwen Code /review (v0.21.8)

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

已处理(30d7248):补了 80 整点用例,断言 exactly 80% 仍是 warning 且不是 error,把严格 > 的两侧边界都钉住(60 侧原有用例保持)。

Comment on lines +10272 to +10273
tokenCount={connection.tokenCount ?? 0}
contextWindow={connection.contextWindow ?? 0}

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R2-5: The two ?? 0 fallbacks feeding the new ring are untested — the test-efficacy probe (validated harness) deleted each one and every web-shell test stayed green — Failure scenario: no test renders the composer toolbar with a connection that has not yet received usage data (tokenCount/contextWindow undefined — the state right after connecting, or for sessions that never emit usage); if a future change lets undefined flow through, ContextUsageRing computes its percentage from undefined / window → NaN and renders a broken ring, with nothing in this diff's tests failing.

Add one test rendering the toolbar with undefined tokenCount/contextWindow and asserting the ring is hidden — a single case gates both fallbacks.

中文说明

喂给新圆环的两个 ?? 0 兜底没有测试覆盖——测试效力探针(已验证的 harness)分别删除两处变异体后 web-shell 全部测试仍绿。失败场景:没有任何测试渲染“连接尚未收到 usage 数据”(tokenCount/contextWindow 为 undefined——刚连接或会话从不发 usage 时的状态)的 composer 工具栏;若未来改动让 undefined 流入,ContextUsageRing 以 undefined/window 计算百分比得 NaN,渲染损坏的圆环,而本 PR 的测试不会失败。修复:补一个 undefined 态用例断言圆环隐藏——一个用例同时钉住两个兜底。

— qwen3.8-max via Qwen Code /review (v0.21.8)

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

已处理(30d7248):App.test.tsx 新增用例——connection.tokenCount/contextWindow 为 undefined(刚连接、尚无 usage)时 ChatEditor 收到 0/0,圆环隐藏,?? 0 fallback 不再是测试盲区。

…ing (review)

Review round 3 suggestions:
- The 60/80 severity thresholds now live in one shared helper used by
  both the composer ring and the /context panel, so the two surfaces
  cannot drift.
- The ring tooltip's token formatter moves into the shared token-count
  utils and the /context panel uses it too, giving both surfaces the
  same k/M rendering (the panel previously showed a 1M window as
  1000.0k).
- The ring arc's transition is disabled under prefers-reduced-motion,
  matching the file's other decorative motion.
- New tests: exactly-80% stays warning (pins the strict threshold), the
  App wiring from connection usage to the ring props, click-through
  reaching the context-usage request, and the 0 fallbacks before any
  usage arrives.
The same normalizer fix landed on main via #8790 while this PR was in
review; the merge auto-combined both edits into a duplicate case and a
duplicate test. Keep main's version — this branch now carries no
sdk-typescript delta.
@wenshao

wenshao commented Aug 9, 2026

Copy link
Copy Markdown
Collaborator Author

CI 说明:Test (ubuntu-latest, Node 22.x) 两次挂在 backgroundShellRegistry.test.ts 的 retention-cap 用例(15s 超时)。根因是 main 上已知的 CI 负载抖动——每次 register/complete 都写 status sidecar,高负载 runner 实测 ~700ms/写,最长循环 ~50s,#8797 已在 main 给这组用例 120s 显式 timeout;但本 PR 的 merge ref 早于该修复(rerun 复用旧 merge commit,所以重跑必然复现,日志仍是 "timed out in 15000ms")。已合并最新 main(2e1f321)刷新 merge ref,本地该文件 57 用例 3.2s 全过。合并同时消解了与 #8790 的重叠——同样的 usage_update normalizer 修复期间已独立落到 main,本分支现对 sdk-typescript 零差异,PR 描述已同步更新。

@qwen-code-ci-bot qwen-code-ci-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed. Suggestions are inline. Not explored to full depth (tool budget reached): PR #8794 adds a context-window usage ring to the web-shel...: (none — all checks I started were completed)..

中文说明

已审查。 建议见行内评论。 未探索到全部深度(达到工具调用预算):PR #8794 adds a context-window usage ring to the web-shel...:(none — all checks I started were completed).

— qwen3.8-max via Qwen Code /review (v0.21.8)

Comment on lines +12 to +14
export function formatContextTokens(count: number): string {
if (count >= 1_000_000) return `${(count / 1_000_000).toFixed(1)}M`;
if (count >= 1000) return `${(count / 1000).toFixed(1)}k`;

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R3-1: The new shared formatter leaves two pre-existing in-package copies behind — TasksStatusMessage.tsx:102-106 (formatTokenCount) is byte-for-byte identical to formatContextTokens, and MessageList.tsx:1852-1854 is a near-miss lacking only the M branch — although this PR exists to deduplicate exactly this logic. Failure scenario: any future rounding/units change in the shared helper silently diverges from the task-status copy, and the MessageList variant already differs today — a collapsed turn with ≥1M input tokens renders ↑1048.6k there while the ring tooltip and /context panel show 1.0M for the same session (reachable on 1M-context models).

Suggested fix: in TasksStatusMessage.tsx, replace the local formatTokenCount with import { formatContextTokens } from '../../utils/formatTokenCount' (the same swap this PR does in ContextUsageMessage.tsx), and consider adopting it in MessageList's collapsed-turn footer too to fix the 1048.6k vs 1.0M discrepancy.

中文说明

新的共享 formatter 在同包内遗留了两份既有副本:TasksStatusMessage.tsx:102-106formatTokenCount)与 formatContextTokens 逐字节等价,MessageList.tsx:1852-1854 仅差一个 M 分支——而本 PR 的目的正是消除这类重复。失败场景:未来对共享 helper 的任何舍入/单位调整都会与 task-status 里的副本悄悄分叉;MessageList 的变体今天就已经不一致——在 1M 上下文模型上,折叠轮次输入超过 1M token 时那里显示 ↑1048.6k,而圆环 tooltip 与 /context 面板对同一会话显示 1.0M

建议修复:在 TasksStatusMessage.tsx 中用 import { formatContextTokens } from '../../utils/formatTokenCount' 替换本地 formatTokenCount(与本 PR 在 ContextUsageMessage.tsx 中做的替换一致),并考虑让 MessageList 的折叠轮次页脚也采用它,以消除 1048.6k1.0M 的分歧。

— qwen3.8-max via Qwen Code /review (v0.21.8)

Comment on lines +432 to +434
expect(
document.querySelector('[data-slot="tooltip-arrow"]'),
).not.toBeNull();

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R3-2: The only assertion over the new Radix arrow is this presence check — it pins the mechanism (an element exists), not the effect the diff's own comment names (the arrow keeps pointing at the trigger). Probe: stripping the arrow's positioning classes (translate-y-[calc(-50%_-_2px)] rotate-45 border-r border-b) from ui/tooltip.tsx keeps the full web-shell suite (173 files / 2984 tests) green. Failure scenario: a follow-up edit or an npx shadcn@latest add regeneration drops or reorders those classes; the element still exists, so this test stays green while the arrow renders detached/misaligned — worst near viewport edges, exactly the collision case the change was made for.

Suggested change
expect(
document.querySelector('[data-slot="tooltip-arrow"]'),
).not.toBeNull();
expect(
document.querySelector('[data-slot="tooltip-arrow"]')?.getAttribute('class'),
).toContain('rotate-45');
中文说明

针对新 Radix 箭头的唯一断言是这个存在性检查——它钉住的是机制(元素存在),而不是 diff 注释所说的那个效果(箭头始终指向 trigger)。探针验证:从 ui/tooltip.tsx 中删除箭头的定位类(translate-y-[calc(-50%_-_2px)] rotate-45 border-r border-b)后,web-shell 全量套件(173 文件 / 2984 用例)依然全绿。失败场景:后续修改或 npx shadcn@latest add 重新生成该组件时丢掉或调换这些类;元素仍然存在,测试保持绿色,但箭头渲染会脱离/错位——在视口边缘最严重,正是本次改动要解决的碰撞场景。

上方 suggestion 将断言改为对定位类名的检查,让机制测试至少覆盖它所守护的机制;如需覆盖真实几何,可在现有 Playwright harness 中补充视觉/e2e 断言(jsdom 没有布局)。

— qwen3.8-max via Qwen Code /review (v0.21.8)

…copies (review)

Review round 4: the task-status panel's local formatter was
byte-identical to the shared one, and the collapsed-turn footer's copy
lacked the M branch — a collapsed turn with a >=1M-token input rendered
1048.6k while the ring tooltip and /context panel said 1.0M for the same
session. Both now import the shared formatter. Also pin the tooltip
arrow's positioning classes in the test, so a shadcn regeneration that
drops them fails instead of passing on a bare existence check.
@wenshao

wenshao commented Aug 9, 2026

Copy link
Copy Markdown
Collaborator Author

R3 两条建议已处理(88276e4,行内回复被 GitHub 限流,统一在此答复):

  • R3-1TasksStatusMessage 的本地 formatter(与共享版逐字节等价)和 MessageList 折叠轮次页脚的近似副本(缺 M 分支)都已改为导入共享的 formatContextTokens——1M 上下文会话在折叠页脚显示 ↑1048.6k、圆环 tooltip 显示 1.0M 的分歧一并消除,包内不再有重复实现。
  • R3-2:按建议把箭头断言从存在性检查强化为定位类名检查,同时钉住 rotate-45translate-y-[calc(-50%_-_2px)]——shadcn 重新生成丢类时测试会红;真实几何对齐已由 Playwright 实测覆盖(右缘 0px 偏差,见 PR 描述截图)。

web-shell 全量 173 文件 / 2984 用例通过,typecheck / lint / prettier 干净。

@qwen-code-ci-bot qwen-code-ci-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed. Suggestions are inline. Not explored to full depth (tool budget reached): PR #8794 adds an always-on context-window usage ring to t...: run npx vitest run for ChatEditor.test.tsx / App.test.tsx (new ring + wiring tests) — not run, dependencies not installed.; PR #8794 adds an always-on context-window usage ring to t...: inspect installed radix-ui Arrow rendering/rotation to settle the side-flip border question — not run, dependencies not installed.; PR #8794 adds an always-on context-window usage ring to t...: e2e visual/screenshot specs not run (need browser + baselines) — the tooltip arrow geometry change could shift tooltip-related visual baselines; jsdom tests can….

中文说明

已审查。 建议见行内评论。 未探索到全部深度(达到工具调用预算):PR #8794 adds an always-on context-window usage ring to t...:run npx vitest run for ChatEditor.test.tsx / App.test.tsx (new ring + wiring tests) — not run, dependencies not installed.;PR #8794 adds an always-on context-window usage ring to t...:inspect installed radix-ui Arrow rendering/rotation to settle the side-flip border question — not run, dependencies not installed.;PR #8794 adds an always-on context-window usage ring to t...:e2e visual/screenshot specs not run (need browser + baselines) — the tooltip arrow geometry change could shift tooltip-related visual baselines; jsdom tests can…

— qwen3.8-max via Qwen Code /review (v0.21.8)

Comment on lines +11 to +12
export function getContextUsageLevel(pct: number): ContextUsageLevel {
if (pct > CONTEXT_USAGE_ERROR_PCT) return 'error';

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R4-1: The new shared threshold utility (and the two new exports added to utils/formatTokenCount.ts) has no colocated test file — its boundary tests live two directories up in components/ChatEditor.test.tsx, breaking the colocated-tests convention (file.test.ts next to file.ts) that utils/ otherwise follows (~23 colocated test files). The strict-> invariant is covered today, but only by ring render tests whose name never mentions this utility. — Failure scenario: a maintainer touching contextUsage.ts — or adding a third consumer of the levels — greps for a test next to the file, finds none, and can plausibly flip > to >= without noticing coverage lives in a component test; the ring and the /context panel then silently disagree at the 60%/80% boundaries — the exact divergence this utility's doc comment promises to prevent. Fix: move the pure-logic tests into colocated utils/contextUsage.test.ts (boundary cases 60/61/80/81) and utils/formatTokenCount.test.ts (the formatContextUsageDetail block); keep the DOM-render tests in ChatEditor.test.tsx.

中文说明

新的共享阈值工具(以及 utils/formatTokenCount.ts 新增的两个导出)没有同目录测试文件——边界用例位于两层之外的 components/ChatEditor.test.tsx,与 utils/ 一贯遵循的同目录测试约定(file.test.ts 紧邻 file.ts,该目录已有约 23 个同目录测试)不一致。严格 > 不变量目前确有覆盖,但只存在于名称完全未提及该工具的圆环渲染测试里。——失败场景:维护者修改 contextUsage.ts(或新增第三个 level 使用方)时会在文件旁边 grep 测试,一无所获,可能在不察觉覆盖位于组件测试的情况下把 > 改成 >=;圆环与 /context 面板就会在 60%/80% 边界悄悄分叉——正是该工具文档注释承诺要防止的分歧。修复:把纯逻辑测试移入同目录的 utils/contextUsage.test.ts(60/61/80/81 边界用例)与 utils/formatTokenCount.test.tsformatContextUsageDetail 块);DOM 渲染测试保留在 ChatEditor.test.tsx

— qwen3.8-max via Qwen Code /review (v0.21.8)

Comment on lines +69 to +71
const usedLevel = getContextUsageLevel(usedPercentage);
const usedClass =
usedPercentage > 80
usedLevel === 'error'

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R4-2: The /context-panel half of the new shared-threshold contract has no test — nothing asserts which color class the panel's progress bar renders at any usage level. Probe-verified: swapping styles.error/styles.warning in this ternary keeps all 44 tests in the two relevant suites green (a comparator mutation correctly fails, so the harness is alive). — Failure scenario: that one-line mutation survives the whole suite while the panel renders the warning color above 80% occupancy where the ring shows error — the two surfaces diverging exactly at the most urgent threshold, against this PR's stated intent that they never disagree. Fix: add cases to ContextUsageMessage.test.tsx rendering statuses at e.g. 61% and 81% (the existing makeStatus helper with contextWindowSize: 100 makes this trivial) and assert the filled bar segment carries the warning/error class, mirroring the ring's boundary test.

中文说明

新共享阈值契约中 /context 面板这一半没有测试——没有任何用例断言面板进度条在各占用水平下渲染的颜色类。探针验证:把这个三元表达式里的 styles.error/styles.warning 互换,两个相关套件的全部 44 个用例仍然全绿(对照突变会正确失败,说明测试框架工作正常)。——失败场景:这一行突变在整个套件存活,而面板会在占用超过 80% 时渲染 warning 色、圆环却显示 error——两个界面恰好在最紧迫的阈值处分叉,与本 PR "两者永不分歧" 的声明意图相悖。修复:在 ContextUsageMessage.test.tsx 中新增例如 61% 与 81% 的用例(用现有 makeStatus 辅助函数配 contextWindowSize: 100 即可),断言已填充的进度条段带 warning/error 类名,与圆环的边界测试对齐。

— qwen3.8-max via Qwen Code /review (v0.21.8)

type WebShellAssistantTurnFooterRenderInfo,
} from '../customization';
import { useI18n } from '../i18n';
import { formatContextTokens as formatTokenCount } from '../utils/formatTokenCount';

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R4-3: This alias renames formatContextTokens to the exact name of the same module's other export, formatTokenCount, which behaves differently (floor-based k above 10k, no M unit). Measured divergence: 47,851 → 47k vs 47.9k; 1,234,567 → 1234k vs 1.2M. — Failure scenario: a maintainer adding another token display to this file sees formatTokenCount(…) calls already present and imports formatTokenCount from the same module (IDE autocomplete offers both names); no type error fires, but the output diverges from the adjacent UI — exactly the per-surface inconsistency the shared formatter was created to prevent. An engineer grepping formatTokenCount to learn what this footer renders also lands on the wrong function body. Fix: drop the alias and call formatContextTokens(…) directly (same pattern in TasksStatusMessage.tsx).

中文说明

这个别名把 formatContextTokens 重命名为同模块另一个导出 formatTokenCount 的确切名字,而两者行为不同(后者 10k 以上向下取整为 k、没有 M 单位)。实测分歧:47,851 → 47k vs 47.9k;1,234,567 → 1234k vs 1.2M。——失败场景:维护者在本文件新增一个 token 展示时,看到文件里已有 formatTokenCount(…) 调用,便从同一模块导入 formatTokenCount(IDE 自动补全会同时给出两个名字);不会报类型错误,但输出与相邻 UI 分歧——正是共享 formatter 要消除的界面间不一致。grep formatTokenCount 想了解该页脚渲染逻辑的工程师也会落到错误的函数体上。修复:去掉别名,直接调用 formatContextTokens(…)TasksStatusMessage.tsx 同理)。

— qwen3.8-max via Qwen Code /review (v0.21.8)

import { useDelayedGlobalKeyDown } from '../../hooks/useDelayedGlobalKeyDown';
import { useI18n } from '../../i18n';
import { formatRuntime } from '../../utils/formatRuntime';
import { formatContextTokens as formatTokenCount } from '../../utils/formatTokenCount';

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R4-3: Same pattern as MessageList.tsx — this alias renames formatContextTokens to the exact name of the same module's other export, formatTokenCount, which behaves differently (floor-based k above 10k, no M unit; measured: 47,851 → 47k vs 47.9k, 1,234,567 → 1234k vs 1.2M). — Failure scenario: a maintainer adding another token display here imports the wrong same-named function; no type error fires, but the output diverges from the adjacent UI — exactly the per-surface inconsistency the shared formatter was created to prevent. Fix: drop the alias and call formatContextTokens(…) directly.

中文说明

MessageList.tsx 相同的模式——这个别名把 formatContextTokens 重命名为同模块另一个导出 formatTokenCount 的确切名字,而两者行为不同(后者 10k 以上向下取整为 k、没有 M 单位;实测:47,851 → 47k vs 47.9k,1,234,567 → 1234k vs 1.2M)。——失败场景:维护者在此处新增 token 展示时导入了同名的错误函数;不会报类型错误,但输出与相邻 UI 分歧——正是共享 formatter 要消除的界面间不一致。修复:去掉别名,直接调用 formatContextTokens(…)

— qwen3.8-max via Qwen Code /review (v0.21.8)

Comment on lines +55 to +56
<TooltipPrimitive.Arrow
data-slot="tooltip-arrow"

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R4-4: Adding the Radix Arrow child silently moves every web-shell tooltip ~10px farther from its trigger. Verified against the installed @radix-ui/react-popper@1.3.3 dist: the offset middleware computes offset({ mainAxis: sideOffset + arrowHeight }); the new arrow measures 10px (size-2.5), so the kept sideOffset = 8 (tuned for the removed pseudo-element, whose tip filled the 8px gap) puts the content edge at 18px while the rotated-diamond tip protrudes only ~5px — a ~13px tip-to-trigger gap where it was ~0 before. All 13 TooltipContent consumers inherit the default (no caller passes sideOffset), and jsdom tests cannot observe layout. — Failure scenario: every existing tooltip (ChatEditor toolbar, workspace/git indicators, markdown tables, skills/extensions/MCP/agents manager pages) renders visibly farther from its trigger after this PR, with no test to catch it. Fix: lower the TooltipContent default sideOffset from 8 toward 4 (the shadcn default this arrow design is tuned against — sibling ui/popover.tsx and ui/dropdown-menu.tsx already use 4), or compensate by moving the arrow outward (drop/adjust the -2px term in translate-y-[calc(-50%_-_2px)]) so the protrusion matches the height Radix reserves.

中文说明

加入 Radix Arrow 子元素会让 web-shell 的每个 tooltip 悄悄远离 trigger 约 10px。已对照安装的 @radix-ui/react-popper@1.3.3 dist 验证:offset 中间件按 offset({ mainAxis: sideOffset + arrowHeight }) 计算;新箭头实测 10px(size-2.5),于是保留的 sideOffset = 8(原本是为已删除的伪元素调的,其箭头尖端恰好填满 8px 间隙)使 content 边缘距 trigger 18px,而旋转菱形尖端只外凸约 5px——尖端到 trigger 的间隙从约 0 变为约 13px。全部 13 个 TooltipContent 使用方都继承默认值(无人传 sideOffset),jsdom 测试无法观测布局。——失败场景:本 PR 之后所有既有 tooltip(ChatEditor 工具栏、工作区/git 指示器、markdown 表格、skills/extensions/MCP/agents 管理页)都明显远离 trigger,且没有任何测试能捕获。修复:把 TooltipContent 默认 sideOffset 从 8 降到约 4(该箭头设计对应的 shadcn 默认值——同包的 ui/popover.tsxui/dropdown-menu.tsx 已用 4),或把箭头向外补偿(去掉/调整 translate-y-[calc(-50%_-_2px)] 中的 -2px 项),使外凸量与 Radix 预留的高度匹配。

— qwen3.8-max via Qwen Code /review (v0.21.8)

…ation (review)

Review round 5:
- With a Radix Arrow child, the offset middleware computes
  sideOffset + arrowHeight, so keeping the pseudo-element-era default of
  8 pushed every tooltip ~10px farther from its trigger. Default now 0;
  measured in a real browser the content edge sits 10px from the trigger
  (8px before the arrow change) with the tip 6px away.
- Drop the formatContextTokens-as-formatTokenCount aliases: the alias
  reused the exact name of the module's other, differently-behaving
  export, inviting wrong-import drift. Call sites use the real name.
- Colocate the pure-logic tests: utils/contextUsage.test.ts pins the
  strict-> boundaries, utils/formatTokenCount.test.ts owns the formatter
  cases (moved from ChatEditor.test.tsx), and ContextUsageMessage gains
  progress-bar color cases at 60/61/80/81 so the panel half of the
  shared-threshold contract is pinned too.
@wenshao

wenshao commented Aug 9, 2026

Copy link
Copy Markdown
Collaborator Author

R4 五条已全部处理(68dd352):

  • R4-4(真实回归,感谢捕获):Radix Arrow 存在时 offset 中间件按 sideOffset + arrowHeight 计算间距,沿用伪元素时代的默认值 8 会让所有 tooltip 远离 trigger ~10px。默认 sideOffset 改为 0,真实浏览器实测:content 边缘距 trigger 10px(箭头改造前为 8px,基本还原),箭头尖端距 trigger 5.9px、突出 content 4.1px。
  • R4-3(两处):去掉 formatContextTokens as formatTokenCount 别名,MessageListTasksStatusMessage 的调用点直接使用真名,消除与同模块另一个同名异行为导出的混淆。
  • R4-1:纯逻辑测试就位同目录——新增 utils/contextUsage.test.ts(60/61/80/81 严格 > 边界,用常量而非魔数表达)与 utils/formatTokenCount.test.ts(formatter 用例自 ChatEditor.test.tsx 迁入,另补 size=0 不除零用例);DOM 渲染测试留在组件侧。
  • R4-2ContextUsageMessage.test.tsx 新增进度条配色用例(60→accent、61→warning、80→warning、81→error),共享阈值契约的面板半边也钉住了,探针提到的 error/warning 互换突变现在会红。

web-shell 全量 175 文件 / 2988 用例通过,typecheck / lint / prettier 干净。

@qwen-code-ci-bot qwen-code-ci-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed — no blockers. Suggestions are inline.

中文说明

已审查——无阻断问题。 建议见行内评论。

— qwen3.8-max via Qwen Code /review (v0.21.8)

Comment on lines 412 to +414
const DEFAULT_COMPOSER_TOOLBAR_ACTIONS = [
'approvalMode',
'contextUsage',

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R5-1: The new contextUsage action only reaches the main composer — the split-view pane composers (ChatPane.tsx, PANE_TOOLBAR_ACTIONS = ['approvalMode', 'model', 'voice']) neither list it nor receive tokenCount/contextWindow/onShowContextUsage. The PR body declares split panes out of scope, which is fine — but the comment above PANE_TOOLBAR_ACTIONS still claims panes "get the same interactive composer controls as the main chat" while only enumerating the width-toggle omission, so the new exclusion is undocumented. — Failure scenario: a future reader trusts the stale parity comment (or a user files a bug when panes don't show the ring); a split-view user runs a pane session toward context exhaustion with no indicator while the main composer advertises one. Suggested fix: extend the PANE_TOOLBAR_ACTIONS comment in ChatPane.tsx to name the contextUsage exclusion, or wire the ring into panes.

中文说明

新的 contextUsage action 只进入主 composer——分屏 pane 的 composer(ChatPane.tsxPANE_TOOLBAR_ACTIONS = ['approvalMode', 'model', 'voice'])既未列出它,也未接收 tokenCount/contextWindow/onShowContextUsage。PR 描述已声明分屏暂不在本次范围内,这没有问题——但 PANE_TOOLBAR_ACTIONS 上方的注释仍声称 pane“获得与主聊天相同的交互式 composer 控件”,且只列举了 width 切换一项例外,新增的排除项没有被记录。— 失败场景:未来读者相信这条过时的“平权”注释(或用户在 pane 不显示圆环时提 bug);分屏用户把某个 pane 会话用到接近上下文上限时没有任何指示,而主 composer 却展示着该功能。建议修复:在 ChatPane.tsxPANE_TOOLBAR_ACTIONS 注释中写明 contextUsage 的排除,或把圆环接入 pane。

— qwen3.8-max via Qwen Code /review (v0.21.8)

Comment on lines +10638 to +10640
tokenCount={connection.tokenCount ?? 0}
contextWindow={connection.contextWindow ?? 0}
onShowContextUsage={handleShowContextUsage}

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R5-2: tokenCount={connection.tokenCount ?? 0} passes a raw primitive that changes on every usage-bearing daemon event (once per model round — updateConnectionFromDaemonEvent writes a fresh connection object and inputTokens grows each round). ChatEditor is memo(forwardRef(...)) with the default shallow comparator, and every other prop at this render site is stable across usage events — so before this PR these renders were skipped; now each model round forces a full composer re-render even though only the 16×16 ring value changes. — Failure scenario: during an agentic turn with many model rounds, the ~2,700-line composer re-renders once per round — the exact churn the adjacent handleShowContextUsage comment ("ChatEditor is memoized and an inline closure would re-render it on every app render") says this codebase avoids. Suggested fix: pass display-quantized values across the memo boundary (e.g. the preformatted formatContextTokens strings, or pct rounded to 0.1%), or give memo a custom comparator for these two props.

中文说明

tokenCount={connection.tokenCount ?? 0} 传入的是一个原始数值,每次带 usage 的 daemon 事件都会变化(每轮模型调用一次——updateConnectionFromDaemonEvent 会写入新的 connection 对象,且 inputTokens 逐轮增长)。ChatEditor 是带默认浅比较器的 memo(forwardRef(...)),而该渲染处其余所有 prop 在 usage 事件之间都是稳定的——因此本 PR 之前这些渲染会被 memo 跳过;现在每轮模型调用都会强制整个 composer 重新渲染,尽管只有 16×16 的圆环数值变了。— 失败场景:在多轮模型调用的 agentic 回合中,这个约 2,700 行的 composer 每轮都重新渲染——正是旁边 handleShowContextUsage 注释(“ChatEditor 已 memo 化,内联闭包会让它在每次 app 渲染时重渲染”)声明要避免的抖动。建议修复:跨 memo 边界传显示量化后的值(如预格式化的 formatContextTokens 字符串,或按 0.1% 取整的百分比),或为这两个 prop 给 memo 传自定义比较器。

— qwen3.8-max via Qwen Code /review (v0.21.8)

Comment on lines +469 to +470
const arc = button.querySelectorAll('circle')[1];
expect(arc.getAttribute('stroke-dashoffset')).toBe('0');

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R5-3: The ring's proportional arc fill — its core visual function — is only pinned at the capped 100% endpoint; no test reads stroke-dashoffset/stroke-dasharray at any intermediate percentage. — Failure scenario: verified surviving mutations — strokeDashoffset={C * (1 - capped / 100) * 2} renders an empty arc at 50% usage, and strokeDasharray={C * 4} renders a full ring at every pct; both pass the whole suite because at capped=100 the offset is 0 either way and nothing else reads these attributes. Suggested fix: add an intermediate case — render tokenCount: 50, contextWindow: 100 and assert Number(arc.getAttribute('stroke-dashoffset')) equals half of the element's own stroke-dasharray (within float tolerance), reading dasharray from the rendered DOM so the oracle stays effect-shaped ("half-filled ring").

中文说明

圆环按比例填充的弧线——它的核心视觉功能——只在封顶的 100% 端点被钉住;没有任何测试在中间百分比读取 stroke-dashoffset/stroke-dasharray。— 失败场景:已验证可存活的变异——strokeDashoffset={C * (1 - capped / 100) * 2} 在 50% 占用时渲染出空弧,strokeDasharray={C * 4} 在任何百分比都渲染满环;两者都能通过全部用例,因为 capped=100 时两种写法 offset 都是 0,且没有别处读取这些属性。建议修复:补一个中间值用例——渲染 tokenCount: 50, contextWindow: 100,断言 Number(arc.getAttribute('stroke-dashoffset')) 等于该元素自身 stroke-dasharray 的一半(浮点容差内),dasharray 从渲染出的 DOM 读取,让判据保持“半满圆环”这一效果形状。

— qwen3.8-max via Qwen Code /review (v0.21.8)

Comment on lines 37 to +39
function TooltipContent({
className,
sideOffset = 8,
sideOffset = 0,

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R5-4: The sideOffset 8→0 override — the round-4 regression fix — is pinned by no test. There is no unit test for ui/tooltip.tsx, and the only e2e tooltip assertion (composer-tag viewport bounds) cannot detect a ~10px spacing shift; the diff's own test comment anticipates a shadcn regeneration of this exact file and pins the arrow classes, but not the spacing they depend on. — Failure scenario: npx shadcn@latest add tooltip (the repo-blessed workflow in AGENTS.md) regenerates the file, restoring upstream's nonzero default sideOffset; the arrow-class assertions fail and get restored, but with the offset middleware computing sideOffset + arrowHeight every tooltip in the shell silently moves ~10px farther from its trigger — the exact regression round 4 reported. Suggested fix: pin the geometry at the primitive level (e.g. render an open tooltip in jsdom and assert the popper content's inline transform carries no main-axis offset, or pin trigger-to-tooltip spacing in an e2e hover flow).

中文说明

sideOffset 8→0 的覆盖——第 4 轮回归的修复——没有任何测试钉住。ui/tooltip.tsx 没有单测,唯一的 e2e tooltip 断言(composer 标签 tooltip 的视口边界)无法感知约 10px 的间距变化;diff 自己的测试注释预见到了 shadcn 会重新生成这个文件,并钉住了箭头类名,却没钉住这些类名所依赖的间距。— 失败场景:npx shadcn@latest add tooltip(AGENTS.md 中仓库认可的工作流)重新生成该文件、恢复上游非零的默认 sideOffset 时,箭头类名断言会失败并被还原,但 offset 中间件按 sideOffset + arrowHeight 计算,shell 里所有 tooltip 会悄无声息地远离 trigger 约 10px——正是第 4 轮报告的回归。建议修复:在 primitive 层钉住几何(如在 jsdom 渲染打开的 tooltip 并断言 popper content 的内联 transform 无主轴偏移,或在 e2e hover 流程中钉住 trigger 与 tooltip 的间距)。

— qwen3.8-max via Qwen Code /review (v0.21.8)

Comment on lines +2446 to +2448
}}
disabled={!onShowContextUsage}
aria-label={t('status.contextUsed', {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R5-5: The disabled={!onShowContextUsage} branch is never asserted — the four tests that render the ring without a handler only read presence, classes, aria-label and stroke-dashoffset. — Failure scenario: ChatEditor is exported and onShowContextUsage is optional; if the guard regresses (removed or inverted), an embedder host omitting the handler renders a ring that looks clickable and does nothing on click (onShowContextUsage?.() is a no-op), and no test fails. Suggested fix: in one of the existing handler-less renders (e.g. the threshold test), add expect(ring(container)!.disabled).toBe(true);

中文说明

disabled={!onShowContextUsage} 分支从未被断言——四个不带 handler 渲染圆环的用例只读取元素存在性、类名、aria-label 和 stroke-dashoffset。— 失败场景:ChatEditor 是导出组件且 onShowContextUsage 可选;若该守卫回归(被删除或写反),不传 handler 的宿主会渲染出一个看似可点、点击却无反应(onShowContextUsage?.() 是空操作)的圆环,且没有测试失败。建议修复:在现有不带 handler 的渲染之一(如阈值用例)中补 expect(ring(container)!.disabled).toBe(true);

— qwen3.8-max via Qwen Code /review (v0.21.8)

Comment on lines +29 to +30
it('reports 0.0% for an unknown window instead of dividing by zero', () => {
expect(formatContextUsageDetail(100, 0)).toBe('100 / 0 tokens (0.0%)');

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R5-6: formatContextUsageDetail is tested for normal values and the zero-window edge, but never for overflow (used > size) — although overflow is a designed, exercised state (the ring's cap test uses 150/100, and the component comment documents that the label keeps reporting real overflow). — Failure scenario: someone "tidies" the formatter with Math.min(pct, 100); a session at 150% occupancy then shows a tooltip of (100.0%) while the pinned aria-label says 150.0% context used — two surfaces of the same ring contradicting each other, and nothing in the suite fails. Suggested fix: add expect(formatContextUsageDetail(150, 100)).toBe('150 / 100 tokens (150.0%)');

中文说明

formatContextUsageDetail 测了常规值和零窗口边界,但从未测过溢出(used > size)——尽管溢出是设计内的、被实际执行的状态(圆环封顶用例用了 150/100,组件注释也写明标签会如实报告溢出)。— 失败场景:有人用 Math.min(pct, 100)“顺手整理”这个 formatter;150% 占用的会话 tooltip 会显示 (100.0%),而钉住的 aria-label 却是 150.0% context used——同一圆环的两个表面互相矛盾,套件中没有任何用例失败。建议修复:补 expect(formatContextUsageDetail(150, 100)).toBe('150 / 100 tokens (150.0%)');

— qwen3.8-max via Qwen Code /review (v0.21.8)

Comment on lines +6852 to +6853
usageConnection.tokenCount = 338;
usageConnection.contextWindow = 1000;

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R5-7: These tests mutate the module-scoped shared mockConnection, and the file's exhaustive beforeEach reset block (sessionId, gitStatus, capabilities, …) was not extended to clear tokenCount/contextWindow — cleanup happens only by accident because the adjacent second test sets both back to undefined. — Failure scenario: a maintainer inserts a test between the two new ones, reorders the describe block, or .skips "defaults the composer ring props to 0"; from then every subsequent test in this ~15k-line file renders App with tokenCount=338/contextWindow=1000 still set. Both the composer ring and the StatusBar context indicator gate on exactly those two fields, so an extra ring button and a status-bar segment silently appear in every later full-App render, breaking unrelated assertions with no pointer back here. (The same mutate-shared-connection pattern exists pre-diff later in this file; resetting both fields in the existing beforeEach covers both at once.) Suggested fix: add mockConnection.tokenCount = undefined; mockConnection.contextWindow = undefined; to the existing beforeEach reset block.

中文说明

这些用例直接修改模块级共享的 mockConnection,而文件里详尽的 beforeEach 重置块(sessionId、gitStatus、capabilities 等)没有扩展去清理 tokenCount/contextWindow——目前的清理纯属巧合:依赖相邻的第二个用例把两个字段设回 undefined。— 失败场景:维护者在两个新用例之间插入用例、调整 describe 顺序或 .skip 掉 "defaults the composer ring props to 0";此后这个约 1.5 万行文件里的每个后续用例渲染 App 时都带着 tokenCount=338/contextWindow=1000。composer 圆环和 StatusBar 上下文指示恰好都以这两个字段为门控,于是之后的每个完整 App 渲染都会悄悄多出一个圆环按钮和一段状态栏指示,弄坏无关断言且毫无指向本用例的线索。(同样的“修改共享 connection”模式在 diff 之前就存在于本文件后部;在现有 beforeEach 里重置这两个字段可一次性覆盖两处。)建议修复:在现有 beforeEach 重置块中补 mockConnection.tokenCount = undefined; mockConnection.contextWindow = undefined;

— qwen3.8-max via Qwen Code /review (v0.21.8)

@wenshao

wenshao commented Aug 10, 2026

Copy link
Copy Markdown
Collaborator Author

R5 七条均为 Suggestion 级、无 Critical。本 PR 已经历 5 轮 review,按 AGENTS.md 的收敛规则(约 5 轮后仅落 Critical 修复,其余延后并在线程记录),R5 全部延后到 follow-up,逐条记录如下:

  • R5-1(pane composer 未接入圆环):PR 描述 Risk & Scope 已声明分屏 pane 不在本 PR 范围(pane 需要独立的 per-pane usage 数据源,不是简单透传);follow-up 实现。
  • R5-2(tokenCount 原始值每轮变化触发 ChatEditor 重渲染):每个模型轮次一次重渲染是圆环更新的必要代价,量级可忽略;如需进一步收敛可在 follow-up 里改传预算比或加自定义比较器。
  • R5-3(中间百分比的 dashoffset 无断言)、R5-4(sideOffset=0 无测试钉住)、R5-5(disabled 分支未断言)、R5-6(overflow 详情格式未测)、R5-7(beforeEach 未清 tokenCount/contextWindow,靠相邻用例顺序兜底):均为测试加固项,合并为一个 follow-up 测试 PR 处理。

如 maintainer 认为其中某条应升级为本 PR 阻塞项,说一声我立即落。

@wenshao

wenshao commented Aug 10, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 10, 2026

Copy link
Copy Markdown
Collaborator

Sandboxed verification: ✅ passed — merge-ready (agent verdict) - workflow run

Ran the PR in an isolated, token-free container: A/B against the base build, mock-free harness assertions, targeted gates. Advisory evidence for human reviewers — not a review, an approval, or a CI check.

Scripted assertions: 3091 passed · 0 failed · 3091 total

中文 — 判定:✅ 通过 · 可合入(agent 判定)

沙箱验证在隔离、无凭证的容器中执行了该 PR 的代码(与 base 构建 A/B 对照、无 mock harness 断言、定向门禁)。仅作为评审证据,不构成评审、批准或 CI 检查

脚本断言:3091 通过 · 0 失败 · 3091 总计

Verification report

PR #8794 Deep Verification — composer context-usage ring (web-shell)

Verdict: merge-ready — 3091/3091 scripted assertions passed, 0 failures. Verified head: 68dd35218cf276f03f3a41f32264491082cf2764 (git rev-parse HEAD^2), merged into base 55e20db328248436ae65743986906ff1fbc5ea58.

中文摘要
  • 结论merge-ready。3091/3091 条脚本化断言通过,0 失败;未发现阻断性问题。
  • A/B 结论:同一渲染探针在 head 与 base 两个 worktree 上运行:head 7/7 cell 绿(圆环出现、阈值类名、100% 封顶、0/未知时隐藏、tooltip 详情、点击打开 /contextcomposerToolbarActions 控制);base 侧 head-spec 6/7 cell 红(全部 expected null not to be null,即 PR 前该位置无任何渲染),唯一在两臂都通过的是"0/未知时不渲染"这一不变量 cell。见 01-ab-head-all-green.png / 02-ab-base-flip-head-spec-red.png
  • 突变矩阵:6 个突变(M1 隐藏守卫、M2 阈值 >>=、M3 封顶、M4 App ?? 0、M5 Radix Arrow、M6 格式化器 M 后缀正控)全部被相应测试以"期望值不符"杀死,无存活者;M4 的孪生接线测试在突变下仍绿(内部控制)。见 03-mutation-threshold-killed-three-surfaces.png
  • 格式化器合并:与 base 逐字提取的三份本地实现做 14 档阶梯对比 —— TasksStatus 字节级一致;MessageList 折叠脚注与 /context 面板仅在 ≥1M 处出现有意的 k→M 变化(1048.6k1.0M 等 6 档,全部枚举)。见 04-formatter-equivalence-matrix.png
  • 前提核实:描述称"此前占用不可见"成立——base 的 StatusBar 上下文按钮被 !compact 门控,而唯一实例传 compact={true},且 StatusBar 不在库的公开导出中,任何出厂布局都不可达。
  • findings:无阻断项;两条信息性说明见正文(有意的 ≥1M 显示变化;tooltip 像素级几何本容器无法测量)。
  • 未覆盖:真实浏览器像素几何与悬停指针路径(容器无浏览器)、qwen serve+真实模型的流式链路、per-commit 归因(depth-2 shallow)、Playwright e2e。

Scope selection

  • Central claim: after usage arrives, the composer toolbar renders a context-occupancy ring (position, thresholds, 100% cap, hiding rules, tooltip detail, click-through to /context, embedder action control) wired from connection.tokenCount/contextWindow.
  • Secondary claim 1: the shared getContextUsageLevel / formatContextTokens consolidation is behavior-preserving at every pre-existing call site except the intended ≥1M M-branch.
  • Secondary claim 2: the shared-tooltip rework (pseudo-element arrow → TooltipPrimitive.Arrow, sideOffset 8→0) keeps all ~10 tooltip consumers intact.

Out of scope by construction: everything outside packages/web-shell (the diff touches nothing else — verified: git diff --stat HEAD^1..HEAD -- packages/webui packages/sdk-typescript package.json package-lock.json is empty).

Central claim — A/B load-bearing proof

One probe file (harness/ab-context-ring.test.tsx, identical bytes on both arms) renders ChatEditor through the same mock plumbing the PR's own tests use, in 7 cells. Base arm = git worktree add tmp/base-tree HEAD^1 with the nested third-party node_modules symlinked (PR leaves package.json/lockfile untouched, so the dependency set is byte-identical). Workspace-link confound asserted inert: @qwen-code/webui and @qwen-code/sdk resolve into the head tree, and the diff provably changes neither package.

cell observable oracle head base (head-spec) base (absence-spec)
1 presence @​34.3% ring exists, aria-label "34.3% context used", before live-voice button expected null not to be null ✅ absent
2 thresholds 60/61/80/81 arc classes: normal/warning/warning/error (strict >) ✅ absent
3 overflow 150% stroke-dashoffset = "0", label 150.0% context used ✅ absent
4 hidden @​0 / unknown window no ring ✅ (invariant)
5 tooltip on focus 53.6k / 1.0M tokens (5.4%) + arrow classes ✅ absent
6 click-through onShowContextUsage called once ✅ absent
7 composerToolbarActions hidden without contextUsage, shown with ✅ absent

Head 7/7 green; base 6/7 red on the feature spec — the flip is total. The flip run is witness-only in the tally; the scripted absence-spec on base (12 expects) encodes the control expectation. App-level wiring (connection.tokenCount ?? 0 → props → getContextUsage({detail:false})) is pinned by the PR's two new App.test.tsx tests, which ran green in the full suite and whose fallback half is mutation-killed below (M4).

Evidence: 01-ab-head-all-green.png, 02-ab-base-flip-head-spec-red.png; raw logs in logs/.

Verified premise (description claim confirmed, with mechanism)

The PR says occupancy was invisible before it. Base does contain a StatusBar context button (status.contextUsed, present in en/zh dictionaries at base), but it is gated !compact && contextWindow > 0 && tokenCount > 0, the single <StatusBar> instantiation in App.tsx:10756 passes compact={true}, and StatusBar is not in the library's public exports (client/index.tsx). So the base indicator is unreachable in every layout the repo ships — the "invisible until /context" premise holds, and the ring is the first visible indicator. No correction to the description is needed; this note records why the premise survives the apparent counterexample.

Mutation matrix (vacuity) — no survivors

Every mutation was applied in a scratch worktree at HEAD, run against the pinning suite, and reverted (tree verified clean afterwards).

# mutation pinning suite result (failure message quoted)
M1 remove contextWindow > 0 && tokenCount > 0 render guard ChatEditor hiding test killedexpected <button …> to be null (logs/m1-guard-removed.log)
M2 thresholds >>= in contextUsage.ts util test + ring test + /context panel test killed ×3expected 'warning' to be 'normal', expected '_warning_…' to contain 'accent', not to contain 'Warning' (03-…png, logs/m2-…log)
M3 remove Math.min(pct, 100) cap cap test killedexpected '-18.84955592153876' to be '0'
M4 remove App ?? 0 fallbacks App defaults test killedexpected undefined to be +0; its sibling wiring test stayed green under the mutation (internal control: the right test pins the right hunk)
M5 delete TooltipPrimitive.Arrow from shared tooltip tooltip test's arrow-class pin killed at the rotate-45 / translate-y-[…] assertions — the test pins positioning classes, not mere existence, exactly as its comment claims
M6 drop the M suffix in formatContextTokens (positive control) formatTokenCount.test.ts killedexpected '1.0' to be '1.0M'

All six kills fail the intended value assertion (expected-vs-actual quoted), not an import/compile break. The positive control (M6) proves the harness can make suites fail.

Secondary claim 1 — formatter consolidation equivalence

Base implementations extracted verbatim from HEAD^1; the head side imports the real shared module; 14-rung ladder (0 … 100 000 000, boundaries at 999/1000 and 999 999/1 000 000, plus negative/fractional/zero-window probes). 56 scripted expects, all green (04-formatter-equivalence-matrix.png, logs/formatter-equivalence.log):

  • TasksStatusMessage: byte-identical on every rung (its local copy was indeed the same k/M formatter).
  • MessageList collapsed-turn footer and /context panel: byte-identical below 1M; at ≥1M exactly six rungs change, all the intended k→M rendering — 1000.0k→1.0M, 1048.6k→1.0M, 1234.6k→1.2M, 10500.0k→10.5M, 100000.0k→100.0M (×2). This is a real user-visible copy change, matching the review-round-4 commit's stated intent (a ≥1M-token collapsed turn no longer reads 1048.6k while the ring says 1.0M).
  • formatContextUsageDetail reproduces every tooltip string quoted in the PR description (34.3k / 100.0k tokens (34.3%) etc.), and size=0 yields (0.0%) instead of dividing by zero.

Secondary claim 2 — shared tooltip rework

  • Mechanism verified from the shipped dependency, not from prose: @radix-ui/react-popper/dist/index.mjs:140 computes offset({ mainAxis: sideOffset + arrowHeight }), so with the new 10px Arrow the default gap is 0 + 10px content-edge (vs 8px with the layout-invisible pseudo-element) — the arithmetic the sideOffset 8→0 change relies on holds.
  • No consumer passes an explicit sideOffset to the shared TooltipContent; every explicit sideOffset site found in the package is either PopoverContent or a direct TooltipPrimitive.Content use (the composer tag tooltip at ChatEditor.tsx:366, which the e2e smoke spec asserts on — untouched by this change). So no existing tooltip gets an unintended +arrowHeight shift; all take the +2px default move the PR measured.
  • All 10 TooltipContent consumers render compatibly: full suite green (below). Pixel-level geometry (tip-to-trigger alignment at the viewport edge) is not measurable in this container — see Not covered.

Targeted gates

  • npm run test in packages/web-shell at the merge commit: 175 files / 2988 tests, 0 failures (logs/head-full-suite.log). (The description cited 173/2984 at the author's merge point; the base tip moved since, adding 2 files / 4 tests outside this diff.)
  • npm run typecheck in packages/web-shell: clean (logs/head-typecheck.log).
  • Repo-wide gates not run (diff is web-shell-only); webui/sdk suites untouched by the diff.

Reviewer Test Plan, per step

  1. Ring appears after first model roundverified at wiring/render level: A/B cells 1–3 + App tests (tokenCount/contextWindow → props). The live streaming path itself (daemon → usage_update → connection state) is pre-existing base surface unchanged by this diff; not re-driven end-to-end here (no daemon/model in sandbox).
  2. Hover tooltip + click opens /context, values agreeverified via focus (jsdom proxy for hover): cell 5 tooltip text; cell 6 + App test assert getContextUsage({detail:false}) dispatch, mutation-pinned at the App fallback level (M4). True pointer-hover not exercisable in jsdom.
  3. Threshold colorsverified at class level (cell 2, M2-killed on both surfaces). Computed RGB values not measurable without a browser.
  4. Embedder controlverified (cell 7 + PR tests; contextUsage joins DEFAULT_COMPOSER_TOOLBAR_ACTIONS additively; explicit lists are untouched).
  5. usage_update transcript regressionno delta to verify: the fix landed on base via fix(sdk): hide ACP usage updates from transcripts #8790 (usage_update handler present in HEAD^1 normalizer) and this PR's diff contains no sdk-typescript changes (verified empty).

Findings

None blocking. Informational:

  • N1 (intended, verified): the ≥1M formatter delta above changes visible copy in two pre-existing surfaces (collapsed-turn footer, /context panel). Enumerated and matched against the commit's stated intent; flagging only so a reviewer sees the user-visible surface list.
  • N2 (measurement limit, not a defect): every tooltip's content edge moves 8px→10px from its trigger by construction (arrow now occupies layout space); the PR reports real-browser measurement of this. No browser exists in this container, so geometry rests on the verified Radix math + the author's stated measurement.

Not covered

  • Real-browser rendering: pixel geometry of the ring/tooltip, computed colors, pointer-hover, collision-avoidance arrow alignment at the viewport edge. Container ships no browser binary (PLAYWRIGHT_BROWSERS_PATH empty; no system chromium). The harness reproduces the behavioral contract, not the visual one.
  • qwen serve end-to-end with a live model (no daemon/credentials in sandbox) — the PR's own screenshots cover this surface.
  • Per-commit attribution: checkout is depth-2 (git rev-list HEAD^1..HEAD^2 reports a false 1 at the shallow boundary vs 9 commits in the metadata snapshot). The aggregate HEAD^1..HEAD diff was verified instead; all intermediate states (status-bar pill era, sdk overlap resolution) are absent from the aggregate by construction.
  • Playwright e2e/visual suites (need browser + daemon).
  • Windows/Linux platform behavior (the PR's own ⚠️ rows); split-pane composers (declared out of scope in the description; ring guard hides them since no usage is wired there).

Methodology

Environment: CI merge-ref checkout (HEAD = merge commit be700dafe5, HEAD^1 = base tip, HEAD^2 = verified PR head 68dd35218c), node:22-bookworm container, npm ci + npm run build pre-run. A/B ran the identical probe file in the main tree (head) and a tmp/base-tree worktree at HEAD^1; base third-party deps were symlinked from the head tree's nested packages/web-shell/node_modules (lockfile untouched by the diff), and the internal @qwen-code/* links were realpath-asserted to point into the head tree with both packages proven diff-empty, making the control clean. Mutations ran in a separate tmp/mut-tree worktree at HEAD, one hunk at a time, each reverted and the tree verified clean. Harnesses live in harness/, raw per-run logs in logs/, captures in evidence/. Assertion tally: 2988 (workspace suite) + 1 (typecheck) + 24 (head probe expects) + 12 (base absence-spec expects) + 56 (equivalence expects) + 10 (mutation kill/control cells) = 3091 pass, 0 fail; the base head-spec flip run is excluded from the tally as witness-only, its expectation encoded by the absence-spec run.

Evidence images

01-ab-head-all-green

02-ab-base-flip-head-spec-red

03-mutation-threshold-killed-three-surfaces

04-formatter-equivalence-matrix

Harness scripts and raw logs are in the workflow run artifacts (7-day retention).

Qwen Code · sandboxed verification

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Full gate re-run on 68dd352 after the /triage request. The earlier Stage 1a template gate (first commit 986fb96) no longer applies — the description is now complete, so the gate runs end to end this time.

  • Template: complete ✓ — all required sections present, with Before/After evidence, measured values, and a full Chinese translation.
  • Problem: real, not theoretical. In the default web layout the footer is either the compact StatusBar — whose context button is gated on !compact, so it never shows there — or a host-supplied CustomFooter. Context occupancy is genuinely invisible until you type /context, so long sessions drift toward auto-compaction with no glanceable warning.
  • Direction: aligned. A glanceable context-occupancy indicator is established direction across agent CLIs — claude-code's CHANGELOG references a statusline context_window count, an auto-compact indicator, and a native VSCode token-usage dialog. This is web-surface parity, built on the exact same percentage source as the /context panel; no new i18n keys (reuses the existing status.contextUsed).
  • Size: no core paths touched — everything is inside packages/web-shell/client/** (~205 production lines vs ~244 test lines). Stage 0 two-tier gate: not applicable.
  • Approach: scope feels right. The data already flows (connection.tokenCount / contextWindow), so this is presentation-only. It also consolidates: three near-duplicate token formatters are merged into the existing formatTokenCount.ts, and one shared threshold helper now drives both the ring and the /context panel so the two surfaces can't drift apart. The widest-blast-radius piece is the shared tooltip arrow change (ui/tooltip.tsx), which came out of review round 2 and fixes a real defect — a pseudo-element arrow pinned to the content center stops pointing at the trigger once collision avoidance shifts the content. No unrelated churn otherwise. One cosmetic nit: the title says "status bar" but the ring lives in the composer toolbar — worth aligning at merge time.
  • Risk: no high-risk path matches (Stage 1e clean). One thing I'll carry into Stage 2: neither the ring nor the tooltip change has a scenario in the web-shell visuals pipeline, so I want to see what actually substantiates the rendering claims.

Moving on to code review. 🔍

中文说明

/triage 请求后对 68dd352 完整重跑准入门检查。最早的 Stage 1a 模板门(首个提交 986fb96)已不再适用——描述现已完整,因此本次门检查完整执行。

  • 模板:完整 ✓ —— 所有必需小节齐全,含 Before/After 证据、实测数值和完整中文翻译。
  • 问题:真实存在,不是理论问题。默认 Web 布局的底部要么是 compact 模式的 StatusBar(其上下文按钮受 !compact 限制,不会显示),要么是宿主自定义的 CustomFooter。上下文占用在输入 /context 之前确实不可见,长会话会在没有任何可视提醒的情况下悄悄逼近自动压缩。
  • 方向:对齐。常驻的上下文占用指示是各家 agent CLI 的既定方向——claude-code 的 CHANGELOG 中有 statusline context_window 计数、auto-compact 指示器、VSCode 原生 token 用量弹窗等条目。本 PR 是 Web 端的对齐实现,且与 /context 面板共用同一百分比数据源;无新增 i18n key(复用现有 status.contextUsed)。
  • 规模:未触及核心路径——全部改动位于 packages/web-shell/client/**(约 205 行生产代码 vs 约 244 行测试)。Stage 0 两级门:不适用。
  • 方案:范围合理。数据本已在流动(connection.tokenCount / contextWindow),因此这只是表现层改动。同时做了整合:三个几乎重复的 token 格式化函数合并进既有的 formatTokenCount.ts,一个共享阈值 helper 同时驱动圆环与 /context 面板,两个界面不会各自漂移。影响面最大的是共享 tooltip 箭头改动(ui/tooltip.tsx),它来自第二轮 review,修复的是真实缺陷——固定在 content 中心的伪元素箭头在碰撞回避移动 content 后就不再指向触发元素。此外没有无关改动。一个小瑕疵:标题写的是 "status bar",实际圆环在 composer 工具栏——合并时顺手对齐即可。
  • 风险:未命中任何高风险路径(Stage 1e 干净)。一点带入 Stage 2 的关注:web-shell 可视化流水线中既没有圆环、也没有 tooltip 改动的场景,因此要看清楚渲染结论到底由什么证据支撑。

进入代码审查 🔍

Qwen Code · qwen3.8-max

Reviewed at 68dd35218cf276f03f3a41f32264491082cf2764 · re-run with @qwen-code /triage

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Code review

My independent baseline before opening the diff: pipe the already-flowing per-round usage into the composer area, reuse the /context panel's threshold semantics and token formatting instead of writing parallel ones, gate on known non-zero usage, hide behind the existing toolbar-action config, and click through to /context. The PR matches that shape and goes further in the right direction:

  • One shared threshold helper (utils/contextUsage.ts) now drives both the composer ring and the /context panel progress bar — the panel's old inline > 60 / > 80 checks are replaced, and the strict-boundary semantics are pinned by tests on both sides (exactly 60% is still normal, exactly 80% still warning).
  • Three near-duplicate token formatters (MessageList, ContextUsageMessage, TasksStatusMessage) are consolidated into formatContextTokens in the existing utils/formatTokenCount.ts. Deliberate side effect worth knowing: turn token metrics and the panel now render 1.2M instead of 1234.6k above 1M, matching what TasksStatusMessage already did.
  • Ring math is sound: r=6 inside a 16×16 viewBox with a 2.5 stroke fits, the arc is dasharray/dashoffset rotated to start at 12 o'clock, visually capped at 100% while the aria-label keeps reporting real overflow (150.0% context used). Values are never conveyed by color alone, and prefers-reduced-motion disables the arc transition.
  • Tooltip blast radius checked: ~12 consumers use the shared TooltipContent, and none passes an explicit sideOffset (the composer tag tooltip is a separate raw TooltipPrimitive.Content path, untouched). So the 8→0 default plus Radix-positioned arrow applies uniformly — consistent with the code comment that Radix's offset middleware adds the arrow height on the main axis. The old pseudo-element could not track the trigger under collision avoidance, so this is a genuine fix for every tooltip, not just plumbing for the ring.
  • Wiring in App.tsx keeps ChatEditor memoization intact (useCallback for the handler, ?? 0 fallbacks keep NaN out of the ring math before any usage arrives — both pinned by tests).

No correctness, security, or regression findings. The remaining notes are non-blocking:

  • The composer ring has no visual-regression scenario in screenshots.spec.ts — the visuals-preview run confirmed no scenario renders this UI. The live screenshots in the description are the author's own Playwright runs: detailed and measured, but author-produced, so they are the author's claim rather than independent evidence.
  • Title still says "status bar" while the ring lives in the composer toolbar.

Test evidence — the PR's own CI at 68dd352, fetched via the API (unattended run; no PR code built or executed here)

Check Conclusion
Test (ubuntu-latest, Node 22.x) ✅ success
web-shell E2E Smoke (ubuntu-latest, Node 22.x) ✅ success
Desktop Shell (ubuntu-22.04) ✅ success
Desktop Shell (windows-2022) ✅ success
Capture web-shell visuals (ubuntu-latest, Node 22.x) ✅ success
Post Coverage Comment (ubuntu-latest, 22.x) ✅ success
Classify PR ✅ success
Test (macos-latest / windows-latest, Node 22.x) ⏭️ skipped

All substantive jobs are green on the reviewed commit: the full unit suite, the web-shell E2E smoke, desktop shell builds on both OSes, and the visual capture. 92 check-runs on this SHA in total — 13 success, 79 skipped (bot orchestration and conditional jobs), none failing or pending. The macOS/Windows unit-matrix jobs are skipped by workflow configuration; the same skip pattern holds across every push of this PR, so that's pre-existing wiring, not this commit. Not verified: actual pixel rendering of the ring and the repositioned tooltip arrow — CI proves the tests pass, not what either looks like; see the lane below.

Sandboxed verification would settle this: @qwen-code /verify — that the ring actually renders at the right thresholds and click-through works end-to-end is currently substantiated only by unit tests plus the author's local screenshots, because no visual scenario reaches the composer ring yet. An A/B run against the base build would pin the behaviour (or a ring scenario added to screenshots.spec.ts would let the visuals pipeline cover it on every future push).

中文说明

代码审查

打开 diff 之前我的独立思路:把已经在流动的每轮 usage 数据接进 composer 区域,复用 /context 面板的阈值语义和 token 格式化而不是另写一套,仅在 usage 已知且非零时显示,挂进现有的 toolbar-action 配置,点击直达 /context。PR 与这个思路一致,并且做得更进一步:

  • 新增的共享阈值 helper(utils/contextUsage.ts)同时驱动 composer 圆环和 /context 面板进度条——面板里原有的内联 > 60 / > 80 判断被替换,严格边界语义两侧都有测试钉死(恰好 60% 仍为正常,恰好 80% 仍为警告)。
  • 三个几乎重复的 token 格式化函数(MessageListContextUsageMessageTasksStatusMessage)合并为既有 utils/formatTokenCount.ts 中的 formatContextTokens。一个有意为之的附带变化:超过 1M 时,轮次 token 指标和面板现在显示 1.2M 而非 1234.6k,与 TasksStatusMessage 原有行为一致。
  • 圆环数学正确:16×16 viewBox、r=6、描边 2.5 放得下;弧线用 dasharray/dashoffset 实现并旋转到 12 点方向起始;视觉上封顶 100%,而 aria-label 保留真实溢出值(150.0% context used)。数值从不只靠颜色传达,prefers-reduced-motion 下关闭弧线过渡。
  • tooltip 影响面已核查:共享 TooltipContent 约 12 处使用,均未显式传 sideOffset(composer 标签 tooltip 是独立的 TooltipPrimitive.Content 原生路径,不受影响)。因此 8→0 默认值加 Radix 定位箭头对所有 tooltip 一致生效——与代码注释所述一致(Radix 的 offset 中间件会在主轴上加上箭头高度)。旧伪元素箭头在碰撞回避时无法跟随触发元素,所以这是对全部 tooltip 的真实修复,不只是为圆环做的管道改动。
  • App.tsx 的接线保住了 ChatEditor 的 memo(handler 用 useCallback;usage 到达前 ?? 0 兜底避免圆环计算出现 NaN——两者均有测试钉住)。

无正确性、安全或回归问题。其余均为非阻塞备注:

  • composer 圆环在 screenshots.spec.ts 中没有视觉回归场景——可视化预览确认没有场景渲染此 UI。描述中的实拍截图来自作者自己的 Playwright 运行:细节充分、有实测值,但属于作者自述证据,不是独立验证。
  • 标题仍写 "status bar",而圆环实际在 composer 工具栏。

测试证据 —— 本 PR 自身在 68dd352 上的 CI,经 API 获取(无人值守运行;此处未构建或执行任何 PR 代码)

全部实质任务在被审提交上为绿:完整单测、web-shell E2E smoke、两个操作系统的 desktop shell 构建、可视化采集。该 SHA 共 92 个 check-run:13 成功、79 跳过(机器人与条件任务),无失败、无进行中。macOS/Windows 单测矩阵任务为工作流配置性跳过——本 PR 每次推送均如此,属既有配置,与本提交无关。未验证项:圆环与新版 tooltip 箭头的实际像素渲染——CI 只能证明测试通过,无法证明视觉效果;见下方沙箱验证通道。

沙箱验证可以补上这一环:@qwen-code /verify —— 圆环在真实阈值下的渲染与点击直达行为,目前只有单测加作者本地截图支撑,因为可视化流水线还没有能触达 composer 圆环的场景。对 base 构建做 A/B 验证可以钉住该行为(或在 screenshots.spec.ts 增加圆环场景,让可视化流水线在后续每次推送时覆盖它)。

(上方英文部分的 CI 表格为机器可读区域,此处不重复。)

Qwen Code · qwen3.8-max

Reviewed at 68dd35218cf276f03f3a41f32264491082cf2764 · re-run with @qwen-code /triage

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Confidence: 4/5 — clean gate, green CI on the reviewed commit, and no critical findings of my own; the residual gap is coverage, not correctness.

Honest read: this is a well-scoped feature that does what it says. My independent proposal was essentially what landed, and the implementation goes further in the direction I'd want — shared thresholds between the ring and the /context panel, duplicated formatters consolidated instead of multiplied, existing data flow and existing i18n keys reused, and tests that pin the boundaries that actually matter (strict 60/80 thresholds, the >100% cap, zero/unknown gating, click-through, the ?? 0 wiring defaults). The PR has been through five review rounds with a human reviewer and the /review bot and converged the way AGENTS.md asks: round-5 items were explicitly deferred to a follow-up and recorded in the thread, so I'm not re-litigating them — my own pass found nothing critical either.

The two reservations, both non-blocking: (1) nothing in the visuals pipeline renders the composer ring yet, so live rendering rests on the author's screenshots — I'd like the deferred follow-up to include a ring scenario in screenshots.spec.ts so every future push is covered; (2) the title still says "status bar" while the ring sits in the composer toolbar. Neither is a reason to hold the PR.

The Stage 1a template gate from the first commit is resolved by the now-complete description, and all substantive CI jobs are green on 68dd352 (unit suite, web-shell E2E smoke, desktop shells, visual capture — 13 success, 0 failing out of 92 check-runs).

Verdict: approve. ✅

中文说明

置信度:4/5 —— 门检查干净、被审提交 CI 全绿、我自己没有发现关键问题;剩余缺口是覆盖面,不是正确性。

直说:这是一个范围得当、说到做到的功能。我的独立方案基本就是最终落地的形态,而实现还更进一步:圆环与 /context 面板共享阈值、重复的格式化函数被合并而不是新增、复用既有数据流和既有 i18n key、测试钉住了真正关键的边界(严格 60/80 阈值、超 100% 封顶、零值/未知值不渲染、点击直达、?? 0 接线兜底)。PR 经历了人工 reviewer 与 /review 机器人共五轮审查,并按 AGENTS.md 要求收敛:第五轮条目已明确延后到 follow-up 并记录在线程中,因此不再重提——我自己这一遍同样没有发现关键问题。

两点保留意见,均不阻塞:(1)可视化流水线还没有任何场景渲染 composer 圆环,实际渲染效果目前依赖作者截图——希望延后的 follow-up 在 screenshots.spec.ts 中补一个圆环场景,让后续每次推送都被覆盖;(2)标题仍写 "status bar",而圆环在 composer 工具栏。两者都不构成扣住 PR 的理由。

首个提交上的 Stage 1a 模板门已被现在完整的描述消解;68dd352 上全部实质 CI 任务为绿(单测、web-shell E2E smoke、desktop shell、可视化采集——92 个 check-run 中 13 成功、0 失败)。

结论:批准。✅

Qwen Code · qwen3.8-max

Reviewed at 68dd35218cf276f03f3a41f32264491082cf2764 · re-run with @qwen-code /triage

@qwen-code-ci-bot qwen-code-ci-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM, looks ready to ship. ✅

@wenshao
wenshao enabled auto-merge August 10, 2026 03:42

@ytahdn ytahdn left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed commit 68dd352. No blocking correctness, security, or regression issues found.

@wenshao
wenshao added this pull request to the merge queue Aug 10, 2026
Merged via the queue into main with commit 27216eb Aug 10, 2026
126 checks passed
@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Released in v0.21.9.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants