Skip to content

feat(cli): Harden daemon-managed channel worker - #6098

Merged
yiliang114 merged 17 commits into
mainfrom
codex/serve-channel-worker-pr3-hardening-main
Jul 1, 2026
Merged

feat(cli): Harden daemon-managed channel worker#6098
yiliang114 merged 17 commits into
mainfrom
codex/serve-channel-worker-pr3-hardening-main

Conversation

@doudouOUC

Copy link
Copy Markdown
Collaborator

What this PR does

This PR hardens daemon-managed channel workers for qwen serve --channel by adding bounded post-ready restart supervision, IPC heartbeat monitoring, worker stdout/stderr forwarding into the daemon log with redaction, and richer channel worker status fields. Startup remains fail-fast before the worker reaches ready, and the public command surface remains unchanged.

It also keeps serve-owned channel pidfile metadata reserved during worker failures while clearing stale worker PIDs, so qwen channel status only prints a Worker PID when the current worker is known to be live.

Why it's needed

The previous daemon-managed worker path made serve --channel usable, but post-ready worker crashes, stale worker hangs, and worker logs were not operationally visible enough for a long-running daemon. This change makes the worker lifecycle observable and recoverable without moving channel adapters into the daemon process or expanding the public channel CLI contract.

Reviewer Test Plan

How to verify

Confirm that a worker that exits after ready is restarted within the bounded restart policy, while a worker that fails before ready still fails serve startup. Confirm that missing heartbeats mark staleHeartbeatAt, kill the worker, and use the same restart path. Confirm worker output reaches the daemon log with bearer tokens, sensitive environment values, and proxy credentials redacted. Confirm /daemon/status exposes the additive restart and heartbeat fields, does not warn for a successfully restarted running worker, and still warns for partial channel connection. Confirm serve-owned pidfile metadata keeps serve ownership but clears workerPid after unexpected worker exit until a restarted worker reports ready.

Commands used locally:

(cd packages/cli && npx vitest run src/serve/channel-worker-supervisor.test.ts src/commands/channel/daemon-worker.test.ts src/serve/run-qwen-serve.test.ts src/serve/daemon-status.test.ts src/commands/channel/status.test.ts)
npm run build -- --cli-only
npm run check:serve-fast-path-bundle
npm run typecheck
git diff --check

Evidence (Before & After)

Before: a serve-managed channel worker that crashed or became stale after ready was not automatically recovered with observable restart and heartbeat metadata, and pidfile metadata could leave clients with stale worker PID information.

After: post-ready unexpected exits and stale heartbeat timeouts are restarted within policy, worker logs are redacted and forwarded to the daemon log, /daemon/status reports restart and heartbeat fields, and qwen channel status omits Worker PID whenever serve owns the channel service but no live worker PID is known.

Tested on

OS Status
🍏 macOS ✅ tested
🪟 Windows ⚠️ not tested
🐧 Linux ⚠️ not tested

Environment (optional)

macOS 26.4.1, Node.js v22.22.3, npm 10.9.8.

Risk & Scope

  • Main risk or tradeoff: The main risk is lifecycle timing around restart, heartbeat, and shutdown races; this is covered with focused fake-timer unit tests and serve integration tests.
  • Not validated / out of scope: This PR does not add public daemon-backed qwen channel start --daemon-url, dynamic channel hot reload, in-process adapters, multi-workspace daemon coordination, or independent worker log files. Windows and Linux were not locally tested.
  • Breaking changes / migration notes: No public CLI or protocol breaking changes are intended; new /daemon/status fields are additive.

Linked Issues

Refs #5976

中文说明

What this PR does

本 PR 对 qwen serve --channel 的 daemon-managed channel worker 做运维硬化:增加有界的 post-ready 重启监督、IPC 心跳监测、带脱敏的 worker stdout/stderr 转发到 daemon log,以及更完整的 channel worker 状态字段。worker ready 前启动失败仍保持 fail-fast,公开命令面不变。

它还会在 worker 失败期间保留 serve-owned channel pidfile 元数据,但清除过期的 worker PID,因此 qwen channel status 只有在当前 worker 确认为 live 时才打印 Worker PID。

Why it's needed

之前的 daemon-managed worker 路径已经让 serve --channel 可用,但 post-ready worker 崩溃、worker stale hang 和 worker 日志在长运行 daemon 场景下还不够可恢复、可观测。本改动让 worker 生命周期可观测且可恢复,同时不把 channel adapter 放进 daemon 进程,也不扩展公开 channel CLI 合约。

Reviewer Test Plan

How to verify

确认 ready 后退出的 worker 会按有界 restart policy 重启,而 ready 前失败仍会让 serve startup 失败。确认 heartbeat 缺失会记录 staleHeartbeatAt、kill worker,并走同一 restart 路径。确认 worker 输出会进入 daemon log,且 bearer token、敏感环境变量值和 proxy 凭据会被脱敏。确认 /daemon/status 暴露 additive restart/heartbeat 字段,对已成功重启且 running 的 worker 不产生 warning,并且 partial channel connection 仍然 warning。确认 unexpected worker exit 后 serve-owned pidfile 仍保留 serve ownership,但清除 workerPid,直到重启后的 worker 再次 ready 并报告新 PID。

本地使用的命令:

(cd packages/cli && npx vitest run src/serve/channel-worker-supervisor.test.ts src/commands/channel/daemon-worker.test.ts src/serve/run-qwen-serve.test.ts src/serve/daemon-status.test.ts src/commands/channel/status.test.ts)
npm run build -- --cli-only
npm run check:serve-fast-path-bundle
npm run typecheck
git diff --check

Evidence (Before & After)

Before:serve-managed channel worker 在 ready 后崩溃或 heartbeat stale 时,没有带可观测 restart/heartbeat 元数据的自动恢复路径,pidfile 元数据也可能让客户端看到过期 worker PID。

After:post-ready 非预期退出和 stale heartbeat timeout 会按策略重启,worker 日志会脱敏并转发到 daemon log,/daemon/status 报告 restart/heartbeat 字段,且当 serve 拥有 channel service 但未知 live worker PID 时,qwen channel status 不显示 Worker PID。

Tested on

OS Status
🍏 macOS ✅ tested
🪟 Windows ⚠️ not tested
🐧 Linux ⚠️ not tested

Environment (optional)

macOS 26.4.1,Node.js v22.22.3,npm 10.9.8。

Risk & Scope

  • Main risk or tradeoff:主要风险是 restart、heartbeat 和 shutdown 之间的生命周期时序竞争;已通过聚焦 fake-timer 单测和 serve 集成测试覆盖。
  • Not validated / out of scope:本 PR 不新增公开的 daemon-backed qwen channel start --daemon-url、动态 channel hot reload、in-process adapters、多 workspace daemon 协调或独立 worker log 文件。本地未测试 Windows 和 Linux。
  • Breaking changes / migration notes:不预期有公开 CLI 或协议破坏性变更;新增 /daemon/status 字段均为 additive。

Linked Issues

Refs #5976

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
@doudouOUC
doudouOUC marked this pull request as ready for review July 1, 2026 03:27
Copilot AI review requested due to automatic review settings July 1, 2026 03:27

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.

Pull request overview

Hardens the daemon-managed channel worker lifecycle used by qwen serve --channel by adding post-ready supervision (bounded restarts + heartbeat stale detection), forwarding redacted worker logs into the daemon log, and exposing richer worker operational status fields—while keeping the public CLI surface unchanged.

Changes:

  • Add bounded post-ready restart supervision, heartbeat monitoring, and stdout/stderr redacted log forwarding to the channel worker supervisor.
  • Update runQwenServe to write serve-owned pidfile metadata on worker ready/exit and forward worker log lines into daemon logs.
  • Extend /daemon/status runtime issue details and document the new worker lifecycle/status behavior.

Reviewed changes

Copilot reviewed 10 out of 10 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
packages/cli/src/serve/run-qwen-serve.ts Wires supervisor callbacks for pidfile updates and daemon log forwarding.
packages/cli/src/serve/run-qwen-serve.test.ts Adds coverage for pidfile updates on restart-ready and worker log forwarding.
packages/cli/src/serve/daemon-status.ts Includes restart/heartbeat fields in channel worker warning details.
packages/cli/src/serve/daemon-status.test.ts Updates expectations and adds a “restarted successfully” running-worker case.
packages/cli/src/serve/channel-worker-supervisor.ts Implements restart policy, heartbeat stale detection, and redacted worker log piping.
packages/cli/src/serve/channel-worker-supervisor.test.ts Adds extensive tests for restarts, heartbeats, spawn failures, and log redaction/forwarding.
packages/cli/src/commands/channel/status.test.ts Ensures status output omits worker PID when serve-owned metadata has no live worker PID.
packages/cli/src/commands/channel/daemon-worker.ts Adds IPC heartbeat messages from the worker process and clears them on shutdown/disconnect.
packages/cli/src/commands/channel/daemon-worker.test.ts Adds tests validating heartbeat emission and cleanup behavior.
docs/developers/qwen-serve-protocol.md Documents restart/heartbeat policy, new status fields, and pidfile/worker log behavior.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread packages/cli/src/serve/channel-worker-supervisor.ts
@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Thanks for the PR!

Template looks good ✓

On direction: this is solid operational hardening for the daemon-managed channel worker path. Bounded restart supervision, heartbeat monitoring, and log forwarding with redaction are exactly the kind of reliability work a long-running daemon needs. Clearly aligned with the serve infrastructure and the referenced #5976. No direction concerns.

On approach: the scope is large (2541 additions, 15 files) but coherent — restart supervision, heartbeat monitoring, log forwarding/redaction, and pidfile management are all tightly coupled to the "make the worker lifecycle observable and recoverable" goal. The sanitize.ts regex widening (\p{Cf} + \p{Variation_Selector}) is a minor tangential addition, but it directly supports the log redaction pipeline. No drive-by refactors or scope creep detected.

Moving on to code review. 🔍

中文说明

感谢贡献!

模板完整 ✓

方向:对 daemon-managed channel worker 做运维硬化——有界重启监督、心跳监测、带脱敏的日志转发——正是长运行 daemon 需要的可靠性工作。与 serve 基础设施和引用的 #5976 明确对齐,无方向顾虑。

方案:范围较大(2541 行新增,15 个文件)但内聚——重启监督、心跳监测、日志转发/脱敏和 pidfile 管理都紧密耦合到"让 worker 生命周期可观测且可恢复"的目标。sanitize.ts 的正则拓宽(\p{Cf} + \p{Variation_Selector})是次要的附带改动,但直接支撑了日志脱敏管线。未检测到顺手重构或范围蔓延。

进入代码审查 🔍

Qwen Code · qwen3.7-max

@github-actions

github-actions Bot commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 78.68% 78.68% 84.12% 80.54%
Core 84.64% 84.64% 86.01% 84.83%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   78.68 |    80.54 |   84.12 |   78.68 |                   
 src               |    77.2 |     76.5 |   81.13 |    77.2 |                   
  gemini.tsx       |   67.06 |    72.07 |   81.25 |   67.06 | ...-976,1015-1019 
  ...ractiveCli.ts |   77.44 |    75.09 |   74.07 |   77.44 | ...2033-2035,2070 
  ...liCommands.ts |   88.94 |    84.54 |     100 |   88.94 | ...43,412,446,567 
  ...ActiveAuth.ts |     100 |     87.5 |     100 |     100 | 66-80             
 ...cp-integration |   58.23 |    63.52 |   83.97 |   58.23 |                   
  acpAgent.ts      |   58.12 |    63.55 |   84.18 |   58.12 | ...8008,8016-8017 
  authMethods.ts   |      92 |       60 |     100 |      92 | 33-34             
  errorCodes.ts    |       0 |        0 |       0 |       0 | 1-22              
  ...DirContext.ts |     100 |      100 |     100 |     100 |                   
 ...ration/service |   97.83 |    96.96 |   92.85 |   97.83 |                   
  filesystem.ts    |   97.83 |    96.96 |   92.85 |   97.83 | 46-47,215-216     
 ...ration/session |   86.87 |    80.38 |   90.13 |   86.87 |                   
  ...ryReplayer.ts |   76.84 |    85.33 |   85.71 |   76.84 | ...50-365,378-379 
  Session.ts       |   87.49 |     79.7 |   91.37 |   87.49 | ...5532,5559-5563 
  ...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      |   84.42 |     70.9 |   59.25 |   84.42 |                   
  auth.ts          |     100 |    83.33 |     100 |     100 | 11,14             
  channel.ts       |   56.25 |      100 |       0 |   56.25 | 16-20,28-36       
  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         |   85.35 |    68.42 |     100 |   85.35 | ...49-552,566-570 
  sessions.ts      |     100 |      100 |      50 |     100 |                   
 ...mmands/channel |   76.92 |     82.4 |   80.21 |   76.92 |                   
  ...l-registry.ts |    6.66 |      100 |       0 |    6.66 | 6-32,35-53        
  ...entry-path.ts |      75 |       50 |     100 |      75 | 8-9               
  config-utils.ts  |     100 |      100 |     100 |     100 |                   
  configure.ts     |    14.7 |      100 |       0 |    14.7 | 18-21,23-84       
  daemon-worker.ts |   95.27 |    86.48 |   96.29 |   95.27 | ...92-493,562-563 
  pairing.ts       |   26.31 |      100 |       0 |   26.31 | ...30,40-50,52-65 
  pidfile.ts       |   96.77 |    88.46 |     100 |   96.77 | ...77-178,242-243 
  proxy.ts         |     100 |      100 |     100 |     100 |                   
  runtime.ts       |   70.39 |    81.81 |     100 |   70.39 | ...43-147,211-214 
  start.ts         |   72.48 |    68.65 |   63.15 |   72.48 | ...78,484-487,498 
  status.ts        |   75.38 |       40 |     100 |   75.38 | 35-37,47-48,61-72 
  stop.ts          |   39.02 |    33.33 |     100 |   39.02 | 17-19,28-54       
 ...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.53 |    87.07 |    94.5 |   93.53 |                   
  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.92 |    85.53 |   82.75 |   86.92 | ...2190,2192-2200 
  ...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.06 |   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 |       88 |     100 |   89.47 | 43-44,53-54,56-57 
  ...tedFolders.ts |   93.78 |    94.73 |     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 |   78.99 |    76.11 |   81.03 |   78.99 |                   
  session.ts       |   83.18 |       75 |   93.47 |   83.18 | ...63-964,973-983 
  types.ts         |    42.5 |      100 |   33.33 |    42.5 | ...00-601,604-605 
 ...active/control |   75.88 |    88.46 |      80 |   75.88 |                   
  ...rolContext.ts |    6.45 |        0 |       0 |    6.45 | 56-95             
  ...Dispatcher.ts |   91.69 |       92 |   88.88 |   91.69 | ...49-367,384,387 
  ...rolService.ts |     7.4 |        0 |       0 |     7.4 | 46-185            
 ...ol/controllers |   27.87 |    44.44 |    37.5 |   27.87 |                   
  ...Controller.ts |   39.49 |      100 |      80 |   39.49 | 88-92,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 |   24.52 |       40 |   33.33 |   24.52 | ...64-476,485-514 
 .../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         |   87.15 |    83.75 |   88.27 |   87.15 |                   
  ...ion-bridge.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |    93.4 |    92.95 |     100 |    93.4 | ...16-317,320-322 
  ...em-adapter.ts |     100 |      100 |     100 |     100 |                   
  capabilities.ts  |     100 |    96.29 |     100 |     100 | 419               
  ...-selection.ts |     100 |      100 |     100 |     100 |                   
  ...worker-env.ts |     100 |      100 |     100 |     100 |                   
  ...supervisor.ts |   97.59 |    89.25 |   95.91 |   97.59 | ...07,523,538,712 
  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.89 |     82.9 |     100 |   97.89 | ...10,712-713,764 
  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 
  ...-path-argv.ts |     100 |      100 |     100 |     100 |                   
  ...h-settings.ts |   94.88 |    89.02 |     100 |   94.88 | ...08,683,699,709 
  fast-path.ts     |   91.07 |    81.69 |   95.45 |   91.07 | ...40-449,515-516 
  index.ts         |       0 |        0 |       0 |       0 | 1-143             
  ...back-binds.ts |     100 |    88.88 |     100 |     100 | 32                
  ...sion-audit.ts |     100 |      100 |   93.33 |     100 |                   
  rate-limit.ts    |   92.43 |    88.17 |     100 |   92.43 | ...81-283,295-297 
  ...qwen-serve.ts |   81.15 |    82.05 |   66.66 |   81.15 | ...2874,2896-2899 
  ...tup-errors.ts |     100 |      100 |     100 |     100 |                   
  server.ts        |   95.55 |    93.82 |   79.16 |   95.55 | ...07-714,811-818 
  ...t-event-id.ts |     100 |    91.66 |     100 |     100 | 12                
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...erver-name.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 |   91.07 |     86.2 |     100 |   91.07 | ...79-182,216-219 
  ...ace-agents.ts |   62.47 |    70.34 |   90.47 |   62.47 | ...1332,1342-1352 
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...ace-memory.ts |   87.17 |    78.46 |     100 |   87.17 | ...56-363,423-430 
  ...ers-status.ts |   97.05 |    79.38 |     100 |   97.05 | ...47,150,263-269 
  ...ber-errors.ts |     100 |      100 |     100 |     100 |                   
  ...e-remember.ts |   95.63 |    93.75 |     100 |   95.63 | ...99,119-124,206 
 ...serve/acp-http |   72.15 |     73.5 |    92.7 |   72.15 |                   
  ...r-registry.ts |   93.15 |    83.33 |     100 |   93.15 | 206,220-225       
  client-mcp-ws.ts |   54.85 |    58.62 |   72.72 |   54.85 | ...99-300,304-305 
  ...n-registry.ts |   97.53 |    87.01 |   97.36 |   97.53 | 993,1013-1027     
  dispatch.ts      |   66.37 |     69.2 |     100 |   66.37 | ...3664,3712-3718 
  index.ts         |   72.81 |    68.42 |   84.21 |   72.81 | ...1283,1312-1314 
  json-rpc.ts      |     100 |    96.96 |     100 |     100 | 92                
  safe-ws-send.ts  |   52.94 |    71.42 |     100 |   52.94 | 33-42,47-55       
  sse-stream.ts    |   93.96 |    88.57 |   84.61 |   93.96 | ...57-159,161-163 
  ...ort-stream.ts |       0 |        0 |       0 |       0 | 1                 
  ws-stream.ts     |   91.86 |       80 |     100 |   91.86 | 45,50,96,100-103  
 src/serve/auth    |   86.86 |    79.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 
 ...rve/cdp-tunnel |   81.64 |    70.28 |   86.84 |   81.64 |                   
  ...r-emulator.ts |   87.14 |    57.14 |   85.71 |   87.14 | ...72-175,194-195 
  ...verse-link.ts |   85.42 |    72.46 |     100 |   85.42 | ...17-321,325-330 
  ...l-registry.ts |     100 |      100 |     100 |     100 |                   
  cdp-ws.ts        |   67.68 |       60 |   42.85 |   67.68 | ...13-218,232,244 
 ...nel/acceptance |       0 |        0 |       0 |       0 |                   
  ...mcp-smoke.mjs |       0 |        0 |       0 |       0 | 1-103             
  ...cceptance.mjs |       0 |        0 |       0 |       0 | 1-329             
  real-tab.mjs     |       0 |        0 |       0 |       0 | 1-77              
 src/serve/fs      |   85.31 |    81.43 |     100 |   85.31 |                   
  audit.ts         |     100 |    96.15 |     100 |     100 | 204               
  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  |   81.58 |    77.21 |   89.16 |   81.58 |                   
  a2ui-action.ts   |     100 |     94.2 |     100 |     100 | 120,124,169,273   
  capabilities.ts  |     100 |      100 |     100 |     100 |                   
  daemon-status.ts |   83.67 |    83.33 |     100 |   83.67 | 82-89             
  health-demo.ts   |    92.3 |    83.33 |     100 |    92.3 | 55-59             
  permission.ts    |     100 |     91.3 |     100 |     100 | 39,78             
  session.ts       |   76.96 |    79.86 |   66.66 |   76.96 | ...1241,1248-1273 
  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.42 |    72.72 |   86.36 |   84.42 | ...63-965,984-987 
  ...-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 
  ...-lifecycle.ts |     100 |    91.66 |     100 |     100 | 65                
  ...cp-control.ts |   71.42 |    83.72 |     100 |   71.42 | ...04-210,215-218 
  ...ermissions.ts |   87.38 |    76.19 |     100 |   87.38 | ...05-106,132-133 
  ...e-settings.ts |   43.26 |       55 |   66.66 |   43.26 | ...71-281,286-291 
  ...tup-github.ts |   77.52 |    70.27 |   84.21 |   77.52 | ...87,309,352-353 
  ...ace-status.ts |    73.1 |    57.69 |     100 |    73.1 | ...45-146,155-156 
  ...pace-tools.ts |   77.77 |       75 |     100 |   77.77 | 47-52,62-67,91-94 
  ...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  |   84.28 |    86.37 |   93.33 |   84.28 |                   
  access-log.ts    |   97.72 |    95.45 |     100 |   97.72 | 51                
  ...er-helpers.ts |   63.82 |    77.96 |   81.81 |   63.82 | ...16,330,332-347 
  ...w-registry.ts |   98.38 |    88.23 |     100 |   98.38 | 81                
  ...r-handlers.ts |   81.81 |       50 |     100 |   81.81 | 16,23,27-28       
  ...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 |                   
  ...iter-setup.ts |   66.66 |    66.66 |   33.33 |   66.66 | 28-33,36-41       
  ...st-helpers.ts |   93.97 |    93.47 |     100 |   93.97 | ...31-133,387-392 
  self-origin.ts   |     100 |      100 |     100 |     100 |                   
  ...e-features.ts |   91.13 |    94.44 |     100 |   91.13 | 103-109           
  session-list.ts  |     100 |    91.89 |     100 |     100 | 34,128,130        
  telemetry.ts     |   95.62 |    96.87 |     100 |   95.62 | ...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.82 |    88.18 |   98.24 |   91.82 |                   
  ...mandLoader.ts |     100 |    88.88 |     100 |     100 | 100-113           
  ...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.15 |     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.01 |       81 |   95.83 |   90.01 | ...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.84 |     100 |   97.35 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  tipHistory.ts    |   92.59 |       70 |     100 |   92.59 | ...24,146,153,162 
  tipRegistry.ts   |     100 |      100 |     100 |     100 |                   
  tipScheduler.ts  |     100 |    91.66 |     100 |     100 | 55                
 src/startup       |   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            |   68.86 |    70.13 |   61.11 |   68.86 |                   
  App.tsx          |   33.33 |       75 |   33.33 |   33.33 | 32-86             
  AppContainer.tsx |   69.88 |     65.4 |   57.14 |   69.88 | ...3633,4142-4146 
  ...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 |    66.18 |   51.06 |   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.73 |   57.69 |   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   |   79.59 |    82.35 |   88.01 |   79.59 |                   
  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     |    92.1 |     84.9 |     100 |    92.1 | ...4-69,94-99,178 
  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 
  ...ig-command.ts |   93.06 |    88.33 |     100 |   93.06 | ...04-312,318-320 
  ...extCommand.ts |    65.8 |    68.25 |   84.61 |    65.8 | ...57-590,601-602 
  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.43 |     88.4 |    90.9 |   81.43 | ...59-264,311-318 
  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  |   80.64 |    88.33 |   83.33 |   80.64 | ...72-477,640-645 
  ...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 |     100 |     87.5 |     100 |     100 | 46                
  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 |   64.38 |    78.18 |   72.72 |   64.38 |                   
  AboutBox.tsx     |     100 |      100 |     100 |     100 |                   
  ...ateScreen.tsx |   77.41 |    66.66 |      50 |   77.41 | 34-40             
  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 |   86.72 |    86.66 |     100 |   86.72 | ...00-302,355-359 
  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 
  CronPill.tsx     |     100 |    93.75 |     100 |     100 | 18                
  ...ification.tsx |       0 |        0 |       0 |       0 | 1-36              
  ...gProfiler.tsx |       0 |        0 |       0 |       0 | 1-36              
  ...ogManager.tsx |       0 |        0 |       0 |       0 | 1-582             
  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       |   75.54 |       54 |     100 |   75.54 | ...09-214,232-236 
  ...ngSpinner.tsx |   68.42 |       80 |      50 |   68.42 | 35-52,73,80-81    
  GoalPill.tsx     |   83.33 |    76.92 |     100 |   83.33 | 24-30             
  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.66 |    64.19 |     100 |   73.66 | ...46,449,452-458 
  ...ngeDialog.tsx |     100 |      100 |     100 |     100 |                   
  InputPrompt.tsx  |   81.72 |    80.27 |   77.77 |   81.72 | ...2061,2087,2147 
  ...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.84 |     77.9 |    62.5 |   64.84 | ...02,421,470-472 
  ...geDisplay.tsx |       0 |        0 |       0 |       0 | 1-41              
  ModelDialog.tsx  |   82.81 |    75.64 |     100 |   82.81 | ...82-798,855-859 
  ...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 |    69.6 |    73.01 |      75 |    69.6 | ...34-842,848-849 
  ...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 |    92.9 |       85 |     100 |    92.9 | ...04,207,234-236 
  ThemeDialog.tsx  |   89.95 |    46.15 |      75 |   89.95 | ...71-173,243-245 
  ...ingViewer.tsx |   74.01 |    55.55 |     100 |   74.01 | ...02,111-118,130 
  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 | ...68,773-774,811 
  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 | ...98-405,408-420 
  ...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 |   40.96 |    61.53 |   70.58 |   40.96 |                   
  ...ealthPill.tsx |   68.42 |    85.71 |     100 |   68.42 | 40-46             
  ...entDialog.tsx |      33 |    26.19 |      40 |      33 | ...81,883,896-902 
  ...valDialog.tsx |   15.06 |      100 |       0 |   15.06 | 40-109            
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-35              
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |      97 |       95 |     100 |      97 | 24,113-114        
 ...ents/mcp/steps |   54.25 |    74.31 |   57.14 |   54.25 |                   
  ...icateStep.tsx |    5.65 |      100 |       0 |    5.65 | 40-66,69-308      
  ...electStep.tsx |   10.95 |      100 |       0 |   10.95 | 16-88             
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...eListStep.tsx |   99.09 |    97.36 |     100 |   99.09 | 71                
  ...etailStep.tsx |    64.8 |    62.26 |   33.33 |    64.8 | ...75-284,295-317 
  ...rListStep.tsx |   88.46 |    81.25 |     100 |   88.46 | ...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 |   86.83 |    82.73 |   80.45 |   86.83 |                   
  ...ionDialog.tsx |   86.88 |    81.25 |      80 |   86.88 | ...21,539,557-559 
  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 |   89.92 |    86.66 |    90.9 |   89.92 | ...13-319,376-382 
  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.6 |    88.46 |     100 |    95.6 | ...48,150,183-188 
  ...ssMessage.tsx |    12.5 |      100 |       0 |    12.5 | 18-59             
  ...edMessage.tsx |   16.66 |      100 |       0 |   16.66 | 22-38             
  ...sMessages.tsx |   58.65 |       50 |    37.5 |   58.65 | ...20-125,146-158 
  ...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 |   98.23 |       95 |     100 |   98.23 | 173-176,390       
  ToolMessage.tsx  |   88.72 |    76.66 |    92.3 |   88.72 | ...66-771,798-800 
 ...ponents/shared |    85.5 |    81.53 |   94.62 |    85.5 |                   
  ...ctionList.tsx |     100 |      100 |      75 |     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 |                   
  ...ontroller.tsx |     100 |    83.33 |     100 |     100 | 73,93-95          
  ...eSelector.tsx |     100 |       60 |     100 |     100 | 40-45             
  ...lableList.tsx |    82.7 |    84.84 |     100 |    82.7 | 46-64,71-74       
  StaticRender.tsx |   72.72 |      100 |     100 |   72.72 | 31-33             
  TextInput.tsx    |    80.8 |    67.24 |      80 |    80.8 | ...36-240,252-258 
  ...ontroller.tsx |     100 |    81.81 |     100 |     100 | 59-62             
  ...apsedTime.tsx |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |     100 |      100 |     100 |     100 |                   
  ...lizedList.tsx |   88.54 |    83.64 |      90 |   88.54 | ...15,745-773,869 
  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.89 |    72.38 |    64.7 |   70.89 |                   
  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    |   92.01 |     73.8 |     100 |   92.01 | ...36,175-177,262 
  SkillsList.tsx   |   27.27 |      100 |       0 |   27.27 | 18-35             
  ToolsList.tsx    |     100 |      100 |     100 |     100 |                   
 src/ui/contexts   |   81.99 |    79.01 |   83.33 |   81.99 |                   
  ...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 |   82.72 |    82.81 |     100 |   82.72 | ...1284,1292-1294 
  ...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 | 142-143           
  ...teContext.tsx |   86.66 |       50 |     100 |   86.66 | 225-226           
  ...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.55 |    81.52 |   88.44 |   83.55 |                   
  ...dProcessor.ts |   80.38 |    81.48 |     100 |   80.38 | ...53-654,660-665 
  ...ention-ref.ts |   97.67 |       84 |     100 |   97.67 | 63                
  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.65 |    64.28 |   84.21 |   84.65 | ...1110,1131-1135 
  ...sced-flush.ts |     100 |      100 |     100 |     100 |                   
  ...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 |      52 |    63.63 |     100 |      52 | ...59,67-70,76-87 
  ...odeCommand.ts |   58.82 |      100 |     100 |   58.82 | 28,33-48          
  ...enaCommand.ts |      85 |      100 |     100 |      85 | 23-24,29          
  ...aInProcess.ts |   27.92 |       80 |      25 |   27.92 | ...69-170,173-175 
  ...Completion.ts |    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.37 |     73.8 |     100 |   93.37 | ...37,186,259-262 
  ...ompletion.tsx |   96.75 |    81.81 |     100 |   96.75 | ...78-279,289-290 
  ...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 |   78.26 |       50 |     100 |   78.26 | ...2,75-79,96-104 
  ...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.7 |     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.6 |    80.09 |   95.45 |    83.6 | ...3406,3491-3499 
  ...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 |       80 |      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 |     92.3 |     100 |     100 | 40                
  ...ouseEvents.ts |   94.25 |    97.22 |   83.33 |   94.25 | 76-80             
  ...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.66 |    72.41 |     100 |   93.66 | ...17,155,196-201 
  ...ompletion.tsx |   90.67 |    83.33 |     100 |   90.67 | ...02,105,138-141 
  ...ectionList.ts |   97.12 |    96.22 |     100 |   97.12 | ...92-193,247-250 
  ...sionPicker.ts |   92.87 |    90.35 |     100 |   92.87 | ...99-501,503-505 
  ...earchInput.ts |     100 |    97.29 |     100 |     100 | 82                
  ...ngsCommand.ts |   18.75 |      100 |       0 |   18.75 | 10-25             
  ...ellHistory.ts |   93.28 |    80.95 |     100 |   93.28 | ...96,153-154,164 
  ...oryCommand.ts |       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      |      84 |    83.33 |   93.57 |      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.1 |    88.77 |     100 |    96.1 | ...73,175-176,320 
  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.41 |     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.6 |    95.16 |     100 |    95.6 | 96-99             
  input-mouse.ts   |     100 |    85.71 |     100 |     100 | 48,93             
  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 |                   
  list-mouse.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 |     87.5 |     100 |     100 | 85                
  ...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.85 |    73.77 |     100 |   92.85 | ...38,145,149-152 
  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 |   68.54 |    78.07 |   93.33 |   68.54 | ...41-463,589-590 
  ...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     |   93.99 |    90.56 |   93.33 |   93.99 | ...89-290,425-426 
  ...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 |    73.04 |    79.1 |   81.12 |                   
  ...d-recorder.ts |     6.2 |      100 |       0 |     6.2 | ...33-159,162-163 
  ...o-recorder.ts |   84.61 |    93.33 |   57.14 |   84.61 | ...16-117,131-136 
  ...me-session.ts |   91.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         |   74.14 |    89.16 |   91.31 |   74.14 |                   
  acpModelUtils.ts |   95.49 |    94.23 |     100 |   95.49 | 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 |                   
  ...on-mention.ts |   88.48 |     82.6 |     100 |   88.48 | ...56-160,164-168 
  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.72 |     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 |   95.33 |    92.08 |     100 |   95.33 | ...51-452,550,563 
  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.03 |    88.81 |      90 |   82.03 | ...11-729,736-744 
  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.64 |    84.83 |   86.01 |   84.64 |                   
 src               |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/__mocks__/fs  |       0 |        0 |       0 |       0 |                   
  promises.ts      |       0 |        0 |       0 |       0 | 1-48              
 src/agents        |   90.07 |    82.04 |   94.92 |   90.07 |                   
  ...transcript.ts |    92.3 |    85.93 |     100 |    92.3 | ...06,325-326,457 
  ...ent-resume.ts |   83.47 |    71.75 |   79.41 |   83.47 | ...1269-1273,1276 
  ...ound-tasks.ts |   96.83 |    89.13 |     100 |   96.83 | ...1171,1191-1194 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ent-result.ts |    96.8 |    92.68 |     100 |    96.8 | 106,129-131       
  ...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.3 |    85.35 |   82.54 |    88.3 |                   
  agent-context.ts |     100 |      100 |     100 |     100 |                   
  agent-core.ts    |   79.59 |    76.26 |   65.95 |   79.59 | ...1857,1884-1931 
  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 |                   
  ...ool-policy.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.78 |    87.79 |   82.35 |   91.78 | ...1767,1816-1819 
  ...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.9 |    83.33 |     100 |    97.9 | 138-139,236       
 src/agents/tasks  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/agents/team   |   80.38 |    83.26 |    86.5 |   80.38 |                   
  TeamManager.ts   |    67.4 |    76.54 |   74.41 |    67.4 | ...1444,1467-1468 
  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        |   81.55 |    85.65 |   68.42 |   81.55 |                   
  ...xtDefaults.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   80.32 |    85.08 |   65.17 |   80.32 | ...5925,5930-5931 
  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          |   89.09 |     84.5 |    92.1 |   89.09 |                   
  baseLlmClient.ts |   86.12 |    79.27 |   77.77 |   86.12 | ...91,601,649-651 
  client.ts        |   88.06 |    81.17 |   90.32 |   88.06 | ...2729,2797-2798 
  ...tGenerator.ts |   88.07 |       75 |     100 |   88.07 | ...79-383,391-395 
  ...lScheduler.ts |   88.18 |    82.72 |   95.06 |   88.18 | ...4320,4348-4359 
  geminiChat.ts    |   89.14 |     86.9 |   95.06 |   89.14 | ...3325,3392-3393 
  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 |    89.55 |   72.72 |   88.93 | ...-910,1113-1114 
  ...port-retry.ts |     100 |      100 |     100 |     100 |                   
  tokenLimits.ts   |     100 |    89.28 |     100 |     100 | 25,60-61          
  ...allIdUtils.ts |   98.23 |     92.1 |     100 |   98.23 | 36,45             
  ...okTriggers.ts |   99.43 |    91.58 |     100 |   99.43 | 175,186           
  ...terruption.ts |     100 |       92 |     100 |     100 | 86,104            
  turn.ts          |   97.79 |       90 |     100 |   97.79 | ...57,584-585,631 
 ...ntentGenerator |   95.12 |    82.79 |   94.11 |   95.12 |                   
  ...tGenerator.ts |   96.69 |    84.48 |    93.1 |   96.69 | ...1004,1032-1034 
  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.61 |    84.69 |    92.1 |   94.61 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |   94.51 |    83.39 |   91.66 |   94.51 | ...1113-1114,1142 
  ...tDetection.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   88.88 |    85.71 |   94.04 |   88.88 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  converter.ts     |   88.21 |    83.25 |   96.29 |   88.21 | ...1572,1741-1756 
  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 |    89.93 |     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.5 |     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.12 |    90.65 |   96.15 |   97.12 |                   
  dashscope.ts     |   97.82 |    92.56 |   94.73 |   97.82 | ...21-322,464-465 
  deepseek.ts      |   94.91 |    89.36 |     100 |   94.91 | ...31-132,145-146 
  default.ts       |    97.5 |    96.55 |   88.88 |    97.5 | 122-123,193       
  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.89 |   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.42 |   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         |   87.01 |    85.68 |    88.1 |   87.01 |                   
  ...okRegistry.ts |   86.48 |    77.08 |     100 |   86.48 | ...41-344,362-369 
  ...bortSignal.ts |     100 |      100 |     100 |     100 |                   
  context-usage.ts |     100 |      100 |     100 |     100 |                   
  ...terpolator.ts |   96.66 |    93.33 |     100 |   96.66 | 66-67             
  ...HookRunner.ts |   96.68 |    87.23 |     100 |   96.68 | 110-112,231-233   
  ...Aggregator.ts |   96.35 |    90.69 |     100 |   96.35 | ...00-301,382,384 
  ...entHandler.ts |   95.34 |    85.05 |   94.11 |   95.34 | ...74,931-932,942 
  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.05 |      100 |   68.88 |   87.05 | ...21-722,728-729 
  ...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           |   76.51 |     84.8 |   78.68 |   76.51 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  detect-ide.ts    |     100 |      100 |     100 |     100 |                   
  ide-client.ts    |   68.16 |    84.24 |    67.5 |   68.16 | ...1028,1057-1065 
  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        |   81.43 |    79.95 |   84.68 |   81.43 |                   
  const.ts         |   94.28 |     92.3 |     100 |   94.28 | 66-67             
  dream.ts         |      66 |    73.33 |      50 |      66 | 51,108-149        
  ...entPlanner.ts |     100 |       80 |     100 |     100 | 124,134           
  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 |   91.47 |       75 |     100 |   91.47 | ...03,112-115,289 
  ...ionPlanner.ts |       0 |        0 |       0 |       0 | 1                 
  forget.ts        |   46.21 |    61.53 |   44.44 |   46.21 | ...06,213,216-348 
  indexer.ts       |   94.14 |    83.67 |     100 |   94.14 | ...32-233,334,337 
  manager.ts       |   78.57 |    82.29 |   77.77 |   78.57 | ...1474,1487-1489 
  ...ent-config.ts |   80.75 |    76.11 |   82.35 |   80.75 | ...15,234,241-247 
  memoryAge.ts     |   90.47 |       80 |     100 |   90.47 | 50-51             
  paths.ts         |   80.48 |    92.53 |     100 |   80.48 | ...45-346,354-355 
  ...ing-skills.ts |     100 |       72 |     100 |     100 | 31-35,73-78,97    
  prompt.ts        |   95.49 |    79.41 |     100 |   95.49 | ...66,169,364-365 
  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 
  remember.ts      |   97.75 |    85.41 |     100 |   97.75 | 50,70,209,224     
  scan.ts          |   93.12 |    77.41 |     100 |   93.12 | ...08-109,154,157 
  ...et-scanner.ts |     100 |      100 |     100 |     100 |                   
  ...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 
  ...git-status.ts |     100 |     87.5 |     100 |     100 | 30                
  ...cret-guard.ts |     100 |      100 |     100 |     100 |                   
  ...emory-sync.ts |   94.24 |    82.85 |     100 |   94.24 | ...34-236,246-247 
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ontextFile.ts |   79.38 |    78.33 |   81.81 |   79.38 | ...58-272,286-291 
 src/mocks         |       0 |        0 |       0 |       0 |                   
  msw.ts           |       0 |        0 |       0 |       0 | 1-9               
 src/models        |   91.19 |    88.08 |   89.74 |   91.19 |                   
  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  |   88.06 |    86.54 |   85.36 |   88.06 | ...1348,1377-1378 
  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     |   79.06 |    74.45 |   68.75 |   79.06 |                   
  all-providers.ts |   69.23 |      100 |       0 |   69.23 | 71-72,76-82,86-92 
  index.ts         |     100 |      100 |     100 |     100 |                   
  install.ts       |   92.78 |    84.12 |     100 |   92.78 | ...39-240,313-314 
  ...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.8 |   95.89 |    85.3 |                   
  ...tGenerator.ts |   98.64 |    98.18 |     100 |   98.64 | 105-106           
  qwenOAuth2.ts    |   82.55 |    73.71 |   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      |   88.29 |    85.08 |   94.79 |   88.29 |                   
  ...ionTrailer.ts |     100 |      100 |     100 |     100 |                   
  ...llRegistry.ts |   97.35 |    85.34 |     100 |   97.35 | ...94,117,417-418 
  ...ionService.ts |   96.65 |    95.57 |     100 |   96.65 | ...76,692,821-829 
  ...ingService.ts |   87.18 |    83.14 |   83.72 |   87.18 | ...1456,1471-1472 
  ...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.34 |    91.21 |     100 |   95.34 | ...1011,1320-1321 
  cronTasksFile.ts |   93.78 |     87.5 |     100 |   93.78 | ...72-173,182-183 
  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.86 |    69.35 |   93.33 |   69.86 | ...2066,2094-2095 
  ...ionService.ts |   98.09 |    97.07 |     100 |   98.09 | ...90-591,638-639 
  ...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 |   84.03 |    77.77 |   96.96 |   84.03 | ...2381,2387-2392 
  ...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.84 |     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 |      97 |    94.44 |   94.11 |      97 |                   
  ...part-utils.ts |     100 |      100 |     100 |     100 |                   
  ...ge-service.ts |   96.05 |    91.07 |      90 |   96.05 | ...14,221,307,404 
 src/skills        |    88.2 |    86.98 |   90.16 |    88.2 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...activation.ts |     100 |     93.1 |     100 |     100 | 93,112            
  skill-load.ts    |   94.84 |     87.3 |     100 |   94.84 | ...03,223,235-237 
  skill-manager.ts |   83.44 |    82.16 |   82.35 |   83.44 | ...1202,1209-1213 
  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           
 ...s/bundled/loop |   97.48 |    95.77 |     100 |   97.48 |                   
  ...omous-loop.ts |     100 |      100 |     100 |     100 |                   
  ...-task-file.ts |   94.85 |     92.4 |     100 |   94.85 | ...56,367,375-376 
  ...k-resolver.ts |     100 |      100 |     100 |     100 |                   
 src/subagents     |      86 |     85.9 |   94.33 |      86 |                   
  ...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.51 |    80.66 |   91.17 |   81.51 | ...1450,1527-1528 
  types.ts         |     100 |      100 |     100 |     100 |                   
  validation.ts    |   92.46 |    95.18 |     100 |   92.46 | 47-52,63-68,71-76 
 src/telemetry     |   78.98 |    87.16 |   80.85 |   78.98 |                   
  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.84 |    68.88 |      60 |   52.84 | ...1318,1335-1355 
  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.06 |    88.25 |   96.55 |   90.06 | ...1541,1572-1575 
  ...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.83 |    85.27 |   83.54 |   78.83 | ...1301,1305-1312 
  uiTelemetry.ts   |   93.07 |    92.85 |   83.33 |   93.07 | ...62,290,410-411 
 ...ry/qwen-logger |    69.9 |    83.01 |   65.51 |    69.9 |                   
  event-types.ts   |       0 |        0 |       0 |       0 |                   
  qwen-logger.ts   |    69.9 |    82.85 |   64.91 |    69.9 | ...1079,1117-1118 
 src/test-utils    |   93.44 |    96.15 |   77.77 |   93.44 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  ...st-helpers.ts |   94.11 |       90 |     100 |   94.11 | 69-70             
  index.ts         |     100 |      100 |     100 |     100 |                   
  mock-tool.ts     |   91.71 |    97.36 |   74.19 |   91.71 | ...54,218-219,232 
  ...aceContext.ts |     100 |      100 |     100 |     100 |                   
 src/tools         |   83.54 |    82.99 |   87.45 |   83.54 |                   
  ...erQuestion.ts |   90.74 |    82.43 |    92.3 |   90.74 | ...23-424,431-432 
  ...-registrar.ts |    77.7 |    66.66 |   66.66 |    77.7 | ...72-277,292-294 
  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          |   82.79 |    86.77 |   81.25 |   82.79 | ...46-747,866-916 
  ...r-worktree.ts |   83.14 |    67.56 |    87.5 |   83.14 | ...84-187,278-279 
  enterPlanMode.ts |   82.35 |    73.68 |   85.71 |   82.35 | ...,86-91,124-138 
  exit-worktree.ts |   83.29 |    83.65 |   94.44 |   83.29 | ...14-515,537-538 
  exitPlanMode.ts  |   83.19 |    79.36 |     100 |   83.19 | ...18-421,451-454 
  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 |      100 |       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.6 |    77.39 |   81.25 |    85.6 | ...89-905,951-952 
  ...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.75 |    90.32 |   81.81 |   94.75 | ...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 |   71.42 |    55.55 |   71.42 |   71.42 | ...36-137,143-144 
  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         |   77.35 |    81.92 |   91.48 |   77.35 | ...4809,4872-4873 
  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.09 |     76.1 |   81.39 |   76.09 | ...62-863,871-872 
  tool-search.ts   |   94.26 |       90 |   93.33 |   94.26 | ...62-267,379-388 
  tools.ts         |   93.97 |     90.9 |   95.23 |   93.97 | ...99-500,516-522 
  web-fetch.ts     |   90.12 |    85.71 |   92.85 |   90.12 | ...11-312,326-327 
  write-file.ts    |   84.38 |    82.79 |   84.61 |   84.38 | ...90-693,730-765 
 src/tools/agent   |   81.51 |    83.96 |      80 |   81.51 |                   
  agent.ts         |   81.48 |    84.09 |   79.51 |   81.48 | ...3168,3195-3258 
  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.21 |    82.17 |   78.08 |   90.21 |                   
  bootstrap.ts     |   59.42 |    80.95 |   41.66 |   59.42 | ...35-339,341-345 
  client.ts        |   80.11 |       90 |   77.77 |   80.11 | ...97,242-243,274 
  constants.ts     |     100 |    94.73 |     100 |     100 | 129,256           
  downloader.ts    |   65.29 |    52.77 |   58.33 |   65.29 | ...99-300,316-355 
  index.ts         |     100 |      100 |     100 |     100 |                   
  install-state.ts |   94.44 |    72.72 |     100 |   94.44 | 44-45             
  ...n-detector.ts |     100 |     87.5 |     100 |     100 | 50                
  schemas.ts       |     100 |      100 |     100 |     100 |                   
  tool.ts          |    96.3 |    85.71 |     100 |    96.3 | 75-76,184,252-258 
 ...tools/workflow |   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.68 |     88.9 |   95.13 |   90.68 |                   
  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      |   81.81 |      100 |      50 |   81.81 | 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 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...ncyLimiter.ts |   94.64 |    95.23 |     100 |   94.64 | 64-66             
  ...igResolver.ts |     100 |      100 |     100 |     100 |                   
  ...engthError.ts |   91.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        |   80.82 |    87.28 |   57.89 |   80.82 | ...08-324,328-334 
  fetch.ts         |   72.45 |    81.81 |   71.42 |   72.45 | ...31,142-143,162 
  fileUtils.ts     |   92.64 |    86.88 |   95.23 |   92.64 | ...1204,1236-1242 
  forkedAgent.ts   |   91.98 |    80.85 |   93.75 |   91.98 | ...90,598,603-610 
  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.91 |   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.72 |    92.59 |     100 |   93.72 | ...47-448,450-452 
  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 |    91.07 |     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 |      83 |    86.77 |   95.45 |      83 | ...68,593,622-631 
  ...odelPrefix.ts |     100 |      100 |     100 |     100 |                   
  runtimeStatus.ts |    97.5 |    89.74 |     100 |    97.5 | 162-163           
  safe-mode.ts     |     100 |      100 |     100 |     100 |                   
  safeJsonParse.ts |   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 |   92.09 |    83.56 |   90.47 |   92.09 | ...60,882-883,896 
  ...r-launcher.ts |   96.35 |    93.97 |   85.71 |   96.35 | ...35-336,347-348 
  sedEditParser.ts |   91.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.82 |     86.2 |     100 |   86.82 | ...81-187,189-195 
  ...pEventSink.ts |     100 |       80 |     100 |     100 | 61                
  ...tGenerator.ts |     100 |      100 |     100 |     100 |                   
  ...ameContext.ts |     100 |      100 |     100 |     100 |                   
  symlink.ts       |   81.48 |    77.77 |     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 |   15.74 |    33.33 |      25 |   15.74 | 33-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.

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Code Review

Independently, I'd approach this the same way: extract the launch logic into a parameterized function for initial vs restart, add bounded restart with escalating backoff, pipe-based log forwarding with redaction, and heartbeat monitoring via IPC messages. The PR's implementation matches this approach well.

The supervisor refactor is clean — launch('initial' | 'restart') eliminates the duplication between initial startup and restart paths. The restart policy (3 attempts in 5 min window, 1s/5s/15s backoff) is sensible. The log redaction pipeline (daemon token + sensitive env values + proxy URL credentials) is thorough. Heartbeat handling correctly validates PID and ignores stale messages after restarts.

The pidfile change to preserve startedAt across worker metadata updates is the right call — prevents clock skew in the reservation timestamp. The daemon-status distinction between permanent failure (error severity) and recoverable failure (warning severity, when nextRestartAt is set) is a nice operational nuance.

No correctness bugs or security issues found. The sanitize.ts regex widening to \p{Cf} and \p{Variation_Selector} is a safe superset of the previous explicit ranges. The stdio change from 'inherit' to 'pipe' for stdout/stderr is necessary for log forwarding.

Test Results

Unit tests: 257/257 passed across 7 test files:

  • channel-worker-supervisor.test.ts — restart budget, escalating delays, heartbeat timeout, stale kill, log forwarding with redaction, spawn failure, shutdown races
  • daemon-worker.test.ts — heartbeat interval, IPC channel closed, parent disconnect
  • run-qwen-serve.test.ts — pidfile updates on restart ready, log forwarding to daemon log, pidfile clear on exit
  • daemon-status.test.ts — permanent vs recoverable failure severity, successful restart no warning, partial connect
  • status.test.ts — omits worker PID when no live worker
  • pidfile.test.ts — preserves startedAt across metadata updates
  • sanitize.test.ts — format character neutralization

Typecheck: clean.

Real-Scenario Testing

CLI surface smoke test (built from PR branch):

$ node packages/cli/dist/index.js serve --help
qwen serve

Run Qwen Code as a local HTTP daemon (Stage 1 experimental: --http-bridge)

Options:
      --channel     Experimental: start a daemon-managed channel worker for the
                    named channel. Repeat to select multiple channels, or use
                    --channel all.  [array]
      ...

$ node packages/cli/dist/index.js channel status
No channel service is running.

CLI surface is unchanged as claimed — --channel flag present and documented, channel status reports correctly when no daemon is running. Full daemon lifecycle testing (start serve with --channel, crash a worker, verify restart) requires actual channel adapter configurations not available in this CI environment, but the unit tests comprehensively cover those scenarios with fake timers.

中文说明

代码审查

独立来看,我会采取相同方案:将 launch 逻辑提取为参数化函数(initial vs restart),添加有界重启和递增退避、基于 pipe 的日志转发和脱敏,以及通过 IPC 消息的心跳监测。PR 的实现与这个方案吻合。

supervisor 重构干净——launch('initial' | 'restart') 消除了初始启动和重启路径之间的重复。重启策略(5 分钟窗口内 3 次尝试,1s/5s/15s 退避)合理。日志脱敏管线(daemon token + 敏感环境变量值 + proxy URL 凭据)充分。心跳处理正确验证 PID 并忽略重启后的过期消息。

pidfile 变更保留 startedAt 是正确的——防止 reservation 时间戳偏移。daemon-status 区分永久失败(error 严重度)和可恢复失败(warning 严重度,当 nextRestartAt 存在时)是不错的运维细化。

未发现正确性 bug 或安全问题。

测试结果

单测: 257/257 通过,覆盖 7 个测试文件。类型检查: 通过。

实际场景测试

CLI 表面烟雾测试:serve --helpchannel status 工作正常,CLI 表面未变。完整 daemon 生命周期测试需要实际 channel adapter 配置,但单测已用 fake timer 全面覆盖这些场景。

Qwen Code · qwen3.7-max

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

This is a well-executed operational hardening PR. The motivation is real — daemon-managed channel workers that crash or hang after ready were not recoverable or observable enough for production use. The implementation delivers exactly what the description promises: bounded restart supervision, heartbeat monitoring, log forwarding with redaction, and richer status reporting.

The code is straightforward for what it does. The launch('initial' | 'restart') pattern cleanly unifies the two startup paths without over-abstracting. The restart policy is configurable but has sensible defaults. The log redaction is thorough without being paranoid. Timer cleanup is careful throughout — every setTimeout/setInterval has a corresponding clear function, and they're called in all the right places (stop, shutdown, restart).

My independent proposal would have been simpler on the supervisor side (probably a basic retry loop without the sliding window), but the PR's sliding-window restart budget is the right call for a long-running daemon — it prevents restart storms without permanently disabling recovery.

257 tests pass, typecheck clean, CLI surface unchanged. The unit tests use fake timers to cover timing-sensitive scenarios (restart delays, heartbeat timeouts, shutdown races) that would be hard to test with real processes. The oversized-ok label applies given the scope, but the changes are focused and each piece earns its place.

Approving. ✅

中文说明

这是一个执行良好的运维硬化 PR。动机真实——post-ready 崩溃或挂起的 daemon-managed channel worker 在生产使用中不够可恢复和可观测。实现精确交付了描述中承诺的内容:有界重启监督、心跳监测、带脱敏的日志转发、更丰富的状态报告。

代码对所做之事保持简洁。launch('initial' | 'restart') 模式干净地统一了两条启动路径,没有过度抽象。滑动窗口重启预算比简单的重试循环更适合长运行 daemon——防止重启风暴而不会永久禁用恢复。

257 测试通过,类型检查通过,CLI 表面未变。考虑到范围,oversized-ok 标签适用,但改动聚焦且每个部分都有其价值。

批准 ✅

Qwen Code · qwen3.7-max

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM, looks ready to ship. ✅

Comment thread packages/cli/src/serve/channel-worker-supervisor.ts Outdated
Comment thread packages/cli/src/serve/channel-worker-supervisor.ts Outdated
Comment thread packages/cli/src/serve/channel-worker-supervisor.ts Outdated
Comment thread packages/cli/src/serve/run-qwen-serve.ts
Comment thread packages/cli/src/serve/daemon-status.ts
Comment thread packages/cli/src/serve/channel-worker-supervisor.ts Outdated
Comment thread packages/cli/src/serve/channel-worker-supervisor.ts Outdated
Comment thread packages/cli/src/serve/run-qwen-serve.ts
doudouOUC and others added 2 commits July 1, 2026 12:33
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Comment thread packages/cli/src/serve/channel-worker-supervisor.ts Outdated
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Comment thread packages/cli/src/serve/channel-worker-supervisor.ts
Comment thread packages/cli/src/serve/channel-worker-supervisor.ts
Comment thread packages/cli/src/serve/channel-worker-supervisor.ts Outdated
Comment thread packages/cli/src/serve/channel-worker-supervisor.ts Outdated
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Comment thread packages/cli/src/serve/channel-worker-supervisor.ts Outdated
Comment thread packages/cli/src/serve/channel-worker-supervisor.ts Outdated
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Comment thread packages/cli/src/serve/channel-worker-supervisor.ts
Comment thread packages/cli/src/serve/channel-worker-supervisor.ts
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Comment thread packages/cli/src/serve/channel-worker-supervisor.ts Outdated
Comment thread packages/cli/src/serve/channel-worker-supervisor.ts
Comment thread packages/cli/src/serve/channel-worker-supervisor.ts
Comment thread packages/cli/src/serve/channel-worker-supervisor.ts Outdated
Comment thread packages/cli/src/serve/channel-worker-supervisor.ts Outdated
Comment thread packages/cli/src/serve/channel-worker-supervisor.ts
Comment thread packages/cli/src/serve/channel-worker-supervisor.test.ts
@wenshao

wenshao commented Jul 1, 2026

Copy link
Copy Markdown
Collaborator

✅ Local real-binary verification report (maintainer)

I built the PR head into a real qwen binary and drove it end-to-end with tmux + a creds-free plugin-example channel + a mock WebSocket platform (HTTP 9200 / WS 9201), then backed the timing-sensitive paths (redaction, heartbeat, restart budget) with compiled-dist harness + targeted mutation testing. Everything the PR claims holds.

Environment: macOS (Darwin 25.5.0), Node v22.22.2, isolated HOME, dedicated worktree at PR head 2dfc83bbd (git diff --check clean, head matches pull/6098/head).


1. Build & unit tests

Check Result
Full workspace build → runnable packages/cli/dist/index.js ✅ built, --version OK
vitest on the 6 changed test files 213 passed (channel-worker-supervisor 40, daemon-worker, run-qwen-serve 103, daemon-status, status, pidfile)
check:serve-fast-path-bundle (PR touches the fast-path root run-qwen-serve.ts) ✅ "Serve fast-path bundle closure check passed."
git diff --check (whitespace) ✅ clean

Note: packages/vscode-ide-companion failed to type-check in my sandbox (Cannot find name 'Thenable' / implicit-any) because that package's @types/vscode was absent in my locally-cloned node_modules. It is not in this PR's diff and is unrelated to the change. All PR-touched packages (core, acp-bridge, channels/*, cli) build clean.

2. E2E baseline (qwen serve --port 0 --channel my-plugin-test)

Assertion Evidence
Startup stays fail-fast / ordered listening on http://127.0.0.1:61709 is printed before [Channel] Connecting "my-plugin-test"… / connected (worker started only in completeRuntimeStartup)
Out-of-process isolation (3 PIDs) serve 7655 · --acp child 8221 · channel daemon-worker child 8226 (all PPID=7655)
Pidfile {"owner":"serve","pid":7655,"servePid":7655,"workerPid":8226,"channels":["my-plugin-test"]}
Worker connected to platform worker 8226 → TCP [::1]:61721->[::1]:9201 (ESTABLISHED)
/daemon/status state:"running", restartCount:0, pid:8226, lastHeartbeatAt populated
Ownership commands channel statusmanaged by qwen serve (PID 7655) + Worker PID: 8226 + uptime; channel stop & channel start both refuse with the serve-managed message

3. Worker log forwarding + redaction (NEW)

Worker output is now piped and forwarded into the daemon log (previously inherit):

[INFO]  [DAEMON] channel worker stdout: [Channel] Connecting "my-plugin-test"...
[INFO]  [DAEMON] channel worker stdout: [Channel] "my-plugin-test" connected.
[WARN]  [DAEMON] channel worker stderr: (node:8226) [DEP0040] DeprecationWarning: ...

stdout → daemonLog.info, stderr → daemonLog.warn, each prefixed channel worker <stream>:

Redaction — driving the compiled dist supervisor with a fake child emitting secrets (real redaction code, not a mock):

stderr: failed with <redacted>                         # daemon bearer token
stderr: split <redacted>                               # zero-width-split token (secret-to​ken)
stdout: adapter token <redacted>                       # TELEGRAM_BOT_TOKEN value
stdout: redis <redacted>                               # REDIS_PASSWORD value
stdout: auth <redacted>                                # BASIC_AUTH value
stderr: proxy http://<redacted>@proxy.example:8080/path  # URL credentials (host preserved)

verdict: leaked plaintext secrets = NONE, ssword gone. ✅

4. Bounded post-ready restart supervision (NEW — headline)

Single crash → recovered: kill -9 the ready worker 8226 →

  • daemon survives; new worker 28374 spawned (different PID) and re-ESTABLISHED to WS :9201
  • pidfile workerPid cleared → restored: tight sampling caught workerPid=CLEARED (owner stays serve) while no live/ready worker, then workerPid=28374 once the restarted worker reported ready. channel status shows no Worker PID: line during the gap (guarded by info.workerPid !== undefined).
  • /daemon/status: restartCount:1, lastExitAt:…30.280Z, lastRestartAt:…31.281Zexactly 1001 ms apart = delaysMs[0] (1 s)
  • daemon log: channel worker exited (state=exited, pid=8226, code=null, signal=SIGKILL, restartCount=0, nextRestartAt=…31.280Z, staleHeartbeatAt=none) then new-worker connect lines.

Budget is bounded (maxRestarts=3): kill the worker repeatedly →

kill result
#1#3 restarted, restartCount 1 → 2 → 3, new PIDs 53782 → 56767
#4 state:"failed", error:"Channel worker restart budget exhausted.", no live worker, serve daemon 7655 still alive

Failed-state /daemon/status warning carries all additive fields: channel_worker_exited … (…, restarts=3, lastExitAt=…, lastRestartAt=…, lastHeartbeatAt=…): Channel worker restart budget exhausted. (severity warning, a running restarted worker produces no warning since the warn guard only fires for exited/failed).

5. Heartbeat (NEW)

Worker emits {type:'heartbeat'} every 15 s → supervisor records lastHeartbeatAt, surfaced live in /daemon/status (observed on both the initial and the restarted worker). Stale-heartbeat SIGKILL path is covered by unit + mutation (below).

6. Graceful shutdown

SIGINT the daemon → serve + --acp + daemon-worker all exit, no orphan daemon-worker, pidfile removed. ✅

7. Mutation proofs (tests are non-vacuous)

Mutation (source) Expected Observed
A redactWorkerLogLine → return raw line redaction test red ✅ FAIL — failed with secret-token leaked
B canScheduleRestartreturn true budget test red ✅ FAIL — spy called 12× instead of 2× (infinite restart)
C drop kill('SIGKILL') on stale heartbeat stale-HB tests red ✅ FAIL — 2 stale-heartbeat tests red; unrelated HB tests stay green (targeted)

All mutations reverted; source restored clean.


Verdict

LGTM from local verification. Bounded post-ready restart, IPC heartbeat, redacted worker-log forwarding, additive /daemon/status fields, and serve-owned pidfile workerPid clear/restore all behave exactly as described on the real binary; pre-ready startup stays fail-fast and the public command surface is unchanged. The only local hiccup (vscode-ide-companion type-check) is an environment artifact outside this PR.

Verified against PR head 2dfc83bbd · real compiled binary + tmux + mock WS platform · unit (213) + compiled-dist redaction harness + 3 mutation proofs.

中文版(完整对应)

✅ 本地真实二进制验证报告(维护者)

我把 PR head 构建成真实 qwen 二进制,用 tmux + 免凭据的 plugin-example channel + mock WebSocket 平台(HTTP 9200 / WS 9201)做端到端验证,并对时序敏感路径(脱敏、心跳、重启预算)用编译产物 harness + 定向变异测试兜底。PR 声称的行为全部成立。

环境:macOS(Darwin 25.5.0)、Node v22.22.2、隔离 HOME、PR head 2dfc83bbd 的独立 worktree(git diff --check 干净,head 与 pull/6098/head 一致)。

1. 构建与单元测试

  • 全量构建 → 可运行的 packages/cli/dist/index.js ✅(--version 正常)
  • 6 个改动测试文件 vitest → ✅ 213 passed
  • check:serve-fast-path-bundle(本 PR 改了 fast-path 根 run-qwen-serve.ts)→ ✅ 通过;git diff --check 干净
  • 注:packages/vscode-ide-companion 在我沙箱里 type-check 失败(缺 @types/vscode),该包不在本 PR diff 内、与改动无关;PR 涉及的 core/acp-bridge/channels/*/cli 均构建干净。

2. E2E 基线(qwen serve --port 0 --channel my-plugin-test

  • 启动顺序/仍 fail-fastlistening on …:61709 打印在 [Channel] Connecting/connected 之前(worker 只在 runtime ready 后于 completeRuntimeStartup 启动)
  • 进程隔离(3 PID)serve 7655 · --acp 8221 · channel daemon-worker 8226(PPID 均 7655)
  • pidfile{"owner":"serve","pid":7655,"servePid":7655,"workerPid":8226,"channels":["my-plugin-test"]}
  • worker 连上平台:8226 → [::1]:61721->[::1]:9201 (ESTABLISHED)
  • /daemon/statusstate:"running"restartCount:0pid:8226lastHeartbeatAt 已填充
  • 归属命令channel statusmanaged by qwen serve (PID 7655) + Worker PID: 8226 + uptime;channel stop/channel start拒绝

3. worker 日志转发 + 脱敏(新增)

worker 输出现改为 pipe 并转发进 daemon log(原为 inherit):stdout→daemonLog.info、stderr→daemonLog.warn,前缀 channel worker <stream>: ✅。
脱敏——用假 child 向编译后的 dist supervisor喂密文(真实脱敏代码,非 mock):daemon token、零宽字符分割 token、敏感环境变量值、URL 凭据(http://<redacted>@host 保留主机)全部 <redacted>无明文泄漏ssword 消失)✅。

4. 有界 post-ready 重启监督(新增——核心)

单次崩溃→恢复kill -9 ready 的 8226 → daemon 幸存、新 worker 28374(PID 不同)重连 WS :9201;pidfile workerPid 先清后恢复(紧密采样捕捉到 CLEARED(owner 仍 serve)→ ready 后 28374,间隙内 channel status 不打印 Worker PID:);/daemon/statusrestartCount:1lastExitAt…30.280ZlastRestartAt…31.281Z——恰好相差 1001ms = delaysMs[0](1s) ✅;daemon log 记 channel worker exited (…signal=SIGKILL…nextRestartAt=…)
预算有界(maxRestarts=3#1#3 次 kill 都在预算内重启(restartCount 1→2→3);第 4 次 → state:"failed"error:"Channel worker restart budget exhausted.",无 live worker、serve daemon 7655 仍存活。failed 态告警消息带全部新增字段,且已恢复运行的 worker 不产生告警(告警只对 exited/failed 触发)。

5. 心跳(新增)

worker 每 15s 发 {type:'heartbeat'} → supervisor 记录 lastHeartbeatAt,在 /daemon/status 实时可见(初始与重启后 worker 均观测到)。stale-heartbeat 的 SIGKILL 路径由单测 + 变异兜底。

6. 优雅关闭

SIGINT daemon → serve+--acp+daemon-worker 全部退出、无孤儿 daemon-worker、pidfile 被移除 ✅。

7. 变异证明(测试非空过)

  • A 脱敏改 no-op → 脱敏测试翻红(secret-token 泄漏)✅
  • B canScheduleRestart 恒 true → 预算测试翻红(spy 被调 12 次 而非 2 次)✅
  • C stale heartbeat 去掉 kill('SIGKILL') → 2 个 stale-heartbeat 测试翻红,不相关心跳测试仍绿(定向)✅
  • 所有变异已还原,源码干净。

结论

本地验证通过,LGTM。 有界 post-ready 重启、IPC 心跳、脱敏 worker 日志转发、/daemon/status 新增字段、serve-owned pidfile workerPid 清除/恢复,在真实二进制上均与描述一致;ready 前启动仍 fail-fast,公开命令面不变。唯一本地异常(vscode-ide-companion type-check)是环境问题,与本 PR 无关。

验证基于 PR head 2dfc83bbd · 真实编译二进制 + tmux + mock WS 平台 · 单测(213)+ 编译 dist 脱敏 harness + 3 项变异证明。

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

Code Review Summary

Overall this is solid operational hardening work — the restart supervision, heartbeat monitoring, and log forwarding are well-structured, and the test coverage is thorough (210 tests passing). One critical security gap and a few minor suggestions below.

Critical

  1. sanitizeWorkerError doesn't redact secretsredactWorkerLogLine correctly strips bearer tokens, env secrets, and proxy credentials from worker stdout/stderr, but sanitizeWorkerError (which sets snapshot.error) only calls sanitizeLogText. Error messages containing secrets flow through handleRestartFailure, settleError, and failBeforeReady into snapshot.error, which is then served by /daemon/status unredacted.

Suggestions

  1. Restart budget exhausted message masked by ?? operator when handleRestartFailure already set error.
  2. Heartbeat PID mismatch guard (message.pid !== currentPid) has no test coverage.
  3. notifyReady throwing silently is untested.

Verdict: Request Changes (1 critical finding needs addressing before merge).

Comment thread packages/cli/src/serve/channel-worker-supervisor.ts
Comment thread packages/cli/src/serve/channel-worker-supervisor.ts Outdated
Comment thread packages/cli/src/serve/channel-worker-supervisor.ts
Comment thread packages/cli/src/serve/channel-worker-supervisor.ts
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
@doudouOUC
doudouOUC dismissed stale reviews from wenshao and qwen-code-ci-bot via e3f1eb1 July 1, 2026 07:42
Comment thread packages/cli/src/serve/channel-worker-supervisor.ts
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Qwen Code review timed out. Qwen review timed out after 120 minutes. For large PRs, retry with a longer timeout by commenting: @qwen-code /review --timeout=180. See workflow logs.

@doudouOUC

Copy link
Copy Markdown
Collaborator Author

@qwen-code /review --timeout=180

@github-actions

github-actions Bot commented Jul 1, 2026

Copy link
Copy Markdown
Contributor
_Qwen Code review request accepted. Review is queued in [workflow run](https://github.com/QwenLM/qwen-code/actions/runs/28508064954)._

Comment thread packages/cli/src/serve/channel-worker-supervisor.ts
Comment thread packages/cli/src/serve/channel-worker-supervisor.ts
Comment thread packages/cli/src/serve/channel-worker-supervisor.ts Outdated
Comment thread packages/cli/src/serve/channel-worker-supervisor.ts Outdated
Comment thread packages/cli/src/serve/channel-worker-supervisor.ts
Comment thread packages/cli/src/serve/channel-worker-supervisor.ts
Comment thread packages/cli/src/serve/channel-worker-supervisor.ts
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Comment thread packages/cli/src/serve/channel-worker-supervisor.ts
Comment thread packages/cli/src/serve/channel-worker-supervisor.ts
Comment thread packages/cli/src/serve/channel-worker-supervisor.ts
Comment thread packages/cli/src/serve/channel-worker-supervisor.ts
Comment thread packages/cli/src/serve/channel-worker-supervisor.ts
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Comment thread packages/cli/src/commands/channel/daemon-worker.ts Outdated
Comment thread packages/cli/src/serve/channel-worker-supervisor.ts
Comment thread packages/cli/src/serve/channel-worker-supervisor.ts
Comment thread packages/cli/src/serve/channel-worker-supervisor.ts Outdated
Comment thread packages/cli/src/serve/channel-worker-supervisor.ts Outdated
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Comment thread packages/cli/src/serve/channel-worker-supervisor.ts
Comment thread packages/cli/src/serve/channel-worker-supervisor.ts
Comment thread packages/cli/src/serve/channel-worker-supervisor.ts
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
@wenshao

wenshao commented Jul 1, 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. ✅

@yiliang114
yiliang114 added this pull request to the merge queue Jul 1, 2026
}
snapshot = {
...snapshot,
lastHeartbeatAt: message.at ?? new Date().toISOString(),

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Critical] This trusts the heartbeat timestamp supplied by the worker and later exposes it through /daemon/status. Channel adapters and plugins run inside that worker process, so a compromised or buggy adapter can send process.send({ type: 'heartbeat', pid: process.pid, at: process.env.TELEGRAM_BOT_TOKEN }) and bypass the new log/error redaction paths entirely. Please record the daemon's receive time here instead of reflecting worker-controlled data.

Suggested change
lastHeartbeatAt: message.at ?? new Date().toISOString(),
lastHeartbeatAt: new Date().toISOString(),

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

Fixed in PR #6146 (commit df3951a). Changed to new Date().toISOString() — the daemon now stamps its own receive time instead of reflecting the worker-supplied message.at value.

.map((secret) => new RegExp(escapeRegExp(secret), 'g'));

return (line: string): string => {
let redacted = line.replace(

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 redactor only removes the exact daemon token or sensitive env values, but the PR description promises bearer tokens are redacted. If a worker logs an HTTP header or SDK trace like Authorization: Bearer live-token, that token is not in secretPatterns, so it is forwarded into the daemon log. Please add a generic bearer/authorization-token redaction pass before emitting worker log lines, with a regression test.

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

Fixed in PR #6146 (commit 87eab8f). Added redactLogCredentials as a pattern-based redaction pass in createWorkerLogRedactor, covering Bearer/QQBot tokens, Authorization headers, API key prefixes (sk-, ghp_, glpat-, xoxb-), AWS key IDs, JSON secret fields, and DingTalk headers. Includes 34 unit tests.

...(opts.daemonToken && opts.daemonToken.length >= 4
? [opts.daemonToken]
: []),
...sensitiveEnvValues(opts.workerEnv),

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] Sensitive env values are added to the redaction set only as complete strings, but worker output is split and redacted one line at a time. Common secrets such as PEM private keys span multiple lines, so none of the individual logged lines match the full env value and the key material can still be written to the daemon log. Please normalize/split sensitive env values and redact non-trivial line fragments as well as the full value.

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

Fixed in PR #6146 (commit df3951a). sensitiveEnvValues now splits multi-line env values by \n and adds each line (>= 4 chars) as a separate redaction pattern alongside the full value. Individual PEM key lines will now match during per-line log redaction.

Merged via the queue into main with commit 487fb45 Jul 1, 2026
43 checks passed
@wenshao

wenshao commented Jul 1, 2026

Copy link
Copy Markdown
Collaborator

✅ Local real-binary verification (tmux E2E) — ready to merge

Verified as maintainer by building the real qwen binary at the current PR head and driving a live qwen serve --channel daemon through tmux against a creds-free plugin-example channel + mock WebSocket server. Every hardening claim in the PR description reproduced with real processes, real IPC, real signals, and real daemon logs — not mocks.

⚠️ Note: the branch advanced 7 commits since an earlier pass (2dfc83bbd8fe4b9c15), so this is a fresh re-verification. The review-feedback delta added real behavior to the PR surface (permanent-failure escalation, anchored sensitive-env regex, precompiled redactors, bounded oversized-line discard, input-validation guards, Unicode-property invisible stripping) — all re-checked below.

Environment

Head 8fe4b9c15476f98e49066370fcd525828d855439
Net diff 15 files (packages/cli/**, packages/channels/base/**, docs)
Platform macOS (Darwin 25.5), Node v22.22.2
Method worktree build of real dist/index.js + tmux-hosted daemon (nohup) + mock WS 9201 + plugin-example channel

1. Static + unit + mutation

Check Result
tsc --build cli / core / channels-base ✅ clean (dist produced) — the only build errors were vscode-ide-companion missing @types/vscode in my sandbox, unrelated (PR touches 0 vscode files; real CI runs full npm ci)
git diff --check ✅ clean
Unit tests — 6 cli PR files (channel-worker-supervisor, daemon-worker, run-qwen-serve, daemon-status, status, pidfile) 226 passed
Unit tests — channels/base sanitize.test.ts 31 passed
Mutation A — bypass createWorkerLogRedactor (return raw line) forwards … secrets redacted turns RED (load-bearing)
Mutation BcanScheduleRestart → always true stops restarting after restart budget is exhausted turns RED
Mutation Cdaemon-status severity → always warning reports permanently failed … as errors turns RED

Mutations reverted; suite re-confirmed green afterward.

2. Real-binary tmux E2E (all observed with the shipped dist)

# Behavior Evidence
1 Startup fail-open ordering daemon listening on …:57446 → worker GET /capabilities (13:30:39.314) → [Channel] "my-plugin-test" connected (13:30:39.409)
2 stdio pipe → worker logs forwarded to daemon.log channel worker stdout: [Channel] Connecting/connected (INFO) and channel worker stderr: … DeprecationWarning (WARN) land in daemon.log, not raw stdout
3 Out-of-process isolation (3 PIDs) children of serve 66112: --acp child 66193 + channel daemon-worker child 66194
4 Worker → platform worker holds ESTABLISHED 127.0.0.1:57450 -> 127.0.0.1:9201 (live WS to mock server)
5 Pidfile ownership {owner:"serve", pid:66112, servePid:66112, workerPid:66194, channels:["my-plugin-test"]}
6 channel status surface unchanged managed by qwen serve (PID 66112) + Worker PID: 66194 + uptime
7 Heartbeat auto-populated /daemon/status runtime.channelWorker.lastHeartbeatAt advances on the worker's 15s IPC heartbeat; healthy worker ⇒ status:ok, issues:[] (no warning)
8 Crash resilience + restart kill -9 worker ⇒ daemon survives; new worker PID 75243; restartCount 0→1; pidfile keeps owner:serve but clears workerPid for ~1s then restores it; lastExitAt → lastRestartAt gap = 1002 ms (delaysMs[0])
9 Escalating restart delays restartCount 1→2→3 with delays ≈ 1s → 5s → 15s
10 Restart budget exhaustion → ESCALATION (new) 4th kill -9state:failed, restartCount:3, nextRestartAt:none, error:"Channel worker restart budget exhausted."; /daemon/status rolls up to status:error with issue severity:error (was warning before the review-feedback delta); daemon stays alive, no live worker; pidfile workerPid cleared; channel status omits the Worker PID: line
11 Stale-heartbeat detection (hung-but-alive worker) SIGSTOP the worker (IPC stays open, no exit event) ⇒ after ~45s supervisor sets staleHeartbeatAt, error:"Channel worker heartbeat timed out.", SIGKILLs the frozen worker and restarts it (new PID 13485) — the only code path that detects this hang
12 Secret redaction (compiled dist) fed env secrets / daemonToken / scheme://user:pass@host / a zero-width-split token through the shipped supervisor → all emitted as <redacted>, zero plaintext leaked
13 Graceful shutdown SIGINT ⇒ daemon + live worker both gone in ~0.5s, no orphan daemon-worker, pidfile removed (verified for both live-worker and terminal-failure states)

Verdict

The worker lifecycle is observable and recoverable end-to-end: bounded restart with escalating backoff, stale-heartbeat kill/restart, redacted log forwarding, additive /daemon/status fields, and the new permanent-failure error escalation all behave exactly as described — while the daemon process itself never crashes and the public CLI surface is unchanged. Tests are non-vacuous (3/3 mutations load-bearing). No blocking issues found; LGTM to merge.

🇨🇳 中文版

✅ 本地真实二进制验证(tmux E2E)——可以合并

作为维护者,我在当前 PR head 构建了真实的 qwen 二进制,用 tmux 托管真实的 qwen serve --channel daemon,对接免凭据的 plugin-example channel + mock WebSocket server 做端到端验证。PR 描述里的每一条硬化声明都用真实进程、真实 IPC、真实信号、真实 daemon 日志复现了——不是 mock。

⚠️ 说明:分支自上一次验证(2dfc83bbd)以来又推进了 7 个提交8fe4b9c15,所以这是一次全新复验。review 反馈的增量给 PR 加了真实新行为(永久失败升级为 error、收紧的敏感环境变量正则、预编译脱敏器、有界的超长行尾丢弃、输入校验守卫、Unicode 属性不可见字符剥离),下面都重新核验过。

环境

Head 8fe4b9c15476f98e49066370fcd525828d855439
净 diff 15 个文件(packages/cli/**packages/channels/base/**、docs)
平台 macOS (Darwin 25.5)、Node v22.22.2
方法 worktree 构建真实 dist/index.js + tmux 托管 daemon(nohup)+ mock WS 9201 + plugin-example channel

1. 静态 + 单测 + 变异测试

检查 结果
tsc --build cli / core / channels-base ✅ 干净(dist 已产出)——唯一的构建报错是 vscode-ide-companion@types/vscode(我沙箱里没克隆它的嵌套 node_modules),与本 PR 无关(PR 未改任何 vscode 文件;真实 CI 跑完整 npm ci
git diff --check ✅ 干净
单测——6 个 cli PR 文件 226 通过
单测——channels/base sanitize.test.ts 31 通过
变异 A——绕过 createWorkerLogRedactor(返回原始行) forwards … secrets redacted(测试承重)
变异 B——canScheduleRestarttrue stops restarting after restart budget is exhausted
变异 C——daemon-status severity 恒 warning reports permanently failed … as errors

变异已还原,之后重跑套件重新变绿。

2. 真实二进制 tmux E2E(全部用发布 dist 观测)

# 行为 证据
1 启动顺序 fail-open daemon listening on …:57446 → worker GET /capabilities13:30:39.314)→ [Channel] "my-plugin-test" connected13:30:39.409
2 stdio 改 pipe → worker 日志转发到 daemon.log channel worker stdout: [Channel] Connecting/connected(INFO)、channel worker stderr: … DeprecationWarning(WARN)落到 daemon.log,不再是裸 stdout
3 进程外隔离(3 个 PID) serve 66112 的子进程:--acp 子进程 66193 + channel daemon-worker 子进程 66194
4 worker → 平台 worker 持有 ESTABLISHED 127.0.0.1:57450 -> 127.0.0.1:9201(连 mock server 的真实 WS)
5 pidfile 归属 {owner:"serve", pid:66112, servePid:66112, workerPid:66194, channels:["my-plugin-test"]}
6 channel status 命令面不变 managed by qwen serve (PID 66112) + Worker PID: 66194 + uptime
7 心跳自动填充 /daemon/statuslastHeartbeatAt 随 worker 15s IPC 心跳推进;健康 worker ⇒ status:ok, issues:[](无 warning)
8 崩溃恢复 + 重启 kill -9 worker ⇒ daemon 存活;新 worker PID 75243restartCount 0→1;pidfile 保留 owner:serveworkerPid 清空约 1s 后恢复lastExitAt → lastRestartAt 间隔 = 1002 msdelaysMs[0]
9 递增重启延迟 restartCount 1→2→3,延迟 ≈ 1s → 5s → 15s
10 重启预算耗尽 → 升级(新) 第 4 次 kill -9state:failedrestartCount:3nextRestartAt:noneerror:"Channel worker restart budget exhausted."/daemon/status 汇总为 status:error,issue severity:error(review 增量前是 warning);daemon 仍存活、无 live worker;pidfile workerPid 已清;channel status 不再打印 Worker PID:
11 心跳僵死检测(活着但卡死的 worker) SIGSTOP worker(IPC 不断、无 exit 事件)⇒ 约 45s 后 supervisor 记 staleHeartbeatAterror:"Channel worker heartbeat timed out."SIGKILL 冻结的 worker 并重启(新 PID 13485)——这是唯一能发现此类卡死的路径
12 密钥脱敏(编译 dist 把环境密钥 / daemonToken / scheme://user:pass@host / 一个零宽字符拆分的 token 喂给发布版 supervisor → 全部输出 <redacted>零明文泄漏
13 优雅关闭 SIGINT ⇒ daemon + live worker 都在 ~0.5s 内退出,无孤儿 daemon-worker,pidfile 被删(live-worker 和终态失败两种情况都验了)

结论

worker 生命周期端到端可观测、可恢复:有界重启 + 递增退避、心跳僵死 kill/重启、脱敏日志转发、/daemon/status additive 字段、以及新增的永久失败 error 升级,全部与描述一致;同时 daemon 进程本身从不崩溃、公开 CLI 面不变。测试非空过(3/3 变异承重)。未发现阻断性问题,LGTM 可合并。

restartTimer = undefined;
void launch('restart').catch((err: unknown) => {
handleRestartFailure(err instanceof Error ? err.message : String(err));
});

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 .catch handler calls handleRestartFailure without passing redaction options. The redaction variable is scoped to launch() and inaccessible here. If launch rejects during a restart (e.g., createWorkerEnv throws with env values in the error message), the error is sanitized (ANSI/control chars stripped) but worker env secrets are NOT redacted before being stored in snapshot.error and surfaced via /daemon/status or onExit.

Consider computing redaction at supervisor scope or reconstructing it in the catch:

Suggested change
});
void launch('restart').catch((err: unknown) => {
handleRestartFailure(
err instanceof Error ? err.message : String(err),
workerLogRedactionOptions(opts.daemonToken, process.env),
);
});

— qwen3.7-max via Qwen Code /review

lastHeartbeatAt: message.at ?? new Date().toISOString(),
};
armStaleHeartbeatTimer(startedChild);
};

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] isReadyMessage only checks message.type === 'ready' without validating that channels or requestedChannels are actually arrays. In completeReady, the code does [...message.channels] — if a buggy or compromised worker sends channels: { length: 5 } (non-iterable with .length > 0), the spread throws a TypeError. Since handleMessage has no try/catch wrapper, this uncaught exception would crash the entire daemon process.

Consider adding Array.isArray validation:

Suggested change
};
return (
typeof message === 'object' &&
message !== null &&
(message as { type?: unknown }).type === 'ready' &&
((message as { channels?: unknown }).channels === undefined ||
Array.isArray((message as { channels?: unknown }).channels))
);

— qwen3.7-max via Qwen Code /review

const redaction = workerLogRedactionOptions(opts.daemonToken, env);
const requestedChannels = requestedChannelNames(opts.selection);
const startedAt = new Date().toISOString();
snapshot = {

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.

[Nice to have] launch() replaces the entire snapshot with a manual whitelist of carried fields (restartCount, lastExitAt, lastHeartbeatAt, staleHeartbeatAt). Any future field added to ChannelWorkerSnapshot will silently vanish after the first restart unless it's also added here. Since all snapshot fields are optional, TypeScript won't flag a missing spread.

Consider using a delete-based approach instead (spread the previous snapshot, then delete fields that should be reset) to make the default behavior "carry forward" rather than "silently drop."

— qwen3.7-max via Qwen Code /review

return restartAttemptTimes.length < restartPolicy.maxRestarts;
};

const nextRestartDelayMs = (): number => {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Nice to have] nextRestartDelayMs() has an undocumented ordering dependency on pruneRestartAttempts() (called as a side effect inside canScheduleRestart()). It uses restartAttemptTimes.length as the index into delaysMs, which is only correct after pruning. A future refactor that reorders the calls in scheduleRestart — or moves the restartAttemptTimes.push() from launch('restart') into scheduleRestart — would silently corrupt the backoff schedule.

Consider passing the pruned count as an explicit parameter instead of reading the shared mutable array.

— qwen3.7-max via Qwen Code /review

}

function sensitiveEnvValues(env: NodeJS.ProcessEnv): string[] {
const sensitiveKey =

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.

[Nice to have] sensitiveEnvValues scans the full inherited process.env with a broad key pattern. Common env vars like SESSION_SECRET=true, AUTH_TOKEN=none, or API_KEY=1234 (length >= 4) become global substring redaction patterns applied to ALL worker log output. A worker logging "tls verification: true" would produce "tls verification: <redacted>" if any matching env var has value "true".

The minimum length filter (>= 4) catches "true", "none", "1234". Consider either raising the minimum length threshold, scoping the scan to daemon-controlled env vars only (rather than the full inherited process.env), or requiring the value to be non-dictionary-word-like.

— qwen3.7-max via Qwen Code /review

doudouOUC added a commit that referenced this pull request Jul 2, 2026
…v secrets

Two fixes for unresolved review threads from #6098:

- Heartbeat: use daemon's own `new Date().toISOString()` instead of
  reflecting the worker-supplied `message.at` value. Prevents a
  compromised adapter from injecting arbitrary data into `/daemon/status`.

- PEM multiline: split multi-line sensitive env values (e.g. PEM keys)
  into per-line redaction patterns so individual logged lines match.
  The full value is kept as a pattern too for single-line matches.
yiliang114 added a commit that referenced this pull request Jul 2, 2026
* feat(cli): add credential redaction for worker stderr forwarding

Add a `redactLogCredentials` function that strips credentials from
worker log lines before they reach the daemon's stderr and log file.
Covers Bearer/QQBot tokens, Authorization headers, common API key
prefixes, env-var secret assignments, URL-embedded credentials, JSON
secret fields, and platform-specific headers (DingTalk).

Integrate the redaction into both stderr forwarding paths:

- ACP children: `createStderrForwarder` now applies redaction in both
  the normal flush and 64 KiB forced-truncation code paths.

- Daemon channel worker: change supervisor stdio from `'inherit'` to
  `'pipe'` for stderr, add a line-buffered forwarder with redaction,
  64 KiB buffer cap, and try-catch to prevent daemon crashes. Wire
  `onDiagnosticLine` so worker stderr also reaches the daemon log file
  (previously it only went to the daemon's terminal).

Issue: #5976 (V1.5 follow-up)

* fix(cli): align redaction marker and bound URL scheme length

- Change redaction marker from ***REDACTED*** to <redacted> to match
  the supervisor's existing convention and avoid double-redaction output
  mismatches in tests.

- Bound URL credential regex scheme to {0,31} chars (matching the
  supervisor's pattern) to prevent O(n²) backtracking on long strings
  of scheme-like characters.

* fix(cli): use daemon-local heartbeat timestamp and split multiline env secrets

Two fixes for unresolved review threads from #6098:

- Heartbeat: use daemon's own `new Date().toISOString()` instead of
  reflecting the worker-supplied `message.at` value. Prevents a
  compromised adapter from injecting arbitrary data into `/daemon/status`.

- PEM multiline: split multi-line sensitive env values (e.g. PEM keys)
  into per-line redaction patterns so individual logged lines match.
  The full value is kept as a pattern too for single-line matches.

* fix(cli): address review feedback on credential redaction

- Fix sensitiveEnvValues: change `lines.length > 1` to `> 0` so single
  matching lines from multi-line env values are also added as patterns.

- Add hyphens to sk- charset for compound prefixes (sk-proj-, sk-ant-).

- Add github_pat_ (fine-grained PATs) and ghu_ (app user tokens).

- Add ASIA prefix for AWS STS temporary credentials alongside AKIA.

- Update Authorization catch-all comment to accurately describe the
  2-token limitation.

* fix(cli): add heartbeat rationale comment

Add comment explaining why heartbeat uses daemon clock instead of
worker-supplied message.at (security: compromised adapter injection).

* test(acp-bridge): add onEnd redaction test and fix lint

Add test verifying credential redaction on partial lines flushed via
forwarder.onEnd(). Suppress pre-existing vitest/no-conditional-expect
lint errors in getAcpMemoryArgs tests (system-dependent heapArg).

* test(acp-bridge): add onEnd redaction test and revert spawnChannel lint

Move the onEnd credential redaction test to logRedaction.test.ts to
avoid triggering pre-existing vitest/no-conditional-expect lint errors
in spawnChannel.test.ts. Revert the spawnChannel test file to its
upstream state.

* fix(test): remove unused eslint-disable directives

vitest/no-conditional-expect is not enabled in this repo's eslint
config. The directives cause CI failure via reportUnusedDisableDirectives
warn + --max-warnings 0.

---------

Co-authored-by: Shaojin Wen <shaojin.wensj@alibaba-inc.com>
Co-authored-by: 易良 <1204183885@qq.com>
@doudouOUC

Copy link
Copy Markdown
Collaborator Author

Post-merge comprehensive review

Reviewed the merged state at 487fb45510. Overall this is solid, well-tested operational hardening — the restart supervision, heartbeat/stale detection, redacted log forwarding, and additive /daemon/status fields are well-structured, and the concurrency paths (restart budget, escalating backoff, bounded SIGTERMSIGKILL termination, and the stale-heartbeat backstop) have meaningful test coverage.

The earlier Critical findings were all genuinely fixed before merge: bounded URL scheme regex against ReDoS, greedy userinfo @ handling so partial passwords no longer leak, normalizeWorkerLogLineForRedaction running before redaction (invisible-char bypass), sanitizeWorkerError actually redacting, start() resetting the restart budget, and keeping a reference to the restart child through the bounded termination flow.

Findings present at merge — since resolved by #6146

Recording these for traceability; all three were unresolved redaction/trust threads from this PR that #6146 closed:

  1. Runtime-acquired credentials were not redacted. redactWorkerLogLine only stripped values of secret-named process.env vars plus URL userinfo. Bearer tokens, Authorization: headers, API-key prefixes, and JSON secret fields acquired at runtime (not in env) reached the daemon log and /daemon/status unredacted. feat(cli): add credential redaction for worker stderr forwarding #6146 adds redactLogCredentials() for these patterns.
  2. Multi-line env secrets bypassed redaction. sensitiveEnvValues returned full env values including embedded newlines, but stream lines are split on \r?\n before redaction, so a newline-containing pattern could never match a single log line — e.g. a PEM PRIVATE_KEY would leak line-by-line. feat(cli): add credential redaction for worker stderr forwarding #6146 also emits per-line fragments (≥4 chars) as patterns.
  3. lastHeartbeatAt trusted the worker-supplied message.at. A compromised or buggy adapter could inject arbitrary text into /daemon/status. feat(cli): add credential redaction for worker stderr forwarding #6146 switches to the daemon's own clock.

Minor items still present on main (non-blocking, optional cleanup)

  • start() resets restartAttemptTimes but not restartCount, so a stop()start() cycle carries the old count into an otherwise fresh run (negligible in practice since start() runs once per supervisor).
  • sanitizeWorkerError double-truncates: Array.from(sanitizeLogText(x, 512)).slice(0, 512) — the slice is redundant since sanitizeLogText already caps to 512 code points.
  • Oversized-line handling: after the 64 KiB tail-discard window resets mid-line, a later fragment of the same logical line can be emitted as a standalone line, and the "drop its tail until the next newline" comment slightly overstates the actual behavior.
  • Scope: broadening PROMPT_UNSAFE_INVISIBLES to \p{Cf} + \p{Variation_Selector} in sanitize.ts affects every consumer (ChannelBase prompt sanitization, memory-intent matching), e.g. it strips emoji Variation Selector-16 from prompt/memory text — wider than the worker-log scope, though low-risk and covered by tests.

Nice work overall — main is in good shape after #6146.

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.

6 participants