Skip to content

feat(acp): support /cd command in ACP sessions - #5903

Merged
doudouOUC merged 6 commits into
mainfrom
feat/phase-4c-api-request-breakdown
Jun 27, 2026
Merged

feat(acp): support /cd command in ACP sessions#5903
doudouOUC merged 6 commits into
mainfrom
feat/phase-4c-api-request-breakdown

Conversation

@doudouOUC

@doudouOUC doudouOUC commented Jun 26, 2026

Copy link
Copy Markdown
Collaborator

What this PR does

Adds the server-side /cd command support for ACP (Agent Communication Protocol) multi-session architecture. When an ACP client sends a POST /session/:id/cd request, the daemon validates the target directory, checks trust and sandbox policies, updates the session's logical working directory (without calling process.chdir() since the process is shared), and publishes a session_cwd_changed event to all connected clients.

This PR covers the server-side implementation only. SDK client wrappers and capability registration are deferred to a follow-up PR once the server-side behavior is validated end-to-end.

Why it's needed

ACP sessions currently cannot change their working directory. The /cd command was only available in interactive mode. Multi-session ACP requires per-session logical CWD tracking without mutating the shared process state — this is the missing piece for issue #5677.

Reviewer Test Plan

How to verify

  1. Start a daemon in ACP mode with at least one session.
  2. Send POST /session/:id/cd with { "path": "/some/valid/dir" }.
  3. Confirm the response contains previousCwd, newCwd, and warnings: [].
  4. Verify the session's subsequent tool calls resolve paths relative to the new CWD.
  5. Error cases:
    • Non-existent path → 400 directory_not_found
    • Path is a file → 400 directory_not_found ("Not a directory")
    • Relative path → 400 invalid_path
    • Untrusted path → 403 directory_not_trusted
    • Restrictive sandbox → 403 restrictive_sandbox
    • Invalid session → 404
    • Unregistered client ID → 400 invalid_client_id
  6. Queue behavior: if a prompt is actively running, /cd queues behind it and returns 200 after the prompt completes (not 409). This is intentional — ACP clients do not need retry logic, though the request may block for the duration of the active prompt.

Evidence (Before & After)

N/A — new feature, no UI change. Verification is via HTTP API responses.

Tested on

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

Environment (optional)

npm run dev with ACP daemon mode.

Risk & Scope

  • Main risk or tradeoff: skipProcessChdir changes Config.relocateWorkingDirectory() signature — callers that depend on the physical CWD change are unaffected since the option defaults to false. The /cd request blocks unbounded while a prompt is active (no deadline); a bounded wait or fail-fast design is deferred to a follow-up if needed.
  • Not validated / out of scope: Windows path edge cases (UNC paths), SDK client wrappers (follow-up PR), unit tests for bridge/handler (follow-up PR), restrictive_sandbox on macOS seatbelt.
  • Breaking changes / migration notes: None. The new HTTP route is additive.

Linked Issues

Closes #5677

中文说明

为 ACP 多 session 架构添加服务端 /cd 命令支持。当 ACP 客户端发送 POST /session/:id/cd 请求时,daemon 会验证目标目录、检查信任与沙箱策略、更新 session 的逻辑工作目录(不调用 process.chdir(),因为进程是共享的),并向所有已连接客户端发布 session_cwd_changed 事件。

本 PR 仅覆盖服务端实现。SDK 客户端封装和 capability 注册将在服务端行为经过端到端验证后在后续 PR 中添加。

队列行为:如果 prompt 正在执行,/cd 会排队等待 prompt 完成后再执行(而非返回 409)。这是有意为之 — ACP 客户端无需重试逻辑,但请求可能阻塞整个 prompt 时长。

Copilot AI review requested due to automatic review settings June 26, 2026 11:20

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 commented Jun 26, 2026

Copy link
Copy Markdown
Collaborator

Thanks for the PR!

Template looks good ✓

On direction: well-aligned. ACP multi-session needs per-session logical CWD tracking without mutating shared process state — same motivation as the /cd command in Claude Code. This fills a real gap.

On approach: scope is clean and focused — 10 files, 351 additions, all directly related to /cd. The .prettierignore addition for packages/cua-driver/ is a sensible preventive measure to keep vendored driver code out of formatting churn.

Previous blocker — resolved ✓:

  • 23 unrelated cua-driver formatting files → removed; only the .prettierignore entry remains

Moving on to code review. 🔍

中文说明

感谢贡献!

模板完整 ✓

方向:对齐。ACP 多 session 需要 per-session 的逻辑 CWD 追踪而不改变共享进程状态——与 Claude Code 的 /cd 命令动机一致。填补了真实的空缺。

方案:范围干净集中——10 个文件,351 行增加,全部与 /cd 直接相关。.prettierignore 中添加 packages/cua-driver/ 是合理的预防措施,避免 vendored 驱动代码被格式化干扰。

之前的阻塞项——已解决 ✓:

  • 23 个不相关的 cua-driver 格式化文件 → 已移除;仅保留 .prettierignore 条目

进入代码审查 🔍

Qwen Code · qwen3.7-max

@qwen-code-ci-bot

qwen-code-ci-bot commented Jun 26, 2026

Copy link
Copy Markdown
Collaborator

Code Review

The /cd implementation is clean and well-structured. All findings from the previous review still hold — queue chaining, error mapping, trust checks, skipProcessChdir/skipArtifactMigration options, event publishing. No new issues found in the current diff.

Core implementation (9 files, ~350 lines)

Bridge layer (acp-bridge/src/bridge.ts): changeSessionCwd chains on promptQueue identically to sendPrompt — correct serialization. Queue tail tied to raw extMethod settlement (not caller timeout) — prevents stale CWD on timeout. Response shape validation before trusting agent data. Event publishing only fires on actual change. ✓

Error types (bridgeErrors.ts, error-response.ts): CdWhilePromptActiveError → 409 cd_while_prompt_active. restrictive_sandbox → 403, directory_not_found → 400, directory_not_trusted → 403. All centralized in sendBridgeError. ✓

ACP agent handler (acpAgent.ts): Null byte path validation, restrictive sandbox check, directory existence check, trust check via isFolderTrustEnabled/isPathTrusted, relocateWorkingDirectory with both skip options. ✓

Core config (config.ts): skipProcessChdir threaded through both prepareSessionArtifactMigration and relocateWorkingDirectory — uses this.cwd instead of process.cwd(), validates realpath without calling process.chdir(). skipArtifactMigration skips storage migration entirely. Both default to false — fully backward-compatible. ✓

HTTP route (routes/session.ts): POST /session/:id/cd validates absolute path, parses client ID header, delegates to bridge. Error mapping via sendBridgeError. ✓

One note: PR description vs code discrepancy

The PR description states: "if a prompt is actively running, /cd queues behind it and returns 200 after the prompt completes (not 409)". But the code throws CdWhilePromptActiveError (→ 409) when entry.promptActive is true inside the queue lambda. The code behavior is correct — 409 "session busy" is the right response — but the description says otherwise. Worth updating the PR description to match: "/cd returns 409 when a prompt is active; clients should retry after the prompt completes."

Test gap

No automated tests for the /cd feature. The PR description acknowledges this and commits to follow-up tests. Acceptable for initial merge given the implementation quality.

Testing

This is an HTTP API endpoint requiring a running ACP daemon with active sessions — not directly testable via tmux interactive session. CI passes on Ubuntu (Test ubuntu-latest Node 22.x: pass, 7m40s). The previous review-pr failure is stale — a newer CI run shows all checks passing.

中文说明

代码审查

/cd 实现干净且结构良好。之前审查的所有发现仍然成立——队列链式排队、错误映射、信任检查、skipProcessChdir/skipArtifactMigration 选项、事件发布。当前 diff 中未发现新问题。

核心实现(9 个文件,约 350 行)

Bridge 层 (acp-bridge/src/bridge.ts):changeSessionCwdpromptQueue 上链式排队,与 sendPrompt 一致——正确的序列化。队列尾部绑定到原始 extMethod 完成(非调用方超时)——防止超时后使用过时 CWD。信任 agent 数据前进行响应形状验证。事件发布仅在实际变更时触发。✓

错误类型 (bridgeErrors.ts, error-response.ts):CdWhilePromptActiveError → 409 cd_while_prompt_activerestrictive_sandbox → 403, directory_not_found → 400, directory_not_trusted → 403。全部集中在 sendBridgeError 中。✓

ACP agent 处理器 (acpAgent.ts):Null 字节路径验证、限制性沙箱检查、目录存在性检查、通过 isFolderTrustEnabled/isPathTrusted 的信任检查、relocateWorkingDirectory 带两个 skip 选项。✓

Core 配置 (config.ts):skipProcessChdir 贯穿 prepareSessionArtifactMigrationrelocateWorkingDirectory——使用 this.cwd 而非 process.cwd(),验证 realpath 而不调用 process.chdir()skipArtifactMigration 完全跳过存储迁移。两者默认为 false——完全向后兼容。✓

HTTP 路由 (routes/session.ts):POST /session/:id/cd 验证绝对路径,解析客户端 ID 头,委托给 bridge。通过 sendBridgeError 的错误映射。✓

一个备注:PR 描述与代码不一致

PR 描述称:"如果 prompt 正在运行,/cd 会排队等待 prompt 完成后返回 200(而非 409)"。但代码在队列 lambda 内 entry.promptActive 为 true 时抛出 CdWhilePromptActiveError(→ 409)。代码行为是正确的——409 "session busy" 是合理的响应——但描述与之不符。建议更新 PR 描述以匹配:"/cd 在 prompt 活动时返回 409;客户端应在 prompt 完成后重试。"

测试缺失

/cd 功能没有自动化测试。PR 描述承认了这一点并承诺后续测试。鉴于实现质量,初始合并可以接受。

测试

这是需要运行中 ACP daemon 和活动 session 的 HTTP API 端点——无法通过 tmux 交互式会话直接测试。CI 在 Ubuntu 上通过(Test ubuntu-latest Node 22.x:pass,7m40s)。之前的 review-pr 失败已过时——更新的 CI 运行显示所有检查通过。

Qwen Code · qwen3.7-max

@qwen-code-ci-bot

qwen-code-ci-bot commented Jun 26, 2026

Copy link
Copy Markdown
Collaborator

Stepping back: the /cd implementation is genuinely well-built. Queue chaining, skipProcessChdir extension point, noop short-circuit, response shape validation, event publishing — all clean, idiomatic, and production-ready. The previous fix commits show careful iteration across three rounds.

Previous blocker — fully resolved:

  • 23 unrelated cua-driver formatting files → removed. The .prettierignore entry is a clean preventive measure.

Minor note: the PR description says /cd queues behind active prompts and returns 200, but the code returns 409 when a prompt is active. The code is correct — 409 "session busy" is the right response. Just update the description to match.

Independent proposal check: my own approach would have been near-identical — extend relocateWorkingDirectory with skip options, chain on promptQueue, add the HTTP route with sendBridgeError mapping. The PR's implementation matches or exceeds that baseline.

CI passes on Ubuntu. The test gap is noted but acceptable for initial merge.

Verdict: Approve ✅ — clean implementation, focused scope, previous concerns resolved. The description discrepancy is cosmetic and can be fixed in a follow-up or by editing the PR body.

中文说明

退一步看:/cd 实现确实写得很好。队列链式排队、skipProcessChdir 扩展点、noop 短路、响应形状验证、事件发布——都很干净、符合惯例、可用于生产环境。之前的修复提交展示了三轮仔细迭代。

之前的阻塞项——完全解决:

  • 23 个不相关的 cua-driver 格式化文件 → 已移除。.prettierignore 条目是干净的预防措施。

小备注: PR 描述称 /cd 在活跃 prompt 后排队的返回 200,但代码在 prompt 活动时返回 409。代码是正确的——409 "session busy" 是合理的响应。只需更新描述以匹配即可。

独立方案对照:我自己的方案几乎一致——用 skip 选项扩展 relocateWorkingDirectory、在 promptQueue 上链式排队、添加 HTTP 路由并用 sendBridgeError 映射。PR 的实现匹配或超越了该基线。

CI 在 Ubuntu 上通过。测试缺失已注意到,初始合并可以接受。

结论:Approve ✅ ——实现干净,范围集中,之前的顾虑已解决。描述不一致是外观问题,可在后续修复或直接编辑 PR 正文。

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.

Needs some fixes before shipping — wrong HTTP status code for trust rejection (409→403), missing tests for the /cd feature, and unrelated Phase 4c telemetry should be split into its own PR. See review comments above for details. 🙏

Implements the server-side /cd command for ACP multi-session architecture:

- Infrastructure: ext-method constant, bridge types, CdWhilePromptActiveError
- Core: skipProcessChdir option in Config.relocateWorkingDirectory()
- ACP child handler: trust check, fs validation, sandbox guard
- Bridge: promptQueue-serialized changeSessionCwd with event publishing
- HTTP route: POST /session/:id/cd with error-to-status mapping
  - directory_not_found → 400
  - directory_not_trusted → 403
  - restrictive_sandbox → 403
  - session_busy (CdWhilePromptActiveError) → 409

SDK client wrappers and capability registration are deferred to a follow-up
PR once the server-side implementation is validated end-to-end.

Closes #5677
@doudouOUC
doudouOUC force-pushed the feat/phase-4c-api-request-breakdown branch from a6a9e22 to 261b6bd Compare June 26, 2026 11:53
@github-actions

github-actions Bot commented Jun 26, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 77.98% 77.98% 83.17% 80.2%
Core 84.14% 84.14% 85.37% 84.52%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   77.98 |     80.2 |   83.17 |   77.98 |                   
 src               |    75.9 |     75.4 |   82.97 |    75.9 |                   
  gemini.tsx       |   67.27 |    72.18 |   81.25 |   67.27 | ...-971,1010-1014 
  ...ractiveCli.ts |    74.8 |    72.44 |   76.19 |    74.8 | ...1810-1812,1847 
  ...liCommands.ts |   88.86 |    84.25 |     100 |   88.86 | ...38,407,441,562 
  ...ActiveAuth.ts |     100 |     87.5 |     100 |     100 | 66-80             
 ...cp-integration |   57.76 |    62.89 |   83.81 |   57.76 |                   
  acpAgent.ts      |   57.63 |    62.93 |   84.02 |   57.63 | ...7344,7358-7366 
  authMethods.ts   |      92 |       60 |     100 |      92 | 33-34             
  errorCodes.ts    |       0 |        0 |       0 |       0 | 1-22              
  ...DirContext.ts |     100 |      100 |     100 |     100 |                   
 ...ration/service |   91.17 |       90 |   83.33 |   91.17 |                   
  filesystem.ts    |   91.17 |       90 |   83.33 |   91.17 | 24-25,31-32,98-99 
 ...ration/session |   86.64 |    79.19 |   89.92 |   86.64 |                   
  ...ryReplayer.ts |   76.84 |    85.33 |   85.71 |   76.84 | ...50-365,378-379 
  Session.ts       |   87.31 |    78.16 |   91.26 |   87.31 | ...4764,4790-4794 
  ...entTracker.ts |   91.39 |    89.47 |   88.88 |   91.39 | ...31,195,266-275 
  index.ts         |       0 |        0 |       0 |       0 | 1-40              
  ...ssionUtils.ts |   84.21 |    83.33 |     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 |   96.25 |    94.25 |   96.96 |   96.25 |                   
  BaseEmitter.ts   |    92.3 |    81.81 |     100 |    92.3 | 23-24             
  ...ageEmitter.ts |   95.23 |    95.23 |     100 |   95.23 | 48-55             
  PlanEmitter.ts   |     100 |      100 |     100 |     100 |                   
  ...allEmitter.ts |   98.44 |    94.62 |     100 |   98.44 | 318-319,420,428   
  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      |   83.73 |    61.85 |   59.25 |   83.73 |                   
  auth.ts          |     100 |    83.33 |     100 |     100 | 11,14             
  channel.ts       |   56.66 |      100 |       0 |   56.66 | 15-19,27-34       
  extensions.tsx   |   96.77 |      100 |      50 |   96.77 | 39                
  hooks.tsx        |   66.66 |      100 |       0 |   66.66 | 20-24             
  mcp.ts           |   95.45 |      100 |      50 |   95.45 | 31                
  review.ts        |   51.85 |      100 |       0 |   51.85 | 24-35,38          
  serve.ts         |   84.19 |    57.31 |     100 |   84.19 | ...31-534,547-551 
  sessions.ts      |     100 |      100 |      50 |     100 |                   
 ...mmands/channel |   41.76 |     85.1 |   56.09 |   41.76 |                   
  ...l-registry.ts |    6.66 |      100 |       0 |    6.66 | 6-32,35-53        
  config-utils.ts  |   93.33 |      100 |      75 |   93.33 | 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       |   97.11 |    94.73 |     100 |   97.11 | 27-28,45          
  start.ts         |   31.94 |    53.84 |   71.42 |   31.94 | ...83-486,495-497 
  status.ts        |   17.85 |      100 |       0 |   17.85 | 15-26,32-76       
  stop.ts          |      20 |      100 |       0 |      20 | 14-48             
 ...nds/extensions |   87.25 |     89.3 |   85.24 |   87.25 |                   
  consent.ts       |   72.53 |       90 |   42.85 |   72.53 | ...86-142,157-163 
  disable.ts       |     100 |      100 |     100 |     100 |                   
  enable.ts        |     100 |      100 |     100 |     100 |                   
  install.ts       |   85.05 |    83.33 |      75 |   85.05 | ...05-208,211-220 
  link.ts          |     100 |      100 |     100 |     100 |                   
  list.ts          |     100 |     87.5 |     100 |     100 | 18                
  new.ts           |     100 |      100 |     100 |     100 |                   
  settings.ts      |   99.15 |      100 |   83.33 |   99.15 | 151               
  sources.ts       |   93.42 |    87.09 |   92.85 |   93.42 | ...4-66,96-98,167 
  uninstall.ts     |    37.5 |      100 |   33.33 |    37.5 | 23-45,57-64,67-70 
  update.ts        |   96.29 |      100 |     100 |   96.29 | 101-105           
  utils.ts         |      75 |    53.84 |     100 |      75 | ...27-131,133-137 
 ...les/mcp-server |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-60              
 ...amples/starter |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-64              
 src/commands/mcp  |   90.15 |    84.39 |   83.33 |   90.15 |                   
  add.ts           |    99.3 |    96.07 |     100 |    99.3 | 154-155           
  approve.ts       |   76.19 |     87.5 |   66.66 |   76.19 | ...,89-99,114-124 
  list.ts          |   92.59 |    83.87 |      80 |   92.59 | ...62-164,180-181 
  reconnect.ts     |   78.73 |    66.66 |   85.71 |   78.73 | 42-55,168-190     
  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 
 ...mands/sessions |   91.56 |    86.95 |   83.33 |   91.56 |                   
  common.ts        |     100 |      100 |     100 |     100 |                   
  list.ts          |   90.96 |    86.66 |   81.81 |   90.96 | 208-219,221-222   
 src/config        |   93.48 |    86.84 |    94.5 |   93.48 |                   
  auth.ts          |   89.35 |    83.56 |     100 |   89.35 | ...97-298,314-315 
  ...eMcpImport.ts |   87.91 |    81.52 |     100 |   87.91 | ...63-371,453-454 
  config.ts        |    86.7 |    84.76 |   82.75 |    86.7 | ...2092,2094-2102 
  ...heme-names.ts |     100 |      100 |     100 |     100 |                   
  environment.ts   |   87.37 |    85.84 |   92.85 |   87.37 | ...43-544,550-551 
  hot-reload.ts    |     100 |    86.11 |     100 |     100 | 46,156,165,216    
  keyBindings.ts   |    97.1 |       50 |     100 |    97.1 | 212-215           
  ...ngsAdapter.ts |     100 |    94.11 |     100 |     100 | 64                
  mcpApprovals.ts  |   96.55 |    95.55 |     100 |   96.55 | 223-224,229-231   
  mcpJson.ts       |     100 |      100 |     100 |     100 |                   
  mcpServers.ts    |   92.85 |     87.5 |     100 |   92.85 | 46-47             
  ...idersScope.ts |      92 |     90.9 |     100 |      92 | 11-12             
  ...abledTools.ts |     100 |      100 |     100 |     100 |                   
  ...comparison.ts |     100 |      100 |     100 |     100 |                   
  ...n-settings.ts |   99.15 |    93.75 |     100 |   99.15 | 63                
  sandboxConfig.ts |   61.64 |    71.87 |   66.66 |   61.64 | ...54-68,73,77-89 
  settings.ts      |   88.05 |       88 |   89.65 |   88.05 | ...-966,1000-1006 
  ...ingsSchema.ts |     100 |      100 |     100 |     100 |                   
  ...ngsWatcher.ts |   95.54 |    88.34 |     100 |   95.54 | ...28,277-278,293 
  ...d-env-keys.ts |     100 |      100 |     100 |     100 |                   
  ...paths-lite.ts |   89.47 |     87.5 |     100 |   89.47 | 43-44,53-54,56-57 
  ...tedFolders.ts |   93.78 |    94.78 |     100 |   93.78 | ...43-344,380-391 
 ...nfig/migration |   95.23 |    77.77 |   83.33 |   95.23 |                   
  index.ts         |   95.65 |     87.5 |     100 |   95.65 | 117-118           
  scheduler.ts     |   96.55 |    77.77 |     100 |   96.55 | 19-20             
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...ation/versions |   94.91 |      100 |     100 |   94.91 |                   
  ...-v2-shared.ts |     100 |      100 |     100 |     100 |                   
  v1-to-v2.ts      |   81.75 |      100 |     100 |   81.75 | ...28-229,231-247 
  v2-to-v3.ts      |     100 |      100 |     100 |     100 |                   
  v3-to-v4.ts      |     100 |      100 |     100 |     100 |                   
  v5-to-v4.ts      |      96 |      100 |     100 |      96 | 94-95,99          
 src/core          |     100 |      100 |     100 |     100 |                   
  auth.ts          |     100 |      100 |     100 |     100 |                   
  initializer.ts   |     100 |      100 |     100 |     100 |                   
  theme.ts         |     100 |      100 |     100 |     100 |                   
 src/dualOutput    |   69.39 |    66.66 |   63.15 |   69.39 |                   
  ...tputBridge.ts |   69.48 |     67.3 |    64.7 |   69.48 | ...82-383,391-394 
  ...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          |   83.22 |       80 |    86.2 |   83.22 |                   
  index.ts         |    65.4 |    76.92 |      80 |    65.4 | ...70-271,294-299 
  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.45 |    71.03 |   74.07 |   72.45 |                   
  session.ts       |   76.46 |    69.34 |   85.71 |   76.46 | ...32-833,842-852 
  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 |    26.7 |    37.93 |   35.48 |    26.7 |                   
  ...Controller.ts |   36.97 |       80 |      80 |   36.97 | ...15-117,127-210 
  ...Controller.ts |       0 |        0 |       0 |       0 | 1-56              
  ...Controller.ts |   31.32 |     38.7 |      40 |   31.32 | ...68-577,592-597 
  ...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.1 |     94.2 |   95.23 |    98.1 |                   
  ...putAdapter.ts |   98.02 |    93.36 |   98.07 |   98.02 | ...1303,1398-1399 
  ...putAdapter.ts |      96 |    91.66 |   85.71 |      96 | 51-52             
  ...nputReader.ts |     100 |    94.73 |     100 |     100 | 67                
  ...putAdapter.ts |   98.38 |      100 |   90.47 |   98.38 | 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   |   83.12 |    73.43 |    87.5 |   83.12 |                   
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  ...putWatcher.ts |   83.77 |    74.19 |   92.85 |   83.77 | ...05-306,317-320 
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/serve         |    83.6 |    82.03 |   83.83 |    83.6 |                   
  ...ion-bridge.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   93.26 |    92.64 |     100 |   93.26 | ...07-308,311-313 
  ...em-adapter.ts |     100 |      100 |     100 |     100 |                   
  capabilities.ts  |     100 |       96 |     100 |     100 | 386               
  daemon-logger.ts |   98.24 |    86.95 |   96.29 |   98.24 | 119-120,196       
  ...s-provider.ts |   67.01 |    51.42 |     100 |   67.01 | ...40-245,278-286 
  daemon-status.ts |   97.78 |    82.71 |     100 |   97.78 | ...28,630-631,682 
  debug-mode.ts    |     100 |      100 |     100 |     100 |                   
  demo.ts          |     100 |      100 |     100 |     100 |                   
  env-snapshot.ts  |   90.47 |    78.57 |     100 |   90.47 | ...20-123,189-196 
  event-bus.ts     |     100 |      100 |     100 |     100 |                   
  ...-path-argv.ts |     100 |      100 |     100 |     100 |                   
  ...h-settings.ts |   94.88 |    88.93 |     100 |   94.88 | ...08,683,699,709 
  fast-path.ts     |   82.24 |    77.51 |      80 |   82.24 | ...95-496,504-507 
  ...ry-channel.ts |       0 |        0 |       0 |       0 | 1-14              
  index.ts         |       0 |        0 |       0 |       0 | 1-143             
  ...back-binds.ts |     100 |      100 |     100 |     100 |                   
  ...sion-audit.ts |     100 |      100 |   93.33 |     100 |                   
  rate-limit.ts    |   90.33 |    87.77 |   93.75 |   90.33 | ...95-297,348-352 
  ...qwen-serve.ts |   78.49 |    81.98 |   54.87 |   78.49 | ...2338,2352-2355 
  server.ts        |   84.34 |    87.76 |   81.25 |   84.34 | ...1305,1310-1311 
  status.ts        |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ion-limits.ts |     100 |      100 |     100 |     100 |                   
  ...l-resolver.ts |   90.32 |    66.66 |     100 |   90.32 | 16,45-46          
  ...ell-static.ts |   89.58 |       84 |     100 |   89.58 | ...50-153,186-189 
  ...ace-agents.ts |   62.39 |    70.22 |      90 |   62.39 | ...1330,1340-1350 
  ...ace-memory.ts |   87.13 |    78.46 |     100 |   87.13 | ...54-361,421-428 
  ...ers-status.ts |      97 |    78.94 |     100 |      97 | ...45,148,254-260 
 ...serve/acp-http |   70.64 |    71.29 |   93.93 |   70.64 |                   
  ...n-registry.ts |   89.19 |    82.43 |   93.33 |   89.19 | ...08,482,502-516 
  dispatch.ts      |   64.29 |    66.03 |     100 |   64.29 | ...2875,2949-2952 
  index.ts         |   75.95 |    69.79 |   92.85 |   75.95 | ...14,825,854-856 
  json-rpc.ts      |     100 |    96.96 |     100 |     100 | 92                
  sse-stream.ts    |   93.91 |    87.87 |   84.61 |   93.91 | ...50-152,154-156 
  ...ort-stream.ts |       0 |        0 |       0 |       0 | 1                 
  ws-stream.ts     |   91.86 |       80 |     100 |   91.86 | 45,50,93,97-100   
 src/serve/auth    |   86.86 |    79.18 |   93.87 |   86.86 |                   
  device-flow.ts   |   96.35 |       80 |   97.61 |   96.35 | ...1358,1453,1519 
  ...w-provider.ts |   44.24 |    74.07 |   71.42 |   44.24 | ...23-284,297,301 
 src/serve/fs      |   85.31 |    81.43 |     100 |   85.31 |                   
  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           
  ...ile-system.ts |    84.3 |    79.27 |     100 |    84.3 | ...2061,2088-2089 
 src/serve/routes  |   80.52 |    77.55 |   88.69 |   80.52 |                   
  a2ui-action.ts   |     100 |     94.2 |     100 |     100 | 120,124,169,273   
  daemon-status.ts |   83.33 |    83.33 |     100 |   83.33 | 79-86             
  health-demo.ts   |    92.3 |    83.33 |     100 |    92.3 | 55-59             
  permission.ts    |     100 |     91.3 |     100 |     100 | 39,78             
  session.ts       |   76.11 |    80.88 |      75 |   76.11 | ...1149,1156-1181 
  sse-events.ts    |   85.71 |    86.11 |   77.77 |   85.71 | ...69,375,392-395 
  ...space-auth.ts |    83.7 |       75 |     100 |    83.7 | ...23,328,340-344 
  ...extensions.ts |   84.48 |    72.92 |   86.36 |   84.48 | ...59-961,980-983 
  ...-file-read.ts |   94.41 |    76.92 |     100 |   94.41 | ...28-329,390-392 
  ...file-write.ts |    82.1 |    60.52 |     100 |    82.1 | ...42-244,247-249 
  ...ermissions.ts |   87.38 |    76.19 |     100 |   87.38 | ...05-106,132-133 
  ...e-settings.ts |   23.62 |      100 |      50 |   23.62 | ...13-226,233-330 
  ...tup-github.ts |   77.52 |    70.27 |   84.21 |   77.52 | ...87,309,352-353 
  ...ace-status.ts |   76.34 |    57.14 |     100 |   76.34 | ...18-119,128-129 
  ...pace-trust.ts |   76.84 |    72.22 |      50 |   76.84 | ...,63-64,117-118 
  ...pace-voice.ts |   87.09 |     82.6 |    90.9 |   87.09 | ...96,322-323,452 
 src/serve/server  |   82.79 |     86.4 |   95.23 |   82.79 |                   
  ...er-helpers.ts |   63.82 |    77.96 |   81.81 |   63.82 | ...16,330,332-347 
  ...r-response.ts |   79.05 |     74.5 |     100 |   79.05 | ...39-463,522-531 
  fs-factory.ts    |     100 |    83.33 |     100 |     100 | 27,35             
  ...t-deadline.ts |     100 |      100 |     100 |     100 |                   
  ...st-helpers.ts |   93.97 |    93.47 |     100 |   93.97 | ...33-135,389-394 
  session-list.ts  |     100 |    91.89 |     100 |     100 | 34,128,130        
  telemetry.ts     |   94.53 |    96.09 |     100 |   94.53 | ...27-129,199-201 
 src/serve/voice   |   70.58 |    95.74 |   72.72 |   70.58 |                   
  ...ice-config.ts |   13.33 |      100 |       0 |   13.33 | 35-63,71-87       
  voice-ws.ts      |   78.03 |    95.74 |   84.21 |   78.03 | ...84,399,437-439 
 ...kspace-service |    85.4 |    83.68 |      92 |    85.4 |                   
  index.ts         |   84.86 |    83.33 |    90.9 |   84.86 | ...76-681,741-806 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services      |   91.89 |    88.43 |   98.24 |   91.89 |                   
  ...mandLoader.ts |     100 |    88.88 |     100 |     100 | 99-112            
  ...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.23 |    96.72 |     100 |   98.23 | 83,87             
  commandUtils.ts  |      96 |     90.9 |     100 |      96 | 48                
  ...and-parser.ts |   90.69 |    85.71 |     100 |   90.69 | 63-66             
  ...ionService.ts |     100 |      100 |     100 |     100 |                   
  ...low-loader.ts |     100 |    96.29 |     100 |     100 | 88                
  setup-github.ts  |    90.5 |    81.81 |     100 |    90.5 | ...35-436,443-444 
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |   98.64 |    95.71 |     100 |   98.64 | 116,142-143       
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  voice-service.ts |   85.99 |    87.09 |     100 |   85.99 | ...68,275,329-343 
  ...e-settings.ts |     100 |    95.45 |     100 |     100 | 19                
  ...ranscriber.ts |   90.41 |       82 |   95.83 |   90.41 | ...29-631,634-636 
 ...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.61 |     100 |   97.35 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  tipHistory.ts    |   92.59 |    68.96 |     100 |   92.59 | ...24,146,153,162 
  tipRegistry.ts   |     100 |      100 |     100 |     100 |                   
  tipScheduler.ts  |     100 |    91.66 |     100 |     100 | 55                
 src/startup       |   80.53 |     74.6 |     100 |   80.53 |                   
  ...reeStartup.ts |   80.53 |     74.6 |     100 |   80.53 | ...94,403,409-412 
 src/test-utils    |   94.01 |    83.33 |      80 |   94.01 |                   
  ...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.03 |    70.08 |   61.11 |   69.03 |                   
  App.tsx          |   33.33 |       75 |   33.33 |   33.33 | 32-86             
  AppContainer.tsx |   70.14 |    65.32 |   57.14 |   70.14 | ...3594,4101-4105 
  ...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 |                   
  ...ractiveUI.tsx |   56.25 |    33.33 |      40 |   56.25 | ...30-231,236-241 
  ...inePresets.ts |   96.27 |    83.87 |     100 |   96.27 | ...96,401,409-411 
  textConstants.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/auth       |   58.45 |    65.94 |      50 |   58.45 |                   
  AuthDialog.tsx   |   59.01 |     42.1 |   16.66 |   59.01 | ...25,332-354,358 
  ...nProgress.tsx |       0 |        0 |       0 |       0 | 1-64              
  ...etupSteps.tsx |   60.03 |    70.37 |      56 |   60.03 | ...87,791,800,803 
  useAuth.ts       |    94.6 |    73.52 |     100 |    94.6 | ...21-222,241-247 
  ...rSetupFlow.ts |   43.18 |    33.33 |      50 |   43.18 | ...78-399,416-459 
 src/ui/commands   |   78.85 |    81.27 |   87.57 |   78.85 |                   
  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.58 |    68.25 |   84.61 |   65.58 | ...54-587,598-599 
  copyCommand.ts   |   98.49 |    95.78 |     100 |   98.49 | ...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 |   65.37 |    81.88 |   94.11 |   65.37 | ...85-535,538-672 
  dreamCommand.ts  |   85.45 |    88.88 |     100 |   85.45 | 58-65             
  editorCommand.ts |     100 |      100 |     100 |     100 |                   
  exportCommand.ts |   98.25 |    91.02 |     100 |   98.25 | ...81,198-199,364 
  ...onsCommand.ts |    50.3 |    48.14 |   69.23 |    50.3 | ...08,262-314,375 
  forgetCommand.ts |     100 |       90 |     100 |     100 | 59                
  forkCommand.ts   |     100 |    94.11 |     100 |     100 | 96,147            
  goalCommand.ts   |   91.46 |    84.44 |      90 |   91.46 | ...87-190,202-205 
  helpCommand.ts   |     100 |      100 |     100 |     100 |                   
  ...oryCommand.ts |     100 |      100 |     100 |     100 |                   
  hooksCommand.ts  |   81.13 |    65.71 |   85.71 |   81.13 | ...,86-93,131-132 
  ideCommand.ts    |   60.75 |    64.28 |   41.17 |   60.75 | ...05-306,310-324 
  ...figCommand.ts |   52.83 |    81.25 |      70 |   52.83 | ...74-319,321-330 
  initCommand.ts   |   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  |   76.15 |    82.27 |   77.77 |   76.15 | ...44-349,403-408 
  ...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 | 58,63             
  renameCommand.ts |   85.71 |    86.04 |     100 |   85.71 | ...02-209,216-221 
  ...oreCommand.ts |    90.9 |    86.04 |     100 |    90.9 | ...41-146,176-177 
  resumeCommand.ts |     100 |      100 |     100 |     100 |                   
  rewindCommand.ts |   81.25 |      100 |      50 |   81.25 | 20-22             
  ...ngsCommand.ts |     100 |      100 |     100 |     100 |                   
  ...hubCommand.ts |   89.47 |       75 |      80 |   89.47 | 54-59             
  skillsCommand.ts |    85.5 |    81.25 |     100 |    85.5 | 36-44,70          
  statsCommand.ts  |    90.6 |    77.95 |     100 |    90.6 | ...91-694,785-792 
  ...ineCommand.ts |     100 |      100 |     100 |     100 |                   
  ...aryCommand.ts |    6.43 |      100 |      50 |    6.43 | 31-330            
  tasksCommand.ts  |   77.22 |    72.13 |     100 |   77.22 | ...46-150,172-177 
  ...tupCommand.ts |     100 |      100 |     100 |     100 |                   
  themeCommand.ts  |     100 |      100 |     100 |     100 |                   
  toolsCommand.ts  |     100 |      100 |     100 |     100 |                   
  trustCommand.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  vimCommand.ts    |   54.54 |      100 |      50 |   54.54 | 19-29             
  voice-command.ts |   93.57 |       88 |     100 |   93.57 | 35,97-102         
  ...owsCommand.ts |   91.82 |    78.87 |   66.66 |   91.82 | ...59-160,169-174 
 src/ui/components |   63.31 |    77.65 |   71.42 |   63.31 |                   
  AboutBox.tsx     |     100 |      100 |     100 |     100 |                   
  ...ateScreen.tsx |   35.48 |      100 |       0 |   35.48 | 26-48             
  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 |   88.36 |    88.57 |     100 |   88.36 | ...80-282,296-298 
  Composer.tsx     |   94.39 |    66.66 |     100 |   94.39 | ...-71,83,138,151 
  ...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 |       0 |        0 |       0 |       0 | 1-36              
  ...gProfiler.tsx |       0 |        0 |       0 |       0 | 1-36              
  ...ogManager.tsx |       0 |        0 |       0 |       0 | 1-577             
  DiffDialog.tsx   |   31.17 |    19.51 |   30.76 |   31.17 | ...07-712,722-735 
  ...ngsDialog.tsx |       0 |        0 |       0 |       0 | 1-195             
  ExitWarning.tsx  |     100 |      100 |     100 |     100 |                   
  ...hProgress.tsx |    87.8 |    33.33 |     100 |    87.8 | 28-31,56          
  ...ustDialog.tsx |     100 |      100 |     100 |     100 |                   
  Footer.tsx       |   76.87 |    52.08 |     100 |   76.87 | ...98-203,221-225 
  ...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 |   73.43 |    63.29 |     100 |   73.43 | ...37,440,443-449 
  ...ngeDialog.tsx |     100 |      100 |     100 |     100 |                   
  InputPrompt.tsx  |   81.07 |    80.12 |   77.77 |   81.07 | ...1976,2002,2054 
  ...Shortcuts.tsx |   20.87 |      100 |       0 |   20.87 | ...6,49-51,67-125 
  ...Indicator.tsx |   98.14 |    97.82 |     100 |   98.14 | 157-158           
  ...firmation.tsx |   91.42 |      100 |      50 |   91.42 | 26-31             
  MainContent.tsx  |   98.43 |    94.82 |   66.66 |   98.43 | 89,166-170        
  MemoryDialog.tsx |   64.76 |     77.9 |    62.5 |   64.76 | ...01,420,469-471 
  ...geDisplay.tsx |       0 |        0 |       0 |       0 | 1-41              
  ModelDialog.tsx  |   83.64 |    71.16 |     100 |   83.64 | ...74-690,747-751 
  ...tsDisplay.tsx |     100 |    97.22 |     100 |     100 | 270               
  ...fications.tsx |       0 |        0 |       0 |       0 | 1-58              
  ...onsDialog.tsx |       0 |        0 |       0 |       0 | 1-1004            
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...icePrompt.tsx |   92.64 |    85.71 |     100 |   92.64 | 102-106,134-139   
  PrepareLabel.tsx |   91.66 |    77.27 |     100 |   91.66 | 73-75,77-79,110   
  ...atePrompt.tsx |       0 |        0 |       0 |       0 | 1-134             
  ...geDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ngDisplay.tsx |       0 |        0 |       0 |       0 | 1-39              
  ...hProgress.tsx |   85.25 |    88.46 |     100 |   85.25 | 121-147           
  ...dSelector.tsx |   92.79 |    82.65 |     100 |   92.79 | ...19-323,354-370 
  ...ionPicker.tsx |   83.66 |    72.13 |     100 |   83.66 | ...96,402,444-466 
  ...onPreview.tsx |   93.58 |    84.21 |     100 |   93.58 | ...,70-71,195-197 
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...putPrompt.tsx |   72.56 |       80 |      40 |   72.56 | ...06-109,114-117 
  ...tedDialog.tsx |     100 |      100 |     100 |     100 |                   
  ...ngsDialog.tsx |   68.27 |    71.66 |      75 |   68.27 | ...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 |       0 |        0 |       0 |       0 | 1-40              
  ...iewDialog.tsx |   92.78 |    82.35 |      75 |   92.78 | ...5,77-79,93,124 
  ...tsDisplay.tsx |   95.86 |       75 |     100 |   95.86 | 67-71             
  ...ionPicker.tsx |       0 |        0 |       0 |       0 | 1-172             
  ...tivityTab.tsx |       0 |        0 |       0 |       0 | 1-275             
  StatsDialog.tsx  |       0 |        0 |       0 |       0 | 1-238             
  StatsDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ciencyTab.tsx |       0 |        0 |       0 |       0 | 1-258             
  ...atmapView.tsx |       0 |        0 |       0 |       0 | 1-107             
  ...essionTab.tsx |       0 |        0 |       0 |       0 | 1-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 |   91.37 |    79.41 |     100 |   91.37 | ...70,173,200-202 
  ThemeDialog.tsx  |   89.95 |    46.15 |      75 |   89.95 | ...71-173,243-245 
  ...ingViewer.tsx |   12.61 |      100 |       0 |   12.61 | 32-140            
  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 |       0 |        0 |       0 |       0 | 1-22              
  ...Indicator.tsx |    92.5 |     87.5 |     100 |    92.5 | 50-53             
  ...ackDialog.tsx |       0 |        0 |       0 |       0 | 1-134             
  ...xitDialog.tsx |   80.36 |    43.47 |      60 |   80.36 | ...24-238,248-251 
  ...odeVisuals.ts |   91.42 |    64.28 |     100 |   91.42 | 15,21,24          
  ...s-helpers.tsx |       0 |        0 |       0 |       0 | 1-102             
 ...nts/agent-view |   53.71 |    70.87 |   42.85 |   53.71 |                   
  ...atContent.tsx |    9.09 |      100 |       0 |    9.09 | 54-275,281-283    
  ...tChatView.tsx |   21.05 |      100 |       0 |   21.05 | 21-39             
  ...tComposer.tsx |   64.78 |    29.41 |   33.33 |   64.78 | ...51,269,277-279 
  AgentFooter.tsx  |   17.07 |      100 |       0 |   17.07 | 28-66             
  AgentHeader.tsx  |   15.38 |      100 |       0 |   15.38 | 27-64             
  AgentTabBar.tsx  |    87.9 |    63.88 |     100 |    87.9 | ...88,110-118,136 
  ...oryAdapter.ts |     100 |    91.83 |     100 |     100 | 103,109-110,138   
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
 ...mponents/arena |   42.38 |    68.69 |   73.68 |   42.38 |                   
  ArenaCards.tsx   |   73.06 |    71.79 |   85.71 |   73.06 | ...83-185,321-326 
  ...ectDialog.tsx |   83.48 |    69.86 |   88.88 |   83.48 | ...88-392,409-410 
  ...artDialog.tsx |       0 |        0 |       0 |       0 | 1-164             
  ...tusDialog.tsx |       0 |        0 |       0 |       0 | 1-288             
  ...topDialog.tsx |       0 |        0 |       0 |       0 | 1-213             
 ...ackground-view |   78.59 |    78.07 |   88.37 |   78.59 |                   
  ...sksDialog.tsx |   73.81 |    74.32 |   79.16 |   73.81 | ...1546,1568-1574 
  ...TasksPill.tsx |   67.03 |     86.2 |     100 |   67.03 | ...02-122,130-138 
  ...gentPanel.tsx |   97.43 |    85.39 |     100 |   97.43 | 121,436-440       
  ...Visibility.ts |     100 |      100 |     100 |     100 |                   
  ...e-overlay.tsx |    88.2 |    76.47 |     100 |    88.2 | ...36-138,140-142 
 ...nts/extensions |   84.58 |    78.18 |   83.33 |   84.58 |                   
  ...gerDialog.tsx |   82.46 |    77.77 |     100 |   82.46 | ...89,191-198,258 
  TabBar.tsx       |   97.29 |    88.88 |     100 |   97.29 | 33                
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...tensions/steps |   46.15 |    84.74 |   58.82 |   46.15 |                   
  ...ctionStep.tsx |   95.12 |    92.85 |   85.71 |   95.12 | 84-86,89          
  ...etailStep.tsx |       0 |        0 |       0 |       0 | 1-145             
  ...nListStep.tsx |   75.13 |    88.09 |   66.66 |   75.13 | ...52,173,202-208 
  ...electStep.tsx |       0 |        0 |       0 |       0 | 1-83              
  ...nfirmStep.tsx |   16.32 |      100 |       0 |   16.32 | 28-74             
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
 ...xtensions/tabs |   66.18 |    67.65 |   66.66 |   66.18 |                   
  DiscoverTab.tsx  |   57.21 |     63.2 |   55.55 |   57.21 | ...98,661-665,669 
  InstalledTab.tsx |   71.62 |    68.65 |   83.33 |   71.62 | ...67,772-773,810 
  SourcesTab.tsx   |   69.25 |     70.4 |   66.66 |   69.25 | ...16,535,607-619 
 ...tensions/views |   23.73 |    44.82 |       5 |   23.73 |                   
  ...tionsView.tsx |    6.02 |      100 |       0 |    6.02 | 52-65,68-368      
  ...tionsView.tsx |   43.45 |    44.82 |    6.66 |   43.45 | ...97-404,407-419 
  ...etailView.tsx |    9.56 |      100 |       0 |    9.56 | 40-67,70-158      
 ...mponents/hooks |   86.85 |    81.37 |   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.49 |     100 |   72.29 | ...51,563-568,572 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-13              
  ...erGrouping.ts |     100 |      100 |     100 |     100 |                   
  sourceLabels.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...components/mcp |   14.85 |    88.23 |   71.42 |   14.85 |                   
  ...ealthPill.tsx |   68.42 |    85.71 |     100 |   68.42 | 40-46             
  ...entDialog.tsx |       0 |        0 |       0 |       0 | 1-925             
  ...valDialog.tsx |   15.06 |      100 |       0 |   15.06 | 40-109            
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-35              
  types.ts         |       0 |        0 |       0 |       0 | 1-24              
  utils.ts         |      97 |       95 |     100 |      97 | 24,113-114        
 ...ents/mcp/steps |   52.64 |    72.37 |   57.14 |   52.64 |                   
  ...icateStep.tsx |    5.65 |      100 |       0 |    5.65 | 40-66,69-308      
  ...electStep.tsx |       0 |        0 |       0 |       0 | 1-88              
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...eListStep.tsx |   99.09 |    97.36 |     100 |   99.09 | 71                
  ...etailStep.tsx |    64.8 |    62.26 |   33.33 |    64.8 | ...75-284,295-317 
  ...rListStep.tsx |   82.05 |    75.55 |     100 |   82.05 | ...63,169,174-179 
  ...etailStep.tsx |    10.3 |      100 |       0 |    10.3 | ...1,67-79,82-140 
  ToolListStep.tsx |   69.29 |       50 |     100 |   69.29 | ...23,126,135-144 
 ...nents/messages |   85.47 |     81.3 |   78.82 |   85.47 |                   
  ...ionDialog.tsx |   80.84 |     77.6 |    62.5 |   80.84 | ...98,516,534-536 
  BtwMessage.tsx   |     100 |      100 |     100 |     100 |                   
  ...upDisplay.tsx |     100 |    91.83 |     100 |     100 | 27,31,33,35       
  ...onMessage.tsx |   91.93 |    82.35 |     100 |   91.93 | 57-59,61,63       
  ...nMessages.tsx |   87.33 |    76.31 |   91.66 |   87.33 | ...44-350,407-413 
  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.05 |    87.69 |     100 |   95.05 | ...32,134,167-172 
  ...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.31 |    74.02 |   33.33 |   82.31 | ...69-471,478-480 
  ...upMessage.tsx |   96.04 |    93.91 |     100 |   96.04 | ...76,265-271,364 
  ToolMessage.tsx  |   88.76 |    76.66 |    92.3 |   88.76 | ...66-771,798-800 
 ...ponents/shared |   85.06 |    81.42 |    95.5 |   85.06 |                   
  ...ctionList.tsx |     100 |      100 |     100 |     100 |                   
  ...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 |   77.22 |    85.71 |     100 |   77.22 | 45-63,70-73       
  StaticRender.tsx |   72.72 |      100 |     100 |   72.72 | 31-33             
  TextInput.tsx    |    80.8 |    67.24 |      80 |    80.8 | ...36-240,252-258 
  ...apsedTime.tsx |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |     100 |      100 |     100 |     100 |                   
  ...lizedList.tsx |    88.7 |    83.64 |      90 |    88.7 | ...14-515,745-773 
  text-buffer.ts   |   85.94 |    81.73 |   97.91 |   85.94 | ...2651,2749-2750 
  ...er-actions.ts |   73.93 |    67.22 |     100 |   73.93 | ...32-733,934-936 
 ...ponents/skills |       0 |        0 |       0 |       0 |                   
  ...gerDialog.tsx |       0 |        0 |       0 |       0 | 1-694             
 ...ents/subagents |       0 |        0 |       0 |       0 |                   
  constants.ts     |       0 |        0 |       0 |       0 | 1-71              
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
  reducers.tsx     |       0 |        0 |       0 |       0 | 1-190             
  types.ts         |       0 |        0 |       0 |       0 | 1-125             
  utils.ts         |       0 |        0 |       0 |       0 | 1-102             
 ...bagents/create |       0 |        0 |       0 |       0 |                   
  ...ionWizard.tsx |       0 |        0 |       0 |       0 | 1-299             
  ...rSelector.tsx |       0 |        0 |       0 |       0 | 1-85              
  ...onSummary.tsx |       0 |        0 |       0 |       0 | 1-331             
  ...tionInput.tsx |       0 |        0 |       0 |       0 | 1-177             
  ...dSelector.tsx |       0 |        0 |       0 |       0 | 1-63              
  ...nSelector.tsx |       0 |        0 |       0 |       0 | 1-58              
  ...EntryStep.tsx |       0 |        0 |       0 |       0 | 1-78              
  ToolSelector.tsx |       0 |        0 |       0 |       0 | 1-253             
 ...bagents/manage |   14.04 |    53.19 |    37.5 |   14.04 |                   
  ...ctionStep.tsx |       0 |        0 |       0 |       0 | 1-103             
  ...eleteStep.tsx |       0 |        0 |       0 |       0 | 1-62              
  ...tEditStep.tsx |       0 |        0 |       0 |       0 | 1-124             
  ...ctionStep.tsx |   35.42 |    59.52 |     100 |   35.42 | ...20-432,437-439 
  ...iewerStep.tsx |       0 |        0 |       0 |       0 | 1-73              
  ...gerDialog.tsx |       0 |        0 |       0 |       0 | 1-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.87 |    73.68 |     100 |   87.87 | 69-76             
  McpStatus.tsx    |   89.49 |    60.52 |     100 |   89.49 | ...72,175-177,262 
  SkillsList.tsx   |   27.27 |      100 |       0 |   27.27 | 18-35             
  ToolsList.tsx    |     100 |      100 |     100 |     100 |                   
 src/ui/contexts   |   81.55 |    78.24 |   83.07 |   81.55 |                   
  ...ewContext.tsx |   64.83 |    88.88 |      50 |   64.83 | ...16-219,225-235 
  AppContext.tsx   |      80 |       50 |     100 |      80 | 19-20             
  ...ewContext.tsx |   92.45 |    62.79 |      50 |   92.45 | ...69-270,272-276 
  ...deContext.tsx |   88.88 |      100 |       0 |   88.88 | 21                
  ...igContext.tsx |   81.81 |       50 |     100 |   81.81 | 15-16             
  ...ssContext.tsx |   81.86 |    81.65 |     100 |   81.86 | ...1257,1262-1264 
  ...owContext.tsx |   91.07 |    81.81 |     100 |   91.07 | 47-48,60-62       
  ...deContext.tsx |     100 |      100 |      50 |     100 |                   
  ...onContext.tsx |   78.68 |    73.77 |   91.66 |   78.68 | ...86-389,398-401 
  ...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             
  ...erContext.tsx |     100 |      100 |      50 |     100 |                   
  ...edContext.tsx |     100 |      100 |     100 |     100 |                   
  ...nsContext.tsx |   88.88 |       50 |     100 |   88.88 | 141-142           
  ...teContext.tsx |   86.66 |       50 |     100 |   86.66 | 224-225           
  ...deContext.tsx |      80 |     87.5 |      75 |      80 | ...11-112,118-120 
 src/ui/daemon     |   90.65 |    73.61 |   95.45 |   90.65 |                   
  ...ui-adapter.ts |   90.65 |    73.61 |   95.45 |   90.65 | ...44,762-763,849 
 src/ui/editors    |       0 |        0 |       0 |       0 |                   
  ...ngsManager.ts |       0 |        0 |       0 |       0 | 1-67              
 src/ui/hooks      |   83.16 |    81.36 |   88.37 |   83.16 |                   
  ...dProcessor.ts |      73 |    81.34 |     100 |      73 | ...03-704,710-715 
  ...ention-ref.ts |   98.23 |    83.33 |     100 |   98.23 | 118,132           
  keyToAnsi.ts     |    3.92 |      100 |       0 |    3.92 | 19-77             
  ...esourceRef.ts |     100 |      100 |     100 |     100 |                   
  ...dProcessor.ts |   94.62 |    73.58 |     100 |   94.62 | ...86-287,292-293 
  ...dProcessor.ts |   84.59 |    64.11 |   84.21 |   84.59 | ...1105,1126-1130 
  ...oice-input.ts |   92.36 |    81.95 |   66.66 |   92.36 | ...00,502-503,658 
  ...amingState.ts |   12.22 |      100 |       0 |   12.22 | 54-157            
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...dScrollbar.ts |     100 |      100 |     100 |     100 |                   
  ...ationFrame.ts |      42 |       75 |     100 |      42 | 42-44,53-59,62-87 
  ...odeCommand.ts |   58.82 |      100 |     100 |   58.82 | 28,33-48          
  ...enaCommand.ts |      85 |      100 |     100 |      85 | 23-24,29          
  ...aInProcess.ts |   27.92 |       80 |      25 |   27.92 | ...69-170,173-175 
  ...Completion.ts |    90.6 |     87.9 |     100 |    90.6 | ...28-435,475-484 
  ...ifications.ts |   86.91 |    96.29 |     100 |   86.91 | 116-130           
  ...tIndicator.ts |   83.49 |    70.96 |     100 |   83.49 | ...58,166,168-176 
  ...waySummary.ts |   96.22 |    69.69 |     100 |   96.22 | 125-127,169       
  ...ndTaskView.ts |   93.84 |    74.46 |     100 |   93.84 | ...25-129,218,224 
  ...chedScroll.ts |     100 |      100 |     100 |     100 |                   
  ...ketedPaste.ts |    23.8 |      100 |       0 |    23.8 | 19-37             
  ...nchCommand.ts |   93.19 |    71.05 |     100 |   93.19 | ...37,183,256-259 
  ...ompletion.tsx |   95.36 |    82.81 |     100 |   95.36 | ...32-233,235-236 
  ...dMigration.ts |    92.1 |    88.88 |     100 |    92.1 | 42-44             
  useCompletion.ts |   94.11 |    89.65 |     100 |   94.11 | ...32-133,137-138 
  ...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 |   36.76 |    10.52 |     100 |   36.76 | ...75-181,188-193 
  useDiffData.ts   |       0 |        0 |       0 |       0 | 1-87              
  ...oublePress.ts |   53.12 |       75 |     100 |   53.12 | 33-35,41-54       
  ...orSettings.ts |     100 |      100 |     100 |     100 |                   
  ...Completion.ts |   99.12 |    97.64 |     100 |   99.12 | 182-183           
  ...ionUpdates.ts |    93.5 |     92.3 |     100 |    93.5 | ...87-291,304-310 
  ...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 |   96.47 |    78.94 |     100 |   96.47 | 121,155-156       
  ...miniStream.ts |   83.56 |    80.09 |      95 |   83.56 | ...3272,3355-3363 
  ...BranchName.ts |     100 |    91.66 |     100 |     100 | 30                
  ...oryManager.ts |   97.94 |    98.24 |     100 |   97.94 | 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 |       0 |        0 |       0 |       0 | 1-90              
  ...gIndicator.ts |     100 |    96.66 |     100 |     100 | 109               
  useLogger.ts     |      16 |      100 |       0 |      16 | 15-45             
  useMCPHealth.ts  |   63.15 |       75 |      50 |   63.15 | 42-52,64-67       
  ...cpApproval.ts |   93.07 |    85.29 |     100 |   93.07 | ...23-126,138-139 
  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 |     87.5 |     100 |     100 | 29                
  ...ouseEvents.ts |   91.93 |       95 |      75 |   91.93 | 29-33             
  ...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.95 |    77.41 |   91.66 |   86.95 | ...70,311-323,371 
  useQwenAuth.ts   |     100 |      100 |     100 |     100 |                   
  ...lScheduler.ts |   88.54 |    91.83 |     100 |   88.54 | ...73-278,381-391 
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-7               
  ...tleRepaint.ts |     100 |      100 |     100 |     100 |                   
  ...umeCommand.ts |   93.47 |       68 |     100 |   93.47 | ...17,152,193-198 
  ...ompletion.tsx |   90.59 |    83.33 |     100 |   90.59 | ...01,104,137-140 
  ...ectionList.ts |   97.05 |    96.11 |     100 |   97.05 | ...90-191,245-248 
  ...sionPicker.ts |   92.87 |    90.35 |     100 |   92.87 | ...99-501,503-505 
  ...earchInput.ts |     100 |    97.29 |     100 |     100 | 82                
  ...ngsCommand.ts |   18.75 |      100 |       0 |   18.75 | 10-25             
  ...ellHistory.ts |   93.28 |    80.95 |     100 |   93.28 | ...96,153-154,164 
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-73              
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...Completion.ts |   82.85 |    85.13 |   94.73 |   82.85 | ...78-680,688-724 
  ...tateAndRef.ts |     100 |      100 |     100 |     100 |                   
  ...tatsDialog.ts |     100 |      100 |     100 |     100 |                   
  useStatusLine.ts |    97.1 |       93 |     100 |    97.1 | ...70-374,475-482 
  ...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      |   97.59 |    94.73 |     100 |   97.59 | 17-18             
  ...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 | 47-48,72          
  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 |    6.66 |     100 |                   
  ...eractiveUi.ts |     100 |      100 |    6.66 |     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.5 |    73.06 |     100 |    98.5 |                   
  ansi-light.ts    |     100 |      100 |     100 |     100 |                   
  ansi.ts          |     100 |      100 |     100 |     100 |                   
  atom-one-dark.ts |     100 |      100 |     100 |     100 |                   
  ayu-light.ts     |     100 |      100 |     100 |     100 |                   
  ayu.ts           |     100 |      100 |     100 |     100 |                   
  color-utils.ts   |   99.23 |    97.05 |     100 |   99.23 | 277-278           
  default-light.ts |     100 |      100 |     100 |     100 |                   
  default.ts       |     100 |      100 |     100 |     100 |                   
  ...inal-theme.ts |   88.59 |    85.96 |     100 |   88.59 | ...57-261,266-270 
  dracula.ts       |     100 |      100 |     100 |     100 |                   
  github-dark.ts   |     100 |      100 |     100 |     100 |                   
  github-light.ts  |     100 |      100 |     100 |     100 |                   
  googlecode.ts    |     100 |      100 |     100 |     100 |                   
  no-color.ts      |     100 |      100 |     100 |     100 |                   
  qwen-dark.ts     |     100 |      100 |     100 |     100 |                   
  qwen-light.ts    |     100 |      100 |     100 |     100 |                   
  ...tic-tokens.ts |     100 |      100 |     100 |     100 |                   
  ...-of-purple.ts |     100 |      100 |     100 |     100 |                   
  theme-manager.ts |   88.68 |    84.33 |     100 |   88.68 | ...83-392,397-398 
  theme.ts         |     100 |    38.02 |     100 |     100 | ...34-449,457-461 
  xcode.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/utils      |   83.84 |    83.36 |   93.42 |   83.84 |                   
  ...Colorizer.tsx |   80.42 |    85.41 |     100 |   80.42 | ...00-201,298-324 
  ...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.88 |     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  |   90.38 |    73.91 |     100 |   90.38 | 23,25,29,31,33    
  formatters.ts    |    95.4 |    98.38 |     100 |    95.4 | 123-126           
  gradientUtils.ts |     100 |      100 |     100 |     100 |                   
  highlight.ts     |     100 |      100 |     100 |     100 |                   
  ...oryMapping.ts |     100 |    96.77 |     100 |     100 | 43                
  historyUtils.ts  |   95.55 |    95.08 |     100 |   95.55 | 95-98             
  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 |       95 |     100 |     100 | 81                
  ...nUtilities.ts |   90.21 |    85.71 |     100 |   90.21 | ...,91-95,107-108 
  ...t-position.ts |     100 |      100 |     100 |     100 |                   
  ...ToolGroups.ts |   98.65 |    96.72 |     100 |   98.65 | 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         |   92.14 |    73.77 |     100 |   92.14 | ...29,136,140-143 
  osc8.ts          |   94.84 |    88.74 |     100 |   94.84 | ...57,442,446-447 
  ...mConstants.ts |     100 |      100 |     100 |     100 |                   
  restoreGoal.ts   |   99.02 |    97.56 |     100 |   99.02 | 106               
  ...storyUtils.ts |   66.99 |    75.96 |   93.33 |   66.99 | ...41-463,584-585 
  ...ickerUtils.ts |     100 |      100 |     100 |     100 |                   
  ...are-cursor.ts |   89.47 |    85.71 |     100 |   89.47 | 39-44             
  ...ataService.ts |   93.17 |     79.1 |     100 |   93.17 | ...14,227,254-256 
  ...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.89 |   92.85 |   97.61 | ...50-251,386-387 
  ...background.ts |     100 |      100 |     100 |     100 |                   
  todoSnapshot.ts  |   89.33 |    93.47 |     100 |   89.33 | ...,66-78,180-181 
  updateCheck.ts   |     100 |    80.95 |     100 |     100 | 30-42             
  ...ow-keyword.ts |     100 |      100 |     100 |     100 |                   
 ...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/ui/voice      |   81.12 |    72.76 |    79.1 |   81.12 |                   
  ...d-recorder.ts |     6.2 |        0 |       0 |     6.2 | ...33-159,162-163 
  ...o-recorder.ts |   84.61 |    93.33 |   57.14 |   84.61 | ...16-117,131-136 
  ...me-session.ts |   91.14 |     64.7 |   92.85 |   91.14 | ...76,282,292-295 
  sox-recorder.ts  |    92.7 |    71.87 |     100 |    92.7 | ...34-135,153-154 
  ...ailability.ts |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |     100 |      100 |     100 |     100 |                   
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  ...e-recorder.ts |   88.29 |    67.74 |   81.81 |   88.29 | ...,98-99,112,115 
  voice-refine.ts  |     100 |    93.33 |     100 |     100 | 92                
  ...ream-retry.ts |     100 |    88.88 |     100 |     100 | 18                
  ...am-session.ts |   87.45 |    63.33 |   81.81 |   87.45 | ...03,320-322,339 
  ...ranscriber.ts |     100 |      100 |     100 |     100 |                   
 src/utils         |   73.84 |    89.63 |   91.04 |   73.84 |                   
  acpModelUtils.ts |   94.44 |     92.3 |     100 |   94.44 | 44,68-69,73-74    
  apiPreconnect.ts |   96.72 |    97.14 |     100 |   96.72 | 165-168           
  checks.ts        |   33.33 |      100 |       0 |   33.33 | 23-28             
  cleanup.ts       |   82.53 |    93.33 |      80 |   82.53 | 74,105-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.73 |    73.23 |   88.88 |   70.73 | ...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.55 |     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      |    92.7 |    84.09 |     100 |    92.7 | ...07-110,158-161 
  ...AutoUpdate.ts |    92.2 |    95.23 |   88.88 |    92.2 | 130-141           
  ...tyWarnings.ts |     100 |      100 |     100 |     100 |                   
  ...lationInfo.ts |   97.71 |    94.18 |     100 |   97.71 | ...57,274-275,320 
  languageUtils.ts |   98.47 |    97.67 |     100 |   98.47 | 153-154           
  math.ts          |       0 |        0 |       0 |       0 | 1-15              
  ...iagnostics.ts |   94.57 |    83.01 |   88.88 |   94.57 | ...05,311,315-317 
  ...serMessage.ts |     100 |      100 |     100 |     100 |                   
  ...onfigUtils.ts |   96.04 |     94.4 |     100 |   96.04 | ...7-78,83-84,324 
  ...iveHelpers.ts |   96.93 |    93.84 |     100 |   96.93 | ...15-416,514,527 
  osc.ts           |    97.5 |      100 |   88.88 |    97.5 | 195-196           
  package.ts       |   88.88 |       80 |     100 |   88.88 | 31-32             
  processUtils.ts  |     100 |      100 |     100 |     100 |                   
  readStdin.ts     |   93.67 |    94.11 |   85.71 |   93.67 | 79-83             
  relaunch.ts      |   93.22 |    81.25 |     100 |   93.22 | 65-67,80          
  resolvePath.ts   |     100 |      100 |     100 |     100 |                   
  runBudget.ts     |   99.35 |    96.77 |     100 |   99.35 | 119               
  sandbox-path.ts  |     100 |      100 |     100 |     100 |                   
  sandbox.ts       |       0 |        0 |       0 |       0 | 1-1042            
  ...xImageName.ts |     100 |    77.77 |     100 |     100 | 10,18             
  sandboxMounts.ts |     100 |      100 |     100 |     100 |                   
  sessionPaths.ts  |   90.84 |    90.56 |     100 |   90.84 | ...81-182,185-186 
  settingsUtils.ts |   82.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 |   27.55 |    76.11 |   45.83 |   27.55 | ...44-845,848-867 
  ...upProfiler.ts |   98.47 |    94.66 |     100 |   98.47 | 132-133,308       
  ...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 |    97.61 |     100 |     100 | 60                
  ...iffPreview.ts |   94.11 |    83.33 |     100 |   94.11 | 13                
  ...entEmitter.ts |     100 |      100 |     100 |     100 |                   
  ...ansionHook.ts |     100 |      100 |     100 |     100 |                   
  ...upWarnings.ts |   87.75 |       75 |     100 |   87.75 | 47-48,53-54,57-58 
  version.ts       |     100 |       50 |     100 |     100 | 11                
  ...ingHandler.ts |     100 |      100 |     100 |     100 |                   
  windowTitle.ts   |   95.45 |    93.33 |     100 |   95.45 | 54-55             
  ...WithBackup.ts |   65.04 |    77.77 |     100 |   65.04 | 97,112,133-172    
 ...s/housekeeping |   91.63 |    91.02 |      95 |   91.63 |                   
  cleanup.ts       |   95.77 |    95.83 |     100 |   95.77 | 70-72             
  ...eractionAt.ts |     100 |      100 |     100 |     100 |                   
  scheduler.ts     |   91.91 |    90.47 |    87.5 |   91.91 | 58-62,73,131-135  
  throttledOnce.ts |   86.66 |     86.2 |     100 |   86.66 | ...99,105,137-138 
-------------------|---------|----------|---------|---------|-------------------
Core Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   84.14 |    84.52 |   85.37 |   84.14 |                   
 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        |   89.65 |    81.31 |   94.65 |   89.65 |                   
  ...transcript.ts |    92.3 |    85.93 |     100 |    92.3 | ...05,324-325,456 
  ...ent-resume.ts |   83.33 |    71.42 |   79.41 |   83.33 | ...1260-1264,1267 
  ...ound-tasks.ts |   96.83 |    89.13 |     100 |   96.83 | ...1170,1190-1193 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...n-registry.ts |   95.65 |    89.28 |     100 |   95.65 | ...12-413,485-489 
  ...w-snapshot.ts |   91.86 |       75 |     100 |   91.86 | ...54,178,185-187 
 src/agents/arena  |   75.91 |    66.34 |   78.72 |   75.91 |                   
  ...gentClient.ts |   79.47 |    88.88 |   81.81 |   79.47 | ...68-183,189-204 
  ArenaManager.ts  |   74.58 |    62.65 |   78.26 |   74.58 | ...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.47 |    86.27 |   73.75 |   76.47 |                   
  ITermBackend.ts  |   97.97 |    93.93 |     100 |   97.97 | ...78-180,255,307 
  ...essBackend.ts |   92.06 |    91.04 |      90 |   92.06 | ...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 |   88.03 |     84.9 |   82.21 |   88.03 |                   
  agent-context.ts |     100 |      100 |     100 |     100 |                   
  agent-core.ts    |    79.2 |    74.69 |   65.95 |    79.2 | ...1834,1861-1908 
  agent-events.ts  |     100 |      100 |     100 |     100 |                   
  ...t-headless.ts |   87.93 |    79.06 |   63.63 |   87.93 | ...00-401,404-405 
  ...nteractive.ts |   79.52 |       80 |   74.07 |   79.52 | ...83,485-488,491 
  ...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 |                   
  ...low-budget.ts |     100 |      100 |     100 |     100 |                   
  ...ow-journal.ts |   91.76 |    75.86 |     100 |   91.76 | ...38-139,179-181 
  ...chestrator.ts |   91.57 |    87.64 |   82.35 |   91.57 | ...1739,1788-1791 
  ...ow-prompts.ts |     100 |      100 |     100 |     100 |                   
  ...ow-sandbox.ts |   96.87 |    94.51 |     100 |   96.87 | ...24-325,330-331 
  ...flow-saved.ts |   96.51 |    94.36 |     100 |   96.51 | 134-135,234-237   
  ...flow-stall.ts |   97.87 |    82.69 |     100 |   97.87 | 136-137,234       
 src/agents/tasks  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/agents/team   |   80.31 |    83.12 |    86.5 |   80.31 |                   
  TeamManager.ts   |   67.11 |    75.94 |   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        |   79.56 |    84.05 |   66.38 |   79.56 |                   
  ...xtDefaults.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   78.05 |    83.23 |    62.7 |   78.05 | ...5532,5537-5538 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  models.ts        |     100 |      100 |     100 |     100 |                   
  storage.ts       |   94.63 |    91.86 |   89.58 |   94.63 | ...15-416,419-420 
 ...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.92 |    84.29 |   92.14 |   88.92 |                   
  baseLlmClient.ts |   86.28 |    78.43 |   77.77 |   86.28 | ...66,568-578,587 
  client.ts        |   87.62 |    81.01 |      90 |   87.62 | ...2616,2711-2712 
  ...tGenerator.ts |   88.07 |       75 |     100 |   88.07 | ...79-383,391-395 
  ...lScheduler.ts |   88.36 |    82.62 |    96.2 |   88.36 | ...4262,4290-4301 
  geminiChat.ts    |   89.04 |    87.24 |      95 |   89.04 | ...3253,3320-3321 
  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.72 |    73.68 |     100 |   86.72 | ...00-201,215-224 
  ...issionFlow.ts |   98.78 |       96 |     100 |   98.78 | 93                
  prompts.ts       |   88.93 |    87.87 |   72.72 |   88.93 | ...-910,1113-1114 
  ...port-retry.ts |     100 |      100 |     100 |     100 |                   
  tokenLimits.ts   |     100 |    89.28 |     100 |     100 | 30,65-66          
  ...allIdUtils.ts |   98.23 |     92.1 |     100 |   98.23 | 36,45             
  ...okTriggers.ts |   99.43 |    91.58 |     100 |   99.43 | 175,186           
  turn.ts          |   97.22 |    88.88 |     100 |   97.22 | ...96,509-510,556 
 ...ntentGenerator |   95.04 |    82.54 |      94 |   95.04 |                   
  ...tGenerator.ts |   96.59 |    84.07 |   92.85 |   96.59 | ...,973,1001-1003 
  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.58 |    84.69 |    92.1 |   94.58 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |   94.48 |    83.39 |   91.66 |   94.48 | ...1108-1109,1137 
  ...tDetection.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   88.63 |    85.05 |   93.97 |   88.63 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  converter.ts     |    87.7 |    82.36 |   96.15 |    87.7 | ...1508,1677-1692 
  errorHandler.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |   58.33 |    71.42 |      50 |   58.33 | ...70,73-77,85-89 
  ...tGenerator.ts |    66.4 |    70.58 |   88.88 |    66.4 | ...51-157,168-169 
  pipeline.ts      |   95.51 |     88.6 |     100 |   95.51 | ...07-708,716,784 
  ...ureContext.ts |     100 |      100 |     100 |     100 |                   
  ...ingOptions.ts |       0 |        0 |       0 |       0 | 1                 
  ...CallParser.ts |    90.2 |    87.65 |     100 |    90.2 | ...39-343,373-374 
  ...kingParser.ts |     100 |    96.87 |     100 |     100 | 42                
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...rator/provider |    97.1 |    90.49 |   96.07 |    97.1 |                   
  dashscope.ts     |   97.78 |     92.3 |   94.44 |   97.78 | ...15-316,458-459 
  deepseek.ts      |   94.91 |    89.36 |     100 |   94.91 | ...31-132,145-146 
  default.ts       |    97.5 |    96.55 |   88.88 |    97.5 | 123-124,197       
  index.ts         |     100 |      100 |     100 |     100 |                   
  mimo.ts          |   94.11 |    66.66 |     100 |   94.11 | 29,52-53          
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  mistral.ts       |   96.07 |    73.33 |     100 |   96.07 | 32-33             
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 |                   
  utils.ts         |     100 |      100 |     100 |     100 |                   
 src/extension     |   77.79 |    79.94 |   84.61 |   77.79 |                   
  ...-converter.ts |   78.29 |    70.87 |     100 |   78.29 | ...1108,1153-1154 
  corruptFile.ts   |     100 |       50 |     100 |     100 | 40-45             
  ...-converter.ts |    73.8 |       75 |     100 |    73.8 | 44-54             
  ...ionManager.ts |   60.68 |    71.81 |   55.17 |   60.68 | ...1613,1638-1639 
  ...references.ts |     100 |    89.58 |     100 |     100 | ...05,129,197,200 
  ...onSettings.ts |   92.65 |    91.89 |     100 |   92.65 | ...28-232,312-313 
  ...-converter.ts |    75.9 |    83.33 |   85.71 |    75.9 | ...98,202,214-248 
  github.ts        |   84.71 |     85.4 |     100 |   84.71 | ...61-662,670-671 
  http-client.ts   |   84.61 |       80 |     100 |   84.61 | 20-21             
  i18n.ts          |   78.26 |    95.83 |      50 |   78.26 | 104-110,116-123   
  index.ts         |     100 |      100 |     100 |     100 |                   
  marketplace.ts   |   87.11 |    84.28 |     100 |   87.11 | ...44,348-354,429 
  npm.ts           |   74.67 |    71.64 |     100 |   74.67 | ...19-421,428-432 
  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    
  ...ceRegistry.ts |   93.96 |    83.14 |     100 |   93.96 | ...35-341,362-363 
  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      |   76.02 |    74.12 |   90.62 |   76.02 |                   
  followupState.ts |   98.44 |    95.74 |     100 |   98.44 | 236-237           
  index.ts         |     100 |      100 |     100 |     100 |                   
  overlayFs.ts     |   96.29 |    88.88 |     100 |   96.29 | 78,108,122        
  speculation.ts   |   63.01 |    40.29 |   71.42 |   63.01 | ...73-574,577-582 
  ...onToolGate.ts |     100 |    96.55 |     100 |     100 | 95                
  ...nGenerator.ts |   67.96 |    77.58 |      80 |   67.96 | ...67-218,297-299 
 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.94 |    85.59 |   88.05 |   86.94 |                   
  ...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.32 |    85.05 |   94.11 |   95.32 | ...71,928-929,939 
  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    |      87 |      100 |   68.88 |      87 | ...15-716,722-723 
  ...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 |    86.74 |     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.63 |    83.78 |   78.33 |   75.63 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  detect-ide.ts    |     100 |      100 |     100 |     100 |                   
  ide-client.ts    |    66.3 |    82.26 |   66.66 |    66.3 | ...9-970,999-1007 
  ide-installer.ts |   89.06 |    79.31 |     100 |   89.06 | ...36,143-147,160 
  ideContext.ts    |     100 |      100 |     100 |     100 |                   
  process-utils.ts |   84.84 |    71.79 |     100 |   84.84 | ...37,151,193-194 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/lsp           |   43.47 |     58.9 |   52.48 |   43.47 |                   
  ...nfigLoader.ts |   78.28 |     64.7 |      95 |   78.28 | ...35-437,441-447 
  ...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           |   82.39 |    77.73 |   78.33 |   82.39 |                   
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...h-provider.ts |   86.95 |      100 |   33.33 |   86.95 | ...,93,97,101-102 
  ...h-provider.ts |   79.52 |    58.06 |     100 |   79.52 | ...33-940,947-949 
  ...en-storage.ts |   98.78 |    97.95 |     100 |   98.78 | 106-107           
  oauth-utils.ts   |   73.61 |    85.24 |    92.3 |   73.61 | ...46-366,392-421 
  ...n-provider.ts |   89.83 |       96 |   45.45 |   89.83 | ...43,147,151-152 
 .../token-storage |   82.12 |    88.19 |   89.28 |   82.12 |                   
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   87.08 |    87.27 |   95.23 |   87.08 | ...00-201,214-215 
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   68.14 |    82.35 |   64.28 |   68.14 | ...81-295,298-314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/memory        |   75.01 |    78.17 |    73.5 |   75.01 |                   
  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       |   91.36 |    72.41 |     100 |   91.36 | ...99,118-121,189 
  ...entPlanner.ts |   67.59 |     73.8 |      50 |   67.59 | ...31,240-243,415 
  ...ionPlanner.ts |       0 |        0 |       0 |       0 | 1                 
  forget.ts        |   46.21 |    61.53 |   44.44 |   46.21 | ...06,213,216-348 
  indexer.ts       |    86.3 |       50 |     100 |    86.3 | ...56,62-63,75-76 
  manager.ts       |    78.5 |    82.19 |   77.77 |    78.5 | ...1470,1483-1485 
  memoryAge.ts     |   90.47 |    81.81 |     100 |   90.47 | 50-51             
  paths.ts         |   79.06 |    95.12 |     100 |   79.06 | 32-33,49-86       
  ...ing-skills.ts |     100 |       72 |     100 |     100 | 31-35,73-78,97    
  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.1 |    81.81 |     100 |    93.1 | ...25,127-128,136 
  scan.ts          |   92.92 |    78.26 |     100 |   92.92 | ...51-52,62,90-91 
  ...entPlanner.ts |   58.33 |    67.34 |   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        |   90.54 |    87.95 |   89.74 |   90.54 |                   
  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 |       44 |   84.61 |   74.22 | ...,67-74,106-117 
  ...igResolver.ts |   98.66 |    92.75 |     100 |   98.66 | 163,325,331       
  modelRegistry.ts |     100 |    98.91 |     100 |     100 | 177               
  modelsConfig.ts  |   86.79 |    86.23 |   85.36 |   86.79 | ...1344,1373-1374 
  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.91 |     91.3 |   69.56 |   82.91 |                   
  autoMode.ts      |   97.74 |       94 |     100 |   97.74 | ...29,557-564,673 
  ...transcript.ts |      98 |       84 |     100 |      98 | 200-201           
  classifier.ts    |      94 |    94.44 |     100 |      94 | 158-165,385-389   
  ...erousRules.ts |     100 |    89.36 |     100 |     100 | 110,133,147,175   
  ...alTracking.ts |     100 |      100 |     100 |     100 |                   
  ...e-commands.ts |   86.77 |     73.8 |     100 |   86.77 | 131-141,210-214   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...on-manager.ts |   84.91 |     89.1 |      80 |   84.91 | ...1026,1132-1136 
  rule-parser.ts   |   97.42 |    93.82 |     100 |   97.42 | ...-890,1039-1041 
  ...-semantics.ts |   70.36 |    91.07 |   46.66 |   70.36 | ...2237,2300-2303 
  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     |   76.16 |    91.42 |      80 |   76.16 |                   
  ...viewAgents.ts |   52.28 |    88.46 |   66.66 |   52.28 | ...24-220,242-243 
  ...provalGate.ts |   92.47 |    92.85 |   85.71 |   92.47 | ...86-187,268-274 
  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     |   80.44 |    75.28 |   68.75 |   80.44 |                   
  all-providers.ts |   69.23 |      100 |       0 |   69.23 | 71-72,76-82,86-92 
  index.ts         |     100 |      100 |     100 |     100 |                   
  install.ts       |   98.93 |    87.71 |     100 |   98.93 | 286-287           
  ...der-config.ts |    72.6 |    69.49 |   73.91 |    72.6 | ...94-495,502-511 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...viders/presets |   97.56 |    89.28 |   55.55 |   97.56 |                   
  ...oding-plan.ts |   87.34 |      100 |       0 |   87.34 | 82-84,87-89,91-94 
  ...a-standard.ts |     100 |      100 |     100 |     100 |                   
  ...token-plan.ts |     100 |      100 |     100 |     100 |                   
  ...m-provider.ts |   97.05 |    81.25 |      75 |   97.05 | 118-119           
  deepseek.ts      |     100 |      100 |     100 |     100 |                   
  idealab.ts       |     100 |      100 |     100 |     100 |                   
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  openrouter.ts    |     100 |      100 |     100 |     100 |                   
  requesty.ts      |     100 |      100 |     100 |     100 |                   
  zai.ts           |     100 |      100 |     100 |     100 |                   
 src/qwen          |    85.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/resources     |     100 |      100 |     100 |     100 |                   
  ...e-registry.ts |     100 |      100 |     100 |     100 |                   
 src/services      |   87.84 |    84.89 |    93.9 |   87.84 |                   
  ...ionTrailer.ts |     100 |      100 |     100 |     100 |                   
  ...llRegistry.ts |   97.35 |    85.34 |     100 |   97.35 | ...94,117,417-418 
  ...ionService.ts |   96.46 |    94.44 |     100 |   96.46 | ...41,657,786-794 
  ...ingService.ts |   84.06 |    82.35 |   81.39 |   84.06 | ...1459,1474-1475 
  ...ttribution.ts |   91.73 |    87.71 |      90 |   91.73 | ...80-685,826-827 
  ...utSlimming.ts |   99.52 |    96.42 |     100 |   99.52 | 98                
  cronScheduler.ts |   95.09 |    90.18 |     100 |   95.09 | ...-940,1239-1240 
  cronTasksFile.ts |   95.03 |    89.47 |     100 |   95.03 | ...44-147,172-173 
  cronTasksLock.ts |   94.44 |    89.47 |     100 |   94.44 | ...02-103,132-133 
  ...eryService.ts |   82.07 |       92 |      80 |   82.07 | ...43,149-150,155 
  ...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 |   99.07 |    98.48 |     100 |   99.07 | 462-463,510-511   
  ...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.27 |    91.22 |     100 |   97.27 | ...50-451,606-607 
  ...ttachments.ts |   97.24 |    90.34 |     100 |   97.24 | ...08,646,661-662 
  sessionRecap.ts  |     9.7 |      100 |       0 |     9.7 | 42-172            
  ...ionService.ts |   86.32 |    78.72 |   94.87 |   86.32 | ...1592,1662-1682 
  sessionTitle.ts  |   93.87 |    71.15 |     100 |   93.87 | ...32-235,266-267 
  ...ionService.ts |   82.58 |    77.96 |   90.62 |   82.58 | ...2173,2179-2184 
  ...pInhibitor.ts |   97.34 |    92.68 |     100 |   97.34 | ...28,167,361-362 
  ...Estimation.ts |     100 |    86.66 |     100 |     100 | 96-97             
  ...ageService.ts |   97.76 |    91.59 |   93.75 |   97.76 | ...61-262,366,567 
  ...UseSummary.ts |   94.63 |    88.46 |     100 |   94.63 | ...62-164,214-215 
  ...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 |   87.98 |    86.95 |     100 |   87.98 | ...38-439,455-456 
 ...icrocompaction |   99.35 |    95.69 |     100 |   99.35 |                   
  microcompact.ts  |   99.35 |    95.69 |     100 |   99.35 | 224-225,618       
 ...s/visionBridge |   96.73 |    93.97 |   93.75 |   96.73 |                   
  ...part-utils.ts |     100 |      100 |     100 |     100 |                   
  ...ge-service.ts |      96 |     90.9 |      90 |      96 | ...07,208,290,373 
 src/skills        |   88.18 |    86.66 |   90.16 |   88.18 |                   
  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.65 |    86.95 |     100 |   89.65 | ...11-112,117-118 
  symlinkScope.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |   97.91 |       98 |     100 |   97.91 | 277-278           
 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.88 |       87 |    80.8 |   78.88 |                   
  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 |   97.47 |    93.15 |     100 |   97.47 | 39-44             
  ...-exporters.ts |   65.78 |    83.33 |   55.55 |   65.78 | ...04-105,108-109 
  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       |   52.49 |    66.66 |   59.18 |   52.49 | ...1305,1322-1342 
  metrics.ts       |   76.07 |    78.57 |   78.94 |   76.07 | ...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.07 |   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         |   78.73 |    85.27 |   83.54 |   78.73 | ...1293,1297-1304 
  uiTelemetry.ts   |   93.07 |    92.85 |   83.33 |   93.07 | ...62,290,410-411 
 ...ry/qwen-logger |   69.86 |    82.69 |   65.51 |   69.86 |                   
  event-types.ts   |       0 |        0 |       0 |       0 |                   
  qwen-logger.ts   |   69.86 |    82.52 |   64.91 |   69.86 | ...1078,1116-1117 
 src/test-utils    |   93.44 |    96.07 |   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.29 |   74.19 |   91.71 | ...54,218-219,232 
  ...aceContext.ts |     100 |      100 |     100 |     100 |                   
 src/tools         |   83.07 |     82.7 |   87.53 |   83.07 |                   
  ...erQuestion.ts |   90.74 |    82.43 |    92.3 |   90.74 | ...23-424,431-432 
  cron-create.ts   |   88.69 |    94.73 |   66.66 |   88.69 | ...,45-46,183-191 
  cron-delete.ts   |   97.56 |      100 |   83.33 |   97.56 | 31-32             
  cron-list.ts     |   98.16 |    93.75 |    87.5 |   98.16 | 50-51             
  diffOptions.ts   |     100 |      100 |     100 |     100 |                   
  edit.ts          |   80.82 |    83.48 |      75 |   80.82 | ...08-709,819-869 
  ...r-worktree.ts |   83.14 |    67.56 |    87.5 |   83.14 | ...84-187,278-279 
  enterPlanMode.ts |   81.08 |    66.66 |   85.71 |   81.08 | ...,74-79,112-126 
  exit-worktree.ts |   83.29 |    83.65 |   94.44 |   83.29 | ...14-515,537-538 
  exitPlanMode.ts  |   82.53 |    77.19 |     100 |   82.53 | ...91-394,426-429 
  glob.ts          |   95.92 |    87.69 |    92.3 |   95.92 | ...16,172,303,306 
  grep.ts          |   83.09 |    86.66 |   80.95 |   83.09 | ...60-661,711-712 
  ...adTracking.ts |     100 |      100 |     100 |     100 |                   
  loop-wakeup.ts   |   99.24 |    92.85 |     100 |   99.24 | 44                
  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 |   81.09 |    79.55 |    85.1 |   81.09 | ...3135,3137-3138 
  mcp-client.ts    |   75.11 |    82.64 |      85 |   75.11 | ...1900,1904-1907 
  ...ry-timeout.ts |     100 |      100 |     100 |     100 |                   
  mcp-errors.ts    |     100 |      100 |     100 |     100 |                   
  ...pool-entry.ts |   77.56 |    84.11 |   77.14 |   77.56 | ...1291,1299-1300 
  ...ool-events.ts |       8 |        0 |       0 |       8 | 132-158           
  mcp-pool-key.ts  |   97.46 |    93.93 |     100 |   97.46 | 175-176           
  ...ce-content.ts |   96.55 |    91.17 |     100 |   96.55 | 80-82             
  mcp-status.ts    |     100 |      100 |     100 |     100 |                   
  mcp-tool.ts      |   91.43 |     89.9 |   96.66 |   91.43 | ...72-673,723-724 
  ...sport-pool.ts |   83.49 |    80.15 |   84.61 |   83.49 | ...1409,1416-1420 
  ...ace-budget.ts |   87.27 |     82.6 |     100 |   87.27 | ...00-305,340-345 
  memory-config.ts |     100 |      100 |     100 |     100 |                   
  ...iable-tool.ts |     100 |    84.61 |     100 |     100 | 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 |    89.74 |     100 |   82.57 | 174-185,234-247   
  read-file.ts     |   94.79 |    90.32 |   81.81 |   94.79 | ...04,307,390-391 
  ...p-resource.ts |   96.85 |      100 |   91.66 |   96.85 | 92-96             
  ripGrep.ts       |   95.87 |     88.4 |   94.73 |   95.87 | ...56-657,663-664 
  ...-transport.ts |    6.34 |        0 |       0 |    6.34 | 47-145            
  send-message.ts  |   81.39 |    88.88 |    62.5 |   81.39 | ...22-228,311-319 
  ...n-mcp-view.ts |   93.57 |     92.3 |      90 |   93.57 | 122-130           
  shell.ts         |   76.79 |    81.58 |   91.11 |   76.79 | ...4718,4781-4782 
  skill-utils.ts   |     100 |      100 |     100 |     100 |                   
  skill.ts         |    90.2 |     93.1 |   88.88 |    90.2 | ...64,468,497-519 
  ...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.04 |     76.1 |   81.39 |   76.04 | ...62-863,871-872 
  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     |   90.12 |    85.71 |   92.85 |   90.12 | ...11-312,326-327 
  write-file.ts    |   82.65 |    80.45 |   84.61 |   82.65 | ...65-668,696-731 
 src/tools/agent   |   80.69 |    83.58 |      80 |   80.69 |                   
  agent.ts         |   80.62 |    83.71 |   79.51 |   80.62 | ...3100,3127-3190 
  fork-subagent.ts |   82.35 |    77.77 |   85.71 |   82.35 | 83-101,133-134    
 ...tools/artifact |   95.58 |    91.01 |   88.37 |   95.58 |                   
  artifact-tool.ts |   90.23 |    81.39 |   69.23 |   90.23 | ...81-282,290-293 
  ...-publisher.ts |     100 |    85.71 |     100 |     100 | 32                
  ...-publisher.ts |   96.74 |    97.72 |    87.5 |   96.74 | 29-30,156-157     
  html.ts          |     100 |    96.77 |     100 |     100 | 122               
  ...-publisher.ts |     100 |       80 |     100 |     100 | 30                
  oss-publisher.ts |    98.1 |    91.48 |     100 |    98.1 | 43-45             
  publisher.ts     |     100 |      100 |     100 |     100 |                   
 ...s/computer-use |   90.05 |    81.35 |   75.36 |   90.05 |                   
  bootstrap.ts     |   59.42 |    80.95 |   41.66 |   59.42 | ...35-339,341-345 
  client.ts        |   73.22 |    89.65 |   64.28 |   73.22 | ...70-172,233-242 
  constants.ts     |     100 |    94.73 |     100 |     100 | 129,256           
  downloader.ts    |   65.29 |    52.77 |   58.33 |   65.29 | ...99-300,316-355 
  index.ts         |     100 |      100 |     100 |     100 |                   
  install-state.ts |   94.44 |    72.72 |     100 |   94.44 | 44-45             
  ...n-detector.ts |     100 |     87.5 |     100 |     100 | 50                
  schemas.ts       |     100 |      100 |     100 |     100 |                   
  tool.ts          |   96.29 |     85.5 |     100 |   96.29 | 75-76,184,251-257 
 ...tools/workflow |   87.46 |    79.41 |   85.71 |   87.46 |                   
  workflow.ts      |   87.46 |    79.41 |   85.71 |   87.46 | ...51-652,664-667 
 src/utils         |   90.53 |    88.65 |    95.3 |   90.53 |                   
  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       |   86.84 |    78.94 |     100 |   86.84 | 34,36-37,65-66    
  btwUtils.ts      |   13.95 |      100 |       0 |   13.95 | 17-31,34-55       
  bundlePaths.ts   |     100 |      100 |     100 |     100 |                   
  ...ncyLimiter.ts |   94.64 |    95.23 |     100 |   94.64 | 64-66             
  ...igResolver.ts |     100 |      100 |     100 |     100 |                   
  ...engthError.ts |   91.11 |    89.47 |     100 |   91.11 | ...46-147,154-155 
  cronDisplay.ts   |     100 |    91.66 |     100 |     100 | 15,43,57          
  cronParser.ts    |   95.34 |     93.1 |     100 |   95.34 | 41-42,47-48,70-71 
  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.65 |    95.45 |     100 |   97.65 | ...35-336,338-339 
  env.ts           |     100 |      100 |     100 |     100 |                   
  ...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        |   73.14 |    79.48 |   55.55 |   73.14 | ...59-275,279-285 
  fetch.ts         |    70.8 |     77.5 |   71.42 |    70.8 | ...41-142,161,186 
  fileUtils.ts     |   91.66 |    86.12 |   95.23 |   91.66 | ...1232,1236-1242 
  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 |    80.09 |     100 |   92.36 | ...55-856,928-929 
  gitDirect.ts     |   98.46 |    90.17 |     100 |   98.46 | 148,268,352       
  ...noreParser.ts |   93.84 |     91.3 |     100 |   93.84 | ...03-104,185-186 
  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   |   93.13 |     92.5 |     100 |   93.13 | ...16-317,356-359 
  ...-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 |     100 |      100 |     100 |     100 |                   
  modelId.ts       |   98.96 |    98.18 |     100 |   98.96 | 153               
  ...kerChecker.ts |    90.9 |    91.66 |     100 |    90.9 | 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.63 |     100 |     100 | 206               
  pathReader.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |    93.3 |    92.22 |     100 |    93.3 | ...92-393,395-397 
  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 |   92.45 |     90.9 |     100 |   92.45 | ...72-173,186-187 
  rateLimit.ts     |   93.75 |    88.34 |     100 |   93.75 | ...13,218-219,262 
  readManyFiles.ts |   95.13 |    85.18 |     100 |   95.13 | ...24-226,252-253 
  retry.ts         |   95.93 |    91.83 |     100 |   95.93 | ...33,524-525,543 
  retryContext.ts  |     100 |      100 |     100 |     100 |                   
  ...sification.ts |   97.52 |    96.84 |     100 |   97.52 | ...05,255-256,282 
  retryPolicy.ts   |   97.72 |    90.56 |     100 |   97.72 | 130-131           
  ripgrepUtils.ts  |   50.94 |    85.71 |      70 |   50.94 | ...54-255,268-346 
  ...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 |    89.74 |     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 |   91.97 |    83.42 |     100 |   91.97 | ...44,866-867,880 
  ...r-launcher.ts |   96.35 |    93.97 |   85.71 |   96.35 | ...35-336,347-348 
  sedEditParser.ts |   91.72 |    92.12 |     100 |   91.72 | ...36-539,615-616 
  ...nIdContext.ts |     100 |      100 |     100 |     100 |                   
  ...orageUtils.ts |   95.98 |     83.8 |     100 |   95.98 | ...70,386,466,485 
  shell-utils.ts   |   86.24 |    89.61 |     100 |   86.24 | ...2003,2010-2014 
  ...lAstParser.ts |   95.57 |    85.88 |     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.71 |    87.71 |     100 |   86.71 | ...73-179,181-187 
  ...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     |      65 |      100 |      75 |      65 | 56-75             
  thoughtUtils.ts  |     100 |    92.85 |     100 |     100 | 71                
  ...-converter.ts |   95.23 |    85.71 |     100 |   95.23 | 36-37             
  tool-utils.ts    |    93.6 |     91.3 |     100 |    93.6 | ...58-159,162-163 
  ...ultCleanup.ts |   51.85 |    57.89 |      75 |   51.85 | ...04-105,108-134 
  ...Compaction.ts |   95.68 |    95.32 |     100 |   95.68 | ...29-334,533-534 
  truncation.ts    |   75.55 |    86.02 |   71.42 |   75.55 | ...44-449,453-477 
  windowsPath.ts   |   89.47 |    79.31 |     100 |   89.47 | ...57-58,62,90-91 
  ...aceContext.ts |   95.81 |    89.39 |     100 |   95.81 | ...74-275,299-301 
  xml.ts           |    97.8 |     87.5 |     100 |    97.8 | 98-99             
  yaml-parser.ts   |   83.87 |    77.27 |     100 |   83.87 | ...31-234,239-240 
 ...ils/filesearch |   83.68 |    80.38 |   94.69 |   83.68 |                   
  crawlCache.ts    |     100 |      100 |     100 |     100 |                   
  crawler.ts       |   82.47 |    76.22 |      95 |   82.47 | ...1525,1559-1560 
  fileSearch.ts    |   93.78 |    87.67 |     100 |   93.78 | ...71-272,274-275 
  fzfWorker.ts     |       0 |        0 |       0 |       0 | 1-109             
  ...rkerHandle.ts |   84.05 |    75.43 |   89.47 |   84.05 | ...30-334,340-341 
  ignore.ts        |     100 |    97.36 |     100 |     100 | 187               
  result-cache.ts  |     100 |    93.75 |     100 |     100 | 49                
 ...uest-tokenizer |   68.81 |    73.82 |   83.87 |   68.81 |                   
  ...eTokenizer.ts |   65.72 |    74.02 |    92.3 |   65.72 | ...65-466,479-533 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tTokenizer.ts |   68.39 |    69.49 |    90.9 |   68.39 | ...24-325,327-328 
  ...ageFormats.ts |   76.92 |      100 |   33.33 |   76.92 | 46-49,56-57       
  textTokenizer.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
-------------------|---------|----------|---------|---------|-------------------

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

@wenshao

wenshao commented Jun 26, 2026

Copy link
Copy Markdown
Collaborator

Maintainer verification — real qwen serve daemon, end-to-end

I built this PR locally and drove the real qwen serve daemon (HTTP bridge) over raw HTTP/SSE, with the spawned --acp child pinned to the same build, so both the route layer and the ACP child running the trust check are this PR's code. This complements the static review above with empirical results.

Setup

  • Worktree at PR head a6a9e2299 (parent d722bf043); npm ci && npm run build.
  • Daemon + ACP child both pinned to the worktree build via QWEN_CLI_ENTRY + node packages/cli/dist/index.js serve --port 0 --hostname 127.0.0.1, hosted in a long-lived tmux pane. Real qwen3.7-max creds; loopback (no token).
  • Trust toggled deterministically via a workspace .qwen/settings.json (security.folderTrust.enabled) + QWEN_CODE_TRUSTED_FOLDERS_PATH.

Verdict

The /cd feature is functionally solid and well-built — every happy path and the multi-session design claim hold up under real execution. But there are 2 blockers before merge and 2 cleanups.


✅ Confirmed working (real daemon)

Behavior Result
cd to valid dir 200 {previousCwd, newCwd, warnings:[]}
noop (cd to current dir) 200, previousCwd==newCwd, no event published
non-existent path 400 directory_not_found
path is a file, not a dir 400 directory_not_found ("Not a directory") ✓
relative path 400 invalid_path
unknown session 404
SSE session_cwd_changed fires only on real change, carries originatorClientId, delivered to other listeners ✓
unregistered client id 400 invalid_client_id before any state change (good security gate) ✓
errorKind across the JSON-RPC boundary survives ACP-child → bridge → route (proven via directory_not_found and the trust case) ✓
subsequent tool calls follow new cwd after cd, model read_file on bare WHOAMI.txt resolved to the new dir ✓
multi-session isolation two thread sessions in the same shared ACP child: cd in A did not leak to B; each session's tools resolved against its own cwd — confirms the skipProcessChdir design ✓
repeated cd correctness relocateWorkingDirectory updates both this.cwd/this.targetDir (config.ts:3124-3125), so chained cds compute oldDir correctly — no staleness ✓

🔴 Blocker 1 — SDK browser-bundle cap exceeded (fails CI on all platforms)

npm cipreparebuildassertBrowserSafeBundle fails:

Error: Browser daemon SDK bundle is 133501 bytes; expected <= 133120
  at assertBrowserSafeBundle (packages/sdk-typescript/scripts/build.js:169)

I measured the contribution directly:

Build dist/daemon/index.js vs cap (133120)
origin/main (PR's daemon sources reverted) 133092 28 under
PR head 133501 381 over

The PR's /cd SDK additions (DaemonClient.changeSessionCwd, DaemonSessionClient.cd, acpRouteTable, types) add +409 bytes and tip a near-full bundle over the hard cap. This is the PR's responsibility, and the cap has an established bump-on-growth convention (see the comments at build.js:30-36: "122→124KB … 127→130KB"). Fix: bump MAX_DAEMON_BROWSER_BUNDLE_BYTES in packages/sdk-typescript/scripts/build.js (e.g. to 132 * 1024). Until then the PR cannot pass CI / be installed (this is consistent with the current BLOCKED state).

🔴 Blocker 2 — directory_not_trusted returns 409, contract says 403 (confirmed live)

With folder-trust enabled and an untrusted target:

$ curl -X POST .../session/$SID/cd -d '{"path":"/private/tmp/cdtest/dirA"}'
{"error":"Directory not trusted: /private/tmp/cdtest/dirA","code":"directory_not_trusted","path":"..."}
HTTP 409          # ← PR's Reviewer Test Plan says 403

(A trusted sibling dir returns 200, so trust is genuinely active.) This is the static finding above, now reproduced end-to-end. 409 Conflict is wrong for an authorization denial; the route's own restrictive_sandbox branch and the existing TrustGateError handler both correctly use 403. One-line fix: server.ts:3378 res.status(409)403.

🟠 Finding 3 — documented "409 session_busy while a prompt is active" does not happen; cd blocks instead

POST /prompt returns 202 and processes in the background. I raced a cd against an in-flight prompt :

round 1: hasActivePrompt=true  cd-> HTTP 200  latency=5682ms
round 2: hasActivePrompt=true  cd-> HTTP 200  latency=5492ms
round 3: hasActivePrompt=true  cd-> HTTP 200  latency=5331ms
round 4: hasActivePrompt=true  cd-> HTTP 200  latency=4991ms

The cd never returned 409. It queued behind the active prompt and returned 200 after the prompt finished (a longer 600-word prompt blocked the cd for 17.6 s). This actually matches the code's own comment ("cd waits for any in-flight prompt to complete", bridge.ts), but it contradicts the PR's Reviewer Test Plan ("Prompt actively running → 409 session_busy"). Two consequences:

  1. The documented contract is misleading — a reviewer following the test plan will not see 409.
  2. The cd HTTP request blocks for the entire prompt duration, unbounded (the withTimeout only wraps the post-queue extMethod, not the queue wait; the route has no deadlineMs). For a multi-minute agent turn, the cd call hangs that long.

The CdWhilePromptActiveError guard appears reachable only via a sub-millisecond internal race (a cd landing between promptActive=true and the promptQueue tail assignment), which normal usage does not hit. Suggest either making cd fail fast with 409 when promptActive (match the docs), or updating the docs to "cd queues and may block" and bounding the wait.

🟡 Finding 4 — scope creep + zero /cd tests (as already raised)

The PR's HEAD commit is unrelated Phase-4c telemetry (recordApiRequestBreakdown wiring in session-tracing.ts +30, loggingContentGenerator.ts +5, session-tracing.test.ts +114). The only test file touched is the telemetry one — /cd has no automated tests (bridge changeSessionCwd, the ext-method handler, the route, and the error mapping that contains Blocker 2). Recommend splitting telemetry into its own PR and adding /cd route/bridge tests (a route test would have caught the 409/403 mismatch). restrictive_sandbox403 was not exercised (needs a macOS seatbelt restrictive-* profile) but the mapping is correct by inspection.


Recommendation

Solid feature; not mergeable as-is. Required before merge: (1) bump the SDK bundle cap, (2) change directory_not_trusted to 403. Strongly recommended: (3) reconcile the session_busy doc/behavior, (4) split out the telemetry and add /cd tests.

中文版(完整对应)

维护者验证 —— 真实 qwen serve daemon 端到端

我在本地构建了此 PR,并用裸 HTTP/SSE 驱动真实的 qwen serve daemon(HTTP bridge),同时把派生的 --acp 子进程钉到同一份构建,因此路由层和运行信任检查的 ACP 子进程都是本 PR 的代码。这是对上面静态审查的实测补充。

环境

  • worktree 位于 PR head a6a9e2299(父提交 d722bf043);npm ci && npm run build
  • 通过 QWEN_CLI_ENTRY + node packages/cli/dist/index.js serve --port 0 --hostname 127.0.0.1 把 daemon 和 ACP 子进程都钉到 worktree 构建,跑在常驻的 tmux pane 中。真实 qwen3.7-max 凭证;loopback(无 token)。
  • 信任开关通过 workspace .qwen/settings.jsonsecurity.folderTrust.enabled)+ QWEN_CODE_TRUSTED_FOLDERS_PATH 确定性地控制。

结论

/cd 功能实现扎实、质量好 —— 所有正常路径以及多 session 设计主张在真实执行下都成立。但合并前有 2 个阻塞项2 个清理项

✅ 实测确认正常(真实 daemon)

行为 结果
cd 到有效目录 200 {previousCwd, newCwd, warnings:[]}
noop(cd 到当前目录) 200previousCwd==newCwd不发布事件
不存在的路径 400 directory_not_found
路径是文件而非目录 400 directory_not_found("Not a directory") ✓
相对路径 400 invalid_path
未知 session 404
SSE session_cwd_changed 仅在真实变更时触发,携带 originatorClientId,可投递给其他监听者 ✓
未注册的 client id 在任何状态变更之前 400 invalid_client_id(良好的安全闸门) ✓
errorKind 跨 JSON-RPC 边界 从 ACP 子进程 → bridge → 路由完整保留(由 directory_not_found 信任场景共同证明) ✓
后续工具调用跟随新 cwd cd 后,模型对裸 WHOAMI.txtread_file 解析到了目录 ✓
多 session 隔离 同一共享 ACP 子进程中的两个 thread session:A 的 cd 泄漏到 B;各 session 的工具按各自 cwd 解析 —— 证实了 skipProcessChdir 设计 ✓
重复 cd 正确性 relocateWorkingDirectory 同时更新 this.cwd/this.targetDirconfig.ts:3124-3125),所以连续 cdoldDir 计算正确、无陈旧 ✓

🔴 阻塞项 1 —— SDK 浏览器 bundle 体积上限超标(全平台 CI 挂)

npm cipreparebuildassertBrowserSafeBundle 失败

Error: Browser daemon SDK bundle is 133501 bytes; expected <= 133120
  at assertBrowserSafeBundle (packages/sdk-typescript/scripts/build.js:169)

我直接测量了贡献量:

构建 dist/daemon/index.js 相对上限(133120)
origin/main(把 PR 的 daemon 源回退) 133092 低 28
PR head 133501 超 381

PR 的 /cd SDK 新增(DaemonClient.changeSessionCwdDaemonSessionClient.cdacpRouteTable、types)增加了 +409 字节,把一个已接近上限的 bundle 顶过硬上限。这是本 PR 的责任,并且该上限有既定的随增长上调惯例(见 build.js:30-36 注释:"122→124KB … 127→130KB")。修复: 上调 packages/sdk-typescript/scripts/build.js 里的 MAX_DAEMON_BROWSER_BUNDLE_BYTES(如改为 132 * 1024)。否则 PR 无法过 CI / 无法安装(与当前 BLOCKED 状态一致)。

🔴 阻塞项 2 —— directory_not_trusted 返回 409,但约定是 403(实测复现)

开启 folder-trust 且目标不受信任时:

$ curl -X POST .../session/$SID/cd -d '{"path":"/private/tmp/cdtest/dirA"}'
{"error":"Directory not trusted: ...","code":"directory_not_trusted","path":"..."}
HTTP 409          # ← PR 的 Reviewer Test Plan 写的是 403

(受信任的兄弟目录返回 200,说明信任确实生效。)这就是上面的静态发现,现已端到端复现。409 Conflict 用于授权拒绝是错的;路由自身的 restrictive_sandbox 分支和既有 TrustGateError 处理器都正确用 403一行修复: server.ts:3378res.status(409)403

🟠 发现 3 —— 文档说"prompt 活跃时 409 session_busy",实际不会发生;cd 会阻塞

POST /prompt 返回 202 并在后台处理。我让 cd 与活跃 prompt 竞争 4 次

round 1: hasActivePrompt=true  cd-> HTTP 200  latency=5682ms
round 2: hasActivePrompt=true  cd-> HTTP 200  latency=5492ms
round 3: hasActivePrompt=true  cd-> HTTP 200  latency=5331ms
round 4: hasActivePrompt=true  cd-> HTTP 200  latency=4991ms

cd 从不返回 409,而是排在活跃 prompt 之后、等 prompt 结束才返回 200(一个更长的 600 词 prompt 让 cd 阻塞了 17.6 秒)。这其实与代码自身注释一致("cd waits for any in-flight prompt to complete",bridge.ts),但与 PR 的 Reviewer Test Plan 矛盾("Prompt actively running → 409 session_busy")。两个后果:

  1. 文档约定有误导 —— 按测试计划走的审查者看不到 409
  2. cd HTTP 请求会阻塞整个 prompt 时长,且无上界withTimeout 只包住队列之后的 extMethod,不包队列等待;路由也没有 deadlineMs)。对一个数分钟的 agent turn,cd 调用就挂那么久。

CdWhilePromptActiveError 这个守卫似乎只在亚毫秒级内部竞争下才可达(cd 恰好落在 promptActive=truepromptQueue 尾指针赋值之间),正常使用碰不到。建议 要么让 cdpromptActive 时快速失败返回 409(与文档一致),要么把文档改成"cd 会排队并可能阻塞"并给等待加上界。

🟡 发现 4 —— 范围蔓延 + /cd 零测试(已被提出)

PR 的 HEAD commit 是不相关的 Phase-4c 遥测session-tracing.ts +30、loggingContentGenerator.ts +5、session-tracing.test.ts +114 的 recordApiRequestBreakdown 接入)。唯一改动的测试文件就是遥测那个 —— /cd 没有任何自动化测试(bridge changeSessionCwd、ext-method 处理器、路由、以及包含阻塞项 2 的错误映射)。建议把遥测拆成单独 PR,并补 /cd 路由/bridge 测试(一个路由测试本可抓到 409/403 这个不匹配)。restrictive_sandbox403 未实测(需要 macOS seatbelt restrictive-* profile),但映射经审阅是对的。

建议

功能扎实,但当前不可合并。合并前必须:(1) 上调 SDK bundle 上限,(2)directory_not_trusted 改为 403。强烈建议:(3)session_busy 的文档与行为一致,(4) 拆出遥测并补 /cd 测试。


Verified locally on macOS against a real qwen serve daemon (PR head a6a9e2299) — raw HTTP/SSE, ACP child pinned to the same build, real model creds.

@doudouOUC

Copy link
Copy Markdown
Collaborator Author

[qwen] Thanks for the thorough end-to-end verification!

Blockers 1, 2 & Finding 4 are already resolved in the current HEAD 261b6bd22 (pushed before this review):

  • Blocker 1 (SDK bundle cap): Removed all SDK client additions (DaemonClient.changeSessionCwd, DaemonSessionClient.cd, route table entry, DaemonSessionCdResult type). CI is now 3/3 green. SDK wrappers are deferred to a follow-up PR.
  • Blocker 2 (409→403): Fixed directory_not_trusted to return res.status(403).
  • Finding 4 (Phase 4c telemetry): Removed from the branch entirely — the commit was dropped via git reset.

Finding 3 (session_busy behavior): Valid observation. The cd chains on promptQueue (same queue prompts use), so it blocks until the active prompt finishes rather than failing fast with 409. The CdWhilePromptActiveError guard inside the queued lambda is a defensive safety net for a sub-millisecond internal race — not a user-observable behavior.

I am updating the PR description to remove the "409 session_busy" claim from the test plan and clarify that /cd queues behind active prompts. The behavior matches the bridge code comment ("cd waits for any in-flight prompt to complete") and is the safer design for ACP clients — no retry loop needed, just a potentially long wait.

If you prefer a bounded wait (deadline on the queue) or a fail-fast design instead, happy to discuss — but that would be a design change worth a separate iteration.

const actualCwd = fs.realpathSync(process.cwd());
if (actualCwd !== expected) {
process.chdir(oldDir);
throw new Error(

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Critical] prepareSessionArtifactMigration (called at line 3122) does not receive the skipProcessChdir option. When called from the ACP /cd path (skipProcessChdir: true), oldDir is set to this.cwd (the session's logical CWD) rather than process.cwd(). If moveCurrentSessionArtifacts throws inside prepareSessionArtifactMigration, the catch block at line 3080 unconditionally calls process.chdir(oldDir), silently changing the daemon's process CWD to a directory it was never at.

In a multi-session daemon, this corrupts process.cwd() for all other sessions and daemon-level operations that rely on it (tool execution, file reads, subprocess spawns). The divergence is silent and extremely hard to debug.

Fix: Thread skipProcessChdir through to prepareSessionArtifactMigration and skip the rollback process.chdir() when it is true — since no process.chdir(targetPath) happened in the first place, there is nothing to roll back:

private async prepareSessionArtifactMigration(
  oldStorage: Storage,
  newStorage: Storage,
  oldDir: string,
  opts?: { skipProcessChdir?: boolean },
): Promise<void> {
  this.chatRecordingService?.finalize();
  await this.chatRecordingService?.flush();
  await this.flushRuntimeStatusWrites();
  try {
    this.moveCurrentSessionArtifacts(oldStorage, newStorage);
  } catch (error) {
    if (!opts?.skipProcessChdir) {
      try {
        process.chdir(oldDir);
      } catch (rollbackError) {
        this.debugLogger.warn(
          'Failed to roll back working directory after session artifact migration failed',
          rollbackError,
        );
      }
    }
    throw error;
  }
}

Then at the call site (line 3122):

await this.prepareSessionArtifactMigration(oldStorage, newStorage, oldDir, opts);

— qwen3.7-max via Qwen Code /review

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

[qwen] Fixed in f56f14b. Threaded opts (containing skipProcessChdir) through to prepareSessionArtifactMigration. When skipProcessChdir: true, the catch block now skips the process.chdir(oldDir) rollback — since no process.chdir(targetPath) happened in the first place, there is nothing to roll back.

Comment thread packages/acp-bridge/src/bridge.ts Outdated
sessionId,
path: req.path,
}),
initTimeoutMs,

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] changeSessionCwd uses initTimeoutMs (default 10s) as its timeout, but the agent-side work is substantial: fs.statSync, fs.realpathSync, WorkspaceContext.resolveRootDirectories, prepareSessionArtifactMigration (file I/O for artifact moves), refreshCurrentRuntimeStatus, refreshHierarchicalMemory (scans project tree), and addWorkingDirectoryChangedContext (model API call). On a large project or slow filesystem, 10 seconds is tight.

A timeout here also leaves the session in an ambiguous state: the agent may have partially completed the directory change (e.g., config updated but memory refresh not done), while the bridge's entry.workspaceCwd would not be updated, creating state divergence.

Other complex operations in this file use dedicated timeouts (e.g., MCP_RESTART_TIMEOUT_MS = 300_000, recap has a 60s backstop at line 661-665). Consider a dedicated timeout:

Suggested change
initTimeoutMs,
Math.max(initTimeoutMs, 30_000),

— qwen3.7-max via Qwen Code /review

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

[qwen] Fixed in f56f14b. Changed to Math.max(initTimeoutMs, 30_000) — ensures at least 30s for the cd operation which includes fs validation, artifact migration, memory refresh, and context generation on the agent side.

Comment thread packages/cli/src/serve/server.ts Outdated
);
res.status(200).json(result);
} catch (err) {
// Map ACP child errorKind codes to HTTP responses

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] This catch block contains ~35 lines of inline errorKind-to-HTTP-status mapping (restrictive_sandbox, directory_not_found, directory_not_trusted) before falling through to sendBridgeError. The established pattern — visible in sendBridgeErrorImpl — centralizes all error kind mapping in that shared function. Other POST routes like /session/:id/branch and /session/:id/fork simply call sendBridgeError directly without inline errorKind checks.

Splitting errorKind mapping across two locations means future error kinds added to the sessionCd handler must be mapped here rather than the shared location, breaking the single-responsibility pattern of sendBridgeErrorImpl.

Fix: Move the three errorKind cases into sendBridgeErrorImpl alongside the existing kind mappings, and simplify this catch block to just sendBridgeError(res, err, { route: 'POST /session/:id/cd', sessionId }) — matching the /branch and /fork routes exactly.

— qwen3.7-max via Qwen Code /review

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

[qwen] Fixed in f56f14b. Moved all three errorKind cases (restrictive_sandbox, directory_not_found, directory_not_trusted) into sendBridgeErrorImpl alongside the existing errorKind block. The cd route catch block is now a single sendBridgeError(res, err, {...}) call — matching the /branch and /fork pattern exactly.

- [Critical] Thread skipProcessChdir through prepareSessionArtifactMigration
  to prevent corrupting shared daemon process.cwd() on rollback in ACP mode
- [Suggestion] Raise cd timeout to Math.max(initTimeoutMs, 30_000) for
  large-project fs ops and memory refresh
- [Suggestion] Move errorKind-to-HTTP mapping (restrictive_sandbox,
  directory_not_found, directory_not_trusted) into sendBridgeErrorImpl;
  cd route catch block now matches /branch and /fork pattern
Comment thread packages/acp-bridge/src/bridge.ts Outdated
() => undefined,
);

const result = await cdResult;

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] The extMethod result is cast with as and used directly without any shape validation. If the agent returns an unexpected response (e.g., missing newCwd), downstream code would operate on undefined values with confusing errors.

Compare with branchSession (~L3413) which validates the response before use:

if (!result || typeof result.newSessionId !== 'string') {
  throw new Error(
    `branchSession: agent returned invalid response: ${JSON.stringify(result)}`,
  );
}

Consider adding similar validation after await cdResult:

Suggested change
const result = await cdResult;
const result = await cdResult;
if (
!result ||
typeof result.previousCwd !== 'string' ||
typeof result.newCwd !== 'string'
) {
throw new Error(
`changeSessionCwd: agent returned invalid response: ${JSON.stringify(result)}`,
);
}

— qwen3.7-max via Qwen Code /review

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

[qwen] Fixed in 6bfc526.

Added response shape validation after the extMethod call — if previousCwd, newCwd, or warnings are missing/wrong type, throws a descriptive error with the raw response stringified for debugging.

Comment thread packages/acp-bridge/src/bridge.ts Outdated

// Only update state and broadcast if directory actually changed
if (result.previousCwd !== result.newCwd) {
entry.workspaceCwd = result.newCwd;

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] Overwriting entry.workspaceCwd with the new directory breaks listWorkspaceSessions, which filters sessions by entry.workspaceCwd === key where key is always boundWorkspace (L3630). After any /cd that changes the directory away from the bound workspace, the session becomes invisible to GET /workspace/:id/sessions.

The session remains functional via GET /session/:id/status (which uses byId.get), but SDK clients enumerating sessions through the workspace listing endpoint lose track of it.

Consider introducing a separate effectiveCwd field on SessionEntry to track the current working directory, while keeping workspaceCwd as the immutable workspace association used by listWorkspaceSessions.

— qwen3.7-max via Qwen Code /review

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

[qwen] Fixed in 6bfc526.

Removed entry.workspaceCwd = result.newCwd entirely. The session stays listed under its original daemon-bound workspace for listWorkspaceSessions and lifecycle operations (branchSession etc.). The session's logical cwd lives only inside the agent's Config object — the event bus still broadcasts session_cwd_changed so clients know the current directory.

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

⚠️ Downgraded from Request Changes to Comment: CI still running.

— qwen3.7-max via Qwen Code /review

Comment thread packages/acp-bridge/src/bridge.ts Outdated

// Only update state and broadcast if directory actually changed
if (result.previousCwd !== result.newCwd) {
entry.workspaceCwd = result.newCwd;

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] entry.workspaceCwd = result.newCwd makes the session invisible in listWorkspaceSessions(boundWorkspace) after any /cd that changes the directory. The listing function (line 3630) filters by entry.workspaceCwd === key where key is always boundWorkspace. Once workspaceCwd changes to a different directory, the session no longer matches and silently disappears from GET /workspace/:id/sessions. Additionally, branchSession (line 3405) passes boundWorkspace as the child's cwd, so branching from a cd'd session creates the child at the original workspace rather than the parent's current directory.

Suggested change
entry.workspaceCwd = result.newCwd;
// Keep workspaceCwd for session-scoped lookups but don't overwrite
// the workspace binding — listWorkspaceSessions and branchSession
// rely on entry.workspaceCwd matching boundWorkspace.
entry.sessionCwd = result.newCwd;

Consider tracking the session-level CWD separately from the workspace binding (e.g., a new sessionCwd field), or constrain /cd to subdirectories of boundWorkspace so the workspace key always matches.

— qwen3.7-max via Qwen Code /review

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

[qwen] Fixed in 6bfc526.

Same fix as above — entry.workspaceCwd is no longer mutated. Session remains visible in listWorkspaceSessions(boundWorkspace) after /cd, and branchSession continues to use boundWorkspace as the child's cwd (which is correct since storage also stays at boundWorkspace now).

Comment thread packages/cli/src/serve/server.ts Outdated
});
return;
}
if (err instanceof CdWhilePromptActiveError) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] CdWhilePromptActiveError maps to code: 'session_busy', which collides with SessionBusyError (line 5957). API clients cannot distinguish "cd rejected because prompt is active" from a generic "session busy" condition. Following the established pattern where each typed error produces a distinct code (e.g., BranchWhilePromptActiveError'branch_while_prompt_active'), use a unique code here.

Suggested change
if (err instanceof CdWhilePromptActiveError) {
if (err instanceof CdWhilePromptActiveError) {
res.status(409).json({
error: err.message,
code: 'cd_while_prompt_active',
sessionId: err.sessionId,
});
return;
}

— qwen3.7-max via Qwen Code /review

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

[qwen] Fixed in 6bfc526.

Renamed to code: 'cd_while_prompt_active' — follows the same naming pattern as BranchWhilePromptActiveError'branch_while_prompt_active', and no longer collides with the generic SessionBusyError'session_busy'.

'Invalid or missing sessionId',
);
}
if (

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] The interactive /cd command (cdCommand.ts:35-36) validates against null bytes before processing the path:

if (input.includes('\0') || baseDir.includes('\0')) {
  throw new Error('Path contains null bytes.');
}

This ACP handler accepts any absolute string without this check. Null bytes in paths can cause truncation at the C/syscall boundary, potentially bypassing the directory-existence check or trust validation. Add the same null byte guard here for defense in depth.

Suggested change
if (
if (
typeof targetPath !== 'string' ||
targetPath.length === 0 ||
targetPath.includes('\0') ||
!path.isAbsolute(targetPath)
) {

— qwen3.7-max via Qwen Code /review

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

[qwen] Fixed in 6bfc526.

Added targetPath.includes('\0') to the validation predicate in the ACP sessionCd handler, matching the same null-byte check pattern used by the interactive /cd command.

@wenshao

wenshao commented Jun 26, 2026

Copy link
Copy Markdown
Collaborator

@qwen-code /resolve

…e refactor

The main branch refactored server.ts by extracting session routes into
routes/session.ts and error handling into server/error-response.ts.
The PR added the /cd endpoint and CdWhilePromptActiveError inline.

Resolution: take main's refactored structure for server.ts, then place
the PR's /cd route in routes/session.ts and CdWhilePromptActiveError
handler in server/error-response.ts — matching main's conventions.
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

Qwen Code resolved the merge conflicts and pushed the branch update.

Merge Conflict Resolution Summary — PR #5903

Conflict

packages/cli/src/serve/server.ts had 3 conflict regions caused by a divergence between:

  • PR branch (feat/phase-4c-api-request-breakdown): Added the POST /session/:id/cd endpoint, CdWhilePromptActiveError / BranchWhilePromptActiveError imports, and error handlers — all inline in server.ts.
  • Main branch (main): Refactored server.ts (refactor(cli): Split serve server routes #5809) by extracting all session route handlers into routes/session.ts, error-response handling into server/error-response.ts, and request helpers into server/request-helpers.ts.

Conflict regions in server.ts

  1. Imports (lines 38–43): PR added CancelSentinelCollisionError, BranchWhilePromptActiveError, CdWhilePromptActiveError to the acp-session-bridge.js import. Main had none (these moved to error-response.ts).
  2. Session route handlers (lines 931–2258): PR kept all routes inline (including the new /cd route). Main replaced them with a single registerSessionRoutes(...) call.
  3. Helper functions (lines 2640–3668): PR kept all helpers inline. Main had removed them (extracted to separate modules).

Resolution

packages/cli/src/serve/server.ts

Took main's version for all three conflicts. The file is now identical to origin/main's version — the PR's inline additions don't belong here under main's architecture.

packages/cli/src/serve/routes/session.ts

Added the POST /session/:id/cd route after the existing /fork route, following main's convention. The route:

  • Validates path as a required absolute path
  • Parses x-qwen-client-id header
  • Calls bridge.changeSessionCwd(sessionId, { path }, { clientId })
  • Delegates errors to sendBridgeError

packages/cli/src/serve/server/error-response.ts

  • Added CdWhilePromptActiveError to the import from ../acp-session-bridge.js (alphabetically after CancelSentinelCollisionError)
  • Added the error handler mapping: `CdWhilePromptActiv

});
return;
}
if (err instanceof CdWhilePromptActiveError) {

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] The ACP child now throws RequestErrors with data.errorKind values like restrictive_sandbox, directory_not_found, and directory_not_trusted, but this route-side mapper does not handle those kinds. They fall through to the generic 500 path instead of the documented 403/400/403 responses, so ACP clients cannot rely on stable policy/error handling for /cd failures. Please add these cases to the data.errorKind block in sendBridgeError and preserve the returned path where present.

— GPT-5 via Qwen Code /review

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

[qwen] Fixed in 6bfc526.

Added restrictive_sandbox, directory_not_found, and directory_not_trusted errorKind cases to sendBridgeErrorImpl (now in the refactored server/error-response.ts). The /cd route's catch block is now a single sendBridgeError(res, err, {...}) call — matching the /branch and /fork pattern. ACP clients now receive stable 403/400/403 responses for these error kinds.

throw new Error(
`Changed directory to ${actualCwd}, expected ${expected}.`,
);
if (!opts?.skipProcessChdir) {

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] The new skipProcessChdir branch skips the realpath equality check that the normal process.chdir path performs. ACP trust-checks the canonical target before calling this, but if that directory is swapped before relocation applies state, this path can proceed without proving fs.realpathSync(targetPath) === expected; later filesystem access through the stored cwd can then follow the swapped path. Please keep a final realpath-vs-expected validation for the skip path before updating storage/workspace roots.

— GPT-5 via Qwen Code /review

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

[qwen] Fixed in 6bfc526.

Added a final fs.realpathSync(targetPath) !== expected check on the skipProcessChdir path (the else branch). This guards against TOCTOU symlink swaps between the trust check and the config state update — if the real path diverges from what was validated, the operation throws before updating any state.

Comment thread packages/acp-bridge/src/bridge.ts Outdated
}

const ci = await ensureChannel();
return (await withTimeout(

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] withTimeout only races the ACP sessionCd request; it does not cancel the underlying ext-method. Because entry.promptQueue is advanced from this timed promise, a 30s timeout releases subsequent prompts while the ACP child may still finish relocating config/storage later, leaving bridge state/events at the old cwd while the agent has moved. Please keep the queue tail tied to the raw ext-method until it settles, or make timeout fatal/reconciled so later prompts cannot run against unknown cwd state.

— GPT-5 via Qwen Code /review

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

[qwen] Fixed in 6bfc526.

Restructured changeSessionCwd so that:

  1. promptQueue tail is tied to the raw extMethod settlement (not the timeout-wrapped version)
  2. State update (event broadcast) happens inside the queue lambda — executes when the extMethod actually settles, regardless of whether the caller timed out
  3. withTimeout is purely caller-facing — surfaces a deadline-exceeded error to the HTTP client without advancing the queue

This ensures subsequent prompts cannot run against unknown cwd state: even if the caller times out, the queue stays blocked until the real cd finishes (or fails).


// Relocate working directory (skip process.chdir for ACP)
const warnings: string[] = [];
const relocation = await config.relocateWorkingDirectory(

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] relocateWorkingDirectory moves the live session artifacts into Storage(canonicalPath), but bridge lifecycle paths still operate against the daemon-bound workspace. For example, sessionBranch sends cwd: boundWorkspace and the agent forks via new SessionService(cwd), so after /cd the source transcript can have been moved away from the storage root that branch/load later inspect. Please either avoid moving transcript storage for ACP logical cwd changes, or route branch/load/lifecycle operations through the session's current storage root.

— GPT-5 via Qwen Code /review

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

[qwen] Fixed in 6bfc526.

Added skipArtifactMigration: true to the ACP /cd call to relocateWorkingDirectory. When this option is set, the method skips prepareSessionArtifactMigration and does NOT change this.storage — artifacts (transcripts, recordings) remain in the original bound-workspace storage location. Only the logical cwd (this.cwd, this.targetDir) and runtime context (workspace roots, memory, file caches) are updated.

This means branch/load/lifecycle operations continue to find artifacts at the daemon-bound workspace's storage root, eliminating the state divergence.

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

In addition to the inline comments, two items that can't be anchored to a specific diff line:

  1. session_cwd_changed event not registered in SDKDAEMON_KNOWN_EVENT_TYPE_VALUES in packages/sdk-typescript/src/daemon/events.ts does not include session_cwd_changed. SDK clients will classify this event as kind: 'unknown' and drop it. The PR description says SDK wrappers are deferred, but without event registration the bridge's events.publish() call is a dead emit today. Consider at minimum adding the event type to the SDK's known-values array so typed consumers can observe it.

  2. session_cd not registered in capabilitiesSERVE_CAPABILITY_REGISTRY in packages/cli/src/serve/capabilities.ts has no session_cd entry. Every other session mutation endpoint (session_branch, session_rewind, session_approval_mode_control, etc.) has a capability tag. SDK clients doing feature discovery via GET /capabilities cannot detect whether the daemon supports /cd.

— qwen3.7-max via Qwen Code /review

return branchResult;
},

async changeSessionCwd(

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] changeSessionCwd has zero logging — no entry log, no success log, no warning when warnings[] is non-empty. For comparison, sendPrompt logs forward failures and mid-turn queue drops via writeStderrLine, and wraps the dispatch in a telemetry.withSpan. A directory-change mutation is operator-significant: when this breaks at 3 AM, there will be no trail to determine whether the /cd was attempted, succeeded, or left the session in a degraded state (memory/model-context refresh failures silently returned in warnings[]).

Consider adding at minimum:

  • debugLogger.info('changeSessionCwd', { sessionId, path: req.path }) at entry
  • debugLogger.warn('changeSessionCwd warnings', { sessionId, warnings }) when warnings.length > 0

— qwen3.7-max via Qwen Code /review

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

[qwen] Fixed in 6bfc526.

Added writeStderrLine logging after successful cwd change: logs session ID, old → new path, and any warnings. This provides the operator trail for debugging ACP /cd mutations at 3 AM.

oldDir: string,
opts?: { skipProcessChdir?: boolean },
): Promise<void> {
this.chatRecordingService?.finalize();

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] chatRecordingService.finalize() and flush() are called before moveCurrentSessionArtifacts (line 3078). If the artifact migration throws, the error propagates and relocateWorkingDirectory fails — but the recording service has already been finalized (auto-title controller aborted, title record flushed). With skipProcessChdir: true (the ACP /cd path), the process.chdir rollback is also skipped, so config state stays at the old directory while the recording service is in a post-finalize state.

This is a pre-existing ordering issue (not introduced by this PR), but the skipProcessChdir path makes it more likely to surface because artifact migration operates across a process that never physically changed directory. Consider moving finalize() to after the migration succeeds, or adding a resetAfterFinalize() on the catch path.

— qwen3.7-max via Qwen Code /review

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

[qwen] Resolved by the skipArtifactMigration fix.

With skipArtifactMigration: true, prepareSessionArtifactMigration is never called on the ACP /cd path — so finalize() + flush() are skipped entirely. The recording service remains in its normal running state. This issue only affected the old flow that attempted full artifact migration for ACP cd.


return { sessionId, ...result };
},

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] The PR adds 277 lines across 9 files (bridge method, agent handler, HTTP route, error class, config option) without any test coverage. The existing bridge.test.ts has extensive tests for branchSession (queue chaining, prompt-active guard, session_branched event, cleanup on failure) and sendPrompt (queue FIFO, abort, retry) — the same coverage pattern should apply to changeSessionCwd.

The PR description notes "unit tests for bridge/handler (follow-up PR)". Key paths that should be tested before shipping:

  1. changeSessionCwd waits for in-flight prompt, then executes
  2. CdWhilePromptActiveError propagation through the HTTP layer
  3. session_cwd_changed event published with correct payload and originatorClientId
  4. Noop when target path equals current directory
  5. skipProcessChdir in relocateWorkingDirectory — verify process.chdir is never called, this.cwd and this.storage update correctly, and artifact-migration failure leaves config state consistent

— qwen3.7-max via Qwen Code /review

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

[qwen] Acknowledged — test coverage will be added in a follow-up commit. The changeSessionCwd method now has identical queue chaining semantics to branchSession, so the test patterns for queue-FIFO, prompt-active-guard, and event broadcast from bridge.test.ts apply directly.

Critical fixes:
- Do not overwrite entry.workspaceCwd — session stays listed under the
  daemon's bound workspace; logical cwd lives in agent Config only
- Queue tail tied to raw extMethod settlement, not timeout — subsequent
  prompts cannot run against unknown cwd state after caller timeout
- Add realpath equality check for skipProcessChdir path to guard against
  TOCTOU symlink swaps between trust check and state update
- Skip artifact migration for ACP /cd (skipArtifactMigration option) —
  storage stays at bound workspace so branch/load/lifecycle remain consistent

Suggestions addressed:
- Add response shape validation for extMethod result
- Rename CdWhilePromptActiveError HTTP code from 'session_busy' to
  'cd_while_prompt_active' (avoids collision with SessionBusyError)
- Add null-byte path validation in ACP sessionCd handler
- Add operator logging on successful cwd change (warnings included)
…com/QwenLM/qwen-code into feat/phase-4c-api-request-breakdown

# Conflicts:
#	packages/cli/src/serve/server.ts
const relocation = await config.relocateWorkingDirectory(
canonicalPath,
canonicalPath,
{ skipProcessChdir: true, skipArtifactMigration: true },

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] With skipProcessChdir: true, process.cwd() remains at the server's launch directory while config.cwd/config.targetDir point to the new session directory. Multiple code paths across packages/core use process.cwd() directly — e.g., prompts.ts:293 (git repository detection for system prompts), rule-parser.ts:1039-1040 (permission rule path context), destructiveCommands.ts:166 (destructive command CWD default). After ACP /cd, these resolve against the wrong directory.

The interactive /cd (cdCommand.ts) doesn't have this problem because it calls process.chdir(). Before this PR, ACP sessions never changed CWD, so process.cwd() was always correct for them.

Consider auditing direct process.cwd() usages in the prompt/permission/tool pipeline and migrating them to config.getCwd() or config.getTargetDir(). Alternatively, document this as a known limitation and track in a follow-up issue.

— qwen3.7-max via Qwen Code /review

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

[qwen] Acknowledged — this is a valid known limitation.

With skipProcessChdir: true, process.cwd() stays at the daemon's launch directory while config.cwd / config.targetDir point to the session's new logical directory. The affected code paths (prompts.ts git repo detection, rule-parser.ts permission context, destructiveCommands.ts CWD default) all run inside the ACP child process which shares process.cwd() across sessions — changing it would break other sessions.

This is by design for now: the ACP /cd is a "logical cwd change" — tool execution and file resolution use config.getCwd() (already correct), while the few process.cwd() callsites that matter for ACP sessions should be migrated to config.getCwd() in a follow-up. Will file a tracking issue.

@wenshao

wenshao commented Jun 27, 2026

Copy link
Copy Markdown
Collaborator

@qwen-code /triage

wenshao
wenshao previously approved these changes Jun 27, 2026

@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! ✅

The /cd implementation follows established patterns well — queue chaining on promptQueue mirrors branchSession, skipProcessChdir/skipArtifactMigration are clean additive extension points, and error mapping follows existing conventions.

— qwen3.7-max via Qwen Code /review

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

Request changes: revert 23 unrelated cua-driver formatting files (Prettier noise from merge conflict resolution). The /cd feature itself is solid — once those files are cleaned up, this is ready to merge. See triage comments for full details.

Reverts 23 cua-driver files that picked up Prettier formatting noise
during merge conflict resolution. Adds packages/cua-driver/ to
.prettierignore since it's a vendored package whose content should not
be auto-formatted by local hooks.
@doudouOUC

Copy link
Copy Markdown
Collaborator Author

[qwen] Fixed in 4fa0456.

Reverted all 23 cua-driver formatting files to match origin/main. Root cause: our merge commit triggered the pre-commit hook's prettier --write on staged .md/.json files — since packages/cua-driver/ wasn't in .prettierignore, Prettier reformatted the vendored content.

Fix: added packages/cua-driver/ to .prettierignore (vendored package should not be auto-formatted), then reverted all 23 files to their main-branch state.

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Qwen Code review did not complete successfully: Qwen review timed out after 85 minutes. See workflow logs.

@wenshao

wenshao commented Jun 27, 2026

Copy link
Copy Markdown
Collaborator

@qwen-code /triage

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM, looks ready to ship. ✅

@doudouOUC
doudouOUC added this pull request to the merge queue Jun 27, 2026
Merged via the queue into main with commit fa8b2ad Jun 27, 2026
23 of 24 checks passed
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.

tracking(serve): Track ACP gaps for cd, permissions, trust, lsp, and setup-github

5 participants