Skip to content

feat(cli): dense inline panel + keyboard navigation for parallel agent fan-out#4477

Merged
wenshao merged 9 commits into
mainfrom
feat/inline-parallel-agents-display
May 26, 2026
Merged

feat(cli): dense inline panel + keyboard navigation for parallel agent fan-out#4477
wenshao merged 9 commits into
mainfrom
feat/inline-parallel-agents-display

Conversation

@wenshao

@wenshao wenshao commented May 24, 2026

Copy link
Copy Markdown
Collaborator

Why

Commands like /review fan out into 9 parallel agents, each running for minutes. The old display had two problems:

  • Compact mode: collapsed them into a single Agent × 9 / <last name> line — almost zero information for a multi-minute run.
  • Non-compact mode: expanded each agent into a full ToolMessage with very low information density — many lines per agent with mostly redundant chrome.

Additionally, there was no keyboard path from the input box to the running agents — users had to know about the hidden footer pill to access the background tasks dialog.

What changes

1. Dense inline panel (InlineParallelAgentsDisplay)

For tool groups composed entirely of ≥2 parallel agent invocations, render a dense panel with one row per agent showing status / name / activity / elapsed / tokens:

╭─ Parallel agents · 9 · 3/9 done ──────────────────────────────╮
│ ✔ Agent 1: Correctness                      12s · 8.1k tok    │
│ ✔ Agent 2: Security                          8s · 3.4k tok    │
│ ○ Agent 3: Code Quality ReadFile index.ts   3m 38s · 9.0k tok │
│ ○ Agent 4: Performance  Shell grep ...      3m 38s · 1.2k tok │
│ ✔ Agent 5: Test Coverage                     5s · 605 tok     │
│ ...                                                            │
╰────────────────────────────────────────────────────────────────╯

Display strategy:

  • Both phases (live + committed): the dense panel renders in the pending area with all agents. Running agents show with live activity from the registry on a 1s tick; completed agents show with fallback data from executionSummary.
  • LiveAgentPanel (below input): continues to show running agents during the live phase (brief visual overlap that resolves as agents complete and expire from the panel).
  • Committed phase: the dense panel commits to <Static> as the permanent scrollback record.

2. LiveAgentPanel keyboard navigation

> _                                          ← input box
▸ main  Active agents (6)                    ← ↓ selects "main"
  ○ Agent 3: Code Quality (Read) ▶ 3m       ← ↓ again selects agent
  ○ Agent 4: Performance (Shell) ▶ 3m
  ○ Agent 6: Attacker (Read)     ▶ 3m
  ...
  ↑↓ navigate · Enter detail · Esc back
  • ↓ from input box: focuses LiveAgentPanel, selects "main"
  • ↓/↑: navigates between "main" and agent rows with selection indicator
  • Enter on agent: opens BackgroundTasksDialog directly in detail mode (full agent view)
  • ← from detail: returns to LiveAgentPanel selection (not the dialog list)
  • Esc / ↑ at top: returns focus to input box
  • Printable chars: auto-unfocus, character types into input

When this kicks in

  • The dense panel requires ≥2 agent calls with no non-agent tools in the group.
  • No agent is waiting on a tool-approval prompt.
  • Solo agents, single-tool groups, and mixed groups are untouched.
  • Keyboard navigation works for all background agents, not just parallel groups.

Other changes

  • LiveAgentPanel.DEFAULT_MAX_ROWS increased from 5 → 12.
  • Header simplified from Active agents (N/N) to Active agents (N).
  • Added totalAgentCount prop to InlineParallelAgentsDisplay for correct header when rendering a subset.
  • Added livePanelFocused, livePanelSelectedIndex, enterDetailFromPanel to BackgroundTaskViewContext.
  • detail-from-panel dialog mode so ← returns to panel instead of list.

Test plan

  • Unit tests covering rendering, terminal-summary fallback, and non-agent filtering.
  • LiveAgentPanel header format tests updated.
  • All prior tests on touched files pass.
  • npx tsc --noEmit clean.

中文说明

为什么

/review 等命令会并行启动 9 个 agent,每个运行数分钟。旧的显示有两个问题:

  • Compact 模式:折叠成一行 Agent × 9 / <last name>,几乎没有信息。
  • 非 Compact 模式:每个 agent 展开为完整的 ToolMessage,显示密度很低。

此外,从输入框到运行中的 agent 没有键盘导航路径。

改了什么

1. 密集内联面板(InlineParallelAgentsDisplay

纯并行 agent 组(≥2 个),每个 agent 一行,显示状态/名称/活动/耗时/token。Live + Committed 两阶段都渲染。LiveAgentPanel 在下方同时显示运行中的 agent(短暂重复,完成后自动淘汰)。

2. LiveAgentPanel 键盘导航

  • 输入框 ↓:焦点跳到 LiveAgentPanel,选中 main
  • ↓↑:在 main 和 agent 行间导航,选中行显示
  • Enter:直接打开 agent 详情(detail 模式)
  • ←:从详情回到 LiveAgentPanel 选中状态(不经过 list)
  • Esc / ↑ 到顶:回输入框
  • 打字字符:自动取消焦点,字符输入到输入框

触发条件

  • 密集面板:≥2 agent 且无其他 tool
  • 键盘导航:所有 background agent 场景通用

其他改动

  • DEFAULT_MAX_ROWS 5 → 12
  • Header 简化为 Active agents (N)
  • 新增 detail-from-panel dialog 模式,← 回到 panel 而非 list

效果截屏

image image

When a tool group is composed entirely of multiple `task_execution`
agent invocations (the shape produced by `/review`'s 9-agent fan-out),
`CompactToolGroupDisplay` collapses the whole group into one line —
`Agent × 9 / <last agent's name>` — even though the agents may run
for minutes each. Status, current activity, elapsed, and tokens are
all hidden, so the most informative span of a multi-agent run is
also the most opaque.

Route those groups to a new `InlineParallelAgentsDisplay` that
surfaces every agent on its own row:

  ╭─ Parallel agents · 9 · 3/9 done ───────────────────────╮
  │ ○ Agent 1: Correctness  ReadFile server.ts  3m 38s · 7.0k tok
  │ ✔ Agent 2: Security                          12s · 8.1k tok
  │ ○ Agent 3: Code Quality ReadFile index.ts   3m 38s · 9.0k tok
  │ ...
  ╰────────────────────────────────────────────────────────╯

Each row pulls activity / elapsed live from `BackgroundTaskRegistry`
on a 1s tick (same pattern LiveAgentPanel uses). When the registry
unregisters a finished foreground subagent, the row falls back to
`AgentResultDisplay.executionSummary` for elapsed + tokens so the
column doesn't blank out the moment an agent completes.

A new `InlineAgentClaimContext` lets the inline display claim the
agentIds it's rendering; `LiveAgentPanel` filters those out so the
same agent never appears in both surfaces. Claims are refcounted so
React's commit/cleanup interleave doesn't transiently drop a claim
while the same id is being re-claimed by a remount.

Routing conditions in `ToolGroupMessage`:
  - Live phase only (`isPending`). Once the group commits to
    `<Static>`, the expanded path with `SubagentScrollbackSummary`
    owns the permanent record.
  - Group has ≥2 calls and ONLY agent calls — mixed groups keep
    the legacy renderer so sibling tools stay visible.
  - No pending confirmation — those go through the normal renderer
    so the keyboard-focus surface for approval stays intact.

Verified visually in tmux with `/review <pr-url> --comment` against
qwen-code PR 4472: all 9 agents render with live status / activity /
elapsed / tokens, transition glyphs ○→✔ in place, and the footer
LiveAgentPanel correctly suppresses the duplicate rows.

11 new tests + all 57 prior tests on touched files pass.
@github-actions

Copy link
Copy Markdown
Contributor

📋 Review Summary

This PR introduces InlineParallelAgentsDisplay, a dense inline panel that replaces the opaque Agent × 9 one-liner when /review (or any prompt) launches ≥2 parallel subagents. The implementation is well-architected, with careful attention to React hooks discipline, claim/release ref-counting for coordination with LiveAgentPanel, and comprehensive test coverage. The change significantly improves visibility into multi-agent operations without disrupting existing approval flows.

🔍 General Feedback

  • Strong architectural pattern: The claim/release mechanism via InlineAgentClaimContext is a clean solution for coordinating which display surface (inline panel vs. LiveAgentPanel) owns which agents. The ref-counting handles React's commit/cleanup interleave edge cases.
  • Excellent test coverage: 11 new unit tests cover rendering, claim/release tracking, terminal fallback, and edge cases like mixed tool groups.
  • Thoughtful UX details: Status glyphs (○/✔/✖), live activity updates, elapsed time, and token counts provide rich visibility. The header tally (Parallel agents · 9 · 3/9 done) gives immediate progress feedback.
  • Good fallback handling: The executionSummary.totalDurationMs fallback ensures completed rows retain elapsed time even after unregisterForeground removes the registry entry.
  • Comprehensive comments: Code comments explain design decisions, edge cases, and reconciliation paths thoroughly—helpful for future maintainers.

🎯 Specific Feedback

🟡 High

  • File: packages/cli/src/ui/components/messages/InlineParallelAgentsDisplay.tsx:104-112 — The activityLabel function uses recentActivities?.at(-1) to get the most recent activity. However, if recentActivities is mutated in place by the registry (as noted in comments), there's a potential race where the array reference doesn't change but contents do. The now tick dependency helps, but consider documenting that recentActivities mutation is expected and relied upon.

  • File: packages/cli/src/ui/components/messages/ToolGroupMessage.tsx:284-295 — The routing condition isPureAgentGroup checks toolCalls.length >= 2 && toolCalls.every(isSubagentToolEntry). This is correct, but consider extracting this logic into a named predicate function (e.g., isPureParallelAgentGroup) for clarity and reusability, similar to isSubagentToolEntry and isTerminalSubagentTool.

🟢 Medium

  • File: packages/cli/src/ui/components/messages/InlineParallelAgentsDisplay.tsx:158-167 — The hasLiveAgent memo only checks for 'running' or 'background' status. The interval cleanup depends on this, but if an agent transitions to a different non-terminal state not covered here, the interval might stop prematurely. Consider whether this aligns with all possible non-terminal states in AgentResultDisplay['status'].

  • File: packages/cli/src/ui/components/messages/InlineParallelAgentsDisplay.tsx:76-85 — The elapsedLabel function has three branches: live registry timing, fallback elapsed, and empty string. The fallback uses executionSummary?.totalDurationMs, but this value could be 0 for very fast completions. The Math.max(0, ...) guards are good, but consider whether 0ms should display as 0s or remain hidden (currently shows empty string if both sources are undefined).

  • File: packages/cli/src/ui/components/background-view/LiveAgentPanel.tsx:293-296 — The filter .filter((e) => !isClaimed(e.agentId)) suppresses claimed agents. This is correct, but the dependency array now includes isClaimed which comes from context. If the context value changes identity frequently (e.g., due to provider re-renders), this could trigger unnecessary memo recomputations. Verify that useInlineAgentClaim returns a stable reference.

🔵 Low

  • File: packages/cli/src/ui/components/messages/InlineParallelAgentsDisplay.tsx:1 — The license header says "Qwen Team" but other files in the repo (e.g., LiveAgentPanel.tsx, ToolGroupMessage.tsx) say "Google LLC" or "Google LLC". Consider standardizing the copyright holder across all files for consistency.

  • File: packages/cli/src/ui/components/messages/InlineParallelAgentsDisplay.tsx:193 — The NAME_COL_WIDTH = 26 constant is a magic number. Consider whether this should be configurable or at least documented with a comment explaining why 26 characters was chosen (e.g., "fits typical agent task descriptions while leaving room for activity/elapsed columns").

  • File: packages/cli/src/ui/contexts/InlineAgentClaimContext.tsx — The file is marked as binary in the diff, which seems unintentional for a TypeScript source file. This may be a git encoding issue—verify the file wasn't accidentally committed with a different encoding or line ending format.

  • File: packages/cli/src/gemini.tsx:326-333 — The InlineAgentClaimProvider wraps AppContainer in the provider tree. This is correct, but consider adding a brief comment explaining why the provider needs to be at this level (i.e., to be available to both ToolGroupMessage and LiveAgentPanel which are descendants).

✅ Highlights

  • Claim/release ref-counting: The decision to use reference counting (not a simple Set) for agent claims shows deep understanding of React's rendering quirks. This prevents race conditions during commit/cleanup interleave.
  • Terminal fallback handling: Sourcing elapsed time from executionSummary.totalDurationMs when the registry forgets the agent is a thoughtful touch that prevents the "disappearing duration" bug.
  • Comprehensive test plan: The PR description's test plan covers unit tests, existing test compatibility, and visual smoke testing. The 11 new tests plus verification that all 57 prior tests still pass demonstrates thoroughness.
  • Non-breaking change: The routing conditions ensure mixed tool groups, pending confirmations, and committed (non-live) groups all continue using existing renderers, preserving keyboard approval flows and scrollback behavior.
  • Clean separation of concerns: InlineParallelAgentsDisplay handles display only; approval routing, cancellation, and detail views remain with existing components (BackgroundTasksDialog, pill interactions).

@wenshao wenshao changed the title feat(cli): dense inline panel for parallel agent fan-out feat(cli): show live per-agent progress instead of collapsing parallel agents to "Agent x N" May 24, 2026
@github-actions

github-actions Bot commented May 24, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 77.19% 77.19% 79.92% 79.98%
Core 80.18% 80.18% 82.43% 83.04%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   77.19 |    79.98 |   79.92 |   77.19 |                   
 src               |   75.49 |    68.65 |   78.94 |   75.49 |                   
  gemini.tsx       |   68.93 |    66.15 |   77.77 |   68.93 | ...41,958-961,973 
  ...ractiveCli.ts |   78.73 |    66.89 |   73.33 |   78.73 | ...1284-1285,1321 
  ...liCommands.ts |    74.9 |     75.6 |     100 |    74.9 | ...41-265,290,391 
  ...ActiveAuth.ts |     100 |     87.5 |     100 |     100 | 66-80             
 ...cp-integration |   61.97 |    65.24 |   78.12 |   61.97 |                   
  acpAgent.ts      |   63.32 |    65.35 |   83.05 |   63.32 | ...2112,2126-2134 
  authMethods.ts   |   12.19 |      100 |       0 |   12.19 | 11-31,34-38,41-50 
  errorCodes.ts    |       0 |        0 |       0 |       0 | 1-22              
  ...DirContext.ts |     100 |      100 |     100 |     100 |                   
 ...ration/service |   68.65 |    83.33 |   66.66 |   68.65 |                   
  filesystem.ts    |   68.65 |    83.33 |   66.66 |   68.65 | ...32,77-94,97-98 
 ...ration/session |   75.88 |    72.05 |   86.25 |   75.88 |                   
  ...ryReplayer.ts |   67.34 |     75.6 |   81.81 |   67.34 | ...54-269,282-283 
  Session.ts       |   74.93 |    70.81 |   88.46 |   74.93 | ...2658,2664-2667 
  ...entTracker.ts |   90.85 |    84.84 |      90 |   90.85 | ...35,199,251-260 
  index.ts         |       0 |        0 |       0 |       0 | 1-40              
  ...ssionUtils.ts |   84.21 |    77.77 |     100 |   84.21 | ...37-153,209-211 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...ssion/emitters |   96.01 |    90.75 |    92.3 |   96.01 |                   
  BaseEmitter.ts   |   76.92 |    66.66 |      80 |   76.92 | 23-24,39-40,55-56 
  ...ageEmitter.ts |     100 |    89.47 |     100 |     100 | 109,111           
  PlanEmitter.ts   |     100 |      100 |     100 |     100 |                   
  ...allEmitter.ts |   98.06 |     92.3 |     100 |   98.06 | 227-228,327,335   
  index.ts         |       0 |        0 |       0 |       0 | 1-10              
 ...ession/rewrite |   90.36 |    87.83 |   94.11 |   90.36 |                   
  LlmRewriter.ts   |      81 |       84 |     100 |      81 | ...,88-89,155-159 
  ...Middleware.ts |   95.83 |    85.71 |     100 |   95.83 | 119,127-129       
  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      |   45.67 |    85.71 |   43.47 |   45.67 |                   
  auth.ts          |     100 |    83.33 |     100 |     100 | 11,14             
  channel.ts       |   56.66 |      100 |       0 |   56.66 | 15-19,27-34       
  extensions.tsx   |   96.55 |      100 |      50 |   96.55 | 37                
  hooks.tsx        |   66.66 |      100 |       0 |   66.66 | 20-24             
  mcp.ts           |   94.73 |      100 |      50 |   94.73 | 28                
  review.ts        |   51.85 |      100 |       0 |   51.85 | 24-35,38          
  serve.ts         |    8.02 |      100 |       0 |    8.02 | ...56-152,154-266 
 ...mmands/channel |   39.25 |    79.45 |      50 |   39.25 |                   
  ...l-registry.ts |    8.57 |      100 |       0 |    8.57 | 6-21,24-42        
  config-utils.ts  |      92 |      100 |   66.66 |      92 | 21-26             
  configure.ts     |    14.7 |      100 |       0 |    14.7 | 18-21,23-84       
  pairing.ts       |   26.31 |      100 |       0 |   26.31 | ...30,40-50,52-65 
  pidfile.ts       |   96.34 |    86.95 |     100 |   96.34 | 49,59,91          
  start.ts         |   30.98 |       52 |   69.23 |   30.98 | ...72-475,484-486 
  status.ts        |   17.85 |      100 |       0 |   17.85 | 15-26,32-76       
  stop.ts          |      20 |      100 |       0 |      20 | 14-48             
 ...nds/extensions |   84.89 |    88.52 |   81.81 |   84.89 |                   
  consent.ts       |   71.65 |    89.28 |   42.85 |   71.65 | ...85-141,156-162 
  disable.ts       |     100 |      100 |     100 |     100 |                   
  enable.ts        |     100 |      100 |     100 |     100 |                   
  install.ts       |    75.6 |    66.66 |   66.66 |    75.6 | ...39-142,145-153 
  link.ts          |     100 |      100 |     100 |     100 |                   
  list.ts          |     100 |      100 |     100 |     100 |                   
  new.ts           |     100 |      100 |     100 |     100 |                   
  settings.ts      |   99.15 |      100 |   83.33 |   99.15 | 151               
  uninstall.ts     |    37.5 |      100 |   33.33 |    37.5 | 23-45,57-64,67-70 
  update.ts        |   96.32 |      100 |     100 |   96.32 | 101-105           
  utils.ts         |   65.06 |    31.25 |     100 |   65.06 | ...85,87-91,93-97 
 ...les/mcp-server |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-60              
 src/commands/mcp  |   92.29 |    86.08 |   88.88 |   92.29 |                   
  add.ts           |     100 |    98.03 |     100 |     100 | 293               
  list.ts          |   91.22 |    80.76 |      80 |   91.22 | ...19-121,146-147 
  reconnect.ts     |   76.72 |    71.42 |   85.71 |   76.72 | 35-48,153-175     
  remove.ts        |     100 |       80 |     100 |     100 | 21-25             
 ...ommands/review |   11.57 |      100 |       0 |   11.57 |                   
  cleanup.ts       |   17.94 |      100 |       0 |   17.94 | ...01-106,108-109 
  deterministic.ts |   13.75 |      100 |       0 |   13.75 | ...22-738,740-741 
  fetch-pr.ts      |   11.36 |      100 |       0 |   11.36 | ...80-201,203-204 
  load-rules.ts    |   11.32 |      100 |       0 |   11.32 | ...41-153,155-156 
  pr-context.ts    |    6.22 |      100 |       0 |    6.22 | ...97-312,314-315 
  presubmit.ts     |    9.35 |      100 |       0 |    9.35 | ...62-287,289-290 
 ...nds/review/lib |      30 |      100 |       0 |      30 |                   
  gh.ts            |   22.58 |      100 |       0 |   22.58 | ...49,53-54,62-69 
  git.ts           |   22.72 |      100 |       0 |   22.72 | 15-18,29-39,43-44 
  paths.ts         |   52.94 |      100 |       0 |   52.94 | ...26,37-38,42-43 
 src/config        |   92.56 |    84.55 |   89.36 |   92.56 |                   
  auth.ts          |   86.98 |    80.32 |     100 |   86.98 | ...26-227,243-244 
  config.ts        |   86.68 |    83.49 |   81.48 |   86.68 | ...1935,1937-1945 
  keyBindings.ts   |   96.55 |       50 |     100 |   96.55 | 193-196           
  ...ngsAdapter.ts |     100 |    94.11 |     100 |     100 | 64                
  ...idersScope.ts |      92 |       90 |     100 |      92 | 11-12             
  sandboxConfig.ts |   61.64 |    71.87 |   66.66 |   61.64 | ...54-68,73,77-89 
  settings.ts      |   85.76 |    87.25 |   89.18 |   85.76 | ...1148,1153-1156 
  ...ingsSchema.ts |     100 |      100 |     100 |     100 |                   
  ...tedFolders.ts |   96.22 |       94 |     100 |   96.22 | ...88-190,205-206 
 ...nfig/migration |   94.89 |    78.94 |   83.33 |   94.89 |                   
  index.ts         |   94.87 |    88.88 |     100 |   94.87 | 91-92             
  scheduler.ts     |   96.55 |    77.77 |     100 |   96.55 | 19-20             
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...ation/versions |   94.74 |       96 |     100 |   94.74 |                   
  ...-v2-shared.ts |     100 |      100 |     100 |     100 |                   
  v1-to-v2.ts      |   81.75 |    90.19 |     100 |   81.75 | ...28-229,231-247 
  v2-to-v3.ts      |     100 |      100 |     100 |     100 |                   
  v3-to-v4.ts      |     100 |      100 |     100 |     100 |                   
 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    |   63.09 |    64.51 |   55.55 |   63.09 |                   
  ...tputBridge.ts |   62.94 |    65.51 |   56.25 |   62.94 | ...22-323,331-334 
  ...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/i18n          |   81.47 |    75.94 |   65.71 |   81.47 |                   
  index.ts         |   63.68 |    69.56 |   53.84 |   63.68 | ...70-271,281-286 
  languages.ts     |   96.92 |    86.66 |     100 |   96.92 | 134-135,167,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 |   72.57 |    71.12 |   74.07 |   72.57 |                   
  session.ts       |   76.64 |     69.4 |   85.71 |   76.64 | ...23-824,833-843 
  types.ts         |    42.5 |      100 |   33.33 |    42.5 | ...87-588,591-592 
 ...active/control |   77.04 |    88.23 |      80 |   77.04 |                   
  ...rolContext.ts |    7.14 |        0 |       0 |    7.14 | 49-84             
  ...Dispatcher.ts |   91.66 |    91.83 |   88.88 |   91.66 | ...54-372,388,391 
  ...rolService.ts |       8 |        0 |       0 |       8 | 46-179            
 ...ol/controllers |    7.03 |       80 |   13.33 |    7.03 |                   
  ...Controller.ts |   19.32 |      100 |      60 |   19.32 | 81-118,127-210    
  ...Controller.ts |       0 |        0 |       0 |       0 | 1-56              
  ...Controller.ts |    3.94 |      100 |   11.11 |    3.94 | ...63-381,391-496 
  ...Controller.ts |   14.06 |      100 |       0 |   14.06 | ...82-117,130-133 
  ...Controller.ts |    5.21 |      100 |       0 |    5.21 | ...21-433,442-471 
 .../control/types |       0 |        0 |       0 |       0 |                   
  serviceAPIs.ts   |       0 |        0 |       0 |       0 | 1                 
 ...Interactive/io |   98.01 |    93.77 |   95.23 |   98.01 |                   
  ...putAdapter.ts |   97.89 |    92.82 |   98.07 |   97.89 | ...1303,1398-1399 
  ...putAdapter.ts |      96 |     90.9 |   85.71 |      96 | 51-52             
  ...nputReader.ts |     100 |    94.73 |     100 |     100 | 67                
  ...putAdapter.ts |   98.38 |      100 |   90.47 |   98.38 | 83-84,124-125     
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/patches       |       0 |        0 |       0 |       0 |                   
  is-in-ci.ts      |       0 |        0 |       0 |       0 | 1-17              
 src/remoteInput   |   86.98 |       75 |   85.71 |   86.98 |                   
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  ...putWatcher.ts |   88.12 |    76.08 |   91.66 |   88.12 | ...21-222,233-236 
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/serve         |    79.3 |     78.8 |   92.85 |    79.3 |                   
  auth.ts          |   88.49 |    88.63 |     100 |   88.49 | ...49-150,153-155 
  capabilities.ts  |     100 |     90.9 |     100 |     100 | 264               
  ...usProvider.ts |   67.01 |    51.42 |     100 |   67.01 | ...40-245,278-286 
  debugMode.ts     |     100 |      100 |     100 |     100 |                   
  demo.ts          |     100 |      100 |     100 |     100 |                   
  envSnapshot.ts   |    92.3 |       84 |     100 |    92.3 | 108-111,170-177   
  eventBus.ts      |     100 |      100 |     100 |     100 |                   
  httpAcpBridge.ts |   79.62 |    78.84 |   96.38 |   79.62 | ...4246,4277-4318 
  ...oryChannel.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-106             
  loopbackBinds.ts |     100 |      100 |     100 |     100 |                   
  runQwenServe.ts  |   73.98 |    87.83 |   55.55 |   73.98 | ...94-710,735-737 
  server.ts        |   86.18 |    82.94 |   90.62 |   86.18 | ...2478,2543-2552 
  status.ts        |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...paceAgents.ts |   64.87 |    70.45 |    90.9 |   64.87 | ...1306,1316-1326 
  ...paceMemory.ts |   87.13 |    78.46 |     100 |   87.13 | ...54-361,421-428 
 src/serve/auth    |   86.54 |    78.75 |   93.75 |   86.54 |                   
  deviceFlow.ts    |   96.33 |    79.51 |    97.5 |   96.33 | ...1526,1630,1700 
  ...owProvider.ts |   45.23 |    74.07 |      75 |   45.23 | ...90-359,375,379 
 src/serve/fs      |   84.85 |    79.75 |     100 |   84.85 |                   
  audit.ts         |     100 |    96.15 |     100 |     100 | 201               
  errors.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  paths.ts         |   77.82 |    77.08 |     100 |   77.82 | ...64,493-497,510 
  policy.ts        |   90.32 |    89.18 |     100 |   90.32 | 142-150           
  ...FileSystem.ts |   83.55 |    76.22 |     100 |   83.55 | ...1859,1886-1887 
 src/serve/routes  |   89.41 |       70 |     100 |   89.41 |                   
  ...ceFileRead.ts |   94.41 |    76.92 |     100 |   94.41 | ...28-329,390-392 
  ...eFileWrite.ts |    82.1 |    60.52 |     100 |    82.1 | ...42-244,247-249 
 src/services      |   91.66 |    91.21 |   97.56 |   91.66 |                   
  ...mandLoader.ts |     100 |    93.75 |     100 |     100 | 92                
  ...killLoader.ts |     100 |    96.15 |     100 |     100 | 47                
  ...andService.ts |    98.7 |      100 |     100 |    98.7 | 107               
  ...mandLoader.ts |   86.83 |    83.87 |     100 |   86.83 | ...30-335,340-345 
  ...omptLoader.ts |   75.84 |    80.64 |   83.33 |   75.84 | ...10-211,277-278 
  ...mandLoader.ts |     100 |      100 |     100 |     100 |                   
  ...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.21 |    96.66 |     100 |   98.21 | 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 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...ght/generators |    85.9 |    85.61 |   90.47 |    85.9 |                   
  DataProcessor.ts |   85.63 |     85.6 |   92.85 |   85.63 | ...1122,1126-1133 
  ...tGenerator.ts |   98.21 |    85.71 |     100 |   98.21 | 46                
  ...teRenderer.ts |   45.45 |      100 |       0 |   45.45 | 13-51             
 .../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.34 |    84.84 |     100 |   97.34 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  tipHistory.ts    |   92.45 |       70 |     100 |   92.45 | ...22,144,151,160 
  tipRegistry.ts   |     100 |      100 |     100 |     100 |                   
  tipScheduler.ts  |     100 |    91.66 |     100 |     100 | 55                
 src/test-utils    |   93.75 |    83.33 |      80 |   93.75 |                   
  ...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            |   65.51 |    73.04 |   60.34 |   65.51 |                   
  App.tsx          |     100 |      100 |     100 |     100 |                   
  AppContainer.tsx |   63.66 |     64.7 |      50 |   63.66 | ...3151,3155-3159 
  ...tionNudge.tsx |    9.58 |      100 |       0 |    9.58 | 24-94             
  ...ackDialog.tsx |   29.23 |      100 |       0 |   29.23 | 25-75             
  ...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.05 |     100 |   95.91 | 25-26             
  ...tic-colors.ts |     100 |      100 |     100 |     100 |                   
  ...inePresets.ts |   98.17 |    88.88 |     100 |   98.17 | ...12,239,387-389 
  textConstants.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/auth       |   52.97 |    51.21 |   42.42 |   52.97 |                   
  AuthDialog.tsx   |   62.87 |     42.1 |   18.18 |   62.87 | ...03,310-332,336 
  ...nProgress.tsx |       0 |        0 |       0 |       0 | 1-64              
  ...etupSteps.tsx |    39.4 |       32 |   38.46 |    39.4 | ...68,471,477,480 
  useAuth.ts       |   94.55 |    73.52 |     100 |   94.55 | ...19-220,239-245 
  ...rSetupFlow.ts |   43.45 |    33.33 |      50 |   43.45 | ...68-389,406-449 
 src/ui/commands   |   75.93 |     81.1 |   83.82 |   75.93 |                   
  aboutCommand.ts  |     100 |      100 |     100 |     100 |                   
  agentsCommand.ts |   83.78 |      100 |      60 |   83.78 | 30-32,42-44       
  ...odeCommand.ts |   89.04 |    81.25 |     100 |   89.04 | 91-92,94-99       
  arenaCommand.ts  |   62.81 |    58.73 |   65.21 |   62.81 | ...91-596,681-689 
  authCommand.ts   |     100 |      100 |     100 |     100 |                   
  branchCommand.ts |     100 |      100 |     100 |     100 |                   
  btwCommand.ts    |   95.59 |    71.42 |     100 |   95.59 | 72,154-159        
  bugCommand.ts    |   81.13 |    71.42 |     100 |   81.13 | 60-69             
  clearCommand.ts  |      92 |    76.47 |     100 |      92 | 43-44,72-73,91-92 
  ...essCommand.ts |    64.7 |       50 |      75 |    64.7 | ...48-149,163-166 
  ...extCommand.ts |    64.3 |    55.76 |   84.61 |    64.3 | ...31-566,577-578 
  copyCommand.ts   |   98.28 |    94.89 |     100 |   98.28 | ...80,280,321,327 
  deleteCommand.ts |     100 |      100 |     100 |     100 |                   
  diffCommand.ts   |     100 |     87.5 |     100 |     100 | ...61,224-225,238 
  ...ryCommand.tsx |   76.87 |    79.03 |   88.88 |   76.87 | ...59-264,318-326 
  docsCommand.ts   |     100 |    88.88 |     100 |     100 | 25                
  doctorCommand.ts |   95.06 |    88.28 |     100 |   95.06 | ...92-293,320-321 
  dreamCommand.ts  |      75 |    66.66 |   66.66 |      75 | 22-27,44-47       
  editorCommand.ts |     100 |      100 |     100 |     100 |                   
  exportCommand.ts |   98.25 |    91.02 |     100 |   98.25 | ...81,198-199,364 
  ...onsCommand.ts |   49.33 |     90.9 |   63.63 |   49.33 | ...06-110,163-215 
  forgetCommand.ts |   26.82 |      100 |      50 |   26.82 | 18-51             
  goalCommand.ts   |   91.41 |    84.44 |      90 |   91.41 | ...86-189,201-204 
  helpCommand.ts   |     100 |      100 |     100 |     100 |                   
  hooksCommand.ts  |    20.4 |       40 |      40 |    20.4 | ...48-180,204-205 
  ideCommand.ts    |   60.75 |    64.28 |   41.17 |   60.75 | ...05-306,310-324 
  initCommand.ts   |   84.33 |    72.72 |     100 |   84.33 | 68,82-87,89-94    
  ...ghtCommand.ts |   74.56 |    68.42 |     100 |   74.56 | ...31-245,250-273 
  ...ageCommand.ts |   92.17 |    82.69 |     100 |   92.17 | ...43,164,173-183 
  lspCommand.ts    |     100 |    86.95 |     100 |     100 | 31,101-102        
  mcpCommand.ts    |     100 |      100 |     100 |     100 |                   
  memoryCommand.ts |     100 |      100 |     100 |     100 |                   
  modelCommand.ts  |   75.09 |    78.18 |      75 |   75.09 | ...20-225,262-267 
  ...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             
  ...berCommand.ts |   32.43 |      100 |      50 |   32.43 | 23-57             
  renameCommand.ts |   85.71 |    86.04 |     100 |   85.71 | ...02-209,216-221 
  ...oreCommand.ts |    92.3 |    87.87 |     100 |    92.3 | ...,83-88,129-130 
  resumeCommand.ts |     100 |      100 |     100 |     100 |                   
  rewindCommand.ts |      80 |      100 |      50 |      80 | 19-21             
  ...ngsCommand.ts |     100 |      100 |     100 |     100 |                   
  ...hubCommand.ts |   81.43 |    65.21 |      80 |   81.43 | ...70-173,176-179 
  skillsCommand.ts |   37.06 |       50 |      50 |   37.06 | ...99-115,118-145 
  statsCommand.ts  |   88.19 |    84.21 |     100 |   88.19 | ...,58-61,143-146 
  ...ineCommand.ts |     100 |      100 |     100 |     100 |                   
  ...aryCommand.ts |    6.46 |      100 |      50 |    6.46 | 31-329            
  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 |                   
  vimCommand.ts    |   54.54 |      100 |      50 |   54.54 | 19-29             
 src/ui/components |   62.34 |    75.09 |   64.85 |   62.34 |                   
  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    |   89.06 |       75 |     100 |   89.06 | 37,39-44,46       
  ...odeDialog.tsx |     9.7 |      100 |       0 |     9.7 | 35-47,50-182      
  AsciiArt.ts      |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |   13.04 |      100 |       0 |   13.04 | 18-61             
  ...TextInput.tsx |   77.01 |       76 |     100 |   77.01 | ...20,234-236,263 
  Composer.tsx     |    81.6 |     64.7 |     100 |    81.6 | ...90,108,160,173 
  ...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 
  ...ification.tsx |   28.57 |      100 |       0 |   28.57 | 16-36             
  ...gProfiler.tsx |       0 |        0 |       0 |       0 | 1-36              
  ...ogManager.tsx |   11.98 |      100 |       0 |   11.98 | 65-508            
  DiffDialog.tsx   |    2.47 |      100 |       0 |    2.47 | 68-732            
  ...ngsDialog.tsx |    8.44 |      100 |       0 |    8.44 | 37-195            
  ExitWarning.tsx  |     100 |      100 |     100 |     100 |                   
  ...hProgress.tsx |    87.8 |    33.33 |     100 |    87.8 | 28-31,56          
  ...ustDialog.tsx |     100 |      100 |     100 |     100 |                   
  Footer.tsx       |   76.59 |    48.64 |     100 |   76.59 | ...35-136,175-180 
  ...ngSpinner.tsx |   68.42 |       80 |      50 |   68.42 | 35-52,73,80-81    
  GoalPill.tsx     |   76.19 |    81.81 |     100 |   76.19 | 24-30,46-50       
  Header.tsx       |   98.62 |    94.28 |     100 |   98.62 | 162,164           
  Help.tsx         |   98.32 |       90 |     100 |   98.32 | ...24,381,447-448 
  ...emDisplay.tsx |    61.7 |       36 |     100 |    61.7 | ...42,345,348-354 
  ...ngeDialog.tsx |     100 |      100 |     100 |     100 |                   
  InputPrompt.tsx  |   80.76 |    79.62 |   83.33 |   80.76 | ...1456,1588,1638 
  ...Shortcuts.tsx |   20.87 |      100 |       0 |   20.87 | ...6,49-51,67-125 
  ...Indicator.tsx |     100 |    91.42 |     100 |     100 | 65,74             
  ...firmation.tsx |   91.42 |      100 |      50 |   91.42 | 26-31             
  MainContent.tsx  |   81.75 |       75 |     100 |   81.75 | ...70-274,282-286 
  MemoryDialog.tsx |    55.1 |    54.54 |   57.14 |    55.1 | ...56,368,381-383 
  ...geDisplay.tsx |       0 |        0 |       0 |       0 | 1-41              
  ModelDialog.tsx  |   80.12 |    63.55 |     100 |   80.12 | ...39-555,612-616 
  ...tsDisplay.tsx |     100 |    97.22 |     100 |     100 | 270               
  ...fications.tsx |   18.18 |      100 |       0 |   18.18 | 15-58             
  ...onsDialog.tsx |    2.13 |      100 |       0 |    2.13 | 62-133,148-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 |    8.57 |      100 |       0 |    8.57 | 24-55,58-134      
  ...geDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ngDisplay.tsx |   21.42 |      100 |       0 |   21.42 | 13-39             
  ...hProgress.tsx |   85.25 |    88.46 |     100 |   85.25 | 121-147           
  ...dSelector.tsx |   41.26 |    61.53 |   71.42 |   41.26 | ...74-472,476-520 
  ...ionPicker.tsx |   83.66 |    72.13 |     100 |   83.66 | ...96,402,444-466 
  ...onPreview.tsx |   92.42 |    84.37 |     100 |   92.42 | ...,70-71,143-145 
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...putPrompt.tsx |   72.56 |       80 |      40 |   72.56 | ...06-109,114-117 
  ...ngsDialog.tsx |   66.27 |    71.16 |      75 |   66.27 | ...12-820,826-827 
  ...ionDialog.tsx |    87.8 |      100 |   33.33 |    87.8 | 36-39,44-51       
  ...putPrompt.tsx |    15.9 |      100 |       0 |    15.9 | 20-63             
  ...Indicator.tsx |   57.14 |      100 |       0 |   57.14 | 12-15             
  ...MoreLines.tsx |      28 |      100 |       0 |      28 | 18-40             
  ...ionPicker.tsx |   17.59 |      100 |       0 |   17.59 | 55-172            
  StatsDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ineDialog.tsx |   93.69 |    83.92 |     100 |   93.69 | ...11,273,293-295 
  ...yTodoList.tsx |   94.17 |       80 |     100 |   94.17 | 56-57,131-134     
  ...nsDisplay.tsx |   87.25 |       64 |     100 |   87.25 | ...47-149,156-158 
  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 |    81.81 |     100 |     100 | 71-86             
  ...ification.tsx |   36.36 |      100 |       0 |   36.36 | 15-22             
  ...ackDialog.tsx |    7.84 |      100 |       0 |    7.84 | 24-134            
  ...xitDialog.tsx |   80.36 |    43.47 |      60 |   80.36 | ...24-238,248-251 
 ...nts/agent-view |   38.31 |    70.83 |   36.36 |   38.31 |                   
  ...atContent.tsx |    8.79 |      100 |       0 |    8.79 | 53-265,271-273    
  ...tChatView.tsx |   21.05 |      100 |       0 |   21.05 | 21-39             
  ...tComposer.tsx |   10.28 |      100 |       0 |   10.28 | 58-311            
  AgentFooter.tsx  |   17.07 |      100 |       0 |   17.07 | 28-66             
  AgentHeader.tsx  |   15.38 |      100 |       0 |   15.38 | 27-64             
  AgentTabBar.tsx  |    87.8 |    27.27 |     100 |    87.8 | ...,85,95-103,121 
  ...oryAdapter.ts |     100 |    91.83 |     100 |     100 | 103,109-110,138   
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
 ...mponents/arena |   45.72 |    70.53 |   60.86 |   45.72 |                   
  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 |   10.15 |      100 |       0 |   10.15 | 27-161            
  ...tusDialog.tsx |    5.63 |      100 |       0 |    5.63 | 33-75,80-288      
  ...topDialog.tsx |    6.17 |      100 |       0 |    6.17 | 33-213            
 ...ackground-view |    75.6 |    82.66 |   85.29 |    75.6 |                   
  ...sksDialog.tsx |   70.99 |    80.48 |   76.19 |   70.99 | ...1120,1196-1198 
  ...TasksPill.tsx |   63.75 |    86.95 |     100 |   63.75 | 44,86-106,114-122 
  ...gentPanel.tsx |    97.4 |    86.31 |     100 |    97.4 | 123,434-438       
 ...nts/extensions |   45.28 |    33.33 |      60 |   45.28 |                   
  ...gerDialog.tsx |   44.31 |    34.14 |      75 |   44.31 | ...71-480,483-488 
  index.ts         |       0 |        0 |       0 |       0 | 1-9               
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...tensions/steps |   54.88 |    94.23 |   66.66 |   54.88 |                   
  ...ctionStep.tsx |   95.12 |    92.85 |   85.71 |   95.12 | 84-86,89          
  ...etailStep.tsx |    6.18 |      100 |       0 |    6.18 | 20-131            
  ...nListStep.tsx |   88.43 |    94.73 |      80 |   88.43 | 52-53,59-72,106   
  ...electStep.tsx |   13.46 |      100 |       0 |   13.46 | 20-70             
  ...nfirmStep.tsx |   19.56 |      100 |       0 |   19.56 | 23-65             
  index.ts         |     100 |      100 |     100 |     100 |                   
 ...mponents/hooks |   68.67 |    69.07 |   69.56 |   68.67 |                   
  ...etailStep.tsx |   74.68 |    66.66 |   66.66 |   74.68 | ...71-184,188-201 
  ...etailStep.tsx |    87.4 |    73.68 |     100 |    87.4 | 41-42,99-113,119  
  ...abledStep.tsx |     100 |      100 |     100 |     100 |                   
  ...sListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   34.51 |    47.05 |   42.85 |   34.51 | ...78,482-495,499 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-13              
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...components/mcp |   20.98 |    86.36 |   83.33 |   20.98 |                   
  ...ealthPill.tsx |   68.42 |    85.71 |     100 |   68.42 | 40-46             
  ...entDialog.tsx |    3.64 |      100 |       0 |    3.64 | 41-717            
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-30              
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |   95.83 |    88.88 |     100 |   95.83 | 16,20,109-110     
 ...ents/mcp/steps |   26.74 |    54.54 |   42.85 |   26.74 |                   
  ...icateStep.tsx |    5.88 |      100 |       0 |    5.88 | 40-55,58-296      
  ...electStep.tsx |   10.95 |      100 |       0 |   10.95 | 16-88             
  ...etailStep.tsx |    5.26 |      100 |       0 |    5.26 | 31-247            
  ...rListStep.tsx |   75.18 |    59.37 |     100 |   75.18 | ...53-158,169-173 
  ...etailStep.tsx |   10.41 |      100 |       0 |   10.41 | ...1,67-79,82-139 
  ToolListStep.tsx |   69.02 |       50 |     100 |   69.02 | ...22,125,134-143 
 ...nents/messages |    83.1 |    80.33 |    75.6 |    83.1 |                   
  ...ionDialog.tsx |   80.84 |     77.6 |    62.5 |   80.84 | ...98,516,534-536 
  BtwMessage.tsx   |     100 |      100 |     100 |     100 |                   
  ...upDisplay.tsx |   97.67 |    83.72 |     100 |   97.67 | 119,142,150       
  ...onMessage.tsx |   91.93 |    82.35 |     100 |   91.93 | 57-59,61,63       
  ...nMessages.tsx |   79.06 |      100 |      70 |   79.06 | ...51-264,268-280 
  DiffRenderer.tsx |   93.19 |    86.17 |     100 |   93.19 | ...09,237-238,304 
  ...tsDisplay.tsx |   97.82 |    77.27 |     100 |   97.82 | 87,89             
  ...usMessage.tsx |   76.31 |     42.1 |   66.66 |   76.31 | ...99,101,124,155 
  ...tsDisplay.tsx |    95.1 |    88.05 |     100 |    95.1 | ...29,131,164-169 
  ...ssMessage.tsx |    12.5 |      100 |       0 |    12.5 | 18-59             
  ...edMessage.tsx |   16.66 |      100 |       0 |   16.66 | 22-38             
  ...sMessages.tsx |   55.67 |       40 |   28.57 |   55.67 | ...20-125,133-145 
  ...ryMessage.tsx |   14.28 |      100 |       0 |   14.28 | 23-62             
  ...onMessage.tsx |   81.02 |    69.23 |   33.33 |   81.02 | ...24-426,433-435 
  ...upMessage.tsx |   82.63 |    92.85 |     100 |   82.63 | ...85-412,434-449 
  ToolMessage.tsx  |   88.84 |    75.71 |    92.3 |   88.84 | ...44-749,776-778 
 ...ponents/shared |   86.23 |    79.33 |   95.94 |   86.23 |                   
  ...ctionList.tsx |   99.03 |    95.65 |     100 |   99.03 | 85                
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  EnumSelector.tsx |     100 |    96.42 |     100 |     100 | 58                
  MaxSizedBox.tsx  |   83.01 |    86.25 |   88.88 |   83.01 | ...12-513,618-619 
  MultiSelect.tsx  |   84.31 |    74.19 |     100 |   84.31 | ...37,193-195,205 
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  ...eSelector.tsx |     100 |       60 |     100 |     100 | 40-45             
  TextInput.tsx    |   77.77 |    48.78 |      80 |   77.77 | ...14-218,230-236 
  ...apsedTime.tsx |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |     100 |      100 |     100 |     100 |                   
  text-buffer.ts   |   85.38 |       80 |   97.77 |   85.38 | ...2437,2535-2536 
  ...er-actions.ts |   86.71 |    67.79 |     100 |   86.71 | ...07-608,809-811 
 ...ents/subagents |   30.87 |        0 |       0 |   30.87 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
  reducers.tsx     |    12.1 |      100 |       0 |    12.1 | 33-190            
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |   10.95 |      100 |       0 |   10.95 | ...1,56-57,60-102 
 ...bagents/create |    9.13 |      100 |       0 |    9.13 |                   
  ...ionWizard.tsx |    7.28 |      100 |       0 |    7.28 | 34-299            
  ...rSelector.tsx |   14.75 |      100 |       0 |   14.75 | 26-85             
  ...onSummary.tsx |    4.26 |      100 |       0 |    4.26 | 27-331            
  ...tionInput.tsx |    8.63 |      100 |       0 |    8.63 | 23-177            
  ...dSelector.tsx |   33.33 |      100 |       0 |   33.33 | 20-21,26-27,36-63 
  ...nSelector.tsx |    37.5 |      100 |       0 |    37.5 | 20-21,26-27,36-58 
  ...EntryStep.tsx |   12.76 |      100 |       0 |   12.76 | 34-78             
  ToolSelector.tsx |    4.16 |      100 |       0 |    4.16 | 31-253            
 ...bagents/manage |   21.51 |    59.52 |   27.27 |   21.51 |                   
  ...ctionStep.tsx |   10.25 |      100 |       0 |   10.25 | 21-103            
  ...eleteStep.tsx |   20.93 |      100 |       0 |   20.93 | 23-62             
  ...tEditStep.tsx |   25.53 |      100 |       0 |   25.53 | ...2,37-38,51-124 
  ...ctionStep.tsx |   35.42 |    59.52 |     100 |   35.42 | ...20-432,437-439 
  ...iewerStep.tsx |   13.72 |      100 |       0 |   13.72 | 18-73             
  ...gerDialog.tsx |    6.74 |      100 |       0 |    6.74 | 35-341            
 ...mponents/views |   70.21 |    67.32 |    64.7 |   70.21 |                   
  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 |   87.69 |    73.68 |     100 |   87.69 | 65-72             
  McpStatus.tsx    |   89.53 |    60.52 |     100 |   89.53 | ...72,175-177,262 
  SkillsList.tsx   |   27.27 |      100 |       0 |   27.27 | 18-35             
  ToolsList.tsx    |     100 |      100 |     100 |     100 |                   
 src/ui/contexts   |   77.45 |    77.46 |   80.35 |   77.45 |                   
  ...ewContext.tsx |    64.7 |    85.71 |      50 |    64.7 | ...22-225,231-241 
  AppContext.tsx   |      80 |       50 |     100 |      80 | 19-20             
  ...ewContext.tsx |   93.03 |    64.28 |      50 |   93.03 | ...31-232,259-263 
  ...deContext.tsx |     100 |      100 |     100 |     100 |                   
  ...igContext.tsx |   81.81 |       50 |     100 |   81.81 | 15-16             
  ...ssContext.tsx |   82.31 |    82.84 |     100 |   82.31 | ...1153,1159-1161 
  ...owContext.tsx |   89.28 |       80 |   66.66 |   89.28 | 34,47-48,60-62    
  ...deContext.tsx |     100 |      100 |      50 |     100 |                   
  ...onContext.tsx |   43.28 |     62.5 |    62.5 |   43.28 | ...56-259,263-266 
  ...gsContext.tsx |   83.33 |       50 |     100 |   83.33 | 17-18             
  ...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             
  ...nsContext.tsx |   88.23 |       50 |     100 |   88.23 | 118-119           
  ...teContext.tsx |   86.66 |       50 |     100 |   86.66 | 194-195           
  ...deContext.tsx |   76.08 |    72.72 |     100 |   76.08 | 47-48,52-59,77-78 
 src/ui/daemon     |   90.76 |    73.73 |   95.45 |   90.76 |                   
  ...TuiAdapter.ts |   90.76 |    73.73 |   95.45 |   90.76 | ...53,771-772,858 
 src/ui/editors    |   93.33 |    85.71 |   66.66 |   93.33 |                   
  ...ngsManager.ts |   93.33 |    85.71 |   66.66 |   93.33 | 49,63-64          
 src/ui/hooks      |   82.18 |    82.18 |   86.87 |   82.18 |                   
  ...dProcessor.ts |   83.12 |    82.56 |     100 |   83.12 | ...88-389,408-435 
  keyToAnsi.ts     |    3.92 |      100 |       0 |    3.92 | 19-77             
  ...dProcessor.ts |    94.8 |    70.58 |     100 |    94.8 | ...76-277,282-283 
  ...dProcessor.ts |   75.75 |    63.01 |   61.53 |   75.75 | ...84,908,927-931 
  ...amingState.ts |   12.22 |      100 |       0 |   12.22 | 54-157            
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...ationFrame.ts |      32 |       60 |     100 |      32 | 42-44,51-90       
  ...odeCommand.ts |   58.82 |      100 |     100 |   58.82 | 28,33-48          
  ...enaCommand.ts |      85 |      100 |     100 |      85 | 23-24,29          
  ...aInProcess.ts |   19.81 |    66.66 |      25 |   19.81 | 57-175            
  ...Completion.ts |   92.81 |    89.09 |     100 |   92.81 | ...86-187,224-227 
  ...ifications.ts |   92.07 |    96.29 |     100 |   92.07 | 116-124           
  ...tIndicator.ts |   83.49 |    70.96 |     100 |   83.49 | ...60,168,170-178 
  ...waySummary.ts |   96.22 |    69.69 |     100 |   96.22 | 125-127,169       
  ...ndTaskView.ts |   94.21 |    76.08 |     100 |   94.21 | 122-126,213,219   
  ...ketedPaste.ts |    23.8 |      100 |       0 |    23.8 | 19-37             
  ...nchCommand.ts |   94.36 |    74.35 |     100 |   94.36 | ...60,168-169,209 
  ...ompletion.tsx |   95.96 |    83.87 |     100 |   95.96 | ...22-223,225-226 
  ...dMigration.ts |   90.62 |       75 |     100 |   90.62 | 38-40             
  useCompletion.ts |    92.4 |     87.5 |     100 |    92.4 | 68-69,93-94,98-99 
  ...nitMessage.ts |     100 |      100 |     100 |     100 |                   
  ...extualTips.ts |   77.27 |       50 |     100 |   77.27 | ...2,75-79,93-101 
  ...eteCommand.ts |   78.53 |    88.57 |     100 |   78.53 | ...96-104,112-113 
  ...ialogClose.ts |   13.33 |      100 |     100 |   13.33 | 82-173            
  useDiffData.ts   |   11.62 |      100 |       0 |   11.62 | 44-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.45 |     92.3 |     100 |   93.45 | ...83-287,300-306 
  ...agerDialog.ts |   88.88 |      100 |     100 |   88.88 | 21,25             
  ...backDialog.ts |   57.89 |    71.42 |      50 |   57.89 | ...66-168,190-191 
  useFocus.ts      |     100 |      100 |     100 |     100 |                   
  ...olderTrust.ts |     100 |      100 |     100 |     100 |                   
  ...ggestions.tsx |   89.15 |     62.5 |      50 |   89.15 | ...22-124,149-150 
  ...miniStream.ts |   78.06 |    75.47 |   91.66 |   78.06 | ...2573,2586-2594 
  ...BranchName.ts |    90.9 |     92.3 |     100 |    90.9 | 19-20,55-58       
  ...oryManager.ts |   93.15 |    93.75 |     100 |   93.15 | 44,107-110        
  ...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 |      100 |     100 |     100 |                   
  useLogger.ts     |   21.05 |      100 |       0 |   21.05 | 15-37             
  useMCPHealth.ts  |   63.15 |       75 |      50 |   63.15 | 42-52,64-67       
  useMcpDialog.ts  |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...moryDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...oryMonitor.ts |     100 |      100 |     100 |     100 |                   
  ...ssageQueue.ts |     100 |      100 |     100 |     100 |                   
  ...delCommand.ts |     100 |       75 |     100 |     100 | 22                
  ...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 |   86.49 |    77.96 |    90.9 |   86.49 | ...26,288-300,348 
  useQwenAuth.ts   |     100 |      100 |     100 |     100 |                   
  ...lScheduler.ts |    84.7 |    93.33 |     100 |    84.7 | ...71-276,372-382 
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-7               
  ...umeCommand.ts |   97.08 |    83.33 |     100 |   97.08 | 103-104,133       
  ...ompletion.tsx |   90.59 |    83.33 |     100 |   90.59 | ...01,104,137-140 
  ...ectionList.ts |   96.98 |    95.65 |     100 |   96.98 | ...83-184,238-241 
  ...sionPicker.ts |   92.87 |    90.35 |     100 |   92.87 | ...99-501,503-505 
  ...earchInput.ts |     100 |      100 |     100 |     100 |                   
  ...ngsCommand.ts |   18.75 |      100 |       0 |   18.75 | 10-25             
  ...ellHistory.ts |   91.74 |    79.41 |     100 |   91.74 | ...74,122-123,133 
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-73              
  ...Completion.ts |    82.7 |    85.41 |   94.73 |    82.7 | ...69-671,679-715 
  ...tateAndRef.ts |     100 |      100 |     100 |     100 |                   
  useStatusLine.ts |   96.09 |    90.37 |     100 |   96.09 | ...62-365,450-457 
  ...eateDialog.ts |   88.23 |      100 |     100 |   88.23 | 14,18             
  ...tification.ts |     100 |    85.71 |     100 |     100 | 47                
  ...alProgress.ts |   53.06 |       50 |   66.66 |   53.06 | ...53,61-68,79-85 
  ...rminalSize.ts |   76.19 |      100 |      50 |   76.19 | 21-25             
  ...emeCommand.ts |   67.01 |    29.41 |     100 |   67.01 | ...10-111,115-116 
  useTimer.ts      |   88.09 |    85.71 |     100 |   88.09 | 44-45,51-53       
  ...lMigration.ts |       0 |        0 |       0 |       0 |                   
  ...rustModify.ts |     100 |      100 |     100 |     100 |                   
  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 | 44-45,87          
  vim.ts           |   83.77 |    80.31 |     100 |   83.77 | ...55,759-767,776 
 src/ui/layouts    |   89.72 |     87.5 |     100 |   89.72 |                   
  ...AppLayout.tsx |   89.88 |     87.5 |     100 |   89.88 | 51-53,93-98       
  ...AppLayout.tsx |   89.47 |     87.5 |     100 |   89.47 | 58-63             
 src/ui/models     |   80.24 |    79.16 |   71.42 |   80.24 |                   
  ...ableModels.ts |   80.24 |    79.16 |   71.42 |   80.24 | ...,61-71,123-125 
 ...noninteractive |     100 |      100 |   14.28 |     100 |                   
  ...eractiveUi.ts |     100 |      100 |   14.28 |     100 |                   
 src/ui/state      |   94.91 |    81.81 |     100 |   94.91 |                   
  extensions.ts    |   94.91 |    81.81 |     100 |   94.91 | 68-69,88          
 src/ui/themes     |   98.53 |    70.58 |     100 |   98.53 |                   
  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   |     100 |      100 |     100 |     100 |                   
  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 |   87.98 |    82.89 |     100 |   87.98 | ...48-357,362-363 
  theme.ts         |     100 |    38.02 |     100 |     100 | ...34-449,457-461 
  xcode.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/utils      |   83.98 |       83 |   92.61 |   83.98 |                   
  ...Colorizer.tsx |   79.53 |    83.78 |     100 |   79.53 | ...51-152,249-275 
  ...nRenderer.tsx |   68.83 |    70.14 |      50 |   68.83 | ...52-254,274-293 
  ...wnDisplay.tsx |   86.01 |    87.41 |     100 |   86.01 | ...87,704,729-754 
  ...idDiagram.tsx |   87.79 |    95.34 |     100 |   87.79 | 156-179           
  ...eRenderer.tsx |   92.08 |    80.45 |      95 |   92.08 | ...76-679,723-728 
  ...dWorkUtils.ts |     100 |      100 |     100 |     100 |                   
  ...boardUtils.ts |   59.61 |    58.82 |     100 |   59.61 | ...,86-88,107-149 
  commandUtils.ts  |    95.9 |    88.42 |     100 |    95.9 | ...62,164-165,289 
  computeStats.ts  |     100 |      100 |     100 |     100 |                   
  customBanner.ts  |   90.68 |    91.22 |     100 |   90.68 | ...13,324-327,334 
  displayUtils.ts  |   88.37 |    72.22 |     100 |   88.37 | 23,25,29,31,33    
  formatters.ts    |   95.23 |    98.27 |     100 |   95.23 | 117-120           
  gradientUtils.ts |     100 |      100 |     100 |     100 |                   
  highlight.ts     |     100 |      100 |     100 |     100 |                   
  ...oryMapping.ts |     100 |    94.28 |     100 |     100 | 35,57             
  historyUtils.ts  |   94.11 |       94 |     100 |   94.11 | 94-97             
  isNarrowWidth.ts |     100 |      100 |     100 |     100 |                   
  ...olDetector.ts |    8.23 |      100 |       0 |    8.23 | ...31-132,135-136 
  latexRenderer.ts |   94.95 |     73.8 |     100 |   94.95 | ...76-178,184-187 
  layoutUtils.ts   |     100 |      100 |     100 |     100 |                   
  ...ightLoader.ts |     100 |    89.47 |     100 |     100 | 81,110            
  ...nUtilities.ts |   69.84 |    85.71 |     100 |   69.84 | 75-91,100-101     
  ...ToolGroups.ts |   98.66 |    96.77 |     100 |   98.66 | 48-49             
  ...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                
  osc8.ts          |   94.73 |    87.75 |     100 |   94.73 | ...49,434,438-439 
  ...mConstants.ts |     100 |      100 |     100 |     100 |                   
  restoreGoal.ts   |   98.98 |    97.05 |     100 |   98.98 | 98                
  ...storyUtils.ts |   61.89 |    69.87 |      90 |   61.89 | ...76,424,429-451 
  ...ickerUtils.ts |     100 |      100 |     100 |     100 |                   
  ...izedOutput.ts |   94.94 |      100 |   88.88 |   94.94 | 112-117           
  ...wOptimizer.ts |     100 |    96.77 |     100 |     100 | 69                
  terminalSetup.ts |    4.37 |      100 |       0 |    4.37 | 44-393            
  textUtils.ts     |   97.61 |    94.84 |   92.85 |   97.61 | ...50-251,386-387 
  todoSnapshot.ts  |   89.11 |    93.33 |     100 |   89.11 | ...,66-78,180-181 
  updateCheck.ts   |     100 |    80.95 |     100 |     100 | 30-42             
 ...i/utils/export |   56.77 |     40.8 |   79.41 |   56.77 |                   
  collect.ts       |   55.92 |    50.58 |   86.36 |   55.92 | ...25-640,642-647 
  index.ts         |     100 |      100 |     100 |     100 |                   
  normalize.ts     |   57.47 |    20.51 |      80 |   57.47 | ...09-310,324-359 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
  utils.ts         |      40 |      100 |       0 |      40 | 11-13             
 ...ort/formatters |    3.38 |      100 |       0 |    3.38 |                   
  html.ts          |    9.61 |      100 |       0 |    9.61 | ...28,34-76,82-84 
  json.ts          |      50 |      100 |       0 |      50 | 14-15             
  jsonl.ts         |     3.5 |      100 |       0 |     3.5 | 14-76             
  markdown.ts      |    0.94 |      100 |       0 |    0.94 | 13-295            
 src/utils         |   77.05 |    90.07 |   93.93 |   77.05 |                   
  acpModelUtils.ts |     100 |      100 |     100 |     100 |                   
  apiPreconnect.ts |   96.72 |    97.14 |     100 |   96.72 | 165-168           
  checks.ts        |   33.33 |      100 |       0 |   33.33 | 23-28             
  cleanup.ts       |   84.12 |    93.33 |      80 |   84.12 | 75,106-115        
  commands.ts      |     100 |      100 |     100 |     100 |                   
  commentJson.ts   |   87.17 |     90.9 |     100 |   87.17 | 64-73             
  ...Calculator.ts |     100 |      100 |     100 |     100 |                   
  deepMerge.ts     |     100 |       90 |     100 |     100 | 41-43,49          
  ...ScopeUtils.ts |   97.56 |    88.88 |     100 |   97.56 | 67                
  doctorChecks.ts  |   70.98 |       75 |     100 |   70.98 | ...95-301,325-341 
  ...putCapture.ts |   90.65 |    86.17 |     100 |   90.65 | ...72,370,372-373 
  ...arResolver.ts |   94.28 |       88 |     100 |   94.28 | 28-29,125-126     
  errors.ts        |   90.85 |    96.36 |    92.3 |   90.85 | 69-70,298-310     
  events.ts        |     100 |      100 |     100 |     100 |                   
  gitUtils.ts      |   91.91 |    84.61 |     100 |   91.91 | 78-81,124-127     
  ...AutoUpdate.ts |   90.76 |    93.33 |   88.88 |   90.76 | 103-114           
  ...tyWarnings.ts |     100 |      100 |     100 |     100 |                   
  ...lationInfo.ts |     100 |      100 |     100 |     100 |                   
  languageUtils.ts |   97.89 |    96.42 |     100 |   97.89 | 132-133           
  math.ts          |       0 |        0 |       0 |       0 | 1-15              
  ...iagnostics.ts |   94.57 |    83.01 |   88.88 |   94.57 | ...05,311,315-317 
  ...onfigUtils.ts |     100 |      100 |     100 |     100 |                   
  ...iveHelpers.ts |   96.79 |    93.28 |     100 |   96.79 | ...76-477,575,588 
  osc.ts           |    97.5 |      100 |   88.88 |    97.5 | 195-196           
  package.ts       |   88.88 |       80 |     100 |   88.88 | 33-34             
  processUtils.ts  |     100 |      100 |     100 |     100 |                   
  readStdin.ts     |   79.62 |       90 |      80 |   79.62 | 33-40,52-54       
  relaunch.ts      |   98.07 |    76.92 |     100 |   98.07 | 70                
  resolvePath.ts   |   66.66 |       25 |     100 |   66.66 | 12-13,16,18-19    
  runBudget.ts     |   99.35 |    96.77 |     100 |   99.35 | 119               
  sandbox.ts       |       0 |        0 |       0 |       0 | 1-1047            
  sessionPaths.ts  |   90.84 |    90.56 |     100 |   90.84 | ...81-182,185-186 
  settingsUtils.ts |   82.51 |    91.66 |   89.74 |   82.51 | ...76-694,701-709 
  spawnWrapper.ts  |     100 |      100 |     100 |     100 |                   
  ...upProfiler.ts |   98.46 |    94.52 |     100 |   98.46 | 130-131,305       
  ...upWarnings.ts |     100 |      100 |     100 |     100 |                   
  stdioHelpers.ts  |     100 |       60 |     100 |     100 | 23,32             
  systemInfo.ts    |   95.12 |    89.06 |     100 |   95.12 | ...43-244,249-253 
  ...InfoFields.ts |    87.5 |       65 |     100 |    87.5 | ...24-125,146-147 
  ...iffPreview.ts |   94.11 |    83.33 |     100 |   94.11 | 13                
  ...entEmitter.ts |     100 |      100 |     100 |     100 |                   
  ...upWarnings.ts |   91.17 |    82.35 |     100 |   91.17 | 67-68,73-74,77-78 
  version.ts       |     100 |       50 |     100 |     100 | 11                
  windowTitle.ts   |     100 |      100 |     100 |     100 |                   
  ...WithBackup.ts |   63.15 |    81.25 |     100 |   63.15 | 93,118-157        
-------------------|---------|----------|---------|---------|-------------------
Core Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   80.18 |    83.04 |   82.43 |   80.18 |                   
 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        |   88.06 |    79.77 |   92.13 |   88.06 |                   
  ...transcript.ts |   92.25 |    85.71 |     100 |   92.25 | ...87,306-307,438 
  ...ent-resume.ts |    82.8 |    71.63 |   77.41 |    82.8 | ...1059-1063,1066 
  ...ound-tasks.ts |   95.76 |    87.57 |     100 |   95.76 | ...26-827,898-899 
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/agents/arena  |   76.54 |    66.87 |   78.72 |   76.54 |                   
  ...gentClient.ts |   79.47 |    88.88 |   81.81 |   79.47 | ...68-183,189-204 
  ArenaManager.ts  |   75.37 |    63.37 |   78.26 |   75.37 | ...1860,1866-1867 
  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 |   76.29 |    86.15 |   73.04 |   76.29 |                   
  ITermBackend.ts  |   97.97 |    93.93 |     100 |   97.97 | ...78-180,255,307 
  ...essBackend.ts |   91.25 |    90.62 |   86.66 |   91.25 | ...94,249-269,328 
  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 |   81.15 |     76.7 |   71.42 |   81.15 |                   
  agent-context.ts |     100 |      100 |     100 |     100 |                   
  agent-core.ts    |   76.51 |    72.35 |   60.86 |   76.51 | ...1609,1636-1683 
  agent-events.ts  |     100 |      100 |     100 |     100 |                   
  ...t-headless.ts |   81.19 |    71.73 |   60.86 |   81.19 | ...98-399,402-403 
  ...nteractive.ts |   79.71 |    79.62 |      75 |   79.71 | ...54,456,458,461 
  ...statistics.ts |   98.19 |    82.35 |     100 |   98.19 | 127,151,192,225   
  agent-types.ts   |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/agents/tasks  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/config        |    78.4 |    82.24 |   65.07 |    78.4 |                   
  config.ts        |   76.28 |    81.09 |   60.43 |   76.28 | ...3869,3880-3892 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  models.ts        |     100 |      100 |     100 |     100 |                   
  storage.ts       |   95.01 |     90.9 |   90.47 |   95.01 | ...71-372,375-376 
 ...nfirmation-bus |   98.29 |    97.14 |     100 |   98.29 |                   
  message-bus.ts   |   98.14 |    97.05 |     100 |   98.14 | 42-43             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/core          |   87.87 |    83.53 |   92.07 |   87.87 |                   
  baseLlmClient.ts |   87.24 |    76.47 |    87.5 |   87.24 | ...82,484-494,503 
  client.ts        |   87.42 |    80.57 |   86.36 |   87.42 | ...2072,2111-2114 
  ...tGenerator.ts |    72.1 |    61.11 |     100 |    72.1 | ...63,365,372-375 
  ...lScheduler.ts |   85.36 |    82.08 |   94.73 |   85.36 | ...3209,3270-3281 
  geminiChat.ts    |   91.04 |    87.25 |   97.22 |   91.04 | ...2703,2770-2771 
  geminiRequest.ts |     100 |      100 |     100 |     100 |                   
  ...htProtocol.ts |    9.09 |      100 |       0 |    9.09 | 34-42,45-49,52-87 
  logger.ts        |   87.33 |    87.02 |     100 |   87.33 | ...61-565,611-625 
  ...tyDefaults.ts |     100 |      100 |     100 |     100 |                   
  ...olExecutor.ts |   92.59 |       75 |      50 |   92.59 | 41-42             
  ...on-helpers.ts |   86.48 |    72.22 |     100 |   86.48 | ...97-198,212-221 
  ...issionFlow.ts |   98.59 |       95 |     100 |   98.59 | 93                
  prompts.ts       |   89.24 |    86.41 |   76.92 |   89.24 | ...-972,1175-1176 
  tokenLimits.ts   |     100 |    89.47 |     100 |     100 | 51-52             
  ...okTriggers.ts |   99.33 |    90.47 |     100 |   99.33 | 156,167           
  turn.ts          |   96.46 |    88.88 |     100 |   96.46 | ...21,434-435,483 
 ...ntentGenerator |   94.93 |    82.59 |   93.87 |   94.93 |                   
  ...tGenerator.ts |   96.49 |    84.28 |   92.59 |   96.49 | ...04,922-926,966 
  converter.ts     |   94.51 |    80.72 |     100 |   94.51 | ...06-607,617,823 
  index.ts         |       0 |        0 |       0 |       0 | 1-21              
  usage.ts         |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   91.53 |    71.64 |   93.33 |   91.53 |                   
  ...tGenerator.ts |      90 |    70.96 |   92.85 |      90 | ...80-286,304-305 
  index.ts         |     100 |       80 |     100 |     100 | 50                
 ...ntentGenerator |   93.86 |    82.98 |    90.9 |   93.86 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |   93.72 |    81.27 |   90.32 |   93.72 | ...29,939-940,968 
  ...tDetection.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   81.75 |    84.38 |    90.9 |   81.75 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  converter.ts     |   76.88 |    82.25 |    87.5 |   76.88 | ...1589,1610-1616 
  errorHandler.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |   54.54 |    68.75 |      50 |   54.54 | ...79,87-91,95-99 
  ...tGenerator.ts |    66.4 |    70.58 |   88.88 |    66.4 | ...51-157,168-169 
  pipeline.ts      |    93.8 |    85.45 |     100 |    93.8 | ...81-482,490,558 
  ...ureContext.ts |     100 |      100 |     100 |     100 |                   
  ...ingOptions.ts |       0 |        0 |       0 |       0 | 1                 
  ...CallParser.ts |   90.66 |    88.57 |     100 |   90.66 | ...15-319,349-350 
  ...kingParser.ts |     100 |    96.87 |     100 |     100 | 42                
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...rator/provider |   96.67 |    88.42 |   96.07 |   96.67 |                   
  dashscope.ts     |   97.38 |    90.21 |   93.33 |   97.38 | ...93-294,370-371 
  deepseek.ts      |   94.91 |    89.36 |     100 |   94.91 | ...31-132,145-146 
  default.ts       |   95.79 |    89.65 |   88.88 |   95.79 | 122-123,193-195   
  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 |                   
  openrouter.ts    |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 |                   
  utils.ts         |     100 |      100 |     100 |     100 |                   
 src/extension     |   62.19 |    79.05 |   80.31 |   62.19 |                   
  ...-converter.ts |    65.2 |    49.58 |     100 |    65.2 | ...90-791,800-832 
  ...ionManager.ts |   47.05 |    82.19 |    65.9 |   47.05 | ...1400,1410-1429 
  ...onSettings.ts |   93.46 |    93.05 |     100 |   93.46 | ...17-221,228-232 
  ...-converter.ts |   54.88 |    94.44 |      60 |   54.88 | ...35-146,158-192 
  github.ts        |   46.41 |     87.3 |   63.63 |   46.41 | ...68-374,413-466 
  index.ts         |     100 |      100 |     100 |     100 |                   
  marketplace.ts   |   97.31 |    93.75 |     100 |   97.31 | ...65,185-186,275 
  npm.ts           |   59.01 |    71.69 |    87.5 |   59.01 | ...23-425,432-436 
  override.ts      |   94.11 |    88.88 |     100 |   94.11 | 63-64,81-82       
  redaction.ts     |     100 |      100 |     100 |     100 |                   
  settings.ts      |   66.26 |      100 |      50 |   66.26 | 81-108,143-149    
  storage.ts       |     100 |      100 |     100 |     100 |                   
  ...ableSchema.ts |     100 |      100 |     100 |     100 |                   
  variables.ts     |   88.75 |    83.33 |     100 |   88.75 | ...28-231,234-237 
 src/followup      |   55.57 |    84.14 |   81.25 |   55.57 |                   
  followupState.ts |      96 |    89.74 |     100 |      96 | 159-161,218-219   
  index.ts         |     100 |      100 |     100 |     100 |                   
  overlayFs.ts     |   95.06 |       84 |     100 |   95.06 | 78,108,122,133    
  speculation.ts   |   13.02 |      100 |   16.66 |   13.02 | 89-464,524-575    
  ...onToolGate.ts |     100 |    96.42 |     100 |     100 | 94                
  ...nGenerator.ts |    71.6 |    72.13 |   83.33 |    71.6 | ...88-246,316-318 
 src/generated     |       0 |        0 |       0 |       0 |                   
  git-commit.ts    |       0 |        0 |       0 |       0 | 1-10              
 src/goals         |   89.57 |    83.45 |   94.44 |   89.57 |                   
  ...eGoalStore.ts |    85.1 |    95.45 |   84.61 |    85.1 | ...63-166,174-182 
  goalHook.ts      |   97.26 |    91.48 |     100 |   97.26 | 100-105           
  goalJudge.ts     |   84.33 |    74.28 |     100 |   84.33 | ...57-358,366-368 
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/hooks         |   83.65 |    85.46 |   86.88 |   83.65 |                   
  ...okRegistry.ts |   86.48 |    77.08 |     100 |   86.48 | ...41-344,362-369 
  ...bortSignal.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.4 |    90.78 |     100 |    96.4 | ...91,293-294,367 
  ...entHandler.ts |    94.6 |    86.07 |   93.33 |    94.6 | ...42,799-800,810 
  hookPlanner.ts   |   88.19 |       85 |    90.9 |   88.19 | ...68-170,188-199 
  hookRegistry.ts  |   90.17 |    83.33 |     100 |   90.17 | ...33,352,356,360 
  hookRunner.ts    |   58.56 |    71.26 |   66.66 |   58.56 | ...48-749,758-759 
  hookSystem.ts    |   84.57 |      100 |   65.85 |   84.57 | ...21-622,628-629 
  ...HookRunner.ts |   75.51 |     61.9 |      80 |   75.51 | ...05-406,424-425 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...HookRunner.ts |   93.63 |    89.47 |      90 |   93.63 | ...45-353,427-428 
  ...SkillHooks.ts |   78.75 |       75 |   66.66 |   78.75 | 62-66,137-152     
  ...oksManager.ts |   96.66 |    91.66 |     100 |   96.66 | ...90,209-210,223 
  ssrfGuard.ts     |   77.22 |    85.36 |     100 |   77.22 | ...57,261-267,273 
  stopHookCap.ts   |     100 |      100 |     100 |     100 |                   
  trustedHooks.ts  |       0 |        0 |       0 |       0 | 1-124             
  types.ts         |   91.21 |    92.13 |   85.71 |   91.21 | ...40-441,501-505 
  urlValidator.ts  |     100 |      100 |     100 |     100 |                   
 src/ide           |   74.28 |    83.39 |   78.33 |   74.28 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  detect-ide.ts    |     100 |      100 |     100 |     100 |                   
  ide-client.ts    |    64.2 |    81.48 |   66.66 |    64.2 | ...9-970,999-1007 
  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           |   41.24 |    52.14 |   51.42 |   41.24 |                   
  ...nfigLoader.ts |   70.27 |    35.89 |   94.73 |   70.27 | ...20-422,426-432 
  ...ionFactory.ts |   42.69 |    79.16 |      50 |   42.69 | ...62-413,419-436 
  ...Normalizer.ts |   23.09 |    13.72 |   30.43 |   23.09 | ...04-905,909-924 
  ...verManager.ts |   25.31 |    62.06 |   41.66 |   25.31 | ...85-704,710-740 
  ...eLspClient.ts |   32.77 |       80 |   17.64 |   32.77 | ...84-288,294-295 
  ...LspService.ts |   48.49 |    67.16 |   65.71 |   48.49 | ...1352,1369-1379 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/mcp           |   78.69 |    75.34 |   75.92 |   78.69 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...h-provider.ts |   86.95 |      100 |   33.33 |   86.95 | ...,93,97,101-102 
  ...h-provider.ts |   73.82 |    53.92 |     100 |   73.82 | ...88-895,902-904 
  ...en-storage.ts |   98.62 |    97.72 |     100 |   98.62 | 87-88             
  oauth-utils.ts   |   70.58 |    85.29 |    90.9 |   70.58 | ...70-290,315-344 
  ...n-provider.ts |   89.83 |    95.83 |   45.45 |   89.83 | ...43,147,151-152 
 .../token-storage |   79.52 |    86.66 |   86.36 |   79.52 |                   
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   82.87 |    82.35 |   92.85 |   82.87 | ...63-173,181-182 
  ...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        |   68.01 |    76.27 |   66.66 |   68.01 |                   
  const.ts         |     100 |      100 |     100 |     100 |                   
  dream.ts         |   65.65 |    73.33 |      50 |   65.65 | 50,107-148        
  ...entPlanner.ts |   57.84 |    72.72 |   33.33 |   57.84 | ...35,140-147,152 
  entries.ts       |   63.77 |    79.16 |      50 |   63.77 | ...72-180,183-189 
  extract.ts       |    95.2 |    79.16 |     100 |    95.2 | 81-86,125         
  ...entPlanner.ts |   63.08 |    65.71 |   41.17 |   63.08 | ...17,222-223,332 
  ...ionPlanner.ts |       0 |        0 |       0 |       0 | 1                 
  forget.ts        |    45.8 |    61.53 |   44.44 |    45.8 | ...04,211,214-346 
  indexer.ts       |   83.87 |    45.45 |     100 |   83.87 | ...50,56-57,69-70 
  manager.ts       |   75.31 |    81.04 |    75.6 |   75.31 | ...1278,1291-1293 
  memoryAge.ts     |   90.47 |    77.77 |     100 |   90.47 | 50-51             
  paths.ts         |   55.47 |    89.47 |   85.71 |   55.47 | ...,89-90,106-114 
  prompt.ts        |   93.36 |    71.42 |     100 |   93.36 | ...58,161,228-229 
  recall.ts        |   77.54 |    69.38 |   88.88 |   77.54 | ...53-258,282-293 
  ...ceSelector.ts |   91.86 |    77.27 |     100 |   91.86 | ...15,117-118,126 
  scan.ts          |   87.91 |    68.42 |     100 |   87.91 | ...47-48,58,82-87 
  ...entPlanner.ts |    11.5 |      100 |       0 |    11.5 | ...57-192,210-298 
  status.ts        |   10.52 |      100 |       0 |   10.52 | 41-98             
  store.ts         |   94.44 |    83.33 |     100 |   94.44 | 56-57,92-93       
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ontextFile.ts |   79.38 |    78.33 |   81.81 |   79.38 | ...58-272,286-291 
 src/mocks         |       0 |        0 |       0 |       0 |                   
  msw.ts           |       0 |        0 |       0 |       0 | 1-9               
 src/models        |   89.35 |    86.14 |    87.5 |   89.35 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...tor-config.ts |   90.24 |    91.42 |     100 |   90.24 | 142,148,151-160   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nfigErrors.ts |   74.22 |    47.82 |   84.61 |   74.22 | ...,67-74,106-117 
  ...igResolver.ts |   98.66 |    92.85 |     100 |   98.66 | 162,324,330       
  modelRegistry.ts |     100 |    98.59 |     100 |     100 | 222               
  modelsConfig.ts  |   84.57 |    82.14 |   81.57 |   84.57 | ...1223,1252-1253 
  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   |   74.62 |    88.85 |   58.28 |   74.62 |                   
  autoMode.ts      |   61.59 |    93.54 |   83.33 |   61.59 | ...00-238,340-356 
  ...transcript.ts |      98 |       84 |     100 |      98 | 200-201           
  classifier.ts    |   92.89 |     87.5 |     100 |   92.89 | 146-153,333-337   
  ...erousRules.ts |     100 |    89.36 |     100 |     100 | 110,133,147,175   
  ...alTracking.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...on-manager.ts |    78.3 |    85.24 |   82.14 |    78.3 | ...-917,1023-1027 
  rule-parser.ts   |   96.06 |    93.22 |     100 |   96.06 | ...-875,1024-1026 
  ...-semantics.ts |   58.28 |    85.27 |    30.2 |   58.28 | ...1604-1614,1643 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...sifier-prompts |   98.18 |       90 |     100 |   98.18 |                   
  system-prompt.ts |   98.18 |       90 |     100 |   98.18 | 150               
 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     |   77.46 |    70.94 |   60.71 |   77.46 |                   
  all-providers.ts |      68 |      100 |       0 |      68 | 68-69,73-79,83-89 
  index.ts         |     100 |      100 |     100 |     100 |                   
  install.ts       |   98.87 |    87.27 |     100 |   98.87 | 268-269           
  ...der-config.ts |   66.11 |    55.93 |   63.15 |   66.11 | ...08-409,416-425 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...viders/presets |   97.12 |    86.36 |      50 |   97.12 |                   
  ...oding-plan.ts |   87.17 |      100 |       0 |   87.17 | 81-83,86-88,90-93 
  ...a-standard.ts |     100 |      100 |     100 |     100 |                   
  ...token-plan.ts |     100 |      100 |     100 |     100 |                   
  ...m-provider.ts |   97.01 |    81.25 |      75 |   97.01 | 120-121           
  deepseek.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 |                   
  zai.ts           |     100 |      100 |     100 |     100 |                   
 src/qwen          |   83.87 |    77.46 |   95.83 |   83.87 |                   
  ...tGenerator.ts |   98.64 |    98.18 |     100 |   98.64 | 105-106           
  qwenOAuth2.ts    |   80.85 |    70.74 |   90.32 |   80.85 | ...1169-1185,1215 
  ...kenManager.ts |   83.76 |    76.22 |     100 |   83.76 | ...62-767,788-793 
 src/services      |   85.63 |    83.47 |   91.37 |   85.63 |                   
  ...ionTrailer.ts |     100 |      100 |     100 |     100 |                   
  ...llRegistry.ts |   98.44 |    91.83 |     100 |   98.44 | 268-269           
  ...ionService.ts |   98.44 |    97.45 |     100 |   98.44 | 536,538-542       
  ...ingService.ts |   83.88 |    83.33 |   83.33 |   83.88 | ...1266,1283-1284 
  ...ttribution.ts |   91.73 |    87.71 |      90 |   91.73 | ...80-685,826-827 
  ...utSlimming.ts |     100 |    96.77 |     100 |     100 | 139,188           
  cronScheduler.ts |   97.56 |    92.98 |     100 |   97.56 | 62-63,77,155      
  ...eryService.ts |   80.43 |    95.45 |      75 |   80.43 | ...19-134,140-141 
  ...oryService.ts |   86.18 |    76.76 |   91.17 |   86.18 | ...1150,1191-1194 
  fileReadCache.ts |     100 |      100 |     100 |     100 |                   
  ...temService.ts |   91.27 |    82.69 |    90.9 |   91.27 | ...94,196,294-301 
  ...ratedFiles.ts |      96 |    88.23 |     100 |      96 | 119-120,146-147   
  gitInit.ts       |     100 |      100 |     100 |     100 |                   
  gitService.ts    |   68.75 |     92.3 |   55.55 |   68.75 | ...12-122,125-129 
  ...reeService.ts |   73.83 |    69.31 |    97.5 |   73.83 | ...1460,1488-1489 
  ...ionService.ts |   98.13 |     97.8 |   95.45 |   98.13 | ...32-333,380-381 
  ...orRegistry.ts |   96.54 |    91.73 |     100 |   96.54 | ...70-471,622-623 
  sessionRecap.ts  |   12.65 |      100 |       0 |   12.65 | 44-150            
  ...ionService.ts |   90.47 |     79.2 |   96.87 |   90.47 | ...1324,1328-1329 
  sessionTitle.ts  |   93.87 |    71.15 |     100 |   93.87 | ...33-236,267-268 
  ...ionService.ts |   81.07 |    77.92 |   89.28 |   81.07 | ...1923,1929-1934 
  ...Estimation.ts |     100 |      100 |     100 |     100 |                   
  ...UseSummary.ts |   94.63 |    88.46 |     100 |   94.63 | ...62-164,214-215 
  ...reeCleanup.ts |   14.56 |      100 |   33.33 |   14.56 | 58-185            
  ...ionService.ts |   84.21 |    79.41 |     100 |   84.21 | ...22-223,239-240 
 ...icrocompaction |   98.05 |     91.8 |     100 |   98.05 |                   
  microcompact.ts  |   98.05 |     91.8 |     100 |   98.05 | ...19,289,293,391 
 src/skills        |   88.34 |    85.29 |   94.54 |   88.34 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...activation.ts |     100 |     93.1 |     100 |     100 | 93,112            
  skill-load.ts    |      94 |    86.56 |     100 |      94 | ...08,228,240-242 
  skill-manager.ts |   84.26 |    80.87 |   90.32 |   84.26 | ...1155,1162-1166 
  skill-paths.ts   |   86.74 |    77.77 |     100 |   86.74 | ...00-101,106-107 
  symlinkScope.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/subagents     |   82.61 |    78.89 |   95.23 |   82.61 |                   
  ...tin-agents.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nt-manager.ts |   77.15 |    71.36 |    93.1 |   77.15 | ...1178,1200-1201 
  types.ts         |     100 |      100 |     100 |     100 |                   
  validation.ts    |   92.46 |    95.18 |     100 |   92.46 | 51-56,69-74,78-83 
 src/telemetry     |   76.84 |    88.32 |   79.86 |   76.84 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...attributes.ts |   98.13 |       88 |     100 |   98.13 | 185-187           
  ...-exporters.ts |   46.37 |      100 |   44.44 |   46.37 | ...85,88-89,92-93 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-111             
  ...-processor.ts |   93.93 |    90.21 |   94.11 |   93.93 | ...75-280,299-300 
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-128             
  loggers.ts       |    51.9 |       64 |   57.77 |    51.9 | ...1214,1231-1251 
  metrics.ts       |   75.03 |    82.95 |   74.54 |   75.03 | ...8-988,991-1002 
  ...attributes.ts |     100 |      100 |     100 |     100 |                   
  sanitize.ts      |      80 |    83.33 |     100 |      80 | 35-36,41-42       
  sdk.ts           |   93.01 |    88.23 |   80.95 |   93.01 | ...58-559,579-583 
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...on-tracing.ts |   92.75 |    88.26 |     100 |   92.75 | ...27-930,934-937 
  ...etry-utils.ts |     100 |      100 |     100 |     100 |                   
  ...l-decision.ts |     100 |      100 |     100 |     100 |                   
  ...e-id-utils.ts |     100 |      100 |     100 |     100 |                   
  tracer.ts        |   98.61 |    89.36 |     100 |   98.61 | 53,108            
  types.ts         |   79.17 |    94.49 |   83.33 |   79.17 | ...1149,1152-1181 
  uiTelemetry.ts   |   92.97 |    96.96 |   81.25 |   92.97 | ...93-194,200-207 
 ...ry/qwen-logger |   68.24 |    79.56 |   64.91 |   68.24 |                   
  event-types.ts   |       0 |        0 |       0 |       0 |                   
  qwen-logger.ts   |   68.24 |    79.34 |   64.28 |   68.24 | ...1055,1093-1094 
 src/test-utils    |   93.16 |    95.91 |   76.47 |   93.16 |                   
  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     |   91.19 |    97.14 |   72.41 |   91.19 | ...38,202-203,216 
  ...aceContext.ts |     100 |      100 |     100 |     100 |                   
 src/tools         |   78.94 |    81.46 |   85.71 |   78.94 |                   
  ...erQuestion.ts |   88.93 |    76.74 |    90.9 |   88.93 | ...39-340,347-348 
  cron-create.ts   |   88.11 |    88.88 |    62.5 |   88.11 | ...,43-44,165-172 
  cron-delete.ts   |   96.82 |      100 |   83.33 |   96.82 | 26-27             
  cron-list.ts     |   96.66 |      100 |   83.33 |   96.66 | 25-26             
  diffOptions.ts   |     100 |      100 |     100 |     100 |                   
  edit.ts          |   81.02 |    84.07 |      75 |   81.02 | ...15-716,826-876 
  ...r-worktree.ts |   82.95 |    67.56 |    87.5 |   82.95 | ...82-185,276-277 
  exit-worktree.ts |   84.23 |    85.96 |   91.66 |   84.23 | ...92-293,298-312 
  exitPlanMode.ts  |   85.09 |    85.71 |     100 |   85.09 | ...60-163,177-189 
  glob.ts          |   90.63 |    88.33 |   84.61 |   90.63 | ...28,171,302,305 
  grep.ts          |   79.19 |    85.71 |   78.94 |   79.19 | ...20,560,569-576 
  ls.ts            |   96.74 |    90.27 |     100 |   96.74 | 176-181,212,216   
  lsp.ts           |   72.77 |    60.09 |   90.32 |   72.77 | ...1211,1213-1214 
  ...nt-manager.ts |   84.36 |    82.74 |   84.21 |   84.36 | ...2099-2103,2142 
  mcp-client.ts    |   33.18 |    77.65 |   66.66 |   33.18 | ...1490,1494-1497 
  mcp-tool.ts      |   90.98 |    88.88 |   96.42 |   90.98 | ...95-596,646-647 
  memory-config.ts |       0 |        0 |       0 |       0 | 1-47              
  ...iable-tool.ts |     100 |    84.61 |     100 |     100 | 102,109           
  monitor.ts       |   91.36 |    83.94 |   88.46 |   91.36 | ...61,574,770-775 
  notebook-edit.ts |   85.11 |    76.42 |   81.25 |   85.11 | ...54-870,916-917 
  ...nforcement.ts |   82.57 |       90 |     100 |   82.57 | 174-185,234-247   
  read-file.ts     |    95.4 |    90.32 |      90 |    95.4 | ...99,298-301,304 
  ripGrep.ts       |   94.59 |    85.71 |   93.33 |   94.59 | ...60,463,541-542 
  ...-transport.ts |    6.34 |      100 |       0 |    6.34 | 47-145            
  send-message.ts  |   84.68 |    91.66 |    62.5 |   84.68 | ...,82-90,167-170 
  shell.ts         |   73.05 |    79.66 |   91.42 |   73.05 | ...4216,4265-4271 
  skill-utils.ts   |     100 |      100 |     100 |     100 |                   
  skill.ts         |   88.35 |    91.42 |   86.66 |   88.35 | ...12,416,439-461 
  ...eticOutput.ts |   95.12 |      100 |      80 |   95.12 | 87-88             
  task-stop.ts     |   93.14 |    96.15 |   85.71 |   93.14 | 39-40,54-64       
  todoWrite.ts     |   89.17 |    82.05 |   92.85 |   89.17 | ...41-546,568-569 
  tool-error.ts    |     100 |      100 |     100 |     100 |                   
  tool-names.ts    |     100 |      100 |     100 |     100 |                   
  tool-registry.ts |   74.85 |    76.85 |   80.95 |   74.85 | ...30-831,839-840 
  tool-search.ts   |   95.19 |    86.48 |    92.3 |   95.19 | ...47-153,208-213 
  tools.ts         |   90.49 |    90.19 |   84.21 |   90.49 | ...78-479,495-501 
  web-fetch.ts     |   88.84 |       80 |   92.85 |   88.84 | ...12-313,315-316 
  write-file.ts    |   82.65 |    80.45 |   84.61 |   82.65 | ...65-668,696-731 
 src/tools/agent   |   75.07 |    80.49 |   73.61 |   75.07 |                   
  agent.ts         |   75.33 |    80.72 |   74.24 |   75.33 | ...2474,2483-2486 
  fork-subagent.ts |   69.62 |    71.42 |   66.66 |   69.62 | ...04-105,140-151 
 src/utils         |   89.06 |    87.52 |   93.51 |   89.06 |                   
  LruCache.ts      |       0 |        0 |       0 |       0 | 1-41              
  ...ssageQueue.ts |     100 |      100 |     100 |     100 |                   
  ...cFileWrite.ts |   77.96 |    80.48 |     100 |   77.96 | ...35,156,173-176 
  bareMode.ts      |   27.27 |      100 |       0 |   27.27 | 9-15,18-19        
  browser.ts       |    7.69 |      100 |       0 |    7.69 | 17-56             
  bundlePaths.ts   |     100 |      100 |     100 |     100 |                   
  ...igResolver.ts |     100 |      100 |     100 |     100 |                   
  ...engthError.ts |   89.11 |     87.5 |     100 |   89.11 | ...28-129,132-133 
  cronDisplay.ts   |   42.85 |    23.07 |     100 |   42.85 | 26-31,33-45,47-54 
  cronParser.ts    |   89.74 |    85.71 |     100 |   89.74 | ...,63-64,183-186 
  debugLogger.ts   |    95.9 |    93.93 |   94.73 |    95.9 | 106-107,214-218   
  editHelper.ts    |   93.63 |    83.52 |     100 |   93.63 | ...28-429,463-464 
  editor.ts        |    97.6 |     95.4 |     100 |    97.6 | ...25-326,328-329 
  ...arResolver.ts |   94.28 |    88.88 |     100 |   94.28 | 28-29,125-126     
  ...entContext.ts |     100 |    95.45 |     100 |     100 | 83                
  errorParsing.ts  |    97.7 |    97.05 |     100 |    97.7 | 72-73             
  ...rReporting.ts |   88.46 |       90 |     100 |   88.46 | 69-74             
  errors.ts        |   70.54 |    79.59 |      50 |   70.54 | ...15-231,235-241 
  fetch.ts         |   70.18 |    71.42 |   71.42 |   70.18 | ...42,148,161,186 
  fileUtils.ts     |    91.5 |    86.25 |   95.23 |    91.5 | ...1191,1195-1201 
  forkedAgent.ts   |   80.68 |    78.12 |   83.33 |   80.68 | ...39-545,550-556 
  formatters.ts    |   81.81 |       75 |     100 |   81.81 | 15-16             
  ...eUtilities.ts |   89.21 |    86.66 |     100 |   89.21 | 16-17,49-55,65-66 
  ...rStructure.ts |   94.36 |    94.28 |     100 |   94.36 | ...17-120,330-335 
  getPty.ts        |    12.5 |      100 |       0 |    12.5 | 21-34             
  gitDiff.ts       |   92.36 |    79.53 |     100 |   92.36 | ...55-856,928-929 
  ...noreParser.ts |    92.3 |    89.36 |     100 |    92.3 | ...15-116,186-187 
  gitUtils.ts      |   73.64 |    90.32 |   83.33 |   73.64 | ...,78-79,103-154 
  iconvHelper.ts   |     100 |      100 |     100 |     100 |                   
  ...rePatterns.ts |     100 |      100 |     100 |     100 |                   
  ...ionManager.ts |     100 |     90.9 |     100 |     100 | 26                
  ...lPromptIds.ts |     100 |      100 |     100 |     100 |                   
  jsonl-utils.ts   |    74.1 |    90.76 |   58.33 |    74.1 | ...23-326,336-342 
  ...-detection.ts |     100 |      100 |     100 |     100 |                   
  ...iagnostics.ts |    96.4 |     90.9 |     100 |    96.4 | ...66,293-294,376 
  ...yDiscovery.ts |   88.27 |    83.87 |     100 |   88.27 | ...76,279,407-410 
  ...tProcessor.ts |    93.2 |    89.18 |     100 |    93.2 | ...82-288,370-371 
  ...Inspectors.ts |   61.53 |      100 |      50 |   61.53 | 18-23             
  modelId.ts       |   98.95 |    98.21 |     100 |   98.95 | 148               
  ...kerChecker.ts |   90.78 |    91.66 |     100 |   90.78 | 73-79             
  notebook.ts      |   94.57 |    89.83 |   95.83 |   94.57 | ...21,333,385-387 
  openaiLogger.ts  |   90.85 |    87.87 |     100 |   90.85 | ...97-199,222-227 
  partUtils.ts     |     100 |    98.61 |     100 |     100 | 206               
  pathReader.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |   93.21 |    91.86 |     100 |   93.21 | ...89-390,392-394 
  pdf.ts           |   93.68 |    87.05 |     100 |   93.68 | ...96-297,321-325 
  projectPath.ts   |     100 |      100 |     100 |     100 |                   
  projectRoot.ts   |   71.73 |    78.57 |     100 |   71.73 | 54-66             
  ...ectSummary.ts |   89.39 |    72.41 |     100 |   89.39 | ...37-142,193-196 
  ...tIdContext.ts |     100 |      100 |     100 |     100 |                   
  proxyUtils.ts    |     100 |      100 |     100 |     100 |                   
  ...rDetection.ts |   58.57 |       76 |     100 |   58.57 | ...4,88-89,95-100 
  ...noreParser.ts |   85.45 |    85.18 |     100 |   85.45 | ...59,65-66,72-73 
  rateLimit.ts     |   92.55 |    85.92 |     100 |   92.55 | ...70-272,309-310 
  readManyFiles.ts |   87.59 |       84 |     100 |   87.59 | ...09-211,227-238 
  retry.ts         |   89.81 |    88.05 |     100 |   89.81 | ...29,350,357-358 
  ripgrepUtils.ts  |   46.79 |    84.37 |   66.66 |   46.79 | ...45-246,258-335 
  ...sDiscovery.ts |   97.42 |    92.85 |     100 |   97.42 | ...04,182-183,202 
  ...iagnostics.ts |   83.08 |     67.5 |   92.59 |   83.08 | ...23,543-544,550 
  ...tchOptions.ts |   81.72 |    85.04 |   95.23 |   81.72 | ...18,543,572-581 
  runtimeStatus.ts |    97.5 |    88.57 |     100 |    97.5 | 167-168           
  safeJsonParse.ts |   74.07 |    83.33 |     100 |   74.07 | 40-46             
  ...nStringify.ts |     100 |      100 |     100 |     100 |                   
  ...aConverter.ts |   90.78 |    88.23 |     100 |   90.78 | ...41-42,93,95-96 
  ...aValidator.ts |   94.57 |    80.26 |     100 |   94.57 | ...04,213-216,270 
  ...r-launcher.ts |   76.92 |     91.3 |   66.66 |   76.92 | ...34,136,157-195 
  ...orageUtils.ts |   96.89 |    85.84 |     100 |   96.89 | ...51,367,447,466 
  shell-utils.ts   |   82.93 |    89.89 |     100 |   82.93 | ...1522,1529-1533 
  ...lAstParser.ts |   95.58 |    85.79 |     100 |   95.58 | ...1059-1061,1071 
  ...nlyChecker.ts |   95.75 |    92.39 |     100 |   95.75 | ...00-301,313-314 
  sideQuery.ts     |   98.71 |    97.14 |     100 |   98.71 | 110               
  ...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          
  ...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 
  textUtils.ts     |      60 |      100 |   66.66 |      60 | 36-55             
  thoughtUtils.ts  |     100 |    92.85 |     100 |     100 | 71                
  ...-converter.ts |   94.59 |    85.71 |     100 |   94.59 | 35-36             
  tool-utils.ts    |    93.6 |     91.3 |     100 |    93.6 | ...58-159,162-163 
  truncation.ts    |     100 |       92 |     100 |     100 | 52,71             
  windowsPath.ts   |   89.47 |    79.31 |     100 |   89.47 | ...57-58,62,90-91 
  ...aceContext.ts |   93.71 |    89.28 |   93.33 |   93.71 | ...24-225,249-251 
  xml.ts           |     100 |      100 |     100 |     100 |                   
  yaml-parser.ts   |      92 |    84.61 |     100 |      92 | 49-53,65-69       
 ...ils/filesearch |   86.21 |    81.61 |   96.42 |   86.21 |                   
  crawlCache.ts    |     100 |      100 |     100 |     100 |                   
  crawler.ts       |   82.84 |    77.49 |   94.82 |   82.84 | ...1451,1485-1486 
  fileSearch.ts    |   93.58 |    87.32 |     100 |   93.58 | ...46-247,249-250 
  ignore.ts        |     100 |      100 |     100 |     100 |                   
  result-cache.ts  |     100 |     92.3 |     100 |     100 | 46                
 ...uest-tokenizer |   56.63 |    74.52 |   74.19 |   56.63 |                   
  ...eTokenizer.ts |   41.86 |    76.47 |   69.23 |   41.86 | ...70-443,453-507 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tTokenizer.ts |   68.39 |    69.49 |    90.9 |   68.39 | ...24-325,327-328 
  ...ageFormats.ts |      76 |      100 |   33.33 |      76 | 45-48,55-56       
  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.

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

⚠️ Downgraded from Comment to Comment: self-PR.

Summary

Well-structured feature PR that adds a dense inline panel for parallel agent fan-out. The architecture is sound — claim context prevents duplicate rows across surfaces, the 1s tick pattern mirrors LiveAgentPanel, and the routing conditions are clearly documented. tsc clean, ESLint clean, 12 new tests + 57 existing tests all pass.

Two test gaps flagged below as Suggestions; six additional low-confidence items noted in the terminal review output.

— qwen3.7-max via Qwen Code /review

// suppresses the same rows — no duplication across surfaces.
const isPureAgentGroup =
toolCalls.length >= 2 && toolCalls.every(isSubagentToolEntry);
if (isPending && isPureAgentGroup && !hasSubagentPendingConfirmation) {

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] The routing branch isPending && isPureAgentGroup && !hasSubagentPendingConfirmation is the primary integration point for the feature but has no test coverage. The existing ToolGroupMessage.test.tsx (32 tests) does not exercise any of the five predicate conditions: (a) isPending=true + pure agent group routes to InlineParallelAgentsDisplay; (b) isPending=false falls through; (c) mixed groups fall through; (d) single agent falls through; (e) pending confirmation falls through.

A regression in any predicate would silently skip the new panel or incorrectly route groups. Consider adding tests for at least the happy path and two fall-through cases.

— qwen3.7-max via Qwen Code /review

Comment thread packages/cli/src/ui/components/background-view/LiveAgentPanel.tsx Outdated
- Split InlineAgentClaimContext into read + write contexts so
  claimers (InlineParallelAgentsDisplay) don't re-render every
  time some unrelated inline display claims its own ids. The
  write API now has a stable identity for the lifetime of the
  provider; only readers (LiveAgentPanel) react to claim-set
  changes. Add a test that locks in the stability invariant so a
  future memo on `[version]` is caught before it ships.
- Extract `isPureParallelAgentGroup` predicate in ToolGroupMessage
  alongside the existing `isSubagentToolEntry` / `isTerminalSubagentTool`
  helpers so the routing intent reads at the call site instead of
  being spelled out inline.
- Document that `recentActivities` is mutated in place by the
  registry; the rows useMemo's `now`-keyed re-read is what
  surfaces the latest entry, so `activityLabel` must treat the
  value as a tick-snapshot rather than closing over the live
  array.
- Document the exhaustiveness of the `hasLiveAgent` status check
  (`running | background`) against the upstream
  `AgentResultDisplay.status` union so a future status addition
  is caught.
- Document why `NAME_COL_WIDTH = 26` (fits /review's longest
  agent label at full length on typical 100-col widths) instead
  of leaving it as a magic number.
- Add an inline comment in gemini.tsx explaining why
  InlineAgentClaimProvider sits inside BackgroundTaskViewProvider
  (visible to both surfaces, no provider-boundary crossing).

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

⚠️ Downgraded from Comment to Comment: self-PR.

Second-opinion review (glm-5.1). 9 agents + verification + reverse audit. No Critical issues found. 3 new Suggestions below — code duplication, test gaps for the 1s timer tick, and missing dev-mode logging for registry misses. Prior suggestions (ToolGroupMessage routing tests, LiveAgentPanel isClaimed filter tests) remain open.

tokenCount?: number;
}

// Internal tool name → display name lookup (mirrors LiveAgentPanel so

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] TOOL_DISPLAY_BY_NAME and activityLabel are structurally identical to their counterparts in LiveAgentPanel.tsx. The comment says "mirrors LiveAgentPanel" but no extraction was done.

If ToolNames/ToolDisplayNames mapping changes or activity formatting logic evolves, both sites must be kept in sync manually — a silent divergence would make the two panels render the same tool differently.

Suggested change
// Internal tool name → display name lookup (mirrors LiveAgentPanel so
// Extract to a shared utility, e.g. packages/cli/src/ui/utils/toolDisplayUtils.ts:
// export const TOOL_DISPLAY_BY_NAME = Object.fromEntries(
// (Object.keys(ToolNames) as Array<keyof typeof ToolNames>).map((key) => [
// ToolNames[key], ToolDisplayNames[key],
// ]),
// );
// export function formatActivityLabel(name: string, description?: string): string { ... }

— glm-5.1 via Qwen Code /review

ms = Math.max(0, end - row.startTime);
} else if (row.fallbackElapsedMs !== undefined) {
ms = Math.max(0, row.fallbackElapsedMs);
}

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] The 1-second setInterval tick that drives live activity/elapsed updates is never exercised in tests. vi.useFakeTimers() is set up in beforeEach but vi.advanceTimersByTime(1000) is never called — the entire live-update loop is dead code in the test suite.

Additionally, statusGlyph branches for failed/cancelled/background (line ~175) and the startTime+endTime elapsed path (line ~200) are untested.

Suggested test additions:

  • Render a running agent, assert initial elapsed, then vi.advanceTimersByTime(1000) and assert elapsed updated
  • Render agents with failed/cancelled/background status and assert correct glyphs + doneCount
  • Provide a registry entry with both startTime and endTime and assert fixed-duration elapsed

— glm-5.1 via Qwen Code /review

const recent = live?.recentActivities?.at(-1);
return {
agentId,
callId: toolCall.callId,

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] When registry?.get(agentId) returns undefined for a running agent (e.g. deriveAgentId diverges from the core construction, or the registry evicts the entry early), the row silently falls back to empty startTime/recentActivity with no diagnostic output. The panel renders correctly but shows stale/empty data — indistinguishable from "agents are slow."

Consider adding a dev-mode warning:

Suggested change
callId: toolCall.callId,
const rows: RowData[] = useMemo(() => {
const registry = config?.getBackgroundTaskRegistry();
void now;
if (process.env.NODE_ENV === 'development') {
const liveButMissing = agentEntries
.filter((e) => {
const agentId = deriveAgentId(e.toolCall, e.result);
return (e.result.status === 'running' || e.result.status === 'background')
&& registry?.get(agentId) === undefined;
});
if (liveButMissing.length > 0) {
console.warn(
'[InlineParallelAgentsDisplay] %d running agents not found in registry;'
+ ' deriveAgentId may be out of sync',
liveButMissing.length,
);
}
}

— glm-5.1 via Qwen Code /review

wenshao added 2 commits May 24, 2026 23:56
…anel

- Dense panel renders only in committed phase, replacing verbose
  per-agent ToolMessage expansion with one compact row per agent.
- Live phase: pure parallel agent groups return null so LiveAgentPanel
  below the input is the sole live surface (fixes terminal agents
  rendering as verbose ToolMessages above input during live phase).
- Remove InlineAgentClaimContext (no longer needed without live-phase
  inline panel).
- Show InlineParallelAgentsDisplay in both live and committed phases
  with all agents (running + completed). LiveAgentPanel below the
  composer also shows running agents during live phase (brief overlap
  that resolves as agents complete and expire from the panel).
- Increase LiveAgentPanel DEFAULT_MAX_ROWS from 5 to 12 so all 9
  /review agents are visible without truncation.
- Add totalAgentCount prop to InlineParallelAgentsDisplay for correct
  header when rendering a subset of agents.

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

⚠️ Downgraded from Comment to Comment: self-PR.

5 Suggestions (4 test gaps + 1 comment accuracy) and 3 Nice to have items. No Critical issues. Build passes, 70 tests pass, tsc/ESLint clean.

— qwen3.7-max via Qwen Code /review

return { glyph: '○', color: theme.status.warning };
case 'completed':
return { glyph: '✔', color: theme.status.success };
case 'failed':

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] failed and cancelled arms of statusGlyph are never exercised by any test. The done-tally test only uses status: 'completed' — no test passes status: 'failed' or status: 'cancelled'. Consequently, the doneCount filter that counts failed/cancelled as terminal is also unverified.

Add a test with a mix of terminal statuses:

it('counts failed and cancelled agents in the done tally', () => {
  const toolCalls = [
    agentToolCall({ callId: 'c1', subagentName: 'g', taskDescription: 'A1', status: 'failed' }),
    agentToolCall({ callId: 'c2', subagentName: 'g', taskDescription: 'A2', status: 'cancelled' }),
    agentToolCall({ callId: 'c3', subagentName: 'g', taskDescription: 'A3', status: 'running' }),
  ];
  const { lastFrame } = renderInline({ toolCalls });
  expect(lastFrame() ?? '').toContain('2/3 done');
});

— qwen3.7-max via Qwen Code /review

// and the trailing suffix stay readable.
const NAME_COL_WIDTH = 26;

function truncateMiddle(input: string, max: number): string {

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] truncateMiddle has three branches (input fits, max <= 1, and actual middle-truncation with Math.ceil/Math.floor head/tail math), but only the first branch is implicitly exercised — all test agent names are ≤26 characters, well under NAME_COL_WIDTH = 26.

Real /review agent labels like "Agent 6c: Maintainer review" exceed 26 chars and WILL trigger truncation. Add a test with a long name:

agentToolCall({ callId: 'c1', subagentName: 'g',
  taskDescription: 'Agent 1: Correctness deep review of all modules' }),
// Assert frame contains '…' and the leading prefix portion

— qwen3.7-max via Qwen Code /review

? { name: recent.name, description: recent.description }
: undefined,
tokenCount:
result.tokenCount ??

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] The token-count fallback chain result.tokenCount ?? live?.stats?.totalTokens ?? result.executionSummary?.totalTokens has three tiers, but only tier 3 is tested. Tier 1 (result.tokenCount) and tier 2 (live?.stats?.totalTokens from the registry for a running agent) are never exercised.

Tier 2 is the primary path for live running agents — the registry accumulates stats.totalTokens while result.tokenCount remains undefined until completion. Extend the "surfaces live activity" test's registry entry to include stats: { totalTokens: 5000 } and assert 5k tok appears. Separately, pass tokenCount: 800 through the seed and assert it takes priority.

— qwen3.7-max via Qwen Code /review

(Object.keys(ToolNames) as Array<keyof typeof ToolNames>).map((key) => [
ToolNames[key],
ToolDisplayNames[key],
]),

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] The JSDoc claims appendActivity "intentionally mutates that array in place…not by replacing the reference" — but background-tasks.ts:482-494 actually does the opposite:

const next = [...prior, activity];  // new array via spread
entry.recentActivities = next;       // reassignment, not mutation

The entry object reference is stable but recentActivities is reassigned on every append. The rows memo still works because it re-reads registry.get(agentId).recentActivities.at(-1) on each tick, but the comment's reasoning about "in-place mutation" is factually wrong and would mislead a future maintainer attempting to optimize the memo.

Correct the comment to describe the actual mechanism.

— qwen3.7-max via Qwen Code /review

Comment thread packages/cli/src/gemini.tsx Outdated
@wenshao wenshao requested a review from tanzhenxin May 25, 2026 00:53
@wenshao wenshao changed the title feat(cli): show live per-agent progress instead of collapsing parallel agents to "Agent x N" feat(cli): dense inline panel for parallel agent fan-out display May 25, 2026
@wenshao wenshao requested a review from chiga0 May 25, 2026 00:57
- Add "main" as first entry in LiveAgentPanel, followed by running agents
- ↓ from Composer focuses LiveAgentPanel (selects "main")
- ↓/↑ navigates between entries with ▸ selection indicator
- Enter on agent opens BackgroundTasksDialog directly in detail mode
- Esc or ↑-at-top returns focus to Composer
- Printable chars auto-unfocus and type through to Composer
- Simplify header from "Active agents (N/N)" to "Active agents (N)"
- Add livePanelFocused + livePanelSelectedIndex state to
  BackgroundTaskViewContext, keyboard handling stays in InputPrompt
@wenshao wenshao changed the title feat(cli): dense inline panel for parallel agent fan-out display feat(cli): dense inline panel + keyboard navigation for parallel agent fan-out May 25, 2026

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

⚠️ Downgraded from Request Changes to Comment: self-PR; CI failing: Test (macos/windows/ubuntu), Lint.

6 Critical + 6 Suggestion findings in this round (4th opinion). All prior open comments acknowledged.

— qwen3.7-max via Qwen Code /review

Comment thread packages/cli/src/ui/components/InputPrompt.tsx Outdated
Comment thread packages/cli/src/ui/components/InputPrompt.tsx
Comment thread packages/cli/src/ui/components/InputPrompt.tsx
setLivePanelFocused(false);
return true;
}
if (key.sequence && key.sequence.length === 1 && !key.ctrl && !key.meta) {

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] Two key-handling issues in this catch-all area:

  1. Ctrl+C swallowed: The return true on the next line silently consumes Ctrl+C. In raw terminal mode (Ink), Ctrl+C doesn't generate SIGINT — it's a regular keypress. Users navigating the agent panel can't abort with Ctrl+C without first pressing Esc.
  2. Tab/Backspace match printable-char check: key.sequence.length === 1 matches \t (Tab), \x7f (Backspace), and other non-printable single-byte sequences. These unfocus the panel and fall through to BaseTextInput, potentially inserting a tab or deleting a character.
Suggested change
if (key.sequence && key.sequence.length === 1 && !key.ctrl && !key.meta) {
if (key.ctrl && key.name === 'c') {
setLivePanelFocused(false);
return false;
}
if (key.sequence && key.sequence.length === 1 && !key.ctrl && !key.meta
&& key.name !== 'tab' && key.name !== 'backspace' && key.name !== 'delete') {
setLivePanelFocused(false);
return false;
}

— qwen3.7-max via Qwen Code /review

Comment thread packages/cli/src/ui/components/messages/ToolGroupMessage.tsx
// input — so reverse here back to ASC for rendering. Doing the
// reverse before the slice means the tail-window math (drop the
// OLDEST when the list overflows) stays unchanged.
const visibleAgentsAsc = [...visibleAgents].reverse();

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] The diff deletes the 4-line comment explaining WHY [...visibleAgents].reverse() exists. The remaining code is a non-obvious decision — entries arrive newest-first from useBackgroundTaskView but the panel renders top-to-bottom in launch order (oldest at top, newest at bottom above the composer). Without this comment, a future cleanup could plausibly remove the .reverse() as "unnecessary."

Suggested change
const visibleAgentsAsc = [...visibleAgents].reverse();
// Entries arrive newest-first from context; reverse so the panel
// reads oldest→top, newest→bottom (above the composer).
const visibleAgentsAsc = [...visibleAgents].reverse();

— qwen3.7-max via Qwen Code /review

<AgentRow key={entry.agentId} entry={entry} now={now} />
{visible.map((entry, idx) => (
<AgentRow
key={entry.agentId}

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] The hint text "^ N more above (↓ to view all)" was unchanged, but its meaning shifted with this PR. Previously from the composer opened the dialog. Now enters the panel's keyboard navigation, which does NOT scroll — overflow entries (the oldest agents, dropped by .slice(-maxRows)) are unreachable via keyboard. The hint should be updated (e.g., "Enter on main to view all in dialog") or the panel should support scroll-through-window during keyboard navigation.

— qwen3.7-max via Qwen Code /review

* (e.g. only terminal agents during the live phase). When omitted,
* defaults to the number of agent entries in `toolCalls`.
*/
totalAgentCount?: number;

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] totalAgentCount is declared as an optional prop with JSDoc, but the sole caller in ToolGroupMessage.tsx never passes it. The prop describes a scenario ("toolCalls is a subset") that no code path exercises. Per the project's simplicity-first principle, remove the prop and simplify to const total = rows.length. If a future caller needs it, add it then.

Suggested change
totalAgentCount?: number;
contentWidth: number;
}

— qwen3.7-max via Qwen Code /review

agentId,
callId: toolCall.callId,
name: result.taskDescription || result.subagentName,
status: result.status,

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] status: result.status reads from the static toolCalls prop, while activity/elapsed/tokens reconcile from the live registry on each tick. When an agent finishes and unregisterForeground fires, the registry entry disappears but this glyph stays (running) until the parent re-renders with an updated toolCalls prop. During the same window, activity and elapsed are correctly refreshed from the registry — creating a visual contradiction: a "running" glyph next to stale activity.

Consider reading live?.status from the registry in the rows useMemo and preferring it over result.status when available.

— qwen3.7-max via Qwen Code /review

{headerLabel}
</Text>
</Box>
{rows.map((row) => (

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] rows.map renders every agent without any maxRows cap or windowing. LiveAgentPanel has maxRows = 12 and windows from the tail. For a /review 9-agent fan-out during the live phase, the user sees a bordered 12-line panel here PLUS up to 12 more rows in LiveAgentPanel below the composer — 20+ terminal lines of duplicate content. On smaller terminal heights, conversation context is pushed far off-screen.

Consider adding a maxRows prop with the same tail-windowing pattern, or gate this component on !isPending so the live phase renders only LiveAgentPanel and the committed phase renders only this panel.

— qwen3.7-max via Qwen Code /review

wenshao added 2 commits May 26, 2026 00:13
Add livePanelFocused, livePanelSelectedIndex, enterBgDetailFromPanel,
setBgSelectedIndex, bgEntries.length to InputPrompt handleInput deps.
Add isDetailMode to BackgroundTasksDialog effect deps. Remove unused
setBgPillFocused import.
- Use bgAgentCount (agent-only) instead of bgEntries.length for
  keyboard navigation bounds (was counting shells/monitors/dreams).
- Auto-clear livePanelFocused when no agent entries remain (prevents
  stuck focus state when LiveAgentPanel returns null).
@wenshao wenshao added the type/feature-request New feature or enhancement request label May 26, 2026
pomelo-nwu
pomelo-nwu previously approved these changes May 26, 2026

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

Tested locally with tmux — looks great

Built the branch and ran a few parallel fan-outs in tmux. The dense inline panel + LiveAgentPanel coexistence works as advertised. Approving with a couple of small things to flag.

Screenshot 1 — Live phase (5 parallel agents, 4 done + 1 running)

╭──────────────────────────────────────────────────────────────────────────╮
│ Parallel agents · 5 · 4/5 done                                           │
│ ✔ Search useState count                                   42s · 1.0k tok │
│ ○ Search useEffect count    Glob '**/*.tsx' in path '/… 2m 8s · 921 tok │
│ ✔ Search useMemo count                                    51s · 2.3k tok │
│ ✔ Search useCallback count                                41s · 1.2k tok │
│ ✔ Search useRef count                                     46s · 1.3k tok │
╰──────────────────────────────────────────────────────────────────────────╯

... (composer)

  YOLO mode (Shift + Tab to toggle) · 1 local agent, 1 monitor
    main
    ○ Search useEffect count (Glob '**/*.tsx' in path … ▶ 2m 8s · 182k tokens

Dense panel keeps all 5 rows with status / activity / elapsed / tokens; LiveAgentPanel below the composer correctly filters down to only the still-running one. The "brief visual overlap" you described in the PR is barely noticeable in practice — clean.

Screenshot 2 — Keyboard navigation (↓↓ from input)

    main
  ▸ ○ Search useEffect count (Glob '**/*.tsx' in path… ▶ 2m 46s · 182k tokens
    ↑↓ navigate · Enter detail · Esc back

indicator, the navigate hint line, and the focus transitions all render correctly.

Findings worth a look

1. CI Lint is red — must-fix before merge. This is what's failing CI, not a real test failure:

packages/cli/src/ui/components/InputPrompt.tsx
  1301:5  warning  React Hook useCallback has missing dependencies:
  'bgEntries.length', 'enterBgDetail', 'livePanelFocused',
  'livePanelSelectedIndex', 'setBgSelectedIndex', 'setLivePanelFocused',
  'setLivePanelSelectedIndex'.
✖ 1 problem (0 errors, 1 warning)
ESLint found too many warnings (maximum: 0).

Easy fix; just add the missing deps (or intentionally suppress with a comment if any need to be stable).

2. Enter-to-detail mapping may be off when monitor tasks are mixed in. Repro: LiveAgentPanel selecting an agent row (grep useMemo in tsx), then Enter — but the detail that opened was a different [monitor] Wait for sleep 25 ... task, not the selected agent. The selectedIndex from the panel doesn't seem to map cleanly to the dialog's target when the background-task list contains both agents and monitors. Worth a second look — this is core to the new keyboard-navigation UX.

3. ← from detail doesn't return to panel selection (at least for monitor detail). PR description says: "← from detail: returns to LiveAgentPanel selection (not the dialog list)". In my repro ← took me back to the BackgroundTasksDialog list view instead. Could be that the detail-from-panel mode only kicks in for agents and monitors fall through to the old path — if so, worth a comment in the code.

4. Stale comment in InlineParallelAgentsDisplay.tsx:15. Header doc says "Rendered in the committed phase only; during the live phase LiveAgentPanel below the composer owns the per-agent roster." — but the implementation now renders in both phases (per commit 205fa024 "dense panel both phases"). Quick comment tidy.

Verdict

Core feature (dense panel) is a huge UX improvement over Agent × 9, design is right. Approving. The two keyboard-nav issues (#2, #3) aren't blockers for me — feature still useful without them — but please address before they become muscle memory.

中文说明(点开)

本地拉分支用 tmux 跑了几次并行 fan-out 验证,dense panel + LiveAgentPanel 同屏共存确实如描述所说。Approve,但有几点提一下:

截图 1:5 个并行 agent,4 个 ✔ 完成 + 1 个 ○ 进行中,dense panel 完整保留 5 行(含状态/activity/耗时/token),LiveAgentPanel 自动过滤只剩还在跑的那个。"brief visual overlap" 在实际使用中几乎不察觉,干净。

截图 2:键盘导航 ↓↓ 后 指示器和 ↑↓ navigate · Enter detail · Esc back 提示都正常出现。

需要看一下的几点

  1. CI Lint 红灯,合并前必修 —— 不是测试失败,是 InputPrompt.tsx:1301 的 useCallback 缺 7 个依赖,max-warnings 0 把 CI 顶掉了。

  2. Enter 进 detail 时索引疑似错位:LiveAgentPanel 上 明明选中的是 agent 行,Enter 后打开的却是 monitor 任务的 detail。当后台列表里 agent + monitor 混合时映射有问题,这是新键盘导航的核心 UX,值得排查。

  3. ← 返回不符合 PR 描述:PR 说"← from detail: returns to LiveAgentPanel selection (not the dialog list)",实测 ← 回到的是 BackgroundTasksDialog list 而不是 panel。可能 detail-from-panel 模式只对 agent 生效,monitor 没走新路径。

  4. 文件头注释过时InlineParallelAgentsDisplay.tsx:15 注释还写"Rendered in the committed phase only",但 commit 205fa024 已改成 both phases。

核心功能体验比旧 Agent × 9 提升明显,方向对。Approve。键盘导航的 2/3 不算 blocker(即使有问题主功能也已经有用),但建议尽快修复,避免变成肌肉记忆。

@wenshao

wenshao commented May 26, 2026

Copy link
Copy Markdown
Collaborator Author

🧪 本地构建验证报告 (维护者)

在隔离 worktree 中对 PR 合并后状态做了完整验证。整体方向 OK, 视觉效果与 PR mockup 一致, 但有一处关联测试遗漏需要补

验证环境

  • Worktree: /private/tmp/pr4477-merged
  • Base: PR 头 d2840c217 merge 当前 origin/main (e8b79d772) → merge commit 40d92579b
  • Node + npm ci + build + bundle: ✅ 全部成功 (CLI bundle 产出, node dist/cli.js --version → 0.16.1)
  • 工作台: tmux session pr4477, 6 个 window 并行

静态检查

检查 范围 结果
tsc --noEmit packages/cli 全包 ✅ EXIT_CODE=0
eslint 全部 11 个改动文件 ✅ EXIT_CODE=0

单元测试

套件 结果
新增 InlineParallelAgentsDisplay.test.tsx 22/22 通过
修改 LiveAgentPanel.test.tsx 34/34 通过
修改 ToolGroupMessage.test.tsx 7/7 通过
3 文件合计 63/63 通过

⚠️ 关联测试回归 (需要 PR 内补一行)

跑更广范围的 packages/cli UI 测试 (messages/ + background-view/ + agent-view/ + InputPrompt + contexts/, 20 文件 / 509 用例) 时发现 1 个失败:

FAIL  src/ui/components/agent-view/AgentTabBar.test.tsx
      > AgentTabBar > uses Ctrl+P/N for focus-chain navigation
TypeError: setLivePanelFocused is not a function
 ❯ AgentTabBar.isActive src/ui/components/agent-view/AgentTabBar.tsx:92:11

Test Files  1 failed | 19 passed (20)
      Tests  1 failed | 506 passed | 2 skipped (509)

根因 (我看了 diff 确认):
本 PR 的 AgentTabBar.tsx 把 Ctrl+N 的下游 action 从 setPillFocused(true) 改成了 setLivePanelFocused(true)(对应 PR 中"Ctrl+N 焦点直达 LiveAgentPanel"的整体导航重构):

- const { setPillFocused: setBgPillFocused } = useBackgroundTaskViewActions();
+ const { setLivePanelFocused } = useBackgroundTaskViewActions();
  ...
-     setBgPillFocused(true);
+     setLivePanelFocused(true);

AgentTabBar.test.tsx 没跟着改:

  • mock 仍然只返回 { setPillFocused: setBgPillFocused }, 不含 setLivePanelFocused → 调用时 undefined is not a function
  • 断言仍然是 expect(setBgPillFocused).toHaveBeenCalledWith(true), 也已经对应不上新行为

最小修复 (3 行):

@@ describe('AgentTabBar', () => {
   const setBgPillFocused = vi.fn();
+  const setLivePanelFocused = vi.fn();

@@ vi.mocked(useBackgroundTaskViewActions).mockReturnValue({
       setPillFocused: setBgPillFocused,
+      setLivePanelFocused,
     } as never);

@@ it('uses Ctrl+P/N for focus-chain navigation', () => {
     pressKey({ name: 'n', sequence: '�', ctrl: true });
     expect(switchToMain).toHaveBeenCalledTimes(1);
-    expect(setBgPillFocused).toHaveBeenCalledWith(true);
+    expect(setLivePanelFocused).toHaveBeenCalledWith(true);
   });

我在本地打上这个补丁后, AgentTabBar.test.tsx 立即转绿, 整组 509 用例全过. 建议在本 PR 内一并修掉, 避免 main 上 CI 红.

🎨 视觉效果实测 (用 ink-testing-library mount 真实组件)

为了越过 mock 验证渲染输出, 我用 dist/ 里构建好的真实组件 + 一个仿 /review 的 9-agent fan-out 数据集 mount 了 InlineParallelAgentsDisplay, 抓取实际帧 (与 PR 描述里的 mockup 对比):

Live 阶段 (3 done / 6 running) — 与 PR mockup 完全一致:

╭──────────────────────────────────────────────────────────────────────────────╮
│ Parallel agents · 9 · 3/9 done                                               │
│ ✔ Correctness                                                 12s · 8.1k tok │
│ ✔ Security                                                     8s · 3.4k tok │
│ ○ Code Quality               ReadFile src/index.ts         3m 38s · 9.0k tok │
│ ○ Performance                Shell grep -r "TODO"          3m 38s · 1.2k tok │
│ ✔ Test Coverage                                                 5s · 605 tok │
│ ○ API Design                 ReadFile package.json         3m 38s · 4.2k tok │
│ ○ Error Handling                                           3m 38s · 3.0k tok │
│ ○ Documentation              WriteFile NOTES.md            3m 38s · 1.5k tok │
│ ○ Accessibility                                            3m 38s · 2.1k tok │
╰──────────────────────────────────────────────────────────────────────────────╯

全部 settled (9/9) — header 自动更新:

╭──────────────────────────────────────────────────────────────────────────────╮
│ Parallel agents · 9 · 9/9 done                                               │
│ ✔ Correctness                                                 15s · 1.0k tok │
│ ✔ Security                                                    17s · 2.5k tok │
│ ✔ Code Quality                                                19s · 4.0k tok │
│ ...                                                                          │
╰──────────────────────────────────────────────────────────────────────────────╯

Subset 渲染 (totalAgentCount=9, 仅传入 3 个 terminal agent) — header 3/9 done 正确, failed/cancelled 用 :

╭──────────────────────────────────────────────────────────────────────────────╮
│ Parallel agents · 9 · 3/9 done                                               │
│ ✔ Correctness                                                 12s · 8.1k tok │
│ ✖ Security                                                     6s · 2.1k tok │
│ ✖ Test Coverage                                                 3s · 305 tok │
╰──────────────────────────────────────────────────────────────────────────────╯

实测验证了几个关键点:

  • 状态 glyph 正确切换 ✔/✖/○
  • live agent 时 border color 走 warning, 全部 settled 后走 default
  • tokenCount > 0 才显示, 0 token 时整段不展示
  • 右栏 elapsed · tokens 通过 flexGrow:1 的中间列正确右对齐 (mockup 描述的"视觉清晰度"问题确实被解决)
  • totalAgentCount prop 在子集渲染场景下正确显示总数

真实 CLI 烟测

node dist/cli.js 在 tmux 启动正常, InputPrompt 渲染正确; 在没有 background agent 的情况下按 ↓ 不会崩 (defensive 行为正确, 因为没有 agent 时 LiveAgentPanel 不渲染, ↓ 应该走原有的 history 路径或 no-op).

结论

维度 状态
构建 / 类型 / lint ✅ 全清
PR 自带 3 个测试文件 (63 用例) ✅ 全过
视觉渲染 vs PR mockup ✅ 三种场景帧对帧一致
真实 CLI 烟测 ✅ 启动 / 无 agent 状态下 ↓ 不崩
关联测试 (AgentTabBar.test.tsx) ⚠️ 1 用例失败, 需要在本 PR 内补 3 行

建议: 补上 AgentTabBar.test.tsx 的 3 行 mock + 断言更新, 再 merge. 改动行为本身 (Ctrl+N → setLivePanelFocused) 与 PR 整体的"输入框 → LiveAgentPanel"导航链是一致的, 只是 PR 没把这个旁路 test 跟着更新, 而 vi.mock(...) + as never 联合压住了 TS 在 mock 不完整时本该报的错, 才让这个回归在作者本地的 typecheck/vitest run 改动文件 时没暴露出来.

Diff 本身约束良好, 实现按照 PR 描述的"≥2 agent / 无 non-agent tool / 无 approval pending"门控, LiveAgentPanelInlineParallelAgentsDisplay 的双阶段渲染策略也符合 mockup, 整体可以 merge.

@wenshao

wenshao commented May 26, 2026

Copy link
Copy Markdown
Collaborator Author

✅ 本地真实测试验证报告 (PR #4477)

环境:Linux 6.12 / Node 22 / 本地 tmux + 真实模型(glm-4.7)/ 仓库已 checkout 到该 PR 分支 (HEAD bc4c518cb)。

一、自动化测试

项目 命令 结果
单元测试(PR 触及的全部文件) vitest run InlineParallelAgentsDisplay.test.tsx ToolGroupMessage.test.tsx LiveAgentPanel.test.tsx AgentTabBar.test.tsx 64 / 64 通过
TypeScript 类型检查 tsc -p packages/cli/tsconfig.json --noEmit 0 errors
ESLint(触及文件) eslint InlineParallelAgentsDisplay.tsx ToolGroupMessage.tsx LiveAgentPanel.tsx InputPrompt.tsx BackgroundTaskViewContext.tsx 0 errors, 0 warnings
完整 build npm run build 成功

二、tmux 真机交互测试

在 tmux (200×60) 中启动 node dist/cli.js(PR 分支构建产物),多次让模型并行起 task agents,逐键验证交互。

1. 密集 inline 面板(InlineParallelAgentsDisplay

A) Live 阶段 · 部分完成(3 个 agent,其中 2 个完成 + 1 个等待 shell 审批):

╭───────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Parallel agents · 3 · 2/3 done                                                                    │
│ ✔ 读取 a.txt 内容                                                                  15s · 160 tok │
│ ✔ 读取 b.txt 内容                                                                    9s · 98 tok │
│ ○ 等待后输出完成   Shell sleep 25 && echo "done" [background] (...)                35s · 277 tok │
╰───────────────────────────────────────────────────────────────────────────────────────────────────╯
  • ✔ 标题计数 2/3 done 正确
  • ✔ Running 行展示实时 activity(来自 registry 的 recentActivities.at(-1)),1 秒 tick 刷新
  • ✔ Elapsed/tokens 右对齐对齐工整
  • ✔ 边框为 warning 黄(hasLiveAgent === true
  • ✔ 与下方 LiveAgentPanel 并存(设计中的短暂重叠)

B) Live 阶段 · 全部 running(4 个 agent,全部 running):在等待审批时,dense 面板被正确隐藏,由审批 UI 接管 —— 验证了

if (isPureParallelAgentGroup(toolCalls) && !hasSubagentPendingConfirmation) { ... }

!hasSubagentPendingConfirmation 守卫生效(未把审批吞进面板)。

C) Committed 阶段

╭───────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Parallel agents · 3 · 3/3 done                                                                    │
│ ✔ 读取 a.txt 内容                                                                  15s · 160 tok │
│ ✔ 读取 b.txt 内容                                                                    9s · 98 tok │
│ ✔ 等待后输出完成                                                                   48s · 448 tok │
╰───────────────────────────────────────────────────────────────────────────────────────────────────╯
  • ✔ 边框转为默认色(hasLiveAgent === false
  • ✔ 终态元数据走 executionSummary 兜底(registry 已 unregisterForeground,elapsed/token 仍正确显示)
  • ✔ 4 个 agent 的 batch 同样正确 commit 为 Parallel agents · 4 · 4/4 done不再是旧的 Agent × 4 / <last name> 一行

2. LiveAgentPanel 键盘导航

测试场景:2 个并行 grep agent 长时间运行,从空 composer 起。

步骤 操作 实际渲染(捕获自 tmux) 判断
1 输入框空,按 ↓ ▸ main + 2 行 ○ 执行 50 次 grep 搜索 + 提示行 ↑↓ navigate · Enter detail · Esc back ✅ 焦点正确进入面板,初始选中 main,提示行只在 focused 时出现
2 再按 ↓ main 上无 ,第一个 agent 行变 ▸ ○ ... ✅ 选择下移到 agent 1
3 再按 ↓ 移到 agent 2 ✅ 选择下移到 agent 2
4 agent 2 行再按 ↓ 仍停在 agent 2 ✅ 边界 clamp 正确(if (livePanelSelectedIndex < maxIdx)
5 按 ↑ 上移到 agent 1,且 activity 列变为实时内容 (Grep 'paint\s+\w+' in path ...) ✅ 选择上移;同时确认 1s tick 持续刷新 activity
6 agent 行按 Enter 弹出 BackgroundTasksDialog,标题 general-purpose › 执行 50 次 grep 搜索,含 Progress trail / Prompt 摘要 / token 计数,底部提示 ← back · Esc close · x stop ✅ 进入 detail-from-panel 模式,enterBgDetailFromPanel() + 预选目标 agent 都生效
7 详情中按 ← 关闭详情,回到面板, 仍停在刚才那个 agent exitDetail'detail-from-panel' 模式下正确返回 panel(而非 list),保留选择
8 Esc 路径 走代码 if (key.name === 'escape') { setLivePanelFocused(false); return true; } 由于 grep agent 在按键之间完成、面板已自动 unfocus(hasAgentEntries 变 false 触发 setLivePanelFocusedRaw(false)),Esc 透传到了模型 turn 的取消路径。属于设计内行为:面板不在了就没什么好释放。代码路径本身正确

备注:截屏文件已保存到 /tmp/qwen-pr-test/nav-*.txt 共 9 份,每一步的 tmux pane 都有原始捕获。

3. 视觉密度对比

旧版(被取代):Agent × 9 / <last name> 折叠成一行,N 分钟跑过去只看到一个名字。

新版(本 PR):N 行 × (状态 · 名字 · activity · 耗时 · token),9 行就完整覆盖 /review 全部并发面,信息密度提升一个数量级,且 elapsed/token 一直右对齐到边界,肉眼可扫。

三、Edge-case 复盘

  • Pending approval 抑制 dense 面板:测试中 4 个 agent 同时被起,其中一个等审批,dense 面板自动让位给审批 UI(isPureParallelAgentGroup && !hasSubagentPendingConfirmation 守卫)
  • Queued approval 渲染:第二个 agent 在排队等待时显示 ⏳ Queued approval: general-purpose,符合 first-come-first-served 锁
  • 终态后 8s 内可见:单 agent 完成后短暂保留在 LiveAgentPanel 顶部(TERMINAL_VISIBLE_MS = 8000),随后自动剔除
  • 元数据兜底链tokenCount ?? live?.stats?.totalTokens ?? executionSummary?.totalTokens 在 unregisterForeground 之后仍能正确展示
  • 超长 agent 名字截断NAME_COL_WIDTH = 26 + middle-truncate 工作正常(本次测试未触发,但代码逻辑正确)

四、结论

维度 结论
自动化测试 全绿(64 单测 + tsc + eslint + build)
Dense 面板渲染 live / committed 两阶段都正确,pending approval 时正确退让
键盘导航 ↓ 入栈 / ↑↓ 移动 / 边界 clamp / Enter → 详情 / ← 回 panel / 选择保持 —— 全部按设计工作
与现有 LiveAgentPanel/BackgroundTasksDialog 集成 兼容,无重复 UI,detail-from-panel 新模式打通了 ← back 闭环
实测体验 显著优于旧版「Agent × N」一行;在 9-agent /review 场景下尤其有价值

建议:可合并。 没有发现回归或交互坑。


本验证在本地 tmux + 真实模型对话中完成;所有捕获原始数据可在 /tmp/qwen-pr-test/ 找到。

@wenshao wenshao merged commit 36e640d into main May 26, 2026
10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

type/feature-request New feature or enhancement request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants