Skip to content

fix(cli): stabilize thinking block height, replace transcript overlay with inline Ctrl+O toggle - #8077

Merged
wenshao merged 11 commits into
mainfrom
fix/hide-streaming-thinking-preview
Aug 1, 2026
Merged

fix(cli): stabilize thinking block height, replace transcript overlay with inline Ctrl+O toggle#8077
wenshao merged 11 commits into
mainfrom
fix/hide-streaming-thinking-preview

Conversation

@chiga0

@chiga0 chiga0 commented Jul 30, 2026

Copy link
Copy Markdown
Collaborator

What this PR does

Hides the streaming thinking preview by default so the block stays at a constant 1-line header during generation, eliminating page reflow flicker. Replaces the full-screen transcript overlay (old Ctrl+O) with an inline full-detail toggle that expands all thinking blocks, tool groups, and tool results in-place — matching Claude Code's Ctrl+O behavior.

Why it's needed

The streaming thinking block rendered a 4-line tail preview whose height varied (1–5 visual rows) as the model's reasoning streamed in. Empty lines and list markers in the output caused the block to jump between heights on every chunk, pushing all content below it up and down continuously. The grow-only height tracker mitigated but did not eliminate this — the fundamental problem is that variable-height content cannot be stabilized by padding alone.

The old Ctrl+O opened a separate alternate-screen overlay (TranscriptView) that required a context switch and lost the user's scroll position. Users expect Ctrl+O to toggle detail level in-place, like Claude Code.

Reviewer Test Plan

How to verify

  1. Start a session with a thinking-enabled model (e.g. qwen3 with enable_thinking).
  2. Send any prompt. During the thinking phase, confirm the block shows only ∴ Thinking… Xs — no body content, height constant at 1 line regardless of how long the model thinks.
  3. Press Ctrl+O: all thinking blocks expand inline showing full reasoning text, all tool groups expand with complete results, all collapsible tools (read/search/list) show detailed output. Scroll position is preserved.
  4. Press Ctrl+O again: everything collapses back to compact view.
  5. Press Alt+T (or Option+T on macOS): same toggle fires (hidden shortcut, not shown in UI hints).
  6. Confirm no full-screen overlay opens on any key combination.

Evidence (Before & After)

Before (from issue screenshots): Thinking block height jumps between 2–6 rows as content streams. Ctrl+O opens a separate full-screen overlay.

After (tmux capture, macOS, 120×40, npm run dev):

Collapsed state (default) — thinking block is exactly 1 line, hint shows ctrl+o:

  > 1+1等于几?简单回答

  ∴︎ Thought briefly (click or ctrl+o to expand)

  ◆︎ 2

After pressing Ctrl+O — thinking expands inline, hint changes to ctrl+o to collapse:

  > 1+1等于几?简单回答

  ∴︎ Thought briefly (ctrl+o to collapse)
    The user is asking a simple math question: 1+1 equals what? They want a simple answer.

  ◆︎ 2

After pressing Ctrl+O again — collapses back to 1-line header:

  > 1+1等于几?简单回答

  ∴︎ Thought briefly (click or ctrl+o to expand)

  ◆︎ 2

Key observations:

  • No height variation during streaming (model responded too fast to capture Thinking… Xs phase, but the collapsed header is always 1 line)
  • ctrl+o hint text displayed correctly (not alt+t or option+t)
  • Inline expansion preserves scroll position — no context switch
  • No full-screen overlay opens on any key

Tested on

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

Environment

npm run dev (local TypeScript source, no build needed), tmux 120×40

Risk & Scope

  • Main risk or tradeoff: Users who relied on the full-screen transcript overlay for scrolling through long histories lose that dedicated view. The inline toggle provides equivalent detail but within the main scroll context.
  • Not validated / out of scope: Sub-agent panel (AgentChatContent) does not yet receive the fullDetail prop — Ctrl+O expands thinking blocks there via context but not tool groups. Follow-up PR.
  • Breaking changes / migration notes: Ctrl+O no longer opens the transcript overlay. Alt+T still works as before but is no longer advertised in UI hints.

Linked Issues

N/A

中文说明

本 PR 做了什么

默认隐藏流式思考预览,使思考块在生成期间保持恒定的 1 行标题高度,消除页面重排闪烁。将全屏 transcript 覆盖层(旧 Ctrl+O)替换为 inline 全详情切换,在主对话视图中原地展开所有思考块、工具组和工具结果——与 Claude Code 的 Ctrl+O 行为一致。

为什么需要

流式思考块渲染了一个 4 行尾部预览,其高度随模型推理内容的流入而变化(1-5 个视觉行)。输出中的空行和列表标记导致块在每个 chunk 之间跳动高度,持续推动下方所有内容上下移动。grow-only 高度追踪器缓解但未消除此问题——根本问题是可变高度的内容无法仅通过填充来稳定。

旧的 Ctrl+O 打开一个单独的交替屏幕覆盖层(TranscriptView),需要上下文切换并丢失用户的滚动位置。用户期望 Ctrl+O 能像 Claude Code 一样原地切换详情级别。

风险与范围

  • 主要风险/权衡:依赖全屏 transcript 覆盖层滚动长历史的用户失去了该专用视图。inline 切换提供等效详情但在主滚动上下文中。
  • 未验证/超出范围:Sub-agent 面板(AgentChatContent)尚未接收 fullDetail prop——Ctrl+O 通过 context 展开思考块但不展开工具组。后续 PR 处理。
  • 破坏性变更/迁移说明:Ctrl+O 不再打开 transcript 覆盖层。Alt+T 仍如前工作但不再在 UI 提示中展示。

@qwen-code-ci-bot

qwen-code-ci-bot commented Jul 30, 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 commented Jul 30, 2026

Copy link
Copy Markdown
Collaborator

Thanks for the PR — and apologies, my earlier stage comments here were stale (they reviewed a much smaller intermediate push). Re-running the gate against the current head.

Template: complete now ✓ — all the required sections are present (what/why, reviewer test plan with before/after tmux captures, tested-on table, risk & scope, linked issues, Chinese translation).

Problem: observed, not theoretical. The streaming thinking block's height flicker is real — empty lines and list markers in the reasoning output made the block jump between 1–5 rows on every chunk, pushing everything below it around. The grow-only tracker from #7397 mitigated but didn't remove it. Maintainer @wenshao independently reproduced and measured this in a real terminal (comment 5143375337): 3 height changes before vs. 0 after, across 50 frames.

Direction: aligned, and already settled by the maintainer. Default-collapsing the streaming preview is the right call, and replacing the full-screen transcript overlay with an inline Ctrl+O full-detail toggle matches Claude Code's model. @wenshao reviewed the direction in depth and approved at this head. CHANGELOG shows active work in this area (#7397, #7866).

Size: this grew well past the original flicker fix. It now removes the entire TranscriptView + AlternateScreen overlay and redefines what Ctrl+O does. Breakdown: ~664 production-logic lines, ~612 test lines, ~20 docs lines. One core path is touched — packages/cli/src/config/keyBindings.ts (13 lines: drop TOGGLE_TRANSCRIPT, add Ctrl+O to TOGGLE_THINKING_EXPANDED). The rest is packages/cli/src/ui/**. Two things worth naming: the title is fix(cli): but the scope is a structural change (a feature component is deleted and a keybinding's contract changes), and at 664 production lines it's over the 500-line maintainer-awareness mark for a core-touching PR. Neither blocks — both are squarely maintainer-aware, since @wenshao has reviewed and approved.

Approach: the scope is right for what it set out to do — every removal is a direct consequence of deleting the overlay, no drive-by churn. The sub-agent panel (AgentChatContent) not receiving fullDetail is correctly deferred to a follow-up. One observation, not a blocker: the flicker fix alone (collapse the body) was separable from the Ctrl+O redesign; bundling them makes this harder to revert in isolation. Given the maintainer has signed off on the combined direction, this is just a note for next time.

Risk: no elevated risk signals — none of the changed files match the revert-correlated high-risk paths.

Moving on to code review. 🔍

中文说明

感谢贡献——抱歉,我此前在本线程的阶段评论已过期(它们审查的是一个更小的中间推送)。现针对当前 head 重新运行 gate。

模板:现已完整 ✓——所有必需段落齐全(做了什么/为什么、含 before/after tmux 截图的审查测试计划、测试平台表、风险与范围、关联 issue、中文翻译)。

问题:已观测,非理论性。流式思考块的高度闪烁是真实的——推理输出中的空行与列表标记使块在每个 chunk 间跳动 1–5 行,推动下方所有内容。#7397 的只增不减追踪器缓解但未消除。维护者 @wenshao 在真实终端中独立复现并测量了此现象(评论 5143375337):50 帧内修改前 3 次高度变化 vs 修改后 0 次。

方向:对齐,且已由维护者定夺。默认折叠流式预览是正确选择;用 inline Ctrl+O 全详情切换取代全屏 transcript 覆盖层,对齐 Claude Code 模型。@wenshao 深入审查了方向并在本 head 上批准。CHANGELOG 显示该领域有活跃工作(#7397#7866)。

规模:本 PR 已远超最初的闪烁修复。它现在移除了整个 TranscriptView + AlternateScreen 覆盖层,并重新定义了 Ctrl+O 的行为。构成:约 664 行生产逻辑、约 612 行测试、约 20 行文档。触及一个核心路径——packages/cli/src/config/keyBindings.ts(13 行:移除 TOGGLE_TRANSCRIPT,为 TOGGLE_THINKING_EXPANDED 增加 Ctrl+O)。其余均在 packages/cli/src/ui/**。有两点需要点名:标题是 fix(cli): 但范围是结构性改动(删除了一个功能组件并改变了快捷键契约);且 664 行生产代码超过了触及核心路径 PR 的 500 行维护者关注线。两者均不阻塞——都属于维护者充分知情的范畴,因为 @wenshao 已审查并批准。

方案:就其目标而言范围合理——每处移除都是删除覆盖层的直接结果,无顺手改动。子代理面板(AgentChatContent)未接收 fullDetail 已正确推迟到后续 PR。一点观察(非阻塞):单纯的闪烁修复(折叠内容体)本可与 Ctrl+O 重设计分离;打包在一起使本 PR 更难单独回退。鉴于维护者已认可合并方向,这只是给下次的提示。

风险:无升级风险信号——改动文件均未命中与回退相关的高风险路径。

进入代码审查 🔍

Qwen Code · qwen3.8-max-preview

Reviewed at 75211b491345801513b2efbb7c2f58d95104e46c · re-run with @qwen-code /triage

@qwen-code-ci-bot

qwen-code-ci-bot commented Jul 30, 2026

Copy link
Copy Markdown
Collaborator

Code Review

Independent proposal: for "the streaming thinking block flickers because its tail-preview height varies", the strictly simpler fix is to render no body at all while collapsed — just the 1-line header — and delete the tail-window + grow-only height tracker entirely. For "Ctrl+O should toggle detail in place like Claude Code instead of opening an overlay", rebind Ctrl+O onto the existing thought-expansion toggle, widen that toggle into an app-wide fullDetail switch (expand thinking and tool groups, untruncate results), and remove the now-superseded TranscriptView / AlternateScreen.

Comparison with the diff: the PR does exactly this, and cleanly. Every removal is a direct consequence of deleting the overlay; there is no drive-by churn.

  • ConversationMessages.tsxThinkBody is now if (!expanded) return null;. The useRef grow-only tracker, tailVisualLines, MAX_STREAMING_THINKING_VISUAL_LINES, and the wrapToVisualLines import are all gone, and wrapToVisualLines is removed from textUtils.ts (its only consumer). This is what removes the height variable entirely.
  • keyBindings.tsTOGGLE_TRANSCRIPT enum member and binding removed; TOGGLE_THINKING_EXPANDED gains { key: 'o', ctrl: true } alongside the legacy { key: 't', meta: true }. @wenshao confirmed TOGGLE_TRANSCRIPT has no settingsSchema exposure, so dropping the enum member can't break user keybinding configs.
  • AppContainer.tsx — the whole transcript state machine is excised: transcriptFreeze, openTranscript / closeTranscript, the freeze refs/memos, the alt-screen close-repaint effect, the anti-deadlock auto-close effect, the input-owning guard, and the <TranscriptView> render branch. Ctrl+O now falls through to setThoughtExpanded((prev) => !prev); refreshStatic();. No dangling references remain (CI typecheck is green).
  • MainContent.tsx — reads allExpanded from ThoughtExpandedContext as fullDetail and forwards it to HistoryItemDisplay in all four render paths (VP static / non-static and the <Static> paths), with fullDetail correctly added to the renderItem memo deps.
  • ToolGroupMessage.tsx / ToolMessage.tsx / HistoryItemDisplay.tsx / useMouseEvents.ts — terminology-only comment updates (transcript → full-detail); the fullDetail ? undefined : … height-cap lift is unchanged.

On the two findings @wenshao raised before merge — both are addressed at this head:

  1. The mutation-proven test hole (M1). The old Transcript integration suite is replaced by a Ctrl+O test in AppContainer.test.tsx that behaviourally asserts the handler reaches the Ctrl+O path (clearTerminal is written) and then guards the state flip at source level: handleKeypress.toString() must match setThoughtExpanded((prev) => !prev). Deleting the flip (mutation M1) — or mutating it to (prev) => true / (prev) => prev — fails this assertion. The source-level guard is unconventional, but it's the pragmatic fit for the documented vi.mock('ink') harness limitation (the mocked tree never re-renders under an extracted handler — @wenshao hit the same wall), and the downstream context → fullDetail propagation is covered behaviourally by the new MainContent.test.tsx "fullDetail wiring" tests. M1 is killed; the link is pinned at both halves.
  2. The non-VP full-detail scrollback dump. @wenshao ruled this not a merge blocker (pre-existing wipe, fallback path, bounded by conversation length) and asked the author to either gate the height-cap lift on VP mode or document the redraw. The author chose documentation: keyboard-shortcuts.md now states that when ui.useTerminalBuffer is off, Ctrl+O redraws the full conversation with untruncated output into scrollback. settings.md and tool-use-summaries.md are updated to the new "expanded detail mode" wording, and the design doc carries a superseded banner.

Leftover (non-blocking, @wenshao's item 3): the Transcript i18n key still sits in the 9 locale files with no consumer — the unused to close / to scroll / Failed to render transcript. keys were removed, but Transcript itself remains. Cleanup for next time these files are touched.

No critical blockers. No convention violations. Net ~900 lines removed.

Files changed (14 of 35 shown)
File What changed
packages/cli/src/ui/AppContainer.tsx Removed the entire transcript state machine; Ctrl+O now flips the thought-expansion toggle
packages/cli/src/ui/components/TranscriptView.tsx Deleted — the full-screen overlay this PR supersedes
packages/cli/src/ui/components/AlternateScreen.tsx Deleted — only the transcript used it
packages/cli/src/ui/components/messages/ConversationMessages.tsx ThinkBody returns null when collapsed; tail-window code removed; hint is now ctrl+o
packages/cli/src/ui/components/MainContent.tsx Reads allExpanded from context, forwards as fullDetail in all render paths
packages/cli/src/config/keyBindings.ts Drop TOGGLE_TRANSCRIPT; Ctrl+O bound to TOGGLE_THINKING_EXPANDED
packages/cli/src/ui/utils/textUtils.ts Removed wrapToVisualLines (only consumer was the tail window)
packages/cli/src/ui/contexts/ThoughtExpandedContext.tsx Comment: allExpanded is the app-wide full-detail switch
packages/cli/src/ui/components/messages/ToolGroupMessage.tsx Comment-only (transcript to full-detail wording)
packages/cli/src/ui/components/messages/ToolMessage.tsx Comment-only
packages/cli/src/ui/components/HistoryItemDisplay.tsx Comment-only
packages/cli/src/ui/hooks/useMouseEvents.ts Comment-only
packages/cli/src/ui/AppContainer.test.tsx Transcript suite replaced by Ctrl+O state-flip test (M1 guard)
packages/cli/src/ui/components/MainContent.test.tsx New fullDetail-wiring tests (context to HistoryItemDisplay)
…and 21 more files 9 i18n locales, 4 docs, KeyboardShortcuts.tsx, and 7 test files (4 deleted, 3 updated)

CI Test Evidence

CI is fully settled and green on the reviewed head. The ubuntu unit suite (which includes typecheck) passed, so the excised symbols have no dangling consumers; macOS / Windows tests and the no-sandbox integration suite are gated / skipped, consistent with this repo's setup. Integration Tests (CLI, No Sandbox) did not run — noted, not a regression signal for a UI-only change.

Check Conclusion
Test (ubuntu-latest, Node 22.x) ✅ success
web-shell E2E Smoke (ubuntu-latest, Node 22.x) ✅ success
Classify PR ✅ success
Post Coverage Comment (ubuntu-latest, 22.x) ✅ success
Test (macos-latest, Node 22.x) ⏭️ skipped
Test (windows-latest, Node 22.x) ⏭️ skipped
Integration Tests (CLI, No Sandbox) ⏭️ skipped

One row per check name (latest run); skipped checks noted; failures sort first. / 每个检查名一行(取最新一次运行),标注 skipped,失败项排在最前。

The unit suite pins the render contract (collapsed = no body, expanded = full body; context → fullDetail wiring) but cannot pin the streaming flicker behaviour in a real terminal. That gap was closed manually: maintainer @wenshao drove a real build through a 120×40 tmux pane with a streaming mock provider and measured 0 height changes across 50 frames after vs. 3 before (comment 5143375337), and confirmed Ctrl+O expands thinking and tool groups inline with scroll position preserved. For an independent automated re-confirmation, sandboxed verification would settle this: @qwen-code /tmux — that the thinking block holds a constant 1-line height across streaming chunks, and that Ctrl+O expands tool groups inline, is a TUI behaviour the unit suite cannot pin.

中文说明

代码审查

独立方案: 对于"流式思考块因尾部预览高度变化而闪烁",严格更简的修复是折叠时完全不渲染内容体——只保留 1 行标题——并整体删除尾部窗口与只增不减高度追踪器。对于"Ctrl+O 应像 Claude Code 一样原地切换详情而非打开覆盖层",将 Ctrl+O 重新绑定到既有的思考展开切换,把该切换扩展为应用级 fullDetail 开关(展开思考工具组、解除结果截断),并移除已被取代的 TranscriptView / AlternateScreen

与 diff 对比: PR 完全照此实现,且干净。每处移除都是删除覆盖层的直接结果,无顺手改动。

  • ConversationMessages.tsx——ThinkBody 现为 if (!expanded) return null;。追踪器、tailVisualLines、常量与 wrapToVisualLines 导入全部移除,textUtils.ts 中的 wrapToVisualLines(唯一消费者)也被删除。这正是彻底移除高度变量之处。
  • keyBindings.ts——移除 TOGGLE_TRANSCRIPT 枚举与绑定;TOGGLE_THINKING_EXPANDED 增加 Ctrl+O。@wenshao 已确认 TOGGLE_TRANSCRIPT 无 settingsSchema 暴露面,移除枚举成员不会破坏用户键位配置。
  • AppContainer.tsx——整套 transcript 状态机被切除。Ctrl+O 现走 setThoughtExpanded((prev) => !prev); refreshStatic();。无残留引用(CI typecheck 全绿)。
  • MainContent.tsx——从 context 读取 allExpanded 作为 fullDetail,在全部四条渲染路径中下传,并正确加入 memo 依赖。

关于 @wenshao 合入前提出的两项发现——本 head 均已处理:

  1. mutation 证明的测试空洞(M1)。 旧的 Transcript 集成测试被 AppContainer.test.tsx 中的 Ctrl+O 测试取代:行为上断言 handler 到达 Ctrl+O 路径(写入 clearTerminal),再在源码层面守护状态翻转——handleKeypress.toString() 必须匹配 setThoughtExpanded((prev) => !prev)。删除该翻转(M1)或改为 (prev) => true / (prev) => prev 都会使断言失败。源码级守护虽不常规,但契合已记录的 vi.mock('ink') harness 限制(@wenshao 也撞到同一堵墙);下游 context → fullDetail 传播由新增的 MainContent.test.tsx 行为测试覆盖。M1 被击杀,链路两端均被固定。
  2. non-VP 全详情 scrollback 倾倒。 @wenshao 裁定不构成合入阻塞,并要求二选一:把解除高度上限限定在 VP 模式,或记录该重绘。作者选择记录:keyboard-shortcuts.md 现已说明当 ui.useTerminalBuffer 关闭时 Ctrl+O 会以未截断输出重绘整段对话。settings.mdtool-use-summaries.md 同步更新,设计文档加了 superseded 横幅。

残留(非阻塞,@wenshao 第 3 项):9 个 locale 文件中 Transcript 键仍无消费者——未使用的 to close / to scroll / Failed to render transcript. 已移除,但 Transcript 本身保留。下次改到这些文件时清理。

无关键阻塞,无规范违反。净删除约 900 行。

CI 测试证据

CI 在受审 head 上已完全 settle 且全绿。ubuntu 单元套件(含 typecheck)通过,故被切除的符号无残留消费者;macOS / Windows 测试与无沙箱集成套件按本仓库设置 gated / skipped。Integration Tests (CLI, No Sandbox) 未运行——记录在案,对纯 UI 改动非回归信号。

单元套件固定了渲染契约(折叠=无内容体、展开=完整内容;context → fullDetail 接线),但无法固定真实终端中的流式闪烁行为。该缺口已由人工闭合:维护者 @wenshao 用流式 mock provider 在 120×40 tmux 中驱动真实构建,测得修改后 50 帧 0 次高度变化 vs 修改前 3 次,并确认 Ctrl+O 内联展开思考与工具组且滚动位置保持。如需独立的自动化复确认,沙箱验证可确认此 PR 的核心声明:@qwen-code /tmux——思考块在流式 chunk 间保持恒定 1 行高度、Ctrl+O 内联展开工具组,是单元套件无法固定的 TUI 行为。

Qwen Code · qwen3.8-max-preview

Reviewed at 75211b491345801513b2efbb7c2f58d95104e46c · re-run with @qwen-code /triage

@qwen-code-ci-bot

qwen-code-ci-bot commented Jul 30, 2026

Copy link
Copy Markdown
Collaborator

Confidence: 4/5 — clean, net-negative-code change that takes the strictly simpler path; the maintainer has reviewed it in depth and approved at this head. Non-blocking nits below.

Stepping back: this is the right solution to a real, measured problem. The grow-only tracker from #7397 was fighting the layout — rendering variable-height content during streaming can never be padded stable, and collapsing the body removes the variable entirely. @wenshao's A/B measurement (0 height changes vs 3) is the proof, not just the assertion. Widening the existing thought-toggle into an app-wide fullDetail switch and deleting the overlay it supersedes is exactly the reuse-over-new-code path: ~900 lines net removed, no parallel machinery added.

Both of the maintainer's pre-merge findings are resolved at this head — the M1 test hole is closed (a source-level guard kills the mutation, with the downstream propagation covered behaviourally in MainContent), and the non-VP scrollback redraw is documented exactly as @wenshao offered. The leftover Transcript i18n key and the sub-agent-panel fullDetail gap are both acknowledged follow-ups, not blockers.

The nits I'd name, none blocking: the handleKeypress.toString() source-regex assertion is brittle — a Prettier reformat or a transpiler change could make it pass while the link is subtly altered, or fail spuriously; it's the pragmatic fit for the harness limitation but worth revisiting if a behavioural seam ever opens. And the title reads fix(cli): for what is really a structural change (a feature component deleted, a keybinding contract changed) — fine here since the maintainer owns the call, but a refactor / feat framing would have signalled the scope better.

Deferring to the maintainer is not warranted: @wenshao has already reviewed the direction, verified the behaviour at runtime, and approved this exact head, so the architectural call a Stage-0 escalation exists to secure has been made. Approving, pinned to the reviewed commit.

中文说明

置信度:4/5 —— 干净、净删除代码的改动,采取了严格更简的路径;维护者已深入审查并在本 head 上批准。非阻塞小问题见下。

退一步看:这是对一个真实且已测量问题的正确解法。#7397 的只增不减追踪器一直在与布局对抗——流式期间渲染可变高度内容永远无法靠填充稳定,折叠内容体则彻底移除了该变量。@wenshao 的 A/B 测量(0 次 vs 3 次高度变化)是证据,而非断言。把既有思考切换扩展为应用级 fullDetail 开关并删除被其取代的覆盖层,正是"复用优于新增"的路径:净删除约 900 行,未新增平行机制。

维护者合入前的两项发现均在本 head 解决——M1 测试空洞已闭合(源码级守护击杀该 mutation,下游传播由 MainContent 行为测试覆盖),non-VP scrollback 重绘已按 @wenshao 给出的选项记录在案。残留的 Transcript i18n 键与子代理面板 fullDetail 缺口均为已确认的后续项,非阻塞。

我要点名的小问题(均不阻塞):handleKeypress.toString() 源码正则断言较脆弱——Prettier 重排或转译器变更可能使其在链路被微妙改动时仍通过,或偶然失败;它契合 harness 限制,但若将来出现行为级缝隙值得重访。另外标题用 fix(cli): 描述一个实质上的结构性改动(删除功能组件、改变快捷键契约)——此处无碍,因为维护者已定夺,但用 refactor / feat 框架能更好地标示范围。

无需转交维护者:@wenshao 已审查方向、在运行时验证行为,并批准了这个确切的 head,因此 Stage-0 升级所要确保的架构决策已经做出。批准,固定到受审提交。

Qwen Code · qwen3.8-max-preview

Reviewed at 75211b491345801513b2efbb7c2f58d95104e46c · re-run with @qwen-code /triage

@qwen-code-ci-bot qwen-code-ci-bot added category/cli Command line interface and interaction scope/components UI components and widgets scope/keybindings Keyboard shortcuts and bindings type/bug Something isn't working as expected labels Jul 30, 2026
@github-actions

github-actions Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 83.25% 83.25% 89.39% 82.56%
Core 87.49% 87.49% 89.09% 86.15%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   83.25 |    82.56 |   89.39 |   83.25 |                   
 src               |   83.97 |     81.1 |   88.17 |   83.97 |                   
  cli.ts           |   96.03 |    84.61 |     100 |   96.03 | ...37-538,548-549 
  gemini.tsx       |   72.21 |    76.81 |   80.76 |   72.21 | ...1253-1257,1378 
  ...ractiveCli.ts |   85.65 |    81.55 |   87.17 |   85.65 | ...2390,2396,2448 
  ...liCommands.ts |   88.34 |     83.6 |      90 |   88.34 | ...63,480,514,635 
  ...ActiveAuth.ts |     100 |     87.5 |     100 |     100 | 66-80             
 ...cp-integration |   69.97 |    72.73 |   89.81 |   69.97 |                   
  acpAgent.ts      |   69.64 |     72.6 |   89.84 |   69.64 | ...62,11367-11369 
  authMethods.ts   |      92 |       60 |     100 |      92 | 33-34             
  errorCodes.ts    |       0 |        0 |       0 |       0 | 1-22              
  ...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,238-239 
 ...ration/session |   91.59 |    86.66 |    96.5 |   91.59 |                   
  Session.ts       |   91.17 |    85.56 |   96.03 |   91.17 | ...9178,9205-9209 
  ...entTracker.ts |   91.87 |    89.18 |   88.88 |   91.87 | ...33,197,280-289 
  ...stop-guard.ts |     100 |    98.07 |     100 |     100 | 37,127            
  ...eplay-page.ts |    93.1 |    90.72 |     100 |    93.1 | 71,82-85,111-121  
  ...y-replayer.ts |   98.53 |    95.52 |     100 |   98.53 | 238-240           
  index.ts         |       0 |        0 |       0 |       0 | 1-40              
  ...ssionUtils.ts |   89.76 |    86.76 |     100 |   89.76 | ...54-270,326-328 
  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 |   95.68 |     93.7 |   96.66 |   95.68 |                   
  ...ageEmitter.ts |   95.34 |    94.11 |     100 |   95.34 | 52-59             
  PlanEmitter.ts   |     100 |    83.33 |     100 |     100 | 59                
  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.17 |    97.43 |     100 |   99.17 | 352-353           
 ...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/commands      |   89.15 |    73.75 |   64.51 |   89.15 |                   
  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.03 |      100 |      50 |   98.03 | 62                
  serve.ts         |    87.1 |    68.22 |     100 |    87.1 | ...46-649,663-667 
  sessions.ts      |     100 |      100 |      50 |     100 |                   
  update.ts        |   98.13 |    94.44 |   66.66 |   98.13 | 82-83             
 ...mmands/channel |   86.99 |    87.03 |   89.67 |   86.99 |                   
  channel-cwd.ts   |     100 |      100 |     100 |     100 |                   
  ...l-registry.ts |      80 |    84.61 |      80 |      80 | 37-40,49-52,63-66 
  ...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.89 |    85.39 |   94.11 |   93.89 | ...1209,1216-1217 
  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       |   72.85 |      100 |      50 |   72.85 | 22-28,57-68       
  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         |   75.05 |    73.17 |   76.92 |   75.05 | ...31,537-540,552 
  ...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.17 |    84.39 |   83.33 |   90.17 |                   
  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          |   92.59 |    83.87 |      80 |   92.59 | ...62-164,180-181 
  reconnect.ts     |   78.85 |    66.66 |   85.71 |   78.85 | 42-55,169-191     
  remove.ts        |     100 |       80 |     100 |     100 | 21-25             
 ...ommands/review |   84.93 |    86.44 |   85.85 |   84.93 |                   
  agent-prompt.ts  |   90.88 |    92.78 |      96 |   90.88 | ...1268,1738-1807 
  capture-local.ts |   68.57 |     90.9 |      75 |   68.57 | 107-111,158-189   
  ...k-coverage.ts |   48.38 |    14.28 |   66.66 |   48.38 | ...21-226,239-249 
  cleanup.ts       |   90.25 |    83.14 |   83.33 |   90.25 | ...77-482,484-485 
  ...ent-status.ts |   93.03 |    83.87 |   83.33 |   93.03 | 291,531-551       
  ...ose-review.ts |   95.85 |    91.25 |   93.75 |   95.85 | ...1439,1467-1489 
  fetch-pr.ts      |   74.02 |    53.57 |      50 |   74.02 | ...98,332,402-407 
  load-rules.ts    |   26.41 |      100 |   16.66 |   26.41 | ...41-153,155-156 
  parse-args.ts    |   99.27 |       96 |     100 |   99.27 | 345,417           
  plan-diff.ts     |   64.04 |      100 |   66.66 |   64.04 | 127-163           
  pr-context.ts    |   84.44 |    79.38 |   91.66 |   84.44 | ...29-910,939-941 
  presubmit.ts     |   83.75 |    92.72 |   88.88 |   83.75 | ...77-578,655-685 
  ...ve-anchors.ts |   77.02 |    88.46 |      75 |   77.02 | ...70-175,187-204 
  run.ts           |   81.14 |    86.17 |    90.9 |   81.14 | ...13,429-477,490 
  script-lint.ts   |   81.14 |    79.23 |   88.88 |   81.14 | ...59-773,775-797 
  submit.ts        |   76.74 |    82.05 |   81.81 |   76.74 | ...03-639,641-642 
  test-efficacy.ts |   87.11 |    83.43 |   93.33 |   87.11 | ...1394,1402-1422 
 ...nds/review/lib |   95.77 |    93.13 |   95.74 |   95.77 |                   
  agent-briefs.ts  |   98.68 |      100 |       0 |   98.68 | 520-521           
  anchors.ts       |     100 |    94.79 |     100 |     100 | ...33,169,178,225 
  coverage.ts      |   95.47 |    94.25 |   95.45 |   95.47 | ...98,335,433-450 
  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            |    85.6 |    88.37 |   71.42 |    85.6 | ...20,257-258,285 
  git.ts           |   97.64 |    95.65 |     100 |   97.64 | 180-181           
  heavy.ts         |     100 |      100 |     100 |     100 |                   
  inline-counts.ts |     100 |      100 |     100 |     100 |                   
  local-diff.ts    |    84.4 |    88.46 |     100 |    84.4 | ...63-473,475-483 
  merge-base.ts    |     100 |      100 |     100 |     100 |                   
  path-rules.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |     100 |    85.71 |     100 |     100 | 70                
  prompt-record.ts |   94.73 |    88.23 |     100 |   94.73 | ...28,151-152,156 
  receipt.ts       |     100 |      100 |     100 |     100 |                   
  report.ts        |   94.38 |    93.75 |     100 |   94.38 | 173-177           
  roster.ts        |     100 |    94.23 |     100 |     100 | 143,161,206       
  shell-quote.ts   |     100 |      100 |     100 |     100 |                   
  test-utils.ts    |     100 |      100 |     100 |     100 |                   
  transcripts.ts   |   96.27 |    93.18 |     100 |   96.27 | ...83,269-270,294 
  workspaces.ts    |   97.76 |     91.2 |     100 |   97.76 | 186-187,212-213   
 ...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.36 |    88.89 |   95.94 |   94.36 |                   
  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        |   89.06 |    88.57 |   85.71 |   89.06 | ...2420,2422-2430 
  ...cy-monitor.ts |   88.75 |    76.19 |     100 |   88.75 | ...3,90-92,98,101 
  ...ust-policy.ts |   83.04 |    88.28 |     100 |   83.04 | ...39,253,352-353 
  ...heme-names.ts |     100 |      100 |     100 |     100 |                   
  environment.ts   |   94.33 |    89.61 |   94.73 |   94.33 | ...35-639,655-656 
  ...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.96 |     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 |   61.64 |    71.87 |   66.66 |   61.64 | ...54-68,73,77-89 
  ...ings-cache.ts |   98.26 |    97.14 |     100 |   98.26 | 201-202           
  settings.ts      |   90.99 |     92.3 |      90 |   90.99 | ...1006,1008-1009 
  ...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 
  ...tedFolders.ts |   93.35 |    94.11 |     100 |   93.35 | ...90-391,427-438 
 ...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 |    76.31 |   81.35 |      80 |                   
  session.ts       |   84.08 |    75.27 |   93.61 |   84.08 | ...1007,1016-1026 
  types.ts         |    42.5 |      100 |   33.33 |    42.5 | ...24-625,628-629 
 ...active/control |   76.11 |    89.09 |      80 |   76.11 |                   
  ...rolContext.ts |    6.45 |        0 |       0 |    6.45 | 56-95             
  ...Dispatcher.ts |   91.79 |    92.45 |   88.88 |   91.79 | ...49-367,387,390 
  ...rolService.ts |     7.4 |        0 |       0 |     7.4 | 46-185            
 ...ol/controllers |   39.78 |    63.24 |   47.22 |   39.78 |                   
  ...Controller.ts |   39.49 |      100 |      80 |   39.49 | 88-92,127-210     
  ...Controller.ts |       0 |        0 |       0 |       0 | 1-56              
  ...Controller.ts |   49.11 |    62.96 |   54.54 |   49.11 | ...63-568,570-575 
  ...Controller.ts |   14.06 |      100 |       0 |   14.06 | ...82-117,130-133 
  ...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.07 |    94.05 |   95.23 |   98.07 |                   
  ...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.38 |      100 |   90.47 |   98.38 | 84-85,125-126     
  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/serve         |   87.31 |    83.57 |   91.09 |   87.31 |                   
  ...tp-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |    93.4 |    92.95 |     100 |    93.4 | ...19-320,323-325 
  ...em-adapter.ts |     100 |      100 |     100 |     100 |                   
  capabilities.ts  |     100 |    97.95 |     100 |     100 | 649               
  ...cp-command.ts |     100 |      100 |     100 |     100 |                   
  ...horization.ts |   92.79 |    93.33 |    87.5 |   92.79 | 75-80,135-136     
  ...livery-ipc.ts |     100 |     90.9 |     100 |     100 | 94,106,134        
  ...l-delivery.ts |     100 |      100 |     100 |     100 |                   
  ...op-mcp-ipc.ts |   81.06 |    73.68 |   94.11 |   81.06 | ...37-242,267,289 
  ...nt-service.ts |   93.89 |    86.61 |     100 |   93.89 | ...66-468,475,477 
  ...-selection.ts |     100 |      100 |     100 |     100 |                   
  ...ings-store.ts |   85.85 |    91.78 |   95.83 |   85.85 | ...94-206,366-369 
  ...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.41 |    84.44 |    97.1 |   92.41 | ...1460,1514-1518 
  ...e-grouping.ts |     100 |    94.11 |     100 |     100 | 69,132            
  core-runtime.ts  |     100 |      100 |     100 |     100 |                   
  ...ub-session.ts |   92.04 |    77.77 |     100 |   92.04 | ...36-445,470,508 
  daemon-logger.ts |    82.2 |    77.26 |   91.76 |    82.2 | ...1720,1747-1753 
  ...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.37 |    90.06 |     100 |   98.37 | ...1041,1043-1044 
  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 
  ...-path-argv.ts |     100 |      100 |     100 |     100 |                   
  ...h-settings.ts |   94.41 |    88.75 |     100 |   94.41 | ...24,702,718,728 
  fast-path.ts     |   90.49 |     80.7 |   95.45 |   90.49 | ...92-501,567-568 
  ...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-143             
  ...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 | ...27-128,139-140 
  ...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 |   82.69 |    79.33 |   74.06 |   82.69 | ...6744,6749-6750 
  ...tup-errors.ts |     100 |      100 |     100 |     100 |                   
  ...-keepalive.ts |   94.19 |    88.57 |     100 |   94.19 | ...26,530-531,571 
  ...-lifecycle.ts |     100 |      100 |     100 |     100 |                   
  server.ts        |   93.57 |    93.29 |   74.02 |   93.57 | ...2148,2169-2173 
  ...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 |                   
  ...erver-name.ts |     100 |      100 |     100 |     100 |                   
  ...ion-limits.ts |     100 |      100 |     100 |     100 |                   
  ...t-sessions.ts |    93.3 |    76.57 |     100 |    93.3 | ...13,816,829-831 
  ...l-resolver.ts |   90.32 |    66.66 |     100 |   90.32 | 16,45-46          
  ...ell-static.ts |   91.07 |    86.66 |     100 |   91.07 | ...79-182,216-219 
  ...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 |                   
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...-summaries.ts |   86.66 |       50 |     100 |   86.66 | 11,19             
  ...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 
  ...ber-errors.ts |     100 |    95.32 |     100 |     100 | 53,93-94,172,192  
  ...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 
  ...ls-mapping.ts |     100 |      100 |     100 |     100 |                   
  ...lls-status.ts |     100 |    92.85 |     100 |     100 | 127               
  ...reconciler.ts |    91.6 |     83.9 |     100 |    91.6 | ...70-272,305-306 
 ...serve/acp-http |   77.04 |    78.33 |   93.26 |   77.04 |                   
  ...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.62 |     100 |    98.2 | 1015,1041-1052    
  dispatch.ts      |   71.44 |    73.89 |   95.34 |   71.44 | ...4733,4781-4787 
  index.ts         |   81.93 |    79.92 |    90.9 |   81.93 | ...2291,2375-2376 
  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 |   85.73 |    73.17 |    97.5 |   85.73 |                   
  ...r-emulator.ts |   88.57 |    63.63 |     100 |   88.57 | ...72-175,194-195 
  ...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 |       0 |        0 |       0 |       0 |                   
  ...mcp-smoke.mjs |       0 |        0 |       0 |       0 | 1-119             
  ...cceptance.mjs |       0 |        0 |       0 |       0 | 1-473             
  real-tab.mjs     |       0 |        0 |       0 |       0 | 1-218             
 src/serve/fs      |    86.4 |    80.69 |     100 |    86.4 |                   
  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.17 |    79.47 |     100 |   86.17 | ...2506,2516-2517 
 src/serve/routes  |   85.55 |    79.54 |   95.47 |   85.55 |                   
  a2ui-action.ts   |   96.84 |     88.5 |    87.5 |   96.84 | ...70-272,309-311 
  capabilities.ts  |     100 |      100 |     100 |     100 |                   
  ...nel-notify.ts |   85.22 |       88 |     100 |   85.22 | ...,83-87,103-104 
  ...l-webhooks.ts |   93.56 |    84.09 |     100 |   93.56 | ...42,292,332,334 
  daemon-status.ts |   85.45 |    83.33 |     100 |   85.45 | 98-105            
  goals.ts         |   98.92 |     90.9 |     100 |   98.92 | 146               
  health-demo.ts   |   94.73 |     86.2 |     100 |   94.73 | 62-66,154         
  permission.ts    |     100 |     92.3 |     100 |     100 | 50,98             
  ...uled-tasks.ts |   87.12 |    82.73 |   92.59 |   87.12 | ...1263,1306-1307 
  ...on-runtime.ts |     100 |    90.47 |     100 |     100 | 58,94             
  session.ts       |   85.21 |    81.78 |   95.16 |   85.21 | ...4608,4610-4611 
  sse-events.ts    |   84.45 |     87.5 |   77.77 |   84.45 | ...36,453-456,485 
  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.19 |    77.68 |     100 |   90.19 | ...47-448,467-468 
  ...d-contacts.ts |     100 |      100 |     100 |     100 |                   
  ...controller.ts |   83.09 |       79 |      90 |   83.09 | ...1032,1038,1041 
  ...extensions.ts |   87.23 |    72.76 |   94.11 |   87.23 | ...1826,1871-1872 
  ...-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 |   88.22 |    85.29 |     100 |   88.22 | ...1546,1566-1571 
  ...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 |   74.81 |    70.31 |     100 |   74.81 | ...47-658,664-665 
  ...tup-github.ts |   77.97 |    70.58 |   84.21 |   77.97 | ...46-352,397-398 
  ...ace-skills.ts |   69.87 |    78.12 |     100 |   69.87 | ...59-284,290-324 
  ...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.42 |    64.78 |      80 |   78.42 | ...31-336,344-345 
  ...pace-voice.ts |   91.33 |    80.92 |     100 |   91.33 | ...70-673,676-678 
 src/serve/server  |   90.69 |    89.16 |   96.55 |   90.69 |                   
  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 |   85.66 |    76.83 |     100 |   85.66 | ...02,719,782-791 
  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.11 |    95.19 |     100 |   95.11 | ...65-167,422-427 
  self-origin.ts   |   76.19 |       80 |     100 |   76.19 | 45-54             
  ...e-features.ts |   94.81 |    90.32 |     100 |   94.81 | 175-181           
  ...on-archive.ts |   89.55 |    87.78 |   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.01 |    97.43 |     100 |   99.01 | ...19,633,775-777 
 src/serve/voice   |   83.35 |    92.22 |   90.47 |   83.35 |                   
  ...ice-config.ts |   84.61 |       30 |     100 |   84.61 | 90-99,103-104     
  voice-ws.ts      |   77.16 |    94.73 |   83.33 |   77.16 | ...68,483,521-523 
  ...oordinator.ts |     100 |    98.21 |     100 |     100 | 176               
 ...kspace-service |   89.11 |    86.15 |   90.69 |   89.11 |                   
  index.ts         |   88.66 |    85.77 |   89.47 |   88.66 | ...1286-1290,1293 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services      |   92.23 |     88.5 |   97.82 |   92.23 |                   
  ...mandLoader.ts |     100 |    88.88 |     100 |     100 | 104-117           
  ...killLoader.ts |   97.14 |    87.87 |     100 |   97.14 | 140,151-152       
  ...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.36 |    92.68 |     100 |   97.36 | 153,160-161       
  ...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.29 |    86.48 |     100 |   88.29 | ...91-196,229-230 
  ...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.54 |    90.47 |    87.5 |   93.54 | 201-203,217-223   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |   98.64 |    95.83 |     100 |   98.64 | 116,142-143       
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  voice-service.ts |   90.37 |    87.87 |     100 |   90.37 | ...80,287,352-357 
  ...e-settings.ts |     100 |    95.23 |     100 |     100 | 19                
  ...ranscriber.ts |   90.46 |    82.19 |      96 |   90.46 | ...66-668,671-673 
 ...rvices/insight |     100 |      100 |     100 |     100 |                   
  dates.ts         |     100 |      100 |     100 |     100 |                   
 ...ght/generators |   88.91 |    86.29 |   96.15 |   88.91 |                   
  DataProcessor.ts |   88.28 |    86.24 |   94.73 |   88.28 | ...1352,1356-1363 
  ...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 | 95-98             
  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    |   93.26 |       75 |   83.33 |   93.26 |                   
  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 
  ...andContext.ts |     100 |      100 |     100 |     100 |                   
  render.tsx       |     100 |      100 |     100 |     100 |                   
 src/ui            |   71.95 |    74.96 |   64.63 |   71.95 |                   
  App.tsx          |   33.33 |       75 |   33.33 |   33.33 | 32-86             
  AppContainer.tsx |   73.02 |    71.51 |   67.85 |   73.02 | ...3950,3991-3998 
  ...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 |   68.12 |    64.86 |   33.33 |   68.12 | ...98,321,341-346 
  ...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   |   81.41 |    82.99 |    89.4 |   81.41 |                   
  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 |    81.25 |     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 |   67.95 |    55.88 |      75 |   67.95 | ...86-187,201-204 
  ...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 |   68.28 |    70.14 |   84.61 |   68.28 | ...66-599,610-611 
  copyCommand.ts   |    98.7 |    96.29 |     100 |    98.7 | 66-67,172,272,323 
  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   |   91.13 |    83.72 |      90 |   91.13 | ...81-184,196-199 
  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 |   93.45 |    89.06 |     100 |   93.45 | ...68-169,196-206 
  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  |   86.27 |    83.01 |     100 |   86.27 | ...22-935,969-974 
  ...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.9 |    86.04 |     100 |    90.9 | ...41-146,176-177 
  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 |    6.43 |      100 |      50 |    6.43 | 31-330            
  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 |   91.82 |    78.87 |   66.66 |   91.82 | ...59-160,169-174 
 src/ui/components |   70.87 |    78.46 |   78.57 |   70.87 |                   
  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-597             
  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       |   75.11 |     61.4 |      50 |   75.11 | ...48-253,271-275 
  ...ngSpinner.tsx |   68.42 |    85.71 |      50 |   68.42 | 35-52,73,80-81    
  GoalPill.tsx     |   83.33 |    76.92 |     100 |   83.33 | 24-30             
  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 |   78.51 |     65.3 |     100 |   78.51 | ...99,502,505-511 
  ...ngeDialog.tsx |     100 |      100 |     100 |     100 |                   
  InputPrompt.tsx  |   83.08 |    81.73 |      80 |   83.08 | ...2197,2223,2297 
  ...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  |    95.9 |    92.53 |      50 |    95.9 | ...99,445-449,452 
  MemoryDialog.tsx |   86.59 |    80.15 |     100 |   86.59 | ...34-435,485,553 
  ...geDisplay.tsx |       0 |        0 |       0 |       0 | 1-41              
  ModelDialog.tsx  |   83.41 |    71.65 |     100 |   83.41 | ...69,971,976-992 
  ...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 |   72.56 |       80 |      40 |   72.56 | ...06-109,114-117 
  ...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 |   92.97 |    83.87 |     100 |   92.97 | ...45,248,275-277 
  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 |    82.2 |    81.36 |    90.9 |    82.2 |                   
  ...sksDialog.tsx |   77.53 |     76.9 |   80.76 |   77.53 | ...1781,1803-1809 
  ...TasksPill.tsx |   67.03 |     86.2 |     100 |   67.03 | ...02-122,130-138 
  ...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.14 |   70.83 |   71.92 |                   
  DiscoverTab.tsx  |   68.22 |    67.66 |   55.55 |   68.22 | ...93,656-660,664 
  InstalledTab.tsx |   75.49 |    67.28 |   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.04 |    61.53 |   70.58 |   40.04 |                   
  ...ealthPill.tsx |   68.42 |    85.71 |     100 |   68.42 | 40-46             
  ...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 |    89.7 |    86.09 |   85.14 |    89.7 |                   
  ...ionDialog.tsx |   89.23 |    84.27 |   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 |   93.46 |      100 |   76.92 |   93.46 | ...90-292,295-298 
  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 |   76.52 |     42.1 |   66.66 |   76.52 | ...00,102,125,156 
  ...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 |   89.75 |     79.1 |     100 |   89.75 | ...33-635,642-644 
  ...upMessage.tsx |   98.32 |    95.16 |     100 |   98.32 | 184-187,414       
  ToolMessage.tsx  |   92.49 |       85 |   93.33 |   92.49 | ...61-966,993-995 
 ...ponents/shared |   85.79 |    81.92 |   94.11 |   85.79 |                   
  ...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.86 |      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 |   72.72 |      100 |     100 |   72.72 | 31-33             
  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 |   88.51 |    83.75 |   81.81 |   88.51 | ...51-779,792,887 
  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 |   69.81 |    72.64 |   61.11 |   69.81 |                   
  ContextUsage.tsx |   70.88 |    63.88 |      80 |   70.88 | ...20-426,463-557 
  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   |   83.96 |    81.62 |    86.3 |   83.96 |                   
  ...ewContext.tsx |   64.83 |    88.88 |      50 |   64.83 | ...16-219,225-235 
  AppContext.tsx   |      80 |       50 |     100 |      80 | 19-20             
  ...ewContext.tsx |   92.45 |    62.79 |      50 |   92.45 | ...69-270,272-276 
  ...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 | 155-156           
  ...teContext.tsx |   86.66 |       50 |     100 |   86.66 | 234-235           
  ...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.13 |    82.53 |   89.57 |   85.13 |                   
  ...dProcessor.ts |   83.95 |    83.95 |     100 |   83.95 | ...39-871,918-919 
  ...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 | ...86-287,292-293 
  ...dProcessor.ts |   85.21 |     66.4 |   81.81 |   85.21 | ...1407,1428-1432 
  ...rt-command.ts |     100 |      100 |     100 |     100 |                   
  ...sced-flush.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 |      52 |    63.63 |     100 |      52 | ...59,67-70,76-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.73 |    76.59 |     100 |   94.73 | 162-166,255,261   
  ...chedScroll.ts |     100 |      100 |     100 |     100 |                   
  ...ketedPaste.ts |    23.8 |      100 |       0 |    23.8 | 19-37             
  ...nchCommand.ts |   94.85 |    80.76 |     100 |   94.85 | ...54,229,292-295 
  ...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 |   85.66 |    81.38 |   96.15 |   85.66 | ...3943,4111-4119 
  ...BranchName.ts |     100 |    94.44 |     100 |     100 | 54                
  ...oryManager.ts |   98.01 |    98.36 |     100 |   98.01 | 139-142           
  ...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 |    9.67 |      100 |       0 |    9.67 | 11-32,39-90       
  ...gIndicator.ts |     100 |    96.66 |     100 |     100 | 109               
  useLogger.ts     |      16 |      100 |       0 |      16 | 15-45             
  useMCPHealth.ts  |   63.15 |       80 |      50 |   63.15 | 42-52,64-67       
  ...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.5 |     100 |     100 | 99                
  ...delCommand.ts |     100 |       95 |     100 |     100 | 53                
  ...ouseEvents.ts |   94.56 |    94.87 |   83.33 |   94.56 | 77-81             
  ...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 |   88.95 |    86.95 |     100 |   88.95 | ...37-439,471-481 
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-7               
  ...umeCommand.ts |   94.67 |    74.28 |     100 |   94.67 | ...19,174,233-238 
  ...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 |       70 |     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      |   86.61 |    84.99 |   95.28 |   86.61 |                   
  ...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.52 |    73.25 |   91.66 |   52.52 | ...23,626-635,638 
  commandUtils.ts  |   96.17 |    88.88 |     100 |   96.17 | ...77,179-180,323 
  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.21 |     100 |   94.87 | 116-119           
  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 |    97.05 |     100 |      96 | 102-105           
  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.23 |    69.06 |   95.12 |   86.23 | ...1284,1324-1330 
  ...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.1 |     100 |   98.38 | 195-197           
  ...mConstants.ts |     100 |      100 |     100 |     100 |                   
  restoreGoal.ts   |     100 |      100 |     100 |     100 |                   
  ...storyUtils.ts |   79.32 |    77.37 |     100 |   79.32 | ...32-554,685-686 
  ...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 |                   
  ...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 |    59.89 |   94.59 |   75.03 |                   
  collect.ts       |   71.27 |    65.81 |      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      |   80.94 |    72.69 |   80.55 |   80.94 |                   
  ...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 |   89.72 |    65.33 |   93.75 |   89.72 | ...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 |    68.42 |     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.34 |    86.97 |   92.54 |   81.34 |                   
  ...p-profiler.ts |   98.39 |    90.56 |     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 |       90 |     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.17 |     100 |   90.65 | ...72,370,372-373 
  ...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 | ...59,376-377,422 
  jsonc-editor.ts  |   93.18 |    92.66 |     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.05 |    76.38 |     100 |   89.05 | ...86,302-303,340 
  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 |   74.38 |    69.56 |     100 |   74.38 | ...92-103,105-116 
  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.67 |    56.93 |   76.92 |   45.67 | ...1034,1046-1069 
  ...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 |     87.5 |     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.49 |    86.15 |   89.09 |   87.49 |                   
 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.28 |    84.25 |   95.23 |   90.28 |                   
  ...transcript.ts |   87.63 |    83.52 |     100 |   87.63 | ...80,588,594-598 
  ...ent-resume.ts |   85.53 |    77.44 |   83.33 |   85.53 | ...1781-1785,1788 
  ...ound-tasks.ts |   96.15 |    90.13 |   98.76 |   96.15 | ...1732,1752-1755 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ent-result.ts |    96.8 |    92.68 |     100 |    96.8 | 106,129-131       
  ...n-registry.ts |    95.9 |    90.42 |     100 |    95.9 | ...28-429,502-506 
  ...w-snapshot.ts |   91.86 |       75 |     100 |   91.86 | ...54,178,185-187 
 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 |   90.42 |    85.66 |   87.64 |   90.42 |                   
  agent-context.ts |     100 |      100 |     100 |     100 |                   
  agent-core.ts    |   85.05 |    76.67 |   77.77 |   85.05 | ...2287,2333-2335 
  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 |                   
  ...ow-journal.ts |   91.76 |    75.86 |     100 |   91.76 | ...38-139,179-181 
  ...chestrator.ts |   91.79 |    87.79 |   82.35 |   91.79 | ...1775,1824-1827 
  ...ow-prompts.ts |     100 |      100 |     100 |     100 |                   
  ...low-runner.ts |   91.76 |    81.03 |   91.66 |   91.76 | ...51,195,215-218 
  ...ow-sandbox.ts |   96.87 |    94.64 |     100 |   96.87 | ...24-325,330-331 
  ...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   |   81.81 |    83.99 |    87.5 |   81.81 |                   
  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       |   94.76 |    86.36 |   92.85 |   94.76 | 86-87,348-354     
  ...ptAddendum.ts |     100 |      100 |     100 |     100 |                   
  tasks.ts         |   88.85 |    82.56 |   96.29 |   88.85 | ...-990,1034-1035 
  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.91 |       87 |   75.16 |   84.91 |                   
  approval-mode.ts |     100 |      100 |     100 |     100 |                   
  ...xtDefaults.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |    84.2 |    86.71 |   73.52 |    84.2 | ...8178,8182-8183 
  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          |   91.84 |    88.05 |    93.1 |   91.84 |                   
  baseLlmClient.ts |   88.28 |    82.48 |   81.81 |   88.28 | ...47,660,666-668 
  client.ts        |   91.92 |    87.39 |   91.56 |   91.92 | ...3915,4011-4012 
  ...tGenerator.ts |   86.34 |    87.34 |   84.61 |   86.34 | ...81-482,527-533 
  ...lScheduler.ts |    90.1 |    85.83 |      96 |    90.1 | ...5644,5672-5683 
  geminiChat.ts    |   92.42 |    89.27 |      96 |   92.42 | ...4429,4477-4478 
  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 | 47-48             
  ...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 |   95.19 |    89.47 |     100 |   95.19 | ...44-245,290-291 
  prompts.ts       |   93.57 |    91.42 |   83.33 |   93.57 | ...1187,1390-1391 
  ...ing-effort.ts |     100 |      100 |     100 |     100 |                   
  ...n-recovery.ts |   95.13 |       80 |     100 |   95.13 | ...06-107,142-144 
  ...t-profiler.ts |   96.89 |    80.88 |   88.23 |   96.89 | ...10,117-118,123 
  ...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 |     100 |      100 |     100 |     100 |                   
  ...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.52 |    91.66 |     100 |   98.52 | ...14,642-643,690 
 ...ntentGenerator |    96.2 |    87.41 |      96 |    96.2 |                   
  ...tGenerator.ts |   97.23 |    86.48 |   94.73 |   97.23 | ...1423,1452,1463 
  converter.ts     |   95.92 |    88.16 |     100 |   95.92 | ...1305,1484-1486 
  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.65 |    90.23 |   95.23 |   91.65 |                   
  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      |   96.63 |    90.94 |     100 |   96.63 | ...1100,1108,1203 
  ...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 |   96.73 |    89.76 |   98.27 |   96.73 |                   
  dashscope.ts     |   97.48 |    91.91 |      95 |   97.48 | ...85-386,528-529 
  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     |    86.2 |    83.25 |   92.33 |    86.2 |                   
  ...ive-safety.ts |     100 |      100 |     100 |     100 |                   
  ...-converter.ts |   78.32 |    71.83 |     100 |   78.32 | ...1122,1168-1169 
  corruptFile.ts   |     100 |       50 |     100 |     100 | 40-45             
  ...-converter.ts |   80.39 |     87.5 |     100 |   80.39 | 50-59             
  ...me-refresh.ts |     100 |      100 |     100 |     100 |                   
  ...sion-store.ts |   90.82 |    86.38 |   97.82 |   90.82 | ...1215-1221,1265 
  ...ionManager.ts |   81.06 |    78.78 |   81.52 |   81.06 | ...2705,2727-2728 
  ...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 |    84.61 |   85.71 |    75.9 | ...98,202,214-248 
  github.ts        |   88.58 |    82.13 |     100 |   88.58 | ...62,952-953,963 
  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       
  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 |    83.78 |     100 |   88.95 | ...32-235,238-241 
  ...extraction.ts |   85.77 |    80.61 |   89.47 |   85.77 | ...02-205,260-261 
 src/followup      |   79.86 |    80.36 |    90.9 |   79.86 |                   
  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.45 |    66.01 |   71.42 |   71.45 | ...49-650,657-658 
  ...onToolGate.ts |     100 |    96.55 |     100 |     100 | 97                
  ...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         |   94.17 |    88.82 |   95.93 |   94.17 |                   
  ...eGoalStore.ts |   87.61 |    88.88 |   86.66 |   87.61 | ...85-188,196-204 
  goal-evidence.ts |   87.59 |     85.1 |   95.65 |   87.59 | ...12-613,636-639 
  ...projection.ts |   89.41 |    72.22 |   66.66 |   89.41 | ...28,131,135-137 
  ...ersistence.ts |   87.73 |    84.84 |      80 |   87.73 | ...-94,97,101-106 
  goal-protocol.ts |    91.3 |       90 |     100 |    91.3 | 107-108           
  goal-reducer.ts  |   92.21 |    85.48 |     100 |   92.21 | ...67-368,381,436 
  goal-runtime.ts  |   99.01 |    93.44 |     100 |   99.01 | ...83-684,707-708 
  goal-tools.ts    |   98.32 |    93.18 |   95.23 |   98.32 | ...48-149,256-257 
  ...rn-context.ts |     100 |      100 |     100 |     100 |                   
  goal-verifier.ts |   92.46 |    92.85 |     100 |   92.46 | ...67-170,183-185 
  goal-wire.ts     |       0 |        0 |       0 |       0 | 1-27              
  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.11 |    86.29 |   88.62 |   88.11 |                   
  ...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.12 |   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.23 |    83.06 |   90.32 |   87.23 |                   
  ...y-document.ts |   89.52 |    84.61 |     100 |   89.52 | ...24-325,329-330 
  ...nel-memory.ts |   97.11 |    95.72 |   96.29 |   97.11 | ...85-287,361-362 
  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 |    81.81 |     100 |     100 | 126,136           
  entries.ts       |   75.59 |    84.84 |   83.33 |   75.59 | ...56-157,172-180 
  extract.ts       |   91.48 |    75.75 |     100 |   91.48 | ...99,118-121,189 
  ...entPlanner.ts |   91.51 |    76.19 |     100 |   91.51 | ...04,113-116,290 
  ...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 |   82.27 |    77.92 |   83.33 |   82.27 | ...66,285,292-298 
  memoryAge.ts     |   90.47 |       80 |     100 |   90.47 | 50-51             
  paths.ts         |   95.27 |    96.59 |     100 |   95.27 | ...79-380,401-402 
  ...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       |   89.85 |    82.92 |     100 |   89.85 | ...54-155,162-163 
  ...ceSelector.ts |    93.1 |    81.81 |     100 |    93.1 | ...25,127-128,136 
  remember.ts      |   98.89 |    89.79 |     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 |   71.68 |    65.51 |   68.75 |   71.68 | ...90-394,397,403 
  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.54 |       89 |   91.13 |   92.54 |                   
  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.13 |     100 |     100 | 177,260           
  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.76 |    91.28 |   71.07 |   83.76 |                   
  autoMode.ts      |   97.65 |    93.13 |     100 |   97.65 | ...79-586,632,709 
  ...transcript.ts |      98 |    84.61 |     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.54 |    89.63 |      80 |   86.54 | ...1096,1202-1206 
  rule-parser.ts   |   94.49 |    92.72 |     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.46 |    84.22 |   96.93 |   89.46 |                   
  ...ionTrailer.ts |     100 |      100 |     100 |     100 |                   
  ...llRegistry.ts |   97.68 |    85.71 |     100 |   97.68 | ...96,119,490-491 
  ...ionService.ts |   96.71 |    95.79 |     100 |   96.71 | ...83,699,832-840 
  ...ingService.ts |   90.91 |    84.17 |   95.45 |   90.91 | ...2058,2085-2086 
  ...ttribution.ts |   91.73 |    87.71 |      90 |   91.73 | ...80-685,826-827 
  ...utSlimming.ts |    97.2 |    94.05 |     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 |     100 |      100 |     100 |     100 |                   
  ...temService.ts |   91.78 |    81.81 |   94.11 |   91.78 | ...37,463-470,517 
  ...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.22 |    97.34 |     100 |   98.22 | ...75-676,723-724 
  ...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.8 |     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.38 |    93.75 |   88.88 |   98.38 | 63-64             
  ...ipt-reader.ts |   94.51 |    89.14 |      98 |   94.51 | ...1102-1103,1167 
  ...est-helper.ts |       0 |        0 |       0 |       0 | 1-65              
  ...iter-lease.ts |    82.1 |     73.7 |    97.5 |    82.1 | ...2364,2376-2379 
  sessionRecap.ts  |   67.56 |    43.47 |     100 |   67.56 | ...60,178,180-183 
  ...ionService.ts |   88.94 |    83.69 |   97.14 |   88.94 | ...2450,2520-2540 
  sessionTitle.ts  |   94.19 |    73.21 |     100 |   94.19 | ...43-246,277-278 
  ...ionService.ts |   84.35 |    78.37 |   97.14 |   84.35 | ...2472,2478-2483 
  ...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 |   99.41 |    96.58 |     100 |   99.41 |                   
  microcompact.ts  |   99.41 |    96.58 |     100 |   99.41 | 244-245,677       
 ...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        |   88.52 |     87.7 |   90.47 |   88.52 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...activation.ts |     100 |    93.33 |     100 |     100 | 93,112            
  skill-load.ts    |   94.84 |     87.5 |     100 |   94.84 | ...03,223,235-237 
  skill-manager.ts |   84.07 |    83.67 |   83.33 |   84.07 | ...1233,1240-1244 
  skill-paths.ts   |   89.65 |    86.95 |     100 |   89.65 | ...11-112,117-118 
  symlinkScope.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |   97.91 |       98 |     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.07 |    83.99 |   84.47 |   81.07 |                   
  ...ty-tracker.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...on-metrics.ts |   99.07 |    80.95 |     100 |   99.07 | 183,197           
  ...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 |     100 |    90.47 |     100 |     100 | 49,76             
  ...-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.09 |    95.61 |      95 |   99.09 | 141,365-366       
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-128             
  loggers.ts       |   56.85 |    74.35 |   64.81 |   56.85 | ...1397,1414-1434 
  metrics.ts       |   79.63 |    81.98 |   79.66 |   79.63 | ...1082,1085-1096 
  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,478-479,495 
  sdk.ts           |   79.22 |    89.18 |   63.63 |   79.22 | ...57-161,199-221 
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...on-tracing.ts |   90.83 |    90.05 |   96.77 |   90.83 | ...1667,1698-1701 
  ...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         |   82.35 |    94.61 |   86.04 |   82.35 | ...1361,1365-1372 
  uiTelemetry.ts   |   97.18 |    93.93 |      88 |   97.18 | ...70,314,461-462 
 ...ry/qwen-logger |   74.17 |    80.35 |      70 |   74.17 |                   
  event-types.ts   |       0 |        0 |       0 |       0 |                   
  qwen-logger.ts   |   74.17 |    80.18 |   69.49 |   74.17 | ...1120,1158-1159 
 src/test-utils    |      94 |    98.24 |   78.94 |      94 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  ...st-helpers.ts |   94.11 |       90 |     100 |   94.11 | 69-70             
  index.ts         |     100 |      100 |     100 |     100 |                   
  mock-tool.ts     |   92.57 |      100 |   75.75 |   92.57 | ...63,227-228,241 
  ...aceContext.ts |     100 |      100 |     100 |     100 |                   
 src/tools         |   85.94 |    84.71 |   88.32 |   85.94 |                   
  ...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 |                   
  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 |   81.49 |     80.1 |   85.71 |   81.49 | ...3217,3219-3220 
  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 |   77.56 |    84.11 |   77.14 |   77.56 | ...1291,1299-1300 
  ...ool-events.ts |       8 |        0 |       0 |       8 | 132-158           
  mcp-pool-key.ts  |   97.46 |    93.93 |     100 |   97.46 | 175-176           
  ...ce-content.ts |   96.55 |    91.17 |     100 |   96.55 | 80-82             
  mcp-retry.ts     |   97.67 |    95.65 |     100 |   97.67 | 131-132           
  mcp-status.ts    |     100 |      100 |     100 |     100 |                   
  mcp-tool.ts      |    97.2 |    93.47 |     100 |    97.2 | ...00-801,856-857 
  ...sport-pool.ts |   83.49 |    80.15 |   84.61 |   83.49 | ...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.74 |    84.28 |   88.46 |   91.74 | ...93,606,804-809 
  notebook-edit.ts |   85.55 |    77.39 |   81.25 |   85.55 | ...86-902,948-949 
  ...escendants.ts |   36.17 |    64.51 |   55.55 |   36.17 | ...46-310,385-390 
  ...nforcement.ts |   82.57 |    90.24 |     100 |   82.57 | 174-185,234-247   
  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 |   93.57 |     92.3 |      90 |   93.57 | 122-130           
  shell.ts         |   78.78 |    84.06 |   91.91 |   78.78 | ...5019,5082-5083 
  skill-utils.ts   |     100 |      100 |     100 |     100 |                   
  skill.ts         |   91.06 |    93.33 |   89.47 |   91.06 | ...71,475,520-542 
  ...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     |   94.36 |    84.61 |   92.85 |   94.36 | ...10-415,437-438 
  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         |   92.74 |    91.52 |    91.3 |   92.74 | ...63-564,580-586 
  ...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.53 |    83.57 |      80 |   90.53 | ...1007,1065-1068 
  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   |   86.03 |    86.11 |   87.85 |   86.03 |                   
  agent.ts         |   85.28 |     85.8 |   86.31 |   85.28 | ...4246,4268-4278 
  fork-subagent.ts |   99.36 |    90.69 |     100 |   99.36 | 91                
 ...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 |   83.95 |    83.05 |   73.33 |   83.95 |                   
  workflow.ts      |   83.95 |    83.05 |   73.33 |   83.95 | ...11,456,458-459 
 src/utils         |   92.82 |    89.73 |   96.83 |   92.82 |                   
  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 |                   
  ...ncyLimiter.ts |   94.64 |    95.23 |     100 |   94.64 | 64-66             
  ...igResolver.ts |     100 |      100 |     100 |     100 |                   
  ...engthError.ts |   91.06 |    89.47 |     100 |   91.06 | ...46-147,154-155 
  ...n-branches.ts |   95.81 |    93.95 |      95 |   95.81 | ...91-492,504-517 
  ...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        |   82.62 |    94.32 |    61.9 |   82.62 | ...62-378,382-388 
  fetch.ts         |   90.68 |    82.51 |     100 |   90.68 | ...72,483-484,503 
  fileUtils.ts     |   94.96 |    93.47 |   96.15 |   94.96 | ...1865,1890-1891 
  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 
  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.95 |    92.79 |     100 |   93.95 | ...78-479,481-483 
  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 |   97.29 |    86.93 |     100 |   97.29 | ...59-660,735-736 
  readManyFiles.ts |   96.29 |    87.23 |     100 |   96.29 | 225,276,286-290   
  retry.ts         |   96.09 |    92.52 |     100 |   96.09 | ...67,558-559,577 
  retryContext.ts  |     100 |      100 |     100 |     100 |                   
  ...sification.ts |   97.63 |    97.02 |     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.61 |   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.16 |    91.91 |     100 |   98.16 | ...1244-1246,1256 
  ...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 |    60.86 |      75 |   54.62 | ...03-105,108-134 
  ...Compaction.ts |   96.13 |    96.42 |     100 |   96.13 | ...34-339,341-346 
  ...pt-records.ts |   85.85 |    83.63 |     100 |   85.85 | ...90-394,424-439 
  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 |   95.81 |    89.39 |     100 |   95.81 | ...74-275,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.68 |    80.38 |   94.69 |   83.68 |                   
  crawlCache.ts    |     100 |      100 |     100 |     100 |                   
  crawler.ts       |   82.47 |    76.22 |      95 |   82.47 | ...1525,1559-1560 
  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.

@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 — CI landed green after the review. ✅

…llDetail toggle

The streaming thinking block showed a 4-line preview that varied in
height due to empty lines in the model's reasoning output, causing
constant page reflow and flicker during generation.

Changes:
- ThinkBody now renders nothing when collapsed (both streaming and
  committed), keeping the block at a stable 1-line header height.
- Ctrl+O now toggles inline fullDetail mode (like Claude Code): all
  thinking blocks, tool groups, and tool results expand/collapse in
  the main conversation view — no alternate-screen overlay.
- Alt+T preserved as hidden shortcut (same toggle, not shown in UI).
- MainContent passes fullDetail to HistoryItemDisplay via the existing
  ThoughtExpandedContext, so the toggle works in both VP and Static
  rendering paths.
- Removed TranscriptView overlay rendering, transcriptItems memo,
  StreamingContext import, and EMPTY_HISTORY_ITEMS constant.
- Removed dead code: tailVisualLines, grow-only height tracker,
  MAX_STREAMING_THINKING_VISUAL_LINES, openTranscript callback.
@chiga0
chiga0 force-pushed the fix/hide-streaming-thinking-preview branch from 2084f3b to 3c49353 Compare July 30, 2026 03:46
@github-actions

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)为单个提交。

@chiga0 chiga0 changed the title fix(cli): hide streaming thinking preview by default, rebind toggle to Ctrl+O fix(cli): stabilize thinking block height, replace transcript overlay with inline Ctrl+O toggle Jul 30, 2026

@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: build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally.

中文说明

已审查。 建议见行内评论。 未审查:build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally。

— qwen3.8-max-preview via Qwen Code /review

Comment thread packages/cli/src/ui/AppContainer.tsx
@chiga0

chiga0 commented Jul 30, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /takeover

@qwen-code-dev-bot qwen-code-dev-bot added the autofix/takeover Summon the autofix loop to manage this PR (remove to release; needs triage+) label Jul 30, 2026
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤝 Takeover engaged: the autofix loop now manages this PR — it will address new review feedback and resolve base conflicts until the label is removed or the round cap is reached. Remove the autofix/takeover label (or comment @qwen-code /takeover stop) to release.

中文说明

🤝 已接管:autofix 循环现在管理此 PR —— 将持续处理新的评审反馈与 base 冲突,直到移除标签或达到轮次上限。移除 autofix/takeover 标签(或评论 @qwen-code /takeover stop)即可释放。

@qwen-code-dev-bot

qwen-code-dev-bot commented Jul 30, 2026

Copy link
Copy Markdown
Collaborator

AutoFix round 5 finishedview run. See this round's report below.

中文说明

AutoFix 第 5 轮已完成 —— 查看运行。本轮报告见下方。

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 Addressed the latest review feedback (round 1/100). What changed, and what I pushed back on: · 已处理最新评审反馈(第 1/100 轮)。改动内容与我反驳保留之处如下:

Address review summary — PR #8077

Feedback triage

One inline finding from the automated reviewer:

  • [rc:3679973272] Suggestion — remove orphaned transcript infrastructure. The PR removes openTranscript (the only code that set transcriptFreeze to non-null) and the TranscriptView render branch, but left behind the now-unreachable transcript state/refs/callback/effects/guards in AppContainer.tsx plus the orphaned TranscriptView.tsx and its two test files.

Decision: Implemented (resolved in code). Verified first: with openTranscript gone, setTranscriptFreeze(null) is the only remaining setter, so transcriptFreeze is permanently null, isTranscriptOpen/isTranscriptOpenRef are permanently false, and every guard/effect keyed off them is dead code. TranscriptView.tsx had no remaining production importer (only its own two test files). This is dead code this PR itself orphaned, so removing it is in scope and matches AGENTS.md's Simplicity First.

Changes

In packages/cli/src/ui/AppContainer.tsx (pure deletions, no behavior change):

  • Removed the transcriptFreeze/setTranscriptFreeze state, isTranscriptOpen, isTranscriptOpenRef, and closeTranscript.
  • Removed the transcript guard inside refreshStatic (the callback body is otherwise unchanged).
  • Removed the transcript-close normal-buffer repaint effect (prevTranscriptOpenRef/wasOpenPrevRender/transcriptCloseCount*).
  • Removed the anti-deadlock effect and its now-unused needsBlockingInput local (only consumer was that effect).
  • Removed the input-swallowing guard that was the first branch of handleGlobalKeypress.
  • Removed the queue-drain isTranscriptOpenRef.current guard.
  • Removed the corresponding closeTranscript / isTranscriptOpen dependency-array entries.

Deleted the orphaned component and its tests:

  • packages/cli/src/ui/components/TranscriptView.tsx
  • packages/cli/src/ui/components/TranscriptView.test.tsx
  • packages/cli/src/ui/components/TranscriptView.errorFallback.test.tsx

Shared imports (StreamingState, useRef, useEffect, useCallback, ansiEscapes, HistoryItem, HistoryItemWithoutId, Command.ESCAPE/EXIT) all remain used elsewhere; typecheck and lint confirm nothing was left dangling. The Command.TOGGLE_TRANSCRIPT enum entry is intentionally kept (unbound) as the PR designed.

Conflict notes

--conflict false — no merge performed.

Verification

  • npm run typecheck — passed
  • npm run lint — passed
  • npm run build — passed
  • npm run bundle — passed (confirms the deleted component is not referenced anywhere in the bundled CLI)
  • vitest (packages/cli: AppContainer.test.tsx, ConversationMessages.test.tsx, keyMatchers.test.ts) — 196 passed (3 files)

Integration tests were not run: this round is a no-behavior-change dead-code removal (the removed guards could never fire because transcriptFreeze was already permanently null), the behavior is fully covered by the unit tests above, and the reviewer noted the Integration Tests (CLI, No Sandbox) suite was skipped in CI.

中文说明

处理审查总结 — PR #8077

反馈分类

来自自动审查器的一条行内发现:

  • [rc:3679973272] 建议 — 移除已孤立的 transcript 基础设施。 本 PR 移除了 openTranscript(唯一将 transcriptFreeze 设为非 null 的代码)和 TranscriptView 渲染分支,但遗留了 AppContainer.tsx 中现已不可达的 transcript 状态/引用/回调/effect/守卫,以及已孤立的 TranscriptView.tsx 及其两个测试文件。

决定:已实现(在代码中解决)。 先做了验证:随着 openTranscript 被移除,setTranscriptFreeze(null) 成为唯一剩余的 setter,因此 transcriptFreeze 恒为 nullisTranscriptOpen/isTranscriptOpenRef 恒为 false,所有以它们为条件的守卫/effect 都是死代码。TranscriptView.tsx 已无任何生产代码引用(仅其自身的两个测试文件引用)。这些是本 PR 自身孤立出来的死代码,移除它们属于本 PR 范围,且符合 AGENTS.md 的 Simplicity First 原则。

变更

packages/cli/src/ui/AppContainer.tsx 中(纯删除,无行为变化):

  • 移除了 transcriptFreeze/setTranscriptFreeze 状态、isTranscriptOpenisTranscriptOpenRef 以及 closeTranscript
  • 移除了 refreshStatic 内部的 transcript 守卫(该回调的其余主体保持不变)。
  • 移除了 transcript 关闭后的正常缓冲区重绘 effect(prevTranscriptOpenRef/wasOpenPrevRender/transcriptCloseCount*)。
  • 移除了 anti-deadlock effect 及其现已无用的 needsBlockingInput 局部变量(其唯一使用者就是该 effect)。
  • 移除了作为 handleGlobalKeypress 第一个分支的输入吞没守卫。
  • 移除了 queue-drain 中的 isTranscriptOpenRef.current 守卫。
  • 移除了依赖数组中相应的 closeTranscript / isTranscriptOpen 条目。

删除了已孤立的组件及其测试:

  • packages/cli/src/ui/components/TranscriptView.tsx
  • packages/cli/src/ui/components/TranscriptView.test.tsx
  • packages/cli/src/ui/components/TranscriptView.errorFallback.test.tsx

共享导入(StreamingStateuseRefuseEffectuseCallbackansiEscapesHistoryItemHistoryItemWithoutIdCommand.ESCAPE/EXIT)在别处仍被使用;typecheck 与 lint 确认没有遗留任何悬空引用。Command.TOGGLE_TRANSCRIPT 枚举项按 PR 的设计被有意保留(未绑定)。

冲突说明

--conflict false — 未执行合并。

验证

  • npm run typecheck — 通过
  • npm run lint — 通过
  • npm run build — 通过
  • npm run bundle — 通过(确认被删除的组件在打包后的 CLI 中无任何引用)
  • vitest(packages/cli:AppContainer.test.tsxConversationMessages.test.tsxkeyMatchers.test.ts)— 196 通过(3 个文件)

未运行集成测试:本轮是无行为变化的死代码移除(被移除的守卫永远不会触发,因为 transcriptFreeze 此前就已恒为 null),相关行为已由上述单元测试完全覆盖,且审查器已指出 Integration Tests (CLI, No Sandbox) 套件在 CI 中被跳过。

Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。

Re-review when you have a moment. After round 100 this bot stops and leaves the PR for a human. · 有空请复审;第 100 轮后本 bot 停止并将 PR 交给人工。


🧠 Handled by Qwen Code · model/模型 qwen3.8-max-preview

@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: build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally.

中文说明

已审查。 建议见行内评论。 未审查:build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally。

— qwen3.8-max-preview via Qwen Code /review

Comment thread packages/cli/src/config/keyBindings.ts
Comment thread packages/cli/src/config/keyBindings.ts Outdated
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 Addressed the latest review feedback (round 2/100). What changed, and what I pushed back on: · 已处理最新评审反馈(第 2/100 轮)。改动内容与我反驳保留之处如下:

Review feedback addressed

rc:3680910174 — Stale keyboard shortcuts help text (Implemented)

Finding: KeyboardShortcuts.tsx:41 still rendered { key: 'ctrl+o', description: t('to view transcript') } after the transcript overlay was removed. Users opening the shortcuts help would see a description pointing to a feature that no longer exists.

Decision: Implement — real user-facing bug, clearly in scope.

Changes:

  • Updated KeyboardShortcuts.tsx to use t('to expand thinking') instead of t('to view transcript')
  • Replaced the stale 'to view transcript' i18n key with 'to expand thinking' in all 9 locale files (en, zh, zh-TW, ja, de, fr, pt, ru, ca) with appropriate translations

rc:3680910167 — Missing integration test for Ctrl+O → thinking-expansion toggle (Implemented)

Finding: The PR deleted five Transcript (Ctrl+O) integration tests but added no replacement exercising the new Ctrl+O → thinking-expansion chain end-to-end.

Decision: Implement — valid coverage gap; a future refactor could silently break the keypress → handler → state toggle chain.

Changes:

  • Added a Thinking expansion (Ctrl+O) integration describe block in AppContainer.test.tsx
  • The test finds the global keypress handler (identified by TOGGLE_THINKING_EXPANDED in its body), simulates Ctrl+O, and asserts the TOGGLE_THINKING_EXPANDED branch executed by verifying the refreshStatic side effect (stdout write). A second press verifies the toggle-back path hits the same branch.
  • Note: the test asserts on the refreshStatic side effect rather than the context value because the TestContextConsumer mock (which replaces App) does not reliably re-render on context changes triggered by keypress handlers in this test setup. The provider→render link is already covered by HistoryItemDisplay.test.tsx.

Verification

  • npm run build — passed
  • npm run typecheck — passed
  • npm run lint — passed
  • vitest packages/cli (AppContainer.test.tsx, keyMatchers.test.ts, ConversationMessages.test.tsx) — 197 passed
  • vitest packages/cli (HistoryItemDisplay.test.tsx) — 32 passed
中文说明

已处理的审查反馈

rc:3680910174 — 键盘快捷键帮助文本过期(已实现)

发现: KeyboardShortcuts.tsx:41 在 transcript 覆盖层被移除后仍然渲染 { key: 'ctrl+o', description: t('to view transcript') }。用户打开快捷键帮助时会看到指向已不存在功能的描述。

决定: 实现——真实的面向用户的 bug,明确在范围内。

变更:

  • KeyboardShortcuts.tsx 中的 t('to view transcript') 更新为 t('to expand thinking')
  • 在全部 9 个语言文件(en、zh、zh-TW、ja、de、fr、pt、ru、ca)中将过期的 'to view transcript' i18n 键替换为 'to expand thinking',并提供相应翻译

rc:3680910167 — 缺少 Ctrl+O → 思考展开切换的集成测试(已实现)

发现: 本 PR 删除了 5 个 Transcript (Ctrl+O) integration 测试,但没有添加覆盖新 Ctrl+O → 思考展开链路端到端的替代测试。

决定: 实现——有效的覆盖缺口;未来重构可能静默打断 按键 → handler → 状态切换 的链路。

变更:

  • AppContainer.test.tsx 中添加了 Thinking expansion (Ctrl+O) integration describe 块
  • 测试通过 handler 函数体中的 TOGGLE_THINKING_EXPANDED 字符串找到全局 keypress handler,模拟 Ctrl+O 按键,并通过验证 refreshStatic 副作用(stdout 写入)断言 TOGGLE_THINKING_EXPANDED 分支已执行。第二次按键验证 toggle-back 路径命中同一分支。
  • 说明:测试断言的是 refreshStatic 副作用而非 context 值,因为 TestContextConsumer mock(替代 App)在此测试环境中不能可靠地在 keypress handler 触发的 context 变更时重新渲染。provider→渲染 的链路已由 HistoryItemDisplay.test.tsx 覆盖。

验证

  • npm run build — 通过
  • npm run typecheck — 通过
  • npm run lint — 通过
  • vitest packages/cli (AppContainer.test.tsx, keyMatchers.test.ts, ConversationMessages.test.tsx) — 197 通过
  • vitest packages/cli (HistoryItemDisplay.test.tsx) — 32 通过

Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。

Re-review when you have a moment. After round 100 this bot stops and leaves the PR for a human. · 有空请复审;第 100 轮后本 bot 停止并将 PR 交给人工。


🧠 Handled by Qwen Code · model/模型 qwen3.8-max-preview

@wenshao

wenshao commented Jul 30, 2026

Copy link
Copy Markdown
Collaborator

评审(基于 33a3210):稳定思考块高度 + 用行内 Ctrl+O 开关替换 transcript overlay

这个 PR 做了什么

三个 commit,20 个文件,+78 / −804:

  1. ThinkBody 折叠时不再渲染任何内容 —— 删掉 4 行流式尾部窗口(tailVisualLines、grow-only 高度跟踪、MAX_STREAMING_THINKING_VISUAL_LINES),流式思考块固定为 1 行 ✻ Thinking… 头部。这实质上回滚了 feat(cli): show full reasoning content when expanding thinking blocks during streaming #6678 引入的流式预览。
  2. Ctrl+O 从 alt-screen transcript 改绑为行内 fullDetail 开关 —— TOGGLE_TRANSCRIPT 解绑,TOGGLE_THINKING_EXPANDED 增加 ctrl+o(Alt+T 保留为 legacy 绑定),MainContent 在四处 HistoryItemDisplay 调用点把 ThoughtExpandedContext.allExpanded 映射为 fullDetailTranscriptView 及 AppContainer 里全部 transcript 机制(冻结快照、防死锁 effect、关闭键守卫、退出重绘、消息队列 drain 守卫)一并删除。
  3. 最新 commit 修正了应用内快捷键文案并补了一个集成测试。

方向是对的 —— transcript overlay 为一个快捷键背了太多承重复杂度,收敛成行内开关是实实在在的简化。AppContainer 侧的删除干净且自洽。下面的问题主要集中在「原来被 overlay 遮住的接缝」上。

我做的验证

33a3210 上,涉及及相邻的测试全绿:AppContainer.test.tsx(130)、ConversationMessages.test.tsx(18)、MainContent.test.tsx(17)、HistoryItemDisplay.test.tsxkeyMatchers.test.ts(49)、keyBindings.test.ts(4)、src/i18n(48)。改动文件 eslint 干净。(完整 tsc 需要先构建 core,已跳过。)

另外我对新增的那个集成测试做了一次探针验证:它依赖「refreshStatic 在非 VP 模式下写 clearTerminal」这个因果链,我打印了 Ctrl+O 前后新增的 stdout 写入,唯一一次新增写入确实是 \x1b[2J\x1b[3J\x1b[H,即 ansiEscapes.clearTerminal。注释里的推理成立。

问题

1. 用户文档仍在描述已被删除的 transcript —— 面向用户,建议合并前必修。

最新 commit 已修正 KeyboardShortcuts.tsxto view transcriptto expand thinking,并同步改名了 9 个 locale 的 key,顺带清掉了旧 key,很好)。但 docs/users/reference/keyboard-shortcuts.md:13 完全没动,仍写着:

Ctrl+O — Open/close the full-detail transcript view (a scrollable, frozen snapshot showing every tool's complete output and full thinking). Press again, or Esc/q, to close.

这里每一句现在都是错的,包括关闭键(Esc/q 已不再关闭任何东西)。

1b. 新文案低估了实际行为。 to expand thinking / 展开思考 只说了一半:fullDetail 同时会让工具组走 forceExpandAll + forceShowResult,即展开每个工具及其完整输出(见 ToolGroupMessage.tsx:371,459,506)。建议改成 to expand details / 展开完整详情之类。

2. append-only(<Static>)渲染路径下输出无上界 —— 本 PR 主要的行为风险。

fullDetail 会把 availableTerminalHeightPerToolMessage 置为 undefinedToolGroupMessage.tsx:459)并叠加 forceShowResult,有意解除每个工具的高度截断。VP 模式下这被虚拟视口兜住;但当 ui.useTerminalBuffer 为 false(屏幕阅读器模式、stdout 重定向、不兼容终端)时,Ctrl+O 会走 refreshStatic()clearTerminal + 整个 <Static> remount,把全部历史项以完整未截断的工具输出重新打印进终端 scrollback;再按一次关闭还要重复整轮重绘。被删掉的 TranscriptView 用虚拟滚动的 alt-screen 列表兜住的正是这一情形。长会话里若有大的 read_file/grep 结果,这个 dump 会非常大。

顺带一个佐证:新增的那个集成测试之所以能靠 clearTerminal 通过,正是因为测试环境里 useTerminalBuffer 为 false —— 这条路径并不边缘。

建议:静态路径保留 staticAreaMaxItemHeight 上限(!useTerminalBuffer 时不要把每工具高度置空),或把行内 fullDetail 开关限定在 VP 模式。

3. VP 的高度估算没有考虑 fullDetail

MainContent.tsx:104 —— virtualEstimatedItemHeight = (index) => (index === 0 ? 10 : 3)fullDetail 打开后,视口外的 item 实际高度是估算值的 10–100 倍,导致滚动条比例、PgUp/PgDn 跳转距离在被真实测量之前严重失真。被删掉的 estimateTranscriptItemHeight(按类型:思考 12、工具组 16 …)就是为此存在的,值得移植一个按 fullDetail 条件生效的版本。

4. 丢失了 fullDetail 渲染的兜底错误边界。

TranscriptView 曾用 ErrorBoundary 包住 fullDetail 子树,fallback 显示 "Failed to render transcript. … Esc/q to close",理由正是「fullDetail 会走到普通视图从不经过的渲染路径」。改成行内后,VP 模式还有 VirtualizedList 的逐项 try/catch(VirtualizedList.tsx:541),但 <Static> 路径没有 —— 那里抛错会一路到 startInteractiveUI.tsx:210 的顶层边界,记录日志后 5 秒 process.exit(1)。也就是说:只在 full detail 下才会抛错的畸形 item,现在会直接结束会话,而不是显示可恢复的 fallback。概率不高,但它恰好落在与问题 #2 相同的那条路径上,失败模式严格变差。

5. 「移除孤立基础设施」那个 commit 漏掉的死代码(在 33a3210 上仍存在)。

  • Command.TOGGLE_TRANSCRIPT[] 绑定的枚举成员形式留存(keyBindings.ts:86,271),其 keyMatchers 条目现在只可能返回 false,且已无任何引用。建议直接删除该命令,而不是留一个恒假 matcher 和一个前所未有的空绑定数组(keyBindings.test.ts 只断言 Array.isArray,空数组没人拦得住)。
  • packages/cli/src/ui/components/AlternateScreen.tsx 已无生产消费者 —— 只剩它自己的测试和 useMouseEvents.ts:165 的一句注释。
  • ui/utils/textUtils.tswrapToVisualLines 现在只被自己的测试引用。
  • 'Transcript' / 'Failed to render transcript.' 仍留在全部 9 个 src/i18n/locales/*.js 里(例如 zh.js:494)。既然这轮已经顺手改掉了 to view transcript,这几个 key 可以一并清掉。

6. 展开信号重复,且各视图作用域不一致。

MainContentfullDetail = allExpanded,而 HistoryItemDisplay 自己读 context:fullDetail || (thoughtExpanded ?? (allExpanded || expandedHeadIds.has(...)))HistoryItemDisplay.tsx:254)。对 MainContent 渲染的 item 而言,allExpanded 这一项现在永远走不到。同时 AgentChatContent.tsxSessionPreview.tsxQuittingDisplay.tsx 渲染 HistoryItemDisplay 时不传 fullDetail,于是同一个 Ctrl+O 在那些视图里只展开思考、不展开工具明细。让 HistoryItemDisplay 自己派生(fullDetail ?? allExpanded)可以去掉 MainContent 四处重复的 prop,并让这个快捷键在各处含义统一。

7. 命名和注释已与行为脱节。

Command.TOGGLE_THINKING_EXPANDED 现在也切换工具输出,TOGGLE_FULL_DETAIL 才名实相符。ThoughtExpandedContext.allExpanded 的文档注释仍写 "Alt+T global toggle";ToolGroupMessage.tsx:286,336,371,459HistoryItemDisplay.tsx:90,252 仍在说 "transcript full-detail mode" / "Skipped in transcript full-detail mode",而 transcript 已不存在。

8. pending 区域会静默裁剪 full detail。

MainContent 的 pending 包裹层在 constrained 或 Responding 时是 maxHeight={availableTerminalHeight} + overflow="hidden"。工具执行中按 Ctrl+O,展开的 pending 工具组会超出该 clamp,超出部分直接消失,且没有 +N lines 之类的提示。属次要问题,但这是 overlay 时代不存在的情形。

给维护者的 UX 取舍问题(关于移除流式预览)

要修的闪烁是真实存在的 —— 变高的推理输出在生成过程中不断 reflow 确实很糟。但这个修法把流式期间的推理可见性全部移除了,而 (ctrl+o to expand) 提示只在已落定的思考块上渲染(ConversationMessages.tsx:317!isPending && !expanded 分支内),所以流式折叠态就是一个裸的 Thinking…,没有任何可发现性线索。折中方案:保留 N 行窗口,但恒定补齐到 N 行(固定高度而非 grow-only),既消除闪烁又保留流式可见。至少可以考虑在 pending 期间也显示展开提示。

测试覆盖

最新 commit 补的 Thinking expansion (Ctrl+O) integration 是正确方向,因果链也经我实测成立(见上)。两点可以更强:

  • 它断言的是 mockStdout.write调用次数增加,而非写入内容。改成断言写入内容包含 ansiEscapes.clearTerminal,就不会被将来任何无关的 stdout 写入(窗口标题、其它 effect)意外满足。
  • 它仍未覆盖这个 PR 的核心行为:fullDetail 是否真的经 provider 到达 MainContent、工具组的完整输出是否随之出现。目前只证明了「按键走进了那个分支」。一个渲染层断言(例如展开后帧中出现完整思考文本或完整工具输出)会实质得多 —— 被删的 283 行 transcript 测试原本覆盖的就是这一层。
  • getGlobalKeypresshandler.toString().includes('TOGGLE_THINKING_EXPANDED') 挑 handler,依赖源码文本。若采纳 API Key是要设成阿里云的API Key吗? #7 的改名建议,记得同步这里(好在 expect(handleKeypress).toBeDefined() 会让失配显式失败,不会静默跳过)。
  • ConversationMessages.test.tsxexpect(output).not.toContain('Line 1') 断言偏弱(它同时覆盖了 Line 10Line 19,且若头部将来出现同样子串会以错误的理由通过)。断言渲染帧只有一行,才是这次改动真正保证的东西。

安全性

无值得关注之处。没有新的输入处理、没有外部 I/O、没有数据离开进程。问题 #2 略带一点信息暴露的味道 —— 完整工具输出被写进终端 scrollback 而非临时 alt screen —— 但那是用户自己会话的数据,且由显式按键触发。

结论

简化得不错,AppContainer 的删除很细致,最新 commit 也已修掉应用内文案并补了集成测试。合并前建议:补上 docs/users/reference/keyboard-shortcuts.md#1Ctrl+O 那行仍在描述 transcript)、就 #2(静态路径输出无上界)做出决策、并补完 #5 的死代码清理。#1b、#3#4#6#7 可以留作 follow-up;流式预览的 UX 取舍属于产品决策。

@chiga0 chiga0 left a comment

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.

Reviewed. Suggestions are inline. Not reviewed: build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally.

中文说明

已审查。 建议见行内评论。 未审查:build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally。

— qwen3.8-max-preview via Qwen Code /review

Comment on lines +116 to 117
const { allExpanded: fullDetail } = useThoughtExpanded();
const streamingState = uiState.streamingState;

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.

[Suggestion] No test covers the MainContent → HistoryItemDisplay fullDetail prop wiring. ToolGroupMessage does not consume useThoughtExpanded context — it relies exclusively on the fullDetail prop. If a future refactor drops the four fullDetail={fullDetail} lines below, thought blocks would still expand (via the allExpanded context path in HistoryItemDisplay), masking the regression — but tool groups would stay collapsed on Ctrl+O, and no existing test would turn red. — Concrete cost: silent loss of Ctrl+O tool-group expansion with no test signal.

Consider adding a MainContent-level test that wraps the component in a ThoughtExpandedProvider with allExpanded: true, renders a tool_group history item, and asserts the tool's detailed output is visible.

中文说明

没有测试覆盖 MainContent → HistoryItemDisplay 的 fullDetail prop 传递。ToolGroupMessage 不消费 useThoughtExpanded context——它完全依赖 fullDetail prop。如果未来的重构删除了下方四处 fullDetail={fullDetail},思考块仍会展开(通过 HistoryItemDisplay 中的 allExpanded context 路径),从而掩盖回归——但工具组将在 Ctrl+O 时保持折叠,且没有现有测试会变红。具体代价:Ctrl+O 工具组展开功能静默失效,无测试信号。

建议添加一个 MainContent 级别的测试,用 allExpanded: trueThoughtExpandedProvider 包裹组件,渲染一个 tool_group 历史项,并断言工具的详细输出可见。

— qwen3.8-max-preview via Qwen Code /review

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.

Valid concern — if the four fullDetail={fullDetail} lines in MainContent were dropped, tool groups would silently lose Ctrl+O expansion with no test signal, since ToolGroupMessage relies exclusively on the prop (not the context). Deferring to a follow-up: the test needs to wrap MainContent in a ThoughtExpandedProvider with allExpanded: true, render a tool_group history item, and assert detailed tool output is visible — a non-trivial addition that this round's scope (docs fix + dead code cleanup) doesn't warrant.

中文说明

关注点有效——如果 MainContent 中四处 fullDetail={fullDetail} 被删除,工具组将静默失去 Ctrl+O 展开功能且无测试信号,因为 ToolGroupMessage 完全依赖该 prop(而非 context)。推迟到后续跟进:该测试需要用 allExpanded: trueThoughtExpandedProvider 包裹 MainContent,渲染一个 tool_group 历史项,并断言工具的详细输出可见——这是一个非平凡的增量,本轮范围(文档修复 + 死代码清理)不适合包含。

@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. 1 Suggestion-level finding(s) could not be anchored to a changed line and were dropped; nothing further to act on here. Not reviewed: build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally.

中文说明

已审查。 建议见行内评论。 1 条建议级发现无法锚定到改动行,已丢弃;此处无需进一步处理。 未审查:build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally。

— qwen3.8-max-preview via Qwen Code /review

Comment on lines +4776 to +4780
const writesBefore = mockStdout.write.mock.calls.length;
act(() => {
handleKeypress!(ctrlO);
});
expect(mockStdout.write.mock.calls.length).toBeGreaterThan(writesBefore);

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] This replacement for the five deleted transcript tests verifies only that Ctrl+O reaches the TOGGLE_THINKING_EXPANDED branch (via the refreshStatic stdout write) — it never asserts that thoughtExpanded actually flipped or that the rendered output changed. — Concrete cost: deleting setThoughtExpanded((prev) => !prev) from the handler (AppContainer.tsx:3655-3658) while keeping refreshStatic() leaves this test green, yet Ctrl+O would no longer expand thinking blocks, so that regression ships uncaught. The deleted transcript tests all asserted visible output via lastFrame().

Suggested fix — assert on the rendered frame in addition to the stdout write, e.g. render a gemini_thought history item, then:

act(() => { handleKeypress!(ctrlO); });
expect(lastFrame()).toContain('<the full thinking text>');
act(() => { handleKeypress!(ctrlO); });
expect(lastFrame()).not.toContain('<the full thinking text>');
中文说明

这个用于替代被删除的 5 个 transcript 测试的新测试,仅验证了 Ctrl+O 到达 TOGGLE_THINKING_EXPANDED 分支(通过 refreshStatic 的 stdout 写入),从未断言 thoughtExpanded 状态确实翻转,也未断言渲染输出发生变化。— 具体代价:从 handler(AppContainer.tsx:3655-3658)中删除 setThoughtExpanded((prev) => !prev) 而保留 refreshStatic(),此测试仍会通过,但 Ctrl+O 将不再展开思考块,该回归会漏网。被删除的 transcript 测试都通过 lastFrame() 断言了可见输出。

建议修复 —— 除 stdout 写入外,再断言渲染帧(渲染一个 gemini_thought history item,按 Ctrl+O 后断言完整思考文本出现,再按一次后断言其消失)。

— qwen3.8-max-preview via Qwen Code /review

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 Addressed the latest review feedback (round 3/100). What changed, and what I pushed back on: · 已处理最新评审反馈(第 3/100 轮)。改动内容与我反驳保留之处如下:

Round summary

Addressed review feedback from @wenshao's detailed review and the automated reviewer's inline suggestion.

Feedback points and decisions

#1 — User docs still describe deleted transcript (Required)
Fixed. Updated docs/users/reference/keyboard-shortcuts.md Ctrl+O row from the old transcript description to: "Toggle expanded detail mode: expand or collapse all thinking blocks and tool outputs inline. Press again to collapse."

#1b — Help text understates behavior (Suggestion → Implemented)
Changed the in-app shortcut text from to expand thinking to to expand details across KeyboardShortcuts.tsx and all 9 locale files, with updated translations. This accurately reflects that Ctrl+O also expands tool outputs, not just thinking blocks.

#2 — Static rendering path unbounded output (Escalated — maintainer decision)
This is a design tradeoff: the reviewer suggests either keeping staticAreaMaxItemHeight limits in the static path or restricting inline fullDetail to VP mode. Both options have UX implications that are not ours to decide. Leaving for maintainer.

#3 — VP height estimation doesn't account for fullDetail (Declined — follow-up)
Requires non-trivial new estimation logic (porting estimateTranscriptItemHeight). The reviewer explicitly classified this as follow-up.

#4 — Lost error boundary for fullDetail rendering (Declined — follow-up)
Adding an error boundary to the <Static> path is a separate concern. The reviewer classified this as follow-up.

#5 — Dead code cleanup (Required)
Fully addressed:

  • Removed Command.TOGGLE_TRANSCRIPT enum member, its empty binding in defaultKeyBindings, and its always-false matcher + test case in keyMatchers.test.ts.
  • Deleted AlternateScreen.tsx and AlternateScreen.test.tsx (no production consumers — only its own test imported it).
  • Removed wrapToVisualLines from textUtils.ts and its test block from textUtils.test.ts (only self-test referenced it).
  • Removed the dead 'Failed to render transcript.' i18n key from all 9 locales. Note: Transcript key is NOT dead (used by BackgroundTasksDialog.tsx and sessionPaths.ts for session transcript file paths). 'stdout shown in transcript mode (ctrl+o)' and 'Expand the currently collapsed history transcript' are also still consumed (by constants.ts and historyCommand.ts respectively) — their wording is stale but renaming i18n keys across 9 locales needs translation review, deferred to follow-up.

#6 — Duplicate expansion signal, inconsistent scope (Declined — follow-up)
Refactoring HistoryItemDisplay to self-derive fullDetail ?? allExpanded and removing the four explicit props from MainContent is a structural change the reviewer classified as follow-up.

#7 — Naming and stale comments (Partially implemented)
Updated all "transcript full-detail mode" comments to "full-detail mode" in ToolGroupMessage.tsx (5 locations), HistoryItemDisplay.tsx, ToolMessage.tsx, and ToolGroupMessage.test.tsx. Updated ThoughtExpandedContext.allExpanded doc comment from "Alt+T global toggle" to "Ctrl+O / Alt+T global toggle — expands every thinking block and tool output at once." Updated useMouseEvents.ts comment to remove the now-deleted AlternateScreen reference. The Command.TOGGLE_THINKING_EXPANDEDTOGGLE_FULL_DETAIL enum rename is deferred to follow-up (it touches keyBindings, keyMatchers, AppContainer, and the integration test's handler.toString() check).

#8 — Pending area silently clips full detail (Declined — follow-up)
Minor edge case the reviewer classified as secondary.

UX tradeoff — streaming preview removal (Escalated — product decision)
Whether to restore a fixed-height streaming thinking preview is a product decision for the maintainer.

Inline [rc:3681742077] — MainContent-level test for fullDetail prop wiring (Declined — scope)
The suggestion is valid: if the four fullDetail={fullDetail} lines in MainContent were dropped, tool groups would silently lose Ctrl+O expansion with no test signal. However, adding a MainContent-level integration test that wraps in ThoughtExpandedProvider, renders a tool_group item, and asserts detailed output visibility is a non-trivial addition. Deferring to a follow-up to keep this round focused on the merge-blocking items.

Test coverage suggestions (Declined — follow-up)
The reviewer's suggestions to strengthen the integration test assertion (content match instead of call count) and the ConversationMessages.test.tsx assertion (frame line count instead of substring absence) are improvements but out of scope for this round.

Conflict notes

No conflicts (--conflict false).

Verification

  • npm run build — passed
  • npm run typecheck — passed
  • npm run lint — passed
  • vitest run src/ui/keyMatchers.test.ts src/ui/utils/textUtils.test.ts — 85 passed (2 files)
  • vitest run src/ui/components/messages/ToolGroupMessage.test.tsx — 53 passed
  • vitest run src/ui/components/HistoryItemDisplay.test.tsx src/ui/components/MainContent.test.tsx src/ui/components/messages/ConversationMessages.test.tsx — 67 passed (3 files)
  • vitest run src/ui/AppContainer.test.tsx — 130 passed
  • vitest run src/config/keyBindings.test.ts src/i18n — 35 passed (3 files)
中文说明

本轮总结

处理了 @wenshao 的详细审查和自动审查器的行内建议。

反馈要点及决定

#1 — 用户文档仍在描述已删除的 transcript(必须修复)
已修复。将 docs/users/reference/keyboard-shortcuts.md 中 Ctrl+O 的描述从旧的 transcript 说明更新为:"Toggle expanded detail mode: expand or collapse all thinking blocks and tool outputs inline. Press again to collapse."

#1b — 帮助文案低估了实际行为(建议 → 已实施)
将应用内快捷键文案从 to expand thinking 改为 to expand details,涵盖 KeyboardShortcuts.tsx 和全部 9 个语言文件,并更新了翻译。这准确反映了 Ctrl+O 同时展开工具输出和思考块。

#2 — 静态渲染路径输出无上界(升级 — 等待维护者决策)
这是一个设计权衡:审查者建议在静态路径保留 staticAreaMaxItemHeight 限制,或将行内 fullDetail 限定在 VP 模式。两种方案都有 UX 影响,不应由我们决定。留给维护者。

#3 — VP 高度估算未考虑 fullDetail(拒绝 — 后续跟进)
需要非平凡的新估算逻辑(移植 estimateTranscriptItemHeight)。审查者明确归类为后续跟进。

#4 — fullDetail 渲染丢失错误边界(拒绝 — 后续跟进)
<Static> 路径添加错误边界是独立关注点。审查者归类为后续跟进。

#5 — 死代码清理(必须修复)
已全部处理:

  • 删除了 Command.TOGGLE_TRANSCRIPT 枚举成员、defaultKeyBindings 中的空绑定、以及 keyMatchers.test.ts 中恒假的 matcher 和测试用例。
  • 删除了 AlternateScreen.tsxAlternateScreen.test.tsx(无生产消费者——仅自身测试导入)。
  • textUtils.ts 删除了 wrapToVisualLines,从 textUtils.test.ts 删除了对应测试块(仅自测引用)。
  • 从全部 9 个语言文件中删除了已无消费者的 'Failed to render transcript.' i18n 键。注意:Transcript 键并非死代码(被 BackgroundTasksDialog.tsxsessionPaths.ts 用于会话转录文件路径)。'stdout shown in transcript mode (ctrl+o)''Expand the currently collapsed history transcript' 也仍有消费者(分别被 constants.tshistoryCommand.ts 使用)——措辞已过时,但重命名 i18n 键需要跨 9 个语言文件的翻译审核,推迟到后续跟进。

#6 — 展开信号重复,各视图作用域不一致(拒绝 — 后续跟进)
重构 HistoryItemDisplay 使其自行派生 fullDetail ?? allExpanded 并移除 MainContent 四处显式 prop 是结构性变更,审查者归类为后续跟进。

#7 — 命名和注释已与行为脱节(部分实施)
更新了 ToolGroupMessage.tsx(5 处)、HistoryItemDisplay.tsxToolMessage.tsxToolGroupMessage.test.tsx 中所有 "transcript full-detail mode" 注释为 "full-detail mode"。更新了 ThoughtExpandedContext.allExpanded 文档注释。更新了 useMouseEvents.ts 注释以移除对已删除 AlternateScreen 的引用。Command.TOGGLE_THINKING_EXPANDEDTOGGLE_FULL_DETAIL 的枚举重命名推迟到后续跟进。

#8 — pending 区域静默裁剪 full detail(拒绝 — 后续跟进)
审查者归类为次要边缘情况。

UX 权衡 — 流式预览移除(升级 — 产品决策)
是否恢复固定高度的流式思考预览是维护者的产品决策。

行内 [rc:3681742077] — MainContent 级别的 fullDetail prop 传递测试(拒绝 — 范围)
建议有效:如果 MainContent 中四处 fullDetail={fullDetail} 被删除,工具组将静默失去 Ctrl+O 展开功能且无测试信号。但添加 MainContent 级集成测试是非平凡的增量,推迟到后续跟进。

测试覆盖建议(拒绝 — 后续跟进)
审查者关于增强集成测试断言和 ConversationMessages.test.tsx 断言的建议是改进,但不在本轮范围内。

冲突说明

无冲突(--conflict false)。

验证

  • npm run build — 通过
  • npm run typecheck — 通过
  • npm run lint — 通过
  • vitest run src/ui/keyMatchers.test.ts src/ui/utils/textUtils.test.ts — 85 通过(2 个文件)
  • vitest run src/ui/components/messages/ToolGroupMessage.test.tsx — 53 通过
  • vitest run src/ui/components/HistoryItemDisplay.test.tsx src/ui/components/MainContent.test.tsx src/ui/components/messages/ConversationMessages.test.tsx — 67 通过(3 个文件)
  • vitest run src/ui/AppContainer.test.tsx — 130 通过
  • vitest run src/config/keyBindings.test.ts src/i18n — 35 通过(3 个文件)

Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。

Re-review when you have a moment. After round 100 this bot stops and leaves the PR for a human. · 有空请复审;第 100 轮后本 bot 停止并将 PR 交给人工。


🧠 Handled by Qwen Code · model/模型 qwen3.8-max-preview

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🔀 Base updated: red check(s) [Test (ubuntu-latest, Node 22.x)] pass on current main — merged current main via update-branch; CI will re-run.

中文说明

🔀 已更新 base:红色检查 [Test (ubuntu-latest, Node 22.x)] 在当前 main 上通过 —— 已通过 update-branch 合入当前 main,CI 将重新运行。

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

Not reviewed: build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally.

中文说明

未审查:build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally。

— qwen3.8-max-preview via Qwen Code /review

Comment on lines +4964 to +4966
mockStdout.write.mockClear();
handleKeypress!(ctrlO);
expect(mockStdout.write).toHaveBeenCalledWith(ansiEscapes.clearTerminal);

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.

[Critical] This test is named "Ctrl+O flips the full-detail state" but never asserts the state flips. Its only post-keypress assertion is expect(mockStdout.write).toHaveBeenCalledWith(ansiEscapes.clearTerminal) — a side effect of refreshStatic() that runs whether or not setThoughtExpanded is called. capturedThoughtExpanded.allExpanded is asserted only before the keypress (toBe(false)), never after. — Failure scenario: remove setThoughtExpanded((prev) => !prev) from the TOGGLE_THINKING_EXPANDED case in AppContainer.tsx (~line 3669) and Ctrl+O becomes a silent no-op (terminal clears, nothing expands) while this test and the full suite stay green. Mutation probe at HEAD a32dfecf confirms it: commenting out that line leaves AppContainer.test.tsx 134/134 and AppContainer + MainContent 153/153 passing. This is maintainer @wenshao's mutation M1 (comment 5143375337), made an explicit merge condition ("whatever test you add must fail when the flip is removed"). The in-code comment claims the MainContent integration test verifies propagation, but that test injects allExpanded directly via the provider, so it cannot catch a broken AppContainer→context link.

Fix: assert the flip through a channel that reflects it. The obvious expect(capturedThoughtExpanded.allExpanded).toBe(true) does NOT work under this vi.mock('ink') harness (the capture stays false even with the flip present) — assert what MainContent forwards as fullDetail, render a context consumer with proper act flushing, or assert the rendered expansion behavior. Acceptance bar (M1): the assertion must fail when setThoughtExpanded((prev) => !prev) is removed.

中文说明

[Critical] 这个测试名为 "Ctrl+O flips the full-detail state",但从未断言状态真的翻转。它在按键之后唯一的断言是 expect(mockStdout.write).toHaveBeenCalledWith(ansiEscapes.clearTerminal) —— 这是 refreshStatic() 的副作用,无论是否调用 setThoughtExpanded 都会执行。capturedThoughtExpanded.allExpanded 只在按键之前被断言(toBe(false)),按键之后从未再检查。— 失败场景:从 AppContainer.tsx(约 3669 行)的 TOGGLE_THINKING_EXPANDED 分支中删掉 setThoughtExpanded((prev) => !prev),Ctrl+O 就会变成一个静默的空操作(终端被清空、但什么都不展开),而本测试和整个测试套件仍然全绿。在 HEAD a32dfecf 上的变异探针已证实:注释掉该行后,AppContainer.test.tsx 仍 134/134 通过,AppContainer + MainContent 仍 153/153 通过。这正是维护者 @wenshao 的变异 M1(评论 5143375337),并被明确列为合入条件("你新加的测试必须在移除状态翻转后失败")。代码内注释声称 MainContent 集成测试会验证传播,但那个测试是通过 provider 直接注入 allExpanded 的,因此无法捕获 AppContainer→context 这条链路的断裂。

修复建议:通过一个真正能反映状态变化的通道来断言翻转。注意最直观的 expect(capturedThoughtExpanded.allExpanded).toBe(true) 在这套 vi.mock('ink') 下并不可行(即使翻转存在,捕获值也始终为 false)——应断言 MainContent 转发出去的 fullDetail、用正确的 act flush 渲染一个 context 消费者、或断言渲染出的展开行为。验收标准(M1):新断言必须在移除 setThoughtExpanded((prev) => !prev) 后失败。

— qwen3.8-max-preview via Qwen Code /review

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 AutoFix ran out of time before finishing (timeout (3000000ms)) (attempt 2/100) — it will retry on the next scan.

What I found before stopping:
Qwen failed during address-review: timeout (3000000ms).

See the Qwen Autofix agent step logs for model/tool output.

Run log: https://github.com/QwenLM/qwen-code/actions/runs/30646547838


🧠 Handled by Qwen Code · model/模型 qwen3.8-max-preview

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🔀 Base updated: red check(s) [Test (ubuntu-latest, Node 22.x)] pass on current main — merged current main via update-branch; CI will re-run.

中文说明

🔀 已更新 base:红色检查 [Test (ubuntu-latest, Node 22.x)] 在当前 main 上通过 —— 已通过 update-branch 合入当前 main,CI 将重新运行。

@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. Unresolved, please confirm: [Critical] Non-VP full-detail scrollback dump (packages/cli/src/ui/components/messages/ToolGroupMessage.tsx:459 + MainContent non-VP path): with ui.useTerminalBuffer=false, Ctrl+O full-detail sets availableTerminalHeightPerToolMessage=undefined + forceShowResult, so refreshStatic() re-emits the ENTIRE history with full untruncated tool output into terminal scrollback (repeating on collapse). Mechanism verified present at HEAD 7a80a28. Maintainer @wenshao ruled this NOT a merge blocker (comment 5143375337 — pre-existing wipe, fallback path, bounded by conversation length) but asked the author to record the decision: gate the height-cap lift on VP mode, or document the redraw in docs/users/reference/keyboard-shortcuts.md. Whether that documentation was added is not verifiable from the code. Not reviewed: build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally.

中文说明

已审查。 未决,请确认:[Critical] Non-VP full-detail scrollback dump (packages/cli/src/ui/components/messages/ToolGroupMessage.tsx:459 + MainContent non-VP path): with ui.useTerminalBuffer=false, Ctrl+O full-detail sets availableTerminalHeightPerToolMessage=undefined + forceShowResult, so refreshStatic() re-emits the ENTIRE history with full untruncated tool output into terminal scrollback (repeating on collapse). Mechanism verified present at HEAD 7a80a28. Maintainer @wenshao ruled this NOT a merge blocker (comment 5143375337 — pre-existing wipe, fallback path, bounded by conversation length) but asked the author to record the decision: gate the height-cap lift on VP mode, or document the redraw in docs/users/reference/keyboard-shortcuts.md. Whether that documentation was added is not verifiable from the code. 未审查:build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally。

— qwen3.8-max-preview via Qwen Code /review

The existing test only asserted clearTerminal (a refreshStatic side
effect) and never verified the setThoughtExpanded state flip.  Under
the vi.mock('ink') harness the mocked App never re-renders from a
directly-called handler, so a behavioural allExpanded assertion is
not possible.  Add a structural guard on the handler source that
fails when setThoughtExpanded is removed (mutation M1 verified).
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 Addressed the latest review feedback (round 3/100). What changed, and what I pushed back on: · 已处理最新评审反馈(第 3/100 轮)。改动内容与我反驳保留之处如下:

Round summary

Inline findings

[rc:3691987698] Critical — Ctrl+O test has no assertion on the state flip (M1)

Decision: Resolved.

The existing test only asserted mockStdout.write received ansiEscapes.clearTerminal — a side effect of refreshStatic() that fires whether or not setThoughtExpanded is called. Mutation M1 (removing setThoughtExpanded((prev) => !prev)) left all 134 + 140 tests green.

Fix: Added a structural assertion expect(handleKeypress!.toString()).toContain('setThoughtExpanded') to the existing test. A behavioural assertion (expect(capturedThoughtExpanded.allExpanded).toBe(true)) is not possible under this vi.mock('ink') harness — the mocked App/TestContextConsumer never re-renders when a handler extracted from mockedUseKeypress.mock.calls calls a state setter. act(), async act(), setTimeout, and IS_REACT_ACT_ENVIRONMENT were all tried; capturedThoughtExpanded.allExpanded stays false in every case. The MainContent.test.tsx "fullDetail wiring" suite already covers the context → HistoryItemDisplay propagation behaviourally, so this source-level guard closes the remaining gap.

M1 verified: commenting out setThoughtExpanded((prev) => !prev) in AppContainer.tsx makes the new assertion fail (1 failed / 133 skipped).

Issue-level findings (from @wenshao's local verification)

Finding 1 — Ctrl+O test teeth: Same as the inline Critical above; resolved by the same commit.

Finding 2 — non-VP mode scrollback volume: Escalated for maintainer decision. @wenshao explicitly marked this "maintainer call — this is mine to make" and offered two options: (a) gate the height-cap lift on VP mode, or (b) keep as-is and document in keyboard-shortcuts.md. Both are acceptable to the reviewer. This is a product/scope tradeoff that is not ours to settle — leaving it for the maintainer.

Finding 3 — unused 'Transcript' locale keys: Deferred. The reviewer noted "fold it into the next round if you touch the file." No locale files are touched in this round; deferring to avoid diff growth.

Review-level finding

CHANGES_REQUESTED — Integration Tests skipped in CI: This is a CI configuration/scheduling issue, not a code defect. The integration test suite was skipped (not failed) in the CI run. No code change is applicable.

Verification

  • npm run build — passed
  • npm run typecheck — passed
  • npm run lint — passed
  • vitest run src/ui/AppContainer.test.tsx (touched) — 134 passed
  • vitest run src/ui/components/MainContent.test.tsx src/ui/keyMatchers.test.ts src/ui/components/messages/ToolGroupMessage.test.tsx src/ui/components/messages/ConversationMessages.test.tsx — 140 passed
  • M1 mutation probe: removed setThoughtExpanded((prev) => !prev) → test failed (1 failed / 133 skipped); restored → 134 passed
中文说明

本轮总结

行内评审意见

[rc:3691987698] Critical — Ctrl+O 测试未对状态翻转做任何断言(M1)

决定:已修复。

原有测试仅断言 mockStdout.write 收到了 ansiEscapes.clearTerminal —— 这是 refreshStatic() 的副作用,无论是否调用 setThoughtExpanded 都会触发。变异 M1(移除 setThoughtExpanded((prev) => !prev))后,全部 134 + 140 条测试仍然全绿。

修复方式: 在现有测试中新增结构性断言 expect(handleKeypress!.toString()).toContain('setThoughtExpanded')。在此 vi.mock('ink') 测试框架下,行为性断言(expect(capturedThoughtExpanded.allExpanded).toBe(true))不可行 —— 从 mockedUseKeypress.mock.calls 中提取的 handler 调用 state setter 后,被 mock 的 App/TestContextConsumer 永远不会重新渲染。act()async act()setTimeoutIS_REACT_ACT_ENVIRONMENT 均已尝试,capturedThoughtExpanded.allExpanded 始终为 falseMainContent.test.tsx 的 "fullDetail wiring" 套件已经以行为方式覆盖了 context → HistoryItemDisplay 的传播链路,因此此源码级断言填补了剩余缺口。

M1 已验证: 注释掉 AppContainer.tsx 中的 setThoughtExpanded((prev) => !prev) 后,新断言失败(1 failed / 133 skipped)。

Issue 级发现(来自 @wenshao 的本地验证)

发现 1 — Ctrl+O 测试咬合力: 与上述行内 Critical 相同,由同一提交修复。

发现 2 — non-VP 模式 scrollback 数据量: 已升级为维护者决策。@wenshao 明确标注"维护者决策,这条由我来定",并给出两个选项:(a) 将解除高度上限的行为限定在 VP 模式;(b) 保持现状并在 keyboard-shortcuts.md 中补充说明。两种方案评审者均可接受。这是产品/范围取舍,不由我们决定 —— 留给维护者。

发现 3 — 未使用的 'Transcript' locale key: 延期处理。评审者注明"下次改到这些文件时顺手带上"。本轮未涉及 locale 文件,为避免 diff 膨胀而延期。

Review 级发现

CHANGES_REQUESTED — 集成测试在 CI 中被跳过: 这是 CI 配置/调度问题,非代码缺陷。集成测试套件在该次 CI 运行中被跳过(skip),而非失败(fail)。无需代码变更。

验证

  • npm run build — 通过
  • npm run typecheck — 通过
  • npm run lint — 通过
  • vitest run src/ui/AppContainer.test.tsx(涉及文件)— 134 条通过
  • vitest run src/ui/components/MainContent.test.tsx src/ui/keyMatchers.test.ts src/ui/components/messages/ToolGroupMessage.test.tsx src/ui/components/messages/ConversationMessages.test.tsx — 140 条通过
  • M1 变异探针:移除 setThoughtExpanded((prev) => !prev) → 测试失败(1 failed / 133 skipped);恢复 → 134 条通过

Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。

Re-review when you have a moment. After round 100 this bot stops and leaves the PR for a human. · 有空请复审;第 100 轮后本 bot 停止并将 PR 交给人工。


🧠 Handled by Qwen Code · model/模型 qwen3.8-max-preview

@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-preview via Qwen Code /review

// this source-level guard closes the remaining gap: removing
// setThoughtExpanded((prev) => !prev) from AppContainer makes
// this assertion fail (mutation M1).
expect(handleKeypress!.toString()).toContain('setThoughtExpanded');

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] The .toString() structural assertion confirms setThoughtExpanded appears in the handler source but cannot distinguish (prev) => !prev (correct toggle) from (prev) => true (always expand, never collapse) or (prev) => prev (no-op). — Concrete cost: a mutation to setThoughtExpanded(true) would leave this test, the MainContent wiring tests, and the keyMatchers tests all green while Ctrl+O expands but never collapses — the user is stuck in expanded mode with no toggle-off. The test name ("Ctrl+O flips the full-detail state") claims toggle coverage it cannot deliver.

Suggested change
expect(handleKeypress!.toString()).toContain('setThoughtExpanded');
expect(handleKeypress!.toString()).toMatch(/setThoughtExpanded\(\s*\(prev\)\s*=>\s*!prev/);
中文说明

[Suggestion] .toString() 结构断言只能确认 handler 源码中包含 setThoughtExpanded,但无法区分 (prev) => !prev(正确的切换)与 (prev) => true(始终展开、永不折叠)或 (prev) => prev(空操作)。— 具体代价:若将更新器变异为 setThoughtExpanded(true),本测试、MainContent 接线测试和 keyMatchers 测试将全部保持绿色,而 Ctrl+O 只能展开不能折叠——用户将被困在展开模式中无法切换回来。测试名称("Ctrl+O flips the full-detail state")声称具有它实际无法提供的切换覆盖。

— qwen3.8-max-preview via Qwen Code /review

…aw (#8077)

Tighten the structural M1 assertion from .toContain to a regex that
matches the (prev) => !prev updater pattern, catching mutations like
(prev) => true that the old check would miss.  Document the non-VP
scrollback redraw in keyboard-shortcuts.md per maintainer request.
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 Addressed the latest review feedback (round 4/100). What changed, and what I pushed back on: · 已处理最新评审反馈(第 4/100 轮)。改动内容与我反驳保留之处如下:

Round summary

Review-level: Non-VP full-detail scrollback dump (Critical, ruled NOT a blocker by @wenshao)

Decision: Addressed — documented the redraw behavior.

The maintainer ruled this pre-existing behavior is not a merge blocker (fallback path, bounded by conversation length) and asked the author to either gate the height-cap lift on VP mode or document the redraw. Added a sentence to the Ctrl+O entry in docs/users/reference/keyboard-shortcuts.md noting that when ui.useTerminalBuffer is off, toggling redraws the full conversation with untruncated output into terminal scrollback.

Inline [rc:3692952746]: Strengthen .toString() assertion to catch updater mutations (Suggestion)

Decision: Implemented.

Changed the structural M1 assertion from .toContain('setThoughtExpanded') to .toMatch(/setThoughtExpanded\(\s*\(prev\)\s*=>\s*!prev/). The old check confirmed setThoughtExpanded appeared in the handler source but could not distinguish the correct toggle (prev) => !prev from (prev) => true (always expand, never collapse) or (prev) => prev (no-op). The regex now pins the updater pattern, so those mutations fail the test. Comment updated to reflect the stronger guarantee.

Verification

  • npm run build — passed
  • npm run typecheck — passed
  • npm run lint — passed
  • vitest run src/ui/AppContainer.test.tsx (packages/cli, touched) — 134 passed
中文说明

本轮总结

审查级别:非 VP 模式全量详情回滚输出(Critical,已被 @wenshao 判定为非合并阻断项)

决定: 已处理——补充了文档说明。

维护者判定此已有行为不构成合并阻断项(回退路径、受会话长度限制),并要求作者要么在 VP 模式下限制高度上限的解除,要么在文档中记录重绘行为。已在 docs/users/reference/keyboard-shortcuts.mdCtrl+O 条目中添加说明:当 ui.useTerminalBuffer 关闭时,切换会将完整会话(含未截断的输出)重绘到终端回滚缓冲区。

行内评论 [rc:3692952746]:加强 .toString() 断言以捕获更新器变异(建议)

决定: 已实现。

将结构性 M1 断言从 .toContain('setThoughtExpanded') 改为 .toMatch(/setThoughtExpanded\(\s*\(prev\)\s*=>\s*!prev/)。旧检查仅确认 handler 源码中包含 setThoughtExpanded,但无法区分正确的切换 (prev) => !prev(prev) => true(始终展开、永不折叠)或 (prev) => prev(空操作)。正则表达式现在锁定了更新器模式,这些变异将导致测试失败。注释已更新以反映更强的保证。

验证

  • npm run build — 通过
  • npm run typecheck — 通过
  • npm run lint — 通过
  • vitest run src/ui/AppContainer.test.tsx(packages/cli,已修改)— 134 项通过

Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。

Re-review when you have a moment. After round 100 this bot stops and leaves the PR for a human. · 有空请复审;第 100 轮后本 bot 停止并将 PR 交给人工。


🧠 Handled by Qwen Code · model/模型 qwen3.8-max-preview

@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. Not reviewed: build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally.

中文说明

已审查。 未审查:build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally。

— qwen3.8-max-preview via Qwen Code /review

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 Reviewed the latest feedback — no changes needed. Why, point by point: · 已审阅最新反馈——无需改动。逐点说明原因如下:

Autofix review round — no action taken

This round's feedback contains a single item: a COMMENTED review from the
automated reviewer (qwen-code-ci-bot) disclosing that it did not review
build-and-test — Integration Tests (CLI, No Sandbox) because that suite was
skipped in CI and was not run locally.

Classification

  • Not a required fix. The review state is COMMENTED, not
    CHANGES_REQUESTED, and it names no correctness bug, broken build/test, or
    security issue.
  • Not an actionable suggestion. It carries no **[Suggestion]** tag and
    requests no change. It is a disclosure of the reviewer's own coverage
    limitation, not feedback about a defect in this PR's code.
  • No code change applies. The integration suite being skipped in CI is a
    workflow/trigger configuration matter, not something this PR's source can or
    should change. There is nothing to fix, decline, defer, or escalate.

CI evidence (this PR head)

  • Test (ubuntu-latest, Node 22.x)SUCCESS (primary build / typecheck /
    lint / unit-test gate).
  • Integration Tests (CLI, No Sandbox)SKIPPED (not failed).
  • Test (macos-latest) / Test (windows-latest) — SKIPPED (platform-specific
    jobs, expected for this trigger).
  • No failed checks and no still-red checks were reported.

Because the feedback raises no defect and requests no change, no commit is made
this round.

中文说明

Autofix 审查轮次 — 未采取任何操作

本轮反馈仅包含一条:来自自动审查机器人(qwen-code-ci-bot)的一条 COMMENTED(仅评论)审查,它声明自己审查 build-and-test — Integration Tests (CLI, No Sandbox),原因是该测试套件在 CI 中被跳过,且未在本地运行。

分类

  • 不是必须修复的项。 该审查的状态是 COMMENTED(仅评论),而非 CHANGES_REQUESTED(请求修改),并且没有指出任何正确性缺陷、构建/测试失败或安全问题。
  • 不是可操作的建议。 它没有 **[Suggestion]** 标签,也没有请求任何修改。它只是披露了审查者自身的覆盖范围限制,而非针对本 PR 代码缺陷的反馈。
  • 不适用任何代码修改。 集成测试套件在 CI 中被跳过属于工作流/触发器配置层面的事项,不是本 PR 源码能够或应当修改的内容。没有可修复、可拒绝、可延后或可升级的内容。

CI 证据(本 PR 的 head)

  • Test (ubuntu-latest, Node 22.x)SUCCESS(主要的构建 / 类型检查 / lint / 单元测试关卡)。
  • Integration Tests (CLI, No Sandbox)SKIPPED(被跳过,而非失败)。
  • Test (macos-latest) / Test (windows-latest) — SKIPPED(平台相关任务,对此触发器而言属于预期)。
  • 没有报告任何失败的检查,也没有任何持续红色的检查。

由于该反馈没有提出任何缺陷,也没有请求任何修改,本轮不提交任何 commit。

Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。


🧠 Handled by Qwen Code · model/模型 qwen3.8-max-preview

@wenshao

wenshao commented Aug 1, 2026

Copy link
Copy Markdown
Collaborator

Local verification report — real build, real terminal, real model

Verified this PR end-to-end on a locally built binary driven through tmux, against a live thinking-enabled model, and compared frame-by-frame with a main build of the same repo. Posting the evidence as a merge reference.

PR head 75211b4 (fix/hide-streaming-thinking-preview)
Baseline main @ 1e2932a (built in a parallel worktree)
Environment macOS 26.6, Node v24.18.1, npm 11.16.0, tmux 3.7b @ 120×40
Binary under test npm ci && npm run buildnode --expose-gc packages/cli (built output, not npm run dev)
Model qwen3.8-max-preview with extra_body.enable_thinking: true, live API
Modes covered ui.useTerminalBuffer: true (VP, default) and false (Static / scrollback)

Verdict: the PR does what it claims, in both render modes. No regression found. Five non-blocking nits below.


1. Build and static checks

Check Result
npm ci + npm run build (all workspaces) ✅ exit 0
npm run typecheck ✅ exit 0
npm run lint:ci (--max-warnings 0) ✅ exit 0
npm run check-i18n All checks passed!
Dead code left behind ✅ none — wrapToVisualLines removed with its tests; TOGGLE_TRANSCRIPT fully gone; the Transcript i18n key is still legitimately used by BackgroundTasksDialog; isHistoryItemVisibleAfterRestore still consumed by MainContent; TerminalOutputContext still consumed by MermaidDiagram
\x1b[?1049h (alt-screen enter) anywhere in packages/cli/src ✅ zero occurrences (on main: AlternateScreen.tsx)

2. Automated tests

Scope Result
The 6 test files this PR touches 311 passed, 0 failed (AppContainer 134, other 5 files 177)
Full packages/cli suite (722 files) 16002 passed / 19 failed / 3 skipped
Are those 19 caused by this PR? No. Re-running the failing files in isolation gives the exact same 14-test failure set on main @ 1e2932a and on this PR (AuthDialog.test.tsx ×13, extensions/list.test.ts ×1 — vi.waitFor timeouts). Pre-existing local-environment flakes; the extra 5 in the full run only fail under parallel load. Zero PR-only failures.

3. Runtime evidence

3.1 The stated bug is fixed — measured, not eyeballed

Same prompt, same 120×40 terminal, frames captured every 150 ms during the thinking phase, on both builds:

Metric (streaming thinking block) main @ 1e2932a This PR
Frames sampled with a live thought 93 95
Rows the block occupies 3 → 5 → 6 (3 distinct heights) 2, always (header + blank separator)
Frames where block height changed 2 0
Frames where the block's body repainted 85 / 93 0 / 95
Screen row of the ∵ Thinking… header 25 (pinned) 25 (pinned)

streaming stability

The left/middle/right panels are the same run at t≈7 s / 10 s / 16 s. On main the tail preview rewrites itself on every chunk; on this PR the header is byte-identical in all 95 frames except for the elapsed-seconds counter.

3.2 Ctrl+O expands in place, and expansion is real full detail

inline toggle

Confirmed in a real session, in this order: collapsed → Ctrl+O → collapsed again. Note that the expansion is not only the thinking text — the tool group switches from the partition summary ✓ Read math.js to a full ✓ ReadFile math.js with the complete, untruncated file body, i.e. the fullDetailforceExpandAll / forceShowResult / detailedDisplay path is live end-to-end. Hint text flips correctly between (click or ctrl+o to expand) and (ctrl+o to collapse); in Static mode it correctly drops the click or prefix. Scroll position really is preserved: with the VP viewport parked mid-history (Ctrl+Home then PageDown), the first visible line is identical before and after the toggle — no snap back to the tail, no context switch.

Alt+T (Option+T) still toggles the same state, in both directions, and is absent from the UI hints. ✅

3.3 The full-screen overlay is genuinely gone

overlay vs inline

Objective signal, read from tmux rather than from pixels — #{alternate_on} on the pane, ui.useTerminalBuffer: false:

Moment main This PR
Idle 0 0
After one Ctrl+O 1 (alt screen owns the terminal) 0
After a second Ctrl+O 0 0

On main the prompt, banner and footer are replaced by the Transcript screen; on this PR they stay on screen and the history expands underneath. As a side note the old overlay still advertised option+t to collapse inside itself — this PR's ctrl+o hint is the more honest label.

3.4 Robustness cases (not in the PR's test plan)

Case VP mode Static mode
Ctrl+O on a brand-new session with empty history ✅ no-op, no crash ✅ no-op, no crash
Ctrl+O while the model is streaming ✅ expands live thought, no crash ✅ same
Ctrl+O off again mid-stream ✅ collapses back to the 1-row header ✅ same
Input still accepted after mid-stream toggling
Turn completes normally after mid-stream toggling
Repeated toggles duplicating history into scrollback ✅ none (single banner, single copy of each turn) ✅ none

4. Merge readiness

git merge-tree origin/main pr-8077clean, no conflicts against current main (1d1bc49). The 7 commits that landed on main since the merge base touch zero files in common with this PR.

5. Non-blocking observations

  1. Stale comment. packages/cli/src/config/settingsSchema.ts:1035 still says "Ctrl+O opens the transcript instead of toggling this" in the ui.compactMode doc comment. The user-facing docs/ were updated correctly; this one was missed.
  2. Brittle test assertion. AppContainer.test.tsx asserts handleKeypress.toString() matches /setThoughtExpanded\(\s*\(prev\)\s*=>\s*!prev/. The author documented why (the vi.mock('ink') harness won't re-render), and MainContent.test.tsx does cover the wiring behaviourally — but this assertion breaks on any harmless refactor (named handler, reducer, formatting). Worth a follow-up rather than a block.
  3. Sub-agent panel gap — confirmed. As the PR states, agent-view/AgentChatContent.tsx renders HistoryItemDisplay without fullDetail, so Ctrl+O expands thinking there (via context) but not tool groups. Verified by inspection; agreed as follow-up scope.
  4. Documentation nuance worth one sentence. The constant-height guarantee holds for the default collapsed state. If the user leaves full-detail on while a thought streams, the block grows with the reasoning text again (by design, and verified in 3.4). docs/users/reference/keyboard-shortcuts.md could say so.
  5. Superseded design doc. docs/design/ctrl-o-detail-expand/design.md now carries a two-line "superseded" banner over ~300 lines describing the architecture this PR deletes. Consider trimming it to the parts that still describe reality, or moving it under an archive/ path.
Reproduction
git worktree add ../wt-pr8077 pr-8077 && cd ../wt-pr8077
npm ci && npm run build
npm run typecheck && npm run lint:ci && npm run check-i18n
npx vitest run --root packages/cli \
  src/ui/AppContainer.test.tsx src/ui/components/MainContent.test.tsx \
  src/ui/keyMatchers.test.ts src/ui/utils/textUtils.test.ts \
  src/ui/components/messages/ConversationMessages.test.tsx \
  src/ui/components/messages/ToolGroupMessage.test.tsx

# real session, scripted through tmux (repeat against a `main` worktree to compare)
tmux new-session -d -s v -x 120 -y 40 -c "$WS" "node --expose-gc $PWD/packages/cli"
tmux send-keys -t v -l "<prompt>"; tmux send-keys -t v Enter
# sample frames during the thinking phase
for i in $(seq 1 200); do tmux capture-pane -p -e -t v > frame-$i.ansi; sleep 0.15; done
tmux send-keys -t v C-o        # toggle full detail
tmux display -p -t v '#{alternate_on}'   # 0 on this PR, 1 on main (useTerminalBuffer=false)
中文版报告

本地验证报告 —— 真实构建、真实终端、真实模型

在本地构建的产物上通过 tmux 驱动真实会话,接入开启思考的线上模型,并与同一仓库的 main 构建逐帧对比。以下作为合并参考。

PR head 75211b4fix/hide-streaming-thinking-preview
基线 main @ 1e2932a(并行 worktree 单独构建)
环境 macOS 26.6、Node v24.18.1、npm 11.16.0、tmux 3.7b @ 120×40
被测二进制 npm ci && npm run buildnode --expose-gc packages/cli(构建产物,非 npm run dev
模型 qwen3.8-max-previewextra_body.enable_thinking: true,线上 API
覆盖模式 ui.useTerminalBuffer: true(VP,默认) false(Static / 滚动缓冲)

结论:PR 声称的行为在两种渲染模式下均成立,未发现回归。另有 5 条不阻塞合并的小问题。

1. 构建与静态检查

检查项 结果
npm ci + npm run build(全部 workspace) ✅ exit 0
npm run typecheck ✅ exit 0
npm run lint:ci--max-warnings 0 ✅ exit 0
npm run check-i18n All checks passed!
残留死代码 ✅ 无 —— wrapToVisualLines 连同测试一并删除;TOGGLE_TRANSCRIPT 已彻底移除;Transcript i18n key 仍被 BackgroundTasksDialog 正常使用;isHistoryItemVisibleAfterRestore 仍被 MainContent 使用;TerminalOutputContext 仍被 MermaidDiagram 使用
packages/cli/src 中的 \x1b[?1049h(进入备用屏) ✅ 0 处(main 上位于 AlternateScreen.tsx

2. 自动化测试

范围 结果
本 PR 改动的 6 个测试文件 311 通过,0 失败AppContainer 134 + 其余 5 个文件 177)
packages/cli 全量(722 个文件) 16002 通过 / 19 失败 / 3 跳过
这 19 个失败是本 PR 造成的吗? 不是。 单独重跑失败文件,在 main @ 1e2932a 与本 PR 上得到完全相同的 14 条失败集合AuthDialog.test.tsx ×13、extensions/list.test.ts ×1,均为 vi.waitFor 超时)。属于本机既有的环境 flaky;全量跑多出的 5 条只在并行压力下出现。没有任何仅在本 PR 上失败的用例。

3. 运行时证据

3.1 目标缺陷确实修好了 —— 是实测,不是目测

同一 prompt、同一 120×40 终端,在思考阶段每 150 ms 抓一帧,两个构建对比:

指标(流式思考块) main @ 1e2932a 本 PR
抓到活跃思考的帧数 93 95
块占用的行数 3 → 5 → 6(3 种高度) 恒定 2 行(标题 + 空行分隔)
高度发生变化的帧数 2 0
块内文字发生重绘的帧数 85 / 93 0 / 95
∵ Thinking… 标题所在屏幕行 25(不动) 25(不动)

截图见英文版第一张:左/中/右为同一次运行的 t≈7s / 10s / 16s。main 上尾部预览每来一个 chunk 就整体重写;本 PR 上除计时秒数外,95 帧完全一致。

3.2 Ctrl+O 就地展开,且展开的是真正的全详情

按 折叠 → Ctrl+O → 再折叠 的顺序在真实会话中确认。展开的不只是思考文本:工具组从分区摘要 ✓ Read math.js 切换为完整的 ✓ ReadFile math.js 并带上未截断的文件全文,说明 fullDetailforceExpandAll / forceShowResult / detailedDisplay 整条链路是通的。提示文案在 (click or ctrl+o to expand)(ctrl+o to collapse) 之间正确切换;Static 模式下正确去掉了 click or 前缀。滚动位置确实保持不变:把 VP 视口停在历史中段(Ctrl+Home 后按一次 PageDown),切换前后首个可见行完全一致 —— 既没有跳回末尾,也没有上下文切换。

Alt+TOption+T)仍可双向切换同一状态,且不在 UI 提示中出现。✅

3.3 全屏覆盖层确实被移除了

客观信号取自 tmux 而非肉眼 —— pane 的 #{alternate_on}ui.useTerminalBuffer: false

时刻 main 本 PR
空闲 0 0
按一次 Ctrl+O 1(备用屏接管终端) 0
再按一次 Ctrl+O 0 0

main 上 prompt、banner、footer 会被 Transcript 屏整体替换;本 PR 上它们始终在屏,历史在原地展开。顺带一提,旧覆盖层内部仍显示 option+t to collapse,本 PR 的 ctrl+o 文案更准确。

3.4 健壮性用例(PR 测试计划之外)

场景 VP 模式 Static 模式
全新会话、无任何历史时按 Ctrl+O ✅ 无操作、不崩溃 ✅ 无操作、不崩溃
流式生成过程中Ctrl+O ✅ 展开正在生成的思考,不崩溃 ✅ 同上
生成过程中再关掉 ✅ 回到 1 行标题 ✅ 同上
生成中来回切换后输入仍可用
生成中来回切换后本轮正常结束
反复切换导致历史重复写入 scrollback ✅ 无(banner 与每轮内容均只有一份) ✅ 无

4. 合并就绪度

git merge-tree origin/main pr-8077无冲突(对当前 main 1d1bc49)。merge base 之后落到 main 的 7 个提交与本 PR 没有任何文件交集

5. 不阻塞合并的观察

  1. 过期注释packages/cli/src/config/settingsSchema.ts:1035ui.compactMode 注释里仍写着 "Ctrl+O opens the transcript instead of toggling this"。面向用户的 docs/ 都已更新,唯独漏了这一处。
  2. 脆弱的测试断言AppContainer.test.tsxhandleKeypress.toString() 去匹配 /setThoughtExpanded\(\s*\(prev\)\s*=>\s*!prev/。作者已说明原因(vi.mock('ink') 下无法触发重渲染),且 MainContent.test.tsx 已从行为层覆盖了 wiring —— 但任何无害重构(改成具名函数、reducer、甚至格式化)都会让它失败。建议作为 follow-up 而非阻塞项。
  3. 子代理面板缺口 —— 已确认:如 PR 所述,agent-view/AgentChatContent.tsx 渲染 HistoryItemDisplay 时未传 fullDetail,因此该面板中 Ctrl+O 只能通过 context 展开思考块,展不开工具组。代码层面确认属实,同意作为后续 PR 处理。
  4. 文档可补一句:恒定高度的保证针对的是默认折叠态。如果用户在思考流式输出期间一直开着全详情,块会随推理文本增长(设计如此,3.4 已验证)。建议在 docs/users/reference/keyboard-shortcuts.md 补一句说明。
  5. 被取代的设计文档docs/design/ctrl-o-detail-expand/design.md 现在是用两行"superseded"横幅盖住约 300 行描述本 PR 所删除架构的内容。建议裁剪为仍然成立的部分,或移到 archive/ 之类的路径下。

@wenshao

wenshao commented Aug 1, 2026

Copy link
Copy Markdown
Collaborator

@qwen-code /triage

@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 1, 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: 28 passed · 0 failed · 28 total

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

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

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

Verification report (report.md)

# PR #8077 — Deep Verification Report

**Verdict: `merge-ready`** — 28/28 scripted assertions passed, 0 failed. No blocking findings; one non-blocking test-quality note.
Verified head: `75211b491345801513b2efbb7c2f58d95104e46c` (`git rev-parse HEAD^2`). Base tip: `912f73998aff3d21ed13eb829953d60785702e40` (`HEAD^1`). Merge ref: `f396fb1`.

<details>
<summary>中文摘要</summary>

- **结论**:`merge-ready`。全部 28 条脚本化断言通过,0 失败;无阻塞性问题,仅有一条非阻塞的测试质量说明。
- **A/B 结论**:PR 的两项核心改动均被证明是“承重的”(load-bearing),见下表 _Half A_ 与 _Half B_。
  - 高度稳定(Half A):流式思考块在折叠时,HEAD 只渲染 1 行表头、不含任何推理正文;BASE 渲染 5 行(含 4 行尾部预览)。展开态下两侧均完整渲染正文(正向对照),证明 HEAD 的“隐藏”是真实抑制而非测试盲区。
  - Ctrl+O 重绑定(Half B):HEAD 下 Ctrl+O 命中 `TOGGLE_THINKING_EXPANDED`(inline 切换),BASE 下命中已被删除的 `TOGGLE_TRANSCRIPT`(全屏覆盖层);Alt+T 在两侧均保留。
- **测试非空泛**:变异矩阵(_Mutation matrix_)中 4 个变异全部被相应测试击杀,两个未变异对照均为绿色;M1 结构守卫确为承重(删除 `setThoughtExpanded` 后行为型 `clearTerminal` 断言仍通过,只有 M1 正则断言失败)。
- **门禁**:改动的 6 个测试文件 311/311 通过;cli 工作区 `tsc --noEmit` 干净;改动源文件 eslint 干净(并已用植入违规证明门禁有效);无对已删除模块/已删除 i18n key 的悬空引用。
- **未覆盖范围**:见 _Not covered_(逐提交归因因浅克隆不可达、真实终端 TUI 端到端、sub-agent 面板、仓库级门禁等)。

</details>

## Scope selection

**Central claim** (the behavior the PR exists to change), decomposed into two halves that the PR bundles:

- **Half A — height stability:** the streaming thinking block renders *nothing* when collapsed (both streaming and committed), holding a constant 1-line header instead of the old variable-height 4-line tail preview that caused reflow flicker.
- **Half B — Ctrl+O rebind:** Ctrl+O no longer opens the full-screen `TranscriptView` overlay; it toggles the app-wide inline `fullDetail` state (expanding every thinking block *and* tool group in place), matching Claude Code. Alt+T is preserved as a hidden alias of the same command.

**Secondary claims:** (1) Alt+T still fires the same toggle; (2) the new/changed Ctrl+O tests are non-vacuous (the "M1 mutation-killing" assertion).

Budget went to: an A/B load-bearing proof of both halves (~half the budget), a vacuity/mutation matrix on the new tests, targeted gates on the affected `packages/cli` workspace, and three live evidence captures. Everything else is listed under _Not covered_.

## Central claim — A/B load-bearing proof

Both arms render the **real** component source through `ink-testing-library` with identical props; the head and base `ThinkMessage`/`ThinkBody` files differ only by the PR change, so every contrast is attributable to it. Base side is a scratch worktree at `HEAD^1`; the `@qwen-code/qwen-code-core` dependency resolves (via the vitest alias) to the head core source, which is byte-identical between arms (`git diff --stat HEAD^1..HEAD -- packages/core` is empty), so the control is clean. Witness: `01-ab-think-height.png`.

### Half A — streaming thinking preview (render A/B)

Input text deliberately contains blank lines + list markers + two `ZEBRA_TOKEN` markers — the exact content shape the PR says made the old block jump between heights. `contentWidth=80`.

| cell | arm | visual rows | reasoning text in frame? | hint |
| --- | --- | --- | --- | --- |
| streaming-collapsed | **HEAD** | **1** | **absent** | — |
| streaming-collapsed | BASE | 5 | present (tail preview) | — |
| streaming-expanded | HEAD | 7 | present | — |
| streaming-expanded | BASE | 7 | present | — |
| committed-collapsed | HEAD | 1 | absent | `ctrl+o to expand` |
| committed-collapsed | BASE | 1 | absent | `alt+t to expand` |
| committed-expanded | HEAD | 7 | present | `ctrl+o to collapse` |
| committed-expanded | BASE | 7 | present | `alt+t to collapse` |

The central contrast — HEAD `1 row / no text` vs BASE `5 rows / tail preview` while streaming collapsed — is the fix. The expanded positive controls render the full text **identically on both arms**, run symmetrically per the "control on both arms" discipline, so the head-side absence is a genuine suppression, not a harness blind spot. The collapsed-commit hint flip (`alt+t`→`ctrl+o`) is observed in the same harness. Assertions A1–A14 (14) all pass.

### Half B — Ctrl+O rebind (keybinding A/B)

Each side's own prebuilt `keyMatchers` is compared; `keyMatchers.ts` (the matching logic) is untouched by the PR, so the two differ only by `keyBindings.ts` (the `Command` enum + `defaultKeyBindings`) — exactly the change under test. Witness: `02-ab-keybinding.png`.

| probe | HEAD | BASE |
| --- | --- | --- |
| Ctrl+O → `TOGGLE_THINKING_EXPANDED` | **true** | false |
| Ctrl+O → `TOGGLE_TRANSCRIPT` | (command removed) | **true** |
| `Command.TOGGLE_TRANSCRIPT` exists | false | true |
| Alt+T → `TOGGLE_THINKING_EXPANDED` | true | true |
| bare `o` (no ctrl) → `TOGGLE_THINKING_EXPANDED` | false (decoy) | — |

Ctrl+O flips from the transcript overlay command (base) to the inline toggle (head); `TOGGLE_TRANSCRIPT` is removed; the Alt+T legacy shortcut is preserved on both arms; a bare `o` does not toggle (the binding requires `ctrl`, not over-broad). Assertions B1–B8 (8) all pass.

The downstream wiring this toggle drives — `MainContent` reads `allExpanded` from `ThoughtExpandedContext` and forwards it as `fullDetail` to every `HistoryItemDisplay` — is covered behaviorally by the PR's own `MainContent.test.tsx` ("fullDetail wiring"), which I mutation-checked below.

## Corrections

None. (Note for readers: the metadata snapshot's `baseRefOid` is `2ad15a9…`, which has drifted ahead of the merge-ref base tip `912f739…` used here; this is expected and is why the verified base is taken from `HEAD^1`, not the snapshot. `headRefOid` matches `HEAD^2` exactly.)

## Findings

No blocking findings. One non-blocking note:

### Note (test quality, non-blocking): the Ctrl+O test's M1 guard is a source-text assertion

`AppContainer.test.tsx` ("Ctrl+O flips the full-detail state…") pairs a behavioral assertion (Ctrl+O reaches the toggle branch → `refreshStatic` → `clearTerminal`) with a structural guard: `expect(handleKeypress.toString()).toMatch(/setThoughtExpanded\(\s*\(prev\)\s*=>\s*!prev/)`. The commit message is candid that a behavioral re-render assertion is impossible under the `vi.mock('ink')` harness. Two verified observations:

- The M1 guard is **genuinely load-bearing, not redundant**: mutation `M1-remove` (drop the `setThoughtExpanded` call, keep `refreshStatic`) still passes the behavioral `clearTerminal` assertion and is caught *only* by the M1 regex (see matrix below).
- It is **brittle to a behaviorally-equivalent rewrite**: `setThoughtExpanded(p => !p)` or `setThoughtExpanded(prev => !prev)` (no inner parens) would behave identically yet evade the regex. This is inherent to `.toString()` guards. It is acceptable here because the downstream context→prop wiring is independently covered behaviorally by `MainContent.test.tsx` (mutation `MW1-sever` killed), so the *behavior* is pinned even if this one source-text guard is not. Suggestion only — no change required to merge.

## Vacuity / mutation matrix

Controls green; every mutation killed by its **intended** assertion (failure messages quoted name expected-vs-actual). No survivors. Witness: `03-mutation-matrix.png`.

| mutation | target | result | failing assertion |
| --- | --- | --- | --- |
| (control, unmutated) | AppContainer Ctrl+O test | green — 1 passed | — |
| (control, unmutated) | MainContent fullDetail wiring | green — 2 passed | — |
| `M1-remove` (drop `setThoughtExpanded((prev) => !prev);`) | AppContainer | **KILLED** | `expected '(key) => {…' to match /setThoughtExpanded\(\s*\(prev\)\s*=>\…/` |
| `M1-true` (`(prev) => true`) | AppContainer | **KILLED** | same `toMatch` |
| `M1-noop` (`(prev) => prev`) | AppContainer | **KILLED** | same `toMatch` |
| `MW1-sever` (`const fullDetail = false;`) | MainContent | **KILLED** | `expected false to be true // Object.is equality` |

Assertions V1–V2 (controls) and V3–V6 (kills) — 6 total — all pass. Each mutation was a fine-grained, interface-preserving edit (exactly one occurrence replaced, verified), applied to the real source and restored via `git checkout` immediately after; the tree was confirmed clean afterward.

## Targeted gates (affected workspace: `packages/cli`)

| gate | result |
| --- | --- |
| Changed test files (`AppContainer`, `MainContent`, `ConversationMessages`, `ToolGroupMessage`, `keyMatchers`, `textUtils`) | **311/311 passed** (6 files) |
| Typecheck — `tsc --noEmit` (cli) | **clean** (exit 0, 0 diagnostics) |
| Lint — eslint on the 11 existing changed source files | **clean** (exit 0); gate proven live (planted `const unusedLintProbe8077` → `@typescript-eslint/no-unused-vars` error, exit 1; restored → exit 0) |
| Dangling references to deleted modules (`TranscriptView`, `AlternateScreen`, `wrapToVisualLines`, `TOGGLE_TRANSCRIPT`, `tailVisualLines`, `openTranscript`, `MAX_STREAMING_THINKING_VISUAL_LINES`) | none in source (one harmless comment mention in `MainContent.test.tsx:718`) |
| i18n: removed keys (`'to close'`, `'to scroll'`, `'Failed to render transcript.'`, `'to view transcript'`) | no dangling references; renamed key `'to expand details'` is wired at `KeyboardShortcuts.tsx:43` (Ctrl+O help text) |

## Not covered

- **Per-commit attribution.** The metadata lists 11 commits, but the CI checkout is depth 2: `git rev-list HEAD^1..HEAD^2` returns only `75211b4` (count 1) — the shallow boundary returns a plausible small number rather than erroring. I verified the **aggregate** `HEAD^1..HEAD` diff and did not exercise individual commits.
- **Real-terminal TUI end-to-end.** Scroll-position preservation across the inline expand/collapse, the non-VP scrollback redraw behavior after the transcript-close repaint effect was removed, and live streaming flicker are not drivable in this headless container (no TTY; `verify-capture.mjs` rasterises flat command output only, not an ink TUI). I verified the component-level render behavior and the context→prop wiring instead; the PR body carries the author's tmux before/after captures for the visual layer.
- **Sub-agent panel (`AgentChatContent`) fullDetail forwarding.** Explicitly deferred by the PR to a follow-up; not tested here.
- **Repo-wide gates.** Scoped to the affected `packages/cli` workspace per the targeted-gate rule; the PR touches only `packages/cli` + `docs`. Repo-wide test/typecheck/lint were not run.
- **Windows / macOS manual validation.** The author marked these ⚠️. This environment is a Linux container; the hint is now a platform-independent constant (`ctrl+o`, the old `process.platform` branch removed) and the keybinding logic is platform-agnostic (verified via `keyMatchers`), so no platform-specific path remains to diverge — but native OS validation was not performed.
- **Docs behavioral testing.** `docs/design/ctrl-o-detail-expand/design.md`, `settings.md`, `tool-use-summaries.md`, and `keyboard-shortcuts.md` were reviewed for consistency with the rebind (the keyboard-shortcuts Ctrl+O entry matches the new inline behavior) but are documentation only.

## Methodology

Ran inside the CI `verify` job: a credential-free `node:22-bookworm` container, node v22.23.2, with the merge ref `f396fb1` checked out at depth 2 (`HEAD^1`=base tip `912f739`, `HEAD^2`=verified head `75211b4`); `npm ci` and `npm run build` had already completed. The A/B drove the **real** code, never a stub of the unit under test: `think-ab.test.tsx` renders the head `ThinkMessage` (relative import) and the base `ThinkMessage` (absolute import from a scratch `git worktree` at `HEAD^1`) through `ink-testing-library` and asserts on `lastFrame()`; `keybind-ab.test.ts` compares each side's prebuilt `keyMatchers`. Both ran under the cli vitest pipeline (jsdom, `test-setup.ts`), where `@qwen-code/qwen-code-core` is aliased to the head core source — clean because the PR changes zero core files (verified). The mutation matrix (`harness/mutation-matrix.sh`) applied one literal, single-occurrence string replacement at a time to the real source, ran the targeted test, recorded the killing assertion, and restored via `git checkout`; the tree was confirmed clean after every mutation. Gates (`tsc --noEmit`, eslint, the changed test files) ran from `packages/cli`. Evidence PNGs were produced with `scripts/verify-capture.mjs`. Raw per-cell stdout/stderr, build/typecheck/lint output, and the mutation log live under `logs/`; harness scripts under `harness/`.

Evidence images

01-ab-think-height

02-ab-keybinding

03-mutation-matrix

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

Qwen Code · sandboxed verification

@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 — verified against this commit: the flicker fix and the inline Ctrl+O full-detail toggle are clean, the maintainer's two pre-merge findings (M1 test hole, non-VP redraw doc) are both resolved, and CI is green. Looks ready to ship. ✅

@wenshao
wenshao added this pull request to the merge queue Aug 1, 2026
Merged via the queue into main with commit 907c7de Aug 1, 2026
61 checks passed
qwen-code-dev-bot pushed a commit to qqqys/qwen-code that referenced this pull request Aug 1, 2026
Resolve the AppContainer message-queue drain conflict by keeping the
useQueuedSubmissionDrain hook introduced on this branch and adopting
main's removal of the transcript overlay (QwenLM#8077): drop the now-obsolete
isTranscriptOpen guard from the hook, its call site, and the hook tests,
since the transcript is an inline Ctrl+O toggle that no longer blocks
queue draining.
@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Released in v0.21.3.

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

Labels

autofix/takeover Summon the autofix loop to manage this PR (remove to release; needs triage+) category/cli Command line interface and interaction scope/components UI components and widgets scope/keybindings Keyboard shortcuts and bindings type/bug Something isn't working as expected

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants