Skip to content

fix(external-context): read the response body with a reader, not for-await - #8764

Merged
wenshao merged 5 commits into
mainfrom
fix/external-context-stream-read
Aug 9, 2026
Merged

fix(external-context): read the response body with a reader, not for-await#8764
wenshao merged 5 commits into
mainfrom
fix/external-context-stream-read

Conversation

@wenshao

@wenshao wenshao commented Aug 8, 2026

Copy link
Copy Markdown
Collaborator

What this PR does

Rewrites readBoundedBody's loop from for await (const chunk of response.body) to an explicit getReader() loop, and adds the behavioral tests the file never had. Behavior is unchanged.

Why it's needed

Async-iterating a ReadableStream needs [Symbol.asyncIterator] on the type, and whether it is there depends on which lib set the program resolves — @types/node's stream has it, the DOM lib's needs lib.dom.asynciterable. That resolution flipped underneath this file on 2026-08-08:

  1. fix(integration-tests): make the project typecheckable and fix what that found #8693 installed @types/jsdom at the root. vitest's types pull the jsdom types in wherever they exist, and jsdom's carry /// <reference lib="dom" />.
  2. fix(integration-tests): make the project typecheckable and fix what that found #8693 shipped this package's tsconfig types: ["node"] guard in the same commit, so main stayed green.
  3. But in the autofix verification build, the tsconfig guard travels with the branch while node_modules travel with the trusted base — so every managed branch behind fix(integration-tests): make the project typecheckable and fix what that found #8693 built branch sources against post-fix(integration-tests): make the project typecheckable and fix what that found #8693 dependencies and failed:
src/http-client.ts(124,29): error TS2504: Type 'ReadableStream<Uint8Array<ArrayBufferLike>>'
must have a '[Symbol.asyncIterator]()' method that returns an async iterator.

Measured cost on one run (31276008548): the #8614 leg had 63 minutes of accepted agent work discarded, plus 18 minutes burned by a repair step that cannot fix a failure outside the PR's diff — that PR reached attempt 13 this way, and the #8616 leg died identically. Every autofix round on every stale branch pays this until the branch merges main.

The reader API types identically in every lib set, so after this change the build depends on neither the guard nor the environment's lib resolution. The guard stays — belt and suspenders.

Reviewer Test Plan

How to verify

npm -w integrations/external-context run build
npm -w integrations/external-context run typecheck
npx vitest run --config integrations/external-context/vitest.config.ts

Expected: build/typecheck clean, 170/170 (10 files; 4 new in http-client.test.ts).

To reproduce the incident locally (both directions):

npm install --no-save @types/jsdom@^28.0.3
# remove the `"types": ["node"]` line from integrations/external-context/tsconfig.json
npm run build -w integrations/external-context   # on main: the exact TS2504, character for character
                                                 # with this PR: clean

Evidence (Before & After)

Before is the gate error above, reproduced locally character for character with the poisoned setup (jsdom installed + guard removed). After is the same setup building clean — the fix is provably independent of the guard.

New tests pin what the rewrite must preserve:

  • multi-chunk assembly and JSON parse
  • the exact MAX_RESPONSE_BYTES boundary (bound is strictly-greater)
  • invalid-UTF-8 rejection
  • stream cancellation on early exitfor await did this implicitly via iterator return(); the reader loop must do it explicitly, and the test drives an endless producer so a dropped cancel cannot hide. Mutation-tested: removing the cancel fails exactly that test.

Tested on

OS Status
🍏 macOS N/A
🪟 Windows N/A
🐧 Linux

Risk & Scope

  • Main risk or tradeoff: none intended — same bounds, same errors, same cancellation semantics, now pinned by tests. The value === undefined guard inside the loop is defensive against older non-discriminated ReadableStreamReadResult typings; at runtime a non-done read always carries a value.
  • Not validated / out of scope: the package's other for awaits iterate process.stdin (a Node stream, async-iterable in every lib set) and are untouched. packages/sdk-typescript/src/daemon/DaemonClient.ts has the same pattern over a fetch body in a different program; it builds today and is left alone, noted here so the class is on record. The structural half — the verification gate charging pre-existing/base-skew failures to the PR and burning an 18-minute repair on them — is the follow-up, not this PR.
  • Breaking changes / migration notes: none.

Linked Issues

Diagnosed from the discarded autofix round on #8614 (comment).

中文说明

What this PR does

readBoundedBody 的循环从 for await (const chunk of response.body) 改写为显式的 getReader() 循环,并补上该文件此前从未有过的行为测试。行为不变。

Why it's needed

ReadableStream 做 async 迭代需要类型上存在 [Symbol.asyncIterator],而它是否存在取决于程序解析到哪套 lib——@types/node 的流类型有,DOM lib 的需要 lib.dom.asynciterable。2026-08-08 这个解析在此文件脚下翻转了:

  1. fix(integration-tests): make the project typecheckable and fix what that found #8693 在 root 装入 @types/jsdom。vitest 的类型只要发现 jsdom 类型就会引入,而后者携带 /// <reference lib="dom" />
  2. fix(integration-tests): make the project typecheckable and fix what that found #8693 在同一个 commit 里给本包的 tsconfig 加了 types: ["node"] 防护,所以 main 保持绿色。
  3. 但在 autofix 的验证构建里,tsconfig 防护跟着分支走,node_modules 却跟着可信 base 走——于是所有落后于 fix(integration-tests): make the project typecheckable and fix what that found #8693 的受管分支都在用 fix(integration-tests): make the project typecheckable and fix what that found #8693 之后的依赖构建分支源码,必然失败:
src/http-client.ts(124,29): error TS2504: Type 'ReadableStream<Uint8Array<ArrayBufferLike>>'
must have a '[Symbol.asyncIterator]()' method that returns an async iterator.

单个 run 的实测代价(31276008548):#8614 那条 leg 63 分钟已通过的 agent 工作被整体丢弃,外加修复步白烧 18 分钟去修一个不在 PR diff 内的失败——该 PR 就这样走到了第 13 轮,#8616 的 leg 死法一模一样。每个落后分支的每一轮 autofix 都在付这笔账,直到它合并 main 为止。

reader API 在任何 lib 集合下类型都一致,因此本改动之后,构建既不依赖那个防护,也不依赖环境的 lib 解析。防护保留——belt and suspenders。

Reviewer Test Plan

How to verify

npm -w integrations/external-context run build
npm -w integrations/external-context run typecheck
npx vitest run --config integrations/external-context/vitest.config.ts

预期:build/typecheck 干净,170/170(10 个文件;http-client.test.ts 新增 4 条)。

本地双向复现事故:

npm install --no-save @types/jsdom@^28.0.3
# 从 integrations/external-context/tsconfig.json 删去 `"types": ["node"]` 一行
npm run build -w integrations/external-context   # 在 main 上:逐字符复现那个 TS2504
                                                 # 带上本 PR:构建干净

Evidence (Before & After)

Before 即上面 gate 的报错,已用中毒组合(装 jsdom + 去防护)在本地逐字符复现。After 是同一组合下构建干净——证明修复不依赖防护而独立成立。

新测试钉住改写必须保持的行为:

  • 多 chunk 组装与 JSON 解析
  • MAX_RESPONSE_BYTES 的精确边界(判定为严格大于)
  • 非法 UTF-8 拒绝
  • 提前退出时取消流——for await 经由迭代器 return() 隐式做到;reader 循环必须显式做,测试用无限生产者驱动,漏掉 cancel 无处可藏。已做变异验证:删去 cancel 恰好挂掉这一条。

Tested on

OS Status
🍏 macOS N/A
🪟 Windows N/A
🐧 Linux

Risk & Scope

  • 主要风险与取舍: 无意图内变化——同样的边界、同样的错误、同样的取消语义,且现在有测试钉住。循环内的 value === undefined 防御针对旧版非区分联合的 ReadableStreamReadResult 类型;运行时非 done 的读取必有 value。
  • 未验证 / 范围之外: 包内其余 for await 迭代的是 process.stdin(Node 流,任何 lib 集合下都可异步迭代),未改动。packages/sdk-typescript/src/daemon/DaemonClient.ts 在另一个程序里有同模式的 fetch body 迭代;它目前构建正常,暂不改动,在此记录以备同类问题。结构性的另一半——验证门把预先存在/base 偏斜的失败记在 PR 头上并为其烧 18 分钟修复——是后续工作,不在本 PR。
  • 破坏性变更 / 迁移说明: 无。

Linked Issues

#8614 被丢弃的 autofix 轮次(评论)诊断而来。

…await

Async-iterating a ReadableStream needs [Symbol.asyncIterator] on the
TYPE, and whether it is there depends on which lib set the program
resolves — @types/node's stream has it, the DOM lib's needs
lib.dom.asynciterable. That resolution flipped underneath this file on
2026-08-08: #8693 installed @types/jsdom at the root, vitest's types
pull the jsdom types in wherever they exist, and jsdom's carry
/// <reference lib="dom" />. #8693 shipped the tsconfig `types` guard in
the same commit, so main stayed green — but the guard travels with the
BRANCH while node_modules travel with the TRUSTED BASE in the autofix
verification build, so every managed branch behind #8693 failed that
build with TS2504 on this line. Two legs measured on run 31276008548:
63 minutes of accepted agent work discarded per round, 18 more minutes
burned by a repair step that cannot fix a failure outside the PR's diff
(#8614 reached attempt 13 that way; #8616 died identically).

Reproduced locally in both directions before changing anything:
@types/jsdom installed + guard removed = the gate's exact error,
character for character; with the reader loop the same poisoned setup
builds clean. The guard stays — belt and suspenders — but the build no
longer depends on it, or on which lib set any future environment
resolves.

Behavior is unchanged and now pinned by tests the file never had:
multi-chunk assembly, the exact MAX_RESPONSE_BYTES boundary (bound is
strictly-greater), invalid-UTF-8 rejection, and the easy one to drop in
this rewrite — cancelling the stream on early exit, which `for await`
did implicitly via iterator return(). Mutation-tested: removing the
cancel fails exactly that test against an endless producer.

The package's other for-awaits iterate process.stdin (a Node stream,
async-iterable in every lib set) and are untouched.
@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 8, 2026

Copy link
Copy Markdown
Collaborator

🚫 Qwen Triage was cancelledview run. The run was cancelled before finishing. Check for a newer run before re-running.

🚫 Qwen Triage 已取消 —— 查看运行。运行未完成即被取消。重跑前请先确认是否有更新的运行。

@wenshao

wenshao commented Aug 8, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /takeover

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

Copy link
Copy Markdown
Collaborator

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

中文说明

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

@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 8, 2026

Copy link
Copy Markdown
Collaborator

Re-run on head 4c7bad35 (previously reviewed ba5dbade). The gate still passes, and the one claim that used to sit outside CI's reach is now inside it.

Template looks good ✓

Problem: observed, not theoretical — the TS2504 failure in the autofix verification build is documented with a real run and real discarded agent work, and earlier passes re-verified the poisoned setup on main (jsdom types installed at root, guard in the branch tsconfig, for await in the source). This head goes one step further: by dropping the types: ["node"] guard, every future CI build of this package compiles under exactly the lib resolution that used to break it — the claim is now continuously proven, not just argued.

Direction: aligned — internal build reliability for the autofix loop, nothing user-visible, nothing near auth/sandbox/model selection/public contract.

Size: not applicable — no core paths (integrations/external-context/**); Stage 0 does not apply. 41 production lines (+35/-6 in http-client.ts, plus a 9-line tsconfig deletion) and 212 test lines.

Approach: scope remains right, and the new commit completes the fix rather than bloating it. The guard existed only to protect the for await the rewrite removed — deleting it eliminates the dependency instead of carrying a crutch, and a future regression to the same pattern would now fail loudly in CI instead of being silently masked. The test's private copy of the byte budget is replaced by importing the real (now exported) constant, so the boundary test can't drift from it. One non-blocking hygiene note: the PR description still says "The guard stays — belt and suspenders", which the final commit intentionally reverses; the diff and commit message are correct, the body is stale.

Risk: no high-risk paths matched; no elevated risk signals.

Moving on to code review. 🔍

中文说明

在新 head 4c7bad35 上重跑(此前审查的是 ba5dbade)。gate 仍然通过,且此前 CI 覆盖不到的主张现在已纳入 CI 覆盖。

模板完整 ✓

问题:已观测到,不是理论问题——autofix 验证构建的 TS2504 失败有真实 run 与被丢弃的 agent 工时为证,此前几轮也已在 main 上复核过中毒组合(root 装有 jsdom 类型、分支 tsconfig 带防护、源码是 for await)。本 head 更进一步:移除 types: ["node"] 防护后,该包今后的每次 CI 构建都恰好运行在曾经出事的 lib 解析下——该主张从"论证成立"变为"持续证明"。

方向:对齐——autofix 循环的内部构建可靠性,无用户可见行为,不涉及 auth/sandbox/模型选择/公共契约。

规模:不适用——未触及核心路径(integrations/external-context/**),Stage 0 不适用。41 行生产代码(http-client.ts +35/-6,另有 tsconfig 删 9 行),212 行测试。

方案:范围仍然合理,新 commit 是收尾而非膨胀。防护只为保护被改写删掉的 for await 而存在——删掉它消除的是依赖本身,未来任何退回同一模式的回归会在 CI 里大声失败,而不是被悄悄掩护。测试里私有复制的字节上限改为导入真实(现已导出的)常量,边界测试从此不会与它漂移。一条不阻塞的卫生提示:PR 描述仍写着"防护保留——双保险",与最终 commit 的有意移除相反;diff 与 commit message 是对的,描述过时了。

风险:未命中高风险路径;无升级风险信号。

进入代码审查 🔍

Qwen Code · qwen3.8-max

Reviewed at 4c7bad3551e45d9bb33412b21c6ffdc01a666311 · re-run with @qwen-code /triage

@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 8, 2026

Copy link
Copy Markdown
Collaborator

Code review

Re-run on 4c7bad35. The reader-loop logic is unchanged from ba5dbade — the head the sandboxed @qwen-code /verify A/B passed with 224/224 assertions and a merge-ready verdict — and the delta since is the guard removal plus two hygiene adjustments. Re-checked against the head source:

  • Equivalence with for await still holds on every path. A null body is rejected before getReader(); the finished flag keeps fully-drained streams uncancelled; both early-exit paths (the oversize throw, a rejecting read()) land in the finally, await the cancel, then release the lock. Awaiting cancel() on an errored stream is safe — that promise rejects with the stored error, .catch(() => undefined) swallows it, and the original error propagates.
  • The delta is completion, not new risk. Dropping types: ["node"] removes a crutch the rewrite made obsolete — the guard protected exactly the for await that no longer exists. The test now imports MAX_RESPONSE_BYTES instead of privately redefining 1024 * 1024, so the boundary test is pinned to the real constant. The comment rewording tracks the guard removal. No logic changes.
  • The six tests remain the right net — strictly-greater boundary, drained-stream-not-cancelled, endless-producer oversize cancel, the deferred-cancel ordering barrier, mid-stream read failure with lock release, fatal UTF-8. The /verify mutation evidence still applies: each guard is killed by its designed test, and the behavioral tests pass on the base for await implementation too, which is exactly what behavior-preservation tests should do.
  • Non-blocking, pre-existing (noted by /verify, not introduced here): cancelResponseBody on the 3xx / non-ok / declared-over-size paths is still fire-and-forget. Worth a follow-up if exact teardown parity matters there too.

No blockers.

Test evidence — the PR's own CI (unattended run; no PR code executed here)

CI is fully green on 4c7bad35, and this head closes the last evidence gap on its own: with the guard deleted from the branch tsconfig, the Test job now compiles this package under the root's "types": ["node", "vitest/globals"] — i.e. with @types/jsdom dragging lib.dom into the program, the exact poisoned combination. The job log reports @qwen-code/external-context test:ci: Test Files 10 passed (10) / Tests 172 passed (172), including the six http-client.test.ts tests. The earlier gap ("CI always builds with the guard on, so it can't exercise the guardless claim") no longer exists — what CI could not prove at ba5dbade is precisely what this head's green build demonstrates. The sandboxed /verify A/B already covered the same claim at the previous head (poisoned setup reproduces TS2504 on base, builds clean on head), so nothing unsubstantiated remains and no further lane is named. macOS/Windows/integration checks are skipped by design (merge-queue-only jobs).

Check Conclusion
Test (ubuntu-latest, Node 22.x) ✅ success
Desktop Shell (ubuntu-22.04) ✅ success
Desktop Shell (windows-2022) ✅ success
web-shell E2E Smoke (ubuntu-latest, Node 22.x) ✅ success
Classify PR ✅ success
Post Coverage Comment (ubuntu-latest, 22.x) ✅ success
route ✅ success
label ✅ success
中文说明

4c7bad35 上重跑。reader 循环逻辑与 ba5dbade 一致——那是沙箱 @qwen-code /verify A/B 以 224/224 断言、merge-ready 判定通过的 head——此后的增量就是移除防护外加两处卫生调整。对照 head 源码复核:

  • for await 的等价性在各路径上仍成立。 空 body 在 getReader() 之前被拒绝;finished 标志保证读完的流不被 cancel;两条提前退出路径(超限 throw、read() reject)都进入 finally,await cancel 后释放锁。对已出错的流 await cancel() 是安全的——该 promise 以储存的错误 reject,被 .catch(() => undefined) 吞掉,原错误照常传播。
  • 增量是收尾,不是新风险。 移除 types: ["node"] 删掉的是改写已使其过时的拐杖——防护保护的正是那行不复存在的 for await。测试改为导入 MAX_RESPONSE_BYTES 而非私有复制 1024 * 1024,边界测试从此锚定真实常量。注释改写与防护移除保持一致。无逻辑变化。
  • 六条测试仍是正确的网——严格大于边界、读完不 cancel、无限生产者的超限 cancel、延迟取消的时序屏障、流中读取失败且锁被释放、fatal UTF-8。/verify 的变异证据仍然适用:每个关键守卫都被其设计的测试杀死;行为测试在 base 的 for await 实现上同样通过——这正是行为保持类测试该有的性质。
  • 不阻塞、预存在(/verify 记录、非本 PR 引入):3xx / 非 ok / 声明超长路径上的 cancelResponseBody 仍是 fire-and-forget。若那里也需要严格的清理等价,值得后续跟进。

无阻塞项。

测试证据来自 PR 自己的 CI(无人值守运行;此处未执行任何 PR 代码)。4c7bad35 上 CI 全绿,且本 head 自行关闭了最后一个证据缺口:防护已从分支 tsconfig 删除,Test job 现在是在根 tsconfig 的 "types": ["node", "vitest/globals"] 下编译该包——即 @types/jsdom 把 lib.dom 拖进程序的中毒组合。job 日志报告 @qwen-code/external-context test:ciTest Files 10 passed (10) / Tests 172 passed (172),含六条 http-client.test.ts 测试。此前的缺口("CI 总是带着防护构建,无法覆盖无防护主张")已不复存在——ba5dbade 上 CI 无法证明的,恰是本 head 绿色构建所证明的内容。沙箱 /verify A/B 已在上一 head 覆盖同一主张(中毒组合在 base 上复现 TS2504、在 head 上构建干净),不再有未证实的主张,因此不再点名新的通道。macOS/Windows/集成检查 skipped 为既定设计(仅 merge queue 运行)。

Qwen Code · qwen3.8-max

Reviewed at 4c7bad3551e45d9bb33412b21c6ffdc01a666311 · re-run with @qwen-code /triage

@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 8, 2026

Copy link
Copy Markdown
Collaborator

Confidence: 5/5 — minimal fix, proven on every axis: behavior pinned by six tests and a mutation-tested A/B that already passed, and the build-independence claim now demonstrated by this head's own green CI rather than argued.

Stepping back on the re-run: this landed where I'd want it. The independent baseline for this problem — make the file compile regardless of which lib set resolves ReadableStream[Symbol.asyncIterator] — is exactly the reader-loop rewrite, and the PR carried it through to its logical end: once the rewrite removed the fragile construct, the tsconfig guard protecting it became dead weight, so the final commit deletes it. That is the better version of this fix; keeping the guard would have silently masked any future regression to the same pattern, whereas now it fails loudly in CI. Everything I checked on the way holds: null-body guard intact, drained streams not cancelled, early exits await teardown before the error propagates, boundary strictly-greater, reader lock released on mid-read failure. The prior red CI was an unrelated packages/core timeout flake; this head is fully green — package suite 172/172 including the six new tests, compiled without the guard under the exact poisoned lib combination. The only blemish is cosmetic: the description still says "The guard stays — belt and suspenders" while the final commit removes it; the code is right, the body is stale. Approving, pinned to the reviewed commit. ✅

中文说明

重跑后回顾:这个 PR 落到了我希望的位置。此问题的独立基线方案——让文件无论哪套 lib 解析 ReadableStream[Symbol.asyncIterator] 都能编译——正是 reader 循环改写,而 PR 把它走到了逻辑终点:改写删掉脆弱构造之后,保护它的 tsconfig 防护就成了死重,最终 commit 将其删除。这是该修复的更好的版本;若保留防护,未来任何退回同一模式的回归都会被悄悄掩护,而现在它会在 CI 里大声失败。一路上核实过的点都成立:空 body 防护完好、读完的流不被 cancel、提前退出在错误传播前 await 清理、边界严格大于、流中读取失败时 reader 锁被释放。此前的红 CI 是与本 PR 无关的 packages/core 超时 flake;本 head 全绿——包套件 172/172 含六条新测试,且是在移除防护后、恰好的中毒 lib 组合下编译通过的。唯一的瑕疵是表面性的:描述仍写着"防护保留——双保险",而最终 commit 已将其移除;代码是对的,描述过时了。批准,锚定到被审查的 commit。✅

Qwen Code · qwen3.8-max

Reviewed at 4c7bad3551e45d9bb33412b21c6ffdc01a666311 · re-run with @qwen-code /triage

@github-actions

github-actions Bot commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 83.72% 83.72% 89.74% 82.9%
Core 87.83% 87.83% 89.37% 86.37%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   83.72 |     82.9 |   89.74 |   83.72 |                   
 src               |   84.96 |    81.27 |   88.49 |   84.96 |                   
  cli.ts           |   95.68 |    84.11 |     100 |   95.68 | ...60-561,565-566 
  gemini.tsx       |    72.8 |    77.39 |   80.76 |    72.8 | ...1299-1303,1424 
  ...ractiveCli.ts |   86.72 |    81.12 |   88.13 |   86.72 | ...2952,2958,3023 
  ...liCommands.ts |   89.33 |     85.6 |      90 |   89.33 | ...01,518,552,674 
  ...ActiveAuth.ts |     100 |     87.5 |     100 |     100 | 66-80             
 ...cp-integration |   70.64 |    73.08 |   90.25 |   70.64 |                   
  acpAgent.ts      |   70.11 |     72.9 |   90.07 |   70.11 | ...28,12033-12035 
  ...k-reporter.ts |     100 |    80.95 |     100 |     100 | 77,80,115,135     
  authMethods.ts   |      92 |       60 |     100 |      92 | 33-34             
  errorCodes.ts    |       0 |        0 |       0 |       0 | 1-22              
  ...ion-skills.ts |     100 |    88.23 |     100 |     100 | 17,32             
  generation.ts    |    97.1 |    81.25 |     100 |    97.1 | 109,112           
  ...DirContext.ts |     100 |      100 |     100 |     100 |                   
 ...ration/service |   97.04 |    95.71 |   93.33 |   97.04 |                   
  filesystem.ts    |   97.04 |    95.71 |   93.33 |   97.04 | ...21-122,242-243 
 ...ration/session |   91.21 |    86.57 |   96.61 |   91.21 |                   
  Session.ts       |   90.34 |    84.99 |   95.89 |   90.34 | ...39,10466-10470 
  ...entTracker.ts |    96.8 |    89.36 |      90 |    96.8 | 137-143,221       
  ...projection.ts |   98.57 |    93.29 |     100 |   98.57 | ...76,333,344,356 
  ...stop-guard.ts |     100 |    98.07 |     100 |     100 | 37,127            
  ...eplay-page.ts |   93.44 |    91.66 |     100 |   93.44 | 74,85-88,115-125  
  ...y-replayer.ts |   98.54 |    95.65 |     100 |   98.54 | 241-243           
  index.ts         |       0 |        0 |       0 |       0 | 1-40              
  ...ssionUtils.ts |   89.76 |    87.32 |     100 |   89.76 | ...54-270,326-328 
  tasksSnapshot.ts |    94.3 |     87.5 |     100 |    94.3 | 65-71             
  ...on-tracker.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...ssion/emitters |   96.01 |    94.15 |   96.66 |   96.01 |                   
  ...ageEmitter.ts |   95.95 |       96 |     100 |   95.95 | 52-59             
  PlanEmitter.ts   |     100 |       90 |     100 |     100 | 66                
  base-emitter.ts  |   78.26 |       75 |     100 |   78.26 | 23-24,26-28       
  index.ts         |       0 |        0 |       0 |       0 | 1-10              
  ...ll-emitter.ts |   99.18 |    96.47 |     100 |   99.18 | 355-356           
 ...ession/rewrite |    91.8 |    89.13 |   94.44 |    91.8 |                   
  LlmRewriter.ts   |    82.4 |     86.2 |     100 |    82.4 | ...,88-89,166-170 
  ...Middleware.ts |   96.96 |    88.09 |     100 |   96.96 | 144,152-154       
  TurnBuffer.ts    |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 src/agent-view    |   89.03 |    81.34 |   89.09 |   89.03 |                   
  ...t-cli-argv.ts |     100 |      100 |     100 |     100 |                   
  protocol.ts      |     100 |      100 |     100 |     100 |                   
  ...sor-client.ts |   80.38 |    72.54 |   76.66 |   80.38 | ...22-626,652-656 
  ...or-process.ts |   96.61 |    89.47 |   84.61 |   96.61 | 129-130,150-151   
  ...sor-runner.ts |    84.9 |     75.3 |      85 |    84.9 | ...44,468,471-481 
  ...sor-server.ts |   85.71 |    83.06 |   95.45 |   85.71 | ...67-468,471-488 
  ...isor-store.ts |   97.73 |    81.16 |     100 |   97.73 | ...92,594,607,643 
  ...nal-bridge.ts |   93.98 |     91.3 |   83.33 |   93.98 | 228-238           
 src/commands      |   89.65 |    72.18 |   64.51 |   89.65 |                   
  auth.ts          |     100 |    83.33 |     100 |     100 | 11,14             
  channel.ts       |   55.55 |      100 |       0 |   55.55 | 18-22,30-40       
  extensions.tsx   |   96.77 |      100 |      50 |   96.77 | 39                
  hooks.tsx        |   66.66 |      100 |       0 |   66.66 | 20-24             
  mcp.ts           |   95.45 |      100 |      50 |   95.45 | 31                
  review.ts        |   98.66 |      100 |      50 |   98.66 | 86                
  serve.ts         |   87.68 |    66.66 |     100 |   87.68 | ...31,743,759-763 
  sessions.ts      |     100 |      100 |      50 |     100 |                   
  update.ts        |   98.13 |    94.44 |   66.66 |   98.13 | 82-83             
 ...mmands/channel |   88.91 |    88.49 |   90.54 |   88.91 |                   
  channel-cwd.ts   |     100 |      100 |     100 |     100 |                   
  ...l-registry.ts |   95.21 |    96.73 |   88.88 |   95.21 | ...18-221,266-269 
  ...entry-path.ts |      75 |       50 |     100 |      75 | 8-9               
  config-utils.ts  |   95.87 |    96.35 |     100 |   95.87 | ...08-213,271-274 
  configure.ts     |    14.7 |      100 |       0 |    14.7 | 18-21,23-84       
  daemon-worker.ts |   93.96 |    85.39 |   94.23 |   93.96 | ...1229,1236-1237 
  loop-runtime.ts  |   91.66 |      100 |      50 |   91.66 | 15,22             
  ...classifier.ts |   98.49 |    96.51 |     100 |   98.49 | 115-116,161       
  ...tact-store.ts |   93.51 |    87.65 |     100 |   93.51 | ...71,288-289,337 
  pairing.ts       |      75 |      100 |      50 |      75 | 22-28,59-70       
  pidfile.ts       |   95.55 |       90 |     100 |   95.55 | ...50-251,315-316 
  proxy.ts         |     100 |      100 |     100 |     100 |                   
  reload.ts        |    77.5 |    86.95 |      75 |    77.5 | 72-84,93-97       
  runtime.ts       |   82.43 |    86.44 |     100 |   82.43 | ...87-191,251-253 
  set.ts           |   75.72 |    85.71 |      50 |   75.72 | 65-83,111-116     
  start.ts         |    85.8 |    82.17 |      88 |    85.8 | ...85,591-594,606 
  ...ure-format.ts |   93.65 |    82.45 |     100 |   93.65 | ...42,48-49,74-75 
  status.ts        |   78.57 |    59.25 |   66.66 |   78.57 | ...36-137,150-161 
  stop.ts          |   57.83 |    82.35 |      50 |   57.83 | ...3,74-76,85-111 
 ...nds/extensions |   88.82 |    87.64 |   87.09 |   88.82 |                   
  consent.ts       |   72.53 |       90 |   42.85 |   72.53 | ...86-142,157-163 
  disable.ts       |     100 |       90 |     100 |     100 | 30                
  enable.ts        |     100 |    91.66 |     100 |     100 | 38                
  install.ts       |   82.95 |    81.57 |      75 |   82.95 | ...96-199,202-211 
  link.ts          |     100 |      100 |     100 |     100 |                   
  list.ts          |     100 |     87.5 |     100 |     100 | 18                
  new.ts           |     100 |      100 |     100 |     100 |                   
  settings.ts      |   99.15 |      100 |   83.33 |   99.15 | 151               
  sources.ts       |   93.42 |    87.09 |   92.85 |   93.42 | ...4-66,96-98,167 
  uninstall.ts     |   74.57 |       40 |   66.66 |   74.57 | 45-47,60-67,70-73 
  update.ts        |   96.71 |    97.05 |     100 |   96.71 | 114-118           
  utils.ts         |      75 |    53.84 |     100 |      75 | ...27-131,133-137 
 ...les/mcp-server |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-60              
 ...amples/starter |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-64              
 src/commands/mcp  |   90.31 |    84.61 |   83.33 |   90.31 |                   
  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          |   93.15 |    84.84 |      80 |   93.15 | ...78-180,198-199 
  reconnect.ts     |   78.85 |    66.66 |   85.71 |   78.85 | 42-55,169-191     
  remove.ts        |     100 |       80 |     100 |     100 | 21-25             
 ...ommands/review |   87.39 |    87.94 |   88.33 |   87.39 |                   
  agent-prompt.ts  |   93.45 |    91.63 |   97.22 |   93.45 | ...2399,2513-2593 
  base-tree.ts     |   76.16 |    80.76 |   77.77 |   76.16 | ...50-371,373-386 
  capture-local.ts |   68.57 |     90.9 |      75 |   68.57 | 107-111,158-189   
  ...k-coverage.ts |   50.71 |       35 |   66.66 |   50.71 | ...40-245,279-289 
  cleanup.ts       |   89.12 |    82.22 |   83.33 |   89.12 | ...99-504,506-507 
  ...ent-status.ts |   93.03 |    83.87 |   83.33 |   93.03 | 291,531-551       
  ...ose-review.ts |   96.33 |    91.87 |      96 |   96.33 | ...1916,1944-1966 
  cost-ledger.ts   |   94.67 |    95.86 |   78.57 |   94.67 | ...04-505,545-555 
  drive.ts         |   76.07 |    85.71 |   81.81 |   76.07 | ...90-492,497-499 
  extract-step.ts  |   91.36 |    90.62 |   88.88 |   91.36 | ...90-707,714-729 
  fetch-pr.ts      |    76.7 |    68.75 |   63.63 |    76.7 | ...95,417,450-455 
  findings.ts      |   89.35 |    89.13 |   95.45 |   89.35 | ...15-918,927-928 
  load-rules.ts    |   26.41 |      100 |   16.66 |   26.41 | ...41-153,155-156 
  match-remote.ts  |   85.54 |     92.3 |   66.66 |   85.54 | 67-72,131-136     
  mock-provider.ts |   95.44 |    90.25 |   89.47 |   95.44 | 145,690-709       
  parse-args.ts    |   99.66 |    96.55 |     100 |   99.66 | 404               
  plan-diff.ts     |   64.04 |      100 |   66.66 |   64.04 | 127-163           
  pr-context.ts    |   81.77 |    80.86 |   92.85 |   81.77 | ...1043,1072-1074 
  presubmit.ts     |   83.75 |    92.72 |   88.88 |   83.75 | ...77-578,655-685 
  ...ish-assets.ts |   77.18 |    82.14 |   71.42 |   77.18 | ...85-531,533-544 
  repo-context.ts  |   94.92 |    90.82 |     100 |   94.92 | ...67-368,376-377 
  ...ve-anchors.ts |   77.77 |    88.88 |      75 |   77.77 | ...77-182,194-211 
  run.ts           |   82.16 |    87.12 |   91.66 |   82.16 | ...52,468-516,529 
  save-artifact.ts |    89.9 |    81.81 |   94.11 |    89.9 | ...08-311,404-407 
  script-lint.ts   |   81.14 |    79.23 |   88.88 |   81.14 | ...59-773,775-797 
  submit.ts        |   83.88 |    84.21 |    90.9 |   83.88 | ...62-466,566-602 
  test-delta.ts    |   87.13 |    91.46 |      75 |   87.13 | 206-237,477-485   
  test-efficacy.ts |   88.04 |    84.12 |   95.45 |   88.04 | ...2602,2610-2630 
  test-plan.ts     |   91.44 |    91.39 |   89.47 |   91.44 | ...38-839,903-920 
 ...w/__fixtures__ |     100 |      100 |     100 |     100 |                   
  ...r-default.mjs |     100 |      100 |     100 |     100 |                   
  ...der-empty.mjs |     100 |      100 |     100 |     100 |                   
  ...der-named.mjs |     100 |      100 |     100 |     100 |                   
 ...nds/review/lib |   96.95 |    94.77 |   97.68 |   96.95 |                   
  agent-briefs.ts  |   98.96 |      100 |      50 |   98.96 | 719-720           
  anchors.ts       |     100 |    94.79 |     100 |     100 | ...33,169,178,225 
  assets.ts        |     100 |      100 |     100 |     100 |                   
  authorization.ts |    92.4 |    92.59 |     100 |    92.4 | 127-133           
  budget.ts        |     100 |    96.29 |     100 |     100 | 370,401           
  coverage.ts      |   94.48 |    94.57 |      96 |   94.48 | ...72-489,526-537 
  deadline.ts      |   97.68 |    91.22 |     100 |   97.68 | 140-141,190,352   
  diff-flags.ts    |     100 |        0 |     100 |     100 | 63                
  diff-plan.ts     |   98.73 |    93.01 |     100 |   98.73 | ...41,264,290-291 
  effort.ts        |     100 |      100 |     100 |     100 |                   
  gh.ts            |   86.42 |    91.83 |      75 |   86.42 | ...52,289-290,317 
  git.ts           |   97.64 |    95.65 |     100 |   97.64 | 180-181           
  heavy.ts         |     100 |      100 |     100 |     100 |                   
  inline-counts.ts |     100 |      100 |     100 |     100 |                   
  ledger.ts        |     100 |      100 |     100 |     100 |                   
  local-diff.ts    |    84.4 |    88.46 |     100 |    84.4 | ...63-473,475-483 
  ...ry-context.ts |   96.19 |    94.93 |     100 |   96.19 | ...90-491,496-499 
  merge-base.ts    |     100 |      100 |     100 |     100 |                   
  path-rules.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |     100 |     87.5 |     100 |     100 | 92                
  prompt-record.ts |   97.88 |    93.87 |     100 |   97.88 | 260-261,267       
  receipt.ts       |     100 |      100 |     100 |     100 |                   
  remote-match.ts  |   97.26 |    91.42 |     100 |   97.26 | 49-50             
  report.ts        |   94.68 |    93.75 |     100 |   94.68 | 189-193           
  ...ry-context.ts |     100 |    98.66 |     100 |     100 | 184               
  retirement.ts    |     100 |     92.3 |     100 |     100 | ...37,317-318,457 
  review-footer.ts |     100 |      100 |     100 |     100 |                   
  roster.ts        |     100 |    95.71 |     100 |     100 | 145,163,208       
  shell-quote.ts   |     100 |      100 |     100 |     100 |                   
  stale-bundle.ts  |   98.11 |    94.04 |     100 |   98.11 | 416,457,497-498   
  test-utils.ts    |     100 |      100 |     100 |     100 |                   
  transcripts.ts   |   96.59 |    94.56 |     100 |   96.59 | ...08,297-298,323 
  ...pace-scope.ts |     100 |    96.96 |     100 |     100 | 172               
  workspaces.ts    |     100 |     95.9 |     100 |     100 | ...27,452,499,512 
  worktree.ts      |     100 |      100 |     100 |     100 |                   
 ...mands/sessions |   91.56 |    86.95 |   83.33 |   91.56 |                   
  common.ts        |     100 |      100 |     100 |     100 |                   
  list.ts          |   90.96 |    86.66 |   81.81 |   90.96 | 208-219,221-222   
 src/config        |   94.84 |    89.73 |    96.2 |   94.84 |                   
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   89.35 |    83.56 |     100 |   89.35 | ...97-298,314-315 
  ...eMcpImport.ts |   87.91 |    81.52 |     100 |   87.91 | ...63-371,453-454 
  compile-cache.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   88.95 |    88.61 |   83.78 |   88.95 | ...2461,2463-2471 
  ...cy-monitor.ts |   88.75 |    76.19 |     100 |   88.75 | ...3,90-92,98,101 
  ...ust-policy.ts |   83.02 |    88.88 |     100 |   83.02 | ...02-209,232-240 
  ...heme-names.ts |     100 |      100 |     100 |     100 |                   
  environment.ts   |   96.42 |    93.22 |      95 |   96.42 | ...69-570,624-625 
  ...le-watcher.ts |   90.86 |    83.65 |   95.83 |   90.86 | ...23-325,370,418 
  ...resh-state.ts |   90.57 |    97.29 |   93.75 |   90.57 | 137-142,146-152   
  ...ime-reload.ts |     100 |    69.69 |     100 |     100 | ...12-113,122-123 
  hot-reload.ts    |     100 |    89.13 |     100 |     100 | 47,172-178,238    
  keyBindings.ts   |   97.43 |       50 |     100 |   97.43 | 236-239           
  ...ngsAdapter.ts |     100 |    94.11 |     100 |     100 | 64                
  ...ig-watcher.ts |   95.17 |    83.05 |     100 |   95.17 | ...78,200,292-293 
  ...er-secrets.ts |   98.97 |    96.96 |     100 |   98.97 | 85                
  mcpApprovals.ts  |   96.55 |    95.55 |     100 |   96.55 | 223-224,229-231   
  mcpJson.ts       |     100 |      100 |     100 |     100 |                   
  mcpServers.ts    |   92.85 |     87.5 |     100 |   92.85 | 46-47             
  ...idersScope.ts |      95 |    94.73 |     100 |      95 | 11-12             
  ...abledTools.ts |     100 |      100 |     100 |     100 |                   
  ...comparison.ts |     100 |      100 |     100 |     100 |                   
  ...n-settings.ts |   99.15 |    93.75 |     100 |   99.15 | 63                
  sandboxConfig.ts |   93.33 |    93.33 |     100 |   93.33 | ...42-147,216-217 
  ...ings-cache.ts |   98.26 |    97.14 |     100 |   98.26 | 201-202           
  settings.ts      |   91.27 |    92.64 |      90 |   91.27 | ...1030,1032-1033 
  ...ingsSchema.ts |     100 |      100 |     100 |     100 |                   
  ...ngsWatcher.ts |   95.54 |    88.34 |     100 |   95.54 | ...28,277-278,293 
  ...d-env-keys.ts |     100 |      100 |     100 |     100 |                   
  ...l-settings.ts |     100 |      100 |     100 |     100 |                   
  ...paths-lite.ts |   89.47 |       88 |     100 |   89.47 | 43-44,53-54,56-57 
  ...precedence.ts |   98.79 |     92.3 |     100 |   98.79 | 62                
  ...tedFolders.ts |   92.53 |    93.47 |     100 |   92.53 | ...36-337,373-384 
 ...nfig/migration |   95.23 |    77.77 |   83.33 |   95.23 |                   
  index.ts         |   95.65 |     87.5 |     100 |   95.65 | 117-118           
  scheduler.ts     |   96.55 |    77.77 |     100 |   96.55 | 19-20             
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...ation/versions |   94.91 |      100 |     100 |   94.91 |                   
  ...-v2-shared.ts |     100 |      100 |     100 |     100 |                   
  v1-to-v2.ts      |   81.75 |      100 |     100 |   81.75 | ...28-229,231-247 
  v2-to-v3.ts      |     100 |      100 |     100 |     100 |                   
  v3-to-v4.ts      |     100 |      100 |     100 |     100 |                   
  v5-to-v4.ts      |      96 |      100 |     100 |      96 | 94-95,99          
 src/core          |     100 |      100 |     100 |     100 |                   
  auth.ts          |     100 |      100 |     100 |     100 |                   
  initializer.ts   |     100 |      100 |     100 |     100 |                   
  theme.ts         |     100 |      100 |     100 |     100 |                   
 src/dualOutput    |    71.8 |    70.31 |   66.66 |    71.8 |                   
  ...tputBridge.ts |   71.95 |    70.96 |   68.42 |   71.95 | ...08-409,417-420 
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/export        |       0 |        0 |       0 |       0 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-7               
 src/generated     |     100 |      100 |     100 |     100 |                   
  git-commit.ts    |     100 |      100 |     100 |     100 |                   
 src/hooks         |     100 |      100 |     100 |     100 |                   
  ...elete-hook.ts |     100 |      100 |     100 |     100 |                   
 src/i18n          |   85.98 |    81.92 |   89.65 |   85.98 |                   
  index.ts         |   73.45 |    77.77 |      90 |   73.45 | ...70-271,294-299 
  languages.ts     |   93.07 |     92.3 |   85.71 |   93.07 | ...35,164-169,184 
  ...nslateKeys.ts |     100 |      100 |     100 |     100 |                   
  ...lationDict.ts |   93.33 |    66.66 |     100 |   93.33 | 15                
 src/i18n/locales  |     100 |      100 |     100 |     100 |                   
  ca.js            |     100 |      100 |     100 |     100 |                   
  de.js            |     100 |      100 |     100 |     100 |                   
  en.js            |     100 |      100 |     100 |     100 |                   
  fr.js            |     100 |      100 |     100 |     100 |                   
  ja.js            |     100 |      100 |     100 |     100 |                   
  pt.js            |     100 |      100 |     100 |     100 |                   
  ru.js            |     100 |      100 |     100 |     100 |                   
  zh-TW.js         |     100 |      100 |     100 |     100 |                   
  zh.js            |     100 |      100 |     100 |     100 |                   
 ...nonInteractive |   80.98 |    77.27 |   84.12 |   80.98 |                   
  session.ts       |   84.97 |    76.31 |   96.07 |   84.97 | ...1048,1057-1067 
  types.ts         |    42.5 |      100 |   33.33 |    42.5 | ...31-632,635-636 
 ...active/control |   75.54 |    89.83 |      80 |   75.54 |                   
  ...rolContext.ts |    6.06 |        0 |       0 |    6.06 | 57-99             
  ...Dispatcher.ts |   91.95 |    92.98 |   88.88 |   91.95 | ...54-372,392,395 
  ...rolService.ts |    6.89 |        0 |       0 |    6.89 | 46-188            
 ...ol/controllers |    44.9 |    66.19 |   55.26 |    44.9 |                   
  ...Controller.ts |    42.4 |      100 |   83.33 |    42.4 | 101-105,140-223   
  ...Controller.ts |       0 |        0 |       0 |       0 | 1-56              
  ...Controller.ts |   55.01 |    67.14 |   58.33 |   55.01 | ...15-624,639-644 
  ...Controller.ts |   49.23 |       60 |      50 |   49.23 | ...07-108,111-121 
  ...Controller.ts |   37.92 |    60.71 |   46.66 |   37.92 | ...41-653,662-691 
 .../control/types |       0 |        0 |       0 |       0 |                   
  serviceAPIs.ts   |       0 |        0 |       0 |       0 | 1                 
 ...Interactive/io |    98.1 |    94.16 |   95.23 |    98.1 |                   
  ...putAdapter.ts |   97.98 |     93.2 |   98.07 |   97.98 | ...1415,1431-1432 
  ...putAdapter.ts |      96 |     92.3 |   85.71 |      96 | 51-52             
  ...nputReader.ts |     100 |    94.73 |     100 |     100 | 67                
  ...putAdapter.ts |   98.49 |      100 |   90.47 |   98.49 | 85-86,126-127     
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/patches       |       0 |        0 |       0 |       0 |                   
  is-in-ci.ts      |       0 |        0 |       0 |       0 | 1-17              
 src/remoteInput   |   87.31 |    75.32 |   88.23 |   87.31 |                   
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  ...putWatcher.ts |   88.01 |       76 |   93.33 |   88.01 | ...49-350,361-364 
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/runtime       |   99.61 |    95.04 |     100 |   99.61 |                   
  ...livery-ipc.ts |     100 |     90.9 |     100 |     100 | 94,106,134        
  ...l-delivery.ts |     100 |      100 |     100 |     100 |                   
  cpu-percent.ts   |     100 |      100 |     100 |     100 |                   
  ...erver-name.ts |     100 |      100 |     100 |     100 |                   
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...-summaries.ts |   86.66 |       50 |     100 |   86.66 | 11,19             
  ...ber-errors.ts |     100 |    95.32 |     100 |     100 | 53,93-94,172,192  
  ...ls-mapping.ts |     100 |      100 |     100 |     100 |                   
 src/serve         |   87.36 |    83.59 |   90.49 |   87.36 |                   
  ...tp-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   93.43 |    92.95 |     100 |   93.43 | ...20-321,324-326 
  ...em-adapter.ts |     100 |      100 |     100 |     100 |                   
  capabilities.ts  |     100 |    98.07 |     100 |     100 | 670               
  ...cp-command.ts |     100 |      100 |     100 |     100 |                   
  ...horization.ts |   92.79 |    93.33 |    87.5 |   92.79 | 75-80,135-136     
  ...op-mcp-ipc.ts |   81.06 |    73.68 |   94.11 |   81.06 | ...37-242,267,289 
  ...nt-service.ts |    94.1 |    86.89 |     100 |    94.1 | ...75-477,484,486 
  ...-selection.ts |     100 |      100 |     100 |     100 |                   
  ...ings-store.ts |   88.59 |    93.68 |   96.29 |   88.59 | ...95-207,451-454 
  ...ebhook-ipc.ts |    98.5 |    86.66 |     100 |    98.5 | 47                
  ...iagnostics.ts |     100 |      100 |     100 |     100 |                   
  ...worker-env.ts |     100 |      100 |     100 |     100 |                   
  ...rker-group.ts |   87.27 |     85.2 |     100 |   87.27 | ...10,816-820,838 
  ...er-manager.ts |   89.39 |    83.88 |   93.33 |   89.39 | ...98,711,722-724 
  ...tartup-ipc.ts |   97.72 |    96.66 |     100 |   97.72 | 88-89             
  ...supervisor.ts |   92.42 |    84.44 |    97.1 |   92.42 | ...1466,1520-1524 
  ...e-grouping.ts |     100 |    94.28 |     100 |     100 | 71,137            
  core-runtime.ts  |     100 |      100 |     100 |     100 |                   
  ...ub-session.ts |    90.1 |    77.83 |   94.73 |    90.1 | ...1014,1021-1026 
  daemon-logger.ts |    82.2 |    77.42 |   91.76 |    82.2 | ...1720,1747-1753 
  ...y-pressure.ts |     100 |    96.96 |     100 |     100 | 135               
  ...trics-ring.ts |     100 |      100 |     100 |     100 |                   
  ...s-provider.ts |   68.04 |    52.77 |     100 |   68.04 | ...44-249,282-290 
  daemon-status.ts |   98.57 |     90.8 |     100 |   98.57 | ...1411,1413-1414 
  debug-mode.ts    |     100 |      100 |     100 |     100 |                   
  demo.ts          |     100 |      100 |     100 |     100 |                   
  env-snapshot.ts  |   93.37 |    85.18 |     100 |   93.37 | 114-117,195-202   
  ...-scheduler.ts |   87.34 |    83.87 |     100 |   87.34 | 33-36,48-50,79-81 
  ...d-provider.ts |   92.06 |    86.95 |     100 |   92.06 | ...72,287-293,316 
  ...-path-argv.ts |     100 |      100 |     100 |     100 |                   
  ...h-settings.ts |   94.89 |    90.25 |     100 |   94.89 | ...24,702,718,728 
  fast-path.ts     |   90.98 |    81.38 |   95.45 |   90.98 | ...32-541,607-608 
  ...ration-sse.ts |   42.55 |    33.33 |     100 |   42.55 | 23-24,30,33-56    
  health-query.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-143             
  ...e-observer.ts |   89.89 |    83.24 |      96 |   89.89 | ...11-512,541-543 
  ...back-binds.ts |     100 |    88.88 |     100 |     100 | 32                
  ...-workspace.ts |    90.9 |    85.71 |     100 |    90.9 | ...30-131,142-143 
  ...iders-edit.ts |     100 |    82.14 |     100 |     100 | 58-60,65,81       
  ...ory-picker.ts |     100 |    86.95 |     100 |     100 | 36,66,92          
  ...sion-audit.ts |     100 |      100 |   93.33 |     100 |                   
  rate-limit.ts    |   92.77 |    88.42 |     100 |   92.77 | ...93-295,307-309 
  ...qwen-serve.ts |   83.72 |    79.84 |   75.43 |   83.72 | ...7337,7343-7344 
  ...tup-errors.ts |     100 |      100 |     100 |     100 |                   
  ...-keepalive.ts |   94.19 |     87.5 |     100 |   94.19 | ...26,530-531,571 
  ...-lifecycle.ts |     100 |      100 |     100 |     100 |                   
  server.ts        |   90.57 |    90.92 |   71.69 |   90.57 | ...2663,2677-2681 
  ...on-helpers.ts |     100 |      100 |     100 |     100 |                   
  ...t-event-id.ts |     100 |    95.23 |     100 |     100 | 12                
  ...-admission.ts |   98.71 |    89.65 |     100 |   98.71 | 68                
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ion-limits.ts |     100 |      100 |     100 |     100 |                   
  ...t-sessions.ts |    93.3 |    76.83 |     100 |    93.3 | ...20,823,836-838 
  ...l-resolver.ts |   90.32 |    66.66 |     100 |   90.32 | 16,45-46          
  ...ell-static.ts |   92.18 |    88.37 |     100 |   92.18 | ...21-224,267-270 
  ...ace-agents.ts |   66.13 |    70.57 |   92.68 |   66.13 | ...2246,2256-2266 
  ...generation.ts |    95.4 |    82.35 |   66.66 |    95.4 | 55-56,78,92       
  ...-git-state.ts |     100 |    91.93 |    90.9 |     100 | 161,172,202,265   
  ...ace-inputs.ts |     100 |      100 |     100 |     100 |                   
  ...ace-memory.ts |      83 |    74.54 |     100 |      83 | ...30-537,597-604 
  ...ers-status.ts |   98.58 |       79 |     100 |   98.58 | 106,134,174,177   
  ...tion-store.ts |   89.67 |    88.27 |   92.59 |   89.67 | ...91-400,411-414 
  ...e-registry.ts |   93.89 |     87.5 |     100 |   93.89 | ...18-519,525-526 
  ...e-remember.ts |   98.23 |    92.51 |     100 |   98.23 | ...36,340-345,386 
  ...te-runtime.ts |   83.98 |    90.29 |     100 |   83.98 | ...48-156,216-237 
  ...me-storage.ts |     100 |      100 |     100 |     100 |                   
  ...management.ts |   72.63 |    72.72 |      96 |   72.63 | ...88-889,896-900 
  ...lls-status.ts |     100 |    95.45 |     100 |     100 | 152               
  ...reconciler.ts |   91.63 |    84.09 |     100 |   91.63 | ...71-273,306-307 
 ...serve/acp-http |   77.23 |    78.75 |   93.33 |   77.23 |                   
  ...r-registry.ts |   96.92 |    94.87 |     100 |   96.92 | 184-187           
  client-mcp-ws.ts |   54.85 |    58.62 |   72.72 |   54.85 | ...99-300,304-305 
  ...n-registry.ts |    98.2 |    88.55 |     100 |    98.2 | 1015,1041-1052    
  dispatch.ts      |   71.95 |    75.11 |   95.55 |   71.95 | ...4897,4945-4951 
  index.ts         |   81.97 |     79.8 |    90.9 |   81.97 | ...2296,2380-2381 
  json-rpc.ts      |     100 |    96.96 |     100 |     100 | 92                
  safe-ws-send.ts  |   52.94 |    71.42 |     100 |   52.94 | 33-42,47-55       
  sse-stream.ts    |   93.96 |    88.57 |   84.61 |   93.96 | ...57-159,161-163 
  ...ort-stream.ts |       0 |        0 |       0 |       0 | 1                 
  ws-stream.ts     |   91.86 |       80 |     100 |   91.86 | 45,50,96,100-103  
 src/serve/auth    |   86.86 |     79.7 |   93.87 |   86.86 |                   
  device-flow.ts   |   96.35 |    80.57 |   97.61 |   96.35 | ...1358,1453,1519 
  ...w-provider.ts |   44.24 |    74.07 |   71.42 |   44.24 | ...23-284,297,301 
 ...rve/cdp-tunnel |   87.73 |    76.21 |    97.5 |   87.73 |                   
  ...r-emulator.ts |   93.27 |    77.77 |     100 |   93.27 | ...53-256,282-283 
  ...verse-link.ts |      88 |    76.19 |     100 |      88 | ...28-329,420-423 
  ...l-registry.ts |     100 |      100 |     100 |     100 |                   
  cdp-ws.ts        |   76.28 |    61.29 |    87.5 |   76.28 | ...13-217,223-228 
 ...nel/acceptance |    6.12 |    57.89 |   46.15 |    6.12 |                   
  ...helpers.d.mts |       0 |        0 |       0 |       0 | 1                 
  ...e-helpers.mjs |   97.64 |    70.96 |     100 |   97.64 | 22-23             
  ...mcp-smoke.mjs |       0 |        0 |       0 |       0 | 1-124             
  ...cceptance.mjs |       0 |        0 |       0 |       0 | 1-473             
  ...re-server.mjs |       0 |        0 |       0 |       0 | 1-59              
  ...ols-smoke.mjs |       0 |        0 |       0 |       0 | 1-268             
  real-tab.mjs     |       0 |        0 |       0 |       0 | 1-218             
  ...al-chrome.mjs |       0 |        0 |       0 |       0 | 1-223             
 src/serve/fs      |   86.39 |    80.71 |     100 |   86.39 |                   
  audit.ts         |     100 |    96.15 |     100 |     100 | 204               
  errors.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...x-registry.ts |     100 |      100 |     100 |     100 |                   
  paths.ts         |   77.64 |     73.6 |     100 |   77.64 | ...65,594-598,611 
  policy.ts        |   90.42 |    89.18 |     100 |   90.42 | 161-169           
  text-cursor.ts   |   88.23 |       90 |     100 |   88.23 | 74-77,92-95       
  ...ile-system.ts |   86.16 |    79.55 |     100 |   86.16 | ...2510,2520-2521 
 src/serve/live    |   77.28 |    69.21 |   89.91 |   77.28 |                   
  ...en-context.ts |   95.74 |    81.25 |     100 |   95.74 | ...0,66-67,99-100 
  ...-workspace.ts |   88.63 |    82.53 |     100 |   88.63 | ...40-241,253-254 
  discovery.ts     |   85.77 |    76.92 |      90 |   85.77 | ...49-250,255-256 
  ...structions.ts |     100 |      100 |     100 |     100 |                   
  ...oordinator.ts |   82.67 |    76.75 |   97.01 |   82.67 | ...1319,1351-1353 
  ...-installer.ts |   45.17 |    81.96 |   68.18 |   45.17 | ...80-381,395-407 
  ...oordinator.ts |   76.17 |     64.4 |   85.36 |   76.17 | ...1858,1949-1950 
  ...controller.ts |   67.82 |    79.31 |   72.72 |   67.82 | ...66-278,287-295 
  ...ak-to-user.ts |   96.66 |      100 |   83.33 |   96.66 | 37-38             
  ...sk-service.ts |   86.22 |    59.64 |   93.33 |   86.22 | ...1152,1175-1182 
  ...task-tools.ts |      99 |      100 |   85.71 |      99 | 205-206           
  ...redentials.ts |   96.26 |    93.47 |     100 |   96.26 | 91-94             
  ...me-session.ts |   65.63 |    57.24 |   88.88 |   65.63 | ...2270,2275-2282 
  ...up-context.ts |   94.83 |    77.58 |     100 |   94.83 | ...18,327-330,350 
  ...ion-source.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/serve/routes  |   85.45 |    79.82 |   95.29 |   85.45 |                   
  a2ui-action.ts   |   96.84 |     88.5 |    87.5 |   96.84 | ...70-272,309-311 
  capabilities.ts  |     100 |      100 |     100 |     100 |                   
  ...nel-notify.ts |   86.45 |       88 |     100 |   86.45 | ...,83-87,103-104 
  ...l-webhooks.ts |   93.56 |    84.09 |     100 |   93.56 | ...42,292,332,334 
  daemon-status.ts |   85.71 |    83.33 |     100 |   85.71 | 101-108           
  goals.ts         |   98.92 |     90.9 |     100 |   98.92 | 146               
  health-demo.ts   |   95.65 |    88.88 |     100 |   95.65 | 63-67,186         
  live-setup.ts    |   33.33 |     37.5 |      50 |   33.33 | ...18-123,130-135 
  live.ts          |    82.4 |    71.42 |     100 |    82.4 | ...-94,96-101,121 
  permission.ts    |     100 |     92.3 |     100 |     100 | 50,98             
  ...uled-tasks.ts |   87.29 |    82.94 |   92.59 |   87.29 | ...1275,1318-1319 
  ...on-runtime.ts |     100 |    90.47 |     100 |     100 | 58,94             
  session.ts       |   85.42 |    81.81 |   95.31 |   85.42 | ...4777,4779-4780 
  sse-events.ts    |   86.82 |    85.71 |   94.11 |   86.82 | ...16-927,930,937 
  usage-stats.ts   |     100 |    95.45 |     100 |     100 | 118               
  ...space-auth.ts |   85.55 |    75.64 |     100 |   85.55 | ...21-326,331,345 
  ...el-control.ts |   86.26 |    78.94 |     100 |   86.26 | ...17-318,339-347 
  ...management.ts |   90.92 |    79.69 |     100 |   90.92 | ...81-482,501-502 
  ...d-contacts.ts |     100 |      100 |     100 |     100 |                   
  ...controller.ts |   83.11 |    79.41 |      90 |   83.11 | ...1033,1039,1042 
  ...extensions.ts |   88.15 |    74.95 |   92.98 |   88.15 | ...2027,2072-2073 
  ...-file-read.ts |      91 |    80.91 |     100 |      91 | ...20-621,624-625 
  ...file-write.ts |   84.44 |    64.51 |     100 |   84.44 | ...73-275,355-357 
  ...t-branches.ts |   75.43 |    66.66 |     100 |   75.43 | ...13-618,627-634 
  ...e-git-diff.ts |   97.32 |    90.56 |     100 |   97.32 | 161-162,189-191   
  ...ce-git-log.ts |     100 |    93.18 |     100 |     100 | 52,77,188         
  workspace-git.ts |   77.08 |    89.65 |     100 |   77.08 | 97-118            
  ...github-prs.ts |   88.26 |    63.46 |     100 |   88.26 | ...38-239,264-265 
  ...-lifecycle.ts |   95.23 |    75.75 |     100 |   95.23 | ...50-151,186-187 
  ...management.ts |   87.41 |    84.13 |     100 |   87.41 | ...1660,1680-1685 
  ...cp-control.ts |    73.2 |    67.54 |   85.71 |    73.2 | ...27-633,644-645 
  ...ace-models.ts |   95.53 |    89.74 |     100 |   95.53 | ...52-157,296-297 
  ...ermissions.ts |    77.9 |    72.41 |     100 |    77.9 | ...69-277,298-316 
  ...e-settings.ts |   75.04 |    72.99 |     100 |   75.04 | ...79-690,696-697 
  ...tup-github.ts |   77.97 |    70.58 |   84.21 |   77.97 | ...46-352,397-398 
  ...ace-skills.ts |   69.87 |    78.12 |     100 |   69.87 | ...59-284,290-324 
  ...ace-status.ts |   82.94 |     74.5 |     100 |   82.94 | ...84-486,490-491 
  ...pace-tools.ts |   75.94 |    69.69 |   66.66 |   75.94 | ...59-164,193-194 
  ...pace-trust.ts |   78.92 |    66.21 |      80 |   78.92 | ...38-343,351-352 
  ...pace-voice.ts |   91.33 |    80.92 |     100 |   91.33 | ...70-673,676-678 
 src/serve/server  |   90.72 |    89.09 |   96.55 |   90.72 |                   
  access-log.ts    |   98.68 |     97.1 |     100 |   98.68 | 115,186           
  ...er-helpers.ts |   63.82 |    77.96 |   81.81 |   63.82 | ...16,330,332-347 
  ...w-registry.ts |    98.8 |    81.81 |     100 |    98.8 | 107               
  ...r-handlers.ts |   97.29 |       75 |     100 |   97.29 | 17                
  ...r-response.ts |   85.66 |    76.83 |     100 |   85.66 | ...02,719,782-791 
  fs-factory.ts    |     100 |    92.59 |     100 |     100 | 34,42,103,159     
  ...branch-ops.ts |     100 |      100 |     100 |     100 |                   
  ...t-deadline.ts |     100 |      100 |     100 |     100 |                   
  ...iter-setup.ts |      65 |    73.33 |   33.33 |      65 | 30-35,38-43,47-48 
  ...st-helpers.ts |   95.11 |    95.09 |     100 |   95.11 | ...65-167,422-427 
  self-origin.ts   |   76.19 |       80 |     100 |   76.19 | 45-54             
  ...e-features.ts |      95 |     87.5 |     100 |      95 | 182-188           
  ...on-archive.ts |   89.55 |    87.78 |   97.14 |   89.55 | ...32-836,888-889 
  ...ion-export.ts |     100 |    94.44 |     100 |     100 | 64                
  session-list.ts  |   93.55 |    91.01 |     100 |   93.55 | ...79,681-687,827 
  telemetry.ts     |   99.02 |    97.44 |     100 |   99.02 | ...25,639,781-783 
 src/serve/voice   |    92.7 |    91.48 |   97.67 |    92.7 |                   
  ...ice-config.ts |   84.81 |       30 |     100 |   84.81 | 91-100,104-105    
  voice-ws.ts      |   91.58 |    93.44 |      96 |   91.58 | ...68,483,521-523 
  ...oordinator.ts |     100 |    98.21 |     100 |     100 | 176               
 ...kspace-service |   89.11 |    86.15 |   90.69 |   89.11 |                   
  index.ts         |   88.66 |    85.77 |   89.47 |   88.66 | ...1286-1290,1293 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services      |   92.48 |    89.31 |      98 |   92.48 |                   
  ...mandLoader.ts |     100 |    88.88 |     100 |     100 | 105-118           
  ...killLoader.ts |   97.19 |    85.29 |     100 |   97.19 | 142,153-154       
  ...andService.ts |   98.73 |      100 |     100 |   98.73 | 107               
  ...mandLoader.ts |   86.83 |    83.87 |     100 |   86.83 | ...30-335,340-345 
  ...omptLoader.ts |   79.55 |    88.29 |   83.33 |   79.55 | ...48,178,245-246 
  ...mandLoader.ts |   97.77 |    92.15 |     100 |   97.77 | 176,183-184       
  ...nd-factory.ts |   91.42 |    91.66 |     100 |   91.42 | 128,137-144       
  ...ation-tool.ts |     100 |    95.45 |     100 |     100 | 125               
  ...ndMetadata.ts |   98.23 |    96.72 |     100 |   98.23 | 83,87             
  commandUtils.ts  |      96 |     90.9 |     100 |      96 | 48                
  ...and-parser.ts |   90.69 |    85.71 |     100 |   90.69 | 63-66             
  ...ionService.ts |     100 |      100 |     100 |     100 |                   
  prompt-stash.ts  |   96.66 |    92.85 |     100 |   96.66 | 34-35             
  ...tree-lease.ts |   88.23 |    86.48 |     100 |   88.23 | ...94-199,232-233 
  ...low-loader.ts |     100 |    96.15 |     100 |     100 | 88                
  setup-github.ts  |    90.8 |    80.95 |     100 |    90.8 | ...49-450,457-458 
  ...-args-file.ts |   93.93 |    91.66 |    87.5 |   93.93 | 208-210,224-230   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |   98.64 |    95.77 |     100 |   98.64 | 116,142-143       
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  voice-service.ts |    90.4 |    87.87 |     100 |    90.4 | ...81,288,353-358 
  ...e-settings.ts |     100 |    95.23 |     100 |     100 | 19                
  ...ranscriber.ts |   91.77 |    87.11 |   97.22 |   91.77 | ...99-901,904-906 
 ...rvices/insight |     100 |      100 |     100 |     100 |                   
  dates.ts         |     100 |      100 |     100 |     100 |                   
 ...ght/generators |   88.91 |     86.8 |   96.15 |   88.91 |                   
  DataProcessor.ts |   88.28 |    86.77 |   94.73 |   88.28 | ...1362,1366-1373 
  ...tGenerator.ts |   98.24 |    85.71 |     100 |   98.24 | 47                
  ...teRenderer.ts |     100 |      100 |     100 |     100 |                   
 .../insight/types |       0 |       50 |      50 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 | 1                 
 ...mpt-processors |   97.27 |    94.04 |     100 |   97.27 |                   
  ...tProcessor.ts |     100 |      100 |     100 |     100 |                   
  ...eProcessor.ts |   94.52 |    84.21 |     100 |   94.52 | 46-47,93-94       
  ...tionParser.ts |     100 |      100 |     100 |     100 |                   
  ...lProcessor.ts |   97.41 |    95.65 |     100 |   97.41 | 96-99             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services/tips |   97.27 |    84.61 |     100 |   97.27 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  tipHistory.ts    |   92.59 |       70 |     100 |   92.59 | ...24,146,153,162 
  tipRegistry.ts   |     100 |      100 |     100 |     100 |                   
  tipScheduler.ts  |     100 |    91.66 |     100 |     100 | 55                
 src/startup       |   88.99 |    83.47 |    90.9 |   88.99 |                   
  ...p-prefetch.ts |   98.09 |    94.23 |    87.5 |   98.09 | 50,209,225-226    
  ...reeStartup.ts |   80.53 |     74.6 |     100 |   80.53 | ...94,403,409-412 
 src/test-utils    |   94.09 |    79.16 |   77.77 |   94.09 |                   
  ci-env.ts        |      88 |     62.5 |     100 |      88 | 22-23,28          
  ...omMatchers.ts |   69.69 |       50 |      50 |   69.69 | 32-35,37-39,45-47 
  ...mised-lock.ts |     100 |      100 |   66.66 |     100 |                   
  ...andContext.ts |     100 |      100 |     100 |     100 |                   
  render.tsx       |     100 |      100 |     100 |     100 |                   
 src/ui            |   73.08 |    75.43 |   67.41 |   73.08 |                   
  App.tsx          |   33.33 |       75 |   33.33 |   33.33 | 32-86             
  AppContainer.tsx |   74.29 |    72.05 |   68.57 |   74.29 | ...4112,4228-4234 
  ...tionNudge.tsx |    9.58 |      100 |       0 |    9.58 | 24-94             
  ...ackDialog.tsx |    30.3 |      100 |       0 |    30.3 | 26-76             
  ...tionNudge.tsx |    7.69 |      100 |       0 |    7.69 | 25-103            
  colors.ts        |      60 |      100 |   35.29 |      60 | ...52,54-55,60-61 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  keyMatchers.ts   |   95.91 |    97.14 |     100 |   95.91 | 25-26             
  ...tic-colors.ts |     100 |      100 |     100 |     100 |                   
  ...ractiveUI.tsx |   70.08 |    71.73 |   66.66 |   70.08 | ...01,324,377-382 
  ...inePresets.ts |   96.27 |    83.87 |     100 |   96.27 | ...97,402,410-412 
  textConstants.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/auth       |   58.53 |    66.18 |   51.06 |   58.53 |                   
  AuthDialog.tsx   |   59.01 |     42.1 |   16.66 |   59.01 | ...25,332-354,358 
  ...nProgress.tsx |       0 |        0 |       0 |       0 | 1-64              
  ...etupSteps.tsx |   60.21 |    70.73 |   57.69 |   60.21 | ...90,794,803,806 
  useAuth.ts       |    94.6 |    73.52 |     100 |    94.6 | ...21-222,241-247 
  ...rSetupFlow.ts |   43.18 |    33.33 |      50 |   43.18 | ...78-399,416-459 
 src/ui/commands   |   82.67 |    83.16 |   89.15 |   82.67 |                   
  aboutCommand.ts  |     100 |      100 |     100 |     100 |                   
  agentsCommand.ts |   83.78 |      100 |      60 |   83.78 | 30-32,42-44       
  ...odeCommand.ts |    93.1 |    95.23 |     100 |    93.1 | 77-82             
  arenaCommand.ts  |   63.89 |    65.71 |   65.21 |   63.89 | ...01-606,691-699 
  authCommand.ts   |     100 |      100 |     100 |     100 |                   
  branchCommand.ts |     100 |      100 |     100 |     100 |                   
  btwCommand.ts    |   94.32 |    81.25 |     100 |   94.32 | 35-36,114-119     
  bugCommand.ts    |     100 |    77.77 |     100 |     100 | 27,61             
  cdCommand.ts     |    92.3 |    82.75 |     100 |    92.3 | ...,94-99,178,187 
  clearCommand.ts  |    80.9 |    70.83 |     100 |    80.9 | ...24-125,133-142 
  ...essCommand.ts |   68.06 |    54.05 |      75 |   68.06 | ...96-197,211-214 
  ...astCommand.ts |   84.17 |       75 |     100 |   84.17 | ...,91-97,125-130 
  ...ig-command.ts |   93.12 |    88.42 |     100 |   93.12 | ...07-315,321-323 
  ...extCommand.ts |   69.07 |     72.6 |   84.61 |   69.07 | ...78-611,622-623 
  copyCommand.ts   |    98.7 |    96.29 |     100 |    98.7 | 66-67,172,272,323 
  ...or-command.ts |   85.95 |    80.55 |   88.88 |   85.95 | ...68-274,298-309 
  deleteCommand.ts |     100 |      100 |     100 |     100 |                   
  diffCommand.ts   |     100 |    87.87 |     100 |     100 | ...63,231-232,245 
  ...ryCommand.tsx |   81.64 |    87.67 |    90.9 |   81.64 | ...73-278,325-332 
  docsCommand.ts   |     100 |     90.9 |     100 |     100 | 25                
  doctorCommand.ts |   65.37 |    81.88 |   94.11 |   65.37 | ...85-535,538-672 
  dreamCommand.ts  |   85.45 |    88.88 |     100 |   85.45 | 58-65             
  editorCommand.ts |     100 |      100 |     100 |     100 |                   
  ...rt-command.ts |   82.97 |    78.57 |     100 |   82.97 | 47-52,67-70,91-96 
  exportCommand.ts |   98.25 |    91.02 |     100 |   98.25 | ...81,198-199,364 
  ...onsCommand.ts |   52.31 |    56.25 |   69.23 |   52.31 | ...09,277-329,390 
  forgetCommand.ts |     100 |       90 |     100 |     100 | 59                
  forkCommand.ts   |     100 |    94.11 |     100 |     100 | 96,147            
  goalCommand.ts   |   72.81 |    86.84 |   66.66 |   72.81 | ...63-168,277-280 
  helpCommand.ts   |     100 |      100 |     100 |     100 |                   
  ...oryCommand.ts |     100 |      100 |     100 |     100 |                   
  hooksCommand.ts  |   81.13 |    65.71 |   85.71 |   81.13 | ...,86-93,131-132 
  ideCommand.ts    |   60.75 |    64.28 |   41.17 |   60.75 | ...05-306,310-324 
  ...figCommand.ts |   52.83 |    81.25 |      70 |   52.83 | ...74-319,321-330 
  initCommand.ts   |   91.86 |       80 |     100 |   91.86 | 48,83-88          
  ...ghtCommand.ts |   77.87 |    71.42 |     100 |   77.87 | ...44-245,250-272 
  ...ageCommand.ts |   94.44 |    90.14 |     100 |   94.44 | ...13-214,241-251 
  learn-command.ts |     100 |      100 |     100 |     100 |                   
  lspCommand.ts    |     100 |    86.95 |     100 |     100 | 31,101-102        
  mcpCommand.ts    |     100 |      100 |     100 |     100 |                   
  memoryCommand.ts |     100 |      100 |     100 |     100 |                   
  modelCommand.ts  |   84.78 |    82.47 |     100 |   84.78 | ...1071,1105-1110 
  ...onsCommand.ts |     100 |      100 |     100 |     100 |                   
  planCommand.ts   |   78.82 |    76.92 |     100 |   78.82 | 30-35,51-56,68-73 
  quitCommand.ts   |     100 |      100 |     100 |     100 |                   
  recapCommand.ts  |   21.81 |      100 |      50 |   21.81 | 24-73             
  ...ns-command.ts |   98.83 |    81.81 |     100 |   98.83 | 100               
  ...berCommand.ts |     100 |     87.5 |     100 |     100 | 46                
  renameCommand.ts |   89.06 |    88.37 |     100 |   89.06 | ...72-176,202-209 
  ...oreCommand.ts |   90.96 |    86.04 |     100 |   90.96 | ...41-146,177-178 
  resumeCommand.ts |     100 |      100 |     100 |     100 |                   
  rewindCommand.ts |   81.25 |      100 |      50 |   81.25 | 20-22             
  ...ngsCommand.ts |     100 |      100 |     100 |     100 |                   
  ...hubCommand.ts |   89.47 |       75 |      80 |   89.47 | 54-59             
  skillsCommand.ts |   78.82 |    81.81 |     100 |   78.82 | 37-52,78,97       
  statsCommand.ts  |   90.65 |    76.73 |     100 |   90.65 | ...30-733,825-832 
  ...ineCommand.ts |     100 |      100 |     100 |     100 |                   
  ...aryCommand.ts |   73.04 |     82.3 |      90 |   73.04 | ...20-547,561-565 
  tasksCommand.ts  |   77.22 |    72.13 |     100 |   77.22 | ...46-150,172-177 
  ...tupCommand.ts |     100 |      100 |     100 |     100 |                   
  themeCommand.ts  |     100 |      100 |     100 |     100 |                   
  toolsCommand.ts  |     100 |      100 |     100 |     100 |                   
  trustCommand.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...te-command.ts |     100 |    94.11 |     100 |     100 | 74,148            
  vimCommand.ts    |   54.54 |      100 |      50 |   54.54 | 19-29             
  voice-command.ts |   93.57 |       88 |     100 |   93.57 | 35,97-102         
  ...owsCommand.ts |   92.92 |       85 |   66.66 |   92.92 | ...72-177,276-281 
 src/ui/components |   71.52 |    79.07 |   79.85 |   71.52 |                   
  AboutBox.tsx     |     100 |      100 |     100 |     100 |                   
  AnsiOutput.tsx   |   65.57 |      100 |      50 |   65.57 | 69-90             
  ApiKeyInput.tsx  |       0 |        0 |       0 |       0 | 1-97              
  AppHeader.tsx    |    88.7 |       75 |     100 |    88.7 | 36,38-43,45       
  ...odeDialog.tsx |   87.24 |    72.22 |   33.33 |   87.24 | ...85,233-238,245 
  AsciiArt.ts      |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |   95.65 |    66.66 |     100 |   95.65 | 27,52             
  ...TextInput.tsx |   88.65 |    90.41 |     100 |   88.65 | ...84-286,300-302 
  Composer.tsx     |   94.49 |    66.66 |     100 |   94.49 | ...-72,84,139,153 
  ...entPrompt.tsx |     100 |      100 |     100 |     100 |                   
  ...ryDisplay.tsx |   75.89 |    62.06 |     100 |   75.89 | ...,88,93-108,113 
  ...geDisplay.tsx |   68.42 |    57.14 |     100 |   68.42 | 16-17,31-32,42-50 
  CronPill.tsx     |     100 |    93.75 |     100 |     100 | 19                
  ...ification.tsx |      84 |       60 |     100 |      84 | 23-24,40-42       
  ...gProfiler.tsx |       0 |        0 |       0 |       0 | 1-36              
  ...ogManager.tsx |       0 |        0 |       0 |       0 | 1-598             
  DiffDialog.tsx   |    53.5 |     37.5 |   69.23 |    53.5 | ...32-737,747-760 
  ...ngsDialog.tsx |       0 |        0 |       0 |       0 | 1-195             
  EffortDialog.tsx |   97.36 |      100 |     100 |   97.36 | 55-56             
  ExitWarning.tsx  |     100 |      100 |     100 |     100 |                   
  ...hProgress.tsx |    87.8 |    33.33 |     100 |    87.8 | 28-31,56          
  ...ustDialog.tsx |     100 |      100 |     100 |     100 |                   
  Footer.tsx       |   76.99 |    66.66 |      50 |   76.99 | ...96,233,255-260 
  ...ngSpinner.tsx |   68.42 |    85.71 |      50 |   68.42 | 35-52,73,80-81    
  GoalPill.tsx     |   93.51 |    81.81 |     100 |   93.51 | 37-38,106-109,123 
  Header.tsx       |   98.65 |    94.73 |     100 |   98.65 | 173,175           
  Help.tsx         |   98.33 |       90 |     100 |   98.33 | ...25,382,448-449 
  ...emDisplay.tsx |   79.28 |    66.99 |     100 |   79.28 | ...08,511,514-520 
  ...ngeDialog.tsx |     100 |      100 |     100 |     100 |                   
  InputPrompt.tsx  |   83.26 |    82.23 |      80 |   83.26 | ...2231,2257,2331 
  ...Shortcuts.tsx |     100 |       88 |     100 |     100 | 98,119            
  ...Indicator.tsx |   98.18 |    97.82 |     100 |   98.18 | 161-162           
  ...firmation.tsx |   91.42 |      100 |      50 |   91.42 | 26-31             
  MainContent.tsx  |   96.28 |     94.8 |      50 |   96.28 | ...01,459-463,466 
  MemoryDialog.tsx |   86.59 |    80.15 |     100 |   86.59 | ...34-435,485,553 
  ...geDisplay.tsx |       0 |        0 |       0 |       0 | 1-41              
  ModelDialog.tsx  |   81.95 |    71.27 |     100 |   81.95 | ...1045,1050-1066 
  ...tsDisplay.tsx |     100 |    97.22 |     100 |     100 | 270               
  ...fications.tsx |       0 |        0 |       0 |       0 | 1-56              
  ...onsDialog.tsx |       0 |        0 |       0 |       0 | 1-1004            
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...icePrompt.tsx |   92.64 |    85.71 |     100 |   92.64 | 102-106,134-139   
  PrepareLabel.tsx |   91.66 |    77.27 |     100 |   91.66 | 73-75,77-79,110   
  ...atePrompt.tsx |       0 |        0 |       0 |       0 | 1-134             
  ...geDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ngDisplay.tsx |       0 |        0 |       0 |       0 | 1-39              
  ...hProgress.tsx |   85.25 |    88.46 |     100 |   85.25 | 121-147           
  ...dSelector.tsx |   92.79 |    82.65 |     100 |   92.79 | ...19-323,354-370 
  ...ionPicker.tsx |   83.66 |    72.13 |     100 |   83.66 | ...96,402,444-466 
  ...onPreview.tsx |   93.58 |    83.78 |     100 |   93.58 | ...,70-71,195-197 
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...putPrompt.tsx |   92.06 |    86.36 |   83.33 |   92.06 | ...,70-72,120-123 
  ...tedDialog.tsx |     100 |      100 |     100 |     100 |                   
  ...ngsDialog.tsx |   71.49 |    73.89 |   69.23 |   71.49 | ...1244,1250-1251 
  ...ionDialog.tsx |    92.3 |    96.15 |   33.33 |    92.3 | 60-63,68-75,164   
  ...putPrompt.tsx |    15.9 |      100 |       0 |    15.9 | 20-63             
  ...Indicator.tsx |   57.14 |      100 |       0 |   57.14 | 12-15             
  ...MoreLines.tsx |       0 |        0 |       0 |       0 | 1-40              
  ...iewDialog.tsx |   97.77 |    87.67 |     100 |   97.77 | ...97,305-307,324 
  ...tsDisplay.tsx |   95.86 |       75 |     100 |   95.86 | 67-71             
  ...ionPicker.tsx |       0 |        0 |       0 |       0 | 1-172             
  ...tivityTab.tsx |    3.94 |      100 |       0 |    3.94 | 27-275            
  StatsDialog.tsx  |    8.64 |      100 |       0 |    8.64 | ...76-111,130-322 
  StatsDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ciencyTab.tsx |    78.9 |    56.52 |     100 |    78.9 | ...26,213,262-288 
  ...atmapView.tsx |    8.98 |      100 |       0 |    8.98 | 20-107            
  ...essionTab.tsx |      80 |    66.66 |     100 |      80 | ...70-277,283-300 
  ...ineDialog.tsx |    93.5 |    85.18 |     100 |    93.5 | ...05,267,287-289 
  ...yTodoList.tsx |   96.36 |    88.23 |     100 |   96.36 | 138-141           
  ...nsDisplay.tsx |   95.67 |    87.09 |     100 |   95.67 | ...24-125,275-277 
  ...inalImage.tsx |     100 |    93.93 |     100 |     100 | 75,129            
  ThemeDialog.tsx  |   89.95 |    46.15 |      75 |   89.95 | ...71-173,243-245 
  Tips.tsx         |   93.54 |       75 |     100 |   93.54 | 39-40             
  TodoDisplay.tsx  |     100 |      100 |     100 |     100 |                   
  ...tsDisplay.tsx |     100 |     87.5 |     100 |     100 | 31-32             
  TrustDialog.tsx  |     100 |    83.33 |     100 |     100 | 72-87             
  ...ification.tsx |   36.36 |      100 |       0 |   36.36 | 15-22             
  ...Indicator.tsx |    92.5 |     87.5 |     100 |    92.5 | 50-53             
  ...ackDialog.tsx |       0 |        0 |       0 |       0 | 1-134             
  ...xitDialog.tsx |   80.36 |    43.47 |      60 |   80.36 | ...24-238,248-251 
  ...odeVisuals.ts |   97.22 |    85.71 |     100 |   97.22 | 25                
  ...s-helpers.tsx |   66.25 |    81.25 |      50 |   66.25 | 25-32,46-53,62-72 
 ...nts/agent-view |   55.05 |    69.09 |      50 |   55.05 |                   
  ...atContent.tsx |    9.09 |      100 |       0 |    9.09 | 54-275,281-283    
  ...tChatView.tsx |   21.05 |      100 |       0 |   21.05 | 21-39             
  ...tComposer.tsx |   69.48 |    33.33 |   66.66 |   69.48 | ...51,269,277-279 
  AgentFooter.tsx  |   15.38 |      100 |       0 |   15.38 | 28-65             
  AgentHeader.tsx  |   15.38 |      100 |       0 |   15.38 | 27-64             
  AgentTabBar.tsx  |    87.9 |    63.88 |     100 |    87.9 | ...88,110-118,136 
  ...oryAdapter.ts |     100 |    91.83 |     100 |     100 | 103,109-110,138   
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
 ...mponents/arena |    42.3 |    68.69 |   73.68 |    42.3 |                   
  ArenaCards.tsx   |   73.06 |    71.79 |   85.71 |   73.06 | ...83-185,321-326 
  ...ectDialog.tsx |   83.48 |    69.86 |   88.88 |   83.48 | ...88-392,409-410 
  ...artDialog.tsx |       0 |        0 |       0 |       0 | 1-166             
  ...tusDialog.tsx |       0 |        0 |       0 |       0 | 1-288             
  ...topDialog.tsx |       0 |        0 |       0 |       0 | 1-213             
 ...ackground-view |   85.34 |    84.91 |   92.98 |   85.34 |                   
  ...sksDialog.tsx |   81.87 |    82.77 |   85.71 |   81.87 | ...1853,1965-1971 
  ...TasksPill.tsx |   78.84 |    94.28 |     100 |   78.84 | 64,109-129        
  ...gentPanel.tsx |   97.08 |    86.31 |     100 |   97.08 | 132,442-446,520   
  agent-forest.ts  |    99.2 |    93.93 |     100 |    99.2 | 258               
  ...Visibility.ts |     100 |      100 |     100 |     100 |                   
  ...e-overlay.tsx |    88.2 |    76.47 |     100 |    88.2 | ...36-138,140-142 
 ...nts/extensions |   84.32 |    76.78 |   83.33 |   84.32 |                   
  ...gerDialog.tsx |   82.15 |    76.08 |     100 |   82.15 | ...91-198,258,260 
  TabBar.tsx       |   97.29 |    88.88 |     100 |   97.29 | 33                
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...tensions/steps |   46.26 |       85 |   58.82 |   46.26 |                   
  ...ctionStep.tsx |   95.12 |    92.85 |   85.71 |   95.12 | 84-86,89          
  ...etailStep.tsx |       0 |        0 |       0 |       0 | 1-145             
  ...nListStep.tsx |   75.26 |    88.37 |   66.66 |   75.26 | ...53,174,203-209 
  ...electStep.tsx |       0 |        0 |       0 |       0 | 1-83              
  ...nfirmStep.tsx |   16.32 |      100 |       0 |   16.32 | 28-74             
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
 ...xtensions/tabs |   71.92 |    68.21 |   70.83 |   71.92 |                   
  DiscoverTab.tsx  |   68.22 |    67.66 |   55.55 |   68.22 | ...93,656-660,664 
  InstalledTab.tsx |   75.49 |    67.44 |   83.33 |   75.49 | ...77,782-783,820 
  SourcesTab.tsx   |   71.67 |    70.47 |   77.77 |   71.67 | ...28,547,621-633 
 ...tensions/views |   50.97 |    52.38 |   20.83 |   50.97 |                   
  ...tionsView.tsx |   73.75 |    56.36 |   66.66 |   73.75 | ...30,353,369-374 
  ...tionsView.tsx |   43.45 |    44.82 |    6.66 |   43.45 | ...98-405,408-420 
  ...etailView.tsx |    9.56 |      100 |       0 |    9.56 | 40-67,70-158      
 ...mponents/hooks |   87.11 |    81.37 |   91.89 |   87.11 |                   
  ...rListBody.tsx |   95.29 |    85.18 |     100 |   95.29 | 95-98             
  ...etailStep.tsx |   75.32 |    71.42 |      60 |   75.32 | ...56-169,173-186 
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entHeader.tsx |     100 |    85.71 |     100 |     100 | 47                
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...abledStep.tsx |     100 |      100 |     100 |     100 |                   
  ...sListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   72.29 |    70.49 |     100 |   72.29 | ...51,563-568,572 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-13              
  ...erGrouping.ts |     100 |      100 |     100 |     100 |                   
  sourceLabels.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...components/mcp |   40.91 |    63.44 |   70.58 |   40.91 |                   
  ...ealthPill.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   32.09 |    26.19 |      40 |   32.09 | ...12,914,927-933 
  ...valDialog.tsx |   15.06 |      100 |       0 |   15.06 | 40-109            
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-35              
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |      97 |       95 |     100 |      97 | 24,113-114        
 ...ents/mcp/steps |   53.94 |    73.51 |   57.14 |   53.94 |                   
  ...icateStep.tsx |    5.65 |      100 |       0 |    5.65 | 40-66,69-308      
  ...electStep.tsx |   10.95 |      100 |       0 |   10.95 | 16-88             
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...eListStep.tsx |   99.09 |    97.36 |     100 |   99.09 | 71                
  ...etailStep.tsx |   62.83 |       60 |   33.33 |   62.83 | ...87-296,307-332 
  ...rListStep.tsx |   88.53 |    81.25 |     100 |   88.53 | ...64,170,175-180 
  ...etailStep.tsx |    10.3 |      100 |       0 |    10.3 | ...1,67-79,82-140 
  ToolListStep.tsx |   69.29 |       50 |     100 |   69.29 | ...23,126,135-144 
 ...nents/messages |   90.26 |    86.88 |   85.57 |   90.26 |                   
  ...ionDialog.tsx |   89.23 |     84.9 |   81.81 |   89.23 | ...75,593,611-613 
  BtwMessage.tsx   |     100 |      100 |     100 |     100 |                   
  ...upDisplay.tsx |     100 |    94.73 |     100 |     100 | ...43,289,402,432 
  ...onMessage.tsx |   92.06 |    82.35 |     100 |   92.06 | 58-60,62,64       
  ...nMessages.tsx |   94.11 |    95.91 |   76.92 |   94.11 | ...47-349,352-355 
  DiffRenderer.tsx |   93.17 |    86.02 |     100 |   93.17 | ...07,235-236,302 
  ...tsDisplay.tsx |   97.08 |    77.77 |     100 |   97.08 | 95,97,106         
  ...usMessage.tsx |   81.73 |     65.9 |      75 |   81.73 | ...10-214,222,245 
  ...tsDisplay.tsx |   95.52 |    88.31 |     100 |   95.52 | ...40,142,175-180 
  ...ssMessage.tsx |    12.5 |      100 |       0 |    12.5 | 18-59             
  ...edMessage.tsx |   21.05 |      100 |       0 |   21.05 | 23-39             
  ...sMessages.tsx |   59.04 |       50 |    37.5 |   59.04 | ...21-126,147-159 
  ...ryMessage.tsx |   13.63 |      100 |       0 |   13.63 | 23-64             
  ...onMessage.tsx |   91.87 |    82.51 |     100 |   91.87 | ...49-651,658-660 
  ...upMessage.tsx |   98.38 |    95.38 |     100 |   98.38 | 188-191,422       
  ToolMessage.tsx  |   93.06 |    86.32 |   93.75 |   93.06 | ...1037,1082-1084 
 ...ponents/shared |   86.29 |    82.41 |   94.17 |   86.29 |                   
  ...ctionList.tsx |     100 |      100 |      75 |     100 |                   
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  EnumSelector.tsx |     100 |    96.42 |     100 |     100 | 58                
  ...rBoundary.tsx |     100 |      100 |     100 |     100 |                   
  MaxSizedBox.tsx  |   84.71 |    86.95 |      90 |   84.71 | ...67-568,685-686 
  MultiSelect.tsx  |   93.58 |       75 |     100 |   93.58 | ...43,199-201,211 
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  ...ontroller.tsx |     100 |    83.33 |     100 |     100 | 73,93-95          
  ...eSelector.tsx |     100 |       60 |     100 |     100 | 40-45             
  ...lableList.tsx |   81.48 |    84.84 |     100 |   81.48 | 46-66,73-76       
  StaticRender.tsx |     100 |      100 |     100 |     100 |                   
  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 |   91.49 |    86.66 |   83.33 |   91.49 | ...18-846,859,959 
  text-buffer.ts   |   85.98 |    81.81 |   97.91 |   85.98 | ...2664,2762-2763 
  ...er-actions.ts |   73.93 |    67.22 |     100 |   73.93 | ...32-733,934-936 
 ...ponents/skills |       0 |        0 |       0 |       0 |                   
  ...gerDialog.tsx |       0 |        0 |       0 |       0 | 1-681             
 ...ents/subagents |       0 |        0 |       0 |       0 |                   
  constants.ts     |       0 |        0 |       0 |       0 | 1-71              
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
  reducers.tsx     |       0 |        0 |       0 |       0 | 1-190             
  types.ts         |       0 |        0 |       0 |       0 | 1-125             
  utils.ts         |       0 |        0 |       0 |       0 | 1-102             
 ...bagents/create |       0 |        0 |       0 |       0 |                   
  ...ionWizard.tsx |       0 |        0 |       0 |       0 | 1-299             
  ...rSelector.tsx |       0 |        0 |       0 |       0 | 1-85              
  ...onSummary.tsx |       0 |        0 |       0 |       0 | 1-331             
  ...tionInput.tsx |       0 |        0 |       0 |       0 | 1-177             
  ...dSelector.tsx |       0 |        0 |       0 |       0 | 1-63              
  ...nSelector.tsx |       0 |        0 |       0 |       0 | 1-58              
  ...EntryStep.tsx |       0 |        0 |       0 |       0 | 1-78              
  ToolSelector.tsx |       0 |        0 |       0 |       0 | 1-253             
 ...bagents/manage |   14.14 |    53.19 |    37.5 |   14.14 |                   
  ...ctionStep.tsx |       0 |        0 |       0 |       0 | 1-103             
  ...eleteStep.tsx |       0 |        0 |       0 |       0 | 1-62              
  ...tEditStep.tsx |       0 |        0 |       0 |       0 | 1-124             
  ...ctionStep.tsx |   35.61 |    59.52 |     100 |   35.61 | ...21-433,438-440 
  ...iewerStep.tsx |       0 |        0 |       0 |       0 | 1-73              
  ...gerDialog.tsx |       0 |        0 |       0 |       0 | 1-341             
 ...mponents/views |    70.1 |    72.89 |   61.11 |    70.1 |                   
  ContextUsage.tsx |   71.49 |    64.86 |      80 |   71.49 | ...30-436,473-567 
  DoctorReport.tsx |     9.8 |      100 |       0 |     9.8 | 25-54,57-131      
  ...sionsList.tsx |   88.05 |       75 |     100 |   88.05 | 70-77             
  McpStatus.tsx    |   92.01 |     73.8 |     100 |   92.01 | ...36,175-177,262 
  SkillsList.tsx   |   20.51 |      100 |       0 |   20.51 | 17-20,27-57       
  ToolsList.tsx    |     100 |      100 |     100 |     100 |                   
 src/ui/contexts   |   84.16 |    81.83 |   85.13 |   84.16 |                   
  ...ewContext.tsx |   64.83 |    88.88 |      50 |   64.83 | ...16-219,225-235 
  AppContext.tsx   |      80 |       50 |     100 |      80 | 19-20             
  ...ewContext.tsx |   93.83 |    68.51 |   42.85 |   93.83 | ...44,281-285,317 
  ...igContext.tsx |   81.81 |       50 |     100 |   81.81 | 15-16             
  ...ssContext.tsx |   85.65 |    84.85 |     100 |   85.65 | ...1612-1614,1620 
  ...owContext.tsx |   91.07 |    81.81 |     100 |   91.07 | 47-48,60-62       
  ...deContext.tsx |     100 |      100 |      50 |     100 |                   
  ...onContext.tsx |   80.77 |       80 |    92.3 |   80.77 | ...31-434,443-446 
  ...gsContext.tsx |     100 |      100 |     100 |     100 |                   
  ...usContext.tsx |     100 |      100 |     100 |     100 |                   
  ...ngContext.tsx |   71.42 |       50 |     100 |   71.42 | 17-20             
  ...utContext.tsx |   85.71 |      100 |   66.66 |   85.71 | 13-14             
  ...edContext.tsx |     100 |      100 |      50 |     100 |                   
  ...nsContext.tsx |   88.88 |       50 |     100 |   88.88 | 156-157           
  ...teContext.tsx |   86.66 |       50 |     100 |   86.66 | 235-236           
  ...deContext.tsx |      80 |     87.5 |      75 |      80 | ...11-112,118-120 
  ...rtContext.tsx |     100 |      100 |     100 |     100 |                   
 src/ui/daemon     |   88.35 |    73.51 |   95.45 |   88.35 |                   
  ...ui-adapter.ts |   88.35 |    73.51 |   95.45 |   88.35 | ...74,792-793,879 
 src/ui/editors    |       0 |        0 |       0 |       0 |                   
  ...ngsManager.ts |       0 |        0 |       0 |       0 | 1-67              
 src/ui/hooks      |   85.49 |    82.94 |   88.01 |   85.49 |                   
  ...dProcessor.ts |   85.53 |    85.13 |     100 |   85.53 | ...-970,1017-1018 
  ...ention-ref.ts |   97.72 |       84 |     100 |   97.72 | 65                
  keyToAnsi.ts     |    3.92 |      100 |       0 |    3.92 | 19-77             
  ...esourceRef.ts |     100 |      100 |     100 |     100 |                   
  ...completion.ts |     100 |    95.45 |     100 |     100 | 95                
  ...ention-ref.ts |     100 |      100 |     100 |     100 |                   
  ...dProcessor.ts |   94.62 |    73.58 |     100 |   94.62 | ...87-288,293-294 
  ...dProcessor.ts |   85.75 |     68.4 |   81.81 |   85.75 | ...1464,1485-1489 
  ...rt-command.ts |     100 |      100 |     100 |     100 |                   
  ...sced-flush.ts |     100 |      100 |     100 |     100 |                   
  ...ng-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...oice-input.ts |   92.36 |    81.95 |   66.66 |   92.36 | ...00,502-503,658 
  ...ke-repaint.ts |     100 |      100 |     100 |     100 |                   
  ...amingState.ts |   12.22 |      100 |       0 |   12.22 | 54-157            
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...dScrollbar.ts |     100 |      100 |     100 |     100 |                   
  ...ationFrame.ts |      52 |    63.63 |     100 |      52 | ...59,67-70,76-87 
  ...odeCommand.ts |   58.82 |      100 |     100 |   58.82 | 28,33-48          
  ...enaCommand.ts |      85 |      100 |     100 |      85 | 23-24,29          
  ...aInProcess.ts |   27.92 |       80 |      25 |   27.92 | ...69-170,173-175 
  ...Completion.ts |   86.44 |    88.48 |     100 |   86.44 | ...14-515,525-541 
  ...ifications.ts |   87.82 |    96.77 |     100 |   87.82 | 138-152           
  ...tIndicator.ts |   88.28 |    81.57 |     100 |   88.28 | ...66,175,179-187 
  ...waySummary.ts |   96.26 |       75 |     100 |   96.26 | 126-128,170       
  ...ndTaskView.ts |   94.89 |    77.55 |     100 |   94.89 | 164-168,257,263   
  ...chedScroll.ts |     100 |      100 |     100 |     100 |                   
  ...ketedPaste.ts |    23.8 |      100 |       0 |    23.8 | 19-37             
  ...nchCommand.ts |   95.45 |    83.01 |     100 |   95.45 | ...60-161,285-288 
  ...ompletion.tsx |   97.09 |    87.09 |     100 |   97.09 | ...23-324,334-335 
  ...dMigration.ts |    92.1 |    88.88 |     100 |    92.1 | 42-44             
  useCompletion.ts |   96.29 |    90.56 |     100 |   96.29 | ...17-218,222-223 
  ...nitMessage.ts |     100 |      100 |     100 |     100 |                   
  ...extualTips.ts |   78.26 |       50 |     100 |   78.26 | ...2,75-79,96-104 
  ...eteCommand.ts |   89.52 |    90.69 |     100 |   89.52 | ...98-106,114-115 
  ...ialogClose.ts |   36.11 |       10 |     100 |   36.11 | ...89-195,202-207 
  useDiffData.ts   |       0 |        0 |       0 |       0 | 1-87              
  ...oublePress.ts |   53.12 |       75 |     100 |   53.12 | 33-35,41-54       
  ...orSettings.ts |     100 |      100 |     100 |     100 |                   
  ...Completion.ts |   99.12 |    97.67 |     100 |   99.12 | 182-183           
  ...ionUpdates.ts |   93.72 |    92.98 |     100 |   93.72 | ...87-291,314-320 
  ...agerDialog.ts |   88.88 |      100 |     100 |   88.88 | 21,25             
  ...backDialog.ts |    63.9 |    76.47 |   66.66 |    63.9 | ...66-168,190-191 
  useFocus.ts      |     100 |      100 |     100 |     100 |                   
  ...olderTrust.ts |     100 |    93.33 |     100 |     100 | 62                
  ...ggestions.tsx |   96.47 |    78.94 |     100 |   96.47 | 121,155-156       
  ...miniStream.ts |   86.08 |    81.23 |   76.92 |   86.08 | ...5198-5200,5202 
  ...BranchName.ts |     100 |    94.44 |     100 |     100 | 54                
  ...oryManager.ts |   98.38 |    98.85 |     100 |   98.38 | 141-144           
  ...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 |   22.58 |      100 |      50 |   22.58 | 11-32,44-85       
  ...gIndicator.ts |     100 |    96.66 |     100 |     100 | 109               
  useLogger.ts     |      16 |      100 |       0 |      16 | 15-45             
  useMCPHealth.ts  |   10.52 |      100 |       0 |   10.52 | 36-75             
  ...cpApproval.ts |   93.12 |    86.11 |     100 |   93.12 | ...24-127,139-140 
  useMcpDialog.ts  |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...moryDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...oryMonitor.ts |   83.14 |    78.57 |     100 |   83.14 | 54-63,74-79       
  ...ssageQueue.ts |     100 |     97.4 |     100 |     100 | 175,262           
  ...delCommand.ts |     100 |       96 |     100 |     100 | 61                
  ...ouseEvents.ts |   94.89 |       95 |   83.33 |   94.89 | 78-82             
  ...raseCycler.ts |   84.74 |    76.47 |     100 |   84.74 | ...49,52-53,69-71 
  ...rredEditor.ts |   58.33 |    22.22 |     100 |   58.33 | 23-27,29-33       
  ...derUpdates.ts |    87.4 |    78.78 |     100 |    87.4 | ...71,321-333,381 
  useQwenAuth.ts   |     100 |      100 |     100 |     100 |                   
  ...lScheduler.ts |   89.48 |    88.88 |     100 |   89.48 | ...54-456,489-499 
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-7               
  ...umeCommand.ts |   95.26 |    77.14 |     100 |   95.26 | 120-121,223-228   
  ...ompletion.tsx |   90.67 |    83.33 |     100 |   90.67 | ...02,105,138-141 
  ...ectionList.ts |   97.12 |    96.19 |     100 |   97.12 | ...92-193,247-250 
  ...sionPicker.ts |   92.87 |    90.35 |     100 |   92.87 | ...99-501,503-505 
  ...earchInput.ts |     100 |    97.29 |     100 |     100 | 82                
  ...ngsCommand.ts |   18.75 |      100 |       0 |   18.75 | 10-25             
  ...ellHistory.ts |   93.28 |    80.95 |     100 |   93.28 | ...96,153-154,164 
  ...oryCommand.ts |   85.48 |    58.33 |     100 |   85.48 | 22-28,40,71       
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...Completion.ts |   82.85 |    85.13 |   94.73 |   82.85 | ...78-680,688-724 
  ...tateAndRef.ts |     100 |      100 |     100 |     100 |                   
  ...tatsDialog.ts |     100 |      100 |     100 |     100 |                   
  useStatusLine.ts |   97.13 |    93.33 |     100 |   97.13 | ...78-382,478-485 
  ...eateDialog.ts |   88.23 |      100 |     100 |   88.23 | 14,18             
  ...mInProcess.ts |   27.35 |       80 |      25 |   27.35 | ...82-183,186-188 
  ...tification.ts |     100 |     87.5 |     100 |     100 | 50                
  ...alProgress.ts |   67.34 |    58.82 |   66.66 |   67.34 | 52-53,61-68,79-85 
  ...rminalSize.ts |     100 |      100 |     100 |     100 |                   
  ...emeCommand.ts |   67.01 |    29.41 |     100 |   67.01 | ...10-111,115-116 
  useTimer.ts      |   97.59 |    94.73 |     100 |   97.59 | 17-18             
  ...lMigration.ts |       0 |        0 |       0 |       0 |                   
  ...rustModify.ts |     100 |    90.47 |     100 |     100 | 112,134           
  useTurnDiffs.ts  |   95.12 |    78.57 |     100 |   95.12 | 133-134,156-157   
  ...elcomeBack.ts |   87.36 |     90.9 |     100 |   87.36 | ...,94-96,114-115 
  ...reeSession.ts |   93.75 |       70 |     100 |   93.75 | 47-48,72          
  vim.ts           |      74 |    67.56 |   69.23 |      74 | ...1854-1861,1869 
 src/ui/layouts    |    91.2 |    89.47 |     100 |    91.2 |                   
  ...AppLayout.tsx |    90.9 |     87.5 |     100 |    90.9 | 60-62,110-115,151 
  ...AppLayout.tsx |   91.66 |    92.85 |     100 |   91.66 | 75-80             
 src/ui/models     |   80.72 |       80 |   71.42 |   80.72 |                   
  ...ableModels.ts |   80.72 |       80 |   71.42 |   80.72 | ...,61-71,125-127 
 ...noninteractive |     100 |      100 |    6.66 |     100 |                   
  ...eractiveUi.ts |     100 |      100 |    6.66 |     100 |                   
 src/ui/selection  |   86.47 |    79.88 |   96.66 |   86.47 |                   
  screen-buffer.ts |   94.73 |    64.28 |     100 |   94.73 | 51-52             
  ...ion-coords.ts |     100 |      100 |     100 |     100 |                   
  ...ction-span.ts |   92.72 |       90 |     100 |   92.72 | 37-38,67-68       
  ...tion-state.ts |   85.71 |      100 |   88.88 |   85.71 | 51-58             
  ...ction-text.ts |   92.85 |    92.45 |     100 |   92.85 | 30-34,114-115     
  ...selection.tsx |   80.31 |    59.64 |     100 |   80.31 | ...13-314,330-331 
 src/ui/state      |      95 |    81.81 |     100 |      95 |                   
  extensions.ts    |      95 |    81.81 |     100 |      95 | 69-70,89          
 src/ui/themes     |    98.5 |    73.17 |     100 |    98.5 |                   
  ansi-light.ts    |     100 |      100 |     100 |     100 |                   
  ansi.ts          |     100 |      100 |     100 |     100 |                   
  atom-one-dark.ts |     100 |      100 |     100 |     100 |                   
  ayu-light.ts     |     100 |      100 |     100 |     100 |                   
  ayu.ts           |     100 |      100 |     100 |     100 |                   
  color-utils.ts   |   99.23 |    97.05 |     100 |   99.23 | 277-278           
  default-light.ts |     100 |      100 |     100 |     100 |                   
  default.ts       |     100 |      100 |     100 |     100 |                   
  ...inal-theme.ts |   88.59 |    85.96 |     100 |   88.59 | ...57-261,266-270 
  dracula.ts       |     100 |      100 |     100 |     100 |                   
  github-dark.ts   |     100 |      100 |     100 |     100 |                   
  github-light.ts  |     100 |      100 |     100 |     100 |                   
  googlecode.ts    |     100 |      100 |     100 |     100 |                   
  no-color.ts      |     100 |      100 |     100 |     100 |                   
  qwen-dark.ts     |     100 |      100 |     100 |     100 |                   
  qwen-light.ts    |     100 |      100 |     100 |     100 |                   
  ...tic-tokens.ts |     100 |      100 |     100 |     100 |                   
  ...-of-purple.ts |     100 |      100 |     100 |     100 |                   
  theme-manager.ts |   88.68 |    84.52 |     100 |   88.68 | ...83-392,397-398 
  theme.ts         |     100 |    38.02 |     100 |     100 | ...34-449,457-461 
  xcode.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/utils      |   87.07 |    85.21 |    95.6 |   87.07 |                   
  ...Colorizer.tsx |   80.31 |    85.41 |     100 |   80.31 | ...00-201,313-339 
  ...nRenderer.tsx |   79.84 |     75.6 |     100 |   79.84 | ...66,270,328-329 
  ...wnDisplay.tsx |   92.87 |    93.46 |     100 |   92.87 | ...,955,1002-1020 
  ...idDiagram.tsx |   87.79 |    95.34 |     100 |   87.79 | 156-179           
  ...eRenderer.tsx |   92.38 |    81.91 |   95.23 |   92.38 | ...43-746,799-804 
  ...odeDisplay.ts |   94.28 |    85.71 |     100 |   94.28 | 23,40             
  asciiCharts.ts   |    96.7 |     87.5 |     100 |    96.7 | 170-177,278       
  ...dWorkUtils.ts |     100 |      100 |     100 |     100 |                   
  ...boardUtils.ts |   52.52 |    73.25 |   91.66 |   52.52 | ...23,626-635,638 
  commandUtils.ts  |   96.17 |    88.88 |     100 |   96.17 | ...77,179-180,323 
  computeStats.ts  |     100 |      100 |     100 |     100 |                   
  customBanner.ts  |   90.68 |    91.22 |     100 |   90.68 | ...13,324-327,334 
  displayUtils.ts  |   73.84 |    73.91 |     100 |   73.84 | ...34,36-40,42-46 
  formatters.ts    |   94.87 |    98.18 |     100 |   94.87 | 116-119           
  goal-runtime.ts  |   91.42 |       95 |     100 |   91.42 | 32-34             
  gradientUtils.ts |     100 |      100 |     100 |     100 |                   
  highlight.ts     |     100 |      100 |     100 |     100 |                   
  ...gap-notice.ts |     100 |      100 |     100 |     100 |                   
  ...oryMapping.ts |     100 |       95 |     100 |     100 | 44,103            
  historyUtils.ts  |   96.03 |     97.1 |     100 |   96.03 | 103-106           
  ...mage-parts.ts |   97.75 |    94.87 |     100 |   97.75 | 82-83             
  inline-math.ts   |   98.48 |    95.23 |     100 |   98.48 | 129-130           
  input-mouse.ts   |     100 |    85.71 |     100 |     100 | 48,93             
  isNarrowWidth.ts |     100 |      100 |     100 |     100 |                   
  ...olDetector.ts |   68.81 |       75 |   66.66 |   68.81 | ...27-132,160-161 
  latexRenderer.ts |   94.95 |     73.8 |     100 |   94.95 | ...76-178,184-187 
  layoutUtils.ts   |     100 |      100 |     100 |     100 |                   
  list-mouse.ts    |     100 |      100 |     100 |     100 |                   
  ...ightLoader.ts |     100 |       95 |     100 |     100 | 81                
  ...nUtilities.ts |   98.72 |    94.36 |     100 |   98.72 | 145-146           
  ...t-position.ts |     100 |     87.5 |     100 |     100 | 85                
  ...geRenderer.ts |   86.51 |    70.16 |   95.12 |   86.51 | ...1286,1326-1332 
  ...alRenderer.ts |   86.69 |     71.9 |     100 |   86.69 | ...1476,1513-1519 
  ...lsBySource.ts |     100 |    95.23 |     100 |     100 | 84                
  mouse.ts         |   92.85 |    74.19 |     100 |   92.85 | ...38,145,149-152 
  osc8.ts          |   90.43 |    78.33 |     100 |   90.43 | ...59,244,248-249 
  ...red-height.ts |   98.38 |    97.14 |     100 |   98.38 | 195-197           
  ...mConstants.ts |     100 |      100 |     100 |     100 |                   
  restoreGoal.ts   |     100 |      100 |     100 |     100 |                   
  ...storyUtils.ts |   82.73 |    79.48 |     100 |   82.73 | ...84-606,737-738 
  ...ickerUtils.ts |     100 |      100 |     100 |     100 |                   
  ...evel-label.ts |   77.77 |    66.66 |     100 |   77.77 | 18,22-24          
  ...are-cursor.ts |   89.47 |    85.71 |     100 |   89.47 | 39-44             
  ...ataService.ts |   93.17 |     79.1 |     100 |   93.17 | ...14,227,254-256 
  suggestions.ts   |     100 |      100 |     100 |     100 |                   
  ...izedOutput.ts |   94.94 |      100 |   88.88 |   94.94 | 112-117           
  ...nal-buffer.ts |     100 |      100 |     100 |     100 |                   
  ...e-renderer.ts |   90.61 |    83.44 |     100 |   90.61 | ...80,482-484,607 
  ...wOptimizer.ts |     100 |    96.77 |     100 |     100 | 69                
  terminalSetup.ts |    4.37 |      100 |       0 |    4.37 | 44-393            
  textUtils.ts     |   97.94 |    95.45 |   94.11 |   97.94 | ...82-283,443-444 
  ...background.ts |     100 |      100 |     100 |     100 |                   
  todoSnapshot.ts  |   90.42 |    92.85 |     100 |   90.42 | ...06-207,240-241 
  ...isplay-map.ts |     100 |      100 |     100 |     100 |                   
  updateCheck.ts   |     100 |    92.75 |     100 |     100 | 227-239,331       
  ...ow-keyword.ts |     100 |      100 |     100 |     100 |                   
 ...i/utils/export |   75.03 |     60.3 |   94.59 |   75.03 |                   
  collect.ts       |   71.27 |    66.38 |      96 |   71.27 | ...90-633,655-656 
  index.ts         |     100 |      100 |     100 |     100 |                   
  normalize.ts     |   80.42 |    50.68 |     100 |   80.42 | ...59-364,376-378 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
  utils.ts         |     100 |      100 |     100 |     100 |                   
 ...ort/formatters |   52.92 |    47.22 |   71.42 |   52.92 |                   
  html.ts          |   84.61 |       50 |     100 |   84.61 | ...53,57-58,62-63 
  json.ts          |     100 |      100 |     100 |     100 |                   
  jsonl.ts         |   82.45 |     37.5 |     100 |   82.45 | ...48,50-51,65-66 
  markdown.ts      |   36.32 |    47.05 |      50 |   36.32 | ...16-219,233-295 
 src/ui/voice      |   81.27 |    79.92 |   81.94 |   81.27 |                   
  ...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.09 |     92.1 |     100 |   91.09 | ...99,305,316-319 
  sox-recorder.ts  |    92.7 |    71.87 |     100 |    92.7 | ...34-135,153-154 
  ...ailability.ts |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |     100 |      100 |     100 |     100 |                   
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  ...e-recorder.ts |   88.29 |    67.74 |   81.81 |   88.29 | ...,98-99,112,115 
  voice-refine.ts  |     100 |    93.33 |     100 |     100 | 92                
  ...ream-retry.ts |   86.79 |       70 |     100 |   86.79 | 16-18,48-49,59-60 
  ...am-session.ts |   88.02 |    66.66 |   84.61 |   88.02 | ...26,343-345,363 
  ...ranscriber.ts |     100 |      100 |     100 |     100 |                   
 src/utils         |    81.5 |    87.04 |   92.57 |    81.5 |                   
  ...p-profiler.ts |   98.39 |    92.59 |     100 |   98.39 | 141,185,235       
  acpModelUtils.ts |   97.36 |    95.19 |     100 |   97.36 | ...09-210,214-215 
  apiPreconnect.ts |   96.74 |    94.59 |     100 |   96.74 | 167-170           
  ...ol-call-id.ts |   84.61 |       60 |     100 |   84.61 | 26-27,37-38       
  ...ng-failure.ts |     100 |       95 |     100 |     100 | 72                
  checks.ts        |   33.33 |      100 |       0 |   33.33 | 23-28             
  ...-api-error.ts |     100 |    96.42 |     100 |     100 | 14                
  cleanup.ts       |   84.05 |    94.11 |      80 |   84.05 | 80,111-121        
  commands.ts      |   97.45 |    96.66 |     100 |   97.45 | 153-155           
  ...Calculator.ts |     100 |      100 |     100 |     100 |                   
  cpuProfiler.ts   |   70.73 |    73.23 |   88.88 |   70.73 | ...27,430-431,438 
  deepMerge.ts     |     100 |    89.65 |     100 |     100 | 41-43,49          
  ...re-runtime.ts |     100 |      100 |     100 |     100 |                   
  ...ScopeUtils.ts |   97.56 |    88.88 |     100 |   97.56 | 67                
  doctorChecks.ts  |   70.31 |    74.57 |     100 |   70.31 | ...95-301,325-341 
  ...putCapture.ts |   90.65 |    86.31 |     100 |   90.65 | ...73,371,373-374 
  ...arResolver.ts |   97.14 |    96.55 |     100 |   97.14 | 125-126           
  errors.ts        |   97.56 |    94.64 |     100 |   97.56 | 69-70,304-305     
  events.ts        |     100 |      100 |     100 |     100 |                   
  ...on-mention.ts |   88.48 |     82.6 |     100 |   88.48 | ...56-160,164-168 
  gitUtils.ts      |   92.85 |    86.66 |     100 |   92.85 | ...13-116,164-167 
  ...AutoUpdate.ts |    93.1 |       94 |      90 |    93.1 | 103,108,179-190   
  ...tyWarnings.ts |     100 |      100 |     100 |     100 |                   
  ...lationInfo.ts |   97.68 |    94.28 |     100 |   97.68 | ...64,381-382,427 
  jsonc-editor.ts  |   93.18 |    92.72 |     100 |   93.18 | ...80-381,384-385 
  languageUtils.ts |   98.88 |    97.05 |     100 |   98.88 | 184-185           
  load-undici.ts   |     100 |      100 |     100 |     100 |                   
  ...npm-update.ts |   89.31 |    77.33 |     100 |   89.31 | ...87,303-304,344 
  math.ts          |       0 |        0 |       0 |       0 | 1-15              
  ...er-mention.ts |     100 |    66.66 |     100 |     100 | 14,30,44-46       
  ...iagnostics.ts |   94.57 |    83.01 |   88.88 |   94.57 | ...05,311,315-317 
  ...serMessage.ts |     100 |      100 |     100 |     100 |                   
  ...onfigUtils.ts |   94.25 |    91.17 |     100 |   94.25 | ...30,436,439-443 
  ...iveHelpers.ts |   95.13 |    91.79 |     100 |   95.13 | ...53-454,552,565 
  osc.ts           |   97.18 |      100 |    87.5 |   97.18 | 182-183           
  package.ts       |   88.88 |    85.71 |     100 |   88.88 | 31-32             
  ...uggestions.ts |   84.29 |    70.83 |     100 |   84.29 | 70-76,92-103      
  processUtils.ts  |    92.3 |       80 |     100 |    92.3 | 45-46             
  readStdin.ts     |   93.67 |    94.11 |   85.71 |   93.67 | 79-83             
  relaunch.ts      |   95.87 |    89.28 |     100 |   95.87 | 103-105,131       
  resolvePath.ts   |     100 |      100 |     100 |     100 |                   
  runBudget.ts     |   99.35 |    96.77 |     100 |   99.35 | 119               
  sandbox-path.ts  |     100 |      100 |     100 |     100 |                   
  sandbox.ts       |   45.87 |    56.93 |   76.92 |   45.87 | ...1040,1052-1075 
  ...xImageName.ts |     100 |    77.77 |     100 |     100 | 10,18             
  sandboxMounts.ts |     100 |      100 |     100 |     100 |                   
  sessionPaths.ts  |   90.84 |    90.56 |     100 |   90.84 | ...81-182,185-186 
  settingsUtils.ts |   82.35 |    89.57 |      90 |   82.35 | ...25-743,750-758 
  spawnWrapper.ts  |     100 |      100 |     100 |     100 |                   
  ...ate-verify.ts |     100 |      100 |     100 |     100 |                   
  ...one-update.ts |   39.81 |    77.44 |   62.16 |   39.81 | ...1193,1196-1215 
  ...upProfiler.ts |   98.47 |    94.66 |     100 |   98.47 | 132-133,308       
  ...upWarnings.ts |     100 |      100 |     100 |     100 |                   
  stdioHelpers.ts  |     100 |       90 |     100 |     100 | 23                
  systemInfo.ts    |   95.12 |    90.27 |     100 |   95.12 | ...54-255,260-264 
  ...InfoFields.ts |    87.5 |    65.85 |     100 |    87.5 | ...24-125,146-147 
  ...alSequence.ts |     100 |    97.61 |     100 |     100 | 60                
  ...iffPreview.ts |   76.47 |       25 |     100 |   76.47 | 13,17,23-24       
  ...on-handler.ts |    73.8 |       75 |     100 |    73.8 | 17-18,25-26,67-73 
  ...e-relaunch.ts |   89.61 |    86.66 |      50 |   89.61 | 56-61,83-84       
  ...entEmitter.ts |     100 |      100 |     100 |     100 |                   
  ...ansionHook.ts |     100 |      100 |     100 |     100 |                   
  ...upWarnings.ts |   87.75 |       75 |     100 |   87.75 | 47-48,53-54,57-58 
  version.ts       |     100 |    66.66 |     100 |     100 | 11                
  ...ingHandler.ts |     100 |      100 |     100 |     100 |                   
  windowTitle.ts   |   95.45 |    93.33 |     100 |   95.45 | 54-55             
  ...WithBackup.ts |   65.04 |    77.77 |     100 |   65.04 | 97,112,133-172    
 ...s/housekeeping |   91.63 |    91.02 |      95 |   91.63 |                   
  cleanup.ts       |   95.77 |    95.83 |     100 |   95.77 | 70-72             
  ...eractionAt.ts |     100 |      100 |     100 |     100 |                   
  scheduler.ts     |   91.91 |    90.47 |    87.5 |   91.91 | 58-62,73,131-135  
  throttledOnce.ts |   86.66 |     86.2 |     100 |   86.66 | ...99,105,137-138 
-------------------|---------|----------|---------|---------|-------------------
Core Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   87.83 |    86.37 |   89.37 |   87.83 |                   
 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.38 |    84.54 |   94.85 |   90.38 |                   
  ...transcript.ts |   87.63 |    83.52 |     100 |   87.63 | ...80,588,594-598 
  ...ent-resume.ts |   85.59 |    77.55 |   83.33 |   85.59 | ...1793-1797,1800 
  ...ound-tasks.ts |   94.63 |    90.13 |   96.38 |   94.63 | ...1773,1793-1796 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ent-result.ts |    96.8 |    92.68 |     100 |    96.8 | 106,129-131       
  ...n-registry.ts |   94.79 |     87.7 |     100 |   94.79 | ...1067,1081-1083 
  ...w-snapshot.ts |   92.12 |    77.14 |     100 |   92.12 | ...65,189,196-198 
 src/agents/arena  |   76.32 |    67.71 |   78.94 |   76.32 |                   
  ...gentClient.ts |   79.47 |    88.88 |   81.81 |   79.47 | ...68-183,189-204 
  ArenaManager.ts  |   75.11 |    64.51 |   78.57 |   75.11 | ...1887,1893-1894 
  arena-events.ts  |   64.44 |      100 |      50 |   64.44 | ...71-175,178-183 
  diff-summary.ts  |    87.5 |    72.34 |     100 |    87.5 | ...32-133,137-138 
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...gents/backends |   78.09 |    85.23 |   76.28 |   78.09 |                   
  ITermBackend.ts  |   97.97 |    93.93 |     100 |   97.97 | ...78-180,255,307 
  ...essBackend.ts |    90.9 |    85.36 |   93.33 |    90.9 | ...70,672,674-675 
  TmuxBackend.ts   |    90.7 |    76.55 |   97.36 |    90.7 | ...87,697,743-747 
  detect.ts        |   31.25 |      100 |       0 |   31.25 | 34-88             
  index.ts         |     100 |      100 |     100 |     100 |                   
  iterm-it2.ts     |     100 |     92.1 |     100 |     100 | 37-38,106         
  tmux-commands.ts |    6.64 |      100 |    3.03 |    6.64 | ...93-363,386-503 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...agents/runtime |    91.1 |    86.68 |   89.23 |    91.1 |                   
  agent-context.ts |     100 |      100 |     100 |     100 |                   
  agent-core.ts    |   85.07 |     76.8 |   77.77 |   85.07 | ...2291,2337-2339 
  agent-events.ts  |     100 |      100 |     100 |     100 |                   
  ...t-headless.ts |   93.49 |    89.41 |   83.33 |   93.49 | ...96-497,500-501 
  ...nteractive.ts |   81.01 |    82.35 |   76.66 |   81.01 | ...33,535-538,541 
  ...statistics.ts |   98.29 |    82.55 |     100 |   98.29 | 141,165,206,239   
  agent-types.ts   |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ool-policy.ts |   98.34 |      100 |    92.3 |   98.34 | 81-82             
  ...low-budget.ts |     100 |      100 |     100 |     100 |                   
  ...-scheduler.ts |   97.43 |    96.36 |     100 |   97.43 | 128-130           
  ...ow-journal.ts |   91.76 |    75.86 |     100 |   91.76 | ...38-139,179-181 
  ...chestrator.ts |    92.4 |       90 |   83.78 |    92.4 | ...1862,1911-1914 
  ...ow-prompts.ts |     100 |      100 |     100 |     100 |                   
  ...low-runner.ts |   94.85 |     87.5 |   92.85 |   94.85 | ...93,260,280-283 
  ...ow-sandbox.ts |   96.85 |    91.28 |     100 |   96.85 | ...1705,1711-1712 
  ...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   |   82.04 |    84.17 |   88.97 |   82.04 |                   
  TeamManager.ts   |   72.02 |    79.41 |   79.24 |   72.02 | ...1632,1655-1656 
  identity.ts      |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...sionBridge.ts |     100 |      100 |     100 |     100 |                   
  mailbox.ts       |   96.02 |    87.23 |     100 |   96.02 | 352-358           
  ...ptAddendum.ts |     100 |      100 |     100 |     100 |                   
  tasks.ts         |   89.24 |    82.82 |     100 |   89.24 | ...-994,1038-1039 
  team-events.ts   |   60.52 |      100 |      50 |   60.52 | ...40-144,151-155 
  teamHelpers.ts   |   92.02 |    94.91 |   95.23 |   92.02 | ...31-332,368-378 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...eam/test-utils |   94.39 |    94.26 |   98.21 |   94.39 |                   
  ...on-harness.ts |   96.49 |    84.21 |     100 |   96.49 | 128-129,141-142   
  fake-agent.ts    |   98.49 |    95.08 |     100 |   98.49 | 201-203           
  fake-backend.ts  |   86.46 |    97.61 |   95.83 |   86.46 | 124-146           
 src/config        |   84.98 |    87.13 |   75.37 |   84.98 |                   
  approval-mode.ts |     100 |      100 |     100 |     100 |                   
  ...xtDefaults.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   84.29 |    86.85 |   73.79 |   84.29 | ...8350,8354-8355 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  models.ts        |     100 |      100 |     100 |     100 |                   
  storage.ts       |   94.39 |    91.57 |   88.23 |   94.39 | ...45-446,449-450 
 ...nfirmation-bus |   98.27 |    97.14 |     100 |   98.27 |                   
  message-bus.ts   |   98.14 |    97.05 |     100 |   98.14 | 42-43             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/core          |   92.35 |    88.06 |   93.26 |   92.35 |                   
  baseLlmClient.ts |    88.4 |     83.8 |   81.81 |    88.4 | ...59,672,678-680 
  client.ts        |   91.95 |    87.18 |   91.56 |   91.95 | ...3928,4026-4027 
  ...tGenerator.ts |   86.34 |    87.34 |   84.61 |   86.34 | ...96-497,542-548 
  ...lScheduler.ts |   90.04 |    84.67 |   96.15 |   90.04 | ...6215,6243-6259 
  geminiChat.ts    |    94.7 |    90.12 |   95.53 |    94.7 | ...5052,5100-5101 
  geminiRequest.ts |     100 |      100 |     100 |     100 |                   
  genai-compat.ts  |     100 |      100 |     100 |     100 |                   
  ...MediaLimit.ts |     100 |       96 |     100 |     100 | 96                
  ...htProtocol.ts |    9.09 |      100 |       0 |    9.09 | ...9,62-66,69-110 
  ...ream-error.ts |     100 |      100 |     100 |     100 |                   
  logger.ts        |   87.41 |    87.02 |     100 |   87.41 | ...64-568,614-628 
  ...lay-buffer.ts |     100 |      100 |     100 |     100 |                   
  ...dispatcher.ts |     100 |      100 |     100 |     100 |                   
  ...tyDefaults.ts |     100 |      100 |     100 |     100 |                   
  ...olExecutor.ts |   93.54 |    83.33 |      50 |   93.54 | 49-50             
  ...on-helpers.ts |   93.49 |    78.57 |     100 |   93.49 | ...10-211,228-229 
  ...issionFlow.ts |   98.97 |    96.96 |     100 |   98.97 | 107               
  ...try-policy.ts |     100 |      100 |     100 |     100 |                   
  ...ell-policy.ts |   95.19 |    89.47 |     100 |   95.19 | ...44-245,290-291 
  prompts.ts       |   93.64 |    91.42 |   83.33 |   93.64 | ...1209,1412-1413 
  ...ing-effort.ts |     100 |      100 |     100 |     100 |                   
  ...n-recovery.ts |   95.13 |       80 |     100 |   95.13 | ...06-107,142-144 
  ...t-profiler.ts |    97.9 |    81.15 |   88.23 |    97.9 | 117,124-125,130   
  ...port-retry.ts |     100 |      100 |     100 |     100 |                   
  tokenLimits.ts   |     100 |     92.1 |     100 |     100 | 87,122-139        
  ...reparation.ts |     100 |      100 |     100 |     100 |                   
  ...tion-guard.ts |   90.38 |    94.73 |     100 |   90.38 | 68-72             
  ...allIdUtils.ts |   98.41 |    93.47 |     100 |   98.41 | 36,45             
  ...okTriggers.ts |   99.45 |    92.43 |     100 |   99.45 | 182,193           
  ...terruption.ts |     100 |     92.3 |     100 |     100 | 86,104            
  turn.ts          |   98.67 |    93.12 |     100 |   98.67 | ...79,707-708,755 
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   96.33 |    88.12 |   96.15 |   96.33 |                   
  ...tGenerator.ts |   97.24 |    86.72 |   94.87 |   97.24 | ...1429,1458,1469 
  converter.ts     |   96.19 |    89.25 |     100 |   96.19 | ...1329,1550-1552 
  index.ts         |       0 |        0 |       0 |       0 | 1-21              
  usage.ts         |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   88.78 |    72.36 |   89.47 |   88.78 |                   
  ...tGenerator.ts |   87.18 |    71.83 |   88.88 |   87.18 | ...58-364,382-383 
  index.ts         |     100 |       80 |     100 |     100 | 50                
 ...ntentGenerator |    95.6 |    88.74 |    92.3 |    95.6 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |   95.52 |    87.88 |   91.89 |   95.52 | ...1195-1196,1224 
  ...tDetection.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   91.63 |    90.43 |   95.61 |   91.63 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  converter.ts     |   91.15 |    89.32 |   96.87 |   91.15 | ...1914,2083-2098 
  errorHandler.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |   60.31 |       75 |      50 |   60.31 | ...71,74-78,90-94 
  ...tGenerator.ts |    66.4 |    70.58 |   88.88 |    66.4 | ...51-157,168-169 
  pipeline.ts      |   95.45 |    91.18 |     100 |   95.45 | ...1301,1309,1408 
  ...ix-caching.ts |   95.23 |    92.85 |     100 |   95.23 | 45-46,69-70       
  ...ureContext.ts |     100 |      100 |     100 |     100 |                   
  ...ingOptions.ts |       0 |        0 |       0 |       0 | 1                 
  ...CallParser.ts |   92.24 |     92.4 |     100 |   92.24 | ...28-529,549-552 
  ...kingParser.ts |     100 |    96.87 |     100 |     100 | 42                
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...rator/provider |   97.19 |    90.44 |   98.36 |   97.19 |                   
  dashscope.ts     |   98.36 |    92.99 |   95.65 |   98.36 | ...93-494,636-637 
  deepseek.ts      |   94.91 |    89.36 |     100 |   94.91 | ...31-132,145-146 
  default.ts       |   99.16 |    96.96 |     100 |   99.16 | 198               
  index.ts         |     100 |      100 |     100 |     100 |                   
  mimo.ts          |   94.11 |    66.66 |     100 |   94.11 | 29,52-53          
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  mistral.ts       |   96.07 |    73.33 |     100 |   96.07 | 32-33             
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 |                   
  utils.ts         |     100 |      100 |     100 |     100 |                   
  zai.ts           |   92.13 |    82.14 |     100 |   92.13 | ...,39-40,135-137 
 src/extension     |   87.27 |    84.01 |   92.52 |   87.27 |                   
  ...ive-safety.ts |     100 |      100 |     100 |     100 |                   
  ...-converter.ts |   80.55 |    73.66 |     100 |   80.55 | ...1133,1179-1180 
  corruptFile.ts   |     100 |       50 |     100 |     100 | 40-45             
  ...-converter.ts |     100 |      100 |     100 |     100 |                   
  ...me-refresh.ts |     100 |      100 |     100 |     100 |                   
  ...sion-store.ts |   90.85 |    86.38 |   97.87 |   90.85 | ...1218-1224,1268 
  ...ionManager.ts |   82.24 |    80.14 |   81.52 |   82.24 | ...2730,2752-2753 
  ...references.ts |     100 |     90.9 |     100 |     100 | ...05,129,197,200 
  ...onSettings.ts |    92.3 |     94.4 |     100 |    92.3 | ...98-501,570-571 
  ...-converter.ts |    75.9 |    85.36 |   85.71 |    75.9 | ...98,202,214-248 
  github.ts        |   90.42 |    82.66 |     100 |   90.42 | ...0,990-991,1001 
  http-client.ts   |   84.61 |       80 |     100 |   84.61 | 20-21             
  i18n.ts          |   78.26 |       96 |      50 |   78.26 | 104-110,116-123   
  index.ts         |     100 |      100 |     100 |     100 |                   
  marketplace.ts   |   88.39 |    83.11 |     100 |   88.39 | ...08,494,507-508 
  ...ork-policy.ts |   89.72 |       90 |     100 |   89.72 | ...36,148-154,156 
  npm.ts           |   89.02 |    81.81 |     100 |   89.02 | ...86-688,695-700 
  override.ts      |   94.11 |    93.33 |     100 |   94.11 | 63-64,81-82       
  ...-converter.ts |   94.89 |    90.41 |     100 |   94.89 | ...50-151,222-224 
  redaction.ts     |     100 |      100 |     100 |     100 |                   
  settings.ts      |   66.26 |      100 |      50 |   66.26 | 81-107,141-146    
  ...ceRegistry.ts |   94.01 |    83.14 |     100 |   94.01 | ...38-344,365-366 
  storage.ts       |     100 |      100 |     100 |     100 |                   
  ...ableSchema.ts |     100 |      100 |     100 |     100 |                   
  variables.ts     |   88.95 |    84.21 |     100 |   88.95 | ...32-235,238-241 
  ...extraction.ts |   85.77 |       81 |   89.47 |   85.77 | ...02-205,260-261 
 src/followup      |   79.94 |    80.07 |    90.9 |   79.94 |                   
  followupState.ts |   98.44 |    95.74 |     100 |   98.44 | 236-237           
  index.ts         |     100 |      100 |     100 |     100 |                   
  overlayFs.ts     |   96.29 |    88.88 |     100 |   96.29 | 78,108,122        
  speculation.ts   |    71.7 |    65.38 |   71.42 |    71.7 | ...52-653,660-661 
  ...onToolGate.ts |     100 |    96.55 |     100 |     100 | 97                
  ...nGenerator.ts |   72.03 |    81.15 |   83.33 |   72.03 | ...68-219,331-333 
 src/generated     |       0 |        0 |       0 |       0 |                   
  git-commit.ts    |       0 |        0 |       0 |       0 | 1-10              
 src/goals         |    93.3 |    89.05 |    94.6 |    93.3 |                   
  ...eGoalStore.ts |   87.61 |    88.88 |   86.66 |   87.61 | ...85-188,196-204 
  ...t-verifier.ts |   96.27 |     90.9 |     100 |   96.27 | ...20,143-146,163 
  ...checkpoint.ts |   81.48 |    76.19 |     100 |   81.48 | ...02-105,115-118 
  goal-evidence.ts |   88.79 |     88.5 |   96.42 |   88.79 | ...04-805,828-831 
  ...projection.ts |   66.66 |    72.97 |   33.33 |   66.66 | ...83,186,190-192 
  ...ersistence.ts |   87.73 |    84.84 |      80 |   87.73 | ...-94,97,101-106 
  goal-protocol.ts |   95.74 |    93.33 |     100 |   95.74 | 154-155           
  goal-reducer.ts  |    93.4 |    90.65 |   96.96 |    93.4 | ...27,501,519-520 
  goal-runtime.ts  |   97.62 |     89.9 |     100 |   97.62 | ...1049,1169-1170 
  goal-tools.ts    |   98.22 |    93.02 |      95 |   98.22 | ...46-147,248-249 
  ...rn-context.ts |     100 |      100 |     100 |     100 |                   
  goal-verifier.ts |   92.46 |    92.85 |     100 |   92.46 | ...69-172,185-187 
  goal-wire.ts     |       0 |        0 |       0 |       0 | 1-28              
  goalHook.ts      |   96.91 |    92.42 |     100 |   96.91 | 115-120,221-222   
  goalJudge.ts     |   95.84 |    87.09 |     100 |   95.84 | ...55-356,448-449 
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/hooks         |   88.07 |    86.34 |   88.54 |   88.07 |                   
  ...okRegistry.ts |   86.48 |    77.08 |     100 |   86.48 | ...41-344,362-369 
  ...bortSignal.ts |     100 |      100 |     100 |     100 |                   
  context-usage.ts |     100 |      100 |     100 |     100 |                   
  ...terpolator.ts |   96.66 |    93.33 |     100 |   96.66 | 66-67             
  ...HookRunner.ts |   96.68 |    87.23 |     100 |   96.68 | 110-112,231-233   
  ...Aggregator.ts |   96.57 |    91.48 |     100 |   96.57 | ...20-321,402,404 
  ...entHandler.ts |   95.57 |    84.76 |   94.73 |   95.57 | ...1040-1041,1051 
  hookPlanner.ts   |   87.55 |    85.54 |   86.66 |   87.55 | ...22-226,233-244 
  hookRegistry.ts  |   92.53 |    85.43 |     100 |   92.53 | ...39,458,462,466 
  hookRunner.ts    |   62.65 |    72.34 |   66.66 |   62.65 | ...70-771,780-781 
  hookSystem.ts    |   87.64 |     98.5 |   70.83 |   87.64 | ...58-759,765-766 
  ...HookRunner.ts |   79.06 |    66.66 |      80 |   79.06 | ...33-434,452-456 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...edCallback.ts |     100 |      100 |     100 |     100 |                   
  ...HookRunner.ts |   94.19 |    84.37 |   81.81 |   94.19 | ...76-384,458-459 
  ...SkillHooks.ts |   78.75 |       75 |   66.66 |   78.75 | 62-66,137-152     
  ...oksManager.ts |   94.87 |    88.88 |     100 |   94.87 | ...84,325,327-329 
  ssrfGuard.ts     |   86.45 |    89.13 |     100 |   86.45 | ...85,289-295,301 
  stopHookCap.ts   |     100 |      100 |     100 |     100 |                   
  trustedHooks.ts  |      90 |    52.63 |     100 |      90 | ...53,66-67,97-98 
  types.ts         |   94.25 |    96.12 |   88.88 |   94.25 | ...46-547,632-636 
  urlValidator.ts  |     100 |      100 |     100 |     100 |                   
  ...it-context.ts |     100 |      100 |     100 |     100 |                   
 src/ide           |   76.98 |    85.03 |   79.03 |   76.98 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  detect-ide.ts    |     100 |      100 |     100 |     100 |                   
  ide-client.ts    |   69.16 |    84.65 |   68.29 |   69.16 | ...1068,1097-1105 
  ide-installer.ts |   89.06 |    79.31 |     100 |   89.06 | ...36,143-147,160 
  ideContext.ts    |     100 |      100 |     100 |     100 |                   
  process-utils.ts |   84.84 |    71.79 |     100 |   84.84 | ...37,151,193-194 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/lsp           |   58.96 |    70.57 |   66.14 |   58.96 |                   
  ...nfigLoader.ts |   80.55 |       72 |   95.45 |   80.55 | ...02-504,508-514 
  ...ionFactory.ts |   42.81 |    73.07 |      50 |   42.81 | ...76-427,433-450 
  ...Normalizer.ts |   23.09 |    13.72 |   30.43 |   23.09 | ...04-905,909-924 
  ...verManager.ts |   75.73 |     80.1 |   79.66 |   75.73 | ...1346,1352-1382 
  ...eLspClient.ts |   32.78 |       80 |   16.66 |   32.78 | ...89-293,299-300 
  ...LspService.ts |      60 |    73.36 |   78.26 |      60 | ...1575,1635-1645 
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/mcp           |    82.3 |    77.81 |   78.33 |    82.3 |                   
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...h-provider.ts |   86.95 |      100 |   33.33 |   86.95 | ...,93,97,101-102 
  ...h-provider.ts |   79.31 |    58.06 |     100 |   79.31 | ...26-933,940-942 
  ...en-storage.ts |   98.78 |    97.95 |     100 |   98.78 | 106-107           
  oauth-utils.ts   |   73.61 |    85.48 |    92.3 |   73.61 | ...46-366,392-421 
  ...n-provider.ts |   89.83 |       96 |   45.45 |   89.83 | ...43,147,151-152 
 .../token-storage |   82.12 |    88.19 |   89.28 |   82.12 |                   
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   87.08 |    87.03 |   95.23 |   87.08 | ...00-201,214-215 
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   68.14 |    82.35 |   64.28 |   68.14 | ...81-295,298-314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/memory        |   87.83 |    83.93 |   90.47 |   87.83 |                   
  ...y-document.ts |   89.52 |    84.61 |     100 |   89.52 | ...24-325,329-330 
  ...nel-memory.ts |   97.36 |    96.63 |   96.42 |   97.36 | ...91-293,367-368 
  const.ts         |   94.28 |     92.3 |     100 |   94.28 | 66-67             
  dream.ts         |    64.6 |    72.22 |      50 |    64.6 | ...04-109,124-165 
  ...entPlanner.ts |     100 |    83.33 |     100 |     100 | 136,146           
  entries.ts       |   75.59 |    84.84 |   83.33 |   75.59 | ...56-157,172-180 
  extract.ts       |   92.41 |    79.41 |     100 |   92.41 | 56-61,100,119-122 
  ...entPlanner.ts |   91.59 |    76.74 |     100 |   91.59 | ...05,114-117,293 
  ...ionPlanner.ts |       0 |        0 |       0 |       0 | 1                 
  forget.ts        |   81.83 |       75 |   83.33 |   81.83 | ...51,474,478-507 
  indexer.ts       |   94.14 |       84 |     100 |   94.14 | ...32-233,334,337 
  ...kill-agent.ts |   97.94 |    89.36 |     100 |   97.94 | 82-83,179-180     
  manager.ts       |    78.4 |    82.29 |   77.77 |    78.4 | ...1482,1495-1497 
  ...ent-config.ts |   86.95 |    82.52 |   86.36 |   86.95 | ...68,388,395-401 
  memoryAge.ts     |   90.47 |       80 |     100 |   90.47 | 50-51             
  paths.ts         |     100 |      100 |     100 |     100 |                   
  ...ing-skills.ts |     100 |       72 |     100 |     100 | 31-35,73-78,97    
  prompt.ts        |   97.26 |    87.03 |     100 |   97.26 | ...10-218,222,225 
  recall.ts        |   82.06 |       75 |    90.9 |   82.06 | ...59-364,395-406 
  refresh.ts       |   93.58 |    89.58 |     100 |   93.58 | ...75-176,183-184 
  ...ceSelector.ts |    93.1 |    81.81 |     100 |    93.1 | ...25,127-128,136 
  remember.ts      |   98.89 |    90.19 |     100 |   98.89 | 50,70             
  scan.ts          |   93.12 |    77.41 |     100 |   93.12 | ...08-109,154,157 
  scopes.ts        |     100 |      100 |     100 |     100 |                   
  ...et-scanner.ts |     100 |      100 |     100 |     100 |                   
  ...entPlanner.ts |   77.24 |    74.07 |   72.22 |   77.24 | ...52-456,459,465 
  status.ts        |   10.52 |      100 |       0 |   10.52 | 41-98             
  store.ts         |   92.92 |     82.6 |     100 |   92.92 | ...16-117,147-148 
  ...git-status.ts |     100 |     87.5 |     100 |     100 | 30                
  ...cret-guard.ts |     100 |      100 |     100 |     100 |                   
  ...emory-sync.ts |   94.24 |    82.85 |     100 |   94.24 | ...34-236,246-247 
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ontextFile.ts |   81.21 |    81.53 |   81.81 |   81.21 | ...63-277,291-296 
 src/mocks         |       0 |        0 |       0 |       0 |                   
  msw.ts           |       0 |        0 |       0 |       0 | 1-9               
 src/models        |   92.55 |    88.97 |   91.13 |   92.55 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...tor-config.ts |   97.77 |    91.83 |     100 |   97.77 | 155,161,171       
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nfigErrors.ts |   74.22 |    47.82 |   84.61 |   74.22 | ...,67-74,106-117 
  ...igResolver.ts |   98.71 |    93.33 |     100 |   98.71 | 166,328,334       
  modelRegistry.ts |     100 |    98.11 |     100 |     100 | 177,261           
  modelsConfig.ts  |   89.36 |    86.93 |   88.09 |   89.36 | ...1404,1433-1434 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/output        |     100 |      100 |     100 |     100 |                   
  ...-formatter.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/permissions   |   83.77 |    91.26 |   71.07 |   83.77 |                   
  autoMode.ts      |   97.66 |    93.13 |     100 |   97.66 | ...82-589,635,712 
  ...transcript.ts |      98 |       84 |     100 |      98 | 200-201           
  classifier.ts    |      94 |    94.54 |     100 |      94 | 158-165,389-393   
  ...erousRules.ts |     100 |    89.36 |     100 |     100 | 110,133,147,175   
  ...alTracking.ts |     100 |      100 |     100 |     100 |                   
  ...e-commands.ts |   86.77 |     73.8 |     100 |   86.77 | 131-141,210-214   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...on-manager.ts |   86.54 |    89.63 |      80 |   86.54 | ...1096,1202-1206 
  rule-parser.ts   |   94.49 |     92.7 |     100 |   94.49 | ...1447,1481-1483 
  ...-semantics.ts |   70.44 |    91.09 |   46.66 |   70.44 | ...2237,2311-2314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...sifier-prompts |   99.04 |    95.23 |     100 |   99.04 |                   
  system-prompt.ts |   99.04 |    95.23 |     100 |   99.04 | 220               
 src/prompts       |   83.63 |      100 |    87.5 |   83.63 |                   
  mcp-prompts.ts   |   18.18 |      100 |       0 |   18.18 | 11-19             
  ...t-registry.ts |     100 |      100 |     100 |     100 |                   
 src/providers     |   83.71 |     78.5 |   81.25 |   83.71 |                   
  all-providers.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  install.ts       |   93.11 |     84.5 |     100 |   93.11 | ...56-257,330-331 
  ...der-config.ts |   75.85 |    73.84 |   78.26 |   75.85 | ...73-474,502-503 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...viders/presets |   97.82 |    91.66 |   63.63 |   97.82 |                   
  ...oding-plan.ts |   87.34 |      100 |       0 |   87.34 | 82-84,87-89,91-94 
  ...a-standard.ts |     100 |      100 |     100 |     100 |                   
  ...token-plan.ts |     100 |      100 |     100 |     100 |                   
  ...m-provider.ts |   97.05 |    81.25 |      75 |   97.05 | 118-119           
  deepseek.ts      |     100 |      100 |     100 |     100 |                   
  grok.ts          |     100 |      100 |     100 |     100 |                   
  idealab.ts       |     100 |      100 |     100 |     100 |                   
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  openrouter.ts    |     100 |      100 |     100 |     100 |                   
  requesty.ts      |     100 |      100 |     100 |     100 |                   
  zai.ts           |     100 |      100 |     100 |     100 |                   
 src/qwen          |   85.41 |    78.52 |   95.89 |   85.41 |                   
  ...tGenerator.ts |   98.64 |    98.18 |     100 |   98.64 | 105-106           
  qwenOAuth2.ts    |   82.79 |    73.29 |   90.62 |   82.79 | ...1205-1221,1251 
  ...kenManager.ts |   85.36 |    76.61 |     100 |   85.36 | ...52-757,778-783 
 src/resources     |     100 |      100 |     100 |     100 |                   
  ...e-registry.ts |     100 |      100 |     100 |     100 |                   
 src/services      |   89.74 |     84.6 |   96.91 |   89.74 |                   
  ...ionTrailer.ts |     100 |      100 |     100 |     100 |                   
  ...llRegistry.ts |   97.68 |    85.71 |     100 |   97.68 | ...96,119,490-491 
  ...ionService.ts |   97.51 |    96.15 |     100 |   97.51 | ...,929,1072-1080 
  ...ingService.ts |   91.41 |    85.15 |   95.65 |   91.41 | ...2116,2143-2144 
  ...ttribution.ts |   91.73 |    87.71 |      90 |   91.73 | ...80-685,826-827 
  ...utSlimming.ts |    97.2 |    93.93 |     100 |    97.2 | ...39-340,378-381 
  cronScheduler.ts |   94.17 |    90.45 |      98 |   94.17 | ...1333,1736-1737 
  cronTasksFile.ts |   95.49 |    90.82 |     100 |   95.49 | ...37,346-347,483 
  cronTasksLock.ts |   94.44 |    89.47 |     100 |   94.44 | ...02-103,132-133 
  ...eryService.ts |   96.22 |    93.54 |      90 |   96.22 | 121,155-156,161   
  ...oryService.ts |   88.17 |    79.02 |    92.3 |   88.17 | ...1303,1344-1347 
  fileReadCache.ts |    97.5 |    96.07 |     100 |    97.5 | 349-350,363-364   
  ...temService.ts |    92.8 |    84.68 |   94.11 |    92.8 | ...41,467-474,519 
  ...ratedFiles.ts |      96 |    88.23 |     100 |      96 | 119-120,146-147   
  gitInit.ts       |     100 |      100 |     100 |     100 |                   
  ...reeService.ts |    73.7 |    68.49 |   95.83 |    73.7 | ...2196,2225-2226 
  ...on-service.ts |   87.38 |       72 |     100 |   87.38 | ...01-305,343-344 
  ...references.ts |   98.39 |    88.76 |     100 |   98.39 | 154-155,215-216   
  ...ionService.ts |   98.26 |    97.35 |     100 |   98.26 | ...13-714,761-762 
  ...ticsDumper.ts |   98.37 |    95.23 |     100 |   98.37 | 185-186           
  ...ureMonitor.ts |   95.82 |    90.52 |   97.05 |   95.82 | ...60,861,875-877 
  ...orRegistry.ts |    97.3 |    91.22 |     100 |    97.3 | ...53-454,611-612 
  ...ttachments.ts |   97.74 |    90.85 |     100 |   97.74 | 298-308,646       
  ...ersistence.ts |   90.95 |    78.75 |     100 |   90.95 | ...78,963-964,992 
  ...on-service.ts |   94.49 |    92.26 |   97.14 |   94.49 | ...98-600,656-664 
  ...ce-service.ts |    98.5 |    94.11 |    90.9 |    98.5 | 64-65             
  ...ipt-reader.ts |   94.55 |    89.78 |   96.66 |   94.55 | ...1353-1354,1422 
  ...est-helper.ts |       0 |        0 |       0 |       0 | 1-65              
  ...iter-lease.ts |   83.14 |    74.47 |   97.61 |   83.14 | ...2433,2445-2448 
  sessionRecap.ts  |   67.56 |    43.47 |     100 |   67.56 | ...60,178,180-183 
  ...ionService.ts |   88.95 |    84.18 |   97.14 |   88.95 | ...2450,2526-2546 
  sessionTitle.ts  |   94.19 |    73.21 |     100 |   94.19 | ...43-246,277-278 
  ...ionService.ts |    84.4 |    78.45 |   97.18 |    84.4 | ...2493,2499-2504 
  ...pInhibitor.ts |   97.42 |    92.77 |     100 |   97.42 | ...30,169,369-370 
  ...Estimation.ts |     100 |    88.23 |     100 |     100 | 118-119           
  ...ageService.ts |   97.76 |    91.59 |   93.75 |   97.76 | ...61-262,366,567 
  ...UseSummary.ts |   94.63 |    88.46 |     100 |   94.63 | ...62-164,214-215 
  ...rd-service.ts |     100 |    88.37 |     100 |     100 | ...29,145-146,241 
  ...oryService.ts |   90.72 |    84.07 |     100 |   90.72 | ...06-509,561-562 
  ...reeCleanup.ts |   14.42 |      100 |   33.33 |   14.42 | 58-186            
  ...ionService.ts |   87.98 |    86.95 |     100 |   87.98 | ...38-439,455-456 
 ...icrocompaction |    98.9 |    95.08 |     100 |    98.9 |                   
  microcompact.ts  |    98.9 |    95.08 |     100 |    98.9 | ...40,749,758-759 
 ...s/visionBridge |   98.81 |    92.12 |     100 |   98.81 |                   
  ...capability.ts |     100 |      100 |     100 |     100 |                   
  ...part-utils.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |   98.72 |    82.35 |     100 |   98.72 | 65,71             
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...ge-service.ts |   98.61 |     94.7 |     100 |   98.61 | ...06,666,679-680 
 src/skills        |   89.29 |    85.89 |   93.61 |   89.29 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...activation.ts |     100 |    93.33 |     100 |     100 | 93,112            
  skill-curator.ts |   89.71 |    81.54 |     100 |   89.71 | ...01-902,904-907 
  skill-load.ts    |   94.84 |     87.5 |     100 |   94.84 | ...03,223,235-237 
  skill-manager.ts |   84.82 |    85.29 |   83.33 |   84.82 | ...1243,1250-1254 
  skill-paths.ts   |   90.42 |     87.5 |     100 |   90.42 | ...19-120,125-126 
  symlinkScope.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |   97.91 |    98.03 |     100 |   97.91 | 277-278           
 ...ataviz/scripts |   80.06 |    95.23 |   88.23 |   80.06 |                   
  ...te_palette.js |   80.06 |    95.23 |   88.23 |   80.06 | 261-296,306-328   
 ...s/bundled/loop |   97.48 |    95.77 |     100 |   97.48 |                   
  ...omous-loop.ts |     100 |      100 |     100 |     100 |                   
  ...-task-file.ts |   94.85 |     92.4 |     100 |   94.85 | ...56,367,375-376 
  ...k-resolver.ts |     100 |      100 |     100 |     100 |                   
 src/subagents     |   87.72 |    89.01 |   96.55 |   87.72 |                   
  ...ter-schema.ts |     100 |    98.07 |     100 |     100 | 99                
  ...tin-agents.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nt-manager.ts |   84.48 |    85.91 |   94.87 |   84.48 | ...1582,1659-1660 
  types.ts         |     100 |      100 |     100 |     100 |                   
  validation.ts    |   92.46 |    95.18 |     100 |   92.46 | 47-52,63-68,71-76 
 src/telemetry     |   81.39 |    83.87 |   84.66 |   81.39 |                   
  ...ty-tracker.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...on-metrics.ts |   99.07 |    80.95 |     100 |   99.07 | 183,197           
  ...on-tracing.ts |   76.31 |    74.62 |   73.68 |   76.31 | ...80,387-389,405 
  ...attributes.ts |   95.15 |    87.27 |     100 |   95.15 | ...97-198,216-217 
  ...ag-metrics.ts |     100 |    77.77 |     100 |     100 | 21,40             
  ...t-loop-lag.ts |   96.85 |    85.71 |     100 |   96.85 | 170-173           
  ...-exporters.ts |   65.78 |    83.33 |   55.55 |   65.78 | ...04-105,108-109 
  ...ai-content.ts |    74.5 |    66.41 |   91.66 |    74.5 | ...1480,1493-1502 
  ...i-provider.ts |     100 |       99 |     100 |     100 | 99                
  ...ai-request.ts |   87.52 |    92.79 |   83.78 |   87.52 | ...55-561,564-570 
  gen-ai-usage.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-111             
  ...-processor.ts |    99.1 |    95.72 |      95 |    99.1 | 145,369-370       
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-128             
  loggers.ts       |   57.84 |    74.16 |   65.45 |   57.84 | ...1438,1455-1475 
  metrics.ts       |   80.04 |    82.75 |   80.32 |   80.04 | ...1105,1108-1119 
  otlp-urls.ts     |     100 |      100 |     100 |     100 |                   
  ...attributes.ts |     100 |      100 |     100 |     100 |                   
  ...ime-config.ts |       0 |        0 |       0 |       0 | 1                 
  sanitize.ts      |      80 |    83.33 |     100 |      80 | 35-36,41-42       
  ...rters-grpc.ts |     100 |      100 |     100 |     100 |                   
  ...rters-http.ts |     100 |      100 |     100 |     100 |                   
  sdk-impl.ts      |   91.06 |    87.15 |   68.75 |   91.06 | ...32,478-479,495 
  sdk.ts           |   79.22 |    89.18 |   63.63 |   79.22 | ...57-161,199-221 
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...on-tracing.ts |    91.1 |    88.68 |   96.77 |    91.1 | ...1737,1768-1771 
  ...etry-utils.ts |     100 |      100 |     100 |     100 |                   
  ...l-decision.ts |     100 |      100 |     100 |     100 |                   
  trace-context.ts |     100 |      100 |     100 |     100 |                   
  ...e-id-utils.ts |     100 |      100 |     100 |     100 |                   
  tracer.ts        |   98.56 |    88.63 |     100 |   98.56 | 52,101            
  types.ts         |   82.51 |    94.77 |   86.04 |   82.51 | ...1374,1378-1385 
  uiTelemetry.ts   |   97.18 |    93.93 |      88 |   97.18 | ...70,314,461-462 
 ...ry/qwen-logger |   74.23 |     80.7 |      70 |   74.23 |                   
  event-types.ts   |       0 |        0 |       0 |       0 |                   
  qwen-logger.ts   |   74.23 |    80.53 |   69.49 |   74.23 | ...1122,1160-1161 
 src/test-utils    |   96.02 |    98.41 |   82.92 |   96.02 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  ...st-helpers.ts |   94.11 |       90 |     100 |   94.11 | 69-70             
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...mised-lock.ts |     100 |      100 |     100 |     100 |                   
  mock-tool.ts     |   94.85 |      100 |   78.78 |   94.85 | ...53,227-228,241 
  ...aceContext.ts |     100 |      100 |     100 |     100 |                   
 src/tools         |   86.22 |       85 |   88.72 |   86.22 |                   
  ...erQuestion.ts |   89.71 |    80.76 |   91.66 |   89.71 | ...66-367,374-375 
  ...-registrar.ts |    77.7 |    66.66 |   66.66 |    77.7 | ...72-277,292-294 
  ...ub-session.ts |   89.67 |     91.3 |   81.81 |   89.67 | ...03-304,315-322 
  cron-create.ts   |   90.64 |    92.85 |   72.72 |   90.64 | ...,73-74,223-231 
  cron-delete.ts   |   97.56 |      100 |   83.33 |   97.56 | 31-32             
  cron-list.ts     |   98.23 |    95.34 |    87.5 |   98.23 | 57-58             
  diffOptions.ts   |     100 |      100 |     100 |     100 |                   
  display-image.ts |   87.42 |    84.84 |   88.88 |   87.42 | ...29-134,194-195 
  edit.ts          |    82.7 |    86.77 |   81.25 |    82.7 | ...43-744,863-913 
  ...r-worktree.ts |   83.14 |    67.56 |    87.5 |   83.14 | ...84-187,278-279 
  enterPlanMode.ts |      85 |     82.6 |    87.5 |      85 | ...28-133,161-175 
  exit-worktree.ts |   83.29 |    83.65 |   94.44 |   83.29 | ...14-515,537-538 
  exitPlanMode.ts  |      95 |    85.29 |     100 |      95 | ...21-325,344,378 
  ...permission.ts |     100 |      100 |     100 |     100 |                   
  glob.ts          |   96.33 |     88.5 |     100 |   96.33 | ...24-225,373,376 
  grep.ts          |   90.73 |    86.61 |   85.71 |   90.73 | ...76-677,727-728 
  ...adTracking.ts |     100 |      100 |     100 |     100 |                   
  image-gen.ts     |   91.66 |    77.41 |    90.9 |   91.66 | ...13-214,221-222 
  list-agents.ts   |   94.02 |    82.35 |   83.33 |   94.02 | 31-32,47-48       
  loop-wakeup.ts   |   99.27 |    92.85 |     100 |   99.27 | 45                
  ls.ts            |   96.74 |    90.27 |     100 |   96.74 | 176-181,212,216   
  lsp.ts           |   72.71 |     59.5 |   90.32 |   72.71 | ...1212,1214-1215 
  ...nt-manager.ts |   82.13 |    80.47 |   85.71 |   82.13 | ...3234,3236-3237 
  mcp-client.ts    |   79.87 |    85.58 |   89.47 |   79.87 | ...2259,2263-2266 
  ...ry-timeout.ts |     100 |      100 |     100 |     100 |                   
  mcp-errors.ts    |     100 |      100 |     100 |     100 |                   
  ...pool-entry.ts |   79.21 |    85.71 |   81.57 |   79.21 | ...1341,1349-1350 
  ...ool-events.ts |       8 |        0 |       0 |       8 | 132-158           
  mcp-pool-key.ts  |   97.46 |    93.93 |     100 |   97.46 | 176-177           
  ...ce-content.ts |   96.55 |    91.17 |     100 |   96.55 | 80-82             
  mcp-retry.ts     |   97.67 |    95.65 |     100 |   97.67 | 131-132           
  ...ion-config.ts |     100 |      100 |     100 |     100 |                   
  mcp-status.ts    |     100 |      100 |     100 |     100 |                   
  mcp-tool.ts      |   98.35 |    93.71 |     100 |   98.35 | ...-990,1045-1046 
  ...sport-pool.ts |   83.98 |     80.3 |   88.46 |   83.98 | ...1409,1416-1420 
  ...ace-budget.ts |   87.27 |     82.6 |     100 |   87.27 | ...00-305,340-345 
  memory-config.ts |     100 |      100 |     100 |     100 |                   
  ...iable-tool.ts |     100 |    84.61 |     100 |     100 | 101,108           
  monitor.ts       |   91.74 |    84.28 |   88.46 |   91.74 | ...93,606,804-809 
  notebook-edit.ts |   85.69 |    77.08 |   81.25 |   85.69 | ...95-911,957-958 
  ...escendants.ts |   36.17 |    64.51 |   55.55 |   36.17 | ...46-310,385-390 
  ...nforcement.ts |   83.21 |    90.69 |     100 |   83.21 | 147-158,207-220   
  read-file.ts     |   95.49 |    88.52 |   86.66 |   95.49 | ...49,464,536-537 
  ...p-resource.ts |   96.85 |      100 |   91.66 |   96.85 | 92-96             
  ...d-artifact.ts |   91.18 |    86.71 |    87.5 |   91.18 | ...26-427,441-453 
  ripGrep.ts       |    94.6 |    87.26 |   95.23 |    94.6 | ...33-734,740-741 
  ...-transport.ts |   71.42 |    55.55 |   71.42 |   71.42 | ...36-137,143-144 
  send-message.ts  |   81.13 |    89.74 |    62.5 |   81.13 | ...80-286,363-371 
  ...n-mcp-view.ts |   94.07 |    91.89 |    90.9 |   94.07 | 131-139           
  shell.ts         |   78.72 |     84.1 |   91.91 |   78.72 | ...5032,5095-5096 
  skill-utils.ts   |     100 |      100 |     100 |     100 |                   
  skill.ts         |   91.39 |    92.55 |      90 |   91.39 | ...84,488,534-556 
  ...eticOutput.ts |   95.12 |      100 |      80 |   95.12 | 87-88             
  task-create.ts   |    94.4 |    93.33 |   81.81 |    94.4 | 45-49,63-64,95    
  task-list.ts     |   73.38 |    77.77 |   83.33 |   73.38 | ...02,105,109-116 
  task-stop.ts     |   93.14 |    96.15 |   85.71 |   93.14 | 39-40,54-64       
  task-update.ts   |   82.89 |    83.92 |    92.3 |   82.89 | ...14-422,454-465 
  team-create.ts   |   97.22 |    85.71 |   83.33 |   97.22 | 48-49,129-130     
  team-delete.ts   |   86.74 |    83.33 |   83.33 |   86.74 | 37-38,42-48,72-73 
  ...n-approval.ts |   92.14 |    96.77 |   77.77 |   92.14 | 38-39,42-43,93-99 
  todoWrite.ts     |   95.13 |    87.85 |   93.33 |   95.13 | ...23-527,540-545 
  tool-error.ts    |     100 |      100 |     100 |     100 |                   
  tool-names.ts    |     100 |      100 |     100 |     100 |                   
  tool-registry.ts |   78.57 |    79.59 |    82.6 |   78.57 | ...89-990,998-999 
  tool-search.ts   |   96.19 |    89.72 |   93.33 |   96.19 | ...09,259-264,426 
  tools.ts         |   93.11 |    92.53 |   91.66 |   93.11 | ...69-570,586-592 
  ...reapproved.ts |   99.27 |    94.11 |     100 |   99.27 | 170               
  web-fetch.ts     |   96.05 |    90.54 |   96.77 |   96.05 | ...85-786,800-801 
  web-search.ts    |   90.53 |    83.57 |      80 |   90.53 | ...1007,1065-1068 
  write-file.ts    |    86.7 |    84.92 |   88.88 |    86.7 | ...24-827,864-899 
  zoom-image.ts    |   95.76 |    93.75 |      90 |   95.76 | 54-59,203-204     
 src/tools/agent   |   87.22 |    87.68 |   88.69 |   87.22 |                   
  agent.ts         |   85.84 |    86.59 |   86.31 |   85.84 | ...4315,4337-4347 
  fork-profile.ts  |   93.65 |       90 |     100 |   93.65 | ...33-134,171-174 
  fork-subagent.ts |   98.73 |       95 |     100 |   98.73 | 101-102,173       
 ...tools/artifact |   95.78 |    92.51 |   88.63 |   95.78 |                   
  artifact-tool.ts |   91.46 |    88.46 |   71.42 |   91.46 | ...13-314,322-325 
  ...-publisher.ts |     100 |    85.71 |     100 |     100 | 32                
  ...-publisher.ts |   96.74 |    97.72 |    87.5 |   96.74 | 29-30,156-157     
  html.ts          |     100 |    96.77 |     100 |     100 | 122               
  ...-publisher.ts |     100 |       80 |     100 |     100 | 30                
  oss-publisher.ts |    98.1 |    91.48 |     100 |    98.1 | 43-45             
  publisher.ts     |     100 |      100 |     100 |     100 |                   
 ...s/computer-use |   90.21 |    82.17 |   78.08 |   90.21 |                   
  bootstrap.ts     |   59.42 |    80.95 |   41.66 |   59.42 | ...35-339,341-345 
  client.ts        |   80.11 |       90 |   77.77 |   80.11 | ...97,242-243,274 
  constants.ts     |     100 |    94.73 |     100 |     100 | 129,256           
  downloader.ts    |   65.29 |    52.77 |   58.33 |   65.29 | ...99-300,316-355 
  index.ts         |     100 |      100 |     100 |     100 |                   
  install-state.ts |   94.44 |    72.72 |     100 |   94.44 | 44-45             
  ...n-detector.ts |     100 |     87.5 |     100 |     100 | 50                
  schemas.ts       |     100 |      100 |     100 |     100 |                   
  tool.ts          |    96.3 |    85.71 |     100 |    96.3 | 75-76,184,252-258 
 ...tools/workflow |   86.24 |    84.81 |      75 |   86.24 |                   
  workflow.ts      |   86.24 |    84.81 |      75 |   86.24 | ...61,506,508-509 
 src/utils         |   92.86 |    89.64 |   96.85 |   92.86 |                   
  LruCache.ts      |     100 |      100 |     100 |     100 |                   
  ...Controller.ts |     100 |      100 |     100 |     100 |                   
  ...ssageQueue.ts |     100 |      100 |     100 |     100 |                   
  ...cFileWrite.ts |   94.94 |    92.47 |     100 |   94.94 | ...43-544,651-655 
  bareMode.ts      |   81.81 |      100 |      50 |   81.81 | 18-19             
  ...ry-content.ts |   98.45 |    95.45 |     100 |   98.45 | 132-133,159-160   
  browser.ts       |   86.84 |    78.94 |     100 |   86.84 | 34,36-37,65-66    
  btwUtils.ts      |   13.95 |      100 |       0 |   13.95 | 17-31,34-55       
  bundlePaths.ts   |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...igResolver.ts |     100 |      100 |     100 |     100 |                   
  ...engthError.ts |   91.06 |    89.47 |     100 |   91.06 | ...46-147,154-155 
  ...n-branches.ts |   95.88 |    94.11 |      95 |   95.88 | ...98-499,511-524 
  ...tion-chain.ts |     100 |      100 |     100 |     100 |                   
  cronDisplay.ts   |     100 |    97.61 |     100 |     100 | 46                
  cronParser.ts    |   95.34 |    93.33 |     100 |   95.34 | 41-42,47-48,70-71 
  debugLogger.ts   |   96.66 |    96.66 |   88.88 |   96.66 | 192-196           
  editHelper.ts    |   93.63 |     83.9 |     100 |   93.63 | ...27-428,462-463 
  editor.ts        |   97.65 |    95.45 |     100 |   97.65 | ...35-336,338-339 
  encoding.ts      |     100 |      100 |     100 |     100 |                   
  env.ts           |     100 |      100 |     100 |     100 |                   
  ...arResolver.ts |   94.28 |    88.88 |     100 |   94.28 | 28-29,125-126     
  ...entContext.ts |   96.63 |    90.13 |   96.66 |   96.63 | ...42,444-445,512 
  errorParsing.ts  |     100 |      100 |     100 |     100 |                   
  ...rReporting.ts |   95.65 |    93.33 |     100 |   95.65 | 37-38             
  errors.ts        |   83.01 |    95.03 |    61.9 |   83.01 | ...62-378,382-388 
  fetch.ts         |   90.68 |    82.51 |     100 |   90.68 | ...72,483-484,503 
  file-identity.ts |     100 |      100 |     100 |     100 |                   
  fileUtils.ts     |   94.87 |    92.95 |   96.15 |   94.87 | ...1907,1915-1916 
  forkedAgent.ts   |   92.45 |    82.35 |   93.75 |   92.45 | ...34,642,647-654 
  formatters.ts    |     100 |      100 |     100 |     100 |                   
  ...eUtilities.ts |    92.4 |    86.95 |     100 |    92.4 | ...52-158,168-169 
  ...rStructure.ts |   94.39 |    94.28 |     100 |   94.39 | ...29-132,343-348 
  getPty.ts        |   31.57 |       50 |     100 |   31.57 | 26-38             
  git-branches.ts  |    91.6 |    84.21 |    92.3 |    91.6 | ...90,405-410,570 
  gitDiff.ts       |   95.19 |    81.36 |     100 |   95.19 | ...1073,1419-1420 
  gitDirect.ts     |   98.84 |    94.28 |     100 |   98.84 | 234,318           
  ...noreParser.ts |   94.48 |    93.22 |     100 |   94.48 | ...23-124,158-159 
  gitUtils.ts      |   78.02 |    81.25 |   85.71 |   78.02 | ...22-123,147-198 
  github-prs.ts    |   95.74 |    82.27 |     100 |   95.74 | 216,314-322       
  iconvHelper.ts   |     100 |      100 |     100 |     100 |                   
  ...rePatterns.ts |     100 |      100 |     100 |     100 |                   
  image-view.ts    |   95.12 |    93.33 |     100 |   95.12 | ...68-172,240-244 
  ...ionManager.ts |     100 |     90.9 |     100 |     100 | 27                
  ...lPromptIds.ts |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  jsonl-utils.ts   |   95.27 |     93.1 |     100 |   95.27 | ...16-317,359-362 
  ...-detection.ts |     100 |      100 |     100 |     100 |                   
  ...iconv-lite.ts |     100 |      100 |     100 |     100 |                   
  ...simple-git.ts |   96.77 |    91.66 |     100 |   96.77 | 38                
  ...m-headless.ts |      96 |    88.88 |     100 |      96 | 34                
  ...iagnostics.ts |    96.4 |     94.2 |     100 |    96.4 | ...66,293-294,376 
  ...yDiscovery.ts |    92.4 |    89.13 |     100 |    92.4 | ...28,331,522-525 
  ...tProcessor.ts |   94.01 |       90 |     100 |   94.01 | ...47-353,445-446 
  ...Inspectors.ts |     100 |      100 |     100 |     100 |                   
  modelId.ts       |   98.96 |    98.21 |     100 |   98.96 | 153               
  ...kerChecker.ts |    90.9 |    91.66 |     100 |    90.9 | 73-79             
  notebook.ts      |   94.57 |    89.91 |   95.83 |   94.57 | ...21,333,385-387 
  openaiLogger.ts  |   91.66 |    89.74 |     100 |   91.66 | ...26-228,251-256 
  osc8.ts          |   54.26 |    64.86 |   83.33 |   54.26 | ...72-195,197-257 
  partUtils.ts     |     100 |    98.64 |     100 |     100 | 211               
  pathReader.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |   93.61 |    92.42 |     100 |   93.61 | ...62-563,565-567 
  pdf.ts           |   92.17 |    85.81 |     100 |   92.17 | ...64-565,606-611 
  projectPath.ts   |     100 |      100 |     100 |     100 |                   
  projectRoot.ts   |   71.73 |    78.57 |     100 |   71.73 | 54-66             
  ...ectSummary.ts |   89.62 |    72.41 |     100 |   89.62 | ...40-145,196-199 
  ...tIdContext.ts |     100 |      100 |     100 |     100 |                   
  proxyUtils.ts    |     100 |      100 |     100 |     100 |                   
  ...rDetection.ts |   71.15 |       86 |     100 |   71.15 | ...-90,96-101,147 
  ...noreParser.ts |   92.63 |    91.66 |     100 |   92.63 | ...77-178,197-198 
  rateLimit.ts     |   93.75 |    89.62 |     100 |   93.75 | ...13,218-219,262 
  ...text-range.ts |   96.98 |    87.15 |     100 |   96.98 | ...87-688,763-764 
  readManyFiles.ts |   95.75 |    80.86 |     100 |   95.75 | ...05,558,568-572 
  retry.ts         |   96.09 |    92.52 |     100 |   96.09 | ...67,558-559,577 
  retryContext.ts  |     100 |      100 |     100 |     100 |                   
  ...sification.ts |   97.63 |    97.11 |     100 |   97.63 | ...17,251-252,278 
  retryPolicy.ts   |   97.72 |    90.56 |     100 |   97.72 | 130-131           
  ripgrepUtils.ts  |   90.04 |    93.43 |   95.45 |   90.04 | ...55-565,598-599 
  ...sDiscovery.ts |   97.46 |    93.05 |     100 |   97.46 | ...04,182-183,202 
  ...iagnostics.ts |   83.08 |     67.5 |   92.59 |   83.08 | ...23,543-544,550 
  ...tchOptions.ts |   84.87 |    86.71 |   96.29 |   84.87 | ...71,696,725-734 
  ...odelPrefix.ts |     100 |      100 |     100 |     100 |                   
  runtimeStatus.ts |    97.5 |    89.74 |     100 |    97.5 | 162-163           
  safe-mode.ts     |     100 |      100 |     100 |     100 |                   
  safeJsonParse.ts |     100 |      100 |     100 |     100 |                   
  ...nStringify.ts |     100 |      100 |     100 |     100 |                   
  ...-child-env.ts |     100 |      100 |     100 |     100 |                   
  ...aConverter.ts |   98.03 |    97.75 |     100 |   98.03 | 100,102-103       
  ...aValidator.ts |   92.09 |    83.65 |   90.47 |   92.09 | ...60,882-883,896 
  ...r-launcher.ts |   96.35 |    93.97 |   85.71 |   96.35 | ...35-336,347-348 
  sedEditParser.ts |   91.78 |    92.18 |     100 |   91.78 | ...66-569,645-646 
  ...nIdContext.ts |     100 |      100 |     100 |     100 |                   
  ...orageUtils.ts |   95.98 |    83.96 |     100 |   95.98 | ...70,386,466,485 
  ...-pager-env.ts |     100 |      100 |     100 |     100 |                   
  ...fety-rules.ts |     100 |     89.7 |     100 |     100 | ...01,304,309-311 
  shell-utils.ts   |   86.07 |    88.34 |     100 |   86.07 | ...2269,2276-2280 
  ...lAstParser.ts |   98.16 |    91.91 |     100 |   98.16 | ...1244-1246,1256 
  ...ContextEnv.ts |     100 |       92 |     100 |     100 | 50-52             
  ...nlyChecker.ts |   96.33 |    96.57 |     100 |   96.33 | ...83-284,292-293 
  sideQuery.ts     |   86.82 |    86.66 |     100 |   86.82 | ...79-185,187-193 
  ...pEventSink.ts |     100 |       80 |     100 |     100 | 61                
  ...tGenerator.ts |     100 |      100 |     100 |     100 |                   
  ...ameContext.ts |     100 |      100 |     100 |     100 |                   
  symlink.ts       |   77.77 |       50 |     100 |   77.77 | 44,54-59          
  ...e-encoding.ts |   85.96 |    76.47 |     100 |   85.96 | 58-61,64-65,78-79 
  ...emEncoding.ts |   96.36 |    91.17 |     100 |   96.36 | 59-60,124-125     
  terminalSafe.ts  |     100 |      100 |     100 |     100 |                   
  ...Serializer.ts |   98.72 |       90 |     100 |   98.72 | 42-43,134,201-203 
  testUtils.ts     |   53.33 |      100 |   33.33 |   53.33 | ...53,59-64,70-72 
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  textUtils.ts     |      65 |      100 |      75 |      65 | 56-75             
  thoughtUtils.ts  |     100 |    95.65 |     100 |     100 | 99                
  ...-converter.ts |   95.23 |    85.71 |     100 |   95.23 | 36-37             
  ...name-utils.ts |     100 |      100 |     100 |     100 |                   
  ...-finalizer.ts |   97.66 |     90.9 |     100 |   97.66 | 165-166,168-172   
  tool-utils.ts    |    95.2 |    93.61 |     100 |    95.2 | ...58-159,162-163 
  ...ultCleanup.ts |   54.62 |    30.76 |      75 |   54.62 | ...03-105,108-134 
  ...Compaction.ts |   96.13 |    96.42 |     100 |   96.13 | ...34-339,341-346 
  ...pt-records.ts |    87.5 |    86.02 |     100 |    87.5 | ...76-480,510-525 
  truncation.ts    |   90.56 |    90.43 |     100 |   90.56 | ...35-443,480-486 
  windowsPath.ts   |   89.47 |    79.31 |     100 |   89.47 | ...57-58,62,90-91 
  ...aceContext.ts |   96.74 |    91.04 |     100 |   96.74 | ...69,196,299-301 
  xml.ts           |    97.8 |    87.69 |     100 |    97.8 | 98-99             
  yaml-parser.ts   |   83.87 |    77.27 |     100 |   83.87 | ...31-234,239-240 
 ...ils/filesearch |   83.94 |    80.72 |   94.73 |   83.94 |                   
  crawlCache.ts    |     100 |      100 |     100 |     100 |                   
  crawler.ts       |    82.9 |    76.81 |   95.08 |    82.9 | ...1563,1597-1598 
  fileSearch.ts    |   93.78 |    87.67 |     100 |   93.78 | ...71-272,274-275 
  fzfWorker.ts     |       0 |        0 |       0 |       0 | 1-109             
  ...rkerHandle.ts |   84.05 |    75.43 |   89.47 |   84.05 | ...30-334,340-341 
  ignore.ts        |     100 |    97.36 |     100 |     100 | 187               
  result-cache.ts  |     100 |    93.75 |     100 |     100 | 49                
 ...uest-tokenizer |   69.76 |    75.47 |   85.29 |   69.76 |                   
  ...eTokenizer.ts |   65.72 |    74.02 |    92.3 |   65.72 | ...65-466,479-533 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tTokenizer.ts |   68.39 |    69.49 |    90.9 |   68.39 | ...24-325,327-328 
  ...ageFormats.ts |   76.92 |      100 |   33.33 |   76.92 | 46-49,56-57       
  textTokenizer.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
-------------------|---------|----------|---------|---------|-------------------

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

@wenshao wenshao left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

⚠️ Downgraded from Request changes to Comment: self-PR; CI failing: Test (ubuntu-latest, Node 22.x). Reviewed. Suggestions are inline.

中文说明

⚠️ 已从请求修改降级为评论:self-PR; CI failing: Test (ubuntu-latest, Node 22.x)。 已审查。 建议见行内评论。

— gpt-5.6-sol via Qwen Code /review (v0.21.8)

Comment on lines +155 to 157
if (!finished) {
void reader.cancel().catch(() => undefined);
}

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.

[Critical] R1-1: The replacement starts early-exit cancellation but does not wait for it before releasing the reader lock and returning the request error. A flipping probe confirmed that, with an oversized stream whose cancel() returns a pending promise, postJson() has already rejected while cancellation remains unresolved; changing this to await reader.cancel().catch(() => undefined) keeps the request pending until teardown settles. — Failure scenario: an immediate retry can overlap with the previous response transport's unfinished asynchronous cancellation. Please await cancellation before releaseLock() and add a deferred-cancel regression test.

Suggested change
if (!finished) {
void reader.cancel().catch(() => undefined);
}
if (!finished) {
await reader.cancel().catch(() => undefined);
}
中文说明

R1-1: 当前实现启动提前退出时的取消操作后,并未等待其完成,就释放 reader lock 并返回请求错误。可翻转 probe 已确认:当超限流的 cancel() 返回一个尚未完成的 Promise 时,postJson() 已经拒绝,而取消仍处于 pending;改为 await reader.cancel().catch(() => undefined) 后,请求会等待清理完成。失败场景是立即重试会与上一响应传输尚未完成的异步取消重叠。请在 releaseLock() 前等待取消,并补充 deferred-cancel 回归测试。

— gpt-5.6-sol via Qwen Code /review (v0.21.8)

Comment on lines +138 to +140
const { done, value } = await reader.read();
if (done) {
finished = true;

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

[Suggestion] R1-2: The new behavioral suite does not cover reader.read() rejecting after a partial chunk has already been received. — Failure scenario: if a provider disconnects mid-response after sending partial JSON, a future regression could treat the error as EOF, parse partial data, map the wrong error, or skip cleanup while all four added tests remain green. Add a stream that enqueues a partial JSON chunk and then errors, and assert the request-did-not-complete mapping plus cleanup behavior.

中文说明

R1-2: 新增的行为测试没有覆盖已经收到部分 chunk 后 reader.read() 拒绝的路径。失败场景是 provider 在发送部分 JSON 后中断连接,未来回归可能把错误当作 EOF、解析部分数据、映射错误的异常,或漏掉清理,而现有 4 条测试仍全部通过。建议增加一个先 enqueue 部分 JSON、随后报错的流,并断言 request-did-not-complete 错误映射及清理行为。

— gpt-5.6-sol via Qwen Code /review (v0.21.8)

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

中文说明

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

@qwen-code-dev-bot

qwen-code-dev-bot commented Aug 8, 2026

Copy link
Copy Markdown
Collaborator

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

中文说明

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

… request

On early exit from the reader loop (the oversize throw) cancellation was
started fire-and-forget, so postJson() rejected while the stream's
teardown was still settling — `for await` had awaited its implicit
iterator return() before propagating. An immediate retry could overlap
the previous response transport's unfinished cancellation. Await
reader.cancel() before releaseLock(), and pin the sequencing with a
deferred-cancel regression test that fails against the fire-and-forget
form.

Also cover read() rejecting after a partial chunk was received: the
error maps to the request-did-not-complete transport error rather than
EOF-then-parse of the partial JSON, and the reader lock is still
released.
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Round summary

Addressed both inline findings from the round-1 review with one commit (fix(external-context): await stream cancellation before rejecting the request).

Feedback points

  1. [Critical] R1-1 — early-exit cancellation not awaited before rejecting (integrations/external-context/src/http-client.ts:157) — Fixed.
    Verified against the code: on early exit from the reader loop (the oversize throw), cancellation was started fire-and-forget (void reader.cancel()), so postJson() rejected while the stream's teardown was still settling. The replaced for await awaited its implicit iterator.return() before propagating, so the rewrite diverged from the original behavior exactly as the finding describes. Applied the suggested change — await reader.cancel().catch(() => undefined) before releaseLock() — and extended the adjacent comment to record why the await is load-bearing: an immediate retry must not overlap the previous response transport's still-settling teardown. Added the requested deferred-cancel regression test: an endless over-budget stream whose cancel() returns a pending promise; the test asserts the rejection is held until the cancellation settles, and it fails against the old fire-and-forget form (confirmed by temporarily reverting the fix and re-running the suite).

  2. [Suggestion] R1-2 — no coverage for reader.read() rejecting after a partial chunk (integrations/external-context/src/http-client.test.ts) — Implemented.
    Added a test whose stream enqueues a partial JSON chunk and then errors mid-read. It pins the request-did-not-complete error mapping — a future regression that treated the error as EOF would instead parse the partial JSON and surface the invalid-response error — and asserts the reader lock is still released on mid-read errors.

Checks note

The review body referenced a failing Test (ubuntu-latest, Node 22.x) check. That check is already SUCCESS on the current head (workflow completed 2026-08-08T23:16:45Z, after the last push), and no failed or still-red checks were listed for this round, so there was nothing to repair there.

Conflict

None (--conflict false); no merge performed.

Verification

  • npm run build — passed (exit 0)
  • npm run typecheck — passed (exit 0)
  • npm run lint — passed (exit 0)
  • vitest integrations/external-context (touched package) — 172 passed across 10 files, including all 6 http-client.test.ts tests
  • Mutation check: temporarily reverted await reader.cancel() to void reader.cancel(); the new deferred-cancel test failed (1 failed | 5 passed) while everything else stayed green; restored the fix, all 6 tests pass again
中文说明

本轮总结

通过一次提交(fix(external-context): await stream cancellation before rejecting the request)处理了第一轮评审中的两条行内意见。

反馈点

  1. [Critical] R1-1 — 提前退出时的取消操作未被等待就拒绝了请求integrations/external-context/src/http-client.ts:157)——已修复。
    对照代码核实:reader 循环提前退出(超出字节上限抛错)时,取消操作是以即发即弃方式启动的(void reader.cancel()),因此 postJson() 在流的清理尚未完成时就已拒绝。被替换掉的 for await 在传播错误前会等待其隐式的 iterator.return(),所以这次改写确实如意见所述偏离了原有行为。已按建议修改——在 releaseLock() 之前 await reader.cancel().catch(() => undefined)——并扩展了相邻注释,说明这个 await 为何关键:立即发起的重试不能与上一个响应传输仍在收尾的清理过程重叠。同时按要求补充了 deferred-cancel 回归测试:一个无限的超限流,其 cancel() 返回一个 pending 的 Promise;测试断言拒绝会被 held 住直到取消完成,并且该测试在旧的即发即弃写法下会失败(已通过临时还原修复并重跑测试套件确认)。

  2. [Suggestion] R1-2 — 缺少已收到部分 chunk 后 reader.read() 拒绝的覆盖integrations/external-context/src/http-client.test.ts)——已实现。
    新增测试:流先 enqueue 一段不完整的 JSON chunk,随后在中途报错。该测试固定了 request-did-not-complete 的错误映射——未来若回归成把错误当作 EOF 处理,则会去解析部分 JSON 并表现为 invalid-response 错误——并断言即使在读取中途出错,reader lock 也会被释放。

检查项说明

评审正文提到 Test (ubuntu-latest, Node 22.x) 检查失败。该检查在当前 head 上已经是 SUCCESS(workflow 于 2026-08-08T23:16:45Z 完成,晚于最后一次推送),且本轮没有列出任何失败或持续失败的检查项,因此此处无需修复。

冲突

无(--conflict false);未执行任何合并。

验证

  • npm run build — 通过(退出码 0)
  • npm run typecheck — 通过(退出码 0)
  • npm run lint — 通过(退出码 0)
  • vitest integrations/external-context(受影响包)— 10 个文件共 172 个测试全部通过,包括 http-client.test.ts 的全部 6 个测试
  • 变异检查:临时将 await reader.cancel() 还原为 void reader.cancel(),新增的 deferred-cancel 测试失败(1 失败 | 5 通过),其余测试保持绿色;恢复修复后 6 个测试再次全部通过

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

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


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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed — no blockers. Suggestions are inline.

中文说明

已审查——无阻断问题。 建议见行内评论。

— qwen3.8-max via Qwen Code /review (v0.21.8)

Comment on lines +127 to +129
// (#8693) dragged lib.dom into any program without this package's
// tsconfig `types` guard, and every branch behind that guard failed the
// autofix verification build with TS2504 on this exact line. The reader

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] R2-1: This diff deletes the for await over response.body that the sibling integrations/external-context/tsconfig.json comment cites as the reason the "types": ["node"] guard exists ("breaking the for await over response.body in http-client.ts"), while the comment added here asserts the opposite ("the build no longer depends on that resolution at all"). An A/B build at this commit confirms the guard is no longer load-bearing: with the guard removed, this getReader() code still compiles cleanly even with lib.dom in the program — Concrete cost: a maintainer auditing build config now faces two contradicting stories, and either cleanup decision (keep or drop the guard) gets made against false documentation.

Suggested fix — refresh the tsconfig comment to the post-rewrite reality (the guard keeps this program's typings on the node variants now that http-client.ts no longer depends on stream async-iterability), or drop the guard together with its comment in this PR — the A/B arm proves this code builds cleanly without it.

中文说明

R2-1: 本 diff 删除了对 response.bodyfor await,而 integrations/external-context/tsconfig.json 的注释恰恰把它引用为 "types": ["node"] 防护存在的理由("会破坏 http-client.ts 中对 response.bodyfor await");这里新增的注释却断言了相反的事实("构建不再依赖那套解析")。在本提交上做的 A/B 构建确认该防护已不再是承重项:去掉防护后,即使程序里有 lib.dom,这份 getReader() 代码依然编译干净——具体代价是:审计构建配置的维护者现在面对两种互相矛盾的说法,无论保留还是删除防护,清理决定都是依据错误文档做出的。

建议修复——把 tsconfig 注释更新为改写后的现状(既然 http-client.ts 不再依赖流的异步可迭代性,防护的作用是让本程序的类型保持在 node 变体上),或者在本 PR 里连同注释一起删掉防护——A/B 分支已证明去掉防护后本代码构建干净。

— qwen3.8-max via Qwen Code /review (v0.21.8)

// oversize rejection, and — the easy one to drop — cancelling the stream on
// early exit, which `for await` used to do implicitly via iterator return().

const MAX_RESPONSE_BYTES = 1024 * 1024;

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] R2-2: This re-declares the byte cap locally because MAX_RESPONSE_BYTES in http-client.ts is not exported, silently decoupling the boundary tests from the real constant they exist to pin. Verified by probe at this commit: with the source cap raised to 2 MiB, accepts a body of exactly MAX_RESPONSE_BYTES still passes while sending only 1 MiB — the total > MAX vs >= guarantee it was written to pin is silently gone (the sibling oversize test then fails on a misdirected enqueued <= 4 chunk count, not the boundary) — Concrete cost: a future cap change silently invalidates the guarantee this file exists to provide.

Suggested fix — export the constant and import it here:

// in http-client.ts
export const MAX_RESPONSE_BYTES = 1024 * 1024;

// in this file: replace the local re-declaration with
import { postJson, MAX_RESPONSE_BYTES } from './http-client.js';
中文说明

R2-2: 由于 http-client.ts 中的 MAX_RESPONSE_BYTES 未导出,这里在本地重新声明了字节上限,使边界测试与它们本要钉住的真实常量悄然脱钩。已在本提交上用 probe 验证:把源码侧上限提高到 2 MiB 后,accepts a body of exactly MAX_RESPONSE_BYTES 仍然通过,但实际只发送 1 MiB——它本要钉住的 total > MAX>= 之分的保证悄然消失(相邻的超限测试届时会以 enqueued <= 4 的 chunk 计数错误地失败,而不是败在边界上)——具体代价是:未来一次上限调整就会让本文件存在所要提供的保证悄然失效。

建议修复——导出该常量并在这里导入(见上方英文代码示例):在 http-client.ts 中加 export,本文件改为 import { postJson, MAX_RESPONSE_BYTES } from './http-client.js',删除本地的重复声明。

— qwen3.8-max via Qwen Code /review (v0.21.8)

@wenshao

wenshao commented Aug 9, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 9, 2026

Copy link
Copy Markdown
Collaborator

Sandboxed verification: ✅ passed — merge-ready (agent verdict) - workflow run

Ran the PR in an isolated, token-free container: A/B against the base build, mock-free harness assertions, targeted gates. Advisory evidence for human reviewers — not a review, an approval, or a CI check.

Scripted assertions: 224 passed · 0 failed · 224 total

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

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

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

Verification report

PR 8764 — verification report

Verdict: merge-ready — 224/224 scripted assertions passed, 0 unexpected failures. Verified head: ba5dbaded82efcff0c5c7f71206d55821bbf01c9 (base tip 73e9eab626).

中文摘要
  • 结论:merge-ready。224 条脚本化断言全部通过,0 条意外失败。
  • 核心 A/B:中毒 lib 组合(root 已装 @types/jsdom@28.0.3 + 删去 tsconfig types 防护)在 base 上逐字符复现事故错误 TS2504 @ (124,29),在 head 上构建干净(4/4 单元符合预期,见 01-poisoned-build-ab-matrix.png)——reader 改写独立于防护成立。
  • 行为保持:PR 新增的 6 条测试在 base 的 for await 实现上同样 6/6 通过;真实 loopback 服务器 wire oracle 对 head dist 与 base dist 各 15/15(含服务端观察到取消、reject 后立即重试成功)。变异矩阵中每个关键守卫都被其设计的测试杀死;commit-1 的 fire-and-forget 形态恰好只挂 deferred-cancel 一条,精确隔离第二个 commit 的贡献。
  • Findings(均不阻塞):① 预存在的 cancelResponseBody 在 3xx/非 ok/声明超长三条路径上仍是 fire-and-forget 取消(与 PR 理由同类,但非本 PR 引入);② 描述里 "170/170、4 条新增" 与实际的 172/6 有出入(commit 2 追加了两条测试);③ value === undefined 防御分支运行时不可达(M4 存活),与 PR 自述的"防御性类型"一致。
  • 未覆盖:per-commit 归因(shallow checkout,commit 1 不可达,用变异重建中间形态替代);wire 层未直接断言 awaited-cancel 的先后顺序(由进程内 barrier 测试钉住);base 侧只跑了 http-client 一个测试文件;未跑全仓 gate。

Central claim + A/B

Central claim: rewriting readBoundedBody from for await to an explicit getReader() loop removes the build's dependence on which lib set supplies ReadableStream[Symbol.asyncIterator] — the poisoned combination that killed every stale managed branch in the autofix verification build — while preserving behavior.

All four cells compile against the same root node_modules, which already contains @types/jsdom@28.0.3 from #8693 (no install needed; that is exactly the trusted-base dependency state). "Guard removed" = deleting the package tsconfig's "types": ["node"] line, restoring inheritance of the root ["node", "vitest/globals"] — i.e. the pre-#8693 branch shape.

cell tree tsconfig guard result expectation
1 base present exit 0, clean main is green today
2 base removed exit 1, src/http-client.ts(124,29): error TS2504: Type 'ReadableStream<Uint8Array<ArrayBufferLike>>' must have a '[Symbol.asyncIterator]()' method that returns an async iterator. the incident, byte-for-byte
3 head removed exit 0, clean the fix stands without the guard
4 head present exit 0, clean what actually merges

4/4 cells as expected. Witness: evidence/01-poisoned-build-ab-matrix.png. The cell-2 error matches the PR body's quoted gate error character for character.

Behavioral A/B — the PR's new http-client.test.ts run against the base for await implementation (copied into a scratch worktree at HEAD^1):

arm tests result
base impl (for await) 6/6 pass — witnesses evidence/05-base-behavior-ab.png
head impl (reader loop) 6/6 pass (within the 172/172 suite run)

The tests pin behavior, not implementation — which is exactly what a behavior-preserving rewrite needs.

Wire oraclewire-harness.mjs: real node:http loopback server, real undici fetch, compiled dist/ output of each arm (no mocks of the unit under test). Asserts both sides of the wire (server-seen method/headers/body, server-observed teardown) and the client outcome:

scenario head dist base dist
W0 404 → ProviderHttpStatusError(404) (control) ok ok
W1 3-chunk assembly; server saw POST/Bearer/content-type/body ok ok
W2 exactly-MAX body accepted (strictly-greater bound) ok ok
W3 oversize stream rejected; server observed teardown ≤2 s; endless producer stopped (≤20 chunks); immediate retry succeeds ok ok
W4 declared content-length > MAX rejected pre-stream ok ok
W5 mid-stream socket drop → transport error, not parse error ok ok
W6 invalid UTF-8 rejected ok ok

15/15 each arm, stderr 0 bytes on both. Witness: evidence/03-wire-harness-head-vs-base.png. Behavioral parity at the socket level: identical outcomes on both arms.

Mutation matrix

Suite = the PR's own http-client.test.ts (6 tests), run per mutant at head. Witness: evidence/02-mutation-matrix.png.

mutant result killed by
CONTROL (unmutated head) GREEN 6/6
M1 remove cancel entirely RED 2/6 over-budget-cancels + deferred-cancel
M2 fire-and-forget cancel (commit-1 form, reconstructed) RED 1/6 deferred-cancel only
M3 >>= RED 1/6 exactly-MAX accepted
M4 remove value === undefined guard GREEN 6/6 survivor (see Findings)
M5 remove releaseLock() RED 1/6 mid-stream failure (locked assertion)
M6 positive control: corrupt error message RED 3/6 3 message-asserting tests

M6 proves the suite can be made red, so the kill counts are trustworthy. M2 (the intermediate variant of the two-commit bundle — commit 1 is unreachable at this checkout's depth, so it is reconstructed by mutation per its commit message) fails exactly the deferred-cancel test with AssertionError: expected true to be false at http-client.test.ts:168 — witness evidence/04-m2-fire-and-forget-failure.png. Three-arm decomposition:

build oversize reject cancel on early exit reject awaits teardown
base (for await) yes yes (implicit) yes (iterator return() awaited)
commit-1 form (M2) yes yes (explicit) no — reject races teardown
head yes yes (explicit) yes (explicit await)

The rewrite (commit 1) preserved cancellation but dropped the await; commit 2 restored it. Either half alone is incomplete; the pair is behaviorally equivalent to base — the conclusion a two-cell A/B alone cannot reach.

Corrections

  • The description's "Risk & Scope" says packages/sdk-typescript/src/daemon/DaemonClient.ts "has the same pattern over a fetch body" and "builds today". Both halves are true but the first understates the safety: the fetch-body consumer there (sse.ts parseSseStream) already uses the explicit getReader() pattern this PR introduces; DaemonClient's for awaits iterate an async generator, which types identically in every lib set. The sibling is therefore already neutralized, not merely green-by-guard. Verified: npm run typecheck -w packages/sdk-typescript exits 0 at head. This is a correction to the description, not a code change request.

Findings (non-blocking)

  1. Pre-existing sibling, untouched by this PR: cancelResponseBody() (fire-and-forget void response.body?.cancel()) still guards the 3xx, non-ok, and declared-oversize paths in postJson — the same "retry may overlap unsettled teardown" hazard class the PR's readBoundedBody rationale fixes. Pre-existing cause, PR contributes nothing to it; teardown on those paths is cheap (body never consumed by the reader) so the practical exposure is small. Report-only; if the maintainer wants full parity, the same await … .catch() treatment applies there.
  2. Description drift: body says "170/170 (10 files; 4 new in http-client.test.ts)"; actual at the verified head is 172/172 with 6 tests in the new file — commit 2 added the deferred-cancel and mid-stream-failure tests after the body was written. Harmless; cite the live numbers.
  3. M4 survivor classified: removing if (value === undefined) continue; leaves all 6 tests green. The clause is runtime-dead (a non-done read always carries a value per WHATWG/undici semantics) — it is defensive typing for older non-discriminated ReadableStreamReadResult typings, matching the PR's own disclosure. Dead code, not a coverage gap; completeness reporting only.

Not covered

  • Per-commit attribution: the checkout is shallow (--is-shallow-repository true); git rev-list HEAD^1..HEAD^2 yields 1 commit vs 3 in the snapshot, so c88d3ab0 (commit 1) and dc1f1d4b are unreachable. The aggregate HEAD^1..HEAD diff was verified; the commit-1 form was exercised via the M2 reconstruction instead of the real commit.
  • Wire-level awaited-cancel ordering: the harness asserts the server observes teardown and an immediate retry succeeds, but cannot order client-reject vs server-observation across a socket; the strict sequencing is pinned by the in-process barrier test (and by M2 killing it).
  • Base-side test run covered only http-client.test.ts (the changed surface), not the base workspace's full suite.
  • Repo-wide gates not run; targeted gates only (external-context build/typecheck/vitest/lint, sdk-typescript typecheck).
  • The structural half the description defers (verification gate charging base-skew failures to PRs) is out of scope by the PR's own statement and was not re-litigated here.

Methodology

Environment: node:22-bookworm container (the verify lane's own runtime), typescript 5.8.3, vitest 3.2.4. Scratch git worktrees under tmp/ at HEAD^1 (base) and HEAD (head), both resolving the shared root node_modules (asserted: the package has no @qwen-code/* workspace links and http-client.ts imports nothing; readlink -f of the package dir points into each worktree). Worktrees removed after capture; main tree left clean (git status --porcelain empty). Harnesses live in this artifact dir (ab-build-matrix.sh, wire-harness.mjs, mutation-matrix.mjs, m2-detail.sh); raw logs: vitest-head-full.log, wire-head.log/.err, wire-base.log/.err, mutation-matrix.log, ab-build-matrix.log. Assertion tally: 172 (head suite) + 6 (base A/B) + 15+15 (wire arms) + 4 (build cells) + 7 (mutation expectations) + 2 (lint liveness: planted violation caught, clean re-run) + 3 (head build, head typecheck, sdk typecheck) = 224, all passing.

Evidence images

01-poisoned-build-ab-matrix

02-mutation-matrix

03-wire-harness-head-vs-base

04-m2-fire-and-forget-failure

05-base-behavior-ab

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

Qwen Code · sandboxed verification

…bsolete

The `"types": ["node"]` override existed solely to keep @types/jsdom's
lib.dom out of this program while http-client.ts read the response body
with `for await` — the DOM lib's ReadableStream is not async-iterable,
and the flip broke the build with TS2504 (#8693). The reader loop that
replaced the `for await` types identically in every lib set, so the
guard is no longer load-bearing: with it removed, lib.dom re-enters the
program and the package still builds cleanly. Drop it with its stale
comment instead of leaving maintainers two contradicting stories about
whether it is needed.

Also export MAX_RESPONSE_BYTES and import it in the boundary tests
instead of re-declaring it locally, so the tests pin the real constant
rather than a copy that can silently drift.

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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Review feedback addressed — PR #8764

Round summary: both automated-reviewer suggestions were resolved in code with one commit (4c7bad3551). No conflicts (--conflict false, no merge performed).

Feedback points and dispositions

[rc:3742256354] R2-1 — tsconfig types guard comment contradicts the new http-client comment — RESOLVED

The review was right: the "types": ["node"] override in integrations/external-context/tsconfig.json existed solely to keep @types/jsdom-injected lib.dom away from the for await over response.body (TS2504, #8693), and this PR deletes that for await, leaving two contradicting stories in the tree.

Of the two suggested fixes, I took the stronger one — removed the guard and its comment entirely rather than rewriting the comment — because:

I re-verified the reviewer's A/B claim myself before removing it: with the guard gone, tsc --noEmit --listFilesOnly shows lib.dom re-entering the program (2 lib.dom files), and the package still typechecks and builds cleanly — the reader API types identically in every lib set.

Also refreshed the two new comments this PR added so no reference to the now-removed guard remains: http-client.ts's getReader() rationale now states the #8693 history accurately without citing the guard, and the test file's header comment was likewise corrected.

[rc:3742256357] R2-2 — boundary tests re-declare the byte cap locally — RESOLVED

Implemented the suggested fix verbatim in spirit: MAX_RESPONSE_BYTES is now exported from http-client.ts, and http-client.test.ts imports it (import { MAX_RESPONSE_BYTES, postJson } from './http-client.js') instead of re-declaring 1024 * 1024 locally. The exact-cap and oversize boundary tests now track the real constant they exist to pin, so a future cap change can no longer silently decouple them.

Files changed

  • integrations/external-context/tsconfig.json — removed the "types": ["node"] override and its stale comment.
  • integrations/external-context/src/http-client.ts — exported MAX_RESPONSE_BYTES; refreshed the getReader() comment (no more reference to the removed guard).
  • integrations/external-context/src/http-client.test.ts — import MAX_RESPONSE_BYTES instead of re-declaring it; corrected the header comment's guard reference.

Verification

Commands actually run, in order:

  • npx tsc --noEmit --listFilesOnly (integrations/external-context, guard removed) — confirmed lib.dom enters the program (2 lib.dom files), i.e. the risky A/B arm was genuinely exercised
  • npx tsc --noEmit (integrations/external-context) — passed
  • npm run build (integrations/external-context) — passed
  • npm test (integrations/external-context vitest) — 10 test files, 172 tests passed, incl. all 6 http-client boundary tests
  • npm run build (repo root, all packages) — passed
  • npm run typecheck (repo root, all workspaces) — passed
  • npm run lint (repo root) — passed
  • npx prettier --check on the three changed files — passed
  • After a follow-up comment-only edit: package npm run lint — passed; package npm test — 172 passed

No settings source was touched, so npm run generate:settings-schema was not applicable. Integration tests were not needed: the touched behavior is fully covered by the package's unit tests and no bundled-CLI-only path changed.

中文说明

已处理的评审反馈 — PR #8764

本轮摘要:两条自动评审建议均已通过一次提交(4c7bad3551)在代码中解决。无冲突(--conflict false,未执行合并)。

反馈点与处理结果

[rc:3742256354] R2-1 — tsconfig types 防护的注释与 http-client 新注释互相矛盾 — 已解决

评审的判断正确:integrations/external-context/tsconfig.json 中的 "types": ["node"] 覆盖项唯一的用途,就是把 @types/jsdom 注入的 lib.dom 挡在 response.bodyfor await 之外(TS2504,#8693);而本 PR 删除了那个 for await,使仓库里留下了两套互相矛盾的说法。

在两个建议修复中,我选择了更彻底的一个——把防护连同其注释整体删除,而不是改写注释,理由如下:

删除前我亲自复核了评审的 A/B 结论:去掉防护后,tsc --noEmit --listFilesOnly 显示 lib.dom 重新进入该程序(2 个 lib.dom 文件),而包依然能干净地通过类型检查与构建——reader API 在任意 lib 组合下类型完全一致。

同时修正了本 PR 新增的两处注释,使其中不再引用已删除的防护:http-client.ts 中 getReader() 的理由说明现在准确陈述 #8693 的历史而不再提及防护;测试文件的头注释也做了同样的修正。

[rc:3742256357] R2-2 — 边界测试在本地重新声明了字节上限 — 已解决

按建议实现修复:MAX_RESPONSE_BYTES 现在从 http-client.ts 导出,http-client.test.ts 改为导入(import { MAX_RESPONSE_BYTES, postJson } from './http-client.js'),不再本地重复声明 1024 * 1024。精确上限与超限两个边界测试现在跟随它们本要钉住的真实常量,未来调整上限不会再与测试悄然脱钩。

变更文件

  • integrations/external-context/tsconfig.json — 删除 "types": ["node"] 覆盖项及其过时注释。
  • integrations/external-context/src/http-client.ts — 导出 MAX_RESPONSE_BYTES;刷新 getReader() 注释(不再引用已删除的防护)。
  • integrations/external-context/src/http-client.test.ts — 改为导入 MAX_RESPONSE_BYTES,不再本地重复声明;修正头注释中对防护的引用。

验证

实际执行的命令(按顺序):

  • npx tsc --noEmit --listFilesOnly(integrations/external-context,防护已删除)— 确认 lib.dom 进入程序(2 个 lib.dom 文件),即真正 exercised 有风险的 A/B 分支
  • npx tsc --noEmit(integrations/external-context)— 通过
  • npm run build(integrations/external-context)— 通过
  • npm test(integrations/external-context vitest)— 10 个测试文件、172 个测试全部通过,包含全部 6 个 http-client 边界测试
  • npm run build(仓库根,全部包)— 通过
  • npm run typecheck(仓库根,全部 workspace)— 通过
  • npm run lint(仓库根)— 通过
  • npx prettier --check(三个变更文件)— 通过
  • 后续一次仅注释的修改之后:包内 npm run lint — 通过;包内 npm test — 172 通过

未触碰任何 settings 源文件,因此无需运行 npm run generate:settings-schema。无需集成测试:所触行为已被包内单元测试完全覆盖,且没有只存在于打包 CLI 的路径发生变化。

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

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


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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

No action needed this round

The feedback collected for this round contains no actionable items:

  • Reviews: none
  • Inline comments: none
  • Issue-level comments: only the automated verification bot's progress notice ("Sandboxed verification is running"), which is a status update, not feedback requiring a code change
  • Failed checks: none
  • Still-red checks: none

No changes were made to the PR branch this round. It remains at 4c7bad35 (fix(external-context): drop the types guard the reader rewrite made obsolete). The next round will triage the verification report once it is posted.

中文说明

本轮无需处理

本轮收集的反馈中没有需要处理的事项:

  • 评审(Reviews):
  • 行内评论(Inline comments):
  • Issue 级评论: 仅有自动化验证机器人的进度通知("沙箱验证正在运行"),属于状态更新,不是需要代码变更的反馈
  • 失败的检查(Failed checks):
  • 持续失败的检查(Still-red checks):

本轮未对 PR 分支做任何更改。分支仍停留在 4c7bad35fix(external-context): drop the types guard the reader rewrite made obsolete)。待验证报告发布后,下一轮会对其进行处理。

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


🧠 Handled by Qwen Code · model/模型 qwen3.8-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.

Reviewed. Suggestions are inline. Not reviewed: reverse audit — stopped before round 2 by the review time budget.

中文说明

已审查。 建议见行内评论。 未审查:反向审计——评审时间预算不足,未能开始第 2 轮。

— qwen3.8-max via Qwen Code /review (v0.21.8)

Comment on lines 4 to 5
"composite": true,
// Override the root's `vitest/globals` entry: vitest's types import the
// optional `jsdom` peer types, and once `@types/jsdom` is installed that
// drags `/// <reference lib="dom" />` into this program. The DOM lib
// flips @types/node's conditional fetch globals to their DOM variants,
// whose ReadableStream is not async-iterable (needs lib.dom.asynciterable),
// breaking the `for await` over `response.body` in http-client.ts. The
// sources compiled here use no vitest globals (tests are excluded), so
// `node` alone is enough.
"types": ["node"],
"outDir": "dist",

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] R3-1: The PR description is stale against the final head: it says "The guard stays — belt and suspenders" (and 中文 "防护保留——belt and suspenders"), but head commit 4c7bad3 removed the "types": ["node"] guard from this tsconfig, and the Reviewer Test Plan says "Expected: build/typecheck clean, 170/170 (10 files; 4 new in http-client.test.ts)" while the suite now has 6 tests and the package reports 172 (measured at this commit: 10 files / 172 tests). — Failure scenario: a maintainer merging on the description's narrative believes this package retains the types: ["node"] defense; post-merge it does not — a future lib.dom typing regression bisected here sends the investigation looking for a guard that no longer exists. A reviewer following the Test Plan sees counts that don't match (170/4 vs 172/6) and a local-repro step (# remove the "types": ["node"] line ...) that names a line deleted in round 2, so the Before/After evidence recipe silently fails to reproduce. The guard removal itself is fully justified (per R2-1's A/B) — only the PR body was never updated to match.

Suggested fix — update the PR body: note the round-2 commit dropped the now-dead guard (per R2-1, with the A/B re-verification), and correct the Test Plan's expected counts to 172 tests / 6 in http-client.test.ts (and the repro to compare main against this branch).

中文说明

R3-1: PR 描述相对最终 head 已过时:描述声称 "The guard stays — belt and suspenders"(中文 "防护保留——belt and suspenders"),但 head commit 4c7bad3 已从本 tsconfig 删除 "types": ["node"] 防护;Reviewer Test Plan 声称 "Expected: build/typecheck clean, 170/170 (10 files; 4 new in http-client.test.ts)",而当前套件实际有 6 个测试、包内共 172 个(已在本提交上实测:10 个文件 / 172 个测试)。失败场景:维护者依据描述合并后会以为本包仍保留 types: ["node"] 防护,而合并后实际并无此防护——未来一旦有 lib.dom 类型回归被二分定位到本包,排查会去寻找一个已不存在的防护。按 Test Plan 操作的评审者会看到不匹配的数字(170/4 对 172/6),以及一条引用已在第 2 轮删除的配置行的本地复现步骤(# remove the "types": ["node"] line ...),Before/After 证据配方因此悄悄失效。防护删除本身完全合理(见 R2-1 的 A/B)——只是 PR 正文一直没有同步更新。

建议修复——更新 PR 正文:说明第 2 轮 commit 已删除这个不再承重的防护(依据 R2-1 及其 A/B 复核),并把 Test Plan 的预期数字更正为 172 个测试 / http-client.test.ts 中 6 个(复现步骤改为对比 main 与本分支)。

— qwen3.8-max via Qwen Code /review (v0.21.8)

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.

Disposition: deferred — the fix is a PR-body edit, which needs a maintainer.

The finding is correct and was re-verified at this commit: the package suite reports 10 files / 172 tests (6 in http-client.test.ts), and 4c7bad3 removed the "types": ["node"] line the description still claims is kept. This autofix environment operates only inside the checkout with no GitHub write access, so it cannot edit the PR body; the thread stays open. Suggested replacements:

  • Replace "The guard stays — belt and suspenders" (and 中文 "防护保留——belt and suspenders") with: "The round-2 commit dropped the "types": ["node"] guard from integrations/external-context/tsconfig.json: the reader-loop rewrite made it loadless (per the R2-1 A/B), and build/typecheck were re-verified with it removed."
  • Replace the Test Plan's "Expected: build/typecheck clean, 170/170 (10 files; 4 new in http-client.test.ts)" with "Expected: build/typecheck clean, 172/172 (10 files; 6 in http-client.test.ts)".
  • Replace the repro step that removes the "types": ["node"] line with a main-vs-branch comparison — the line no longer exists on this branch.
中文说明

处理:暂缓——修复方式是编辑 PR 正文,需要维护者操作。

该发现正确,并已在本提交上复核:包测试套件为 10 个文件 / 172 个测试(http-client.test.ts 中 6 个),且 4c7bad3 已删除描述中仍声称保留的 "types": ["node"] 行。本 autofix 环境只在 checkout 内运行、没有任何 GitHub 写权限,因此无法编辑 PR 正文;该 thread 保持打开。建议替换文案:

  • 将 "The guard stays — belt and suspenders"(及中文 "防护保留——belt and suspenders")替换为:"第 2 轮 commit 删除了 integrations/external-context/tsconfig.json 中的 "types": ["node"] 防护:reader 循环重写后该防护不再承重(见 R2-1 的 A/B),并已在删除后重新验证 build/typecheck。"
  • 将 Test Plan 中 "Expected: build/typecheck clean, 170/170 (10 files; 4 new in http-client.test.ts)" 替换为 "Expected: build/typecheck clean, 172/172 (10 files; 6 in http-client.test.ts)"。
  • 将复现步骤中"删除 "types": ["node"] 行"的写法改为对比 main 与本分支——该行在本分支上已不存在。

vi.stubGlobal(
'fetch',
vi.fn(async () =>
streamingResponse([new Uint8Array([0xff, 0xfe, 0xfd])], cancelled),

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] R3-3: This invalid-UTF-8 test cannot discriminate its target behavior — the one-line mutation deleting { fatal: true } from the TextDecoder in readBoundedBody survives the whole suite. — Failure scenario: verified by probe at this commit: with lax decoding, the fixture bytes [0xff, 0xfe, 0xfd] decode to three U+FFFD chars, JSON.parse throws on them, and postJson maps that to the same 'External context provider returned an invalid response.' the test asserts — 6/6 pass against the mutant. The mutation is not equivalent: with bytes forming otherwise-valid JSON around an invalid byte, fatal decoding rejects while lax decoding resolves with { a: '\uFFFD' } — silently corrupted provider content accepted. So the test pins "invalid bytes reject" but not which layer guarantees it, and the decoding guarantee it was written for can regress undetected. (The fatal: true decode block is pre-existing untouched code, hence Suggestion, not Critical.)

Suggested change
streamingResponse([new Uint8Array([0xff, 0xfe, 0xfd])], cancelled),
streamingResponse(
[new Uint8Array([0x7b, 0x22, 0x61, 0x22, 0x3a, 0x22, 0xff, 0x22, 0x7d])],
cancelled,
),

The distinguishing fixture makes only fatal decoding pass: lax decoding resolves { a: '\uFFFD' } instead of rejecting and fails the test (verified: this fixture kills the mutant and passes against the correct code).

中文说明

R3-3: 这个非法 UTF-8 测试无法区分它要钉住的行为——把 readBoundedBodyTextDecoder{ fatal: true } 删掉这一行变异,整个测试套件依然全绿。失败场景:已在本提交上用 probe 验证:宽松解码下,测试数据 [0xff, 0xfe, 0xfd] 会解码成三个 U+FFFD 字符,JSON.parse 对其抛错,postJson 把该错误映射为测试所断言的同一条 'External context provider returned an invalid response.'——变异体下 6/6 全部通过。该变异并不等价:当字节序列在非法字节周围构成合法 JSON 时,fatal 解码会拒绝,而宽松解码会以 { a: '\uFFFD' } 成功解析——被破坏的 provider 内容被静默接受。因此该测试钉住的是"非法字节会被拒绝",而不是"由哪一层保证拒绝",它本要固定的解码保证可以在无人察觉的情况下回归。(fatal: true 解码块是本次 diff 未触碰的既有代码,因此定级为 Suggestion 而非 Critical。)

上方的 suggestion 给出可区分两者的测试数据:宽松解码届时会解析出 { a: '\uFFFD' } 而不是拒绝,从而让测试失败(已验证:该数据能杀死变异体,且在正确代码下通过)。

— qwen3.8-max via Qwen Code /review (v0.21.8)

@wenshao

wenshao commented Aug 9, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 9, 2026

Copy link
Copy Markdown
Collaborator

Sandboxed verification: ✅ passed — merge-ready (agent verdict) - workflow run

Ran the PR in an isolated, token-free container: A/B against the base build, mock-free harness assertions, targeted gates. Advisory evidence for human reviewers — not a review, an approval, or a CI check.

Scripted assertions: 260 passed · 0 failed · 260 total

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

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

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

Verification report

PR 8764 — verification report (follow-up round)

Verdict: merge-ready — 260/260 scripted assertions passed, 0 unexpected failures. Verified head: 4c7bad3551e45d9bb33412b21c6ffdc01a666311 (= snapshot headRefOid; base tip this run 4a7951781501b95b93baf84cf5899dc2b752d80e, metadata baseRefOid 33b124321c… having drifted). This is a follow-up round; the previous round verified head ba5dbaded8 with 224/224 assertions.

中文 — 结论:✅ 通过 · 可合入(agent 判定)
  • 结论:merge-ready,脚本化断言全部通过、0 条意外失败(总数见文首 verdict 行与 assertions.json)。
  • 本轮增量(commit 4:删防护 + 导出常量):核心 A/B 见 Build matrix 表 —— base 删防护逐字符复现事故错误,head 以无防护的真实形态构建干净;DOM 探针对证明 lib.dom 确实在场,干净不是假象。Per-commit attribution 表显示构建独立性自 commit 1 即成立,commit 4 只是摘掉死开关。
  • 行为保持重测:wire oracle、behavioral A/B、mutation matrix 三张表全部在新 head 重跑(测试文件与 base 尖端均已变,不沿用上轮数字),各 arm 均符合预期;真实 commit 1(fire-and-forget)恰好只挂 deferred-cancel 一条。M7 对探针证明 commit 4 的常量 import 接线是 load-bearing 的(见 Mutation matrix 表)。
  • 遗留 findings(均不阻塞,详见 Findings):cancelResponseBody 三条路径仍是 fire-and-forget(预存在,未变);描述漂移扩大(170/170 与 "The guard stays/防护保留" 均与现状矛盾);测试计划第 3 步按原文从仓库根执行找不到测试文件;M4 依旧运行时死代码。
  • 未覆盖:wire 层无法跨 socket 断言 reject 与 teardown 的先后(由进程内 barrier 测试钉住);base 侧仅覆盖变更面;未跑全仓 gate。

Previous-finding status at the new head

# finding (previous round) severity status at 4c7bad3551
1 pre-existing cancelResponseBody fire-and-forget cancel on the 3xx / non-ok / declared-oversize paths non-blocking stands — re-measured: one void response.body?.cancel() inside the helper, called from the same 3 paths; no awaited body cancel elsewhere (scripted, remesure-findings.console); wire W4 cell behaves identically on both arms
2 description drift: body says "170/170 (10 files; 4 new)" nit stands, extended — body unchanged; suite measures 172/172 with 6 tests; commit 4 additionally contradicts "The guard stays — belt and suspenders" / "防护保留" by removing the guard (see Findings)
3 M4 survivor: value === undefined guard runtime-dead nit stands — M4 re-run at the new head: 6/6 green (mutation matrix below); dead code per the PR's own disclosure
correction: DaemonClient.ts's fetch-body consumer already uses getReader() via sse.ts correction stands — re-verified at new head: sse.ts:74 reads the body via getReader(); DaemonClient iterates the resulting async generator; npm run typecheck -w packages/sdk-typescript exits 0

Every measurement from the previous round was re-run at the new head — the test file changed in commit 4 (constant import), the base tip moved (73e9eab64a79517), and the source file changed (export + comment), so no input closure was identical; nothing was carried forward.

Central claim + A/B

Central claim of the delta (commit 4): the "types": ["node"] guard is no longer load-bearing after the reader rewrite, so dropping it — letting lib.dom re-enter the program via vitest/globals@types/jsdom — keeps the build clean, and the boundary tests pin the real MAX_RESPONSE_BYTES instead of a local copy.

Build matrix — all cells against the same root node_modules (already contains @types/jsdom@28.0.3 from #8693 — the trusted-base state; no install needed). Guard swap = copying the other tree's tsconfig, which differs by nothing else (diff quoted in the capture). Witness: 01-poisoned-build-ab-matrix.png.

cell tree tsconfig result expectation
1 base 4a79517 as-is (guard present) exit 0, clean main is green today
2 base guard removed exit 1, src/http-client.ts(124,29): error TS2504: Type 'ReadableStream<Uint8Array<ArrayBufferLike>>' must have a '[Symbol.asyncIterator]()' method that returns an async iterator. the incident, character for character
3 head 4c7bad3 as-is — no guard, the shape that merges exit 0, clean the fix stands without the guard
4 head guard re-added exit 0, clean re-adding is harmless
5 head, + probe exporting document: Document as-is exit 0, clean lib.dom IS in the guardless program — cell 3 is not vacuous
6 base, + same probe as-is (guard) exit 1, TS2584 Cannot find name 'document' in the probe the guard excluded lib.dom — probe validity control
7 commit 1 c88d3ab guard removed exit 0, clean build independence dates from the reader rewrite
8 commit 3 ba5dbade guard removed exit 0, clean previous head already guard-independent

8/8 cells as expected. Cell 2 matches the PR body's quoted gate error byte for byte; cells 5/6 prove the poison is active in this environment, so cell 3's clean build is the rewrite doing the work, not an absent hazard. Note both dependency layouts pass: worktree cells resolve the root @types/node@20.19.1, while the CI-shape main-tree gate (with the package-local @types/node@22.20.1) is also clean — see Gates.

Per-commit attribution — all four snapshot commits were object-reachable this round (previous round's depth-2 limitation is lifted; git rev-list still under-reports 1 at the shallow graft, but every commit checked out). Each commit's claim exercised individually:

commit poisoned build (no guard) PR's 6-test suite against this impl what the commit contributes
base 4a79517 (for await) TS2504 (cell 2) 6/6 (witness 03-behavior-ab-three-impls.png)
1 c88d3ab reader, fire-and-forget cancel clean (cell 7) 5/6 — only holds the oversize reject until a deferred cancellation settles red: AssertionError: expected true to be false at http-client.test.ts:166 the rewrite: build independence + cancellation, but reject races teardown
3 ba5dbade awaited cancel clean (cell 8) 6/6 restores for await's awaited-teardown semantics
4 4c7bad3 guard dropped, const exported clean as-is (cell 3) 6/6 (within 172/172) structural: removes the dead guard, tests import the real constant

(Base/commit-1/commit-3 arms use one non-behavioral adaptation: the tests import MAX_RESPONSE_BYTES, which only commit 4 exports, so the word export was added to each arm's const declaration.)

Commit-4's import wiring is load-bearing — M7 pair in the mutation matrix: halving the source constant leaves the head tests green (they construct bodies from the imported value, 6/6) while the commit-3 test file with its local const MAX_RESPONSE_BYTES = 1024 * 1024 copy goes red on exactly-MAX (5/6). The drift the commit message describes is real and now pinned.

Wire oraclewire-harness.mjs: real node:http loopback server, real global fetch over a real socket, compiled dist/ of each arm (rebuilt from clean state after the matrix). Asserts both sides of the wire. Witness: 02-wire-harness-head-vs-base.png.

scenario head dist base dist
W0 404 → ProviderHttpStatusError(404) (control) ok ok
W1 3-chunk assembly; server saw POST/Bearer/content-type/exact body ok ok
W2 exactly-MAX body accepted (strictly-greater bound) ok ok
W3 oversize endless stream rejected; server observed teardown ≤2 s; producer stopped ≤20 chunks; immediate retry succeeds ok ok
W4 declared content-length > MAX rejected pre-stream; connection closed before delivery ok ok
W5 mid-stream socket drop → transport error, not parse error ok ok
W6 invalid UTF-8 rejected ok ok
export surface: head exports MAX_RESPONSE_BYTES === 1048576; base does not ok ok

18/18 each arm, stderr 0 bytes on both. Behavioral parity at the socket level is preserved by the whole PR, so the guard removal and export are confirmed structural-only.

Mutation matrix (re-run at the new head)

Suite = the PR's http-client.test.ts (6 tests), one mutant per row, restored after each. Witness: 04-mutation-matrix-head.png.

mutant result killed by / classification
CONTROL unmutated head GREEN 6/6
M1 remove cancel entirely RED 4/6 over-budget-cancels + deferred-cancel
M2 fire-and-forget cancel RED 5/6 deferred-cancel only
M3 >>= RED 5/6 exactly-MAX accepted
M4 remove value === undefined guard GREEN 6/6 survivor — dead code (Finding 3)
M5 remove releaseLock() RED 5/6 mid-stream locked assertion
M6 positive control: corrupt error message RED 3/6 the three message-asserting tests
M7a halve constant, head tests (import) GREEN 6/6 tests track the imported constant
M7b halve constant, commit-3 tests (local copy) RED 5/6 exactly-MAX — the import is load-bearing

9/9 cells as encoded. M6 proves the suite can be made red, so the kill counts and the M4/M7a survivors are trustworthy; M4 is classified dead code (a non-done read always carries a value), matching the PR's own disclosure — completeness reporting, not a merge condition.

Targeted gates

gate result
npx vitest run full package suite (from package dir) 172/172, 10 files (05-full-suite-and-gates.png)
npm -w integrations/external-context run build (main tree, CI-shape layout) exit 0
npm -w integrations/external-context run typecheck exit 0
npm -w packages/sdk-typescript run typecheck exit 0
eslint src (head tree) exit 0 clean; liveness: planted unused variable caught (@typescript-eslint/no-unused-vars at http-client.ts:174), restored re-run clean

Corrections

  • The previous round's correction (DaemonClient's fetch-body consumer already uses the explicit getReader() pattern via sse.ts; DaemonClient's for awaits iterate an async generator) stands at the new head — re-verified by grep and by the sdk typecheck above. No new corrections this round.

Findings (non-blocking)

  1. Description drift, extended (previous finding 2). The body still says "170/170 (10 files; 4 new in http-client.test.ts)" while the suite measures 172/172 with 6 tests, and still says "The guard stays — belt and suspenders" (zh: "防护保留") while commit 4 removes the guard. Both are harmless to the code; the body is describing commit 1's state. If the author touches the branch again, one line each would fix it.
  2. Reviewer Test Plan step 3 does not work as written. npx vitest run --config integrations/external-context/vitest.config.ts from the repo root exits 1 with "No test files found" — the include: ['src/**/*.test.ts'] glob resolves against cwd, not the config dir. From the package directory (or npm -w integrations/external-context test) it passes 172/172. Scripted: remesure-findings.console TP3/TP3b. The plan needs the cwd note.
  3. Pre-existing sibling, untouched (previous finding 1, stands): cancelResponseBody() remains fire-and-forget on the 3xx, non-ok, and declared-oversize paths — the same hazard class this PR's rationale fixes for readBoundedBody. Pre-existing cause; this PR contributes nothing to it. Report-only.
  4. Informational — same-class guards elsewhere. A repo sweep found node-only types guards of the same shape in packages/sdk-typescript, packages/web-templates, packages/desktop/apps/live-host, and packages/cua-driver/examples/agent-sdks tsconfigs. None of those packages iterate a fetch body with a raw for await (scripted sweep: zero such sites repo-wide; all body consumers are getReader() or generators), so none reproduces the incident shape today. Whether their guards are also obsolete by this PR's reasoning is a maintainer call, out of this PR's scope.

Not covered

  • Wire-level awaited-cancel ordering: the harness asserts server-observed teardown and immediate-retry success but cannot order client-reject vs server-observation across a socket; strict sequencing is pinned by the in-process barrier test (and by M2/commit-1 reds). Same position as the previous round, re-measured.
  • Base-side test coverage: only http-client.test.ts (the changed surface) ran against base-side trees, not the base workspace's full suite.
  • Repo-wide gates not run; targeted gates only.
  • git rev-list HEAD^1..HEAD^2 under-reports (1 vs 4) at the shallow graft; per-commit attribution was done by direct object checkout instead (all four commits' trees were present), so this is noted rather than repeated as a limitation.
  • The structural half the description defers (verification gate charging base-skew failures to PRs) remains out of scope by the PR's own statement.

Methodology

Environment: the verify lane's own node:22-bookworm container (live sample: @types/jsdom@28.0.3 already in root node_modules, TS 5.8.3, vitest 3.2.4, node v22.23.2). Four scratch git worktrees under tmp/ (base HEAD^1, commits c88d3ab/ba5dbade/4c7bad3), all nested under the repo root so every cell resolves the shared root node_modules — the autofix layout the incident happened in; the package has zero @qwen-code/* dependencies and http-client.ts imports nothing, so no internal workspace link can confound the control (asserted; realpath walk lands in root node_modules). The CI-shape layout (main tree, package-local @types/node@22.20.1) was additionally gated for build/typecheck. Harnesses: ab-build-matrix.sh, wire-harness.mjs, behavior-ab.sh, mutation-matrix.mjs, remesure-findings.sh, gates-summary.sh; raw logs: ab-build-matrix.log, wire-{head,base}.log/.err, behavior-*.json/.log, mutant-*.json, vitest-head-full.log, vitest-plan-step3.log, {build,typecheck,sdk-typecheck}-head.log, remesure-findings.console. Worktrees removed after capture; git status --porcelain empty. Assertion tally: 8 (build cells) + 36 (wire, 18×2 arms) + 18 (behavioral A/B, 6×3 arms) + 9 (mutation expectations) + 172 (head full suite) + 3 (build/typecheck/sdk gates) + 3 (lint liveness) + 11 (finding/test-plan re-measurements) = 260, all passing.

Evidence images

01-poisoned-build-ab-matrix

02-wire-harness-head-vs-base

03-behavior-ab-three-impls

04-mutation-matrix-head

05-full-suite-and-gates

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

Qwen Code · sandboxed verification

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Triage re-run completed without a new review.

⚠️ The bot's only review on 4c7bad3551e45d9bb33412b21c6ffdc01a666311 is a COMMENTED one, which carries no vote — so it has no verdict of its own on this commit, and main needs two approving reviews: an approval left by another account is a separate vote and does not count as the bot's own. Two different things look like this, and the stage-3 comment above says which: the triage skill deferring on purpose at 3/5 — a fork refactor hitting the approval guardrail, or a core change escalated for maintainer awareness, both normal outcomes — or an earlier approval that a push dismissed, leaving only the comment behind, which needs a fresh review.

⚠️ 机器人在 4c7bad3551e45d9bb33412b21c6ffdc01a666311 上唯一的评审是 COMMENTED不带票 —— 因此它在该 commit 上没有自己的裁决,而 main 需要两个批准(其他账号的批准是另一张票)。有两种情况长这样,上方的 stage-3 评论会说明是哪一种:triage skill 在 3/5 时有意 defer(fork refactor 命中审批护栏,或核心改动被升级交由维护者把关,两者都是正常结果);或者更早的批准被一次推送作废、只剩下这条评论,此时需要重新评审。

The stage comments above were updated with the latest result. View workflow run.

上方各阶段评论已更新为最新结果。查看工作流运行

yiliang114
yiliang114 previously approved these changes Aug 9, 2026

@yiliang114 yiliang114 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. The reader-loop rewrite preserves everything for-await did, and the tests pin it: bounded accumulation with the exact-MAX boundary, oversize rejection that cancels the stream and holds the reject until a deferred cancellation settles (parity with the awaited implicit iterator return()), mid-stream read failure mapped to the transport error with the lock released, and invalid-UTF-8 rejection. The getReader() API types identically in every lib set, so the build no longer depends on whether lib.dom.asynciterable resolves — and dropping the now-unneeded types:["node"] guard also removes the branch-vs-node_modules asymmetry that was discarding accepted autofix work behind #8693. CI green on this head. Nothing blocks merge.

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix round summary — PR #8764

Feedback triage

R3-3 — rc:3742691872 — invalid-UTF-8 test cannot discriminate fatal decoding ([Suggestion]) — RESOLVED

Verified the finding against this branch's head before acting: with { fatal: true } temporarily removed from the TextDecoder in readBoundedBody, the old fixture [0xff, 0xfe, 0xfd] still passed 6/6 — lax decoding yields three U+FFFD chars, JSON.parse throws on them, and postJson maps that to the same error the test asserts, so the mutant survived. Applied the suggested fixture: the invalid byte (0xff) now sits inside otherwise-valid JSON ({"a":"<invalid byte>"}), where lax decoding resolves { a: '\uFFFD' } while fatal decoding rejects. A second mutation probe confirmed the new fixture kills the mutant (fails with promise resolved "{ a: '\ufffd' }" instead of rejecting) and passes 6/6 against the correct code. Added a 3-line comment recording why the fixture bytes are load-bearing. No production code changed.

R3-1 — rc:3742691869 — PR description stale against the final head ([Suggestion]) — DEFERRED (maintainer edit required)

The finding is correct and was re-verified at this commit: the package suite reports 10 files / 172 tests with 6 in http-client.test.ts, and head 4c7bad3 removed the "types": ["node"] line from the tsconfig that the description still claims is kept. The fix is a PR-body edit, which this autofix environment cannot perform — it operates only inside the checkout with no GitHub write access, so the thread stays open for a maintainer. Suggested replacement text (also posted as a reply on the thread):

  • Replace "The guard stays — belt and suspenders" (and 中文 "防护保留——belt and suspenders") with: "The round-2 commit dropped the "types": ["node"] guard from integrations/external-context/tsconfig.json: the reader-loop rewrite made it loadless (per the R2-1 A/B), and build/typecheck were re-verified with it removed." / "第 2 轮 commit 删除了 integrations/external-context/tsconfig.json 中的 "types": ["node"] 防护:reader 循环重写后该防护不再承重(见 R2-1 的 A/B),并已在删除后重新验证 build/typecheck。"
  • Replace the Test Plan's "Expected: build/typecheck clean, 170/170 (10 files; 4 new in http-client.test.ts)" with "Expected: build/typecheck clean, 172/172 (10 files; 6 in http-client.test.ts)".
  • Replace the local-repro step that removes the "types": ["node"] line with a main-vs-branch comparison — the line no longer exists on this branch.

Changes this round

  • integrations/external-context/src/http-client.test.ts — discriminating fixture in the invalid-UTF-8 test plus a 3-line why-comment (commit 2cae67b071).

Verification

  • npx vitest run --config vitest.config.ts src/http-client.test.ts (integrations/external-context) — 6 passed
  • npx vitest run --config vitest.config.ts (integrations/external-context, full package) — 10 files / 172 passed
  • Mutation probe A: temporary removal of { fatal: true } with the OLD fixture — 6/6 passed, confirming the finding
  • Mutation probe B: same mutant with the NEW fixture — 1 failed | 5 passed, failing with the predicted resolved "{ a: '\ufffd' }" assertion; http-client.ts restored to its committed state afterward (working tree verified clean)
  • npx prettier --check integrations/external-context/src/http-client.test.ts — passed
  • npm run build — passed
  • npm run typecheck — passed
  • npm run lint — passed
  • No settings source changed, so npm run generate:settings-schema was not required. No production code changed, so no bundled-CLI/integration run was required.
中文说明

Autofix 本轮总结 — PR #8764

反馈分类处理

R3-3 — rc:3742691872 — 非法 UTF-8 测试无法区分 fatal 解码([Suggestion])— 已解决

在动手修复前,先在本分支 head 上验证了该发现:将 readBoundedBodyTextDecoder{ fatal: true } 临时删除后,旧测试数据 [0xff, 0xfe, 0xfd] 仍然 6/6 全部通过——宽松解码产生三个 U+FFFD 字符,JSON.parse 对其抛错,postJson 将该错误映射为测试所断言的同一条错误信息,因此变异体存活。已按建议更换测试数据:非法字节(0xff)现在位于 otherwise 合法的 JSON 内部({"a":"<invalid byte>"}),宽松解码会解析出 { a: '\uFFFD' } 成功返回,而 fatal 解码会拒绝。第二次变异探针确认新数据能杀死变异体(以 promise resolved "{ a: '\ufffd' }" instead of rejecting 失败),且在正确代码下 6/6 通过。另加了一条 3 行注释,说明该测试数据字节为何承重。生产代码无改动。

R3-1 — rc:3742691869 — PR 描述相对最终 head 已过时([Suggestion])— 暂缓(需维护者编辑)

该发现正确,并已在本提交上复核:包测试套件为 10 个文件 / 172 个测试,其中 http-client.test.ts 6 个;head 4c7bad3 已删除 tsconfig 中的 "types": ["node"] 行,而描述仍声称该行保留。修复方式是编辑 PR 正文,而本 autofix 环境无法执行此操作——它只在 checkout 内工作、没有任何 GitHub 写权限,因此该 thread 保持打开,留给维护者处理。建议替换文案(也已作为回复发布在该 thread 上):

  • 将 "The guard stays — belt and suspenders"(及中文 "防护保留——belt and suspenders")替换为:"The round-2 commit dropped the "types": ["node"] guard from integrations/external-context/tsconfig.json: the reader-loop rewrite made it loadless (per the R2-1 A/B), and build/typecheck were re-verified with it removed." / "第 2 轮 commit 删除了 integrations/external-context/tsconfig.json 中的 "types": ["node"] 防护:reader 循环重写后该防护不再承重(见 R2-1 的 A/B),并已在删除后重新验证 build/typecheck。"
  • 将 Test Plan 中 "Expected: build/typecheck clean, 170/170 (10 files; 4 new in http-client.test.ts)" 替换为 "Expected: build/typecheck clean, 172/172 (10 files; 6 in http-client.test.ts)"。
  • 将本地复现步骤中"删除 "types": ["node"] 行"的写法改为对比 main 与本分支——该行在本分支上已不存在。

本轮改动

  • integrations/external-context/src/http-client.test.ts — 非法 UTF-8 测试改用可区分解码层与 JSON 解析层的测试数据,并加 3 行注释说明原因(commit 2cae67b071)。

验证

  • npx vitest run --config vitest.config.ts src/http-client.test.ts(integrations/external-context)— 6 通过
  • npx vitest run --config vitest.config.ts(integrations/external-context 全包)— 10 个文件 / 172 通过
  • 变异探针 A:临时删除 { fatal: true } 后使用旧测试数据 — 6/6 通过,证实该发现
  • 变异探针 B:同一变异体使用新测试数据 — 1 失败 | 5 通过,失败信息为预期的 resolved "{ a: '\ufffd' }";随后 http-client.ts 已恢复至提交状态(已验证工作区干净)
  • npx prettier --check integrations/external-context/src/http-client.test.ts — 通过
  • npm run build — 通过
  • npm run typecheck — 通过
  • npm run lint — 通过
  • 未改动 settings 源码,因此无需 npm run generate:settings-schema。生产代码无改动,因此无需打包 CLI/集成测试。

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

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


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

@wenshao

wenshao commented Aug 9, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 9, 2026

Copy link
Copy Markdown
Collaborator

Sandboxed verification: ✅ passed — merge-ready (agent verdict) - workflow run

Ran the PR in an isolated, token-free container: A/B against the base build, mock-free harness assertions, targeted gates. Advisory evidence for human reviewers — not a review, an approval, or a CI check.

Scripted assertions: 268 passed · 0 failed · 268 total

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

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

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

Verification report

PR 8764 — verification report (follow-up round, head 2cae67b)

Verdict: merge-ready — 268/268 scripted assertions passed, 0 unexpected failures. Verified head: 2cae67b071d5e50e5032cfd826a0d2a866d76c86 (= snapshot headRefOid). Base tip this run afcc937ec57e90ec1b2f7ac2191672692c900279 (HEAD^1; metadata baseRefOid 33b124321c… has drifted). This is a follow-up round; the previous round verified head 4c7bad3551 with 260/260 assertions. The delta since then is one commit: 2cae67b"test(external-context): make the invalid-UTF-8 test pin fatal decoding".

中文 — 结论:✅ 通过 · 可合入(agent 判定)
  • 结论:merge-ready,脚本化断言 268/268 全部通过、0 条意外失败(总数见文首 verdict 行与 assertions.json)。
  • 本轮增量(commit 5:强化 invalid-UTF-8 测试):中心证据见 Mutation matrix 表的 M8/M8b 两行——把 fatal: true 改成 lax 解码后,恰好只有 rejects a body that is not valid UTF-8 一条变红;测试注释的断言也逐字核实——lax 解码会把测试的字节序列解析成 {"a":"\uFFFD"} 并被 JSON.parse 接受(S1 分类行),因此该测试现在真的钉住了 fatal 解码,而不是像旧形态那样可能"因错误的原因通过"。
  • 重测(未沿用上轮数字):poisoned build matrix 在新 base 尖端 afcc937 重跑,6/6 符合预期(C2 逐字符复现事故错误,C3 以无防护真实形态构建干净,探针证明 lib.dom 在场);wire oracle、行为 A/B、UTF-8 兄弟形状扫描、全套件与门禁全部在新 head 重跑,均通过。
  • 遗留 findings(均不阻塞,详见 Findings):描述漂移三条均在(170/170→实测 172/172、"4 new"→实测 6 条、"The guard stays/防护保留"→防护已删);测试计划第 3 步按原文从仓库根执行仍找不到测试文件;cancelResponseBody 三条路径仍是 fire-and-forget(预存在,未变);M4 依旧运行时死代码。
  • 未覆盖:commit 1/3/4 的对象在本轮 depth-2 检出中不可达,delta diff 无法直接计算(聚合 diff 与上轮验证状态一致);wire 层无法跨 socket 断言 reject 与 teardown 的先后(由进程内 barrier 测试钉住);base 侧仅覆盖变更面;未跑全仓 gate。

Previous-finding status at the new head

# finding (previous round) severity status at 2cae67b
1 pre-existing cancelResponseBody fire-and-forget cancel on the 3xx / non-ok / declared-oversize paths non-blocking stands — re-measured (scripted, remesure-findings.console): one void response.body?.cancel() inside the helper, 3 call sites, 0 awaited body cancels
2 description drift: body says "170/170 (10 files; 4 new)" and "The guard stays" nit stands, unchanged — body untouched since the previous round; suite still measures 172/172 with 6 tests in http-client.test.ts, and the guard is still absent from tsconfig.json (drift check: all three claims PRESENT in body, all three contradicted by measurement)
3 M4 survivor: value === undefined guard runtime-dead nit stands — M4 re-run at the new head: 6/6 green (mutation matrix below); dead code per the PR's own disclosure
correction: DaemonClient.ts's fetch-body consumer already uses getReader() via sse.ts correction stands — re-verified at new head: sse.ts:74 reads the body via getReader(); npm run typecheck -w packages/sdk-typescript exits 0

Every measurement was re-run at the new head — the test file changed in the delta commit, the base tip moved (4a79517afcc937), and no input closure was identical, so nothing was carried forward on the shortcut.

Central claim of the delta + A/B

Delta claim (commit 5): the invalid-UTF-8 test now pins fatal decoding — it fails if TextDecoder('utf-8', { fatal: true }) is relaxed — instead of passing for the wrong reason. The test's fixture was rebuilt so the invalid byte sits inside otherwise-valid JSON ({"a":"<0xff>"}), where lax decoding yields parseable {"a":"\uFFFD"} and would silently accept corrupted provider content.

Proof, three layers:

  1. Mutation kill (the load-bearing check) — matrix rows M8/M8b below: relaxing the decoder (option removed, or fatal: false) turns the suite 5/6 with exactly rejects a body that is not valid UTF-8 red. The delta test kills the mutation it was written to kill.
  2. Fixture claim verified byte-for-byteutf8-siblings.mjs S1: lax-decoding the test's exact bytes produces {"a":"\uFFFD"}, and JSON.parse accepts it (lax text="{\"a\":\"…\"}" parse={"a":"…"} in utf8-head.log). So fatal decoding is the only thing rejecting this shape — the test cannot pass for any other reason.
  3. Sibling sweep through the production path — five invalid-UTF-8 shapes (in-string 0xff, truncated 2-byte sequence, overlong 0xC0 0xAF, lone continuation byte, out-of-string invalid byte) driven through the compiled postJson of both arms: all 5 rejected with the invalid-response error on head and base (10/10 per arm). Classification shows S1–S4 would have been silently accepted under lax decoding (only fatal protects them); S5 is caught by lax too, but only accidentally (parse fails on the replacement char). No sibling escapes the fatal decoder; parity holds across the rewrite.

Build matrix at the new base tip — re-run because the base moved; all cells against the shared root node_modules (already contains @types/jsdom@28.0.3 from #8693 — the trusted-base state). Guard swap = copying the other tree's tsconfig, which differs by nothing else (9-line guard block, verified by diff). Witness: 01-poisoned-build-ab-matrix.png.

cell tree tsconfig result expectation
C1 base afcc937 as-is (guard present) exit 0, clean main is green today
C2 base guard removed exit 1, src/http-client.ts(124,29): error TS2504: Type 'ReadableStream<Uint8Array<ArrayBufferLike>>' must have a '[Symbol.asyncIterator]()' method that returns an async iterator. the incident, character for character
C3 head 2cae67b as-is — no guard, the shape that merges exit 0, clean the fix stands without the guard
C4 head guard re-added exit 0, clean re-adding is harmless
C5 head, + probe exporting document: Document as-is exit 0, clean lib.dom IS in the guardless program — C3 is not vacuous
C6 base, + same probe as-is (guard) exit 1, src/libdom-probe.ts(1,38): error TS2584: Cannot find name 'document'. the guard excluded lib.dom — probe validity control

6/6 cells as expected. C2 matches the PR body's quoted gate error byte for byte; C5/C6 prove the poison is active in this environment, so C3's clean build is the rewrite doing the work, not an absent hazard. (Previous-round cells 7/8 — commits c88d3ab/ba5dbade with guard removed — could not be re-run: those objects are unreachable in this round's depth-2 checkout; see Not covered.)

Wire oraclewire-harness.mjs: real node:http loopback server, real global fetch over a real socket, each arm's dist/ rebuilt from clean state. Asserts both sides of the wire. Witness: 02-wire-harness-head-vs-base.png.

scenario head dist base dist
W0 404 → ProviderHttpStatusError(404) (control) ok ok
W1 3-chunk assembly; server saw POST/Bearer/content-type/exact body ok ok
W2 exactly-MAX body accepted (strictly-greater bound) ok ok
W3 oversize endless stream rejected; server observed teardown ≤2 s (head: 2 ms, base: 1 ms); producer stopped at 3 chunks; immediate retry succeeds ok ok
W4 declared content-length > MAX rejected pre-stream (1–2 ms); connection closed after 64 KiB of the 1 MiB+1 body ok ok
W5 mid-stream socket drop → transport error, not parse error ok ok
W6 invalid UTF-8 rejected ok ok
W7 export surface: head exports MAX_RESPONSE_BYTES === 1048576; base does not ok ok

20/20 each arm, stderr 0 bytes on both (wire-{head,base}.err). Behavioral parity at the socket level is preserved, confirming the delta (test-only) changed no wire behavior.

Behavioral A/B — the PR's 6-test suite run against the base for await implementation (one non-behavioral adaptation: export added to the base constant so the test's import resolves). Witness: 04-behavior-ab-base-arm.png.

arm result
head reader loop (CONTROL, within matrix) 6/6
base for await 6/6

Parity: for await's implicit iterator return() provides the same cancel-and-await semantics the reader loop now does explicitly, so the rewrite preserves behavior on every pinned axis.

Mutation matrix (re-run at the new head)

Suite = the PR's http-client.test.ts (6 tests), one mutant per row, restored after each. Witness: 03-mutation-matrix-head.png.

mutant result killed by / classification
CONTROL unmutated head GREEN 6/6
M1 remove cancel entirely RED 4/6 over-budget-cancels + deferred-cancel
M2 fire-and-forget cancel (commit-1 shape) RED 5/6 deferred-cancel only — re-represents commit c88d3ab's shape, whose object is unreachable this round
M3 >>= RED 5/6 exactly-MAX accepted
M4 remove value === undefined guard GREEN 6/6 survivor — dead code (Finding 4)
M5 remove releaseLock() RED 5/6 mid-stream locked assertion
M6 positive control: corrupt error message RED 3/6 the three message-asserting tests — the suite can be made red, so kill counts are trustworthy
M7a halve source constant, head tests (import) GREEN 6/6 tests track the imported constant
M8 fatal: true removed (lax decoding) RED 5/6 exactly rejects a body that is not valid UTF-8 — the delta test pins fatal decoding
M8b fatal: false explicit RED 5/6 same single test
M7b-sim halved constant vs reconstructed pre-commit-4 local-copy test RED 5/6 exactly-MAX — the commit-4 import wiring stays load-bearing

11/11 cells as encoded. M6 is the positive control for the killers; M8/M8b are the delta's own claim, measured. M7b-sim reconstructs the pre-commit-4 test shape (local const MAX_RESPONSE_BYTES = 1024 * 1024 copy instead of the import), since commit 3's actual test file is unreachable this round — the reconstruction carries the same property the original pinned.

Targeted gates

gate result
npm test -w integrations/external-context full package suite 172/172, 10 files (vitest-head-full.log; witness 05-full-suite-and-gates.png)
npm -w integrations/external-context run build (main tree, CI-shape layout with package-local @types/node@22.20.1) exit 0
npm -w integrations/external-context run typecheck exit 0
npm run typecheck -w packages/sdk-typescript exit 0
eslint src (head tree) exit 0 clean; liveness: planted unused variable caught at http-client.ts:174:7 (@typescript-eslint/no-unused-vars, eslint-plant.log), restored re-run clean

Corrections

The previous round's correction stands (see status table): DaemonClient's fetch-body consumer already uses the explicit getReader() pattern via sse.ts:74, re-confirmed by grep and by the sdk typecheck gate above. No new corrections this round.

Findings (non-blocking)

  1. Description drift, unchanged (previous finding 2). The body still says "170/170 (10 files; 4 new in http-client.test.ts)" while the suite measures 172/172 with 6 tests, and still says "The guard stays — belt and suspenders" (zh: "防护保留") while the guard is removed from tsconfig.json. Scripted drift check: all three claims present in the body, all three contradicted by measurement (remesure-findings.console). Harmless to the code; one line each would fix it if the author touches the branch again.
  2. Reviewer Test Plan step 3 does not work as written (previous finding, stands). npx vitest run --config integrations/external-context/vitest.config.ts from the repo root exits 1 with "No test files found" — the include: ['src/**/*.test.ts'] glob resolves against cwd, not the config dir. From the package directory it passes 172/172. Scripted: TP3/TP3b in remesure-findings.console. The plan needs a cwd note.
  3. Pre-existing sibling, untouched (previous finding 1, stands): cancelResponseBody() remains fire-and-forget on the 3xx, non-ok, and declared-oversize paths — the same hazard class this PR's rationale fixes for readBoundedBody. Pre-existing cause; this PR contributes nothing to it. Report-only.
  4. M4 survivor — dead code (previous finding 3, stands): removing the value === undefined guard leaves all 6 tests green because a non-done read always carries a value at runtime. Classified dead code (not a coverage gap) per the PR's own disclosure; completeness reporting, not a merge condition.

Not covered

  • Delta attribution is the aggregate diff. Commits c88d3ab, dc1f1d4, ba5dbade, 4c7bad3 are unreachable in this round's depth-2 checkout (git rev-list --count HEAD^1..HEAD^2 reports 1 vs the snapshot's 5 — the shallow-graft under-report noted previously). The delta diff 4c7bad3..2cae67b therefore could not be computed directly; commit 5's "test-only" attribution is its commit message. What was verified instead: the aggregate HEAD^1..HEAD diff touches only the three known files; the production file's content matches the state the previous round verified at 4c7bad3 (export present, awaited cancel present, guard absent); and the delta's subject — the invalid-UTF-8 test — was exercised in depth (M8/M8b/S1). Per-commit attribution for commits 1–4 was executed in the previous round; its two behaviorally distinct shapes are re-represented this round by M2 (fire-and-forget) and M7b-sim (local-copy test).
  • Wire-level awaited-cancel ordering: the harness asserts server-observed teardown (≤2 s) and immediate-retry success but cannot order client-reject vs server-observation across a socket; strict sequencing is pinned by the in-process barrier test (and M2 red). Same position as previous rounds, re-measured.
  • Base-side test coverage: only http-client.test.ts (the changed surface) ran against the base tree, not the base workspace's full suite.
  • Repo-wide gates not run; targeted gates only.
  • The structural half the description defers (verification gate charging base-skew failures to PRs) remains out of scope by the PR's own statement.

Methodology

Environment: the verify lane's own node:22-bookworm container (live sample: @types/jsdom@28.0.3 already in root node_modules — the trusted-base poison state needed no install; TS 5.8.3, vitest 3.2.4, node v22.23.2). Two scratch git worktrees under tmp/ (base HEAD^1 = afcc937, head HEAD^2 = 2cae67b), both nested under the repo root so every cell resolves the shared root node_modules — realpath control asserted typescript and @types/node from inside the base worktree resolve to /__w/qwen-code/qwen-code/node_modules/… (no workspace-link confound; the package has zero @qwen-code/* dependencies and http-client.ts imports nothing). Worktree cells use root @types/node@20.19.1; the CI-shape layout (main tree, package-local @types/node@22.20.1) was additionally gated for build/typecheck. The base arm received one non-behavioral adaptation (export added to the constant declaration so the test's import resolves). Harnesses: build-matrix.sh, wire-harness.mjs, mutation-matrix.mjs, utf8-siblings.mjs, behavior-ab.sh, remesure-findings.sh; raw logs in logs/ (build-matrix.log/.console, wire-{head,base}.log/.err, utf8-{head,base}.log, mutation-matrix-head.console, per-mutant vitest JSON under logs/mutants/, vitest-base-arm.json, vitest-head-full.log, tp3-{root,pkgdir}.log, drift.log, eslint-{head,plant,restored}.log, {build,typecheck,sdk-typecheck}-head.log, remesure-findings.console). Evidence images rendered with scripts/verify-capture.mjs. Worktrees removed after capture; git status --porcelain empty. Assertion tally: 6 (build cells) + 42 (wire, 20×2 arms + 2 stderr-clean) + 11 (mutation expectations) + 6 (behavioral base arm) + 20 (UTF-8 siblings, 10×2 arms) + 172 (head full suite) + 3 (build/typecheck/sdk gates) + 3 (lint liveness) + 5 (finding/test-plan re-measurements) = 268, all passing.

Evidence images

01-poisoned-build-ab-matrix

02-wire-harness-head-vs-base

03-mutation-matrix-head

04-behavior-ab-base-arm

05-full-suite-and-gates

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

Qwen Code · sandboxed verification

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

Re-approving after the test tightening (my previous approval was dismissed by the push): the invalid-UTF-8 case now embeds the bad byte inside otherwise-valid JSON, which is the shape that actually distinguishes fatal decoding from lax decoding — lax would resolve it to U+FFFD and accept corrupted provider content, so the test now pins the fatal flag rather than passing either way. The reader-loop behavior itself is unchanged from the reviewed revision. CI green on this head. Nothing blocks merge.

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix review round — no action taken (PR #8764)

This round found no actionable feedback, so no code changes were made.

  • Reviews: none newer than the last evaluation.
  • Inline comments: none.
  • Failed checks / still-red checks: none listed.
  • Issue-level comments: the only new comment is the automated CI bot's status notification that sandboxed verification is currently running. It is informational only and requests no change.

The branch remains at its current head (2cae67b071), unchanged. If the running verification run posts findings, they will be triaged in a subsequent round.

中文说明

Autofix 审查轮次 —— 未采取任何操作(PR #8764

本轮未发现任何需要处理的反馈,因此未做任何代码改动。

  • 审查意见(Reviews): 自上次评估以来没有新的审查意见。
  • 行内评论(Inline comments): 无。
  • 失败的检查 / 持续失败的检查: 列表中没有任何失败项。
  • Issue 级评论: 唯一的新评论是自动化 CI 机器人发布的状态通知,表示沙箱验证正在运行中。该评论仅为信息性通知,未要求任何改动。

分支仍停留在当前 head(2cae67b071),未发生变化。如果正在运行的验证流程后续发布了具体的审查发现,将在下一轮中进行分类处理。

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


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

@wenshao

wenshao commented Aug 9, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /takeover stop

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

Copy link
Copy Markdown
Collaborator

👋 Takeover released: the autofix loop will no longer engage this PR (an in-flight round, if any, completes its bounded work). Re-apply autofix/takeover (or comment @qwen-code /takeover) to re-engage.

中文说明

👋 已释放:autofix 循环不再介入此 PR(在飞的一轮如有,将完成其有界工作)。重新打上 autofix/takeover 标签(或评论 @qwen-code /takeover)即可再次接管。

@wenshao
wenshao added this pull request to the merge queue Aug 9, 2026
Merged via the queue into main with commit 10621b3 Aug 9, 2026
75 of 76 checks passed
qwen-code-dev-bot pushed a commit to DragonnZhang/qwen-code that referenced this pull request Aug 10, 2026
…await (QwenLM#8525)

Port of QwenLM#8764 (10621b3) to this branch. Async-iterating a
ReadableStream needs [Symbol.asyncIterator] on the TYPE, and whether it
is there depends on which lib set the program resolves — @types/node's
stream has it, the DOM lib's needs lib.dom.asynciterable. This branch
predates QwenLM#8693, whose tsconfig "types" guard keeps @types/jsdom's
lib.dom out of the package program; the autofix verification build
resolves node_modules from the trusted base (which has @types/jsdom),
so the guardless branch fails the build with TS2504 on the `for await`.

The reader loop types identically in every lib set, so the build no
longer depends on that resolution. Behavior is unchanged and pinned by
the regression tests ported from the same commit: multi-chunk assembly,
the exact MAX_RESPONSE_BYTES boundary, oversize rejection with stream
cancellation, deferred-cancel sequencing, mid-stream read failure, and
invalid-UTF-8 rejection. The Mem0-related changes that share main's
http-client.ts (QwenLM#8507) are intentionally not ported.
@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Released in v0.21.9.

qwen-code-dev-bot added a commit that referenced this pull request Aug 11, 2026
…await (#8764)

* fix(external-context): read the response body with a reader, not for-await

Async-iterating a ReadableStream needs [Symbol.asyncIterator] on the
TYPE, and whether it is there depends on which lib set the program
resolves — @types/node's stream has it, the DOM lib's needs
lib.dom.asynciterable. That resolution flipped underneath this file on
2026-08-08: #8693 installed @types/jsdom at the root, vitest's types
pull the jsdom types in wherever they exist, and jsdom's carry
/// <reference lib="dom" />. #8693 shipped the tsconfig `types` guard in
the same commit, so main stayed green — but the guard travels with the
BRANCH while node_modules travel with the TRUSTED BASE in the autofix
verification build, so every managed branch behind #8693 failed that
build with TS2504 on this line. Two legs measured on run 31276008548:
63 minutes of accepted agent work discarded per round, 18 more minutes
burned by a repair step that cannot fix a failure outside the PR's diff
(#8614 reached attempt 13 that way; #8616 died identically).

Reproduced locally in both directions before changing anything:
@types/jsdom installed + guard removed = the gate's exact error,
character for character; with the reader loop the same poisoned setup
builds clean. The guard stays — belt and suspenders — but the build no
longer depends on it, or on which lib set any future environment
resolves.

Behavior is unchanged and now pinned by tests the file never had:
multi-chunk assembly, the exact MAX_RESPONSE_BYTES boundary (bound is
strictly-greater), invalid-UTF-8 rejection, and the easy one to drop in
this rewrite — cancelling the stream on early exit, which `for await`
did implicitly via iterator return(). Mutation-tested: removing the
cancel fails exactly that test against an endless producer.

The package's other for-awaits iterate process.stdin (a Node stream,
async-iterable in every lib set) and are untouched.

* fix(external-context): await stream cancellation before rejecting the request

On early exit from the reader loop (the oversize throw) cancellation was
started fire-and-forget, so postJson() rejected while the stream's
teardown was still settling — `for await` had awaited its implicit
iterator return() before propagating. An immediate retry could overlap
the previous response transport's unfinished cancellation. Await
reader.cancel() before releaseLock(), and pin the sequencing with a
deferred-cancel regression test that fails against the fire-and-forget
form.

Also cover read() rejecting after a partial chunk was received: the
error maps to the request-did-not-complete transport error rather than
EOF-then-parse of the partial JSON, and the reader lock is still
released.

* fix(external-context): drop the types guard the reader rewrite made obsolete

The `"types": ["node"]` override existed solely to keep @types/jsdom's
lib.dom out of this program while http-client.ts read the response body
with `for await` — the DOM lib's ReadableStream is not async-iterable,
and the flip broke the build with TS2504 (#8693). The reader loop that
replaced the `for await` types identically in every lib set, so the
guard is no longer load-bearing: with it removed, lib.dom re-enters the
program and the package still builds cleanly. Drop it with its stale
comment instead of leaving maintainers two contradicting stories about
whether it is needed.

Also export MAX_RESPONSE_BYTES and import it in the boundary tests
instead of re-declaring it locally, so the tests pin the real constant
rather than a copy that can silently drift.

* test(external-context): make the invalid-UTF-8 test pin fatal decoding

---------

Co-authored-by: verify <verify@local>
Co-authored-by: qwen-code-dev-bot <qwen-code-dev@service.alibaba.com>
qwen-code-dev-bot added a commit to ZevGit/qwen-code that referenced this pull request Aug 12, 2026
* fix(core): resolve Qwen 3.8 reasoning budget conflicts

* fix(core): cover unconfigured Qwen 3.8 conflicts

* chore: preserve latest main formatting

* fix(core): harden DashScope thinking precedence

* fix: honor DashScope thinking knob precedence

* test(core): assert same-layer thinking knob drop warning for request pairs (QwenLM#8525)

* fix: align effort override reporting with wire resolution

* fix: resolve thinking knob review findings

* fix: sort Python SDK test imports

* fix(core): ignore null thinking knobs

* fix(core): register enable_thinking true in thinking knob selection (QwenLM#8525)

selectFromLayer only registered enable_thinking === false, so a
higher-priority enable_thinking: true was invisible to cross-layer
resolution: a lower-priority samplingParams disable won selection and
rewrote the shipping tier to reasoning_effort 'none', inverting the
documented extra_body > samplingParams precedence. Register the
on-switch as the weakest knob in its own layer (an off-switch rewrites
the tier, an on-switch never does) and make the drop branch
value-aware: true keeps the shipping tier and drops only the redundant
knobs, false keeps the canonical 'none' disable.

getReasoningEffortOverride no longer reports an on-switch as shadowing
the tier (the wire drops the switch and ships the tier), except for a
request-level effort override that still shadows from under it.

Also corrects the dropConflictingThinkingKnobs contract comment (only
effort tiers ship alone; the 'none' disable and a winning budget keep
a co-present enable_thinking) and the model-providers.md precedence
callout, which overstated samplingParams precedence for older qwen
hybrids where the reasoning-derived enable_thinking: true overrides it.

* fix(core): preserve budget beneath thinking on-switch

* fix(core): canonicalize disabled thinking knobs

* fix: resolve round-6 thinking knob review findings (QwenLM#8525)

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>

* fix(external-context): read the response body with a reader, not for-await (QwenLM#8525)

Port of QwenLM#8764 (10621b3) to this branch. Async-iterating a
ReadableStream needs [Symbol.asyncIterator] on the TYPE, and whether it
is there depends on which lib set the program resolves — @types/node's
stream has it, the DOM lib's needs lib.dom.asynciterable. This branch
predates QwenLM#8693, whose tsconfig "types" guard keeps @types/jsdom's
lib.dom out of the package program; the autofix verification build
resolves node_modules from the trusted base (which has @types/jsdom),
so the guardless branch fails the build with TS2504 on the `for await`.

The reader loop types identically in every lib set, so the build no
longer depends on that resolution. Behavior is unchanged and pinned by
the regression tests ported from the same commit: multi-chunk assembly,
the exact MAX_RESPONSE_BYTES boundary, oversize rejection with stream
cancellation, deferred-cancel sequencing, mid-stream read failure, and
invalid-UTF-8 rejection. The Mem0-related changes that share main's
http-client.ts (QwenLM#8507) are intentionally not ported.

* fix(sdk-python): expose effort status reason from CLI (QwenLM#8525)

The CLI emits a human-readable reason on effort_status and the
TypeScript SDK surfaces it, but the Python EffortStatus TypedDict and
_parse_effort_status dropped it, leaving Python callers to reconstruct
the reason from override. Add reason as an optional field and pass it
through, mirroring the TypeScript parser.

* test(core): add direct unit tests for selectDashScopeThinkingKnob (QwenLM#8525)

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>

---------

Co-authored-by: qwen-code-dev-bot <qwen-code-dev@service.alibaba.com>
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Co-authored-by: qwen-code-dev-bot <qwen-code-dev-bot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants