Skip to content

fix(web-shell): allow session refresh with daemon auth - #8445

Merged
BZ-D merged 17 commits into
mainfrom
agent/fix-web-shell-session-refresh-auth
Aug 6, 2026
Merged

fix(web-shell): allow session refresh with daemon auth#8445
BZ-D merged 17 commits into
mainfrom
agent/fix-web-shell-session-refresh-auth

Conversation

@BZ-D

@BZ-D BZ-D commented Aug 3, 2026

Copy link
Copy Markdown
Collaborator

What this PR does

Allows an exact Web Shell session document navigation to load the public HTML shell before bearer authentication, while keeping non-document requests and all session API subpaths behind the existing authentication gate.

Adds regression coverage for GET and HEAD document navigation, the same-path JSON request, and an authenticated session API subpath.

Why it's needed

When qwen serve runs with a bearer token, refreshing /session/<id> currently returns 401 Unauthorized. Browser address-bar navigation cannot add the bearer header, and the token stored in the URL fragment or session storage is only available after the Web Shell JavaScript loads. The root page works because it is served before authentication, but the session deep-link fallback previously ran after authentication and was never reached.

This change restores refreshable session deep links without weakening API authentication.

Reviewer Test Plan

How to verify

  1. Start the Web Shell daemon with a bearer token and open it in a browser.
  2. Create or open a session, confirm the URL is /session/<id>, and refresh the page.
  3. Confirm the Web Shell reloads and restores the session instead of displaying Unauthorized.
  4. Confirm an unauthenticated JSON request to the exact session path still returns 401.
  5. Confirm unauthenticated requests to a session status subpath and /capabilities still return 401.

Evidence (Before & After)

Before: an unauthenticated document navigation to /session/<id> returned 401 application/json with {"error":"Unauthorized"}.

After: the same document navigation returns 200 text/html; the same-path JSON request, the session status API, and /capabilities continue to return 401 without a bearer token.

Tested on

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

Environment (optional)

Local macOS source daemon on loopback with QWEN_SERVER_TOKEN, built Web Shell assets, and HTTP probes for document and API requests.

Validation completed with the scoped Web Shell static-serving tests (17 passed), full build, full typecheck, ESLint, Prettier, and an independent token-daemon runtime verification. A full server test-file run also completed 849 tests; two unrelated session-group cases failed with socket hang up, while the scoped group passed repeatedly.

Risk & Scope

  • Main risk or tradeoff: the exact session document route serves the same unauthenticated, secret-free shell as the root route; document-navigation detection and exact path matching prevent API subpaths from bypassing authentication.
  • Not validated / out of scope: Windows and Linux browser refresh behavior was not manually tested.
  • Breaking changes / migration notes: None.

Linked Issues

Closes #8560

中文说明

本 PR 做了什么

允许精确的 Web Shell 会话文档导航在 bearer 鉴权前加载公开 HTML shell,同时保持非文档请求和所有会话 API 子路径继续经过现有鉴权。

新增回归覆盖,包括 GET 和 HEAD 文档导航、同路径 JSON 请求,以及需要鉴权的会话 API 子路径。

为什么需要

qwen serve 配置 bearer token 后,刷新 /session/<id> 当前会返回 401 Unauthorized。浏览器地址栏导航无法添加 bearer 请求头,而 URL fragment 或 session storage 中保存的 token 只有在 Web Shell JavaScript 加载后才能使用。根页面正常是因为它在鉴权前提供,但会话深链接 fallback 之前位于鉴权之后,因此永远无法到达。

此变更恢复会话深链接刷新能力,同时不削弱 API 鉴权。

Reviewer Test Plan

如何验证

  1. 使用 bearer token 启动 Web Shell daemon,并在浏览器中打开。
  2. 创建或打开一个会话,确认 URL 为 /session/<id>,然后刷新页面。
  3. 确认 Web Shell 能重新加载并恢复会话,不再显示 Unauthorized
  4. 确认对精确会话路径发起未鉴权 JSON 请求时仍返回 401。
  5. 确认对会话状态子路径和 /capabilities 发起未鉴权请求时仍返回 401。

证据(修复前后)

修复前:未鉴权的 /session/<id> 文档导航返回 401 application/json,响应为 {"error":"Unauthorized"}

修复后:相同文档导航返回 200 text/html;同路径 JSON 请求、会话状态 API 和 /capabilities 在没有 bearer token 时仍返回 401。

测试系统

OS 状态
🍏 macOS
🪟 Windows N/A
🐧 Linux N/A

环境(可选)

macOS 本地源码 daemon,绑定 loopback,配置 QWEN_SERVER_TOKEN,使用已构建的 Web Shell 资源,并通过 HTTP 探测文档请求和 API 请求。

验证包括 Web Shell 静态服务定向测试(17 项通过)、完整构建、完整类型检查、ESLint、Prettier,以及独立的 token daemon 运行时复验。完整 server 测试文件也运行了 849 项;两个无关的 session-group 用例因 socket hang up 失败,而定向分组重复运行均通过。

风险与范围

  • 主要风险或取舍:精确会话文档路由会提供与根路由相同的未鉴权、无敏感信息 shell;文档导航检测和精确路径匹配确保 API 子路径不会绕过鉴权。
  • 未验证或不在范围内:未在 Windows 和 Linux 上手动验证浏览器刷新行为。
  • 破坏性变更或迁移说明:无。

关联 Issue

Closes #8560

@BZ-D

BZ-D commented Aug 3, 2026

Copy link
Copy Markdown
Collaborator Author

E2E Test Report

Environment: macOS, source daemon on loopback, built Web Shell assets, bearer authentication configured through QWEN_SERVER_TOKEN.

Baseline

  • GET / as a document navigation: 200 text/html
  • GET /session/<id> as a document navigation: 401 application/json, {"error":"Unauthorized"}

After the fix

  • GET /session/<id> as a document navigation without an Authorization header: 200 text/html, Web Shell root rendered
  • HEAD /session/<id> as a document navigation without an Authorization header: 200
  • GET /session/<id> with Accept: application/json and no Authorization header: 401 application/json
  • GET /session/<id>/status without an Authorization header: 401 application/json
  • GET /capabilities without an Authorization header: 401 application/json

An independent verification run reproduced the same result on a separate token daemon.

Automated validation

  • Scoped Web Shell static-serving tests: 17 passed
  • Full build: passed
  • Full typecheck: passed
  • ESLint: passed
  • Prettier: passed

The complete server test file was also run: 849 tests passed and two unrelated session-group tests failed with socket hang up. The scoped Web Shell group passed repeatedly.

@BZ-D
BZ-D marked this pull request as ready for review August 3, 2026 08:25
@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Qwen Triage finishedview run. See the stage comments in this thread for the result.

Qwen Triage 已完成 —— 查看运行。结果见本线程中的各阶段评论。

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Re-run at the current head — gate summary, updated from the 2026-08-03 pass.

  • Template: complete ✓ — required sections present, bilingual body, reviewer test plan with before/after included.
  • Problem: observed bug with a linked issue — Web Shell: refreshing a session deep link returns 401 Unauthorized when qwen serve has a bearer token #8560 carries a concrete reproduction (qwen serve --token … → open a session → refresh /session/<id>401 Unauthorized), and the mechanism verifies against the base code: the SPA deep-link fallback is registered behind bearerAuth, so an unauthenticated refresh can never reach it, while / works because it is mounted pre-auth.
  • Direction: aligned — refreshable session deep links are basic browser UX for a token-gated daemon, and the fix extends the existing "the shell carries no secrets; serve it before auth" design that already covers / and /assets/*. The previous run deferred here because the change carves a pre-auth exception out of the bearer gate, which is auth-touching and needed maintainer sign-off. That condition is now met: @yiliang114 signed off on the carve-out explicitly in review, and @wenshao verified the auth gate end-to-end on a real daemon + browser (23 HTTP probes, cold-window probes, mutation-checked tests) and approved the current head. The gate proceeds.
  • Size: 119 production lines (server.ts +3/−1, web-shell-static.ts +53/−2, run-qwen-serve.ts +44/−16), 494 test lines, 2 docs lines. Not a core-module path; Stage 0 is N/A.
  • Approach: matches the independent proposal — mount an exact /session/:id route in the pre-auth static mount guarded by isDocumentNavigation, and mirror the same surface (isPreAuthWebShellRequest) into the deferred-runtime cold gate so a cold daemon answers the shell's entry points the same way the warm app does. The alternative — moving the whole SPA fallback ahead of auth — is strictly worse (an attacker-controlled Accept: text/html would mask real routes' 401s), and the diff doesn't do it. Scope grew since the first gate pass (deferred-window handling, startup-failure envelope, hermetic integration workspace), but each addition maps to a review round; no drive-by changes.
  • Risk: no high-risk path matches. Previously flagged property, since probed: the Accept: text/html / Sec-Fetch-Mode signal is client-controllable, but the only thing it can draw is the same public shell / already serves unauthenticated — no data exposure. The maintainer's %2F URL-shape observation is now documented in the code.

Moving on to code review. 🔍

中文说明

在当前 head 上的重跑 —— 门禁摘要,基于 2026-08-03 那一轮更新。

  • 模板:完整 ✓ —— 必填章节齐全,含中文翻译与 Reviewer Test Plan(含 before/after)。
  • 问题:已观测到的 bug,且有关联 issue —— Web Shell: refreshing a session deep link returns 401 Unauthorized when qwen serve has a bearer token #8560 提供了具体复现(qwen serve --token … → 打开会话 → 刷新 /session/<id>401 Unauthorized),机制也在基线代码中核实过:SPA 深链接 fallback 注册在 bearerAuth 之后,未鉴权的刷新永远到不了那里;而 / 正常是因为它在鉴权之前挂载。
  • 方向:对齐 —— 可刷新的会话深链接是 token 网关 daemon 的基本浏览器体验,此修复延续了"shell 不含敏感信息、在鉴权前提供"这一已覆盖 //assets/* 的既有设计。上一轮在此止步,是因为该改动在 bearer 关卡上开了免鉴权例外,属于 auth 相关变更、需要维护者确认。该条件现已满足@yiliang114 在评审中明确为该例外签字放行,@wenshao 在真实 daemon + 浏览器上端到端验证了鉴权门(23 组 HTTP 探测、冷启动窗口探测、变异测试核验测试有效性),并已批准当前 head。门禁放行。
  • 规模:生产代码 119 行(server.ts +3/−1、web-shell-static.ts +53/−2、run-qwen-serve.ts +44/−16),测试 494 行,文档 2 行。未触及核心模块路径,Stage 0 不适用。
  • 方案:与独立提出的方案一致 —— 在鉴权前的静态挂载中加精确的 /session/:id 路由、用 isDocumentNavigation 守卫,并把同一表面(isPreAuthWebShellRequest)镜像进 deferred-runtime 冷门,使冷 daemon 与热 app 对 shell 入口的应答一致。替代方案——把整个 SPA fallback 移到鉴权之前——严格更差(攻击者可控的 Accept: text/html 会遮蔽真实路由的 401),diff 也没有这么做。相比第一次门禁,范围有所增长(deferred 窗口处理、启动失败 envelope、集成测试工作区隔离),但每项增长都对应一轮评审反馈,无顺手改动。
  • 风险:未命中高风险路径。此前提出的属性已被探测确认:Accept: text/html / Sec-Fetch-Mode 信号可被客户端控制,但能取到的只是与 / 无鉴权提供的完全相同的公开 shell —— 无数据泄露。维护者发现的 %2F URL 形态观察现已写入代码注释。

进入代码审查。🔍

Qwen Code · qwen3.8-max

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

@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 83.32% 83.32% 89.38% 82.43%
Core 87.66% 87.66% 89.27% 86.23%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   83.32 |    82.43 |   89.38 |   83.32 |                   
 src               |   84.77 |    80.78 |   88.39 |   84.77 |                   
  cli.ts           |   95.68 |    84.11 |     100 |   95.68 | ...60-561,565-566 
  gemini.tsx       |   72.66 |    76.99 |   80.76 |   72.66 | ...1280-1284,1405 
  ...ractiveCli.ts |   86.49 |    80.46 |   87.93 |   86.49 | ...2926,2932,2994 
  ...liCommands.ts |   89.11 |    85.15 |      90 |   89.11 | ...90,507,541,663 
  ...ActiveAuth.ts |     100 |     87.5 |     100 |     100 | 66-80             
 ...cp-integration |   70.24 |     72.9 |   89.96 |   70.24 |                   
  acpAgent.ts      |   69.93 |    72.78 |      90 |   69.93 | ...77,11882-11884 
  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,238-239 
 ...ration/session |   90.88 |    86.21 |   96.29 |   90.88 |                   
  Session.ts       |   89.94 |     84.6 |   95.41 |   89.94 | ...81,10308-10312 
  ...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.22 |    90.81 |     100 |   93.22 | 72,83-86,112-122  
  ...y-replayer.ts |   98.53 |    95.52 |     100 |   98.53 | 238-240           
  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 |   95.79 |    93.52 |   96.66 |   95.79 |                   
  ...ageEmitter.ts |   95.34 |    94.28 |     100 |   95.34 | 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.37 |   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.6 |      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.43 |    72.18 |   64.51 |   89.43 |                   
  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.59 |      100 |      50 |   98.59 | 82                
  serve.ts         |   87.35 |    66.66 |     100 |   87.35 | ...97,709,725-729 
  sessions.ts      |     100 |      100 |      50 |     100 |                   
  update.ts        |   98.13 |    94.44 |   66.66 |   98.13 | 82-83             
 ...mmands/channel |    88.3 |    87.64 |    90.3 |    88.3 |                   
  channel-cwd.ts   |     100 |      100 |     100 |     100 |                   
  ...l-registry.ts |      80 |    84.61 |      80 |      80 | 37-40,49-52,63-66 
  ...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.9 |    85.39 |   94.11 |    93.9 | ...1211,1218-1219 
  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       |   72.85 |      100 |      50 |   72.85 | 22-28,57-68       
  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.82 |   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 |     90.9 |     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 |    55.55 |     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.17 |    84.39 |   83.33 |   90.17 |                   
  add.ts           |    99.3 |    96.07 |     100 |    99.3 | 154-155           
  approve.ts       |   76.19 |     87.5 |   66.66 |   76.19 | ...,89-99,114-124 
  list.ts          |   92.59 |    83.87 |      80 |   92.59 | ...62-164,180-181 
  reconnect.ts     |   78.85 |    66.66 |   85.71 |   78.85 | 42-55,169-191     
  remove.ts        |     100 |       80 |     100 |     100 | 21-25             
 ...ommands/review |   86.54 |    87.75 |    87.2 |   86.54 |                   
  agent-prompt.ts  |    92.1 |    92.95 |   96.42 |    92.1 | ...1954,2057-2136 
  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 |   46.92 |    13.33 |   66.66 |   46.92 | ...35-240,253-263 
  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.11 |    91.88 |   95.83 |   96.11 | ...1792,1820-1842 
  cost-ledger.ts   |   94.67 |    95.86 |   78.57 |   94.67 | ...00-501,541-551 
  drive.ts         |   72.22 |    88.88 |   72.72 |   72.22 | ...34-469,473-487 
  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 
  mock-provider.ts |   95.44 |    90.25 |   89.47 |   95.44 | 145,690-709       
  parse-args.ts    |   99.32 |    96.42 |     100 |   99.32 | 400,473           
  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.24 |    82.75 |   71.42 |   77.24 | ...89-535,537-548 
  ...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 |   79.13 |    79.68 |   88.23 |   79.13 | ...50-381,383-386 
  script-lint.ts   |   83.67 |    78.41 |   88.88 |   83.67 | ...59-773,775-797 
  submit.ts        |   83.88 |    83.11 |    90.9 |   83.88 | ...66-470,570-606 
  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.79 |    94.28 |   97.02 |   96.79 |                   
  agent-briefs.ts  |   98.83 |      100 |       0 |   98.83 | 662-663           
  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 |      100 |     100 |     100 |                   
  coverage.ts      |   95.73 |    95.21 |   95.45 |   95.73 | ...13,350,459-476 
  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            |   85.92 |    91.11 |   73.33 |   85.92 | ...32,269-270,297 
  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 
  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 |   95.57 |     87.5 |     100 |   95.57 | ...34,173-174,180 
  receipt.ts       |     100 |      100 |     100 |     100 |                   
  report.ts        |   94.68 |    93.75 |     100 |   94.68 | 187-191           
  retirement.ts    |     100 |    88.75 |     100 |     100 | ...64-265,284,383 
  review-footer.ts |     100 |      100 |     100 |     100 |                   
  roster.ts        |     100 |    94.23 |     100 |     100 | 143,161,206       
  shell-quote.ts   |     100 |      100 |     100 |     100 |                   
  test-utils.ts    |     100 |      100 |     100 |     100 |                   
  transcripts.ts   |   96.49 |    94.44 |     100 |   96.49 | ...98,284-285,309 
  ...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.42 |    88.91 |   95.65 |   94.42 |                   
  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.93 |    88.61 |   83.78 |   88.93 | ...2456,2458-2466 
  ...cy-monitor.ts |   88.75 |    76.19 |     100 |   88.75 | ...3,90-92,98,101 
  ...ust-policy.ts |   83.04 |    88.49 |     100 |   83.04 | ...39,253,352-353 
  ...heme-names.ts |     100 |      100 |     100 |     100 |                   
  environment.ts   |   94.33 |    89.61 |   94.73 |   94.33 | ...35-639,655-656 
  ...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.87 |     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 |   61.64 |    71.87 |   66.66 |   61.64 | ...54-68,73,77-89 
  ...ings-cache.ts |   98.26 |    97.14 |     100 |   98.26 | 201-202           
  settings.ts      |   90.99 |     92.3 |      90 |   90.99 | ...1006,1008-1009 
  ...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 
  ...tedFolders.ts |   93.42 |    94.21 |     100 |   93.42 | ...96-397,433-444 
 ...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 |    76.31 |   81.35 |      80 |                   
  session.ts       |   84.08 |    75.27 |   93.61 |   84.08 | ...1007,1016-1026 
  types.ts         |    42.5 |      100 |   33.33 |    42.5 | ...31-632,635-636 
 ...active/control |   75.63 |    89.09 |      80 |   75.63 |                   
  ...rolContext.ts |    6.45 |        0 |       0 |    6.45 | 56-95             
  ...Dispatcher.ts |   91.79 |    92.45 |   88.88 |   91.79 | ...49-367,387,390 
  ...rolService.ts |    6.89 |        0 |       0 |    6.89 | 46-188            
 ...ol/controllers |   42.27 |    64.66 |   48.64 |   42.27 |                   
  ...Controller.ts |   39.49 |      100 |      80 |   39.49 | 88-92,127-210     
  ...Controller.ts |       0 |        0 |       0 |       0 | 1-56              
  ...Controller.ts |   53.96 |    65.71 |   58.33 |   53.96 | ...37-642,644-649 
  ...Controller.ts |   14.06 |      100 |       0 |   14.06 | ...82-117,130-133 
  ...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.13 |   95.23 |    98.1 |                   
  ...putAdapter.ts |   97.98 |     93.2 |   98.07 |   97.98 | ...1415,1431-1432 
  ...putAdapter.ts |      96 |    91.66 |   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.19 |    83.33 |   90.33 |   87.19 |                   
  ...tp-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |    93.4 |    92.95 |     100 |    93.4 | ...19-320,323-325 
  ...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 |   93.89 |    86.61 |     100 |   93.89 | ...66-468,475,477 
  ...-selection.ts |     100 |      100 |     100 |     100 |                   
  ...ings-store.ts |    86.2 |     92.4 |   95.83 |    86.2 | ...94-206,372-375 
  ...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 | ...1462,1516-1520 
  ...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 
  ...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.47 |    90.59 |     100 |   98.47 | ...1197,1199-1200 
  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.41 |    88.75 |     100 |   94.41 | ...24,702,718,728 
  fast-path.ts     |   90.61 |    81.25 |   95.45 |   90.61 | ...02-511,577-578 
  ...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.55 |    79.62 |   75.17 |   83.55 | ...7192,7198-7199 
  ...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.25 |    90.87 |   70.75 |   90.25 | ...2659,2673-2677 
  ...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 | ...13,816,829-831 
  ...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.19 |     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.74 |     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.8 |     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.22 |     79.5 |   95.15 |   85.22 |                   
  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.45 |    83.33 |     100 |   85.45 | 98-105            
  goals.ts         |   98.92 |     90.9 |     100 |   98.92 | 146               
  health-demo.ts   |   94.73 |     86.2 |     100 |   94.73 | 62-66,154         
  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 | ...4768,4770-4771 
  sse-events.ts    |   84.45 |     87.5 |   77.77 |   84.45 | ...36,453-456,485 
  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.38 |     78.4 |     100 |   90.38 | ...55-456,475-476 
  ...d-contacts.ts |     100 |      100 |     100 |     100 |                   
  ...controller.ts |   83.09 |       79 |      90 |   83.09 | ...1032,1038,1041 
  ...extensions.ts |   87.23 |    72.76 |   94.11 |   87.23 | ...1826,1871-1872 
  ...-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.11 |   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.19 |     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   |   83.35 |    92.22 |   90.47 |   83.35 |                   
  ...ice-config.ts |   84.61 |       30 |     100 |   84.61 | 90-99,103-104     
  voice-ws.ts      |   77.16 |    94.73 |   83.33 |   77.16 | ...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.31 |    88.46 |   97.84 |   92.31 |                   
  ...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.83 |     100 |   98.64 | 116,142-143       
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  voice-service.ts |   90.37 |    87.87 |     100 |   90.37 | ...80,287,352-357 
  ...e-settings.ts |     100 |    95.23 |     100 |     100 | 19                
  ...ranscriber.ts |   90.46 |    82.19 |      96 |   90.46 | ...66-668,671-673 
 ...rvices/insight |     100 |      100 |     100 |     100 |                   
  dates.ts         |     100 |      100 |     100 |     100 |                   
 ...ght/generators |   88.91 |    86.29 |   96.15 |   88.91 |                   
  DataProcessor.ts |   88.28 |    86.24 |   94.73 |   88.28 | ...1352,1356-1363 
  ...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 | 95-98             
  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            |   72.71 |    75.23 |    65.9 |   72.71 |                   
  App.tsx          |   33.33 |       75 |   33.33 |   33.33 | 32-86             
  AppContainer.tsx |   73.93 |    72.14 |   70.58 |   73.93 | ...4099,4215-4221 
  ...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 |   68.12 |    64.86 |   33.33 |   68.12 | ...98,321,341-346 
  ...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.5 |    82.88 |   89.12 |    82.5 |                   
  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 |   68.28 |    70.14 |   84.61 |   68.28 | ...66-599,610-611 
  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 |   93.45 |    89.06 |     100 |   93.45 | ...68-169,196-206 
  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.9 |    86.04 |     100 |    90.9 | ...41-146,176-177 
  resumeCommand.ts |     100 |      100 |     100 |     100 |                   
  rewindCommand.ts |   81.25 |      100 |      50 |   81.25 | 20-22             
  ...ngsCommand.ts |     100 |      100 |     100 |     100 |                   
  ...hubCommand.ts |   89.47 |       75 |      80 |   89.47 | 54-59             
  skillsCommand.ts |   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 |   91.86 |    78.87 |   66.66 |   91.86 | ...60-161,170-175 
 src/ui/components |   71.28 |    78.65 |   79.62 |   71.28 |                   
  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       |   74.09 |     61.4 |      50 |   74.09 | ...55-260,278-282 
  ...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.06 |    66.33 |     100 |   79.06 | ...04,507,510-516 
  ...ngeDialog.tsx |     100 |      100 |     100 |     100 |                   
  InputPrompt.tsx  |    83.1 |    81.95 |      80 |    83.1 | ...2199,2225,2299 
  ...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  |    95.9 |    92.53 |      50 |    95.9 | ...99,445-449,452 
  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 |   92.97 |    83.87 |     100 |   92.97 | ...45,248,275-277 
  ...inalImage.tsx |     100 |     90.9 |     100 |     100 | 75,93             
  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 |   82.95 |    81.71 |   92.72 |   82.95 |                   
  ...sksDialog.tsx |   78.73 |    77.65 |   84.61 |   78.73 | ...1809,1833-1839 
  ...TasksPill.tsx |   67.74 |    86.66 |     100 |   67.74 | ...04-124,132-140 
  ...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.04 |    61.53 |   70.58 |   40.04 |                   
  ...ealthPill.tsx |   68.42 |    85.71 |     100 |   68.42 | 40-46             
  ...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 |   89.93 |    86.41 |   85.29 |   89.93 |                   
  ...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 |   93.46 |      100 |   76.92 |   93.46 | ...90-292,295-298 
  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.38 |    81.02 |     100 |   91.38 | ...33-635,642-644 
  ...upMessage.tsx |   98.32 |    95.16 |     100 |   98.32 | 184-187,414       
  ToolMessage.tsx  |   92.62 |    85.22 |   93.33 |   92.62 | ...-982,1009-1011 
 ...ponents/shared |   85.79 |    81.94 |   94.11 |   85.79 |                   
  ...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.86 |      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 |   72.72 |      100 |     100 |   72.72 | 31-33             
  TextInput.tsx    |    80.8 |    67.24 |      80 |    80.8 | ...36-240,252-258 
  ...ontroller.tsx |     100 |    81.81 |     100 |     100 | 59-62             
  ...apsedTime.tsx |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |     100 |      100 |     100 |     100 |                   
  ...lizedList.tsx |   88.51 |    83.75 |   81.81 |   88.51 | ...51-779,792,887 
  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 |   69.81 |    72.64 |   61.11 |   69.81 |                   
  ContextUsage.tsx |   70.88 |    63.88 |      80 |   70.88 | ...20-426,463-557 
  DoctorReport.tsx |     9.8 |      100 |       0 |     9.8 | 25-54,57-131      
  ...sionsList.tsx |   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   |   83.96 |    81.62 |    86.3 |   83.96 |                   
  ...ewContext.tsx |   64.83 |    88.88 |      50 |   64.83 | ...16-219,225-235 
  AppContext.tsx   |      80 |       50 |     100 |      80 | 19-20             
  ...ewContext.tsx |   92.45 |    62.79 |      50 |   92.45 | ...69-270,272-276 
  ...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      |   84.84 |    82.63 |   87.75 |   84.84 |                   
  ...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 | ...86-287,292-293 
  ...dProcessor.ts |   85.63 |    68.16 |   81.81 |   85.63 | ...1452,1473-1477 
  ...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 |      42 |       75 |     100 |      42 | 42-44,53-59,62-87 
  ...odeCommand.ts |   58.82 |      100 |     100 |   58.82 | 28,33-48          
  ...enaCommand.ts |      85 |      100 |     100 |      85 | 23-24,29          
  ...aInProcess.ts |   27.92 |       80 |      25 |   27.92 | ...69-170,173-175 
  ...Completion.ts |   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.81 |    76.59 |     100 |   94.81 | 162-166,255,261   
  ...chedScroll.ts |     100 |      100 |     100 |     100 |                   
  ...ketedPaste.ts |    23.8 |      100 |       0 |    23.8 | 19-37             
  ...nchCommand.ts |   95.23 |    82.69 |     100 |   95.23 | ...53-154,277-280 
  ...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 |   83.07 |    80.25 |   74.35 |   83.07 | ...4909-4911,4913 
  ...BranchName.ts |     100 |    94.44 |     100 |     100 | 54                
  ...oryManager.ts |   98.01 |    98.36 |     100 |   98.01 | 139-142           
  ...ooksDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...stListener.ts |     100 |      100 |     100 |     100 |                   
  ...nAuthError.ts |   76.19 |       50 |     100 |   76.19 | 39-40,43-45       
  ...putHistory.ts |   92.59 |    85.71 |     100 |   92.59 | 63-64,72,94-96    
  ...storyStore.ts |     100 |    94.11 |     100 |     100 | 69                
  useKeypress.ts   |     100 |      100 |     100 |     100 |                   
  ...rdProtocol.ts |   36.36 |      100 |       0 |   36.36 | 24-31             
  ...unchEditor.ts |   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  |   63.15 |       80 |      50 |   63.15 | 42-52,64-67       
  ...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.11 |    87.32 |     100 |   89.11 | ...42-444,476-486 
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-7               
  ...umeCommand.ts |   95.18 |    76.47 |     100 |   95.18 | 118-119,220-225   
  ...ompletion.tsx |   90.67 |    83.33 |     100 |   90.67 | ...02,105,138-141 
  ...ectionList.ts |   97.12 |    96.22 |     100 |   97.12 | ...92-193,247-250 
  ...sionPicker.ts |   92.87 |    90.35 |     100 |   92.87 | ...99-501,503-505 
  ...earchInput.ts |     100 |    97.29 |     100 |     100 | 82                
  ...ngsCommand.ts |   18.75 |      100 |       0 |   18.75 | 10-25             
  ...ellHistory.ts |   93.28 |    80.95 |     100 |   93.28 | ...96,153-154,164 
  ...oryCommand.ts |   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      |   86.74 |    84.95 |   95.48 |   86.74 |                   
  ...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.17 |    94.73 |     100 |   91.17 | 31-33             
  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           
  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.1 |     100 |   98.38 | 195-197           
  ...mConstants.ts |     100 |      100 |     100 |     100 |                   
  restoreGoal.ts   |     100 |      100 |     100 |     100 |                   
  ...storyUtils.ts |   79.42 |    78.08 |     100 |   79.42 | ...50-572,703-704 
  ...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 |   89.19 |    79.54 |     100 |   89.19 | ...14,316-318,434 
  ...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      |   80.94 |    72.59 |   80.55 |   80.94 |                   
  ...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 |   89.72 |    65.33 |   93.75 |   89.72 | ...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 |    68.42 |     100 |   86.79 | 16-18,48-49,59-60 
  ...am-session.ts |   88.02 |    66.17 |   84.61 |   88.02 | ...26,343-345,363 
  ...ranscriber.ts |     100 |      100 |     100 |     100 |                   
 src/utils         |    81.4 |       87 |   92.57 |    81.4 |                   
  ...p-profiler.ts |   98.39 |    90.56 |     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 |       90 |     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 |   86.64 |    77.02 |     100 |   86.64 | ...03-304,335-345 
  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.67 |    56.93 |   76.92 |   45.67 | ...1034,1046-1069 
  ...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.66 |    86.23 |   89.27 |   87.66 |                   
 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.46 |    84.13 |   95.65 |   90.46 |                   
  ...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 |   96.15 |    90.13 |   98.76 |   96.15 | ...1732,1752-1755 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ent-result.ts |    96.8 |    92.68 |     100 |    96.8 | 106,129-131       
  ...n-registry.ts |    93.3 |    86.11 |     100 |    93.3 | ...85-991,996-998 
  ...w-snapshot.ts |   91.86 |    75.75 |     100 |   91.86 | ...54,178,185-187 
 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 |   90.55 |    86.14 |   87.64 |   90.55 |                   
  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 |                   
  ...ow-journal.ts |   91.76 |    75.86 |     100 |   91.76 | ...38-139,179-181 
  ...chestrator.ts |   91.86 |    88.71 |   82.35 |   91.86 | ...1782,1831-1834 
  ...ow-prompts.ts |     100 |      100 |     100 |     100 |                   
  ...low-runner.ts |    94.3 |    87.17 |   91.66 |    94.3 | ...74,222,242-245 
  ...ow-sandbox.ts |   96.87 |    94.64 |     100 |   96.87 | ...24-325,330-331 
  ...flow-saved.ts |   96.51 |    94.36 |     100 |   96.51 | 134-135,234-237   
  ...flow-stall.ts |    97.9 |    83.33 |     100 |    97.9 | 138-139,236       
 src/agents/tasks  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/agents/team   |   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.97 |    87.13 |   75.37 |   84.97 |                   
  approval-mode.ts |     100 |      100 |     100 |     100 |                   
  ...xtDefaults.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   84.29 |    86.85 |   73.79 |   84.29 | ...8346,8350-8351 
  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          |   91.95 |    87.93 |   93.23 |   91.95 |                   
  baseLlmClient.ts |   88.37 |    83.68 |   81.81 |   88.37 | ...51,664,670-672 
  client.ts        |   91.91 |    87.15 |   91.56 |   91.91 | ...3922,4016-4017 
  ...tGenerator.ts |   86.34 |    87.34 |   84.61 |   86.34 | ...81-482,527-533 
  ...lScheduler.ts |   90.05 |    84.69 |   96.19 |   90.05 | ...6225,6253-6269 
  geminiChat.ts    |   92.97 |    89.89 |   95.41 |   92.97 | ...4938,4984-4985 
  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 | ...1208,1411-1412 
  ...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.53 |    91.66 |     100 |   98.53 | ...25,653-654,701 
  ...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.71 |    90.27 |   95.28 |   91.71 |                   
  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      |   96.69 |    91.07 |     100 |   96.69 | ...1125,1133,1232 
  ...ix-caching.ts |     100 |      100 |     100 |     100 |                   
  ...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.47 |   98.36 |   97.19 |                   
  dashscope.ts     |   98.36 |    93.03 |   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     |   86.21 |    83.25 |   92.35 |   86.21 |                   
  ...ive-safety.ts |     100 |      100 |     100 |     100 |                   
  ...-converter.ts |   78.32 |    71.83 |     100 |   78.32 | ...1122,1168-1169 
  corruptFile.ts   |     100 |       50 |     100 |     100 | 40-45             
  ...-converter.ts |   80.39 |     87.5 |     100 |   80.39 | 50-59             
  ...me-refresh.ts |     100 |      100 |     100 |     100 |                   
  ...sion-store.ts |   90.85 |    86.38 |   97.87 |   90.85 | ...1218-1224,1268 
  ...ionManager.ts |   81.06 |    78.78 |   81.52 |   81.06 | ...2705,2727-2728 
  ...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 |    84.61 |   85.71 |    75.9 | ...98,202,214-248 
  github.ts        |   88.58 |    82.13 |     100 |   88.58 | ...62,952-953,963 
  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       
  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 |    83.78 |     100 |   88.95 | ...32-235,238-241 
  ...extraction.ts |   85.77 |    80.61 |   89.47 |   85.77 | ...02-205,260-261 
 src/followup      |   79.92 |    80.07 |    90.9 |   79.92 |                   
  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.64 |    65.38 |   71.42 |   71.64 | ...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         |   94.22 |    88.93 |    95.9 |   94.22 |                   
  ...eGoalStore.ts |   87.61 |    88.88 |   86.66 |   87.61 | ...85-188,196-204 
  goal-evidence.ts |   87.61 |    85.02 |   95.65 |   87.61 | ...13-614,637-640 
  ...projection.ts |   89.41 |    72.22 |   66.66 |   89.41 | ...28,131,135-137 
  ...ersistence.ts |   87.73 |    84.84 |      80 |   87.73 | ...-94,97,101-106 
  goal-protocol.ts |      92 |       90 |     100 |      92 | 109-110           
  goal-reducer.ts  |   92.45 |    85.93 |     100 |   92.45 | ...84-385,398,453 
  goal-runtime.ts  |   99.05 |    93.64 |     100 |   99.05 | ...20-721,744-745 
  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-27              
  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.11 |    86.29 |   88.62 |   88.11 |                   
  ...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 |    87.91 |     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.61 |    83.61 |   90.53 |   87.61 |                   
  ...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       |   91.48 |    75.75 |     100 |   91.48 | ...99,118-121,189 
  ...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         |   95.29 |    96.59 |     100 |   95.29 | ...80-381,402-403 
  ...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       |   89.85 |    82.92 |     100 |   89.85 | ...54-155,162-163 
  ...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 |    81.81 |     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.07 |   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.55 |    84.44 |   96.85 |   89.55 |                   
  ...ionTrailer.ts |     100 |      100 |     100 |     100 |                   
  ...llRegistry.ts |   97.68 |    85.71 |     100 |   97.68 | ...96,119,490-491 
  ...ionService.ts |   97.45 |    95.45 |     100 |   97.45 | ...,905,1048-1056 
  ...ingService.ts |   91.41 |    85.15 |   95.65 |   91.41 | ...2117,2144-2145 
  ...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 |     100 |      100 |     100 |     100 |                   
  ...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.22 |    97.34 |     100 |   98.22 | ...75-676,723-724 
  ...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.38 |    93.75 |   88.88 |   98.38 | 63-64             
  ...ipt-reader.ts |   93.69 |    89.22 |   96.07 |   93.69 | ...1094-1095,1158 
  ...est-helper.ts |       0 |        0 |       0 |       0 | 1-65              
  ...iter-lease.ts |    82.1 |     73.7 |    97.5 |    82.1 | ...2364,2376-2379 
  sessionRecap.ts  |   67.56 |    43.47 |     100 |   67.56 | ...60,178,180-183 
  ...ionService.ts |   88.94 |    83.92 |   97.14 |   88.94 | ...2450,2520-2540 
  sessionTitle.ts  |   94.19 |    73.21 |     100 |   94.19 | ...43-246,277-278 
  ...ionService.ts |   84.35 |    78.37 |   97.14 |   84.35 | ...2472,2478-2483 
  ...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.84 |     100 |   87.98 | ...38-439,455-456 
 ...icrocompaction |    98.9 |    95.06 |     100 |    98.9 |                   
  microcompact.ts  |    98.9 |    95.06 |     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.87 |   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 |     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.53 |      70 |   74.23 |                   
  event-types.ts   |       0 |        0 |       0 |       0 |                   
  qwen-logger.ts   |   74.23 |    80.35 |   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.1 |    84.89 |   88.42 |    86.1 |                   
  ...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 |   81.49 |     80.1 |   85.71 |   81.49 | ...3217,3219-3220 
  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 |   77.56 |    84.11 |   77.14 |   77.56 | ...1291,1299-1300 
  ...ool-events.ts |       8 |        0 |       0 |       8 | 132-158           
  mcp-pool-key.ts  |   97.46 |    93.93 |     100 |   97.46 | 175-176           
  ...ce-content.ts |   96.55 |    91.17 |     100 |   96.55 | 80-82             
  mcp-retry.ts     |   97.67 |    95.65 |     100 |   97.67 | 131-132           
  mcp-status.ts    |     100 |      100 |     100 |     100 |                   
  mcp-tool.ts      |   98.34 |    93.65 |     100 |   98.34 | ...-982,1037-1038 
  ...sport-pool.ts |   83.49 |    80.15 |   84.61 |   83.49 | ...1409,1416-1420 
  ...ace-budget.ts |   87.27 |     82.6 |     100 |   87.27 | ...00-305,340-345 
  memory-config.ts |     100 |      100 |     100 |     100 |                   
  ...iable-tool.ts |     100 |    84.61 |     100 |     100 | 101,108           
  monitor.ts       |   91.74 |    84.28 |   88.46 |   91.74 | ...93,606,804-809 
  notebook-edit.ts |   85.55 |    77.39 |   81.25 |   85.55 | ...86-902,948-949 
  ...escendants.ts |   36.17 |    64.51 |   55.55 |   36.17 | ...46-310,385-390 
  ...nforcement.ts |   81.45 |    89.74 |     100 |   81.45 | 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 |   93.57 |     92.3 |      90 |   93.57 | 122-130           
  shell.ts         |   78.67 |    84.04 |   91.91 |   78.67 | ...5019,5082-5083 
  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.84 |    89.61 |   96.85 |   92.84 |                   
  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 |                   
  ...ncyLimiter.ts |   94.64 |    95.23 |     100 |   94.64 | 64-66             
  ...igResolver.ts |     100 |      100 |     100 |     100 |                   
  ...engthError.ts |   91.06 |    89.47 |     100 |   91.06 | ...46-147,154-155 
  ...n-branches.ts |   95.81 |    93.95 |      95 |   95.81 | ...91-492,504-517 
  ...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        |   82.62 |    94.32 |    61.9 |   82.62 | ...62-378,382-388 
  fetch.ts         |   90.68 |    82.51 |     100 |   90.68 | ...72,483-484,503 
  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.99 |    92.85 |     100 |   93.99 | ...88-489,491-493 
  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.02 |     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.61 |   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.36 |     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 |       64 |      75 |   54.62 | ...03-105,108-134 
  ...Compaction.ts |   96.13 |    96.42 |     100 |   96.13 | ...34-339,341-346 
  ...pt-records.ts |   85.89 |    83.63 |     100 |   85.89 | ...91-395,425-440 
  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 |   95.81 |    89.39 |     100 |   95.81 | ...74-275,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.

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

🩺 serve daemon A/B

Built the PR base vs this PR head d796703, drove a fixed endpoint set against each, and diffed the JSON responses. Only fields that changed are shown.

No response changes against the PR base across 4 scenario(s).

Qwen Code · serve A/B

@BZ-D
BZ-D enabled auto-merge August 3, 2026 09:40

@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. Test Plan (not a blocker): 17 passed — this review observed 17016 passed.

中文说明

已审查——无阻断问题。 建议见行内评论。 Test Plan(非阻断):17 passed — this review observed 17016 passed

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

Comment on lines +188 to +191
app.get('/session/:id', (req: Request, res: Response, next: NextFunction) => {
if (!isDocumentNavigation(req)) return next();
sendIndex(res);
});

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] This pre-auth route intercepts the only two request shapes that previously exercised mountWebShellSpaFallback's shell-serving branch: the existing tests falls back to the shell for SPA deep-link navigations (GET /session/abc123, Accept: text/html) and falls back to the shell on a sec-fetch navigation signal (GET /session/deep, Sec-Fetch-Mode: navigate) now match this route, so the fallback's positive branch (GET/HEAD document navigation to an unmatched non-/session path → 200 shell) has zero test coverage. Mutation-verified: with mountWebShellSpaFallback commented out at server.ts:2187, all 17 "Web Shell static serving" tests still pass. — Concrete cost: a future change that breaks or deletes the fallback's sendIndex(res) branch (guard reorder, refactor, or dropping the mount at server.ts:2187) would ship with the whole suite green, and document navigations to any deep path other than /session/:id (manually typed URLs today, any future client SPA route) would receive a 404 instead of the shell. Consider adding a direct positive test for the fallback, e.g.:

it('falls back to the shell for non-session SPA deep-link navigations', async () => {
  const app = createServeApp(baseOpts, undefined, { webShellDir });
  const res = await request(app)
    .get('/deep/link')
    .set('Host', host)
    .set('Accept', 'text/html');
  expect(res.status).toBe(200);
  expect(res.text).toContain('<div id="root">');
});
中文说明

这个免鉴权路由拦截了此前唯一会执行到 mountWebShellSpaFallback shell 服务分支的两种请求形态:现有测试 falls back to the shell for SPA deep-link navigationsGET /session/abc123Accept: text/html)和 falls back to the shell on a sec-fetch navigation signalGET /session/deepSec-Fetch-Mode: navigate)现在会命中本路由,因此 fallback 的正向分支(对未匹配的非 /session 路径发起 GET/HEAD 文档导航 → 返回 200 shell)失去了全部测试覆盖。已通过变异验证:将 server.ts:2187 处的 mountWebShellSpaFallback 注释掉后,全部 17 个 "Web Shell static serving" 测试仍然全部通过。— 具体代价:未来任何破坏或删除 fallback 中 sendIndex(res) 分支的改动(守卫顺序调整、重构、移除 server.ts:2187 处的挂载)都会在整个测试套件全绿的情况下合入,而对 /session/:id 之外任意深层路径的文档导航(目前是手动输入的 URL,未来可能是任何新的客户端 SPA 路由)将收到 404 而不是 shell。建议为 fallback 补充一个直接的正向测试,例如对未匹配的非会话路径发起带 Accept: text/htmlGET /deep/link,并断言 200 + <div id="root">(示例代码见英文部分)。

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

@wenshao

wenshao commented Aug 3, 2026

Copy link
Copy Markdown
Collaborator

@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 3, 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-dev-bot

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

Copy link
Copy Markdown
Collaborator

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

中文说明

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

@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 轮)。改动内容与我反驳保留之处如下:

Address review summary — PR #8445 (round 1)

Feedback points and decisions

1. [Suggestion] SPA fallback shell branch lost all test coverage (inline rc:3702865023, packages/cli/src/serve/web-shell-static.ts:191)

Decision: Addressed. The finding is correct and mutation-verified: this PR's new pre-auth GET /session/:id route intercepts both request shapes that previously exercised mountWebShellSpaFallback's shell-serving branch (GET /session/abc123 with Accept: text/html, and GET /session/deep with Sec-Fetch-Mode: navigate), so deleting or breaking the fallback at server.ts:2187 shipped green. This is an early review round and the suggestion is valuable, consistent with the suite, and small, so it is implemented rather than declined.

Change: added one direct positive test, falls back to the shell for non-session SPA deep-link navigations, in packages/cli/src/serve/server.test.ts (inside Web Shell static serving). It sends GET /deep/link with Accept: text/html — a non-session path no explicit route matches — so the request can only be served by mountWebShellSpaFallback, asserting 200 + <div id="root">. A short comment records why this specific shape exists (the pre-auth session route claims the session deep-link shapes, making this the only direct coverage of the fallback's shell branch).

Mutation re-check on this round: commenting out the mountWebShellSpaFallback mount at server.ts:2187 now makes exactly this new test fail (1 failed | 17 passed, expected 200 got 404) while the original 17 still pass; the mutation was reverted afterward. The coverage hole is closed.

2. Review-level note: Test Plan said 17 passed, review observed 17016 passed

Decision: Informational, no code action. It was explicitly marked "not a blocker". The scoped Web Shell group now contains 18 tests (17 previous + the one added above); all pass.

3. Issue-level comments (E2E report from @BZ-D; serve A/B report)

Decision: Informational, no action required. Both report the fix behaving correctly (A/B: no response changes against the PR base).

Conflict handling

--conflict false — no merge performed.

Changed files

  • packages/cli/src/serve/server.test.ts — +13 lines: one new test in the Web Shell static serving group (commit dea7b29e3).

Verification

Each command run this round and its result:

  • npm run build — passed (exit 0)
  • npm run typecheck — passed (exit 0)
  • npm run lint — passed (exit 0)
  • npx prettier --check packages/cli/src/serve/server.test.ts — passed ("All matched files use Prettier code style!")
  • npx vitest run src/serve/server.test.ts -t "Web Shell static serving" (packages/cli) — 18 passed | 0 failed (was 17 before this round)
  • Mutation check: mountWebShellSpaFallback mount commented out at server.ts:2187 → new test fails as intended (1 failed | 17 passed, expected 200 / received 404); source restored, tree verified clean afterward
  • npx vitest run src/serve/server.test.ts (packages/cli, full file unfiltered) — 852 passed | 0 failed

Not run (not applicable): integration tests after npm run bundle — the touched behavior is fully exercised at the supertest/Express unit level, the same harness used by all 18 tests; npm run generate:settings-schema — no settings source changed.

中文说明

处理审查总结 — PR #8445(第 1 轮)

反馈点与决定

1. [Suggestion] SPA fallback 的 shell 服务分支失去全部测试覆盖(行内评论 rc:3702865023packages/cli/src/serve/web-shell-static.ts:191

决定:已处理。 该发现正确且已经过变异验证:本 PR 新增的免鉴权 GET /session/:id 路由拦截了此前唯一会执行到 mountWebShellSpaFallback shell 服务分支的两种请求形态(GET /session/abc123 携带 Accept: text/html,以及 GET /session/deep 携带 Sec-Fetch-Mode: navigate),因此删除或破坏 server.ts:2187 处的 fallback 也能在整个测试套件全绿的情况下合入。当前处于早期审查轮次,该建议有价值、与测试套件风格一致且改动很小,因此予以实现而非拒绝。

改动:packages/cli/src/serve/server.test.tsWeb Shell static serving 组中新增一个直接的正向测试 falls back to the shell for non-session SPA deep-link navigations。它发起 GET /deep/link 并携带 Accept: text/html —— 这是一个没有任何显式路由匹配的非会话路径 —— 因此请求只能由 mountWebShellSpaFallback 响应,断言 200 + <div id="root">。附带的简短注释记录了该请求形态存在的理由(免鉴权的 session 路由已拦截会话深链形态,使本测试成为 fallback shell 分支的唯一直接覆盖)。

本轮变异复核:server.ts:2187 处的 mountWebShellSpaFallback 挂载注释掉后,恰好只有该新测试失败(1 failed | 17 passed,期望 200 实际 404),原有 17 个测试仍然通过;随后已还原该变异。覆盖缺口已闭合。

2. 审查级别备注:Test Plan 写的是 17 passed,而审查实际观察到 17016 passed

决定:仅为信息性说明,无需代码改动。 该备注已明确标注"not a blocker"(非阻断)。当前 Web Shell 作用域测试组共有 18 个测试(原有 17 个 + 本轮新增 1 个),全部通过。

3. Issue 级别评论(@BZ-D 的 E2E 报告;serve A/B 报告)

决定:仅为信息性说明,无需处理。 两份报告均表明修复行为正确(A/B:与 PR base 相比无任何响应变化)。

冲突处理

--conflict false — 未执行任何合并。

变更文件

  • packages/cli/src/serve/server.test.ts — +13 行:在 Web Shell static serving 组中新增一个测试(提交 dea7b29e3)。

验证

本轮实际执行的每条命令及结果:

  • npm run build — 通过(exit 0)
  • npm run typecheck — 通过(exit 0)
  • npm run lint — 通过(exit 0)
  • npx prettier --check packages/cli/src/serve/server.test.ts — 通过("All matched files use Prettier code style!")
  • npx vitest run src/serve/server.test.ts -t "Web Shell static serving"(packages/cli)— 18 通过 | 0 失败(本轮之前为 17 个)
  • 变异检查:注释掉 server.ts:2187 处的 mountWebShellSpaFallback 挂载 → 新测试按预期失败(1 failed | 17 passed,期望 200 / 实际 404);随后已还原源码并确认工作区干净
  • npx vitest run src/serve/server.test.ts(packages/cli,完整文件未过滤)— 852 通过 | 0 失败

未执行(不适用):npm run bundle 后的集成测试 —— 涉及行为已在 supertest/Express 单元层面被全部 18 个测试使用的同一测试装置完整覆盖;npm run generate:settings-schema —— 未改动任何 settings 源文件。

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

🔀 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-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.3)

Comment on lines +3117 to +3120
it('falls back to the shell for non-session SPA deep-link navigations', async () => {
// The pre-auth `/session/:id` route claims the session deep-link shapes
// above, so this non-session navigation is the only direct coverage of
// mountWebShellSpaFallback's shell branch.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] The two pre-existing tests falls back to the shell for SPA deep-link navigations (~line 3023, GET /session/abc123, Accept: text/html) and falls back to the shell on a sec-fetch navigation signal (~line 3107, GET /session/deep, Accept: */*, Sec-Fetch-Mode: navigate) now resolve against the new pre-auth /session/:id route instead of mountWebShellSpaFallback, while keeping fallback-sounding names — probe-verified: both shapes are served with servedByFallback: false at this commit. The first is also now a near-duplicate of the first assertion of the token-gated test above (same path/accept shape, differing only in token config). — Concrete cost: a future change that breaks the fallback's navigation detection for non-session paths (e.g. narrowing isDocumentNavigation only inside the fallback, or a mount reorder) ships with all three fallback-named tests green; under a simulated regression of exactly that kind, a Sec-Fetch-Mode: navigate request to /deep/link returned 404 while the whole suite passed. The fallback's Sec-Fetch-Mode branch currently has no direct integration coverage. Consider retargeting the sec-fetch test to a non-session shape so it exercises the fallback again, and renaming the other test to describe the pre-auth session route it now covers:

it('falls back to the shell on a sec-fetch navigation signal', async () => {
  const app = createServeApp(baseOpts, undefined, { webShellDir });
  const res = await request(app)
    .get('/deep/link')
    .set('Host', host)
    .set('Accept', '*/*')
    .set('Sec-Fetch-Mode', 'navigate');
  expect(res.status).toBe(200);
  expect(res.text).toContain('<div id="root">');
});
中文说明

两个既有测试 falls back to the shell for SPA deep-link navigations(约第 3023 行,GET /session/abc123Accept: text/html)和 falls back to the shell on a sec-fetch navigation signal(约第 3107 行,GET /session/deepAccept: */*Sec-Fetch-Mode: navigate)现在命中的是新的免鉴权 /session/:id 路由,而不是 mountWebShellSpaFallback,但测试名仍在描述 fallback —— 已通过探针验证:在当前提交下,这两种请求形态都由免鉴权路由返回(servedByFallback: false)。前者现在也与上方带 token 新测试的第一个断言近乎重复(路径/Accept 形态相同,仅 token 配置不同)。— 具体代价:未来任何破坏 fallback 对非会话路径导航检测的改动(例如只在 fallback 内部收窄 isDocumentNavigation,或调整挂载顺序)都会在所有三个 fallback 命名的测试全绿的情况下合入;在模拟的同类回归下,对 /deep/link 发起 Sec-Fetch-Mode: navigate 请求返回 404,而整个测试套件全部通过。fallback 的 Sec-Fetch-Mode 分支目前没有直接的集成覆盖。建议把 sec-fetch 测试改为指向非会话形态,使其重新覆盖 fallback(示例代码见英文部分),并将另一个测试重命名为其所实际覆盖的免鉴权会话路由。

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

…navigation

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
@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 轮)。改动内容与我反驳保留之处如下:

Round summary

Feedback: 1 inline finding from the automated reviewer (round 2, **[Suggestion]**); no failed checks; no base-conflict resolution needed (--conflict false).

rc:3708748269 — [Suggestion] Fallback-named tests no longer exercise the SPA fallback — ADDRESSED (implemented)

Verified against the code at HEAD before editing: mountWebShellAssets registers the new pre-auth GET /session/:id route, which claims both cited request shapes (Accept: text/html to /session/abc123, and Accept: */* + Sec-Fetch-Mode: navigate to /session/deep) before mountWebShellSpaFallback can run. The two pre-existing fallback-named tests therefore exercised the pre-auth route, and the fallback's Sec-Fetch-Mode branch had no direct integration coverage. The finding is accurate and in scope, so it was implemented as proposed.

Changes (all in packages/cli/src/serve/server.test.ts, +3/−3):

  • Retargeted falls back to the shell on a sec-fetch navigation signal from /session/deep to /deep/link, so Accept: */* + Sec-Fetch-Mode: navigate now resolves through mountWebShellSpaFallback and directly covers its Sec-Fetch-Mode branch (exactly the reviewer's suggested code).
  • Renamed falls back to the shell for SPA deep-link navigations to serves the shell for /session/:id document navigations (pre-auth route) so the name describes the route the test actually covers. Kept rather than deleted: it remains the token-less end-to-end shape, and the rename resolves the misleading-name concern without a scope call the reviewer did not ask for.
  • Updated the round-1 comment claiming the non-session test was the "only direct coverage" of the fallback's shell branch — the retarget made that claim inaccurate.

Commit: 572c9e903 test(web-shell): retarget sec-fetch SPA fallback test to non-session navigation

Verification

  • cd packages/cli && npx vitest run src/serve/server.test.ts -t "Web Shell static serving" — passed (18 passed, 834 skipped by the filter)
  • npm run build — passed (exit 0)
  • npm run typecheck — passed (exit 0)
  • npx prettier --check packages/cli/src/serve/server.test.ts — passed
  • npm run lint — passed (exit 0)
  • Integration tests after npm run bundle — not run: the change is test-only in a unit test file that exercises serve routing directly via supertest; no bundled-CLI-only behavior is touched.
中文说明

本轮摘要

反馈: 自动审查器(第 2 轮)的 1 条行内发现(**[Suggestion]**);无失败检查;无需解决与 base 分支的冲突(--conflict false)。

rc:3708748269 — [Suggestion] 名为 fallback 的测试实际上已不再覆盖 SPA fallback — 已处理(已实现)

在编辑前已对照 HEAD 代码核实:mountWebShellAssets 注册了新的免鉴权 GET /session/:id 路由,该路由会在 mountWebShellSpaFallback 之前承接上述两种请求形态(对 /session/abc123Accept: text/html,以及对 /session/deepAccept: */* + Sec-Fetch-Mode: navigate)。因此这两个以 fallback 命名的既有测试实际覆盖的是免鉴权路由,而 fallback 的 Sec-Fetch-Mode 分支没有任何直接的集成覆盖。该发现属实且在本次 PR 范围内,故按建议实现。

改动(全部位于 packages/cli/src/serve/server.test.ts,+3/−3):

  • falls back to the shell on a sec-fetch navigation signal 的目标从 /session/deep 改为 /deep/link,使 Accept: */* + Sec-Fetch-Mode: navigate 请求真正经由 mountWebShellSpaFallback 处理,直接覆盖其 Sec-Fetch-Mode 分支(与审查器给出的示例代码完全一致)。
  • falls back to the shell for SPA deep-link navigations 重命名为 serves the shell for /session/:id document navigations (pre-auth route),使测试名描述其实际覆盖的路由。保留该测试而非删除:它仍是无 token 配置下的端到端形态,且重命名已解决"名称误导"的问题,删除属于审查器未要求的范围决定。
  • 更新了第 1 轮加入的注释——原注释称该非会话测试是 fallback shell 分支的"唯一直接覆盖",本次重定向后该说法不再准确。

提交:572c9e903 test(web-shell): retarget sec-fetch SPA fallback test to non-session navigation

验证

  • cd packages/cli && npx vitest run src/serve/server.test.ts -t "Web Shell static serving" — 通过(18 个通过,834 个被过滤器跳过)
  • npm run build — 通过(退出码 0)
  • npm run typecheck — 通过(退出码 0)
  • npx prettier --check packages/cli/src/serve/server.test.ts — 通过
  • npm run lint — 通过(退出码 0)
  • npm run bundle 后的集成测试 — 未运行:本次改动仅为单元测试文件中的测试改动,这些测试通过 supertest 直接验证 serve 路由;未涉及仅由打包 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-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. 1 Suggestion-level finding(s) could not be anchored to a changed line and were dropped; nothing further to act on here. Not reviewed: build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its qwen serve daemon suite did not run locally. Test Plan (not a blocker): 17 passed — this review observed 17060 passed.

中文说明

已审查。 1 条建议级发现无法锚定到改动行,已丢弃;此处无需进一步处理。 未审查:build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its qwen serve daemon suite did not run locally。 Test Plan(非阻断):17 passed — this review observed 17060 passed

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

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

This round had no actionable feedback for PR #8445 (branch agent/fix-web-shell-session-refresh-auth), so no code changes or commits were made.

Triage summary:

  • The only review newer than the last evaluation (2026-08-04T01:11:22Z) is the automated reviewer's round-3 review (COMMENTED, 2026-08-04T05:05:00Z). Its finding ledger is empty: one Suggestion-level finding could not be anchored to a changed line and was dropped by the reviewer itself. Nothing to act on.
  • The two anchored suggestions visible on the PR predate the cutoff and were already implemented in earlier rounds of this branch:
    • Round 1 (R1-1, direct positive coverage for the SPA fallback shell branch) → implemented in dea7b29e3 (test(web-shell): cover SPA fallback shell branch for non-session navigations); verified present at HEAD as the falls back to the shell for non-session SPA deep-link navigations test.
    • Round 2 (R2-1, retarget the sec-fetch navigation test so it exercises the fallback instead of the pre-auth /session/:id route) → implemented in 572c9e903 (test(web-shell): retarget sec-fetch SPA fallback test to non-session navigation); verified present at HEAD — the test now requests /deep/link with Sec-Fetch-Mode: navigate.
  • No maintainer issue-level or inline comments require a response; all open issue-level comments are bot lifecycle/status messages.
  • No failed checks and no persisting red checks; --conflict false, so no base merge was performed.
  • No retry context (no verification-gate rejection, no budget warning) was present in the feedback.

Outcome: no changes this round; the branch remains at 572c9e903.

中文说明

AutoFix 审查轮次 — 无需处理

本轮针对 PR #8445(分支 agent/fix-web-shell-session-refresh-auth)没有可操作的反馈,因此未做任何代码改动、未提交任何 commit。

分诊摘要:

  • 上次评估时间点(2026-08-04T01:11:22Z)之后唯一更新的审查是自动审查器的第 3 轮审查(COMMENTED,2026-08-04T05:05:00Z)。其发现清单为空:有一条 Suggestion 级发现无法锚定到改动行,已被审查器自行丢弃。没有需要处理的内容。
  • PR 上可见的两条锚定建议均早于该时间点,且已在本分支更早的轮次中实现:
    • 第 1 轮(R1-1,为 SPA fallback 的 shell 分支补充直接的正向覆盖)→ 已在 dea7b29e3test(web-shell): cover SPA fallback shell branch for non-session navigations)中实现;已核实 HEAD 中存在 falls back to the shell for non-session SPA deep-link navigations 测试。
    • 第 2 轮(R2-1,将 sec-fetch 导航测试改为非会话路径,使其真正覆盖 fallback 而非预鉴权的 /session/:id 路由)→ 已在 572c9e903test(web-shell): retarget sec-fetch SPA fallback test to non-session navigation)中实现;已核实 HEAD 中该测试现在请求带 Sec-Fetch-Mode: navigate/deep/link
  • 没有需要回复的维护者 issue 级或行内评论;所有未关闭的 issue 级评论均为机器人生命周期/状态消息。
  • 没有失败的检查,也没有持续失败的红色检查;--conflict false,因此未执行 base 合并。
  • 反馈中没有任何重试上下文(没有验证门禁拒绝,也没有预算告警)。

结论: 本轮无改动;分支保持在 572c9e903

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


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

@wenshao

wenshao commented Aug 4, 2026

Copy link
Copy Markdown
Collaborator

Code Review

Overview. Adds an exact GET /session/:id route inside mountWebShellAssets (i.e. before bearerAuth) that serves index.html only for document navigations and next()s everything else, so a browser refresh of a session deep link loads the shell while API subpaths and same-path JSON requests stay token-gated. Plus regression tests.

The approach is sound and minimal: exact single-segment matching means /session/:id/status and every other API subpath still hit bearerAuth; the next() fall-through preserves the 401 for Accept: application/json; the shell is returned regardless of whether the session exists, so it is not an existence oracle; hostAllowlist and the CORS deny-wall are still registered ahead of it; and there is no GET /session/:id API route today for the new handler to shadow. Nice catch moving the sec-fetch fallback test off /session/deep — that path is now claimed by the new pre-auth route, so the test would have silently stopped covering mountWebShellSpaFallback.

One issue below needs fixing before this lands; the rest are follow-ups/nits.


🔴 1. The deferred-runtime pre-auth mirror was not updated — the headline bug still reproduces

packages/cli/src/serve/run-qwen-serve.ts:1718-1726:

// Mirrors the routes `mountWebShellAssets` registers before `bearerAuth` in
// `createServeApp` (`GET /` and `GET /assets/*`). Only these skip the
// deferred-runtime auth gate; everything else keeps the bearer requirement.
function isPreAuthWebShellRequest(req: Request): boolean {
  if (req.method !== 'GET' && req.method !== 'HEAD') return false;
  return req.path === '/' || req.path.startsWith('/assets/');
}

createDelegatingServeApp (run-qwen-serve.ts:1653-1683) applies authenticateDeferredRuntimeRequest = bearerAuth(opts.token) to any request that arrives while the runtime app does not exist yet, exempting only what this predicate returns true for. fast-path.ts:550 sets deferRuntimeUntilFirstHealth: !parsed.open, so plain qwen serve --token … (no --open — service/systemd/manual restart) is exactly the deferred configuration.

Failure path with this PR applied:

  1. Daemon starts cold, runtime deferred.
  2. Browser restores/refreshes the tab at /session/<id> — this is the first request.
  3. isPreAuthWebShellRequestfalse → deferred bearerAuth401, same JSON body as before the fix.
  4. Because the gate short-circuits via runSynchronousRequestGate(...) === false, options.startRuntime() is never called — the runtime stays cold, so refreshing again 401s again. It only recovers once something else (a /health probe, or the user navigating to /) warms the runtime.

So the scenario in the PR description ("refresh /session/<id> with a bearer token") is fixed only for an already-warm daemon; on a cold qwen serve it still returns 401 Unauthorized, indefinitely. The manual verification in the PR body most likely hit a warm daemon (the / load that preceded it started the runtime), which is why it wasn't caught. The // Mirrors the routes … comment is also now factually stale.

Suggested fix (isDocumentNavigation is already exported from web-shell-static.ts):

const SESSION_DEEP_LINK_PATH = /^\/session\/[^/]+\/?$/u;

function isPreAuthWebShellRequest(req: Request): boolean {
  if (req.method !== 'GET' && req.method !== 'HEAD') return false;
  if (req.path === '/' || req.path.startsWith('/assets/')) return true;
  // Exact session document navigations are mounted pre-auth in the runtime
  // app too; keep the doc-nav discriminator so API-shaped requests stay gated.
  return SESSION_DEEP_LINK_PATH.test(req.path) && isDocumentNavigation(req);
}

and extend the existing test serves unauthenticated Web Shell navigations during the deferred runtime window (run-qwen-serve.test.ts:4677) with:

  • GET /session/abc + Accept: text/html → 200 shell (and it starts the runtime),
  • GET /session/abc + Accept: application/json → 401,
  • GET /session/abc/status + Accept: text/html → 401.

🟡 2. Three hand-maintained copies of the same route list

The pre-auth surface is now encoded in mountWebShellAssets, in isPreAuthWebShellRequest, and prose-wise in docs/users/qwen-serve.md:407. Finding #1 is precisely the drift this invites. Consider exporting a single predicate from web-shell-static.ts (e.g. isPreAuthWebShellRequest(req)) and having both the delegating app and the mount consume it, so adding a future pre-auth route can't leave the deferred gate behind.

🟡 3. Comments/docs that are now imprecise

  • mountWebShellSpaFallback's docstring still says "Because real routes run first, no per-path denylist is needed" — that security rationale now has an exception (/session/:id runs before real routes). The header line was updated; the body paragraph should note the exception and why it's safe (exact single segment + doc-nav only + no GET /session/:id API).
  • docs/users/qwen-serve.md:407 describes "GET /, /assets/*, and SPA deep-link fallback" as registered before the bearer gate. The SPA fallback is post-auth (that's the whole premise of this fix). Good moment to correct the line and mention the /session/<id> document-navigation exception, since it's user-visible auth behaviour.

🟢 4. Base-path deployments still 401

packages/web-shell/client/utils/sessionPath.ts deliberately preserves a base path (/app/session/<id>). Behind a path-preserving reverse proxy the refresh URL never matches the root-anchored /session/:id route and still falls to the post-auth fallback → 401. Pre-existing, out of scope for this PR, but worth a line in Risk & Scope so it isn't reported as a regression later.

🟢 5. Pre-auth also means pre-rate-limit

installRateLimiter mounts after bearerAuth, so the new route joins / and /assets/* in bypassing --rate-limit, and each hit is a fresh res.sendFile disk read. It also widens that free surface from one path to an unbounded /session/* family for unauthenticated callers on a non-loopback bind. Same class as the existing static routes and probably acceptable, but flagging since this PR is what makes the path space unbounded.

Test nits

  • The new it bundles four scenarios; a failure message will just say the combined test broke. Splitting into serves the shell for GET/HEAD document navigations, 401s the same path for JSON requests, and 401s session API subpaths keeps signal.
  • The HEAD case only asserts status === 200; asserting content-type: text/html would pin that it's the shell and not some other 200.
  • Worth adding: /session/abc123/ (trailing slash — Express non-strict routing matches it, and parseSessionId accepts it, so this is a real client shape), and --no-web + token → /session/<id> doc nav still 401s.

Verdict: direction and security reasoning are right; the exact-match + doc-nav discriminator is the correct way to avoid weakening the API gate. Blocking only on #1 — without it the fix doesn't hold for the default qwen serve (no --open) cold-start path that the bug report describes.

中文摘要

结论:方向正确,精确单段匹配 + 文档导航判别确实没有削弱 API 鉴权;但 #1 需要修复后才能合入

  • 🔴 pre-release: fix ci #1run-qwen-serve.ts:1722isPreAuthWebShellRequestmountWebShellAssets 的手工镜像,本 PR 没有同步。fast-path.ts:550 中不带 --openqwen serve 默认走 deferred runtime,此时冷启动后第一个请求若是 /session/<id> 文档导航,仍会被 deferred bearerAuth 401;更糟的是 gate 短路后不会调用 startRuntime(),runtime 一直不启动,反复刷新会一直 401,直到有别的请求(/health/)把 runtime 唤醒。PR 中的人工验证大概率跑在已热的 daemon 上,所以没暴露。建议按上文补 SESSION_DEEP_LINK_PATH 判断,并扩展 run-qwen-serve.test.ts:4677 那个 deferred 用例。
  • 🟡 Where is the config saved? #2:pre-auth 路由清单目前有三处副本(mount 处、deferred gate、文档),建议抽成一个导出的判定函数,避免再次漂移。
  • 🟡 如何自定义密钥文件 .env可能与其他文件冲突 #3mountWebShellSpaFallback 注释里 "real routes run first,无需 denylist" 的论证现在有例外,需要补充说明;docs/users/qwen-serve.md:407 把 SPA fallback 描述成 pre-auth,与本 PR 的前提矛盾,顺手改正。
  • 🟢 Are you interested in AI Terminal? #4sessionPath.ts 支持 base path(/app/session/<id>),反代不剥前缀时刷新仍会 401,属于既有限制,建议在 Risk & Scope 注明。
  • 🟢 TypeError in Authentication Selection Interface #5:pre-auth 同时意味着绕过 --rate-limit,且未鉴权可访问的路径空间从单个 / 扩展为 /session/*,每次都会 sendFile 读盘,风险等级与现有静态路由相同,仅作提示。
  • 测试建议:拆分那个包含四段断言的用例;HEAD 用例补 content-type 断言;补 /session/abc123/(尾斜杠)与 --no-web + token 的 401 用例。

…e window

The deferred-runtime gate applied bearerAuth to every non-bootstrap
request while the runtime was cold, so a browser refresh of
/session/<id> (and / and /assets/*) 401'd on the default
`qwen serve --token ...` start until something else warmed the runtime.

Exempt the same surface mountWebShellAssets registers before auth, via a
shared isPreAuthWebShellRequest predicate, so cold document navigations
start the runtime and load the shell while JSON fetches, API subpaths,
and --no-web daemons stay gated. The predicate is dynamically imported
to respect the serve fast-path import-boundary guards.
@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 review round summary — PR #8445

Addressed the blocking finding (#1), both yellow findings (#2, #3), and all test nits from @wenshao's review. One committed fix round: fix(web-shell): serve pre-auth navigations during the deferred runtime window.

Feedback points and dispositions

🔴 #1 — deferred-runtime gate 401s the shell's entry points on a cold daemon: FIXED. The underlying defect is real and was verified in code: while the runtime is deferred (the default qwen serve --token … configuration without --open, per deferRuntimeUntilFirstHealth: !parsed.open in fast-path.ts), createDelegatingServeApp runs bearerAuth(opts.token) on every non-bootstrap request before dispatch, so an unauthenticated document navigation to /session/<id> received a JSON 401 and never started the runtime. Two factual notes on the review text, for the record: (a) the quoted isPreAuthWebShellRequest mirror function and the referenced test serves unauthenticated Web Shell navigations during the deferred runtime window do not exist at the reviewed commit and never existed in this repository's history (git log --all -S confirms) — the gap was that no exemption existed at all, which is strictly a larger gap than the one described; (b) the 401 window is not indefinite — scheduleRuntimeStartFallback() starts the runtime ~1 s after listen regardless of requests, so a refresh after that window already worked; the defect is the cold-window 401 plus the navigation never warming the runtime itself. The fix exempts exactly the surface mountWebShellAssets serves before auth: a new exported isPreAuthWebShellRequest(req) predicate (GET/HEAD and either /, /assets/*, or an exact /session/<id> document navigation per isDocumentNavigation) is consumed by the deferred gate, so cold navigations now start the runtime and receive the shell, while JSON fetches, API subpaths (/session/<id>/status), and --no-web daemons stay bearer-gated. This does not widen any security surface: the exempted shapes are served without auth by the warm runtime app anyway, and unauthenticated callers could already start the runtime via /health (and via the 1 s fallback timer). One implementation note: fast-path.test.ts guards run-qwen-serve.ts against a static import of ./web-shell-static.js (serve fast-path startup latency), so the predicate is consumed through a deferred dynamic import — the established pattern for runtime modules in this file (loadServeRuntimeModules).

🟡 #2 — three hand-maintained copies of the pre-auth route list: ADDRESSED. The pre-auth surface now has one canonical predicate: isPreAuthWebShellRequest exported from web-shell-static.ts (next to the routes it describes, with a keep-in-sync note on mountWebShellAssets), consumed by the deferred gate in run-qwen-serve.ts. The Express mount stays route-based (express.static and route handlers can't be driven by a predicate), so the predicate documents that it mirrors the mount rather than replacing it; the prose copy in the user docs is corrected in #3 below.

🟡 #3 — imprecise comments/docs: ADDRESSED. (a) mountWebShellSpaFallback's docstring now records the exception: exact /session/:id document navigations are claimed before auth by mountWebShellAssets, and why that stays safe (single path segment only, document navigations only, no GET /session/:id API route to shadow — API subpaths still hit bearerAuth). (b) The --web / --no-web row in docs/users/qwen-serve.md no longer describes the SPA deep-link fallback as pre-auth; it now lists the real pre-auth surface (GET /, /assets/*, GET /session/<id> document navigations) and states that the SPA fallback for all other paths sits behind the bearer gate.

🟢 #4 — base-path deployments behind path-preserving proxies still 401: RECORDED, no code change. Confirmed pre-existing and out of scope for this PR, as the review notes. The suggested mitigation is a line in the PR body's Risk & Scope section; this workflow does not edit PR bodies, so the limitation is recorded here instead: deployments fronting the daemon with a base-path-preserving reverse proxy (e.g. /app/session/<id>, which packages/web-shell/client/utils/sessionPath.ts deliberately supports client-side) never match the root-anchored /session/:id route and fall through to the post-auth SPA fallback → 401 on refresh. Recommend the maintainer add this to the PR body, or track it as a follow-up.

🟢 #5 — pre-auth also means pre-rate-limit: DECLINED (accepted risk, no code change). Verified against the code: installRateLimiter is created with mount: false and its middleware is registered after bearerAuth by design ("only count authenticated requests"), so / and /assets/* already bypass --rate-limit today; this PR adds one more shape of the same class. Each hit is a sendFile of the single index.html (same cost as GET /), not a per-path disk walk, and unauthenticated callers can already force runtime startup via /health and the 1 s fallback timer, so the unbounded path family adds no new amplification. Adding rate limiting to the pre-auth surface is a separate design question (it would also affect / and /assets/*) and is out of scope here.

Test nits: ALL ADDRESSED.

  • The bundled four-scenario it in server.test.ts is split into focused tests: serves the shell for GET and HEAD /session/:id document navigations, 401s /session/:id for JSON requests, 401s session API subpaths, plus a new 401s /session/:id document navigations when the shell is disabled.
  • The HEAD case now asserts content-type: text/html.
  • Added the trailing-slash case /session/abc123/ (Express non-strict routing) to the warm-app tests.
  • Added --no-web + token coverage at both layers: warm app (server.test.ts) and the cold deferred window (run-qwen-serve.test.ts).
  • New deferred-window regression tests in run-qwen-serve.test.ts covering exactly the pre-release: fix ci #1 scenario: GET /session/abc + Accept: text/html → 200 shell and the runtime starts; GET /session/abc + Accept: application/json → 401 without starting the runtime; GET /session/abc/status + Accept: text/html → 401 without starting the runtime; and the --no-web 401 case.

Conflict notes

None — --conflict false, no merge performed.

Verification

  • npm run build — passed
  • npm run typecheck — passed (tsc --noEmit across all packages, no errors)
  • npm run lint — passed
  • npx prettier --check on the five changed files — passed (docs file reformatted with prettier --write first)
  • vitest run src/serve/server.test.ts (packages/cli) — 855 passed
  • vitest run src/serve/run-qwen-serve.test.ts (packages/cli) — 221 passed (includes the 3 new deferred-window tests)
  • vitest run src/serve/fast-path.test.ts (packages/cli) — 74 passed (import-boundary guards for run-qwen-serve.ts intact)
  • Integration tests after npm run bundle — not required: the changed behavior is exercised directly through runQwenServe/createServeApp unit tests, not only through the bundled CLI.
中文说明

Autofix 评审轮次总结 — PR #8445

已处理 @wenshao 评审中的阻塞项(#1)、两个黄色建议(#2#3)以及全部测试建议。一轮提交完成修复:fix(web-shell): serve pre-auth navigations during the deferred runtime window

各反馈点及处理结果

🔴 #1 — 冷启动 deferred runtime 期间 shell 入口被 401:已修复。 底层缺陷真实存在且已在代码中核实:runtime 处于 deferred 状态时(即不带 --open 的默认 qwen serve --token … 配置,见 fast-path.ts 中的 deferRuntimeUntilFirstHealth: !parsed.open),createDelegatingServeApp 会在分发前对所有非 bootstrap 请求执行 bearerAuth(opts.token),因此对 /session/<id> 的未鉴权文档导航会收到 JSON 401,且不会启动 runtime。对评审原文作两点事实性说明以备查:(a) 评审引用的 isPreAuthWebShellRequest 镜像函数及其引用的测试 serves unauthenticated Web Shell navigations during the deferred runtime window 在被评审的提交中不存在,且在本仓库全部历史中也从未存在过(git log --all -S 证实)——实际缺口是根本没有任何豁免逻辑,比评审描述的更严重;(b) 401 窗口并非无限期——scheduleRuntimeStartFallback() 会在 listen 后约 1 秒无条件启动 runtime,因此窗口之后的刷新本来就能成功;缺陷在于冷窗口内的 401,以及该导航本身不会唤醒 runtime。修复方案是豁免 mountWebShellAssets 在鉴权前提供的全部表面:新增导出的 isPreAuthWebShellRequest(req) 判定函数(GET/HEAD 且路径为 //assets/*,或精确的 /session/<id> 文档导航,后者按 isDocumentNavigation 判定),由 deferred gate 消费。冷启动的文档导航现在会启动 runtime 并返回 shell,而 JSON 请求、API 子路径(/session/<id>/status)以及 --no-web 守护进程仍然走 bearer 鉴权。此举不扩大任何安全表面:这些被豁免的形状在热的 runtime app 中本来就是免鉴权提供的,而且未鉴权调用方本来就可以通过 /health(以及 1 秒兜底定时器)启动 runtime。一个实现说明:fast-path.test.ts 禁止 run-qwen-serve.ts 静态导入 ./web-shell-static.js(serve 快路径启动延迟约束),因此该判定函数通过延迟动态导入消费——这正是本文件中运行时模块的既有模式(loadServeRuntimeModules)。

🟡 #2 — pre-auth 路由清单存在三份手工副本:已处理。 pre-auth 表面现在有一个规范判定函数:从 web-shell-static.ts 导出的 isPreAuthWebShellRequest(与其所描述的路由放在一起,并在 mountWebShellAssets 上标注了保持同步的说明),由 run-qwen-serve.ts 的 deferred gate 消费。Express 挂载侧保持基于路由的形式(express.static 和路由处理器无法由判定函数驱动),因此判定函数声明自己镜像挂载侧而非取代它;用户文档中的文字副本在 #3 中一并修正。

🟡 #3 — 注释/文档表述不准确:已处理。 (a) mountWebShellSpaFallback 的文档注释现在记录了例外情况:精确的 /session/:id 文档导航由 mountWebShellAssets 在鉴权前认领,并说明了为何仍然安全(仅单段路径、仅文档导航、不存在可被遮蔽的 GET /session/:id API 路由——API 子路径仍会命中 bearerAuth)。(b) docs/users/qwen-serve.md--web / --no-web 一行不再把 SPA 深链回退描述为 pre-auth;现在列出真实的 pre-auth 表面(GET //assets/*GET /session/<id> 文档导航),并说明其余路径的 SPA 回退位于 bearer 鉴权之后。

🟢 #4 — 路径保留型反代后的 base path 部署仍会 401:已记录,不改代码。 与评审所述一致,确认为既有限制、不在本 PR 范围内。评审建议在 PR 描述的 Risk & Scope 中加一行说明;本工作流不编辑 PR 描述,故在此记录该限制:以保留 base path 的反代(如 /app/session/<id>packages/web-shell/client/utils/sessionPath.ts 在客户端刻意支持)访问守护进程时,刷新 URL 永远匹配不到根锚定的 /session/:id 路由,落入鉴权后的 SPA 回退 → 刷新时 401。建议维护者将该说明补入 PR 描述,或作为后续事项跟进。

🟢 #5 — pre-auth 同时意味着绕过限流:拒绝修改(接受该风险,不改代码)。 已在代码中核实:installRateLimitermount: false 创建,其中间件按设计注册在 bearerAuth 之后("只统计已鉴权请求"),因此 //assets/* 今天本来就绕过 --rate-limit;本 PR 只是给同一类别增加了一个形状。每次命中是对唯一 index.htmlsendFile(与 GET / 成本相同),并非按路径读盘,且未鉴权调用方本来就能通过 /health 和 1 秒兜底定时器强制启动 runtime,因此无界的路径族不带来新的放大效应。为 pre-auth 表面增加限流是独立的设计问题(同样会影响 //assets/*),不在本 PR 范围内。

测试建议:全部处理。

  • server.test.ts 中捆绑四个场景的 it 已拆分为聚焦用例:serves the shell for GET and HEAD /session/:id document navigations401s /session/:id for JSON requests401s session API subpaths,另新增 401s /session/:id document navigations when the shell is disabled
  • HEAD 用例现在断言 content-type: text/html
  • 在热 app 测试中补充尾斜杠用例 /session/abc123/(Express 非严格路由)。
  • 在两个层面补充 --no-web + token 覆盖:热 app(server.test.ts)与冷 deferred 窗口(run-qwen-serve.test.ts)。
  • run-qwen-serve.test.ts 新增覆盖 pre-release: fix ci #1 场景的 deferred 窗口回归测试:GET /session/abc + Accept: text/html → 200 shell 且 runtime 启动;GET /session/abc + Accept: application/json → 401 且不启动 runtime;GET /session/abc/status + Accept: text/html → 401 且不启动 runtime;以及 --no-web 的 401 用例。

冲突说明

无 —— --conflict false,未执行合并。

验证

  • npm run build — 通过
  • npm run typecheck — 通过(全部包的 tsc --noEmit,无错误)
  • npm run lint — 通过
  • 对五个变更文件执行 npx prettier --check — 通过(docs 文件先经 prettier --write 格式化)
  • vitest run src/serve/server.test.ts(packages/cli)— 855 通过
  • vitest run src/serve/run-qwen-serve.test.ts(packages/cli)— 221 通过(包含 3 个新增 deferred 窗口测试)
  • vitest run src/serve/fast-path.test.ts(packages/cli)— 74 通过(run-qwen-serve.ts 的导入边界守卫保持不变)
  • npm run bundle 后的集成测试 — 不需要:变更行为通过 runQwenServe/createServeApp 单元测试直接覆盖,并非只经由打包后的 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

🔀 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

Copy link
Copy Markdown
Collaborator

📊 Takeover milestone — round 10/100, in the current window. Census: 9 pushed fix(es), 1 no-change review(s), 0 timeout(s), 1 rejected attempt(s), 0 other round(s) (crash / model error / gate error / infra), 3 base update(s).

This many rounds deserves a human look. Options: keep going (fine — nothing changes), split or reduce the PR if rounds keep accumulating, or release takeover (remove the autofix/takeover label or comment @qwen-code /takeover stop). Management continues unchanged unless you act.

中文说明

📊 接管里程碑 —— 第 10/100 轮(当前窗口)。统计:推送修复 9 次、审阅无需改动 1 次、超时 0 次、验证拒绝 1 次、其他轮次(崩溃/模型错误/门错误/infra)0 次、base 更新 3 次。

轮次到这个量值得人工看一眼。可选:继续(无需操作);若轮次持续累积,考虑拆分或缩减 PR;或释放接管(移除 autofix/takeover 标签或评论 @qwen-code /takeover stop)。不操作则托管照常继续。

@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: build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its bundled-CLI suite did not run locally.

中文说明

已审查。 建议见行内评论。 未审查:build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its bundled-CLI suite did not run locally。

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

Comment on lines +3052 to 3053
it('serves the shell for /session/:id document navigations (pre-auth route)', async () => {
const app = createServeApp(baseOpts, undefined, { webShellDir });

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] R10-1: This test renamed in this diff advertises (pre-auth route), but it builds the app from baseOpts, which has no token — and bearerAuth(undefined) is a pass-through (auth.ts:271-274), so the assertion passes regardless of where the route is mounted relative to auth; the test does not exercise the property its name claims. The tokened siblings added in the same hunk carry the real pre-auth assertion. — Failure scenario: if a future change moves app.get('/session/:id', ...) to after app.use(bearerAuth(opts.token)), this test stays green despite its title asserting pre-auth mounting, giving a maintainer relying on it a false sense of security.

Suggested change
it('serves the shell for /session/:id document navigations (pre-auth route)', async () => {
const app = createServeApp(baseOpts, undefined, { webShellDir });
it('serves the shell for /session/:id document navigations (pre-auth route)', async () => {
const app = createServeApp({ ...baseOpts, token: 'secret' }, undefined, { webShellDir });
中文说明

[建议] 本次 diff 重命名的测试名为 (pre-auth route)(鉴权前路由),但它使用不含 tokenbaseOpts 构建应用——而 bearerAuth(undefined) 是直通中间件(auth.ts:271-274),因此无论该路由挂载在鉴权之前还是之后,断言都会通过;该测试并未验证其名称所声称的属性。同一 hunk 中新增的带 token 兄弟用例才是真正的 pre-auth 断言。失败场景:如果未来有改动将 app.get('/session/:id', ...) 移到 app.use(bearerAuth(opts.token)) 之后,此测试仍会保持绿色,尽管其标题声称验证了鉴权前挂载——依赖该测试的维护者将获得虚假的安全感。

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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 AutoFix ran out of time before finishing (timeout (1080000ms)) (attempt 11/100) — it will retry on the next scan.

What I found before stopping:
Qwen failed during address-review: timeout (1080000ms).

See the Qwen Autofix agent step logs for model/tool output.

Run log: https://github.com/QwenLM/qwen-code/actions/runs/31011714214


🧠 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: · 已审阅最新反馈——无需改动。逐点说明原因如下:

Same-run verification repair — no code change required

The previous commit (2a68383d8) was rejected by the deterministic verification gate with "settings schema is stale on the agent-committed fix". Investigation shows the rejection was caused by a crashed schema generator, not a stale artifact:

  • The gate log shows npm run generate:settings-schema dying with ERR_MODULE_NOT_FOUND: Cannot find module '.../node_modules/@qwen-code/qwen-code-core/dist/index.js'. The generator imports packages/cli/src/config/settings.ts, which resolves @qwen-code/qwen-code-core through its built dist/ entry point, so it requires npm run build to have run first (as documented in the script header).
  • All per-package dist/ directories (packages/core, packages/cli, …) were missing on the runner while the root bundle dist/cli.js from the job's initial "Install dependencies and build" step was still present. This is consistent with the earlier round that exhausted the agent time budget being killed mid-build, after the build had cleaned the dist/ directories but before it rebuilt them.

Repair performed this round (no source changes):

  1. Ran npm run build to completion (exit 0), restoring every package's dist/ in the shared workspace (the sandbox bind-mounts the runner's checkout, so the restored state is what the repair verification gate sees).
  2. Re-ran the exact gate check: npm run generate:settings-schema now succeeds, and git status --porcelain on packages/vscode-ide-companion/schemas/settings.schema.json is empty — the committed schema is up to date. This is expected: this PR changes no settings sources (git diff origin/main...HEAD touches only docs/users/qwen-serve.md and packages/cli/src/serve/*).
  3. Ran the other pre-noop gate check, the autofix contracts script's npm run check-i18n — passed (the tool-names.ts drift-test branch does not apply; this PR does not touch that file).

Since the committed artifact is already correct, there is nothing to commit: the fix is the restored build state, which lets the repair verification gate's settings-schema freshness check run the generator to completion (it runs on every path, including the no-op path). No review threads were in scope this round (Critical-only mode; the deferred non-Critical items remain open for human follow-up).

Verification

  • npm run build — passed (exit 0); restored packages/core/dist/index.js and all other package dist/ outputs
  • npm run generate:settings-schema — passed; zero diff against the committed settings.schema.json (git status --porcelain empty)
  • npm run check-i18n — passed ("✅ All checks passed!")
  • git status --porcelain --untracked-files=all — clean; git diff --quiet origin/<branch>...<branch> — no new commit
中文说明

同轮验证修复 — 无需改动代码

上一个提交(2a68383d8)被确定性验证门禁以 "settings schema is stale on the agent-committed fix"(agent 提交的修复上 settings schema 已过期)为由拒绝。调查显示,拒绝的真正原因是 schema 生成器崩溃,而不是产物过期

  • 门禁日志显示 npm run generate:settings-schemaERR_MODULE_NOT_FOUND: Cannot find module '.../node_modules/@qwen-code/qwen-code-core/dist/index.js' 失败。该生成器会导入 packages/cli/src/config/settings.ts,而后者通过构建产物 dist/ 入口解析 @qwen-code/qwen-code-core,因此必须先执行过 npm run build(脚本头部注释也明确说明了这一点)。
  • 运行器上所有包级 dist/ 目录(packages/corepackages/cli 等)均缺失,而任务初始 "Install dependencies and build" 步骤生成的根目录 bundle dist/cli.js 仍然存在。这与更早一轮 agent 耗尽时间预算、在构建过程中被强制终止的情形一致:构建已经清理了各 dist/ 目录,但还未来得及重新生成。

本轮执行的修复(不涉及源码改动):

  1. 完整执行 npm run build(退出码 0),恢复了共享工作区中每个包的 dist/(沙箱以 bind-mount 方式挂载运行器的检出目录,因此修复验证门禁看到的就是恢复后的状态)。
  2. 重新执行门禁的同一检查:npm run generate:settings-schema 现在成功运行,且 git status --porcelainpackages/vscode-ide-companion/schemas/settings.schema.json 的输出为空 —— 已提交的 schema 本来就是最新的。这符合预期:本 PR 没有改动任何 settings 源文件(git diff origin/main...HEAD 只涉及 docs/users/qwen-serve.mdpackages/cli/src/serve/*)。
  3. 执行了另一项 noop 路径之前的门禁检查,即 autofix 契约脚本中的 npm run check-i18n —— 通过(tool-names.ts 漂移测试分支不适用,本 PR 未改动该文件)。

由于已提交的产物本身就是正确的,没有可提交的内容:真正的修复是恢复后的构建状态,它使修复验证门禁的 settings-schema 新鲜度检查能够把生成器完整跑完(该检查在所有路径上都会执行,包括 noop 路径)。本轮没有可处理的评审条目(仅处理 Critical 模式;被延后的非 Critical 条目保持开放,留待人工跟进)。

验证

  • npm run build — 通过(退出码 0);恢复了 packages/core/dist/index.js 及所有其他包的 dist/ 产物
  • npm run generate:settings-schema — 通过;与已提交的 settings.schema.json 零差异(git status --porcelain 为空)
  • npm run check-i18n — 通过("✅ All checks passed!")
  • git status --porcelain --untracked-files=all — 干净;git diff --quiet origin/<branch>...<branch> — 无新提交

Deferred non-Critical feedback

Critical-only mode is active after 10 change-producing rounds. The workflow excluded the non-Critical feedback below from this round's actionable sections; the items remain open for human follow-up. Maintainer feedback is deferred only after its author has used 2 regular feedback batches in this window's Critical-only tail; authors at that budget, if any, are named below. (@qwen-code /retry starts a fresh counting window.)

中文说明

完成 10 个产生改动的轮次后进入仅处理 Critical 的模式。本轮可执行区域已排除下方非 Critical 反馈;这些条目保持开放,留待人工跟进。维护者反馈仅在其本人于本窗口 Critical-only 阶段已使用 2 批常规反馈预算后才会延后;达到预算的作者(如有)在下方点名。(评论 @qwen-code /retry 可开启新的计数窗口。)

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


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

@wenshao

wenshao commented Aug 6, 2026

Copy link
Copy Markdown
Collaborator

Maintainer verification — real local stack (daemon + browser)

I built and ran this branch end-to-end against a real qwen serve daemon and a real browser, side by side with its merge-base, to confirm the fix and to check that the auth gate did not get weaker.

Verdict: verified, no blocking findings. The reported bug reproduces on the merge-base and is gone on this branch; every other route stays behind bearerAuth; the added tests are load-bearing.

Setup (click to expand)
Host macOS 25.6.0 (arm64), Node v24.18.1
Under test 2a68383 (agent/fix-web-shell-session-refresh-auth)
Control 32e2741 — the PR's merge-base with main
Trees two separate git worktrees, each with its own npm install + full npm run build (so each daemon serves its own packages/web-shell/dist)
Daemons node packages/cli/dist/index.js serve --hostname 127.0.0.1 --port <p> --token <t> --workspace <ws> — PR on :18441, control on :18442
Isolation separate QWEN_HOME and workspace per daemon; model provider pointed at a local OpenAI-compatible stub so no real credentials or network are involved
Browser real Chromium via Playwright, 1440×900 @2×

Both daemons log Web Shell UI served from …/packages/web-shell/dist, i.e. the shell really is being served by the daemon under test.

1. The user-visible bug: refreshing /session/<id>

Real browser, real flow: open the shell at /#token=…, send a prompt so the URL becomes /session/<id>, then a plain location.reload() — exactly the address-bar refresh a user does, with no way to attach a bearer header.

browser refresh, before and after

control 32e2741 this PR 2a68383
reload HTTP status 401 application/json 200 text/html
React root mounted after reload no yes
session transcript restored no yes

2. The auth gate, probed directly

23 raw-HTTP probes against both warm daemons. No Authorization header unless the row says so.

http probe matrix

Now served pre-auth (the fix):

request control this PR
GET /session/<id> Accept: text/html 401 json 200 html (shell)
HEAD /session/<id> Accept: text/html 401 json 200 html
GET /session/<id>/ trailing slash 401 json 200 html (shell)
GET /Session/<id> case variant 401 json 200 html (shell)
GET /session/<id>?ref=1 query string 401 json 200 html (shell)
GET /session/<id> Sec-Fetch-Mode: navigate 401 json 200 html (shell)
GET / and GET // 200 html 200 html (unchanged)

Still gated — identical on both sides:

request control this PR
GET /session/<id> Accept: application/json 401 401
GET /session/<id>/status Accept: text/html 401 401
GET /session/<id>/transcript Accept: text/html 401 401
GET /session/<id>/events Accept: text/html 401 401
GET /session/<id>/a/b deeper subpath 401 401
GET /capabilities Accept: text/html 401 401
GET /daemon/status Accept: text/html 401 401
GET /workspace/x/sessions Accept: text/html 401 401
POST / DELETE /session/<id> Accept: text/html 401 401
--no-web daemon, GET /session/<id> Accept: text/html 401 401
GET /session/<id>/status with bearer 200 200
GET /capabilities with bearer 200 200

No response body on either side contains the bearer token.

3. The deferred-runtime (cold) window

This is the part of the PR that is hardest to reach by hand, so I probed it in a real daemon rather than only in tests: the fast path defers the runtime app, so the very first request after listen() is answered by the cold gate. I fire the request as soon as the port accepts, well inside the ~1 s window before the fallback start timer.

cold deferred window

The daemon log is the load-bearing evidence here — on this branch the navigation itself starts the runtime (daemon workspace roots initialized at +120 ms, i.e. 880 ms before the 1000 ms fallback was due — the fallback timer fired line never appears in that run), and the request completes status=200. On the control the same navigation 401s and the runtime is never started at all. A cold Accept: application/json request still 401s and still does not start the runtime, and a --no-web daemon 401s both /session/<id> and /.

4. Build, tests, and whether the new tests actually bite

check result
npm run build (full workspace) on both trees pass
packages/clivitest run src/serve 125 files, 3849 passed, 1 skipped
server.test.ts + run-qwen-serve.test.ts + fast-path.test.ts 1162 passed
tsc -p packages/cli --noEmit clean
eslint --max-warnings 0 on the 5 touched TS files clean
prettier --check on the touched files + docs/users/qwen-serve.md clean
npm run check:serve-fast-path-bundle Startup bundle closure checks passed. — confirms the dynamic import('./web-shell-static.js') really does keep the module out of the serve fast-path static closure

I did not hit the two socket hang up failures mentioned in the PR description; the full src/serve run was green on this machine.

Mutation check (are the new tests real?). I cloned the PR tree, kept every test, and broke only the production code in two ways: (M1) delete the pre-auth app.get('/session/:id', …) route, (M2) make isPreAuthWebShellRequest always return false. Result: 10 tests fail, and they are precisely the new ones —

× createServeApp > Web Shell static serving > serves the shell for GET and HEAD /session/:id document navigations
× createServeApp > Web Shell static serving > serves the shell for /session/:id on a sec-fetch-only navigation signal
× runQwenServe runtime startup failures > serves Web Shell document navigations during the deferred runtime window
× runQwenServe runtime startup failures > serves the Web Shell root during the deferred runtime window
× runQwenServe runtime startup failures > serves the // root alias during the deferred window like the warm app
× runQwenServe runtime startup failures > serves Web Shell assets during the deferred runtime window
× runQwenServe runtime startup failures > answers bare /assets during the deferred window like the warm app
× runQwenServe runtime startup failures > serves trailing-slash and case-variant session deep links during the deferred window
× runQwenServe runtime startup failures > serves query-carrying session deep links during the deferred window
× runQwenServe runtime startup failures > answers pre-auth Web Shell navigations with the failure envelope when the deferred runtime fails

The 401-asserting guard tests survive both mutations, which is correct — they are regression guards, not coverage of the new branch.

5. One observation, non-blocking

Percent-encoded single-segment session paths also land on the new pre-auth route, because Express does not decode %2F when matching:

GET /session/..%2fcapabilities      Accept: text/html   ->  200 text/html    (401 on control)
GET /session/<id>%2fstatus          Accept: text/html   ->  200 text/html    (401 on control)

I checked whether this is an auth bypass, and it is not: both responses are byte-identical to GET / (sha256 564cd3b3…, the same public shell), no API route is reached, and no session data or token appears. So the effect is only that a token-protected daemon now returns the already-public shell on a few more URL shapes. Worth a sentence in the isPreAuthWebShellRequest doc comment if you want the invariant written down, but it doesn't change the security posture and I would not hold the merge on it.

Recommendation

LGTM for merge. The behaviour claimed in the description reproduces exactly, in a real daemon and a real browser, and the guardrails hold on every probe I could think of.

中文版本

维护者验证 —— 真实本地栈(daemon + 浏览器)

我在真实的 qwen serve daemon 和真实浏览器上端到端跑了这个分支,并与它的 merge-base 做同条件对照,用来确认修复生效、并检查鉴权是否被削弱。

结论:验证通过,无阻塞问题。 描述里的 bug 在 merge-base 上稳定复现,在本分支上消失;其余路由全部仍在 bearerAuth 之后;新增测试是有效的(非空洞)。

环境

主机 macOS 25.6.0 (arm64),Node v24.18.1
被测 2a68383agent/fix-web-shell-session-refresh-auth
对照 32e2741 —— 本 PR 与 main 的 merge-base
工作树 两棵独立 git worktree,各自 npm install + 完整 npm run build,因此每个 daemon 提供的是它自己packages/web-shell/dist
daemon node packages/cli/dist/index.js serve --hostname 127.0.0.1 --port <p> --token <t> --workspace <ws>,PR 在 :18441,对照在 :18442
隔离 每个 daemon 独立的 QWEN_HOME 与 workspace;模型 provider 指向本地 OpenAI 兼容 mock,不涉及真实凭据与网络
浏览器 Playwright 驱动的真实 Chromium,1440×900 @2×

两个 daemon 的日志都有 Web Shell UI served from …/packages/web-shell/dist,说明 shell 确实由被测 daemon 提供。

1. 用户可见的问题:刷新 /session/<id>

真实浏览器、真实流程:先在 /#token=… 打开 shell,发一条 prompt 让 URL 变成 /session/<id>,再执行一次普通的 location.reload() —— 也就是用户在地址栏做的刷新,无法附带 bearer 头。

对照 32e2741 本 PR 2a68383
刷新的 HTTP 状态 401 application/json 200 text/html
刷新后 React root 是否挂载
会话记录是否恢复

2. 直接探测鉴权门

对两个已热起的 daemon 做了 23 组原始 HTTP 探测,除非表格标注,否则都不带 Authorization 头。

新的免鉴权路径(即修复本身):

请求 对照 本 PR
GET /session/<id> Accept: text/html 401 json 200 html(shell)
HEAD /session/<id> Accept: text/html 401 json 200 html
GET /session/<id>/ 尾斜杠 401 json 200 html(shell)
GET /Session/<id> 大小写变体 401 json 200 html(shell)
GET /session/<id>?ref=1 带 query 401 json 200 html(shell)
GET /session/<id> Sec-Fetch-Mode: navigate 401 json 200 html(shell)
GET /GET // 200 html 200 html(无变化)

仍然被拦截,两侧完全一致:

请求 对照 本 PR
GET /session/<id> Accept: application/json 401 401
GET /session/<id>/status Accept: text/html 401 401
GET /session/<id>/transcript Accept: text/html 401 401
GET /session/<id>/events Accept: text/html 401 401
GET /session/<id>/a/b 更深子路径 401 401
GET /capabilities Accept: text/html 401 401
GET /daemon/status Accept: text/html 401 401
GET /workspace/x/sessions Accept: text/html 401 401
POST / DELETE /session/<id> Accept: text/html 401 401
--no-web daemon,GET /session/<id> Accept: text/html 401 401
GET /session/<id>/status bearer 200 200
GET /capabilities bearer 200 200

两侧任何响应体中都不含 bearer token。

3. deferred runtime(冷启动)窗口

这是本 PR 里最难手工触达的部分,所以我没有只依赖单测,而是在真实 daemon 上探测:fast path 会延迟构建 runtime app,因此 listen() 之后的第一个请求由冷门(cold gate)处理。我在端口刚可连接时立刻发请求,落在 fallback 启动定时器(约 1 秒)之前。

判据主要看 daemon 日志:本分支上,是这次导航本身启动了 runtimedaemon workspace roots initialized 出现在 +120 ms,比 1000 ms 的 fallback 早 880 ms,该 run 的日志里根本没有 fallback timer fired 这一行),请求以 status=200 完成;对照分支上同样的导航返回 401,runtime 根本没有启动。冷启动窗口内的 Accept: application/json 请求仍然 401,且仍然不会启动 runtime;--no-web 的 daemon 对 /session/<id>/ 都返回 401。

4. 构建、测试,以及新增测试是否真的有效

检查项 结果
两棵树的 npm run build(完整 workspace) 通过
packages/clivitest run src/serve 125 个文件,3849 通过,1 跳过
server.test.ts + run-qwen-serve.test.ts + fast-path.test.ts 1162 通过
tsc -p packages/cli --noEmit 干净
对 5 个改动 TS 文件的 eslint --max-warnings 0 干净
改动文件 + docs/users/qwen-serve.mdprettier --check 干净
npm run check:serve-fast-path-bundle Startup bundle closure checks passed. —— 证实动态 import('./web-shell-static.js') 确实把该模块挡在了 serve fast-path 的静态闭包之外

我没有复现出 PR 描述里提到的两个 socket hang up 失败;本机上完整的 src/serve 是全绿的。

变异测试(新增测试是不是空洞的?) 我克隆了 PR 树,保留全部测试,只破坏生产代码:(M1)删掉免鉴权的 app.get('/session/:id', …) 路由;(M2)让 isPreAuthWebShellRequest 恒返回 false。结果 10 个测试失败,且恰好都是本 PR 新增的那些(列表见英文部分)。断言 401 的守护型测试在两种变异下都仍然通过,这是正确的 —— 它们是回归护栏,不是新分支的覆盖。

5. 一处观察,不阻塞

百分号编码的单段会话路径也会落到新的免鉴权路由上,因为 Express 在路由匹配时不会解码 %2F

GET /session/..%2fcapabilities      Accept: text/html   ->  200 text/html   (对照为 401)
GET /session/<id>%2fstatus          Accept: text/html   ->  200 text/html   (对照为 401)

我确认过这不是鉴权绕过:两个响应与 GET / 逐字节相同sha256 564cd3b3…,同一个公开 shell),没有命中任何 API 路由,也没有泄露任何会话数据或 token。因此实际影响只是:配置了 token 的 daemon 现在会在更多 URL 形状上返回本来就公开的 shell。如果希望把这个不变式写进代码,可以在 isPreAuthWebShellRequest 的注释里加一句;但它不改变安全边界,我不建议因此阻塞合并。

建议

同意合并。描述中声称的行为在真实 daemon + 真实浏览器上完全复现,我能想到的各种探测下护栏也都成立。

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix review-response summary — PR #8445 (round: comment-only)

Commit: 2e90b9ecd docs(cli): record the pre-auth %2F session deep-link invariant (#8445) (one file, +5/−1, doc comment only — no behavior change)

Feedback triage

# Feedback Source Classification Disposition
1 Maintainer verification report: the bug reproduces on the merge-base, is gone on this branch, all other routes stay behind bearerAuth, the new tests are load-bearing (mutation check: 10 new tests fail when the fix is removed). Verdict: LGTM for merge. @wenshao (issue-level comment) Verification report, no defect named No code change required
2 Observation from that report (§5): percent-encoded single-segment session paths (e.g. /session/<id>%2fstatus, /session/..%2fcapabilities) also match the new pre-auth surface because Express does not decode %2F during route matching. Confirmed not an auth bypass (responses byte-identical to GET /, no API route reached, no session data or token). Suggestion: write the invariant down in the isPreAuthWebShellRequest doc comment. @wenshao (issue-level comment) Optional suggestion (non-blocking, in this round's actionable section) Implemented

No reviews, no inline comments, no failed checks, no still-red checks, and no base-conflict (--conflict false); accordingly no merge of origin/main was performed and no threads or comment replies apply.

What changed and why

One sentence was added to the existing doc comment of isPreAuthWebShellRequest in packages/cli/src/serve/web-shell-static.ts, recording that percent-encoded single-segment deep links also match — Express does not decode %2F during route matching — but cannot reach an API route or session data: pre-auth answers serve only the public shell HTML, identical to GET / (or the startup-failure envelope).

Before writing it, the claim was verified against the code, not taken on trust: the warm app's app.get('/session/:id', …) handler serves only sendIndex (a fixed index.html; req.params.id is never used), otherwise next()s into the bearer-gated routes, and the deferred-runtime gate delegates exempted requests to that same warm app — or, when runtime startup fails, answers the 503 startup-failure envelope, which likewise carries no session data. The wording explicitly covers that failure-envelope edge case so the invariant as written is strict.

Kept minimal per AGENTS.md: no test changes (a comment changes no behavior), no drive-by edits, nothing removed by this round.

Verification

Commands actually run this round, on commit 2e90b9ecd:

  • npm run build — passed
  • npm run typecheck (tsc --noEmit) — clean
  • npm run lint (eslint . --ext .ts,.tsx && eslint integration-tests) — clean
  • npx prettier --check packages/cli/src/serve/web-shell-static.ts — clean
  • Focused Vitest (touched package, the two suites covering this module): cd packages/cli && npx vitest run src/serve/server.test.ts src/serve/run-qwen-serve.test.ts — 2 files, 1088 passed
  • Not run: npm run generate:settings-schema (no settings source changed) and bundle/integration tests (the change is a comment; no behavior is exercised only through the bundled CLI)
中文说明

Autofix 评审回应总结 — PR #8445(本轮:仅注释改动)

提交: 2e90b9ecd docs(cli): record the pre-auth %2F session deep-link invariant (#8445)(单文件,+5/−1,仅文档注释 —— 无行为变化)

反馈分诊

# 反馈 来源 分类 处置
1 维护者验证报告:该 bug 在 merge-base 上可复现、在本分支上消失;其余路由全部仍在 bearerAuth 之后;新增测试是有效的(变异测试:删掉修复后恰好有 10 个新增测试失败)。结论:同意合并(LGTM)。 @wenshao(issue 级评论) 验证报告,未指出任何缺陷 无需代码改动
2 该报告第 5 节的观察:百分号编码的单段会话路径(如 /session/<id>%2fstatus/session/..%2fcapabilities)也会命中新的免鉴权面,因为 Express 在路由匹配时不解码 %2F。已确认不是鉴权绕过(响应与 GET / 逐字节相同,未命中任何 API 路由,无会话数据或 token 泄露)。建议:把这个不变式写进 isPreAuthWebShellRequest 的文档注释。 @wenshao(issue 级评论) 可选建议(不阻塞,位于本轮可执行区域) 已实现

没有 review、没有行内评论、没有失败检查、没有持续红检查,也没有 base 冲突(--conflict false);因此未合并 origin/main,也不涉及任何线程解决或评论回复。

改动内容与理由

packages/cli/src/serve/web-shell-static.tsisPreAuthWebShellRequest 的现有文档注释里补充了一句话,记录:百分号编码的单段深链接同样会匹配 —— Express 在路由匹配时不解码 %2F —— 但它们无法触达任何 API 路由或会话数据:免鉴权响应只提供公开的 shell HTML,与 GET / 完全相同(或 startup-failure 信封)。

写入之前,该说法是对照代码核实过的,而非照单全收:热路径的 app.get('/session/:id', …) 处理器只返回 sendIndex(固定的 index.html;从不使用 req.params.id),否则 next() 进入带 bearer 门的路由;而 deferred-runtime 门会把豁免的请求委托给同一个热路径应用 —— 或在 runtime 启动失败时返回 503 startup-failure 信封,该信封同样不含任何会话数据。措辞明确覆盖了 failure-envelope 这一边缘情况,使写下的不变式严格成立。

按 AGENTS.md 保持最小改动:不改测试(注释不改变任何行为)、无顺手改动、本轮也没有删除任何内容。

验证

本轮在提交 2e90b9ecd 上实际执行的命令:

  • npm run build — 通过
  • npm run typechecktsc --noEmit)— 干净
  • npm run linteslint . --ext .ts,.tsx && eslint integration-tests)— 干净
  • npx prettier --check packages/cli/src/serve/web-shell-static.ts — 干净
  • 聚焦 Vitest(改动的包,覆盖该模块的两个测试套件):cd packages/cli && npx vitest run src/serve/server.test.ts src/serve/run-qwen-serve.test.ts — 2 个文件,1088 通过
  • 未执行:npm run generate:settings-schema(未改动任何 settings 源)以及 bundle/集成测试(本次改动仅为注释,不存在只能通过 bundled CLI 验证的行为)

Deferred non-Critical feedback

Critical-only mode is active after 10 change-producing rounds. The workflow excluded the non-Critical feedback below from this round's actionable sections; the items remain open for human follow-up. Maintainer feedback is deferred only after its author has used 2 regular feedback batches in this window's Critical-only tail; authors at that budget, if any, are named below. (@qwen-code /retry starts a fresh counting window.)

中文说明

完成 10 个产生改动的轮次后进入仅处理 Critical 的模式。本轮可执行区域已排除下方非 Critical 反馈;这些条目保持开放,留待人工跟进。维护者反馈仅在其本人于本窗口 Critical-only 阶段已使用 2 批常规反馈预算后才会延后;达到预算的作者(如有)在下方点名。(评论 @qwen-code /retry 可开启新的计数窗口。)

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

🔀 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-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: build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its bundled-CLI qwen serve suite did not run locally.

中文说明

已审查。 建议见行内评论。 未审查:build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its bundled-CLI qwen serve suite did not run locally。

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

Comment on lines +1751 to +1755
const preAuthExempted =
authGate !== undefined &&
(await Promise.resolve(options.isPreAuthRequest?.(req)).catch(
() => false,
)) === true;

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] The fail-closed guard only catches a rejecting predicate: options.isPreAuthRequest?.(req) is evaluated as the argument to Promise.resolve(...), so a synchronously throwing predicate — a shape the declared type (req: Request) => boolean | Promise<boolean> admits — escapes .catch(() => false), unwinds dispatch(), and dispatch().catch(next) forwards it to Express's default error handler, 500ing every deferred request instead of degrading to the bearer gate as the adjacent comment promises. Today's sole production wiring (import('./web-shell-static.js').then(...)) cannot throw synchronously, so nothing breaks as shipped; the gap is between the guard's stated intent/type contract and what it covers. — Failure scenario: a future caller wires isPreAuthRequest as a sync predicate that throws on a malformed request → every request in the deferred startup window returns 500 instead of falling back to the bearer gate.

Suggested change
const preAuthExempted =
authGate !== undefined &&
(await Promise.resolve(options.isPreAuthRequest?.(req)).catch(
() => false,
)) === true;
const preAuthExempted =
authGate !== undefined &&
(await Promise.resolve()
.then(() => options.isPreAuthRequest?.(req))
.catch(() => false)) === true;
中文说明

[建议] fail-closed 防护目前只能捕获 reject 的谓词:options.isPreAuthRequest?.(req) 是作为 Promise.resolve(...) 的实参求值的,因此同步抛异常的谓词(声明类型 (req: Request) => boolean | Promise<boolean) 明确允许这种形态)会绕过 .catch(() => false),使 dispatch() 抛出,经 dispatch().catch(next) 交给 Express 默认错误处理器,导致 deferred 窗口的每个请求都返回 500,而不是像相邻注释承诺的那样降级到 bearer 鉴权。当前唯一的生产接线(import('./web-shell-static.js').then(...))不会同步抛异常,所以现网不受影响;缺口在于防护声明的意图/类型契约与实际覆盖范围不一致。失败场景:未来某个调用方把 isPreAuthRequest 接成一个遇到畸形请求就抛异常的同步谓词 → deferred 启动窗口内的所有请求返回 500,而不是回落到 bearer 鉴权。

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

Comment on lines +93 to +94
* that cannot attach the bearer header. Percent-encoded single-segment deep
* links (e.g. `/session/<id>%2fstatus`) also match — Express does not decode

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] The doc comment declares percent-encoded single-segment deep links (/session/<id>%2f…) intentionally pre-auth-exempted, but no test in server.test.ts or run-qwen-serve.test.ts exercises any percent-encoded session path, so this documented cold/warm parity is unpinned — and %2F-encoded session IDs are a real client shape (sessionPath.ts builds the address-bar URL via encodeURIComponent(sessionId)). — Failure scenario: a future cleanup that decodes req.path inside isPreAuthWebShellRequest (e.g. decodeURIComponent(req.path)) or rewrites SESSION_DEEP_LINK_PATH to reject % → a cold daemon 401s a browser refresh of /session/parent%2Fchild while the warm runtime app still serves the shell — exactly the cold/warm divergence this PR exists to eliminate — shipping green, because a verification probe confirmed that mutation survives the current suite.

Suggested fix (two tests, one per layer):

// server.test.ts — warm app, tokened
const res = await request(app)
  .get('/session/a%2Fb')
  .set('Host', host)
  .set('Accept', 'text/html');
expect(res.status).toBe(200);
expect(res.text).toContain('<div id="root">');

// run-qwen-serve.test.ts — deferred window: same request → 200 + shell,
// and the runtime starts
中文说明

[建议] 文档注释声明百分号编码的单段深链接(/session/<id>%2f…)是有意豁免 pre-auth 的,但 server.test.tsrun-qwen-serve.test.ts 中没有任何测试覆盖百分号编码的会话路径,因此这一被文档化的冷/热一致性没有被钉住——而 %2F 编码的会话 ID 是真实的客户端形态(sessionPath.ts 通过 encodeURIComponent(sessionId) 构造地址栏 URL)。失败场景:未来某次 "清理" 在 isPreAuthWebShellRequest 内解码 req.path(如 decodeURIComponent(req.path)),或把 SESSION_DEEP_LINK_PATH 改成拒绝 % → 冷 daemon 会对 /session/parent%2Fchild 的浏览器刷新返回 401,而热的 runtime app 仍会提供 shell——这正是本 PR 要消除的冷/热分歧——并且会绿灯合入,因为验证探针确认该变异能在当前测试套件下存活。

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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 AutoFix ran out of time before finishing (timeout (7200000ms)) (attempt 13/100) — it will retry on the next scan.

What I found before stopping:
Qwen failed during address-review: timeout (7200000ms).

See the Qwen Autofix agent step logs for model/tool output.

Run log: https://github.com/QwenLM/qwen-code/actions/runs/31071603852


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

#8445)

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

Copy link
Copy Markdown
Collaborator

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

Autofix round summary — PR #8445 (address-review)

Critical-only mode is active (round 11). The only actionable item this round was the failed required check; all non-Critical feedback stays deferred for human follow-up per the Critical-only rules.

Feedback triage

Item Classification Decision
Failed check Test (ubuntu-latest Node 22.x) Required (blocking) Fixed — root cause identified, reproduced, and repaired (see below)
Deferred non-Critical feedback (review pullrequestreview-4871336460, inline rc:3726126974, rc:3726126989) Deferred (Critical-only mode) Not touched this round, per the Critical-only rules; left open for human follow-up

--conflict false — no merge performed, no conflicts to resolve.

Diagnosis

The failing Test job has many steps, so every runnable step was reproduced locally against the exact HEAD merge commit (344031303, which merged main into this branch):

  • Steps that passed locally before any change: npm run build, npm run typecheck, npm run lint:ci (ESLint, --max-warnings 0), Prettier, i18n check, settings-schema freshness, NOTICES freshness, audit:runtime:critical, check:lockfile, check:desktop-isolation, check:serve-fast-path-bundle, .github/scripts helper tests (206/206), full npm run test:ci unit suite (all workspaces, exit 0).
  • The no-AK integration gate reproduced one deterministic failure: cli/qwen-serve-streaming.test.ts > qwen serve — daemon Todo Stop Guard replayexpected 2 to be 4 (the guard's bounded continuations never fired), matching a 30s poll timeout with retries exhausted.

Root cause of that failure: the suite bound its daemon to the repository checkout (--workspace REPO_ROOT). The daemon merges the workspace's .qwen/settings.json into every session; this shared-runner checkout carried a stray one (a tools.core allowlist missing todo_write plus tools.sandbox: docker). With todo_write unavailable, the guard fixture's pending todo is never created, the guard has nothing to continue, and only 2 of the expected 4 model requests occur. Moving the stray settings file aside made the test pass; restoring it failed the test again — a clean A/B reproduction. CI does not ship that exact file, but shared self-hosted runners can carry leftover workspace settings from other jobs, which is the same failure class.

Fix

fix(test): isolate serve streaming suite from stray workspace settings (#8445) — commit d79670383:

  • The streaming suite now spawns its daemon against a scratch mkdtempSync workspace instead of the checkout, and all session calls use that workspace. Cleanup removes it in afterAll.
  • This is byte-identical to the repo's own pending fix for this exact vulnerability (unmerged PR feat(review): add declarative repository-context manifest #8401, commit a1366d9af, whose parent blob equals this branch's pre-fix file, so the two will reconcile cleanly when both land). No other suites are changed: the sibling routes suite does not depend on todo_write.

A/B verification with the stray settings present: old code fails with the exact CI signature (expected 2 to be 4); fixed code passes 4/4.

Verification

All commands actually run this round, in order:

  • git diff origin/main...HEAD review of the PR surface — 6 files (docs + packages/cli/src/serve/* and tests)
  • npm run build — passed (run twice: before diagnosis and after the fix)
  • npm run check-i18n — passed
  • npx prettier --check <changed files> — passed
  • npm run generate:settings-schema + git status freshness check — up to date
  • npm run generate:notices --workspace=qwen-code-vscode-ide-companion + freshness check — up to date
  • npm run audit:runtime:critical — passed (0 critical)
  • npm run check:lockfile — passed
  • npm run check:desktop-isolation — passed
  • Focused vitest packages/cli (src/serve/run-qwen-serve.test.ts, src/serve/server.test.ts) — 1105 passed
  • npm run test:ci (all workspaces, CI env: fresh HOME, cleared API keys) — passed, exit 0
  • npm run check:serve-fast-path-bundle — passed ("Startup bundle closure checks passed")
  • npm run lint:ci — passed
  • node --test <HELPER_TESTS> — 206 passed
  • npm run test:integration:no-ak:sandbox:none (CI env) — initially 128/129 (the Todo Stop Guard replay failure above); after the fix: 11 files, 129/129 passed, including with the stray workspace settings present
  • npx eslint integration-tests/cli/qwen-serve-streaming.test.ts --max-warnings 0 — passed
  • npm run bundle — passed (403 chunks)

Not run: actionlint / shellcheck / yamllint (the PR and the fix touch no workflow, shell, or YAML files; the merged content passed main's CI with the same linter versions). The workflow's independent CI remains the final gate.

中文说明

Autofix 本轮总结 — PR #8445(address-review)

当前处于仅处理 Critical 的模式(第 11 轮)。本轮唯一可执行的条目是失败的必需检查;按照 Critical-only 规则,所有非 Critical 反馈保持延后,留待人工跟进。

反馈分诊

条目 分类 决定
失败检查 Test (ubuntu-latest Node 22.x) 必需(阻塞) 已修复 — 定位根因、本地复现并修复(见下文)
延后的非 Critical 反馈(review pullrequestreview-4871336460、行内 rc:3726126974、rc:3726126989) 延后(Critical-only 模式) 本轮不处理,按 Critical-only 规则保持开放,留待人工跟进

--conflict false — 未执行合并,无冲突需要解决。

诊断

失败的 Test 作业包含许多步骤,因此在 HEAD 合并提交(344031303,即把 main 合入本分支的提交)上逐步本地复现了每个可运行步骤:

  • 修改前本地已通过的步骤:npm run buildnpm run typechecknpm run lint:ci(ESLint,--max-warnings 0)、Prettier、i18n 检查、settings-schema 新鲜度、NOTICES 新鲜度、audit:runtime:criticalcheck:lockfilecheck:desktop-isolationcheck:serve-fast-path-bundle.github/scripts 辅助测试(206/206)、完整 npm run test:ci 单测套件(全部 workspace,退出码 0)。
  • no-AK 集成门禁复现出一个确定性失败:cli/qwen-serve-streaming.test.ts > qwen serve — daemon Todo Stop Guard replayexpected 2 to be 4(守卫的有界续跑从未触发),与 30 秒轮询超时、重试耗尽的表现一致。

该失败的根因:该套件把守护进程绑定到仓库检出目录(--workspace REPO_ROOT)。守护进程会把 workspace 的 .qwen/settings.json 合并进每个会话;本共享 runner 的检出目录里恰好残留了一份(tools.core 白名单缺少 todo_write,且带 tools.sandbox: docker)。todo_write 不可用后,守卫测试桩的待办事项从未被创建,守卫无内容可续跑,预期的 4 次模型请求只出现了 2 次。把残留的 settings 文件移走后测试通过;恢复后测试再次失败 — 干净的 A/B 复现。CI 并不会携带这份具体文件,但共享的自托管 runner 可能残留其他作业留下的 workspace settings,属于同一类失败。

修复

fix(test): isolate serve streaming suite from stray workspace settings (#8445) — 提交 d79670383

  • streaming 套件现在用 mkdtempSync 临时 workspace 而非检出目录来启动守护进程,所有会话调用都使用该 workspace,afterAll 中清理。
  • 该改动与仓库针对此漏洞的待合并修复逐字节一致(未合并的 PR feat(review): add declarative repository-context manifest #8401,提交 a1366d9af;其父 blob 与本分支修复前的文件完全相同,因此两者落地时会干净地归并)。未改动其他套件:同目录的 routes 套件不依赖 todo_write

在残留 settings 存在的情况下做 A/B 验证:旧代码以与 CI 完全一致的签名失败(expected 2 to be 4);修复后代码 4/4 通过。

验证

本轮实际运行的全部命令(按顺序):

  • git diff origin/main...HEAD 审查 PR 改动面 — 6 个文件(docs + packages/cli/src/serve/* 及其测试)
  • npm run build — 通过(运行两次:诊断前与修复后)
  • npm run check-i18n — 通过
  • npx prettier --check <改动文件> — 通过
  • npm run generate:settings-schema + git status 新鲜度检查 — 无过期
  • npm run generate:notices --workspace=qwen-code-vscode-ide-companion + 新鲜度检查 — 无过期
  • npm run audit:runtime:critical — 通过(0 个 critical)
  • npm run check:lockfile — 通过
  • npm run check:desktop-isolation — 通过
  • 聚焦 vitest packages/clisrc/serve/run-qwen-serve.test.tssrc/serve/server.test.ts)— 1105 通过
  • npm run test:ci(全部 workspace,CI 环境:全新 HOME、清空 API key)— 通过,退出码 0
  • npm run check:serve-fast-path-bundle — 通过("Startup bundle closure checks passed")
  • npm run lint:ci — 通过
  • node --test <HELPER_TESTS> — 206 通过
  • npm run test:integration:no-ak:sandbox:none(CI 环境)— 修复前 128/129(即上述 Todo Stop Guard replay 失败);修复后:11 个文件,129/129 通过,且在残留 workspace settings 存在的情况下同样通过
  • npx eslint integration-tests/cli/qwen-serve-streaming.test.ts --max-warnings 0 — 通过
  • npm run bundle — 通过(403 个 chunk)

未运行:actionlint / shellcheck / yamllint(PR 与本次修复均未触碰 workflow、shell 或 YAML 文件;合并进来的内容已在 main 的 CI 中用相同 linter 版本通过)。工作流的独立 CI 仍是最终验证门禁。

Deferred non-Critical feedback

Critical-only mode is active after 10 change-producing rounds. The workflow excluded the non-Critical feedback below from this round's actionable sections; the items remain open for human follow-up. Maintainer feedback is deferred only after its author has used 2 regular feedback batches in this window's Critical-only tail; authors at that budget, if any, are named below. (@qwen-code /retry starts a fresh counting window.)

中文说明

完成 10 个产生改动的轮次后进入仅处理 Critical 的模式。本轮可执行区域已排除下方非 Critical 反馈;这些条目保持开放,留待人工跟进。维护者反馈仅在其本人于本窗口 Critical-only 阶段已使用 2 批常规反馈预算后才会延后;达到预算的作者(如有)在下方点名。(评论 @qwen-code /retry 可开启新的计数窗口。)

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.6)

* `GET /` (or the startup-failure envelope). Keep in sync with the routes
* registered in `mountWebShellAssets`.
*/
export function isPreAuthWebShellRequest(req: Request): boolean {

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] R12-1: The predicate's GET/HEAD method guard is exercised by no test — deleting if (req.method !== 'GET' && req.method !== 'HEAD') return false; survives the entire suite (mutation-verified: run-qwen-serve.test.ts stays 231/231 green, and a deferred-window probe flips between the mutated and clean trees). — Failure scenario: under that mutation an anonymous POST / (or POST /assets/x) during the deferred runtime window passes preAuthExempted through the navigation-less / and /assets arms, skips the bearer gate, and starts the daemon runtime before the warm app answers 401 — unauthenticated runtime startup that no existing test catches. Fix in run-qwen-serve.test.ts: extend keeps JSON and API-subpath requests gated during the deferred runtime window with a tokenless POST / probe:

const postRes = await fetch(`${handle.url}/`, { method: 'POST' });
expect(postRes.status).toBe(401);
expect(createBridge).not.toHaveBeenCalled();
中文说明

[建议] R12-1:isPreAuthWebShellRequest 的 GET/HEAD 方法守卫没有任何测试覆盖——删除 if (req.method !== 'GET' && req.method !== 'HEAD') return false; 后整个套件依然全绿(已做变异验证:run-qwen-serve.test.ts 仍为 231/231 通过,deferred 窗口探针在变异前后行为翻转)。失败场景:该变异下,deferred runtime 窗口内的匿名 POST /(或 POST /assets/x)会经由不要求导航信号的 //assets 分支通过 preAuthExempted,跳过 bearer 鉴权并启动 daemon runtime,之后才被热 app 返回 401——现有测试均无法捕获这种未鉴权的 runtime 启动。修复:在 run-qwen-serve.test.tskeeps JSON and API-subpath requests gated during the deferred runtime window 用例中补充无 token 的 POST / 探测(断言 401 且 createBridge 未被调用)。

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

@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 #8445)

This round found no actionable feedback, so no changes were made and no commit was created:

  • No new reviews, inline comments, or issue-level comments from trusted maintainers or the automated reviewer since the last evaluation.
  • No failed checks and no still-red checks.
  • No base-conflict resolution was requested (--conflict false), so origin/main was not merged into the branch.

Critical-only mode is active after 10 change-producing rounds. The two items listed in the deferred non-Critical section (one review and one inline thread on packages/cli/src/serve/web-shell-static.ts) are an audit record, not work for this round. Per the workflow rules they were left untouched: no code changes, no thread resolution, and no comment replies. They remain open for human follow-up.

The branch head is unchanged at d79670383.

中文说明

Autofix 审查轮次 — 未执行任何操作(PR #8445

本轮没有可处理的反馈,因此未做任何改动,也未创建提交:

  • 自上次评估以来,没有来自受信任维护者或自动审查器的新审查、行内评论或 issue 级评论。
  • 没有失败的检查,也没有持续失败的检查。
  • 未要求解决与基础分支的冲突(--conflict false),因此未将 origin/main 合并到本分支。

在经历 10 个产生改动的轮次后,已进入仅处理 Critical 的模式。延后的非 Critical 部分中列出的两个条目(一个审查,以及 packages/cli/src/serve/web-shell-static.ts 上的一个行内讨论串)属于审计记录,不是本轮的工作内容。按照工作流规则,它们未被处理:未改动代码、未解决讨论串、未回复评论。这些条目保持开放,留待人工跟进。

分支 HEAD 保持不变,仍为 d79670383

Deferred non-Critical feedback

Critical-only mode is active after 10 change-producing rounds. The workflow excluded the non-Critical feedback below from this round's actionable sections; the items remain open for human follow-up. Maintainer feedback is deferred only after its author has used 2 regular feedback batches in this window's Critical-only tail; authors at that budget, if any, are named below. (@qwen-code /retry starts a fresh counting window.)

中文说明

完成 10 个产生改动的轮次后进入仅处理 Critical 的模式。本轮可执行区域已排除下方非 Critical 反馈;这些条目保持开放,留待人工跟进。维护者反馈仅在其本人于本窗口 Critical-only 阶段已使用 2 批常规反馈预算后才会延后;达到预算的作者(如有)在下方点名。(评论 @qwen-code /retry 可开启新的计数窗口。)

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


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

@wenshao

wenshao commented Aug 6, 2026

Copy link
Copy Markdown
Collaborator

@qwen-code /triage

@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 6, 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: 63 passed · 0 failed · 63 total

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

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

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

Verification report

PR #8445 Deep Verification — fix(web-shell): allow session refresh with daemon auth

Verdict: merge-ready — 63/63 scripted assertions passed (A/B wire-oracle 34, hostile boundary ladder 29). No blocking findings; one completeness suggestion.
Verified head: d79670383dfde1ed782f24fc1f81096353a0c755 (= HEAD^2; matches metadata headRefOid). Base (CI merge-ref): HEAD^1 = 35108c0cf. Effective diff: git diff HEAD^1..HEAD (7 files, +577/−38).

中文摘要
  • 结论merge-ready。63/63 脚本化断言全部通过,未发现阻塞问题。
  • A/B 结论:中心声明被证明是 load-bearing。真实 daemon(带 bearer token)对 /session/<id> 文档导航(冷/热、GET/HEAD、尾斜杠、大小写变体)在 head 上返回 200 text/html 壳页面,在 base 上全部为 401——共 7 个单元翻转(见表 1,证据图 01-ab-head-pre-auth-flips.png / 02-ab-base-control-401s.png)。所有应继续受保护的单元在两臂上完全一致:JSON 请求、/session/<id>/status/capabilities、非会话 SPA deep-link 均保持 401//assets/* 保持预鉴权 200
  • 安全:29 格恶意路径阶梯(路径穿越、%2F 编码、API 子路径、方法矩阵、前缀混淆)无一绕过鉴权;%2F 单段形状仅返回与 GET / 相同的公开壳 HTML,逐一核验响应体,从未返回会话数据。
  • 测试:变更的两个单元套件 1103 通过 / 2 失败(2 个失败为容器无 IPv6 ::1 的既有环境问题,与 PR 无关,已举证);集成套件 head 4/4 通过。中心测试非空洞(撤掉接线后以 expected 401 to be 200 失败)。9 个守卫突变体 8 个被杀死;1 个幸存(M9,方法门)归类为覆盖缺口而非缺陷。
  • 未覆盖:Windows/浏览器端刷新行为、逐 commit 归因(浅克隆 depth=2)、base 臂集成隔离对照(环境性失败,已做 A/A 举证)、全仓 gate。

Central claim + A/B

Central claim: with a bearer token configured, an unauthenticated document navigation to the exact session deep link /session/<id> loads the public HTML shell (200) — both warm and in the deferred-runtime cold window — while JSON requests to the same path, all session API subpaths, and every other API route stay 401 without the token.

Secondary claims: (1) the deferred-runtime gate exempts exactly the warm app's pre-auth surface (root, // alias, /assets, deep links), fails closed when the predicate rejects, and answers exempted navigations with the 503 daemon_runtime_failed envelope when startup fails instead of a misleading 401; (2) the last commit's scratch-workspace pin isolates the streaming integration suite from stray checkout settings.

Wire-oracle harness ab-probe.mjs spawns the real built daemon per arm (node dist/index.js serve --port 0 --token … --workspace <scratch>), parses the bound port from stdout, and drives real HTTP. Base control = git worktree at HEAD^1 with only packages/cli rebuilt (methodology). Warmth was proven by a bearer probe of a non-bootstrap route leaving 503 as 404 (bootstrap /capabilities answers 200 even when the runtime never starts — a weaker oracle I initially used and corrected).

Cell Probe (unauthenticated unless noted) BASE HEAD
C1 cold GET /session/abc123 doc-nav 401 200 shell
C2 cold GET / doc-nav 401 200 shell
C3 cold GET /assets/<chunk>.js 401 200
C4 cold GET /session/abc123 Accept: application/json 401 401
C5 cold GET /session/abc123/status doc-nav 401 401
W0 runtime warms (bearer session-status 503→404)
W1 warm GET /session/abc123 doc-nav 401 200 shell
W2 warm HEAD /session/abc123 401 200
W3 warm GET /session/abc123/ trailing slash 401 200 shell
W4 warm GET /Session/abc123 case variant 401 200 shell
W5 warm GET /session/abc123 JSON 401 401
W6 warm GET /session/abc123/status doc-nav 401 401
W7 warm GET /capabilities 401 401
W8 warm GET / 200 shell 200 shell
W9 warm GET /assets/<chunk>.js 200 200
W10 warm GET /deep/link doc-nav (non-session SPA fallback) 401 401
W11 warm bearer GET /capabilities 200 200

7/7 navigation cells flip 401→200; 10/10 gated/pre-existing cells are byte-identical across arms. Both arms exited 0 → 17/17 each. Witnesses: 01-ab-head-pre-auth-flips.png, 02-ab-base-control-401s.png; raw logs logs/ab-base-run2.log, logs/daemon-stderr-{head,base}.log. The cold cells (C1–C3) prove the deferred-gate half of the fix over real runtime startup (the exempted navigation itself starts the runtime and then is served by it); the warm cells prove the route-ordering half.

Corrections

None (first round; no prior report to carry forward — previous-report.md absent).

Findings

F1 — Suggestion (completeness): the predicate's GET/HEAD method gate is not pinned by any test

Mutant M9 deleted if (req.method !== 'GET' && req.method !== 'HEAD') return false; from isPreAuthWebShellRequest and survived both changed suites (run-qwen-serve.test.ts full run: all green; server.test.ts: only the two environmental IPv6 reds). Classification: coverage gap, not dead code and not a defect — without the gate, a non-GET/HEAD request shaped like a pre-auth path (e.g. POST /session/abc carrying Sec-Fetch-Mode: navigate) is exempted from the deferred bearer gate and starts the cold runtime; the observable response is still 401 (the warm app's own bearerAuth re-gates — my boundary ladder's method matrix B11–B13 and cB4 all stayed 401 at head), so no bypass exists. The unguarded observable is a side effect: an unauthenticated POST may trigger runtime startup and, if startup fails, receive the 503 startup envelope instead of 401. The fixture that would go red mirrors the PR's own pattern: deferred-window POST /session/abc with navigation headers asserting 401 and expect(createBridge).not.toHaveBeenCalled() (as in "keeps JSON and API-subpath requests gated…"). Non-blocking.

No other findings: no bypass in the 29-cell ladder, no regression in any gated cell, and the %2F invariant (encoded-slash single segments serve only the public shell) holds exactly as the code comment documents — verified by body inspection (/session/..%2fcapabilities and /session/abc%2fstatus return the shell HTML byte-for-byte equivalent to GET /, never JSON/session data).

Not covered

  • Windows/browser refresh — author marked Windows/Linux manual testing N/A; no browser exists in this container. The wire-level cells exercise the exact request shapes a refresh produces (Sec-Fetch-Mode: navigate, Sec-Fetch-Dest: document, HTML-first Accept), but not a real browser.
  • Per-commit attribution — checkout is depth 2: git rev-list --count HEAD^1..HEAD^2 returns 1 while the metadata lists 17 commits, so intermediate commits are unreachable at the shallow boundary. Verified the aggregate HEAD^1..HEAD diff only.
  • Deferred-window runtime-FAILURE cells (503 envelope) were verified at unit level, not E2E — forcing a real qwen --acp startup failure in-container was out of reach without mocks; the PR's own unit test covers it and my mutant M5 proves that test load-bearing (reverting the envelope branch flips it to expected 401 to be 503). This reproduces the wire shape, not a naturally-triggered failure.
  • Integration-suite isolation A/B on base — the last commit's claim (scratch workspace shields the suite from stray .qwen/settings.json) could not be A/B'd: the base daemon exits 1 at boot under the vitest harness with and without a planted stray settings file, while an identical manual spawn (same cwd, env, workspace, args) boots cleanly — environmental, disproven as PR-caused by the A/A contrast. The head suite passes 4/4, which is the live gate. Note: the head repo root's .qwen/ is root-owned read-only in this container, so the stray file could only be planted in the base worktree.
  • Repo-wide gates — only the two changed suites + the changed integration file were run (targeted by design); ESLint/prettier/typecheck rely on the PR's own CI.
  • --allow-origin/CORS and channel-webhook auth paths — untouched by this PR, not re-exercised.

Methodology

Environment: the CI verify container (node:22-bookworm), npm ci + npm run build pre-done at HEAD; ≈90 agent-minutes spent. A/B construction: base worktree at HEAD^1; only packages/cli rebuilt there (after regenerating the git-ignored src/generated/git-commit.ts). package.json/package-lock.json are unchanged by the PR, and packages/core, packages/web-shell, packages/sdk-typescript have empty HEAD^1..HEAD diffs, so reusing the root node_modules is a clean dependency control — I asserted readlink -f node_modules/@qwen-code/qwen-code-core/__w/qwen-code/qwen-code/packages/core and verified those workspaces byte-identical across arms; the base worktree additionally needed symlinks for the nested packages/{core,cli}/node_modules installs and root node_modules (the core tsconfig maps @lydell/node-pty via ../../node_modules, absent in a fresh worktree), plus copies of the unchanged web-shell/sdk build artifacts. Control sanity: base dist contains 0 references to isPreAuthWebShellRequest (head: 2). Harnesses drove real daemons over loopback (ab-probe.mjs 17 cells/arm; boundary-probe.mjs 29 cells) — no stub of the unit under test. Unit gates and the mutation matrix (M0 wiring revert = vacuity check + positive control; M1–M9 one guard each, applied in place, restored via git checkout after each, tree verified clean) ran with npx vitest run scoped to the changed files; the two reds are pre-existing IPv6-environmental (no ::1 in /proc/net/if_inet6; both tests exist verbatim at HEAD^1; PR diff never touches bracket/listen logic). Raw logs: logs/; mutation driver mutation-run.sh; per-cell daemon stderr logs/daemon-stderr-*.log.

Mutation matrix (guards introduced by this PR):

Mutant Guard removed Pinned by
M0 isPreAuthRequest wiring (vacuity check) killed — central test expected 401 to be 200
M1 warm-route isDocumentNavigation check killed — server.test.ts JSON-request test expected 200 to be 401 (the deferred-gate test correctly stayed green: it pins the predicate, and its runtime never starts, so the mutated warm route is unreachable there — separate layer, correct attribution)
M2 toLowerCase() case-mirroring killed — case-variant test
M3 // root alias killed — // root-alias test
M4 fail-closed .catch(() => false) killed — predicate-rejects test expected 500 to be 401
M5 503 envelope for exempted navs on startup failure killed — failure-envelope test expected 401 to be 503
M6 req.pathreq.url killed — query-carrying deep-link test
M7 webShellMounted condition (always wire) killed — --no-web test (bridge unexpectedly called)
M8 predicate's isDocumentNavigation clause killed — JSON/API-subpath gated test (bridge unexpectedly called)
M9 GET/HEAD method gate survived → coverage gap (see F1)

8/9 killed, 1 survivor classified; positive control (M0) proves the harness can turn the suite red.

Evidence images

01-ab-head-pre-auth-flips

02-ab-base-control-401s

03-boundary-ladder-no-bypass

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

Code review

Independent baseline first: I'd have mounted an exact GET/HEAD /session/:id route in the pre-auth static mount, guarded by the existing isDocumentNavigation, and mirrored that exemption into the deferred-runtime cold gate — because a cold daemon answers its first request before the runtime app exists. The PR does exactly this, and the mirroring is the strongest part of it:

  • Warm pathmountWebShellAssets gains app.get('/session/:id') ahead of bearerAuth; non-document requests fall through next() into the gate; API subpaths never match the single-segment route; the post-auth SPA fallback stays where it was.
  • Cold pathisPreAuthWebShellRequest encodes the same surface (GET/HEAD; /, //, /assets*; session regex + navigation signal) and is wired into createDelegatingServeApp as isPreAuthRequest. A rejecting predicate fails closed to the bearer gate instead of 500ing; if the runtime then fails to start, pre-auth navigations get the daemon_runtime_failed envelope directly — the bootstrap app's copy sits behind a gate a navigation cannot pass. With --no-web the predicate is unwired, so everything stays gated.
  • Edge shapes — case-insensitive matching, non-strict trailing slash, query strings, bare /assets 301 are mirrored deliberately, each pinned by a warm/cold parity test.
  • The %2F invariant from the maintainer's verification (percent-encoded single-segment deep links also land pre-auth, byte-identical to GET /, no API reach) is now written down in the isPreAuthWebShellRequest doc comment — the non-blocking observation from the verification was addressed.

No critical findings, no convention violations. The runtimeStartupEnvelope dedup is justified (three read sites), and the new test block is load-bearing per the maintainer's mutation check (deleting the route or breaking the predicate fails exactly the ten new tests; the 401 guards survive both mutations, as regression guards should).

The cold-window flow, since it's the subtlest part of the change:

sequenceDiagram
    participant P1 as Browser navigation
    participant P2 as Delegating app cold gate
    participant P3 as isPreAuthWebShellRequest
    participant P4 as Runtime app
    P1->>P2: GET /session/id document nav
    P2->>P3: exempt from bearer gate?
    P3-->>P2: true (fails closed on error)
    P2->>P4: start runtime and wait
    alt runtime ready
        P4-->>P1: 200 public shell html
    else runtime failed
        P2-->>P1: 503 daemon_runtime_failed
    end
Loading

Testing evidence (this run is CI-path — no local execution of PR code)

All 64 check-runs on the reviewed commit are complete; zero failures. The substantive lanes:

Check Conclusion
Test (ubuntu-latest, Node 22.x) ✅ success
Serve A/B (ubuntu-latest, Node 22.x) ✅ success
web-shell E2E Smoke (ubuntu-latest, Node 22.x) ✅ success
Desktop Shell (ubuntu-22.04) ✅ success
Integration Tests (CLI, No Sandbox) ⏭️ skipped
Test (macos-latest, Node 22.x) ⏭️ skipped
Test (windows-latest, Node 22.x) ⏭️ skipped

The ubuntu unit lane is the gating suite for this repo; the macOS/Windows unit lanes and the no-sandbox integration lane are skipped by repo gating (they were not red — just not run). All pull_request-event workflow runs (Qwen Code CI, SDK Java, Serve A/B) completed green on this head.

Live-behavior signal. The central claim is behavioural (refresh returns 200 + the session restores; everything else stays 401). What substantiates it at this point: the PR's own tests (mutation-checked by the maintainer) and the maintainer's real-stack A/B — real daemon + real browser against the merge-base, 23 raw-HTTP probes, cold-window probes — which @wenshao ran at 2a68383 and reported as verified with no blocking findings (maintainer's evidence, attributed from the verification comment; the delta from that commit to the reviewed head is one doc-comment commit and one test-hermeticity commit). Not independently re-executed by this gate — CI-path runs never execute PR code.

Sandboxed verification is already closing the last gap: @qwen-code /verify is running against this exact head (run 31109288295) — it will A/B the refresh behaviour and the auth probes against the base build at the commit reviewed here, which is the one thing the maintainer's manual A/B did not cover (it ran two commits back).

中文说明

代码审查

先说独立方案:我会把精确的 GET/HEAD /session/:id 路由挂进鉴权前的静态挂载、用现有的 isDocumentNavigation 守卫,并把同样的豁免镜像进 deferred-runtime 冷门——因为冷 daemon 的第一个请求到达时 runtime app 还不存在。本 PR 正是这么做的,其中冷热镜像是最扎实的部分:

  • 热路径 —— mountWebShellAssetsbearerAuth 之前新增 app.get('/session/:id');非文档请求经 next() 落回鉴权门;API 子路径不会匹配单段路由;鉴权后的 SPA fallback 位置不变。
  • 冷路径 —— isPreAuthWebShellRequest 编码同一表面(GET/HEAD;////assets*;session 正则 + 导航信号),作为 isPreAuthRequest 接入 createDelegatingServeApp。谓词抛错时 fail-closed 落回 bearer 门而不是 500;若 runtime 启动失败,免鉴权导航直接收到 daemon_runtime_failed envelope——bootstrap app 里那份在一个导航无法通过的关卡后面。--no-web 时谓词不接线,全部仍被拦截。
  • 边界形态 —— 大小写不敏感、非严格尾斜杠、query 串、裸 /assets 301 都是有意镜像的,且各有冷热一致性测试钉住。
  • %2F 不变式 —— 维护者验证中发现的百分号编码单段深链接也落在免鉴权路由(与 GET / 逐字节相同、不可达 API),现已写入 isPreAuthWebShellRequest 的文档注释——验证中的非阻塞观察已落实。

无阻塞问题,无规范违规。runtimeStartupEnvelope 的去重是合理的(三处使用),新增测试块经维护者变异测试确认有效(删路由或破坏谓词恰好失败十个新测试;断言 401 的守护测试在两种变异下仍通过,符合回归护栏的定位)。

测试证据(本轮为 CI 路径——不本地执行 PR 代码)

被审 commit 上 64 个 check-run 全部完成,零失败。实质通道:ubuntu 单测套件(本仓库的把关套件)、Serve A/B、web-shell E2E Smoke 均为 success;macOS/Windows 单测与无沙箱集成通道是被仓库门禁 skip(未运行,非变红)。所有 pull_request 事件的工作流(Qwen Code CI、SDK Java、Serve A/B)在该 head 上全绿。

行为证据:核心主张是行为性的。目前的支撑是 PR 自带测试(经维护者变异测试核验)加上维护者的真实栈 A/B(真实 daemon + 真实浏览器对照 merge-base,23 组原始 HTTP 探测、冷窗口探测)——@wenshao2a68383 上执行并报告验证通过、无阻塞发现(此为维护者证据,引自其验证评论;该 commit 与被审 head 之间只差一个文档注释 commit 和一个测试隔离 commit)。本门禁未独立复跑——CI 路径从不执行 PR 代码。

沙箱验证正在收口最后一环:@qwen-code /verify 正在当前 head 上运行,将对被审 commit 做与 base 构建的 A/B 对照(刷新行为 + 鉴权探测)——这正是维护者手动 A/B(早两个 commit)未覆盖的部分。

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Confidence: 5/5 — observed bug with a linked reproduction, a minimal diff that matches the independent proposal, green CI on the reviewed commit, and a maintainer deep-verification plus approval standing on exactly this head.

The previous run stopped at the gate on policy, not on defects: an auth-touching carve-out needs a maintainer's sign-off. That question has been answered thoroughly since — an explicit sign-off on the carve-out in review, and then a real-stack A/B (real daemon, real browser, 23 raw-HTTP probes, cold-window probes, mutation-checked tests) concluding "verified, no blocking findings", with an approval pinned to the commit this pass reviewed.

Stepping back over the whole picture:

  • The problem was always real — Web Shell: refreshing a session deep link returns 401 Unauthorized when qwen serve has a bearer token #8560 reproduces concretely, and the mechanism (deep-link fallback registered behind the bearer gate) is visible in the base code.
  • The implementation matches what I'd have proposed independently, then does the part I'd have insisted on anyway: the deferred-runtime cold gate mirrors the warm pre-auth surface exactly, with fail-closed predicate semantics and a startup-failure envelope reachable by navigations. Nothing simpler covers the cold daemon; the obvious alternative (SPA fallback ahead of auth) is documented in-code as worse, and rightly not taken.
  • Every hunk earns its place — the growth across the review rounds is all responsive (deferred window, failure envelope, hermetic integration workspace, the %2F invariant written down). No drive-bys.
  • The tests are real: the maintainer's mutation check fails exactly the ten new tests when the fix is broken, and the 401 guards survive as regression guards should. CI is green on this head; the sandboxed /verify run is finishing off the last gap against the base build.
  • Six months from now this reads as a careful, well-commented 119-line fix with parity tests for every URL shape it claims — not something to curse.

Approving, pinned to the reviewed commit.

中文说明

置信度:5/5 —— 已观测的 bug 且有关联复现,diff 最小且与独立方案一致,被审 commit 上 CI 全绿,维护者做了深度验证并已在同一 head 上批准。

上一轮是出于政策(而非缺陷)在门禁止步:auth 相关的免鉴权例外需要维护者签字。此后该问题已被充分回答——评审中的明确签字,加上真实栈 A/B(真实 daemon、真实浏览器、23 组原始 HTTP 探测、冷窗口探测、变异测试核验)得出"验证通过、无阻塞问题",且批准就落在本轮审查的 commit 上。

整体回顾:问题真实存在(#8560 可具体复现,机制在基线代码中可见);实现与独立方案一致,并补足了我必然会要求的部分——deferred-runtime 冷门精确镜像热路径免鉴权表面、谓词 fail-closed、导航可达的启动失败 envelope;没有更简单的方案能覆盖冷 daemon,显见的替代方案(把 SPA fallback 移到鉴权前)在代码注释中已说明更差且未被采用。每个改动块都有必要——各轮评审带来的增长全部是响应性的,无顺手改动。测试有效:维护者变异测试在破坏修复时恰好失败十个新测试,401 守护测试如回归护栏应有的那样存活。该 head 上 CI 全绿;沙箱 /verify 运行正在收口与 base 构建对照的最后一环。六个月后回看,这是一次谨慎、注释完备、每种 URL 形态都有一致性测试的 119 行修复。

予以批准,批准锚定在被审 commit。

Qwen Code · qwen3.8-max

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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM, looks ready to ship. ✅

@BZ-D
BZ-D added this pull request to the merge queue Aug 6, 2026
Merged via the queue into main with commit 02f1692 Aug 6, 2026
81 checks passed
@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Released in v0.21.7.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

autofix/takeover Summon the autofix loop to manage this PR (remove to release; needs triage+)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Web Shell: refreshing a session deep link returns 401 Unauthorized when qwen serve has a bearer token

5 participants