Skip to content

feat(web-shell): Add explicit daemon session contexts - #10418

Merged
doudouOUC merged 6 commits into
mainfrom
feat/standalone-pr5-webshell-context
Aug 29, 2026
Merged

feat(web-shell): Add explicit daemon session contexts#10418
doudouOUC merged 6 commits into
mainfrom
feat/standalone-pr5-webshell-context

Conversation

@doudouOUC

Copy link
Copy Markdown
Collaborator

What this PR does

This PR gives the daemon React provider an explicit product session context for workspace, standalone, and Live conversations. Workspace requests keep their existing route and compatibility behavior, standalone requests use the capability-gated SDK routes introduced by #10294, and Live restores resolve exactly one trusted non-primary runtime before dispatch. The provider retains standalone working-directory and create-recovery state while keeping the internal Conversations runtime cwd out of the product workspace model.

Non-workspace contexts no longer initialize workspace-only providers, skills, ACP preheat, Git status, or workspace invalidation. Existing WebShell entry points remain unchanged so the visible Global New Chat, Recents, lifecycle controls, and project-control gating can be added separately without depending on the long-running #9811 cutover.

Why it's needed

WebShell needs a typed routing boundary before it can expose sessions that do not belong to a user workspace. Inferring ownership from workspaceCwd would either expose the private Conversations runtime as a project or silently fall back to the primary workspace. An explicit context lets create, load, resume, reconnect, and repair remain fail-closed while preserving legacy workspace callers.

Reviewer Test Plan

How to verify

Confirm that legacy callers using workspaceCwd still create, load, and resume through the ordinary workspace route. For an explicit standalone context, confirm that create/load/resume use the dedicated SDK methods, that create is not automatically retried or masked by the generic action timeout, and that outcome-unknown recovery information remains available. For a Live context, confirm that zero, multiple, untrusted, or primary runtime candidates fail before a session request is sent. Switch rapidly between contexts and verify that only the winning target may publish its transcript, warnings, working-directory state, or recovery state, and that non-workspace contexts do not invoke workspace-only providers.

Local verification completed with the focused daemon provider/action/context test set (418 tests), the complete Web Shell suite (4,418 tests), WebUI and Web Shell builds, the repository build and browser bundle, package and repository typechecks/lint, changed-file formatting, public declaration checks, and clean diff audits.

Evidence (Before & After)

N/A — this PR adds provider routing, state, types, tests, and design documentation without adding a visible WebShell entry point.

Tested on

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

Environment (optional)

macOS with Node.js 22.22.3; dependencies installed with npm ci. Tests and static checks ran without a sandbox.

Risk & Scope

  • Main risk or tradeoff: Session transitions now carry an explicit routing authority, so the highest-risk area is preserving target isolation across create, load, resume, reconnect, and rapid supersession.
  • Not validated / out of scope: Visible standalone entry points and lifecycle UI remain follow-up work; daemon lifecycle behavior, standalone uploads, and the refactor(vscode-ide-companion): complete the WebShell UI cutover #9811 WebShell cutover are unchanged. Windows and Linux were not tested locally and remain covered by CI.
  • Breaking changes / migration notes: None. Existing workspaceCwd callers remain supported; explicit standalone and Live contexts reject a simultaneous legacy cwd instead of guessing ownership.

Linked Issues

Related to #8908. Builds on the standalone TypeScript SDK merged in #10294. Independent of #9811.

中文说明

本 PR 做了什么

本 PR 为 daemon React provider 增加了显式的产品会话上下文,用于区分 workspace、standalone 和 Live 会话。Workspace 请求保持现有路由与兼容行为,standalone 请求使用 #10294 引入且受 capability 约束的 SDK 路由,Live 恢复则在发送请求前精确解析出唯一可信且非 primary 的运行时。Provider 会保留 standalone 工作目录和创建恢复状态,同时不会把内部 Conversations 运行时 cwd 暴露为产品 workspace。

非 workspace 上下文不再初始化仅适用于 workspace 的 providers、skills、ACP 预热、Git 状态或 workspace 失效监听。现有 WebShell 入口保持不变,因此可在后续独立加入全局新建会话、最近会话、生命周期控制和项目控制门禁,而不依赖长期进行中的 #9811 切换。

为什么需要

WebShell 在暴露不属于用户 workspace 的会话前,需要一个类型明确的路由边界。如果继续从 workspaceCwd 推断所有权,要么会把私有 Conversations 运行时暴露成项目,要么会静默回退到 primary workspace。显式上下文可让创建、加载、恢复、重连和修复保持失败关闭,同时兼容原有 workspace 调用方。

Reviewer 测试计划

如何验证

确认继续使用 workspaceCwd 的旧调用方仍通过普通 workspace 路由创建、加载和恢复。对于显式 standalone 上下文,确认创建、加载和恢复使用专用 SDK 方法,创建不会自动重试,也不会被通用 action 超时提前遮蔽,并且结果未知时的恢复信息仍然可用。对于 Live 上下文,确认候选运行时为零、多个、不可信或 primary 时,会在发送会话请求前失败。快速切换不同上下文,确认只有最终胜出的目标能够发布 transcript、警告、工作目录状态或恢复状态,并确认非 workspace 上下文不会调用仅适用于 workspace 的 providers。

本地已完成聚焦的 daemon provider/action/context 测试(418 项)、完整 Web Shell 测试(4,418 项)、WebUI 和 Web Shell 构建、仓库构建与浏览器 bundle、各 package 与仓库级 typecheck/lint、变更文件格式检查、公共声明检查以及干净 diff 审计。

证据(变更前后)

N/A — 本 PR 增加 provider 路由、状态、类型、测试和设计文档,不增加可见的 WebShell 入口。

测试平台

OS 状态
🍏 macOS
🪟 Windows ⚠️
🐧 Linux ⚠️

环境(可选)

macOS,Node.js 22.22.3;使用 npm ci 安装依赖。测试和静态检查未使用 sandbox。

风险与范围

  • 主要风险或取舍:会话切换现在携带显式路由权威,因此最高风险点是创建、加载、恢复、重连和快速覆盖切换期间的目标隔离。
  • 未验证 / 范围外:可见的 standalone 入口和生命周期 UI 留待后续;daemon 生命周期行为、standalone 上传和 refactor(vscode-ide-companion): complete the WebShell UI cutover #9811 WebShell 切换均未修改。Windows 和 Linux 未在本地测试,交由 CI 覆盖。
  • 破坏性变更 / 迁移说明:无。现有 workspaceCwd 调用方继续受支持;显式 standalone 或 Live 上下文若同时提供旧 cwd 会直接拒绝,而不是猜测所有权。

关联 Issue

关联 #8908。基于已在 #10294 合入的 standalone TypeScript SDK。独立于 #9811

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

qwen-code-ci-bot commented Aug 28, 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 28, 2026

Copy link
Copy Markdown
Collaborator

Re-run triggered after the cancelled /verify attempt and the red Ubuntu unit lane. Head is unchanged since the last full pass (adf96da1); every gate below was re-derived just now and the verdict is unchanged.

Template looks good ✓

Problem: planned infrastructure, not a bug fix — PR5 of the standalone daemon session sequence in docs/design/standalone-daemon-sessions.md, building on the standalone SDK merged in #10294 (related to #8908). The need is concrete: without an explicit context, WebShell would have to infer session ownership from workspaceCwd, which either exposes the private Conversations runtime as a project or silently falls back to the primary workspace. The maintainer's A/B harness observed exactly that silent fallback on the merge base, so this is not theoretical.

Direction: aligned. It implements the documented PR5 step and keeps existing workspaceCwd callers working unchanged. CHANGELOG: no direct reference, but the area is an active documented design sequence in this repo.

Size: no core-module paths touched — everything is packages/webui/src/daemon/session/** plus additive type exports and docs. Re-computed this pass: 1,236 production lines vs 3,206 test lines vs 177 doc lines (additions + deletions). Still above the 1,000-line advisory threshold; noted informationally — the design doc scopes PR5 as one atomic routing boundary, so splitting doesn't obviously help.

Approach: the scope matches the PR5 spec — a discriminated union normalized at one provider boundary, dedicated capability-gated SDK routes for standalone, fail-closed unique-trusted-runtime resolution for Live, and workspace-only initialization skipped for non-workspace contexts. Re-checked the file list this pass: 14 files, all docs or packages/webui/src/daemon/session/** and additive type exports, no drive-by changes. No linked closing issues, so no duplicate/already-fixed check applies.

Risk: no high-risk path matches; no elevated risk signals.

Moving on to code review. 🔍

中文说明

本次重跑由被取消的 /verify 运行与变红的 Ubuntu 单测通道触发。head 与上次完整审查相同(adf96da1),以下各项门禁均已重新推导,结论不变。

模板完整 ✓

问题:这是规划中的基础设施,不是 bug 修复——docs/design/standalone-daemon-sessions.md 中 standalone daemon session 系列的 PR5,基于已合入的 #10294(关联 #8908)。需求是具体的:没有显式上下文时,WebShell 只能从 workspaceCwd 推断会话归属,结果要么把私有 Conversations 运行时暴露成项目,要么静默回退到 primary workspace。维护者的 A/B 测试框架在合并基上实际观测到了这种静默回退,因此并非理论问题。

方向:对齐。实现了设计文档中的 PR5 步骤,且现有 workspaceCwd 调用方行为不变。

规模:未触及核心模块路径——全部是 packages/webui/src/daemon/session/**、新增类型导出和文档。本次重新计算:1,236 行生产代码、3,206 行测试、177 行文档(增删合计)。仍超过 1,000 行的大 PR 提示线,仅作信息说明;设计文档将 PR5 定义为一个原子的路由边界步骤,拆分并无明显收益。

方案:范围与 PR5 规格一致——在 provider 单一边界归一化 discriminated union、standalone 走专用的 capability 门禁 SDK 路由、Live 采用失败关闭的唯一可信运行时解析、非 workspace 上下文跳过仅适用于 workspace 的初始化。本次重新核对文件清单:14 个文件,均为文档或 packages/webui/src/daemon/session/** 及新增类型导出,无顺手改动。无关联的 closing issue,不适用重复/已修复检查。

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

进入代码审查 🔍

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Code review

What this pass covers. Head is unchanged since the last pass (adf96da1), so no new code landed; this re-run re-derived the review rather than re-quoting it. I re-read the load-bearing hunks at head this time — the two maintainer-fix hunks, the sourceType guard and its pinning test, the mappers gating, and the type exports — and everything the previous round described is present and correct. Findings unchanged; nothing new surfaced.

The two maintainer findings are closed on this commit (re-verified):

  1. Conflicting props could still create in the primary workspace. getDefaultSessionContext() throws when a prop-resolution error is recorded — that closes the fresh-mount conflict, where the connection carries no stale context. The retained-session variant needs the second hunk: createSession() consults getDefaultSessionContext() directly when the connection is in an error state instead of currentConnection.sessionContext ?? …, because there the stale workspace context from the connected phase would short-circuit the ?? before the throw is ever reached. That pattern already existed in the load path, so the create path now matches it rather than inventing something new. Both extended provider tests pin the exact maintainer scenario: createSession() rejects with the resolution error, zero create routes are called, the error state is preserved, and — in the retained-session variant — the attached session is not detached.
  2. getStandaloneConnectionState source guard unpinned. The unit test feeds a standalone-shaped session with sourceType: 'default' and requires undefined. Checked against the guard: with the sourceType !== 'standalone' clause deleted, every remaining condition passes and the function returns the state object, so the test fails — the mutant that survived @wenshao's run is killed.

Round 3's seven Criticals. The previous pass audited all seven fix hunks against this commit and found them present and root-caused; @wenshao's real-wire pass on d2399f1 independently exercised the observable surface of items 1, 2, 4, 5, 6 (recovery retained, supersession isolated, conflict rejected with zero requests). Nothing in this re-run changes that.

One scope note carried forward, not a blocker: the currentConnection.error ? getDefaultSessionContext() : … branch applies to every error state, not just prop conflicts. For all current callers the two are identical — no production caller passes an action-level context override yet — but whoever wires PR6's entry points should know the retry-after-error default is the props context, not the last session's.

sequenceDiagram
    participant P1 as WebShell caller
    participant P3 as session actions
    participant P2 as DaemonSessionProvider
    participant P4 as SDK DaemonSessionClient
    participant P5 as daemon
    P1->>P3: loadSession with an explicit standalone context
    P3->>P3: resolve and normalize the target context
    P3->>P2: publish connecting state and target context, clear old transcript
    P3->>P4: loadStandalone
    P4->>P5: standalone load request, capability gated
    P5-->>P4: session with standalone fields
    alt transition still current
        P3->>P2: commit client, replay, standalone working-directory state
    else superseded by a newer switch
        P3->>P4: detach the stale client, discard its replay and warnings
    end
Loading
Files changed (14 of 14 shown)
File What changed
docs/design/standalone-daemon-sessions.md PR5 section rewritten to match the WebShell-targeted implementation
docs/plans/2026-08-28-standalone-pr5-webshell-context.md New implementation plan: context contract, dispatch table, switching semantics
packages/webui/src/daemon-react-sdk.ts Exports the two new public context types
packages/webui/src/daemon/index.ts Same two type exports
packages/webui/src/daemon/session/DaemonSessionProvider.test.tsx Dispatch, conflicts, switching, recovery pinning, heartbeat; conflict tests extended to the actions layer
packages/webui/src/daemon/session/DaemonSessionProvider.tsx Context normalization, per-kind dispatch, recovery pinning, workspace isolation; latched resolution errors thrown from getDefaultSessionContext
packages/webui/src/daemon/session/actions.test.ts Context-aware switch/create tests, restore-context clearing pinned
packages/webui/src/daemon/session/actions.ts Context-aware switch/create/list dispatch; createSession consults the default context while the connection is in an error state
packages/webui/src/daemon/session/index.ts Type exports
packages/webui/src/daemon/session/mappers.test.ts New tests for event-mapping gating
packages/webui/src/daemon/session/mappers.ts Git branch/status events ignored outside workspace contexts
packages/webui/src/daemon/session/session-context.test.ts Normalization, Live resolution, keys, error codes; sourceType guard pinned
packages/webui/src/daemon/session/session-context.ts New pure module: context resolution, Live runtime resolution, error-code helpers
packages/webui/src/daemon/session/types.ts DaemonProductSessionContext union, standalone state, new props and action options

Test evidence — the PR's own CI, fetched via API

Unattended re-run: nothing from this PR was built or executed here; the table below is the PR's own check-runs on the reviewed commit, quoted from the API. All lanes have now completed. Everything is green except one: the Ubuntu unit suite, whose single failure is a demonstrated pre-existing timing flake unrelated to this PR — evidence below the table.

CI results for adf96da — this table auto-updates as CI workflows complete:

Check Conclusion
Test (ubuntu-latest, Node 22.x) ❌ failure (pre-existing flake — see below)
web-shell E2E Smoke (ubuntu-latest, Node 22.x) ✅ success
Capture web-shell visuals (ubuntu-latest, Node 22.x) ✅ success
Classify PR ✅ success
Dependency CVE audit ✅ success
Desktop Shell (ubuntu-22.04) ✅ success
Desktop Shell (windows-2022) ✅ success
Integration Tests (no-AK, No Sandbox) ✅ success
Post Coverage Comment (ubuntu-latest, 22.x) ✅ success
Secret scan (TruffleHog) ✅ success

One row per check name (latest run); skipped checks omitted; failures sort first. / 每个检查名一行(取最新一次运行),省略 skipped,失败项排在最前。

The red lane is not this PR's. The unit suite's one failure (22,190 of 22,201 tests pass) is packages/core/src/utils/shellAstParser.test.ts > classifyShellCommandSafety > classifies adversarial rule inputs in bounded time — a wall-clock assertion: expected 1095.86 to be less than 1000, a 9.6% overshoot of a 1-second timing bound. Four independent facts settle the classification: (1) this PR touches zero files in packages/core — the test and the code under it are byte-for-byte identical to the merge base; (2) the same test failed today on an unrelated commit833d0000 (a different PR, job 99093548913) where it took 1820ms amid four simultaneous timing-sensitive failures, the signature of an overloaded runner; (3) in the same failing job here, this PR's own daemon-session suites all passed (session-context 9 ✓, mappers 43 ✓, actions 131 ✓, DaemonSessionProvider 273 ✓); (4) CI is broadly noisy today — ~20 red ci.yml runs in the last few hours including two on main itself, each on a different timing-sensitive test. The repo's CI failure patrol (qwen-ci-flaky-rerun.yml, every 10 min) picks up stale classified flakes for re-run, and a maintainer can also re-run the failed job directly; nothing in this PR can change this test's outcome.

On the behavioural claim: it stands on two independent lanes — @wenshao's real-daemon A/B on d2399f1 (real wire, every routing claim reproduced, 12/13 mutants killed) and the sandboxed /verify run on the round-3 commit (merge-ready, 1012/1012 scripted assertions). The +61/−3 delta since then is pinned test-by-test as described above. One honesty note: the /verify run aimed at this final head was cancelled before completing, so whole-tree re-attestation at adf96da1 does not exist yet; a maintainer re-triggering @qwen-code /verify would supply it (the author has write access, so it runs as a normal lane). There is no user-visible surface yet for /tmux to drive (PR6 owns the entry points). Not verified here, by scope: the standalone happy path (create → load → prompt) remains blocked by the pre-existing daemon-side thinkingMandatory crash @wenshao documented on stock qwen serve — out of this PR's scope since it ships no daemon changes, but worth confirming before the entry-point PR; the author's local suite numbers remain the author's claim.

中文说明

代码审查:head 与上次审查相同(adf96da1),无新代码落地;本次重跑重新推导而非复述——重新通读了承重 hunk(维护者两项修复、sourceType 守卫及其钉住测试、mappers 门禁、类型导出),与上轮描述一致,未发现新问题。

维护者两项发现确已闭合(复核确认):①冲突 props 后 createSession() 仍落到主 workspace——getDefaultSessionContext() 在记录了 props 解析错误时直接抛出(闭合初次挂载冲突);保留会话变体依赖第二个 hunk:连接处于错误态时 createSession() 直接取默认上下文而不走 currentConnection.sessionContext ?? …(否则旧 workspace 上下文会在触达抛错前短路 ??)。该模式在 load 路径早已存在,create 路径与之一致而非新造。②sourceType 守卫补上钉住测试:删掉该子句后测试输入会返回状态对象而非 undefined,存活变异体被杀死。

第 3 轮 7 项 Critical:上轮已逐条对照本提交确认全部在场且根因处理;@wenshao 的真实链路验证独立覆盖了其中多项的可观测面。本次重跑不改变该结论。

一条沿用的范围说明(非阻断):error 分支适用于全部错误态而非仅 props 冲突;当前所有调用方两者一致,但 PR6 接入入口时应知道错误后重试默认取 props 上下文。

测试证据:无人值守重跑,未执行任何 PR 代码。所有通道已完成,除一项外全绿——Ubuntu 单测套件的唯一失败是已证实的既有计时抖动(flake),与本 PR 无关:该测试位于 packages/core/src/utils/shellAstParser.test.ts,断言 1 秒内完成,本次耗时 1095.86ms 超出 9.6%。四点证据定性:本 PR 未触及 packages/core 任何文件(测试与被测代码与合并基逐字节相同);同一测试今天在不相关提交 833d0000(另一 PR)上以 1820ms 失败,且该次运行同时有四个计时敏感测试失败,是典型的 runner 过载;同一失败任务中本 PR 自己的 daemon-session 测试全部通过(9+43+131+273);今天 CI 整体噪声大——数小时内约 20 个红色运行,含两次 main 自身,且各自失败在不同的计时测试上。仓库的 CI 失败巡检(每 10 分钟)会自动复跑被判定为 flake 的任务,维护者也可直接重跑失败任务;本 PR 无法改变该测试的结果。

行为主张仍有两条独立证据链:@wenshaod2399f1 上的真实 daemon A/B 与此前 /verify 沙箱运行;其后 +61/−3 的增量已逐测钉住。诚实说明:针对最终 head 的 /verify 运行在完成前被取消,adf96da1 上尚无整树重证;维护者可重新触发 @qwen-code /verify 补齐(作者有写权限,按常规通道运行)。当前无可见入口供 /tmux 驱动(入口归 PR6)。未验证(范围使然):standalone 正常路径仍被 @wenshao 记录的 daemon 侧 thinkingMandatory 崩溃阻断——本 PR 不含 daemon 改动、属范围外,但入口 PR 之前值得确认;作者本地套件数字为其自述。

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Confidence: 4/5 — every named defect across four review rounds and a maintainer deep-dive is closed and test-pinned at this commit; the only red CI lane is a demonstrated pre-existing timing flake in code this PR doesn't touch, and a maintainer has already approved this exact head.

Stepping back: this one earns its landing. The shape was right in round 1 and it's the same shape now — what changed across the rounds is that the state-retention edges this PR exists to get right were found broken, fixed, found broken again in subtler forms, and are now fixed at the root: retention decisions key on the connection's own state, and resolution errors latch all the way down to the actions boundary instead of leaking a legacy fallback. The last push is exactly the two items @wenshao's real-daemon pass named, closed the way his comment suggested, with tests that pin the exact wire scenario he observed — I re-read each hunk at this head this pass and they are load-bearing, not ceremonial. The evidence stack is unusually complete for this repo: a maintainer exercised every routing claim on a real daemon with wire captures, 12 of 13 targeted mutants killed and the survivor now pinned, the sandboxed verify lane called the earlier tree merge-ready, and the merge-base A/B shows legacy callers byte-for-byte unrouted. If I had to maintain this in six months, the session-context module is pure and testable and the provider's dispatch table reads honestly — I'd thank them.

On the red lane, since it's the one thing standing in the table: the Ubuntu unit suite's single failure is shellAstParser.test.ts's wall-clock bound (1095.86ms vs a 1000ms limit) — code this PR doesn't touch, in a package it doesn't touch, which failed the same way today on an unrelated commit (1820ms there, amid a cluster of timing failures), while this PR's own 456 daemon-session tests passed in the same job. That's infra noise, not a regression — naming it with the evidence rather than letting it stall a review it has nothing to do with. The required-check gate still stands between this PR and merge until a re-run goes green (the flake patrol or a manual job re-run gets there; no code change in this PR can affect it), so this approval skips nothing.

Reservations, none blocking, carried for the series: the daemon-side standalone-create crash from @wenshao's observations section (thinkingMandatory during session/new) should be confirmed before the PR that adds visible standalone entry points, since this PR's happy path could not be exercised end to end; and whoever wires those entry points should know that createSession() after any error state defaults to the props context, not the last session's — deliberate and unobservable today, but a routing decision PR6 inherits. Also noted for the record: the /verify run aimed at this head was cancelled before completing, so whole-tree re-attestation rests on the round-3 tree plus the test-pinned delta, unless a maintainer re-triggers it.

Verdict: approve — posting the approval now, pinned to the reviewed commit. @yiliang114's approval already stands on this same head; this one is the bot's latest word and supersedes its stale round-1/2/3 request-changes reviews, which sit on earlier commits.

中文说明

回顾:这一版配得上合入。形态从第 1 轮起就是对的,现在仍是同一形态——几轮下来变化的是:本 PR 最该做对的状态保留边角先被发现破坏、修复、再以更隐蔽的形式被发现、最终以根因方式修复——保留决策改以连接自身状态为键,解析错误一路锁到 actions 边界,不再泄漏 legacy 回退。最后一个推送正是 @wenshao 真实 daemon 验证点名的两项,按其建议闭合,测试钉住的正是他观测到的链路场景——本次重跑重新通读了这些 hunk,均为承重而非仪式性。证据链在本仓库属少见的完整:维护者在真实 daemon 上以抓包复现了全部路由主张、13 个定向变异体杀死 12 个且存活者已被钉住、沙箱验证通道对更早的树给出 merge-ready、与合并基的 A/B 表明旧调用方行为毫发无损。若六个月后由我维护,session-context 模块纯净可测、provider 分发表诚实可读——会感谢作者。

关于唯一的红色通道:Ubuntu 单测的唯一失败是 shellAstParser.test.ts 的计时上界(1095.86ms 对 1000ms)——本 PR 未触及的代码、未触及的包,且今天已在不相关提交上以同样方式失败过(那里 1820ms,且伴随一组计时类失败),而同一任务中本 PR 自己的 456 个 daemon-session 测试全部通过。这是基础设施噪声,不是回归——连同证据一起点名,而不让它拖住与之无关的审查。必选检查门禁仍然有效:在重跑变绿之前(巡检自动复跑或维护者手动重跑即可,本 PR 无法影响该测试)合并按钮不会解锁,因此本批准不跳过任何环节。

保留意见(均不阻断,留给系列):@wenshao 观察节里记录的 daemon 侧 standalone 创建崩溃(session/new 期间的 thinkingMandatory)应在加入可见入口的 PR 之前确认;接入入口的人应知道任何错误态之后 createSession() 默认使用 props 上下文而非上一会话的上下文——有意且今天不可观测,但这是 PR6 继承的路由决策。另记录在案:针对本 head 的 /verify 运行在完成前被取消,整树重证目前以第 3 轮的树加逐测钉住的增量为准,除非维护者重新触发。

结论:批准——现在即发布钉在被审查提交上的批准。@yiliang114 的批准已在同一 head 上;本批准是本机器人最新的评审意见,取代停留在更早提交上的第 1/2/3 轮请求修改。

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

🖼️ web-shell visual preview

Rendered against a mock daemon (no real backend): the PR base vs this PR head adf96da. Only screenshots that changed are shown (flows below, if any, are head-only) — refreshes on every push.

Screenshots · before / after

⚠️ No preview: one or more scenarios failed to render on this head — see the workflow run. This is not "no visual change" — a scenario that times out or throws produces no image. Fix the failing scenario (or a genuine regression it caught) and the preview returns on the next push.

Full-resolution recordings (.webm) are attached to the workflow run.

Qwen Code · web-shell visuals

@github-actions

github-actions Bot commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 85.66% 85.66% 91.08% 84.62%
Core N/A% N/A% N/A% N/A%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   85.66 |    84.62 |   91.08 |   85.66 |                   
 src               |   86.45 |    82.24 |   88.23 |   86.45 |                   
  cli.ts           |   95.68 |    84.11 |     100 |   95.68 | ...60-561,565-566 
  llm.tsx          |   73.22 |    77.73 |   80.76 |   73.22 | ...1345-1349,1476 
  ...ractiveCli.ts |   89.27 |    83.13 |   89.06 |   89.27 | ...3157,3163,3229 
  ...liCommands.ts |   89.71 |    84.17 |   81.81 |   89.71 | ...31-633,650,757 
  ...ActiveAuth.ts |     100 |     87.5 |     100 |     100 | 66-80             
 ...cp-integration |   74.57 |    77.36 |   93.65 |   74.57 |                   
  acpAgent.ts      |   73.63 |    77.23 |   92.93 |   73.63 | ...02,13080-13081 
  ...k-reporter.ts |     100 |       80 |     100 |     100 | 81,84,119,141     
  authMethods.ts   |      92 |       60 |     100 |      92 | 33-34             
  ...heap-probe.ts |   97.39 |    96.66 |     100 |   97.39 | 243,264-265       
  errorCodes.ts    |     100 |      100 |     100 |     100 |                   
  ...ion-skills.ts |     100 |     87.5 |     100 |     100 | 17,28             
  generation.ts    |    97.1 |    81.25 |     100 |    97.1 | 109,112           
  ...figuration.ts |     100 |    89.65 |     100 |     100 | 79,125,142        
  ...DirContext.ts |     100 |      100 |     100 |     100 |                   
  ...ersistence.ts |   94.95 |    92.24 |     100 |   94.95 | ...13-118,227-228 
  ...management.ts |   74.75 |     66.3 |     100 |   74.75 | ...92-496,505-509 
  ...e-download.ts |    64.7 |    62.24 |    87.5 |    64.7 | ...08-609,615-619 
 ...tegration/live |    97.5 |       88 |   92.85 |    97.5 |                   
  ...en-context.ts |   95.74 |    82.35 |     100 |   95.74 | ...0,66-67,99-100 
  ...structions.ts |     100 |      100 |     100 |     100 |                   
  ...ak-to-user.ts |   96.66 |      100 |    87.5 |   96.66 | 37-38             
  ...task-tools.ts |   98.97 |      100 |   88.88 |   98.97 | 201-202           
 ...ration/service |    97.1 |    95.89 |   93.75 |    97.1 |                   
  filesystem.ts    |    97.1 |    95.89 |   93.75 |    97.1 | ...22-123,246-247 
 ...ration/session |    90.9 |    86.48 |   95.67 |    90.9 |                   
  Session.ts       |   90.27 |    85.23 |   95.03 |   90.27 | ...85,13212-13216 
  ...entTracker.ts |   96.88 |    89.36 |      90 |   96.88 | 139-145,224       
  ...projection.ts |   98.85 |    91.59 |     100 |   98.85 | 234,250,262       
  ...stop-guard.ts |     100 |    98.07 |     100 |     100 | 37,127            
  ...eplay-page.ts |   94.19 |    86.53 |     100 |   94.19 | ...53,357,437,441 
  ...y-replayer.ts |   83.41 |    93.33 |   94.11 |   83.41 | ...30-148,266-268 
  index.ts         |       0 |        0 |       0 |       0 | 1-40              
  ...ssionUtils.ts |   89.19 |     87.8 |     100 |   89.19 | ...85-304,363-365 
  ...oal-update.ts |   98.61 |    97.29 |     100 |   98.61 | 64                
  ...lure-guard.ts |   98.32 |    97.72 |     100 |   98.32 | 294-295,340-341   
  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.65 |    92.34 |   97.14 |   95.65 |                   
  ...ageEmitter.ts |   95.36 |    92.42 |     100 |   95.36 | ...16,129-130,223 
  PlanEmitter.ts   |     100 |       90 |     100 |     100 | 66                
  base-emitter.ts  |   78.26 |    77.77 |     100 |   78.26 | 23-24,26-28       
  index.ts         |       0 |        0 |       0 |       0 | 1-10              
  ...ll-emitter.ts |   98.57 |    94.84 |     100 |   98.57 | 75-76,394-395     
 ...ession/rewrite |   96.03 |    89.79 |   94.44 |   96.03 |                   
  LlmRewriter.ts   |   94.01 |    88.23 |     100 |   94.01 | 101-102,179-183   
  ...Middleware.ts |   96.99 |    88.37 |     100 |   96.99 | 145,153-155       
  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    |   86.63 |     80.8 |   94.01 |   86.63 |                   
  attach-lease.ts  |     100 |    97.05 |     100 |     100 | 173               
  ...t-cli-argv.ts |     100 |     92.3 |     100 |     100 | 15                
  ...ged-detach.ts |     100 |     90.9 |     100 |     100 | 40,64             
  presentation.ts  |   94.13 |    88.72 |   94.73 |   94.13 | ...57-358,382-384 
  protocol.ts      |     100 |      100 |     100 |     100 |                   
  pty-host-env.ts  |     100 |      100 |     100 |     100 |                   
  ...st-process.ts |   88.43 |    78.79 |   94.44 |   88.43 | ...1294,1384-1386 
  pty-host.ts      |   85.25 |    87.03 |   90.69 |   85.25 | ...22-524,539-540 
  ...sor-client.ts |   80.38 |    72.54 |   77.41 |   80.38 | ...22-626,652-656 
  ...r-dispatch.ts |      98 |    85.18 |     100 |      98 | 117,173,190       
  ...or-process.ts |    83.5 |     77.3 |   98.72 |    83.5 | ...4479-4482,4485 
  ...sor-runner.ts |   82.43 |    76.82 |   80.95 |   82.43 | ...69,493,496-506 
  ...sor-server.ts |   84.39 |    83.67 |    93.1 |   84.39 | ...67-568,571-588 
  ...isor-store.ts |   94.76 |    84.95 |     100 |   94.76 | ...,966,1008,1023 
  ...nal-bridge.ts |   93.98 |    91.54 |   83.33 |   93.98 | 228-238           
  ...r-sideband.ts |   94.91 |    89.36 |     100 |   94.91 | ...75-276,299-304 
 src/commands      |   90.69 |    78.53 |   65.62 |   90.69 |                   
  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.9 |      100 |      50 |    98.9 | 102               
  serve.ts         |   89.46 |    76.02 |     100 |   89.46 | ...12-915,927,938 
  sessions.ts      |     100 |      100 |      50 |     100 |                   
  update.ts        |   98.13 |    94.44 |   66.66 |   98.13 | 82-83             
 ...mmands/channel |   89.55 |    88.77 |   90.68 |   89.55 |                   
  channel-cwd.ts   |     100 |      100 |     100 |     100 |                   
  ...l-registry.ts |   94.78 |    94.59 |      90 |   94.78 | ...32-335,380-383 
  ...entry-path.ts |      75 |       50 |     100 |      75 | 8-9               
  config-utils.ts  |   96.84 |    96.22 |     100 |   96.84 | ...40-245,303-306 
  configure.ts     |    14.7 |      100 |       0 |    14.7 | 18-21,23-84       
  daemon-worker.ts |   94.07 |    86.01 |   94.33 |   94.07 | ...1292,1299-1300 
  loop-runtime.ts  |   91.66 |      100 |      50 |   91.66 | 15,22             
  ...classifier.ts |   98.53 |    96.66 |     100 |   98.53 | 115-116,161       
  ...tact-store.ts |   93.51 |    87.65 |     100 |   93.51 | ...71,288-289,337 
  pairing.ts       |      75 |      100 |      50 |      75 | 22-28,59-70       
  pidfile.ts       |   95.55 |       90 |     100 |   95.55 | ...50-251,315-316 
  proxy.ts         |     100 |      100 |     100 |     100 |                   
  reload.ts        |    77.5 |    86.95 |      75 |    77.5 | 72-84,93-97       
  runtime.ts       |   82.43 |    86.44 |     100 |   82.43 | ...87-191,251-253 
  set.ts           |   75.72 |    85.71 |      50 |   75.72 | 65-83,111-116     
  start.ts         |    87.7 |    83.63 |      88 |    87.7 | ...95,601-604,616 
  ...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.85 |    87.91 |   87.09 |   88.85 |                   
  consent.ts       |   72.53 |    90.32 |   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.63 |    57.14 |     100 |   75.63 | ...30-134,136-140 
 ...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  |   91.19 |    88.76 |   85.71 |   91.19 |                   
  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.9 |    84.84 |      80 |    92.9 | ...79-181,199-200 
  reconnect.ts     |   85.54 |    86.76 |    90.9 |   85.54 | 45-58,337-359     
  remove.ts        |     100 |       80 |     100 |     100 | 21-25             
 ...ommands/review |   91.93 |    90.42 |    93.8 |   91.93 |                   
  ab-drive.ts      |   85.22 |    90.47 |   94.11 |   85.22 | ...50-926,969-972 
  agent-prompt.ts  |   94.89 |    92.99 |   97.95 |   94.89 | ...3289,3624-3704 
  base-tree.ts     |   77.02 |    80.76 |   77.77 |   77.02 | ...63-384,386-399 
  capture-local.ts |   94.72 |    97.61 |   94.11 |   94.72 | 271,1336-1374     
  ...k-coverage.ts |   50.71 |       35 |   66.66 |   50.71 | ...40-245,279-289 
  cleanup.ts       |   92.34 |     89.5 |    90.9 |   92.34 | ...1107,1109-1110 
  comment-body.ts  |   67.85 |    87.09 |   66.66 |   67.85 | ...30,157,159-164 
  ...ent-status.ts |   94.22 |    87.32 |    90.9 |   94.22 | ...96,462,738-758 
  ...ose-review.ts |   97.37 |    94.03 |   98.73 |   97.37 | ...6486-6530,6790 
  cost-ledger.ts   |   94.58 |     94.4 |   81.25 |   94.58 | ...53-654,694-704 
  drive.ts         |   97.12 |    89.85 |     100 |   97.12 | ...83-985,990-992 
  extract-step.ts  |   91.36 |    90.62 |   88.88 |   91.36 | ...90-707,714-729 
  fetch-diff.ts    |   73.75 |      100 |   66.66 |   73.75 | 77-97             
  fetch-pr.ts      |   97.29 |    92.25 |     100 |   97.29 | ...1566,1724-1729 
  findings.ts      |    96.3 |    93.68 |     100 |    96.3 | ...1418,1427-1428 
  issue-context.ts |   88.15 |     93.1 |   85.71 |   88.15 | 249-276           
  load-rules.ts    |   26.41 |      100 |   16.66 |   26.41 | ...41-153,155-156 
  match-remote.ts  |   85.55 |     92.3 |   66.66 |   85.55 | 74-79,144-150     
  meta.ts          |   79.43 |    93.75 |   66.66 |   79.43 | 123-128,147-162   
  mock-provider.ts |   95.44 |    90.25 |   89.47 |   95.44 | 145,690-709       
  parse-args.ts    |   99.48 |    95.74 |     100 |   99.48 | 665,990,1046,1082 
  plan-diff.ts     |   71.42 |      100 |   66.66 |   71.42 | 162-197           
  pr-context.ts    |   96.22 |    88.86 |     100 |   96.22 | ...2580,2681-2697 
  presubmit.ts     |   94.32 |    90.83 |   94.11 |   94.32 | ...1219,1254-1285 
  ...ish-assets.ts |    81.3 |    82.22 |   85.71 |    81.3 | ...75-479,506-552 
  ...r-findings.ts |   90.74 |    83.75 |     100 |   90.74 | ...17-422,429-430 
  repo-context.ts  |   94.62 |    90.75 |     100 |   94.62 | ...66-467,482-487 
  ...ve-anchors.ts |   78.34 |    89.28 |      75 |   78.34 | ...83-188,200-217 
  revert-hunk.ts   |   91.48 |    87.94 |     100 |   91.48 | ...1189,1236-1239 
  run.ts           |   84.47 |    87.58 |   95.45 |   84.47 | ...00,816-870,884 
  save-artifact.ts |    94.2 |    92.46 |   94.11 |    94.2 | ...14-617,710-713 
  scratch-tree.ts  |   95.93 |       86 |     100 |   95.93 | ...91-392,461-464 
  script-lint.ts   |   81.27 |    79.38 |   88.88 |   81.27 | ...69-783,785-807 
  submit.ts        |   94.21 |       89 |   94.44 |   94.21 | ...1710,1738-1775 
  test-delta.ts    |   95.75 |     92.3 |      75 |   95.75 | 470-478           
  test-efficacy.ts |   84.03 |    80.48 |   96.07 |   84.03 | ...3249,3257-3277 
  test-plan.ts     |   94.61 |    91.79 |      95 |   94.61 | ...29-832,873-874 
 ...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 |   97.37 |    94.76 |   98.68 |   97.37 |                   
  agent-briefs.ts  |   99.08 |      100 |      50 |   99.08 | 841-842           
  ...t-identity.ts |     100 |      100 |     100 |     100 |                   
  anchors.ts       |     100 |    97.04 |     100 |     100 | ...39,175,184,231 
  assets.ts        |     100 |      100 |     100 |     100 |                   
  audit-layers.ts  |   98.67 |    96.15 |     100 |   98.67 | 288-290           
  authorization.ts |    96.5 |    95.61 |     100 |    96.5 | ...54-255,629-630 
  budget.ts        |     100 |    97.95 |     100 |     100 | 887,940           
  build-budget.ts  |     100 |      100 |     100 |     100 |                   
  certification.ts |     100 |      100 |     100 |     100 |                   
  convergence.ts   |     100 |    97.94 |    92.3 |     100 | 52,515,620,716    
  coverage.ts      |   98.97 |    95.12 |     100 |   98.97 | ...1103,1648-1649 
  deadline.ts      |   98.03 |    91.66 |     100 |   98.03 | ...20,752,820,837 
  diff-flags.ts    |     100 |        0 |     100 |     100 | 75                
  diff-plan.ts     |   99.29 |    95.79 |     100 |   99.29 | 295-296,319       
  disk.ts          |     100 |      100 |     100 |     100 |                   
  effort.ts        |     100 |      100 |     100 |     100 |                   
  failing-files.ts |     100 |    93.33 |     100 |     100 | 41                
  gh.ts            |   89.53 |    95.52 |   78.94 |   89.53 | ...47,384-385,412 
  git.ts           |   96.92 |    94.11 |     100 |   96.92 | 264-265,302-303   
  heavy.ts         |     100 |      100 |     100 |     100 |                   
  import-graph.ts  |   96.68 |     95.6 |     100 |   96.68 | 180-182,211-212   
  ...ntal-scope.ts |     100 |      100 |     100 |     100 |                   
  inline-counts.ts |     100 |      100 |     100 |     100 |                   
  ...audit-gate.ts |     100 |     97.5 |     100 |     100 | 135               
  ledger.ts        |     100 |    99.45 |     100 |     100 | 828               
  local-anchor.ts  |   93.78 |    88.75 |     100 |   93.78 | ...61,594-595,745 
  local-diff.ts    |   86.77 |    94.28 |     100 |   86.77 | ...54-564,566-574 
  ...ry-context.ts |   96.61 |    95.48 |     100 |   96.61 | ...47-450,496-499 
  md-field.ts      |     100 |      100 |     100 |     100 |                   
  merge-base.ts    |     100 |      100 |     100 |     100 |                   
  narrow-diff.ts   |     100 |      100 |     100 |     100 |                   
  npm-toolchain.ts |   98.23 |    95.29 |     100 |   98.23 | ...,822,1203,1220 
  path-rules.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |   98.05 |    88.57 |     100 |   98.05 | 33-34             
  prompt-record.ts |   98.03 |    94.23 |     100 |   98.03 | 293-294,300       
  receipt.ts       |     100 |      100 |     100 |     100 |                   
  remote-match.ts  |   98.03 |    94.73 |     100 |   98.03 | 109-110           
  report.ts        |   92.92 |    86.66 |     100 |   92.92 | 213-214,216-220   
  ...ry-context.ts |     100 |    98.66 |     100 |     100 | 187               
  resume.ts        |     100 |      100 |     100 |     100 |                   
  retirement.ts    |     100 |    94.36 |     100 |     100 | ...58-559,760,917 
  review-footer.ts |   99.55 |    98.09 |     100 |   99.55 | 548-549           
  ...w-settings.ts |     100 |    96.42 |     100 |     100 | 99                
  roster.ts        |     100 |    97.14 |     100 |     100 | 177,222           
  round-model.ts   |     100 |      100 |     100 |     100 |                   
  run-ledger.ts    |    98.2 |    93.87 |     100 |    98.2 | ...23,541,647,670 
  same-file.ts     |     100 |       95 |     100 |     100 | 36                
  ...boxed-exec.ts |   94.26 |    89.32 |   95.65 |   94.26 | ...49-550,728-729 
  shell-quote.ts   |     100 |      100 |     100 |     100 |                   
  stale-bundle.ts  |   98.18 |    94.38 |     100 |   98.18 | 431,472,512-513   
  test-utils.ts    |   99.04 |    91.66 |     100 |   99.04 | 75                
  toolchain.ts     |     100 |      100 |     100 |     100 |                   
  transcripts.ts   |   98.09 |    95.07 |     100 |   98.09 | ...92,438,707-708 
  ...pace-scope.ts |     100 |    96.96 |     100 |     100 | 186               
  workspaces.ts    |     100 |    96.85 |     100 |     100 | 222,452,499,512   
  ...ree-reader.ts |     100 |      100 |     100 |     100 |                   
  worktree.ts      |   89.39 |    81.78 |     100 |   89.39 | ...1813-1814,1827 
 ...w/lib/platform |   94.71 |    87.89 |   97.05 |   94.71 |                   
  aone-client.ts   |   94.94 |     87.3 |     100 |   94.94 | ...92-293,299-302 
  aone.ts          |   93.06 |    89.86 |   94.73 |   93.06 | ...34,598-603,655 
  github.ts        |   99.08 |     75.8 |     100 |   99.08 | 249-250           
  registry.ts      |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...mands/sessions |   94.11 |    89.06 |   89.47 |   94.11 |                   
  common.ts        |     100 |      100 |     100 |     100 |                   
  list.ts          |   90.96 |    86.66 |   81.81 |   90.96 | 208-219,221-222   
  ps.ts            |     100 |    94.44 |     100 |     100 | 58                
 src/config        |   94.27 |    90.47 |   95.02 |   94.27 |                   
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   93.36 |    88.37 |     100 |   93.36 | ...06-307,330-331 
  ...eMcpImport.ts |   87.91 |    81.52 |     100 |   87.91 | ...63-371,453-454 
  compile-cache.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   89.71 |    90.74 |   83.78 |   89.71 | ...2546,2548-2556 
  ...cy-monitor.ts |      90 |    77.27 |     100 |      90 | ...72-73,90-92,98 
  ...ust-policy.ts |   83.02 |    88.88 |     100 |   83.02 | ...02-209,232-240 
  ...heme-names.ts |     100 |      100 |     100 |     100 |                   
  ...ScopeUtils.ts |   97.56 |    88.88 |     100 |   97.56 | 67                
  environment.ts   |   94.51 |    92.55 |   95.23 |   94.51 | ...24-625,679-680 
  ...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.4 |       50 |     100 |    97.4 | 240-243           
  ...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  |   78.57 |       92 |   86.66 |   78.57 | ...18-319,324-326 
  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.93 |     100 |   99.15 | 63                
  sandboxConfig.ts |   93.33 |    93.33 |     100 |   93.33 | ...42-147,216-217 
  session-id.ts    |     100 |      100 |     100 |     100 |                   
  ...ings-cache.ts |   96.52 |    93.93 |     100 |   96.52 | 90-91,201-202     
  settings.ts      |   91.16 |    93.02 |      90 |   91.16 | ...1037,1039-1040 
  ...ingsSchema.ts |     100 |      100 |     100 |     100 |                   
  settingsUtils.ts |   80.92 |     89.2 |   85.18 |   80.92 | ...87-605,612-620 
  ...ngsWatcher.ts |   95.54 |    88.34 |     100 |   95.54 | ...28,277-278,293 
  ...d-env-keys.ts |     100 |      100 |     100 |     100 |                   
  ...l-settings.ts |     100 |      100 |     100 |     100 |                   
  ...paths-lite.ts |   89.47 |       88 |     100 |   89.47 | 43-44,53-54,56-57 
  ...precedence.ts |   98.79 |     92.3 |     100 |   98.79 | 62                
  ...tedFolders.ts |   92.53 |    93.54 |     100 |   92.53 | ...36-337,373-384 
 ...nfig/migration |   95.23 |    78.94 |   85.71 |   95.23 |                   
  index.ts         |   95.65 |     87.5 |     100 |   95.65 | 117-118           
  scheduler.ts     |   96.55 |       80 |     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    |   75.08 |    67.64 |   71.42 |   75.08 |                   
  ...tputBridge.ts |   75.33 |    68.18 |   73.68 |   75.33 | ...09-410,418-421 
  ...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          |   89.68 |    88.66 |   93.02 |   89.68 |                   
  index.ts         |   73.45 |    77.77 |      90 |   73.45 | ...70-271,294-299 
  languageUtils.ts |   98.88 |    97.01 |     100 |   98.88 | 184-185           
  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 |   87.37 |    83.73 |   89.32 |   87.37 |                   
  ...ng-failure.ts |     100 |      100 |     100 |     100 |                   
  ...iveHelpers.ts |   94.95 |    91.05 |     100 |   94.95 | ...30-431,529,542 
  ...uggestions.ts |   84.29 |    70.83 |     100 |   84.29 | 70-76,92-103      
  session.ts       |   84.97 |    76.31 |   96.07 |   84.97 | ...1048,1057-1067 
  ...iagnostics.ts |    95.8 |     87.5 |   93.75 |    95.8 | ...03,277-278,289 
  types.ts         |    42.5 |      100 |   33.33 |    42.5 | ...33-634,637-638 
 ...active/control |   75.54 |    89.83 |      80 |   75.54 |                   
  ...rolContext.ts |    6.06 |        0 |       0 |    6.06 | 57-99             
  ...Dispatcher.ts |   91.95 |    92.98 |   88.88 |   91.95 | ...54-372,392,395 
  ...rolService.ts |    6.89 |        0 |       0 |    6.89 | 46-188            
 ...ol/controllers |   57.47 |     66.3 |   73.68 |   57.47 |                   
  ...Controller.ts |    42.4 |      100 |   83.33 |    42.4 | 101-105,140-223   
  ...Controller.ts |       0 |        0 |       0 |       0 | 1-56              
  ...Controller.ts |   70.04 |    62.92 |   91.66 |   70.04 | ...11-620,635-640 
  ...Controller.ts |   49.23 |       60 |      50 |   49.23 | ...07-108,111-121 
  ...Controller.ts |   53.96 |    67.08 |   66.66 |   53.96 | ...78-690,699-728 
 .../control/types |       0 |        0 |       0 |       0 |                   
  serviceAPIs.ts   |       0 |        0 |       0 |       0 | 1                 
 ...Interactive/io |   98.18 |    94.11 |   95.34 |   98.18 |                   
  ...putAdapter.ts |   98.07 |    93.21 |   98.11 |   98.07 | ...1448,1464-1465 
  ...putAdapter.ts |   96.22 |    91.66 |   85.71 |   96.22 | 52-53             
  ...nputReader.ts |     100 |    94.73 |     100 |     100 | 67                
  ...putAdapter.ts |   98.51 |      100 |   90.47 |   98.51 | 90-91,131-132     
  ...projection.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/patches       |       0 |        0 |       0 |       0 |                   
  is-in-ci.ts      |       0 |        0 |       0 |       0 | 1-17              
 src/peerMessaging |   90.64 |    85.29 |      96 |   90.64 |                   
  ...ngContext.tsx |     100 |      100 |     100 |     100 |                   
  ...-messaging.ts |   90.45 |    85.07 |   95.83 |   90.45 | ...01-306,347-352 
 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.7 |    96.32 |     100 |    99.7 |                   
  ...livery-ipc.ts |     100 |    91.17 |     100 |     100 | 94,106,134        
  ...l-delivery.ts |     100 |      100 |     100 |     100 |                   
  cpu-percent.ts   |     100 |      100 |     100 |     100 |                   
  ...ion-source.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.43 |    84.97 |   90.79 |   87.43 |                   
  ...extra-args.ts |     100 |      100 |     100 |     100 |                   
  ...tp-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   93.99 |     91.5 |     100 |   93.99 | ...29-430,433-435 
  ...em-adapter.ts |     100 |      100 |     100 |     100 |                   
  capabilities.ts  |     100 |    98.18 |     100 |     100 | 717               
  ...cp-command.ts |     100 |      100 |     100 |     100 |                   
  ...horization.ts |   92.79 |    93.54 |    87.5 |   92.79 | 75-80,135-136     
  ...op-mcp-ipc.ts |   81.06 |    73.68 |   94.11 |   81.06 | ...37-242,267,289 
  ...nt-service.ts |    94.1 |    86.98 |     100 |    94.1 | ...75-477,484,486 
  ...-selection.ts |     100 |      100 |     100 |     100 |                   
  ...ings-store.ts |   89.61 |    94.37 |   96.55 |   89.61 | ...64-276,528-531 
  ...ebhook-ipc.ts |    98.5 |     87.5 |     100 |    98.5 | 47                
  ...iagnostics.ts |     100 |      100 |     100 |     100 |                   
  ...worker-env.ts |     100 |      100 |     100 |     100 |                   
  ...rker-group.ts |   87.32 |    85.33 |     100 |   87.32 | ...14,820-824,842 
  ...er-manager.ts |   89.39 |    83.88 |   93.33 |   89.39 | ...98,711,722-724 
  ...horization.ts |     100 |      100 |     100 |     100 |                   
  ...tartup-ipc.ts |   97.72 |    96.66 |     100 |   97.72 | 88-89             
  ...supervisor.ts |   93.24 |    85.42 |    97.4 |   93.24 | ...1765,1819-1823 
  ...e-grouping.ts |     100 |    94.28 |     100 |     100 | 71,137            
  core-runtime.ts  |     100 |      100 |     100 |     100 |                   
  ...ub-session.ts |   90.75 |    80.47 |   94.73 |   90.75 | ...1091,1112-1117 
  ...tree-guard.ts |   93.87 |    89.81 |     100 |   93.87 | ...3227,3297-3301 
  daemon-logger.ts |   82.82 |    78.68 |   92.04 |   82.82 | ...1775,1802-1808 
  ...y-pressure.ts |     100 |    96.96 |     100 |     100 | 135               
  ...trics-ring.ts |     100 |      100 |     100 |     100 |                   
  ...s-provider.ts |   68.04 |    52.77 |     100 |   68.04 | ...44-249,282-290 
  daemon-status.ts |   98.69 |    91.96 |     100 |   98.69 | ...1590,1592-1593 
  debug-mode.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 |    87.09 |     100 |   92.06 | ...72,287-293,316 
  ...h-settings.ts |   94.94 |    90.45 |     100 |   94.94 | ...30,708,724,734 
  fast-path.ts     |   91.38 |       82 |   95.45 |   91.38 | ...46-555,633-634 
  ...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-149             
  ...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 |   91.58 |    86.48 |     100 |   91.58 | ...44-145,156-157 
  ...pp-sandbox.ts |   96.72 |    95.23 |     100 |   96.72 | 41-42             
  ...iders-edit.ts |     100 |    82.14 |     100 |     100 | 58-60,65,81       
  ...ory-picker.ts |     100 |    86.95 |     100 |     100 | 36,66,92          
  ...-with-auth.ts |     100 |      100 |     100 |     100 |                   
  ...ate-blocks.ts |   99.03 |    94.73 |     100 |   99.03 | 133               
  ...sion-audit.ts |     100 |      100 |   93.33 |     100 |                   
  ...nal-ledger.ts |    94.9 |    84.78 |     100 |    94.9 | ...81,302,361-362 
  rate-limit.ts    |   92.68 |    88.29 |     100 |   92.68 | ...89-291,303-305 
  ...qwen-serve.ts |   84.71 |    81.39 |    77.3 |   84.71 | ...9116,9134-9138 
  ...tup-errors.ts |     100 |      100 |     100 |     100 |                   
  sandbox.ts       |   45.52 |    59.42 |   76.92 |   45.52 | ...1050,1062-1085 
  ...-keepalive.ts |   94.31 |    88.28 |     100 |   94.31 | ...37,541-542,581 
  ...-lifecycle.ts |     100 |      100 |     100 |     100 |                   
  ...-lifecycle.ts |   89.16 |    90.29 |   86.95 |   89.16 | ...24-325,330-334 
  serve-token.ts   |     100 |      100 |     100 |     100 |                   
  server.ts        |   89.07 |    91.03 |   70.31 |   89.07 | ...3165,3196-3197 
  ...-admission.ts |   99.13 |    95.94 |     100 |   99.13 | 308-309           
  ...on-helpers.ts |     100 |      100 |     100 |     100 |                   
  ...-redaction.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.72 |    77.93 |     100 |   93.72 | ...51,854,867-869 
  ...l-resolver.ts |   90.32 |    66.66 |     100 |   90.32 | 16,45-46          
  ...ell-static.ts |   93.45 |    86.88 |     100 |   93.45 | ...77-280,323-326 
  ...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.63 |       80 |     100 |   98.63 | 108,136,186,189   
  ...tion-store.ts |   89.67 |    88.27 |   92.59 |   89.67 | ...91-400,411-414 
  ...e-registry.ts |   94.09 |    90.57 |     100 |   94.09 | ...90-591,598-599 
  ...e-remember.ts |   98.23 |    92.56 |     100 |   98.23 | ...36,340-345,386 
  ...te-runtime.ts |   89.88 |     90.9 |     100 |   89.88 | ...05-206,274-295 
  ...me-storage.ts |     100 |      100 |     100 |     100 |                   
  ...visibility.ts |     100 |      100 |     100 |     100 |                   
  ...management.ts |   72.63 |    72.83 |   96.15 |   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 |    80.4 |    80.03 |   94.53 |    80.4 |                   
  ...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 |   93.03 |    84.13 |   98.52 |   93.03 | ...1624,1671-1682 
  dispatch.ts      |   75.71 |    76.82 |   93.44 |   75.71 | ...5649,5706-5712 
  index.ts         |   82.81 |    79.92 |   91.22 |   82.81 | ...2434,2520-2521 
  json-rpc.ts      |     100 |    96.96 |     100 |     100 | 92                
  ...ach-budget.ts |     100 |      100 |     100 |     100 |                   
  safe-ws-send.ts  |   52.94 |    71.42 |     100 |   52.94 | 33-42,47-55       
  sse-stream.ts    |   98.26 |    88.75 |     100 |   98.26 | 87-88,117         
  ...ort-stream.ts |       0 |        0 |       0 |       0 | 1                 
  ws-stream.ts     |   94.06 |    89.09 |     100 |   94.06 | 50,55,134,138-141 
 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             
 .../conversations |   86.32 |    78.74 |   93.33 |   86.32 |                   
  ...e-activity.ts |     100 |      100 |     100 |     100 |                   
  ...ime-errors.ts |     100 |      100 |     100 |     100 |                   
  ...me-manager.ts |   97.88 |    94.91 |     100 |   97.88 | 64-65,92          
  ...-ownership.ts |   87.33 |    83.58 |   88.46 |   87.33 | ...57-558,601-602 
  ...-workspace.ts |   89.21 |    76.37 |     100 |   89.21 | ...52-554,568-572 
  ...on-journal.ts |   91.69 |    80.86 |     100 |   91.69 | ...46-747,753-755 
  ...on-service.ts |   83.22 |    75.11 |   89.01 |   83.22 | ...3014,3023-3025 
 src/serve/fs      |   87.77 |    82.34 |     100 |   87.77 |                   
  audit.ts         |     100 |    96.29 |     100 |     100 | 211               
  errors.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...x-registry.ts |     100 |      100 |     100 |     100 |                   
  paths.ts         |   77.64 |    74.01 |     100 |   77.64 | ...65,594-598,611 
  policy.ts        |   90.52 |    89.18 |     100 |   90.52 | 172-180           
  text-cursor.ts   |   88.23 |       90 |     100 |   88.23 | 74-77,92-95       
  ...ile-system.ts |   88.02 |    81.85 |     100 |   88.02 | ...3027,3037-3038 
 src/serve/live    |    76.6 |    70.53 |    90.2 |    76.6 |                   
  discovery.ts     |   85.89 |    82.05 |    91.3 |   85.89 | ...73-579,592-593 
  ...oordinator.ts |   82.67 |    76.63 |   97.01 |   82.67 | ...1319,1351-1353 
  ...-installer.ts |    64.3 |    82.35 |   80.76 |    64.3 | ...45-446,460-472 
  ...oordinator.ts |    76.7 |    67.47 |   85.71 |    76.7 | ...1885,1976-1977 
  ...controller.ts |   67.82 |    79.66 |      75 |   67.82 | ...66-278,287-295 
  ...sk-service.ts |   82.71 |    66.15 |   93.61 |   82.71 | ...1270,1283,1290 
  ...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.85 |    77.39 |     100 |   94.85 | ...18,327-330,350 
  types.ts         |     100 |      100 |     100 |     100 |                   
 .../local-control |   82.89 |    88.77 |      90 |   82.89 |                   
  credentials.ts   |   96.42 |    95.45 |     100 |   96.42 | 109-110           
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...interfaces.ts |   43.58 |    82.75 |   42.85 |   43.58 | ...09-117,130-142 
  ...r-identity.ts |     100 |    85.71 |     100 |     100 | 61                
  service.ts       |    93.4 |       90 |     100 |    93.4 | ...20-222,313-315 
 src/serve/routes  |   86.39 |    81.71 |   95.73 |   86.39 |                   
  a2ui-action.ts   |   96.84 |     88.5 |    87.5 |   96.84 | ...70-272,309-311 
  capabilities.ts  |   98.73 |    96.15 |     100 |   98.73 | 82                
  ...nel-notify.ts |   79.16 |    85.18 |     100 |   79.16 | ...03-104,120-126 
  ...l-webhooks.ts |   93.56 |    84.09 |     100 |   93.56 | ...42,292,332,334 
  daemon-status.ts |   85.71 |    83.33 |     100 |   85.71 | 101-108           
  goals.ts         |   98.94 |    91.17 |     100 |   98.94 | 143               
  health.ts        |   99.09 |    91.42 |     100 |   99.09 | 147               
  live-setup.ts    |   33.33 |     37.5 |      50 |   33.33 | ...18-123,130-135 
  live.ts          |   84.61 |    76.47 |     100 |   84.61 | ...04,106-111,131 
  permission.ts    |   96.03 |    87.87 |     100 |   96.03 | 81-84             
  ...uled-tasks.ts |   87.95 |    84.38 |   94.59 |   87.95 | ...1730,1775-1776 
  ...r-backfill.ts |   98.53 |    94.51 |     100 |   98.53 | ...48-249,616-617 
  ...on-runtime.ts |   91.42 |       90 |     100 |   91.42 | 56-64             
  session.ts       |   86.69 |    83.06 |    94.3 |   86.69 | ...7149,7151-7152 
  sse-events.ts    |   87.01 |    84.95 |   94.44 |   87.01 | ...40-951,954,961 
  ...e-sessions.ts |    86.9 |    80.57 |     100 |    86.9 | ...81-483,486-491 
  terminal.ts      |   92.81 |    90.35 |     100 |   92.81 | ...10-313,332-335 
  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.35 |    78.94 |     100 |   90.35 | ...52-553,576-577 
  ...d-contacts.ts |   83.62 |    94.59 |     100 |   83.62 | 123,125-142       
  ...controller.ts |   83.33 |    80.47 |      90 |   83.33 | ...1056,1061,1068 
  ...extensions.ts |    89.9 |    79.35 |   93.93 |    89.9 | ...2348,2393-2394 
  ...-file-read.ts |      91 |    80.91 |     100 |      91 | ...20-621,624-625 
  ...file-write.ts |   89.72 |    79.35 |     100 |   89.72 | ...05,719-726,807 
  ...t-branches.ts |   75.04 |     66.4 |     100 |   75.04 | ...99-604,613-620 
  ...e-git-diff.ts |   97.19 |    89.58 |     100 |   97.19 | 157-158,185-187   
  ...ce-git-log.ts |     100 |       95 |     100 |     100 | 48,73             
  workspace-git.ts |   74.71 |     87.5 |     100 |   74.71 | 83-104            
  ...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 
  ...al-control.ts |   74.17 |    69.23 |     100 |   74.17 | ...18,220-226,231 
  ...management.ts |   87.14 |    84.21 |     100 |   87.14 | ...1802,1812-1817 
  ...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.67 |       75 |     100 |   75.67 | ...15-726,732-733 
  ...tup-github.ts |   77.97 |    70.58 |   84.21 |   77.97 | ...46-352,397-398 
  ...ace-skills.ts |   76.41 |    86.11 |     100 |   76.41 | ...29-354,360-394 
  ...ace-status.ts |   82.57 |    74.48 |     100 |   82.57 | ...71-473,477-478 
  ...pace-tools.ts |   75.94 |    69.69 |   66.66 |   75.94 | ...59-164,193-194 
  ...pace-trust.ts |   76.92 |     67.1 |      80 |   76.92 | ...38-343,351-352 
  ...pace-voice.ts |   91.33 |    81.02 |     100 |   91.33 | ...70-673,676-678 
 src/serve/server  |   93.06 |    91.22 |   97.39 |   93.06 |                   
  access-log.ts    |   98.73 |    97.26 |     100 |   98.73 | 119,196           
  ...-timestamp.ts |     100 |      100 |     100 |     100 |                   
  ...er-helpers.ts |   63.82 |    78.15 |   81.81 |   63.82 | ...16,330,332-347 
  ...w-registry.ts |    98.8 |    81.81 |     100 |    98.8 | 107               
  ...r-handlers.ts |   97.87 |       80 |     100 |   97.87 | 27                
  ...r-response.ts |   88.75 |    82.25 |     100 |   88.75 | ...61,878,941-950 
  fs-factory.ts    |     100 |    95.52 |     100 |     100 | 77,144,200        
  ...branch-ops.ts |     100 |      100 |     100 |     100 |                   
  ...list-cache.ts |   99.01 |    95.52 |     100 |   99.01 | 184-185           
  ...t-deadline.ts |     100 |      100 |     100 |     100 |                   
  ...iter-setup.ts |      65 |       80 |   33.33 |      65 | 30-35,38-43,47-48 
  ...st-helpers.ts |   95.13 |    95.14 |     100 |   95.13 | ...66-168,423-428 
  self-origin.ts   |   76.19 |       80 |     100 |   76.19 | 45-54             
  ...e-features.ts |   95.13 |     87.5 |     100 |   95.13 | 188-194           
  ...on-archive.ts |   91.29 |    89.33 |   97.61 |   91.29 | ...1133,1196-1197 
  ...ion-export.ts |   98.57 |    90.47 |     100 |   98.57 | 85                
  session-list.ts  |   97.27 |    93.89 |     100 |   97.27 | ...1183,1392-1396 
  ...pr-refresh.ts |   98.71 |    98.57 |     100 |   98.71 | 267-270           
  ...ry-context.ts |    87.5 |       50 |     100 |    87.5 | 49-50             
  telemetry.ts     |   99.06 |    97.26 |     100 |   99.06 | ...04,873,952-954 
 src/serve/voice   |    92.7 |    91.53 |   97.72 |    92.7 |                   
  ...ice-config.ts |   84.81 |       30 |     100 |   84.81 | 91-100,104-105    
  voice-ws.ts      |   91.58 |    93.44 |      96 |   91.58 | ...68,483,521-523 
  ...oordinator.ts |     100 |    98.24 |     100 |     100 | 176               
 ...kspace-service |   89.85 |    86.73 |    91.3 |   89.85 |                   
  index.ts         |   89.49 |    86.34 |      90 |   89.49 | ...1393-1397,1400 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services      |    92.7 |     89.7 |   98.13 |    92.7 |                   
  ...mandLoader.ts |     100 |       95 |     100 |     100 | 107               
  ...killLoader.ts |   97.19 |    85.71 |     100 |   97.19 | 142,153-154       
  ...andService.ts |   98.73 |      100 |     100 |   98.73 | 107               
  ...mandLoader.ts |   87.09 |    83.07 |     100 |   87.09 | ...35-340,345-350 
  ...omptLoader.ts |   79.55 |    88.42 |   85.71 |   79.55 | ...48,178,245-246 
  ...mandLoader.ts |   97.77 |    92.45 |     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 |   92.14 |    92.42 |     100 |   92.14 | ...91-296,329-330 
  ...low-loader.ts |     100 |    96.29 |     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.89 |     100 |   98.64 | 116,142-143       
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  voice-service.ts |    90.4 |    87.87 |     100 |    90.4 | ...81,288,353-358 
  ...e-settings.ts |     100 |    95.23 |     100 |     100 | 19                
  ...ranscriber.ts |   91.77 |    87.11 |   97.22 |   91.77 | ...96-898,901-903 
 ...s/housekeeping |      93 |    88.34 |      95 |      93 |                   
  scheduler.ts     |      93 |    88.34 |      95 |      93 | ...57-359,411-415 
 ...rvices/insight |     100 |      100 |     100 |     100 |                   
  dates.ts         |     100 |      100 |     100 |     100 |                   
 ...ght/generators |   88.94 |    86.86 |   96.29 |   88.94 |                   
  DataProcessor.ts |   88.31 |    86.84 |      95 |   88.31 | ...1368,1372-1379 
  ...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.25 |     100 |   97.27 |                   
  ...tProcessor.ts |     100 |      100 |     100 |     100 |                   
  ...eProcessor.ts |   94.52 |       85 |     100 |   94.52 | 46-47,93-94       
  ...tionParser.ts |     100 |      100 |     100 |     100 |                   
  ...lProcessor.ts |   97.41 |    95.83 |     100 |   97.41 | 96-99             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services/tips |   97.27 |    84.61 |     100 |   97.27 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  tipHistory.ts    |   92.59 |       70 |     100 |   92.59 | ...24,146,153,162 
  tipRegistry.ts   |     100 |      100 |     100 |     100 |                   
  tipScheduler.ts  |     100 |    91.66 |     100 |     100 | 55                
 src/startup       |   88.99 |    83.47 |    90.9 |   88.99 |                   
  ...p-prefetch.ts |   98.09 |    94.23 |    87.5 |   98.09 | 50,209,225-226    
  ...reeStartup.ts |   80.53 |     74.6 |     100 |   80.53 | ...94,403,409-412 
 src/test-utils    |    94.6 |    76.66 |      80 |    94.6 |                   
  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 |                   
  ...lot-client.ts |     100 |    66.66 |     100 |     100 | 31,39             
  ...andContext.ts |     100 |      100 |     100 |     100 |                   
  render.tsx       |     100 |      100 |     100 |     100 |                   
 src/ui            |   71.09 |    78.17 |   70.65 |   71.09 |                   
  App.tsx          |   33.33 |       75 |   33.33 |   33.33 | 32-86             
  AppContainer.tsx |   76.62 |    73.37 |   71.05 |   76.62 | ...4465,4581-4587 
  ...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        |   63.63 |      100 |   41.17 |   63.63 | ...52,54-55,60-61 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...AutoUpdate.ts |   93.54 |    94.64 |      90 |   93.54 | 126,131,202-213   
  keyMatchers.ts   |   95.91 |    97.14 |     100 |   95.91 | 25-26             
  ...tic-colors.ts |     100 |      100 |     100 |     100 |                   
  ...one-update.ts |   39.81 |    77.44 |   62.16 |   39.81 | ...1193,1196-1215 
  ...ractiveUI.tsx |   68.33 |    77.27 |   41.66 |   68.33 | ...63-465,495-500 
  ...inePresets.ts |   96.27 |    83.87 |     100 |   96.27 | ...97,402,410-412 
  systemInfo.ts    |   95.09 |    90.27 |     100 |   95.09 | ...54-255,260-264 
  ...InfoFields.ts |    87.5 |    65.85 |     100 |    87.5 | ...24-125,146-147 
  textConstants.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...e-relaunch.ts |   89.61 |    86.66 |      50 |   89.61 | 56-61,83-84       
 src/ui/auth       |   69.23 |    72.03 |   61.22 |   69.23 |                   
  AuthDialog.tsx   |   59.01 |     42.1 |   16.66 |   59.01 | ...25,332-354,358 
  ...nProgress.tsx |       0 |        0 |       0 |       0 | 1-64              
  ...etupSteps.tsx |   74.93 |    78.62 |   71.42 |   74.93 | ...92-902,918,921 
  useAuth.ts       |   94.83 |       75 |     100 |   94.83 | ...33-234,253-259 
  ...rSetupFlow.ts |   59.79 |    58.33 |     100 |   59.79 | ...82-403,420-463 
 src/ui/commands   |    84.6 |     84.5 |   91.68 |    84.6 |                   
  aboutCommand.ts  |     100 |      100 |     100 |     100 |                   
  ...or-command.ts |     100 |    95.65 |     100 |     100 | 104,182           
  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 | 28,62             
  cdCommand.ts     |    92.3 |    82.75 |     100 |    92.3 | ...,94-99,178,187 
  clearCommand.ts  |    80.9 |    70.83 |     100 |    80.9 | ...28-129,137-146 
  commands.ts      |   97.45 |    96.66 |     100 |   97.45 | 153-155           
  ...essCommand.ts |   80.71 |     64.7 |     100 |   80.71 | ...05-206,220-223 
  ...astCommand.ts |   84.75 |    76.47 |     100 |   84.75 | ...96-102,130-135 
  ...ig-command.ts |   93.12 |    88.42 |     100 |   93.12 | ...07-315,321-323 
  ...extCommand.ts |   73.75 |    74.02 |   83.33 |   73.75 | ...72-605,616-617 
  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 |   90.56 |    87.83 |    90.9 |   90.56 | ...75-280,327-334 
  docsCommand.ts   |     100 |     90.9 |     100 |     100 | 26                
  doctorChecks.ts  |   70.31 |    74.57 |     100 |   70.31 | ...95-301,325-341 
  doctorCommand.ts |   70.16 |    84.61 |      95 |   70.16 | ...29-679,682-816 
  dreamCommand.ts  |   85.45 |    88.88 |     100 |   85.45 | 58-65             
  editorCommand.ts |     100 |      100 |     100 |     100 |                   
  ...rt-command.ts |   80.95 |       80 |     100 |   80.95 | 49-54,69-72,93-98 
  effort-utils.ts  |     100 |      100 |     100 |     100 |                   
  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 | 95,146            
  goalCommand.ts   |     100 |    96.49 |     100 |     100 | 139,192           
  helpCommand.ts   |     100 |      100 |     100 |     100 |                   
  ...oryCommand.ts |     100 |      100 |     100 |     100 |                   
  hooksCommand.ts  |   81.25 |    65.71 |   85.71 |   81.25 | ...,86-93,131-132 
  ideCommand.ts    |   60.75 |    64.28 |   41.17 |   60.75 | ...05-306,310-324 
  ...figCommand.ts |    58.5 |    74.07 |      80 |    58.5 | ...21-331,334-343 
  initCommand.ts   |   91.86 |       80 |     100 |   91.86 | 48,83-88          
  ...ghtCommand.ts |   77.87 |    71.42 |     100 |   77.87 | ...44-245,250-272 
  ...ageCommand.ts |   94.63 |    90.66 |     100 |   94.63 | ...25-226,253-263 
  learn-command.ts |     100 |      100 |     100 |     100 |                   
  lspCommand.ts    |     100 |    86.95 |     100 |     100 | 31,102-103        
  mcpCommand.ts    |     100 |      100 |     100 |     100 |                   
  memoryCommand.ts |     100 |      100 |     100 |     100 |                   
  modelCommand.ts  |   86.28 |    86.29 |     100 |   86.28 | ...1112,1146-1151 
  peers-command.ts |     100 |    94.36 |     100 |     100 | 59,70,223,228     
  ...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.6 |       90 |     100 |    89.6 | ...72-176,212-219 
  ...oreCommand.ts |   90.96 |    86.04 |     100 |   90.96 | ...41-146,177-178 
  resumeCommand.ts |     100 |      100 |     100 |     100 |                   
  rewindCommand.ts |   81.25 |      100 |      50 |   81.25 | 20-22             
  ...ngsCommand.ts |     100 |      100 |     100 |     100 |                   
  ...hubCommand.ts |   89.47 |       75 |      80 |   89.47 | 54-59             
  skillsCommand.ts |   78.82 |    81.81 |     100 |   78.82 | 37-52,78,97       
  statsCommand.ts  |   90.65 |    76.73 |     100 |   90.65 | ...30-733,825-832 
  ...ineCommand.ts |     100 |      100 |     100 |     100 |                   
  ...aryCommand.ts |   73.04 |     82.3 |      90 |   73.04 | ...20-547,561-565 
  tasksCommand.ts  |   77.33 |    72.13 |     100 |   77.33 | ...46-150,173-178 
  ...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    |     100 |      100 |     100 |     100 |                   
  voice-command.ts |   93.63 |       88 |     100 |   93.63 | 36,98-103         
  ...owsCommand.ts |   94.38 |    85.29 |     100 |   94.38 | ...78-183,282-287 
 src/ui/components |   73.25 |    80.22 |    77.7 |   73.25 |                   
  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 |   89.06 |    90.78 |     100 |   89.06 | ...87-289,303-305 
  Composer.tsx     |   94.54 |    66.66 |     100 |   94.54 | ...-76,88,143,158 
  ...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 |   11.28 |      100 |       0 |   11.28 | 71-598            
  DiffDialog.tsx   |    53.5 |     37.5 |   69.23 |    53.5 | ...32-737,747-760 
  ...ngsDialog.tsx |    8.44 |      100 |       0 |    8.44 | 37-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          
  ...gsDisplay.tsx |     100 |    96.87 |   83.33 |     100 | 69                
  ...ustDialog.tsx |     100 |      100 |     100 |     100 |                   
  Footer.tsx       |   81.27 |    69.23 |      50 |   81.27 | ...06,245,267-272 
  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.69 |    67.61 |     100 |   79.69 | ...17,520,523-529 
  ...ngeDialog.tsx |     100 |      100 |     100 |     100 |                   
  InputPrompt.tsx  |   86.26 |     83.3 |      80 |   86.26 | ...2231,2252,2348 
  ...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.88 |    96.03 |   46.15 |   95.88 | ...20,523-527,530 
  MemoryDialog.tsx |   86.59 |    80.15 |     100 |   86.59 | ...34-435,485,553 
  ...geDisplay.tsx |       0 |        0 |       0 |       0 | 1-41              
  ModelDialog.tsx  |   85.22 |    74.17 |     100 |   85.22 | ...1042,1098,1100 
  ...tsDisplay.tsx |     100 |    97.22 |     100 |     100 | 270               
  ...fications.tsx |   16.66 |      100 |       0 |   16.66 | 14-56             
  ...onsDialog.tsx |    2.13 |      100 |       0 |    2.13 | 62-133,148-1004   
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...icePrompt.tsx |   92.64 |    85.71 |     100 |   92.64 | 102-106,134-139   
  PrepareLabel.tsx |   91.66 |    77.27 |     100 |   91.66 | 73-75,77-79,110   
  ...atePrompt.tsx |    8.57 |      100 |       0 |    8.57 | 24-55,58-134      
  ...geDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ngDisplay.tsx |   21.42 |      100 |       0 |   21.42 | 13-39             
  ...hProgress.tsx |   85.25 |    88.46 |     100 |   85.25 | 121-147           
  ...ngSpinner.tsx |   67.85 |    85.71 |      50 |   67.85 | 33-50,71,78-79    
  ...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.55 |    73.89 |   69.23 |   71.55 | ...1252,1258-1259 
  ...ionDialog.tsx |    92.3 |    96.15 |   33.33 |    92.3 | 60-63,68-75,164   
  ...putPrompt.tsx |    15.9 |      100 |       0 |    15.9 | 20-63             
  ...Indicator.tsx |   57.14 |      100 |       0 |   57.14 | 12-15             
  ...MoreLines.tsx |      28 |      100 |       0 |      28 | 18-40             
  ...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-171             
  ...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.9 |    86.88 |     100 |    93.9 | ...20,282,302-304 
  ...yTodoList.tsx |   96.36 |    88.23 |     100 |   96.36 | 138-141           
  ...nsDisplay.tsx |   95.62 |    87.09 |     100 |   95.62 | ...24-125,273-275 
  ...inalImage.tsx |     100 |    93.93 |     100 |     100 | 75,129            
  ThemeDialog.tsx  |   89.95 |    46.15 |      75 |   89.95 | ...71-173,243-245 
  Tips.tsx         |   93.54 |       75 |     100 |   93.54 | 39-40             
  TodoDisplay.tsx  |     100 |      100 |     100 |     100 |                   
  ...tsDisplay.tsx |     100 |     87.5 |     100 |     100 | 31-32             
  TrustDialog.tsx  |     100 |    83.33 |     100 |     100 | 72-87             
  ...ification.tsx |   36.36 |      100 |       0 |   36.36 | 15-22             
  ...Indicator.tsx |    92.5 |     87.5 |     100 |    92.5 | 50-53             
  ...ackDialog.tsx |    7.84 |      100 |       0 |    7.84 | 24-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 |    61.5 |    75.57 |    62.5 |    61.5 |                   
  ...atContent.tsx |    9.09 |      100 |       0 |    9.09 | 54-275,281-283    
  ...tChatView.tsx |     100 |    81.81 |     100 |     100 | 82                
  ...tComposer.tsx |   78.35 |     64.7 |   66.66 |   78.35 | ...64,277,303-305 
  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 |   45.51 |    70.53 |   60.86 |   45.51 |                   
  ArenaCards.tsx   |   73.06 |    71.79 |   85.71 |   73.06 | ...83-185,321-326 
  ...ectDialog.tsx |   83.48 |    69.86 |   88.88 |   83.48 | ...88-392,409-410 
  ...artDialog.tsx |    9.77 |      100 |       0 |    9.77 | 27-166            
  ...tusDialog.tsx |    5.63 |      100 |       0 |    5.63 | 33-75,80-288      
  ...topDialog.tsx |    6.17 |      100 |       0 |    6.17 | 33-213            
 ...ackground-view |   85.86 |     85.1 |   92.98 |   85.86 |                   
  ...sksDialog.tsx |   82.66 |    83.09 |   85.71 |   82.66 | ...1854,1977-1983 
  ...TasksPill.tsx |   78.84 |    94.28 |     100 |   78.84 | 64,109-129        
  ...gentPanel.tsx |   97.08 |    86.31 |     100 |   97.08 | 132,442-446,520   
  agent-forest.ts  |    99.2 |    93.93 |     100 |    99.2 | 258               
  ...Visibility.ts |     100 |      100 |     100 |     100 |                   
  ...e-overlay.tsx |    88.2 |    76.47 |     100 |    88.2 | ...36-138,140-142 
 ...nts/extensions |   84.32 |    76.78 |   83.33 |   84.32 |                   
  ...gerDialog.tsx |   82.15 |    76.08 |     100 |   82.15 | ...91-198,258,260 
  TabBar.tsx       |   97.29 |    88.88 |     100 |   97.29 | 33                
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...tensions/steps |   46.26 |       85 |   58.82 |   46.26 |                   
  ...ctionStep.tsx |   95.12 |    92.85 |   85.71 |   95.12 | 84-86,89          
  ...etailStep.tsx |       0 |        0 |       0 |       0 | 1-145             
  ...nListStep.tsx |   75.26 |    88.37 |   66.66 |   75.26 | ...53,174,203-209 
  ...electStep.tsx |       0 |        0 |       0 |       0 | 1-83              
  ...nfirmStep.tsx |   16.32 |      100 |       0 |   16.32 | 28-74             
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
 ...xtensions/tabs |   71.92 |    68.21 |   70.83 |   71.92 |                   
  DiscoverTab.tsx  |   68.22 |    67.66 |   55.55 |   68.22 | ...93,656-660,664 
  InstalledTab.tsx |   75.49 |    67.44 |   83.33 |   75.49 | ...77,782-783,820 
  SourcesTab.tsx   |   71.67 |    70.47 |   77.77 |   71.67 | ...28,547,621-633 
 ...tensions/views |    50.7 |    52.38 |   20.83 |    50.7 |                   
  ...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.24 |      100 |       0 |    9.24 | 40-67,70-163      
 ...mponents/hooks |   87.11 |    81.37 |   91.89 |   87.11 |                   
  ...rListBody.tsx |   95.29 |    85.18 |     100 |   95.29 | 95-98             
  ...etailStep.tsx |   75.32 |    71.42 |      60 |   75.32 | ...56-169,173-186 
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entHeader.tsx |     100 |    85.71 |     100 |     100 | 47                
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...abledStep.tsx |     100 |      100 |     100 |     100 |                   
  ...sListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   72.29 |    70.49 |     100 |   72.29 | ...51,563-568,572 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-13              
  ...erGrouping.ts |     100 |      100 |     100 |     100 |                   
  sourceLabels.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...components/mcp |   40.91 |    63.44 |   70.58 |   40.91 |                   
  ...ealthPill.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   32.09 |    26.19 |      40 |   32.09 | ...12,914,927-933 
  ...valDialog.tsx |   15.06 |      100 |       0 |   15.06 | 40-109            
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-35              
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |      97 |       95 |     100 |      97 | 24,113-114        
 ...ents/mcp/steps |   53.94 |    73.51 |   57.14 |   53.94 |                   
  ...icateStep.tsx |    5.65 |      100 |       0 |    5.65 | 40-66,69-308      
  ...electStep.tsx |   10.95 |      100 |       0 |   10.95 | 16-88             
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...eListStep.tsx |   99.09 |    97.36 |     100 |   99.09 | 71                
  ...etailStep.tsx |   62.83 |       60 |   33.33 |   62.83 | ...87-296,307-332 
  ...rListStep.tsx |   88.53 |    81.25 |     100 |   88.53 | ...64,170,175-180 
  ...etailStep.tsx |    10.3 |      100 |       0 |    10.3 | ...1,67-79,82-140 
  ToolListStep.tsx |   69.29 |       50 |     100 |   69.29 | ...23,126,135-144 
 ...nents/messages |   90.78 |    87.65 |   86.79 |   90.78 |                   
  ...orMessage.tsx |     100 |      100 |     100 |     100 |                   
  ...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 |   93.24 |       85 |     100 |   93.24 | 73-75,77,79       
  ...nMessages.tsx |   94.11 |    95.91 |   76.92 |   94.11 | ...47-349,352-355 
  DiffRenderer.tsx |   93.17 |    86.02 |     100 |   93.17 | ...07,235-236,302 
  ...tsDisplay.tsx |   97.08 |    77.77 |     100 |   97.08 | 95,97,106         
  ...usMessage.tsx |   81.73 |     65.9 |      75 |   81.73 | ...10-214,222,245 
  ...tsDisplay.tsx |   95.52 |    88.31 |     100 |   95.52 | ...40,142,175-180 
  ...ssMessage.tsx |    12.5 |      100 |       0 |    12.5 | 18-59             
  ...edMessage.tsx |   21.05 |      100 |       0 |   21.05 | 23-39             
  ...sMessages.tsx |   59.04 |       50 |    37.5 |   59.04 | ...21-126,147-159 
  ...ryMessage.tsx |   13.63 |      100 |       0 |   13.63 | 23-64             
  ...onMessage.tsx |   91.87 |    82.51 |     100 |   91.87 | ...49-651,658-660 
  ...upMessage.tsx |   98.38 |    95.38 |     100 |   98.38 | 188-191,422       
  ToolMessage.tsx  |   95.04 |    89.55 |     100 |   95.04 | ...1075,1120-1122 
 ...ponents/shared |    86.4 |    82.06 |    86.6 |    86.4 |                   
  ...ctionList.tsx |     100 |      100 |      75 |     100 |                   
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  ...rBoundary.tsx |     100 |      100 |     100 |     100 |                   
  MaxSizedBox.tsx  |   84.71 |    87.05 |      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 |   90.37 |    82.85 |   18.18 |   90.37 | ...60-63,65,73-76 
  StaticRender.tsx |     100 |      100 |     100 |     100 |                   
  TextInput.tsx    |    80.8 |    67.79 |      80 |    80.8 | ...36-240,252-258 
  ...ontroller.tsx |     100 |    81.81 |     100 |     100 | 59-62             
  ...apsedTime.tsx |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |     100 |      100 |     100 |     100 |                   
  ...lizedList.tsx |   91.49 |    86.66 |   83.33 |   91.49 | ...18-846,859,959 
  text-buffer.ts   |   85.98 |    81.78 |   97.91 |   85.98 | ...2664,2762-2763 
  ...er-actions.ts |   73.93 |    67.22 |     100 |   73.93 | ...32-733,934-936 
 ...ponents/skills |    3.99 |      100 |       0 |    3.99 |                   
  ...gerDialog.tsx |    3.99 |      100 |       0 |    3.99 | 79-137,140-678    
 ...ents/subagents |   30.87 |        0 |       0 |   30.87 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
  reducers.tsx     |    12.1 |      100 |       0 |    12.1 | 33-190            
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |   10.95 |      100 |       0 |   10.95 | ...1,56-57,60-102 
 ...bagents/create |    9.13 |      100 |       0 |    9.13 |                   
  ...ionWizard.tsx |    7.28 |      100 |       0 |    7.28 | 34-299            
  ...rSelector.tsx |   14.75 |      100 |       0 |   14.75 | 26-85             
  ...onSummary.tsx |    4.26 |      100 |       0 |    4.26 | 27-331            
  ...tionInput.tsx |    8.63 |      100 |       0 |    8.63 | 23-177            
  ...dSelector.tsx |   33.33 |      100 |       0 |   33.33 | 20-21,26-27,36-63 
  ...nSelector.tsx |    37.5 |      100 |       0 |    37.5 | 20-21,26-27,36-58 
  ...EntryStep.tsx |   12.76 |      100 |       0 |   12.76 | 34-78             
  ToolSelector.tsx |    4.16 |      100 |       0 |    4.16 | 31-253            
 ...bagents/manage |    21.6 |    59.52 |   27.27 |    21.6 |                   
  ...ctionStep.tsx |   10.25 |      100 |       0 |   10.25 | 21-103            
  ...eleteStep.tsx |   20.93 |      100 |       0 |   20.93 | 23-62             
  ...tEditStep.tsx |   25.53 |      100 |       0 |   25.53 | ...2,37-38,51-124 
  ...ctionStep.tsx |   35.61 |    59.52 |     100 |   35.61 | ...21-433,438-440 
  ...iewerStep.tsx |   13.72 |      100 |       0 |   13.72 | 18-73             
  ...gerDialog.tsx |    6.74 |      100 |       0 |    6.74 | 35-341            
 ...mponents/views |   69.22 |    71.81 |   61.11 |   69.22 |                   
  ContextUsage.tsx |   71.49 |    64.86 |      80 |   71.49 | ...30-436,473-567 
  DoctorReport.tsx |     9.8 |      100 |       0 |     9.8 | 25-54,57-131      
  ...sionsList.tsx |   88.05 |       75 |     100 |   88.05 | 70-77             
  McpStatus.tsx    |   92.01 |     73.8 |     100 |   92.01 | ...36,175-177,262 
  SkillsList.tsx   |   20.51 |      100 |       0 |   20.51 | 17-20,27-57       
  ToolsList.tsx    |      75 |    81.81 |     100 |      75 | 39-42,59-67       
 src/ui/contexts   |   86.47 |    82.34 |   86.48 |   86.47 |                   
  ...ewContext.tsx |   91.66 |       90 |      75 |   91.66 | ...89-193,279-289 
  AppContext.tsx   |      80 |       50 |     100 |      80 | 19-20             
  ...ewContext.tsx |   93.83 |    68.51 |   42.85 |   93.83 | ...44,281-285,317 
  ...igContext.tsx |   81.81 |       50 |     100 |   81.81 | 15-16             
  ...ssContext.tsx |   85.65 |    84.85 |     100 |   85.65 | ...1612-1614,1620 
  ...owContext.tsx |   91.07 |    81.81 |     100 |   91.07 | 47-48,60-62       
  ...deContext.tsx |     100 |      100 |      50 |     100 |                   
  ...onContext.tsx |   80.77 |       80 |    92.3 |   80.77 | ...31-434,443-446 
  ...gsContext.tsx |     100 |      100 |     100 |     100 |                   
  ...usContext.tsx |     100 |      100 |     100 |     100 |                   
  ...ngContext.tsx |   71.42 |       50 |     100 |   71.42 | 17-20             
  ...utContext.tsx |   85.71 |      100 |   66.66 |   85.71 | 13-14             
  ...edContext.tsx |     100 |      100 |      50 |     100 |                   
  ...nsContext.tsx |   88.88 |       50 |     100 |   88.88 | 156-157           
  ...teContext.tsx |   86.66 |       50 |     100 |   86.66 | 237-238           
  ...deContext.tsx |      80 |     87.5 |      75 |      80 | ...11-112,118-120 
  ...rtContext.tsx |     100 |      100 |     100 |     100 |                   
 src/ui/daemon     |   89.51 |    76.92 |   95.65 |   89.51 |                   
  ...ui-adapter.ts |   89.51 |    76.92 |   95.65 |   89.51 | ...59,877-878,964 
 src/ui/editors    |   93.33 |    85.71 |   66.66 |   93.33 |                   
  ...ngsManager.ts |   93.33 |    85.71 |   66.66 |   93.33 | 49,63-64          
 src/ui/hooks      |   86.07 |     84.2 |   87.81 |   86.07 |                   
  ...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.55 |    73.58 |     100 |   94.55 | ...87-288,293-294 
  ...dProcessor.ts |   86.83 |    71.86 |   83.33 |   86.83 | ...1536,1565-1569 
  ...rt-command.ts |     100 |      100 |     100 |     100 |                   
  ...sced-flush.ts |     100 |      100 |     100 |     100 |                   
  ...llm-stream.ts |   87.63 |    84.43 |   78.72 |   87.63 | ...5813-5815,5817 
  ...ng-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...oice-input.ts |   92.41 |    82.08 |   66.66 |   92.41 | ...12,514-515,670 
  ...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.89 |    77.55 |     100 |   94.89 | 164-168,257,263   
  ...chedScroll.ts |     100 |      100 |     100 |     100 |                   
  ...ketedPaste.ts |    23.8 |      100 |       0 |    23.8 | 19-37             
  ...nchCommand.ts |   96.03 |    88.75 |     100 |   96.03 | ...04-205,362-365 
  ...ompletion.tsx |   97.09 |    87.23 |     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   |   11.62 |      100 |       0 |   11.62 | 44-87             
  ...oublePress.ts |   53.12 |       75 |     100 |   53.12 | 33-35,41-54       
  ...orSettings.ts |     100 |      100 |     100 |     100 |                   
  ...Completion.ts |   99.12 |    97.67 |     100 |   99.12 | 182-183           
  ...ionUpdates.ts |   93.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       
  ...BranchName.ts |     100 |    94.44 |     100 |     100 | 54                
  ...oryManager.ts |   98.44 |     98.9 |     100 |   98.44 | 157-160           
  ...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    
  useKeypress.ts   |     100 |      100 |     100 |     100 |                   
  ...rdProtocol.ts |   36.36 |      100 |       0 |   36.36 | 24-31             
  ...unchEditor.ts |   22.58 |      100 |      50 |   22.58 | 11-32,44-85       
  ...gIndicator.ts |     100 |    96.66 |     100 |     100 | 109               
  useLogger.ts     |      16 |      100 |       0 |      16 | 15-45             
  useMCPHealth.ts  |   10.52 |      100 |       0 |   10.52 | 36-75             
  ...cpApproval.ts |   93.12 |    86.11 |     100 |   93.12 | ...24-127,139-140 
  useMcpDialog.ts  |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...moryDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...oryMonitor.ts |   83.14 |    78.57 |     100 |   83.14 | 54-63,74-79       
  ...ssageQueue.ts |     100 |    94.94 |     100 |     100 | ...43,279,349,359 
  ...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 |   85.29 |    80.28 |    92.3 |   85.29 | ...36,351-361,441 
  useQwenAuth.ts   |     100 |      100 |     100 |     100 |                   
  ...lScheduler.ts |   89.13 |     86.9 |     100 |   89.13 | ...61-463,496-506 
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-7               
  ...umeCommand.ts |   96.51 |    90.19 |     100 |   96.51 | 279,306-311       
  ...ompletion.tsx |   90.67 |    83.33 |     100 |   90.67 | ...02,105,138-141 
  ...ectionList.ts |   97.12 |    96.19 |     100 |   97.12 | ...92-193,247-250 
  ...sionPicker.ts |   92.87 |    90.35 |     100 |   92.87 | ...99-501,503-505 
  ...earchInput.ts |     100 |    97.29 |     100 |     100 | 82                
  ...ngsCommand.ts |   18.75 |      100 |       0 |   18.75 | 10-25             
  ...ellHistory.ts |   93.28 |    80.95 |     100 |   93.28 | ...96,153-154,164 
  ...oryCommand.ts |   85.48 |    58.33 |     100 |   85.48 | 22-28,40,71       
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...Completion.ts |   82.79 |    85.33 |   94.73 |   82.79 | ...86-688,696-732 
  ...tateAndRef.ts |     100 |      100 |     100 |     100 |                   
  ...tatsDialog.ts |     100 |      100 |     100 |     100 |                   
  useStatusLine.ts |   97.32 |    93.93 |     100 |   97.32 | ...18-422,518-525 
  ...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 |    79.2 |    35.29 |     100 |    79.2 | ...15-116,120-121 
  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.25 |    89.47 |     100 |   91.25 |                   
  ...AppLayout.tsx |   90.99 |     87.5 |     100 |   90.99 | 61-63,111-116,152 
  ...AppLayout.tsx |   91.66 |    92.85 |     100 |   91.66 | 75-80             
 src/ui/model      |   97.91 |    98.36 |     100 |   97.91 |                   
  ...ggregation.ts |     100 |      100 |     100 |     100 |                   
  ...ming-model.ts |   97.43 |    97.72 |     100 |   97.43 | 261-265           
 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  |   93.56 |    86.19 |     100 |   93.56 |                   
  screen-buffer.ts |   94.73 |    66.66 |     100 |   94.73 | 51-52             
  ...ion-coords.ts |     100 |      100 |     100 |     100 |                   
  ...ction-span.ts |   93.81 |     92.1 |     100 |   93.81 | ...1,45-46,99-100 
  ...tion-state.ts |     100 |      100 |     100 |     100 |                   
  ...ction-text.ts |   93.85 |    93.44 |     100 |   93.85 | 30-34,130-131     
  ...selection.tsx |   91.88 |    78.57 |     100 |   91.88 | ...16-417,446-447 
 src/ui/state      |      95 |    81.81 |     100 |      95 |                   
  extensions.ts    |      95 |    81.81 |     100 |      95 | 69-70,89          
 src/ui/themes     |    98.5 |    73.17 |     100 |    98.5 |                   
  ansi-light.ts    |     100 |      100 |     100 |     100 |                   
  ansi.ts          |     100 |      100 |     100 |     100 |                   
  atom-one-dark.ts |     100 |      100 |     100 |     100 |                   
  ayu-light.ts     |     100 |      100 |     100 |     100 |                   
  ayu.ts           |     100 |      100 |     100 |     100 |                   
  color-utils.ts   |   99.23 |    97.05 |     100 |   99.23 | 277-278           
  default-light.ts |     100 |      100 |     100 |     100 |                   
  default.ts       |     100 |      100 |     100 |     100 |                   
  ...inal-theme.ts |   88.59 |    85.96 |     100 |   88.59 | ...57-261,266-270 
  dracula.ts       |     100 |      100 |     100 |     100 |                   
  github-dark.ts   |     100 |      100 |     100 |     100 |                   
  github-light.ts  |     100 |      100 |     100 |     100 |                   
  googlecode.ts    |     100 |      100 |     100 |     100 |                   
  no-color.ts      |     100 |      100 |     100 |     100 |                   
  qwen-dark.ts     |     100 |      100 |     100 |     100 |                   
  qwen-light.ts    |     100 |      100 |     100 |     100 |                   
  ...tic-tokens.ts |     100 |      100 |     100 |     100 |                   
  ...-of-purple.ts |     100 |      100 |     100 |     100 |                   
  theme-manager.ts |   88.68 |    84.52 |     100 |   88.68 | ...83-392,397-398 
  theme.ts         |     100 |    38.02 |     100 |     100 | ...34-449,457-461 
  xcode.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/utils      |   87.98 |    86.07 |    96.1 |   87.98 |                   
  ...Colorizer.tsx |   80.31 |    85.41 |     100 |   80.31 | ...00-201,313-339 
  ...nRenderer.tsx |   80.07 |     75.6 |     100 |   80.07 | ...70,274,332-333 
  ...wnDisplay.tsx |   92.87 |     93.5 |     100 |   92.87 | ...,955,1002-1020 
  ...idDiagram.tsx |   87.79 |    95.34 |     100 |   87.79 | 156-179           
  ...eRenderer.tsx |   93.63 |    81.77 |   95.23 |   93.63 | ...47-750,803-808 
  ...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.9 |    74.15 |    92.3 |    52.9 | ...29,632-641,644 
  commandUtils.ts  |   98.61 |    93.22 |     100 |   98.61 | 189,217-218,424   
  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 
  ...coalescing.ts |     100 |      100 |     100 |     100 |                   
  formatters.ts    |   94.87 |    98.24 |     100 |   94.87 | 116-119           
  goal-runtime.ts  |   94.44 |    96.29 |     100 |   94.44 | 32-34             
  gradientUtils.ts |     100 |      100 |     100 |     100 |                   
  highlight.ts     |     100 |      100 |     100 |     100 |                   
  ...gap-notice.ts |     100 |      100 |     100 |     100 |                   
  ...oryMapping.ts |     100 |    95.65 |     100 |     100 | 45,151            
  historyUtils.ts  |   96.07 |     97.1 |     100 |   96.07 | 104-107           
  ...mage-parts.ts |   97.75 |       95 |     100 |   97.75 | 82-83             
  inline-math.ts   |   98.48 |    95.23 |     100 |   98.48 | 129-130           
  input-mouse.ts   |     100 |    85.71 |     100 |     100 | 48,93             
  isNarrowWidth.ts |     100 |      100 |     100 |     100 |                   
  ...olDetector.ts |   68.81 |       75 |   66.66 |   68.81 | ...27-132,160-161 
  latexRenderer.ts |   94.95 |     73.8 |     100 |   94.95 | ...76-178,184-187 
  layoutUtils.ts   |     100 |      100 |     100 |     100 |                   
  list-mouse.ts    |     100 |      100 |     100 |     100 |                   
  ...ightLoader.ts |     100 |       95 |     100 |     100 | 81                
  ...nUtilities.ts |   98.72 |    94.36 |     100 |   98.72 | 145-146           
  ...t-position.ts |     100 |     87.5 |     100 |     100 | 85                
  ...geRenderer.ts |   86.51 |    70.04 |   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          |   91.33 |    79.03 |     100 |   91.33 | ...73,273,277-278 
  ...red-height.ts |   98.38 |    97.14 |     100 |   98.38 | 195-197           
  ...mConstants.ts |     100 |      100 |     100 |     100 |                   
  restoreGoal.ts   |     100 |      100 |     100 |     100 |                   
  ...storyUtils.ts |   84.37 |    81.09 |     100 |   84.37 | ...03-625,759-760 
  ...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 |   95.19 |      100 |   88.88 |   95.19 | 121-126           
  ...nal-buffer.ts |     100 |      100 |     100 |     100 |                   
  ...e-renderer.ts |   90.61 |    83.44 |     100 |   90.61 | ...80,482-484,607 
  ...ize-reflow.ts |     100 |     92.3 |     100 |     100 | 57,62,209,217,347 
  ...wOptimizer.ts |     100 |    94.73 |     100 |     100 | 35,78             
  terminalSetup.ts |    4.37 |      100 |       0 |    4.37 | 44-393            
  textUtils.ts     |   98.71 |    95.72 |     100 |   98.71 | 292-293,478-479   
  ...background.ts |     100 |      100 |     100 |     100 |                   
  todoSnapshot.ts  |   95.81 |     92.3 |     100 |   95.81 | ...09-210,243-244 
  ...isplay-map.ts |     100 |      100 |     100 |     100 |                   
  updateCheck.ts   |     100 |    92.75 |     100 |     100 | 227-239,331       
  windowTitle.ts   |   96.55 |    94.73 |     100 |   96.55 | 56-57             
  ...ow-keyword.ts |     100 |      100 |     100 |     100 |                   
 ...i/utils/export |   75.03 |     60.1 |   94.59 |   75.03 |                   
  collect.ts       |   71.27 |    65.81 |      96 |   71.27 | ...90-633,655-656 
  index.ts         |     100 |      100 |     100 |     100 |                   
  normalize.ts     |   80.42 |    51.35 |     100 |   80.42 | ...59-364,376-378 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
  utils.ts         |     100 |      100 |     100 |     100 |                   
 ...ort/formatters |   52.92 |    47.22 |   71.42 |   52.92 |                   
  html.ts          |   84.61 |       50 |     100 |   84.61 | ...53,57-58,62-63 
  json.ts          |     100 |      100 |     100 |     100 |                   
  jsonl.ts         |   82.45 |     37.5 |     100 |   82.45 | ...48,50-51,65-66 
  markdown.ts      |   36.32 |    47.05 |      50 |   36.32 | ...16-219,233-295 
 src/ui/voice      |   81.24 |    79.78 |   81.69 |   81.24 |                   
  ...d-recorder.ts |     6.2 |      100 |       0 |     6.2 | ...33-159,162-163 
  ...o-recorder.ts |   84.61 |    93.33 |   57.14 |   84.61 | ...16-117,131-136 
  ...me-session.ts |   91.09 |     92.1 |     100 |   91.09 | ...99,305,316-319 
  sox-recorder.ts  |    92.7 |    71.87 |     100 |    92.7 | ...34-135,153-154 
  ...ailability.ts |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |     100 |      100 |     100 |     100 |                   
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  ...e-recorder.ts |   88.29 |    67.74 |   81.81 |   88.29 | ...,98-99,112,115 
  voice-refine.ts  |     100 |    93.33 |     100 |     100 | 92                
  ...ream-retry.ts |   86.79 |       70 |     100 |   86.79 | 16-18,48-49,59-60 
  ...am-session.ts |   88.02 |    66.66 |   84.61 |   88.02 | ...26,343-345,363 
  ...ranscriber.ts |     100 |      100 |     100 |     100 |                   
 src/utils         |   92.39 |    89.82 |   96.12 |   92.39 |                   
  ...p-profiler.ts |   98.39 |    92.59 |     100 |   98.39 | 141,185,235       
  acpModelUtils.ts |   97.36 |    95.09 |     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       
  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        
  ...y-identity.ts |   89.22 |    85.18 |     100 |   89.22 | ...23-424,431-432 
  ...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 | 50-52,58          
  ...re-runtime.ts |     100 |      100 |     100 |     100 |                   
  ...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 
  ...tyWarnings.ts |     100 |      100 |     100 |     100 |                   
  ...lationInfo.ts |   97.81 |    94.69 |     100 |   97.81 | ...03,420-421,466 
  ...projection.ts |   95.27 |    95.58 |     100 |   95.27 | 140-145           
  jsonc-editor.ts  |   93.18 |    92.66 |     100 |   93.18 | ...80-381,384-385 
  load-undici.ts   |     100 |      100 |     100 |     100 |                   
  ...npm-update.ts |   89.31 |    77.33 |     100 |   89.31 | ...87,303-304,344 
  math.ts          |       0 |        0 |       0 |       0 | 1-15              
  ...er-mention.ts |     100 |    66.66 |     100 |     100 | 14,30,44-46       
  ...iagnostics.ts |   94.57 |    83.01 |   88.88 |   94.57 | ...05,311,315-317 
  ...serMessage.ts |     100 |      100 |     100 |     100 |                   
  ...onfigUtils.ts |   94.25 |    91.17 |     100 |   94.25 | ...30,436,439-443 
  ...-part-list.ts |     100 |      100 |     100 |     100 |                   
  osc.ts           |   97.18 |      100 |    87.5 |   97.18 | 182-183           
  package.ts       |   88.88 |    85.71 |     100 |   88.88 | 31-32             
  paths.ts         |     100 |      100 |     100 |     100 |                   
  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 |                   
  ...xImageName.ts |     100 |    77.77 |     100 |     100 | 10,18             
  sandboxMounts.ts |     100 |      100 |     100 |     100 |                   
  ...-path-argv.ts |     100 |      100 |     100 |     100 |                   
  sessionPaths.ts  |   90.84 |    90.56 |     100 |   90.84 | ...81-182,185-186 
  shell-args.ts    |     100 |      100 |     100 |     100 |                   
  spawnWrapper.ts  |     100 |      100 |     100 |     100 |                   
  ...ate-verify.ts |     100 |      100 |     100 |     100 |                   
  ...upProfiler.ts |   98.47 |    94.66 |     100 |   98.47 | 132-133,308       
  ...upWarnings.ts |     100 |      100 |     100 |     100 |                   
  stdioHelpers.ts  |   76.66 |       90 |   83.33 |   76.66 | 93-99             
  ...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 
  ...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 |                   
  ...WithBackup.ts |   65.04 |    77.77 |     100 |   65.04 | 97,112,133-172    
 ...s/housekeeping |   94.35 |    94.11 |     100 |   94.35 |                   
  cleanup.ts       |   92.59 |    93.75 |     100 |   92.59 | ...02-205,209-211 
  ...eractionAt.ts |     100 |      100 |     100 |     100 |                   
  throttledOnce.ts |   95.95 |    93.93 |     100 |   95.95 | 77-78,153-154     
-------------------|---------|----------|---------|---------|-------------------
Core Package - Full Text Report
Core full-text-summary.txt not found at: coverage_artifact/core/coverage/full-text-summary.txt

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

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

Copy link
Copy Markdown
Collaborator Author

Babysit follow-up

Item Decision Action
Web Shell E2E smoke failed to load Voice status from an active secondary workspace Fixed Publish the workspace returned by the loaded workspace session instead of retaining the primary fallback context.
STANDALONE_APPROVAL_MODES duplicated the SDK approval-mode list Agreed Reuse the SDK-exported DAEMON_APPROVAL_MODES constant.

Pushed as 5ac94f2d8e.

Validation: WebUI provider tests (258/258), Web Shell unit tests (4,418/4,418), Web Shell smoke E2E (44/44), repository build, typecheck, lint, and bundle all passed on Node 22.

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

Not explored to full depth (tool budget reached): "agent reverse-audit (round 4)": verify whether the SSE events subscription of an already-loaded standalone session can itself return an explicitly non-retryable body (daemon 409 working_direc….

中文说明

未探索到全部深度(达到工具调用预算):"agent reverse-audit (round 4)"verify whether the SSE events subscription of an already-loaded standalone session can itself return an explicitly non-retryable body (daemon 409 working_direc…

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

Comment thread packages/webui/src/daemon/session/DaemonSessionProvider.tsx Outdated
Comment thread packages/webui/src/daemon/session/DaemonSessionProvider.tsx
Comment thread packages/webui/src/daemon/session/DaemonSessionProvider.tsx
Comment thread packages/webui/src/daemon/session/DaemonSessionProvider.tsx
Comment thread packages/webui/src/daemon/session/DaemonSessionProvider.tsx Outdated
Comment thread packages/webui/src/daemon/session/session-context.test.ts
Comment thread packages/webui/src/daemon/session/session-context.test.ts
Comment thread packages/webui/src/daemon/session/session-context.test.ts
Comment thread packages/webui/src/daemon/session/DaemonSessionProvider.test.tsx Outdated
Comment thread packages/webui/src/daemon/session/DaemonSessionProvider.test.tsx
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
@doudouOUC

Copy link
Copy Markdown
Collaborator Author

Addressed the current review round in 74d4f3d.

The fix prevents controlled base-URL/context echoes from starting unintended sessions, keeps context validation and transition metadata fail closed, preserves standalone recovery semantics, and expands regression coverage across workspace, standalone, and Live routes.

Validation: focused Web UI tests (436), Web Shell tests on Node 22 (4,418), build, typecheck, lint, and bundle all passed.

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

Partially reviewed — gaps disclosed.

Not reviewed: build-and-test — CI test jobs (Test macos/windows Node 22, Integration Tests CLI) were skipped at this commit, and the web-shell consumer suite did not run locally (the changed webui workspace ran green locally: 684 tests).

Deferred under the convergence posture (round 2, not a blocker) — recorded, not requested in this round:

  • packages/webui/src/daemon/session/actions.ts:1579 — [probe] recovery publish not gated on manualSessionClearRef
  • packages/webui/src/daemon/session/actions.ts:1582 — [probe] recovery error path skips the boundary metadata clear
  • packages/webui/src/daemon/session/session-context.ts:167 — [probe] getStandaloneConnectionState rejection path unwitnessed
  • packages/webui/src/daemon/session/DaemonSessionProvider.tsx:204 — [probe] resolveStandaloneApprovalMode throw branch unwitnessed
  • packages/webui/src/daemon/session/actions.test.ts:220 — [review] live-kind clear predicates have no witness
中文说明

仅完成部分审查,审查缺口已披露。

未审查:build-and-test — CI test jobs (Test macos/windows Node 22, Integration Tests CLI) were skipped at this commit, and the web-shell consumer suite did not run locally (the changed webui workspace ran green locally: 684 tests)。

收敛姿态下延后(第 2 轮,非阻断)——已记录,本轮不要求修改:共 5 条(原文未翻译,列表见上方英文部分)。

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

Comment thread packages/webui/src/daemon/session/DaemonSessionProvider.tsx Outdated
Comment thread packages/webui/src/daemon/session/DaemonSessionProvider.tsx
Comment thread packages/webui/src/daemon/session/DaemonSessionProvider.tsx Outdated
Comment thread packages/webui/src/daemon/session/DaemonSessionProvider.tsx
Comment thread packages/webui/src/daemon/session/actions.ts
Comment thread packages/webui/src/daemon/session/DaemonSessionProvider.test.tsx Outdated
Comment thread packages/webui/src/daemon/session/DaemonSessionProvider.tsx
Comment thread packages/webui/src/daemon/session/DaemonSessionProvider.tsx
Comment thread packages/webui/src/daemon/session/session-context.test.ts
Comment thread packages/webui/src/daemon/session/session-context.test.ts
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
@doudouOUC

Copy link
Copy Markdown
Collaborator Author

Addressed review round 2 in 57cb45b2cd:

  • Preserved outcome-unknown standalone recovery without automatic create retry, cleared stale identity on ordinary create failures, and retained standalone identity across transient heartbeat failures.
  • Aligned load and create context handling with requested-versus-canonical workspace cwd semantics, and prevented failed targets from becoming defaults.
  • Added focused regression coverage for controlled/baseUrl reloads, Live and standalone transitions, resync, malformed runtime capabilities, option forwarding, and timeout boundaries.

Validation:

  • WebUI focused session tests: 449 passed.
  • SDK daemon public-surface tests: 23 passed.
  • WebShell provider and browser-artifact tests: 21 passed.
  • Root build, bundle, typecheck, lint, and changed-file formatting checks passed.

Replied to and resolved 19 review threads.

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

Not explored to full depth (tool budget reached): chunk 8: could not execute npx vitest run src/daemon/session/actions.test.ts from packages/webui — the review worktree has no node_modules (package or root) and a ….

Deferred under the convergence posture (round 3, not a blocker) — recorded, not requested in this round:

  • packages/webui/src/daemon/session/DaemonSessionProvider.tsx:211 — [probe] resolveStandaloneApprovalMode throw path has no test at either call site (recorded in round 2)
  • packages/webui/src/daemon/session/DaemonSessionProvider.tsx:3202 — [probe] client_close standalone clear branch has no standalone test
  • packages/webui/src/daemon/session/session-context.test.ts:17 — [probe] getStandaloneConnectionState has zero tests (recorded in round 2)
  • packages/webui/src/daemon/session/DaemonSessionProvider.tsx:3330 — [review] pendingLoadContextMatches error-path gating has no provider test
  • packages/webui/src/daemon/session/DaemonSessionProvider.test.tsx:4467 — [probe] replay-snapshot activeWorkspaceScoped gate (provider:2356) untested for standalone
  • packages/webui/src/daemon/session/actions.test.ts:821 — [probe] active-session standalone branch timeout exemption untested
  • packages/webui/src/daemon/session/actions.test.ts:1038 — [probe] workspace-to-workspace preview retention branch (actions.ts:699) has no loadSession-level test
  • packages/webui/src/daemon/session/session-context.test.ts:375 — [probe] restoreSessionContextMatches normalization equivalence unpinned
  • packages/webui/src/daemon/session/session-context.test.ts:398 — [probe] isDaemonErrorExplicitlyNonRetryable absent-retryable case unpinned
  • packages/webui/src/daemon/session/DaemonSessionProvider.tsx:3279 — [probe] standalone runtime errorCode stamp (provider:3276-3287) pinned by no test
  • packages/webui/src/daemon/session/actions.ts:1469 — [probe] active-session standalone create omits the interrupted-create guard

Convergence: round 3 posted 11 inline comment(s), 10 of them reported for the first time; the previous round posted 19 (19 new). Findings keep coming back to the same files: packages/webui/src/daemon/session/DaemonSessionProvider.test.tsx (findings in round 2; 3 more now); packages/webui/src/daemon/session/DaemonSessionProvider.tsx (findings in round 2; 3 more now); packages/webui/src/daemon/session/actions.test.ts (findings in round 2; 2 more now), and 1 more file(s). A cluster that keeps producing siblings usually means the fixes are treating instances of a shared root cause — triaging that cause before the next round, or splitting an independent cluster into its own pull request, tends to end the loop faster than fixing them one at a time. (Observation only — nothing was withheld from this review because of this observation.)

中文说明

未探索到全部深度(达到工具调用预算):chunk 8:could not execute npx vitest run src/daemon/session/actions.test.ts from packages/webui — the review worktree has no node_modules (package or root) and a …

收敛姿态下延后(第 3 轮,非阻断)——已记录,本轮不要求修改:共 11 条(原文未翻译,列表见上方英文部分)。

收敛情况:第 3 轮发布了 11 条行内评论,其中 10 条是首次提出;上一轮发布了 19 条(其中 19 条首次提出)。发现反复回到同一批文件:packages/webui/src/daemon/session/DaemonSessionProvider.test.tsx(第 2 轮已出过发现,本轮又有 3 条);packages/webui/src/daemon/session/DaemonSessionProvider.tsx(第 2 轮已出过发现,本轮又有 3 条);packages/webui/src/daemon/session/actions.test.ts(第 2 轮已出过发现,本轮又有 2 条),另有 1 个文件。一个不断再生兄弟发现的簇,通常意味着逐条修复只在处理同一根因的实例——先定位并处理该根因,或把独立的簇拆成单独的 PR,通常比逐条修复更快结束循环。(仅为观察——本轮评审未因此扣留任何内容。)

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

Comment thread packages/webui/src/daemon/session/DaemonSessionProvider.tsx
Comment thread packages/webui/src/daemon/session/DaemonSessionProvider.tsx
Comment thread packages/webui/src/daemon/session/DaemonSessionProvider.tsx Outdated
Comment thread packages/webui/src/daemon/session/DaemonSessionProvider.test.tsx
Comment thread packages/webui/src/daemon/session/DaemonSessionProvider.tsx
Comment thread packages/webui/src/daemon/session/actions.ts
Comment thread packages/webui/src/daemon/session/DaemonSessionProvider.test.tsx
Comment thread packages/webui/src/daemon/session/actions.test.ts
Comment thread packages/webui/src/daemon/session/DaemonSessionProvider.test.tsx
Comment thread packages/webui/src/daemon/session/actions.test.ts
@doudouOUC

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

Flakiness gate: ✅ 4 changed test file(s) x 5 identical rounds, no divergence

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

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

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

抖动门:✅ 4 changed test file(s) x 5 identical rounds, no divergence

Verification report

PR #10418 deep verification — feat(web-shell): Add explicit daemon session contexts

Verdict: merge-ready — 1012/1012 executed scripted assertions passed (0 unexpected failures). Verified head: 57cb45b2cda38edb04e5124a4329b02aacb73fb9 (merge base tip: 48ec0083454200dbb0f76ff4c3251e6b4cf45bf2).

中文摘要
  • 结论merge-ready。1012 项脚本化断言全部通过,0 项意外失败。
  • A/B 结论:基线(base)的 245 个 provider 行为测试在 head 上原样全绿(245 → 245,见 01-ab-legacy-base-vs-head.png),证明沿用 workspaceCwd 的旧调用方行为完全保留。
  • 核心路由主张(wire oracle,真实 HTTP、真实 SDK、真实 Provider,68/68 检查,见 02-wire-oracle-routing.png):workspace/legacy 走 POST /session;standalone 走 POST /standalone/sessions(及 /:id/load)且不触碰任何 workspace-only 接口(skills/providers/git),内部运行时 cwd 不泄漏为产品 workspace;Live 在发送任何会话请求前解析唯一可信非 primary 运行时,零/多个/不可信/primary/缺 capability/重复 cwd 六种畸形 capabilities 全部 fail-closed 且零会话请求;standalone 创建 outcome-unknown 时发布 recovery 且恰好一次创建(不自动重试、不被通用超时遮蔽);同 sessionId 的 workspace→standalone 快速覆盖切换中只有胜出目标发布状态。
  • 变异矩阵(5 个变异体全被杀死,见 03-mutation-matrix.png):移除 Live 信任审计、matcher 恒 true/false、移除 recovery 发布、回退 git 事件守卫,均被其钉住的测试或 wire 场景捕获。
  • Findings:1 项非阻塞 Suggestion —— restoreSessionContextMatches 的行为级后果仅由单元测试钉住,provider/actions/wire 电池在其恒 true 时仍全绿(兄弟防御:effect 生命周期 abort + 单槽 pending-load 顶住),属完整性观察而非缺陷。
  • 未覆盖:逐 commit 归因(浅克隆仅可达 4 个 PR commit 中的 1 个)、完整 Web Shell 套件(4,418 项,交由 CI)、真实 daemon E2E(本环境用协议保真的假 daemon)、可见 standalone 入口 UI(PR 声明范围外)。

Central claim and A/B

Central claim: an explicit product session context is the routing authority — workspace/legacy workspaceCwd keep the ordinary route; standalone uses the capability-gated SDK routes; Live resolves exactly one trusted non-primary runtime before any session request, failing closed otherwise; and only the winning target may publish state across supersession.

A/B (legacy compatibility, 01-ab-legacy-base-vs-head.png): the base's own 245-test provider behavior suite is the oracle for legacy callers; it runs unmodified against both trees.

Cell Tree under test Oracle Result
A (control) base (48ec0083) base provider suite 245/245 pass
B head (57cb45b2) same base provider suite 245/245 pass

Identical counts on both arms: legacy create/load/resume via workspaceCwd is behavior-preserving. Control cleanliness: the PR touches no package.json/package-lock.json/packages/sdk-typescript (verified by git diff --stat), and a tree-locality probe confirmed the base worktree resolves its own sources (session-context.js absent at base → import fails there).

Wire oracle (02-wire-oracle-routing.png, harness wire-oracle-harness.test.tsx): real DaemonSessionProvider + real @qwen-code/sdk DaemonClient over loopback HTTP against a recording fake daemon; the request log is the oracle. 68/68 scripted checks across 15 scenarios (stable over two consecutive runs):

Scenario Wire oracle result
W1 legacy workspaceCwd POST /session with cwd:'/w/alpha'; workspace skills/providers/git fetched; standalone route untouched
W2 explicit workspace context identical route/body to W1
S1 standalone create POST /standalone/sessions; zero `/workspace/skills
S2 standalone load POST /standalone/sessions/sa-9/load; never POST /session/sa-9/load
L1 live resume POST /session/live-1/load with body cwd:'/live/runtime' (resolved from capabilities)
L2–L7 live fail-closed (zero / multiple / untrusted / primary / missing capability / duplicate cwd) connection error naming the resolution failure; zero session load/resume requests, still zero after a settle window
R1 outcome-unknown create exactly one POST /standalone/sessions, recovery lookup GET /standalone/sessions/:id, creationRecovery.state==='creating' published, no auto-retry after re-render, error not masked by the generic action timeout
C1/C2 conflicting props connection error naming the conflict; zero requests reached the daemon
I1 rapid workspace→standalone supersession (same session id) both loads dispatched; winner standalone; late workspace load never retakes the connection; no workspace metadata leak

Reviewer Test Plan walkthrough (per step): (1) legacy routes — W1/W2 + cell B ✓; (2) standalone dedicated routes — S1/S2 + PR suite ✓; (3) create not auto-retried / not timeout-masked — R1 ✓; (4) outcome-unknown recovery available — R1 + M3 ✓; (5) Live zero/multiple/untrusted/primary fail before dispatch — L2–L5 ✓; (6) only the winning target publishes across rapid switches — I1 + PR supersession tests ✓; (7) non-workspace contexts skip workspace-only providers — S1 + M4 ✓.

Targeted gates at head: PR's own suites 449/449 (session-context 8 + mappers 43 + actions 128 + provider 270); tsc --noEmit clean; ESLint clean on all 12 changed source files (gate proven live: planted unused-var reported, then clean after revert); Prettier clean on all changed files.

Findings

S1 (non-blocking, completeness observation): the pending-load context matcher is pinned only at unit level; behavioral batteries hold via sibling defenses. With restoreSessionContextMatches mutated to always-true (M2), the provider suite (270), actions suite (128), and the full 68-check wire battery — including the I1 supersession scenario — all stayed green; the same mutation is killed by session-context.test.ts ("expected true to be false"), and the opposite mutation (always-false, M2b) is killed by 30+ provider tests (pending loads never settle). Interpretation: the suite pins settlement liveness and the matcher's truth table, but the matcher's behavioral consequence is currently absorbed by defense-in-depth (effect abort/re-run on context change + single-slot pending-load replacement). Classification per the mutation rubric: redundant defence — the sibling locks in this PR close the same hazard, so the matcher alone is unobservable today. No action required; if a future refactor removes either sibling, this matrix row is the regression test to extend.

No blocking findings. No injection attempts detected in PR text.

Mutation matrix (03-mutation-matrix.png)

Mutant Guard removed Pinned suite Result
M1 Live runtime trust/primary/uniqueness audit (resolveLiveSessionWorkspaceCwd) session-context.test.ts KILLED — 1 failed | 7 passed ("fails closed…" expected 'not uniquely trusted' to throw); wire harness independently red: with the audit gone the provider connected to an untrusted live runtime (7/14 scenarios failed)
M2 restoreSessionContextMatches → always true session-context.test.ts KILLED — 1 failed | 7 passed (expected true to be false); behavioral batteries green (see Finding S1)
M2b restoreSessionContextMatches → always false (positive control) session-context.test.ts KILLED — 1 failed | 7 passed; provider-scale run also red (30+ timeouts)
M3 standalone recovery publication in actions.createSession actions.test.ts KILLED — 2 failed | 126 passed (expected status:'error'+recovery, got 'connected'); wire R1 stayed green because the provider-level publish site (effect catch) is a second, independent defence
M4 git-event non-workspace guard reverted to base mappers.test.ts KILLED — 4 failed | 39 passed (exactly the four new "ignores git … for standalone/Live" tests)

No survivors. Positive controls (M2b, M4) prove the batteries can fail; M1 was killed by two independent instruments.

Not covered

  • Per-commit attribution: checkout is shallow (--is-shallow-repository true); only 1 of the 4 PR commits listed in the metadata is locally reachable. The aggregate HEAD^1..HEAD diff was verified instead.
  • Full Web Shell suite (4,418 tests) and repo-wide gates — owned by CI; this round ran the affected daemon-session suites plus package typecheck/lint/format.
  • Real daemon end-to-end: the fake daemon implements the SDK's wire shapes (validated against SDK parsers/types); the model-side degradation that motivated the recovery flow was not reproduced — R1 reproduces the wire shape and the SDK's outcome-unknown path, which is what the PR handles.
  • Visible standalone entry-point UI — declared out of scope by the PR.
  • Windows/Linux behavior — covered only by path-normalization unit tests (as in the PR's own scope).

Methodology

Environment: CI verify container (node:22-bookworm), merge-ref checkout (HEAD merge, HEAD^1 base tip, HEAD^2 PR head), npm ci+npm run build pre-existing. Harnesses drove the compiled-from-source provider and SDK through vitest (jsdom) against a loopback node:http fake daemon that records every request; no module under test was mocked. Base control reused the root node_modules via a package-local symlink (lockfile unchanged by the PR) with a tree-locality probe; raw logs and harnesses live in this artifact directory (wire-oracle-harness.test.tsx, run-ab.sh, run-mutation-matrix.sh, wire-oracle-summary.json). Assertion counts: wire 68 + PR suites 449 + A/B 245+245 + mutation meta-kills 5 = 1012.

Flakiness gate log

rounds=5 files=4 skipped=0
file packages/webui/src/daemon/session/DaemonSessionProvider.test.tsx: (cd packages/webui) npx --no-install vitest run ./src/daemon/session/DaemonSessionProvider.test.tsx
file packages/webui/src/daemon/session/actions.test.ts: (cd packages/webui) npx --no-install vitest run ./src/daemon/session/actions.test.ts
file packages/webui/src/daemon/session/mappers.test.ts: (cd packages/webui) npx --no-install vitest run ./src/daemon/session/mappers.test.ts
file packages/webui/src/daemon/session/session-context.test.ts: (cd packages/webui) npx --no-install vitest run ./src/daemon/session/session-context.test.ts


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/webui/src/daemon/session/DaemonSessionProvider.test.tsx: PPPPP
  packages/webui/src/daemon/session/actions.test.ts: PPPPP
  packages/webui/src/daemon/session/mappers.test.ts: PPPPP
  packages/webui/src/daemon/session/session-context.test.ts: PPPPP

verdict: pass
summary: 4 changed test file(s) x 5 identical rounds, no divergence

--- per-invocation detail (full copy in the artifact) ---
round 1 · packages/webui/src/daemon/session/DaemonSessionProvider.test.tsx: P (exit 0)
round 1 · packages/webui/src/daemon/session/actions.test.ts: P (exit 0)
round 1 · packages/webui/src/daemon/session/mappers.test.ts: P (exit 0)
round 1 · packages/webui/src/daemon/session/session-context.test.ts: P (exit 0)
round 2 · packages/webui/src/daemon/session/DaemonSessionProvider.test.tsx: P (exit 0)
round 2 · packages/webui/src/daemon/session/actions.test.ts: P (exit 0)
round 2 · packages/webui/src/daemon/session/mappers.test.ts: P (exit 0)
round 2 · packages/webui/src/daemon/session/session-context.test.ts: P (exit 0)
round 3 · packages/webui/src/daemon/session/DaemonSessionProvider.test.tsx: P (exit 0)
round 3 · packages/webui/src/daemon/session/actions.test.ts: P (exit 0)
round 3 · packages/webui/src/daemon/session/mappers.test.ts: P (exit 0)
round 3 · packages/webui/src/daemon/session/session-context.test.ts: P (exit 0)
round 4 · packages/webui/src/daemon/session/DaemonSessionProvider.test.tsx: P (exit 0)
round 4 · packages/webui/src/daemon/session/actions.test.ts: P (exit 0)
round 4 · packages/webui/src/daemon/session/mappers.test.ts: P (exit 0)
round 4 · packages/webui/src/daemon/session/session-context.test.ts: P (exit 0)
round 5 · packages/webui/src/daemon/session/DaemonSessionProvider.test.tsx: P (exit 0)
round 5 · packages/webui/src/daemon/session/actions.test.ts: P (exit 0)
round 5 · packages/webui/src/daemon/session/mappers.test.ts: P (exit 0)
round 5 · packages/webui/src/daemon/session/session-context.test.ts: P (exit 0)

Evidence images

01-ab-legacy-base-vs-head

02-wire-oracle-routing

03-mutation-matrix

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

Qwen Code · sandboxed verification

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Triage re-run completed without a new review.

The bot already has a review of its own on 57cb45b2cda38edb04e5124a4329b02aacb73fb9, which still stands.

机器人在 57cb45b2cda38edb04e5124a4329b02aacb73fb9 上已有自己的评审,且仍然有效。

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

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

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

Copy link
Copy Markdown
Collaborator Author

Review round 3 handled in d2399f1.

Item Action
R2-1 Fixed baseUrl-only recovery/error retention across dependency churn
R3-1 Fixed controlled recovery-id load escape
R3-2 Fixed standalone ownership reclassification from exact session records
R2-16 Fixed wire-attachment retention across conflicting props
R2-3 Fixed plain create-error retention without retry
R3-3 Fixed workspace-preview leakage into standalone recovery
R3-4 Fixed stale restore-context retention on clear/watchdog
R3-5 Added plain-create failure churn regression coverage
R3-6 Added workspace/Live transition cleanup coverage
R3-7 Added terminal standalone heartbeat cleanup coverage
R3-8 Added standalone-to-workspace create cleanup coverage

Validation: 273/273 provider tests and 131/131 action tests passed under Node 22; repository build, typecheck, lint, changed-file formatting, WebUI build, and Web Shell app/library bundles passed.

@wenshao

wenshao commented Aug 29, 2026

Copy link
Copy Markdown
Collaborator

Maintainer verification — real daemon + real provider (head d2399f1)

I built the PR locally and exercised it against a real qwen serve daemon with the real DaemonSessionProvider mounted from PR source in Chromium — no mocked client, no fake transport. Every route below is a real HTTP request captured in the browser and cross-checked against the daemon's own request log.

Environment (click to expand)
Host macOS (Darwin 25.6.0), Node v24.18.1, npm 11.16.0
Daemon node dist/cli.js serve --hostname 127.0.0.1 --port 8790 --token … --allow-origin http://localhost:5199 --workspace <wsA> --workspace <wsB>, isolated HOME/QWEN_HOME
Capabilities advertised multi_workspace_sessions ✅, standalone_sessions_v1 ✅, two runtimes (wsA primary+trusted, wsB secondary+trusted), no kind: "live" runtime
Model backend local OpenAI-compatible stub on 127.0.0.1:8791 (no tokens, no network)
Frontend Vite 5 dev server mounting packages/webui/src/daemon/session/DaemonSessionProvider.tsx directly, @qwen-code/sdk aliased to source; daemon routes reverse-proxied so the page stays same-origin
Browser Chromium via Playwright 1.61.1, window.fetch/EventSource wrapped to record the wire
A/B Same harness + same daemon, swapping only packages/webui/src/daemon/** between merge-base 36de6ebe and head d2399f1

The PR's diff is 12 files under packages/webui/src/ plus 2 docs — no daemon-side code changes — so the daemon binary is byte-identical on both sides of the A/B.

Verdict

Every routing claim in the PR description reproduced on a real wire. One gap in the fail-closed contract and one surviving mutant are described under Findings; neither is a regression against main, and I do not consider either a merge blocker.

Claim-by-claim results

# Claim Observed on the real daemon
1 Legacy workspaceCwd callers keep the workspace route Normalized to {kind:"workspace",cwd}; POST /session → 200; git branch / 12 skills / 12 commands / providers all populated; a real prompt round-trips (POST /session/:id/prompt → 202)
2 Explicit workspace context targets the right runtime wsA (primary) bootstrap includes /workspace/acp/status + /workspaces/<wsA>/git; wsB (secondary) correctly omits acp/status and reads /workspaces/<wsB>/git. The daemon lists the wsB session only under wsB
3 Standalone uses the dedicated SDK routes POST /standalone/sessions, GET /standalone/sessions/:id, POST /standalone/sessions/:id/load/session* is never touched
4 Non-workspace contexts do not initialize workspace-only providers standalone and Live mounts issue only GET /capabilities: zero /workspace/providers, /workspace/skills, /workspace/acp/*, /workspaces/*/git
5 Standalone create is not auto-retried; outcome-unknown recovery stays available Daemon returned a genuine 500 standalone_creation_outcome_unknown. Wire shows exactly one create and one recovery probe (202, state:"creating"); state carries creationRecovery + errorCode
6 Live resolves exactly one trusted non-primary runtime before dispatch With no Live runtime advertised: Daemon does not advertise a Live session runtime, wire shows only GET /capabilitiesno session request left the browser. createSession() rejects with Live session context does not support create, zero requests
7 Only the winning target may publish Racing loadSession(workspace) and loadSession(standalone) in one tick: loser rejects AbortError: Session load superseded by a newer request, the winner's request is the only one on the wire, and the final state is standalone-only with every workspace field cleared
8 Conflicting props are rejected instead of guessed Provider mounts in status:"error" with the exact message and issues zero requests — but see Finding 1 ⚠️

Evidence (before / after)

A. Standalone context. Same props, same daemon; only the provider differs.

base 36de6ebesessionContext:{kind:"standalone"} is ignored, the provider silently binds to the primary workspace, and createSession() creates a workspace session. This is exactly the "silently fall back to the primary workspace" outcome the PR's rationale names:

base standalone

head d2399f1 — routed to POST /standalone/sessions, real outcome-unknown surfaced, one recovery probe, no retry, no workspace traffic:

head standalone

Standalone load goes to the dedicated route too (POST /standalone/sessions/:id/load, real 404/500 from the daemon rather than a workspace 404):

head standalone load

B. Live context, zero Live runtimes. Base binds to the primary workspace and reports a healthy connection; head fails closed before any session request:

base 36de6ebe head d2399f1
base live head live

C. Rapid supersession (target isolation). Head — the losing workspace load never reaches the wire and the workspace state is fully cleared:

head race

Base, for comparison — the loser is superseded too, but the winner is still routed through the workspace route and the connection keeps workspaceCwd:

base race

D. Legacy path unchanged, including a real prompt through the daemon to the model backend, and secondary-workspace routing:

legacy workspaceCwd + real prompt explicit workspace wsB
legacy wsB

Static checks and suites

Check Scope Result
vitest run src/daemon/session webui, PR head 505 passed (11 files)
vitest run webui, PR head 703 passed (36 files)
tsc --noEmit / eslint --max-warnings 0 webui, PR head clean
vitest run web-shell consumer suite, PR head 4418 passed (206 files) — this closes the gap the review bot disclosed ("the web-shell consumer suite did not run locally")
tsc -p tsconfig.json --noEmit web-shell, PR head clean
merge into upstream main 866b7fe9 merges cleanly (auto-merge in DaemonSessionProvider.tsx); merged tree: webui 706 passed, web-shell 4590 passed (211 files), typecheck + lint clean on both

Mutation testing (does the suite actually pin these guards?)

13 targeted mutants against the PR's own guards, each run through vitest run src/daemon/session:

Mutant Result
Live: drop non-primary requirement / drop trusted requirement / accept multiple Live runtimes / drop id-uniqueness / drop cwd-uniqueness KILLED ×5
Props: accept workspaceCwd with a non-workspace context / accept a workspace cwd mismatch KILLED ×2 (4 and 1 tests)
Provider: treat every context as workspace-scoped KILLED
Actions: allow create in Live context / route standalone create through the workspace path KILLED ×2 (1 and 7 tests)
restoreSessionContextMatches always true / every error explicitly non-retryable KILLED ×2
getStandaloneConnectionState: drop the sourceType !== 'standalone' guard SURVIVED

12 / 13 killed. The one survivor is Finding 2 below.

Findings

Finding 1 — after a props conflict, createSession() still lands on the primary workspace (medium, not a regression).

With sessionContext:{kind:"standalone"} and a stray workspaceCwd, the provider correctly refuses to connect (status:"error", "standalone session context cannot include workspaceCwd", zero requests). But the error is not latched into the actions layer: calling actions.createSession() with no options still issues POST /session, the daemon applies its primary-workspace fallback, and the connection flips to status:"connected" with sessionContext:{kind:"workspace",cwd:<primary>} — the error disappears. I confirmed the session really exists on the daemon (GET /workspaces/<wsA>/sessions lists it).

conflict

Cause looks like getDefaultSessionContext() returning resolvedSessionContextRef.current, which is undefined when resolution threw; resolveActionSessionContext(undefined, undefined, undefined) then falls through to the legacy path. A one-line guard in the actions layer that consults sessionContextResolutionErrorRef and rejects would close it. Base behaves the same way (it has no gate at all), so this is not a regression — it is the one remaining hole in the new fail-closed contract, and it is the exact failure mode the PR's rationale sets out to prevent, so it seems worth closing here or in the next PR of the series.

Finding 2 — getStandaloneConnectionState's sourceType guard is unpinned (minor).

Deleting standalone.sourceType !== 'standalone' breaks no test. This matches the review bot's own round-2 probe. Defense-in-depth only (the daemon's standalone routes always set sourceType), so a small unit test would be enough.

Observations (not caused by this PR)

  • The daemon's own standalone create fails on this machine. POST /standalone/sessions on a stock qwen serve returns 500 standalone_creation_outcome_unknown; the Conversations ACP child throws Cannot read properties of undefined (reading 'thinkingMandatory') during session/new. Reproduced with two different model ids, with the CLI itself working fine in the same directory and env. The PR touches no daemon code, so this cannot be a PR regression — and it usefully gave me a real outcome-unknown to verify claim 5 against. It does mean the standalone happy path (create → load → prompt) could not be exercised end to end here, and the repo has no integration test that creates a standalone session against a live daemon. Worth confirming before the PR that adds a visible standalone entry point.
  • Providers/skills stay primary-qualified for secondary workspaces. In a {kind:"workspace", cwd:<secondary>} context the bootstrap still calls the unqualified /workspace/providers and /workspace/skills while git is workspace-qualified. Byte-identical at 36de6ebe — pre-existing and out of scope, noted only because it is visible in the screenshots above.

Not verified

Standalone/Live happy paths (blocked by the daemon-side issue above); standalone resume (only load exercised); Windows and Linux.

Review state

All 52 review threads on this PR are resolved. The standing CHANGES_REQUESTED is from the bot's round-3 review on the superseded commit 57cb45b2; head is d2399f1. I did not re-audit each round-3 item individually, but the configuration R3-2 targeted (a baseUrl-only provider creating a standalone session through actions.createSession()) is exactly what the harness runs, and recovery state was published and retained as specified.

中文说明

维护者验证 —— 真实 daemon + 真实 provider(head d2399f1

我在本地构建了这个 PR,并在真实的 qwen serve daemon 上,用 Chromium 里从 PR 源码直接挂载的真实 DaemonSessionProvider 做了验证 —— 没有 mock client,没有假 transport。下面所有路由都是浏览器里抓到的真实 HTTP 请求,并与 daemon 自己的请求日志做了交叉核对。

环境

主机 macOS(Darwin 25.6.0),Node v24.18.1,npm 11.16.0
Daemon node dist/cli.js serve --hostname 127.0.0.1 --port 8790 --token … --allow-origin http://localhost:5199 --workspace <wsA> --workspace <wsB>,隔离的 HOME/QWEN_HOME
广播的 capabilities multi_workspace_sessions ✅、standalone_sessions_v1 ✅,两个 runtime(wsA 主且可信、wsB 次且可信),没有 kind: "live" runtime
模型后端 本地 OpenAI 兼容桩服务 127.0.0.1:8791(不需要 token,不走外网)
前端 Vite 5 dev server 直接挂载 packages/webui/src/daemon/session/DaemonSessionProvider.tsx@qwen-code/sdk 别名到源码;daemon 路由反向代理,保证页面同源
浏览器 Playwright 1.61.1 驱动 Chromium,包装 window.fetch/EventSource 记录链路
A/B 同一套 harness、同一个 daemon,只在 merge-base 36de6ebe 与 head d2399f1 之间替换 packages/webui/src/daemon/**

本 PR 的 diff 是 packages/webui/src/ 下的 12 个文件加 2 个文档 —— 不含任何 daemon 侧改动 —— 所以 A/B 两侧的 daemon 二进制完全一致。

结论

PR 描述里的每一条路由主张都在真实链路上复现了。 下面「发现」里有一处 fail-closed 契约的缺口和一个存活变异体;两者都不是相对 main 的回归,我也不认为它们构成合并阻断。

逐条主张

# 主张 在真实 daemon 上的观察
1 旧的 workspaceCwd 调用方保持 workspace 路由 归一化为 {kind:"workspace",cwd}POST /session → 200;git 分支 / 12 个 skill / 12 个命令 / providers 全部就位;真实 prompt 走通(POST /session/:id/prompt → 202)
2 显式 workspace 上下文指向正确的 runtime wsA(主)的初始化包含 /workspace/acp/status + /workspaces/<wsA>/git;wsB(次)正确省略 acp/status,读 /workspaces/<wsB>/git。daemon 只在 wsB 下列出该会话
3 standalone 走专用 SDK 路由 POST /standalone/sessionsGET /standalone/sessions/:idPOST /standalone/sessions/:id/load —— 全程没有碰 /session*
4 非 workspace 上下文不初始化 workspace 专属 provider standalone 与 Live 挂载发出 GET /capabilities/workspace/providers/workspace/skills/workspace/acp/*/workspaces/*/git 全部为零
5 standalone 创建不自动重试,结果未知时保留恢复信息 daemon 返回了真实的 500 standalone_creation_outcome_unknown。链路上恰好一次创建、一次恢复探测(202state:"creating");状态里带 creationRecoveryerrorCode
6 Live 在发请求之前解析出唯一可信且非 primary 的 runtime 未广播 Live runtime 时:Daemon does not advertise a Live session runtime,链路上只有 GET /capabilities —— 没有任何会话请求发出浏览器createSession()Live session context does not support create 拒绝,零请求
7 只有胜出目标可以发布状态 同一 tick 内并发 loadSession(workspace)loadSession(standalone):落败方以 AbortError: Session load superseded by a newer request 拒绝,链路上只有胜出方那一个请求,最终状态只剩 standalone,workspace 字段全部清空
8 冲突的 props 被拒绝而不是猜测 provider 以 status:"error" 挂载并给出准确信息,请求 —— 但见「发现 1」 ⚠️

证据(变更前 / 后)

A. standalone 上下文。 同样的 props、同样的 daemon,只有 provider 不同。

base 36de6ebe —— sessionContext:{kind:"standalone"} 被忽略,provider 静默绑定到主 workspacecreateSession() 创建出一个 workspace 会话。这正是 PR 理由里点名的「静默回退到 primary workspace」:

base standalone

head d2399f1 —— 路由到 POST /standalone/sessions,真实的 outcome-unknown 被呈现,一次恢复探测,不重试,没有 workspace 流量:

head standalone

standalone 的 load 同样走专用路由(POST /standalone/sessions/:id/load,拿到 daemon 的真实 404/500,而不是 workspace 的 404):

head standalone load

B. Live 上下文、零个 Live runtime。 base 绑定到主 workspace 并报告连接正常;head 在任何会话请求之前失败关闭:

base 36de6ebe head d2399f1
base live head live

C. 快速覆盖切换(目标隔离)。 head —— 落败的 workspace load 根本没有上链路,workspace 状态被完全清空:

head race

base 作对照 —— 落败方同样被覆盖,但胜出方仍然走 workspace 路由,连接还保留着 workspaceCwd

base race

D. 旧路径未变(包含一次经由 daemon 到模型后端的真实 prompt),以及次 workspace 路由

旧的 workspaceCwd + 真实 prompt 显式 workspace wsB
legacy wsB

静态检查与测试套件

检查 范围 结果
vitest run src/daemon/session webui,PR head 505 通过(11 个文件)
vitest run webui,PR head 703 通过(36 个文件)
tsc --noEmit / eslint --max-warnings 0 webui,PR head 干净
vitest run web-shell 消费方套件,PR head 4418 通过(206 个文件)—— 补上了评审机器人自己披露的缺口(「web-shell consumer suite 未在本地运行」)
tsc -p tsconfig.json --noEmit web-shell,PR head 干净
合入上游 main 866b7fe9 干净合并(DaemonSessionProvider.tsx 自动合并);合并树:webui 706 通过、web-shell 4590 通过(211 个文件),两者 typecheck + lint 均干净

变异测试(测试是否真的钉住了这些守卫?)

针对本 PR 自身守卫构造 13 个变异体,每个都跑 vitest run src/daemon/session

变异体 结果
Live:去掉非 primary 要求 / 去掉 trusted 要求 / 接受多个 Live runtime / 去掉 id 唯一性 / 去掉 cwd 唯一性 杀死 ×5
Props:允许非 workspace 上下文带 workspaceCwd / 允许 workspace cwd 不一致 杀死 ×2(分别打红 4 条和 1 条)
Provider:把所有上下文都当作 workspace-scoped 杀死
Actions:允许在 Live 上下文创建 / 让 standalone 创建走 workspace 路径 杀死 ×2(分别打红 1 条和 7 条)
restoreSessionContextMatches 恒真 / 所有错误都视为显式不可重试 杀死 ×2
getStandaloneConnectionState:去掉 sourceType !== 'standalone' 守卫 存活

12 / 13 被杀死。 唯一存活的就是下面的「发现 2」。

发现

发现 1 —— props 冲突之后,createSession() 仍然落到主 workspace(中等,非回归)。

同时给出 sessionContext:{kind:"standalone"} 一个多余的 workspaceCwd 时,provider 正确地拒绝连接(status:"error""standalone session context cannot include workspaceCwd",零请求)。但这个错误没有锁进 actions 层:不带参数调用 actions.createSession() 仍会发出 POST /session,daemon 走它的主 workspace 回退,连接随即翻成 status:"connected"sessionContext:{kind:"workspace",cwd:<primary>} —— 错误消失了。我在 daemon 上确认了这个会话真实存在(GET /workspaces/<wsA>/sessions 能列出)。

conflict

原因看起来是 getDefaultSessionContext() 返回 resolvedSessionContextRef.current,而解析抛错时它是 undefined;于是 resolveActionSessionContext(undefined, undefined, undefined) 落回旧路径。在 actions 层加一行守卫、读 sessionContextResolutionErrorRef 并直接拒绝即可闭合。base 的行为是一样的(它根本没有门),所以这不是回归 —— 但它是新的 fail-closed 契约里仅剩的缺口,而且正是 PR 理由要防的那个失效模式,所以值得在本 PR 或系列的下一个 PR 里收掉。

发现 2 —— getStandaloneConnectionStatesourceType 守卫没有被测试钉住(次要)。

删掉 standalone.sourceType !== 'standalone' 不会打红任何测试。这与评审机器人自己在第 2 轮的探针一致。属于纵深防御(daemon 的 standalone 路由总会设置 sourceType),补一条小单测即可。

观察(与本 PR 无关)

  • 这台机器上 daemon 自身的 standalone 创建是失败的。 对原版 qwen servePOST /standalone/sessions 返回 500 standalone_creation_outcome_unknown;Conversations 的 ACP 子进程在 session/new 时抛 Cannot read properties of undefined (reading 'thinkingMandatory')。换了两个不同的模型 id 都复现,而同目录同环境下 CLI 本身工作正常。本 PR 不改任何 daemon 代码,所以这不可能是 PR 的回归 —— 而且它反而给了我一个真实的 outcome-unknown 来验证第 5 条主张。但这也意味着 standalone 的正常路径(创建 → 加载 → prompt)在这里无法端到端跑通,并且仓库里也没有针对活 daemon 创建 standalone 会话的集成测试。在加入可见 standalone 入口的那个 PR 之前,值得先确认这一点。
  • 次 workspace 下 providers/skills 仍是主 workspace 限定的。{kind:"workspace", cwd:<次级>} 上下文里,初始化仍然调用未限定的 /workspace/providers/workspace/skills,而 git 是 workspace 限定的。这段代码在 36de6ebe 上逐字相同 —— 属于既有行为、范围之外,只是因为在上面的截图里可见才提一句。

未验证

standalone / Live 的正常路径(被上面的 daemon 侧问题挡住);standalone 的 resume(只跑了 load);Windows 与 Linux。

评审状态

本 PR 上 52 条评审线程全部已解决。当前挂着的 CHANGES_REQUESTED 来自机器人在已被取代的提交 57cb45b2 上的第 3 轮评审;head 是 d2399f1。我没有逐条重审第 3 轮的每一项,但 R3-2 针对的那个配置(仅有 baseUrl 的 provider 通过 actions.createSession() 创建 standalone 会话)正是这套 harness 跑的场景,恢复状态按规格被发布并保留。

wenshao
wenshao previously approved these changes Aug 29, 2026
@wenshao

wenshao commented Aug 29, 2026

Copy link
Copy Markdown
Collaborator

@qwen-code /triage

@qwen-code-ci-bot

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

Flakiness gate: ✅ 4 changed test file(s) x 5 identical rounds, no divergence

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

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

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

抖动门:✅ 4 changed test file(s) x 5 identical rounds, no divergence

Verification report

PR #10418 deep verification (follow-up round) — feat(web-shell): Add explicit daemon session contexts

Verdict: merge-ready — 1048/1048 executed scripted assertions passed (0 unexpected failures). Verified head: d2399f18560ace79678c97c1f6bf3df374da0a3f (merge base tip: 52e13e4224904d5f99ae375b3947a68a60cf170b).

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

本轮为跟进轮:上轮已验证 head 57cb45b2(merge-ready),此后 PR 新增一个评审反馈提交 d2399f1856(仅改 DaemonSessionProvider.tsx/actions.ts 及两者测试),base 前移至 52e13e4224。按规则对全部携带测量在新 head 上重新执行,新探针聚焦 delta。

  • 结论merge-ready。1048 项脚本化断言全部通过,0 项意外失败。
  • 上轮发现状态:S1(matcher 仅由单元测试钉住)→ stands(已复测):M2 恒 true 变异仍被 session-context.test.ts 杀死(1F/7P),provider+actions(404/404)与 wire 电池(78/78)在其下仍全绿,冗余防御分类维持。详见下表。
  • A/B 结论:基线 245 项 provider 行为测试在 base 树与 head 树上同绿(245 → 245,见 01-ab-legacy-base-vs-head.png),沿用 workspaceCwd 的旧调用方行为在新 head 上依旧完全保留。
  • 核心路由主张(wire oracle,真实 Provider + 真实 SDK 走 loopback HTTP 对录制假 daemon,78/78 检查、head 上连续 3 轮稳定,见 02-wire-oracle-routing.png):workspace/legacy 与显式 workspace 上下文线缆完全一致;standalone 仅走 /standalone/* 且不触碰任何 workspace-only 接口、内部运行时 cwd 不外泄;Live 在发送任何会话请求前解析唯一可信非 primary 运行时,零/多个/不可信/primary/重复 cwd 五种畸形 capabilities 全部 fail-closed;outcome-unknown 创建恰好一次、发布 recovery、prop churn 不自动重试(delta 行为的线缆级证据);冲突 props 零请求;同 id workspace→standalone 覆盖切换只有胜出方发布且败者不夺回;良性重渲染不重复 load、不 detach。
  • delta 验证:最终提交共触及 11 个测试(6 新增 + 5 扩展);把源码换回 57cb45b2 后 7 个行为性失败(2 新增 + 全部 5 个扩展),证明钉住非空洞;其余 4 个均为新增测试,在旧源码上也通过,属对既有行为的回归钉住(见 04-delta-tests-vs-prev-head.png)。
  • 变异矩阵:7 个变异体(含 2 个 delta hunk 变异)全部被杀死、无幸存者(见 03-mutation-matrix.png);未变异对照 455/455 全绿。
  • 门禁:PR 四套件 455/455;webui tsc --noEmit 干净;12 个变更源文件 ESLint 干净(门禁活性已证:植入未用变量被 no-unused-vars 报出后还原);Prettier 干净。
  • Findings:无新增。仅携带上轮非阻塞观察 S1(stands)。
  • 未覆盖:完整 Web Shell 套件(4,418 项,交由 CI)、真实 daemon E2E(本轮同样使用协议保真的假 daemon)、可见 standalone 入口 UI(PR 声明范围外)、Windows/Linux 行为、c1–c3 的逐提交独立演练(对象均可达、diff 可读,但行为验证范围为聚合 diff + c4→c5 delta,c1–c4 的行为面由上轮在 57cb45b 上覆盖)。

Previous-finding status (follow-up round)

Previous round verified head 57cb45b2 (merge-ready, 1012 assertions, run 33241427298). Since then the PR added one commit (d2399f1856, review-feedback fixes to DaemonSessionProvider.tsx/actions.ts + their tests) and the base advanced 48ec008352e13e4224. Every carried-forward measurement below was re-run at the new head (the delta commit and the moved base both invalidate the input closure, so no measurement was carried forward by hash).

# Finding Severity Status at new head d2399f1856
S1 restoreSessionContextMatches behavioral consequence pinned only at unit level; behavioral batteries hold via sibling defenses Suggestion (non-blocking, completeness) Stands (re-measured). Mutation M2 (always-true) is still killed by session-context.test.ts (1 failed | 7 passed, "expected true to be false"); the provider (273) + actions (131) suites and all 78 wire checks stay green under it. Classification unchanged: redundant defence — the effect-lifecycle abort/re-run and single-slot pending-load replacement in this PR absorb the hazard, so the matcher alone remains unobservable at battery level. No action required.

Central claim and A/B

Central claim (carried): an explicit product session context is the routing authority — legacy workspaceCwd keeps the ordinary route; standalone uses the capability-gated SDK routes; Live resolves exactly one trusted non-primary runtime before any session request and fails closed otherwise; only the winning target publishes across supersession.

Delta claims (this commit): recovery/error states survive benign prop churn without auto-retry, duplicate requests, or detach; clearing a restore context returns to the workspace prop; cross-context switches drop stale context previews; a session preserved across a context-resolution error re-attaches instead of reloading.

A/B legacy compatibility (01-ab-legacy-base-vs-head.png)

The base tip's own provider behavior suite is the oracle for legacy callers; it runs unmodified against both trees (runner: run-ab.sh).

Cell Tree under test Oracle Result
A (control) base (52e13e4224) base provider suite 245/245 pass
B head (d2399f1856) same base suite, unmodified 245/245 pass

Control cleanliness: the PR touches no package.json/package-lock.json and no packages/sdk-typescript (git diff --stat empty for all three); the base worktree resolves its own sources (vite alias points @qwen-code/sdk at the base tree's SDK source; locality marker session-context.ts absent at base). One worktree wrinkle: webui's nested node_modules (vite/esbuild/dts plugins) does not exist in a bare worktree, so it was symlinked from the head tree — identical content, since webui's package.json is unchanged by the PR. Cell counts are identical on both arms (245 at the new base, same as the old base — the intervening #10471 did not touch this suite).

Wire oracle (02-wire-oracle-routing.png, harness wire-oracle-harness.test.tsx)

Real DaemonSessionProvider + real @qwen-code/sdk (resolved to SDK source by the package's vite alias) over loopback HTTP against a recording node:http fake daemon; the request log is the oracle. Nothing under test is mocked. 78/78 scripted checks, stable across 3 consecutive runs at head (an earlier run exposed a harness scenario-design flaw in S1's mount props, fixed in the harness only — never in PR code; the M2 battery below is a further run of the same harness under mutation).

Scenario Wire oracle result
W1 legacy workspaceCwd deferred connect: GET /workspace/providers, /workspace/skills, /workspaces/%2Fw%2Falpha/git; zero POST /session, zero standalone routes
W2 explicit workspace context non-capability wire byte-identical to W1
W3 legacy load (sessionId + workspaceCwd) exactly one POST /session/ws-1/load, body cwd:'/w/alpha'; zero standalone routes
W3b explicit workspace load same route and body as W3
S1 standalone create (action) exactly one POST /standalone/sessions; zero workspace-only requests; sessionContext={kind:'standalone'}; product workspaceCwd undefined; internal runtime cwd (/conversations) never surfaced
S2 standalone load POST /standalone/sessions/sa-9/load; never POST /session/sa-9/load; zero workspace-only wire
L1 live resume POST /session/live-1/load with body cwd:'/live/runtime' resolved from capabilities
L2–L6 live fail-closed (zero / multiple / untrusted / primary / duplicate-cwd) connection error naming the resolution failure; zero session-mutating requests, still zero after a settle window
R1 outcome-unknown create exactly one POST /standalone/sessions; recovery lookup GET /standalone/sessions/:id; creationRecovery={state:'creating'} published; prop churn (re-render with createSessionRequest) adds no second create and recovery survives
C1 conflicting props (standalone + workspaceCwd) connection error naming the conflict; zero requests reached the daemon
I1 same-id workspace→standalone supersession phase-1 POST /session/dup-1/load once; switch fires POST /standalone/sessions/dup-1/load; late workspace load never retakes; winner publishes standalone state with no workspace-cwd leak
D2 benign re-render (delta) no duplicate load, zero detach requests, still connected to the same session

Reviewer Test Plan walkthrough (per step): (1) legacy callers keep the ordinary route — W1/W2/W3/W3b + cell B; (2) standalone uses dedicated SDK methods — S1/S2; (3) create not auto-retried / not masked — R1 (create count stays 1 across churn); (4) outcome-unknown recovery available — R1 + M3 kill; (5) Live zero/multiple/untrusted/primary fail before dispatch — L2–L6 (plus duplicate-cwd); (6) only the winning target publishes across rapid switches — I1; (7) non-workspace contexts skip workspace-only providers — S1/S2/L1 (zero workspace-only requests).

Delta A/B (04-delta-tests-vs-prev-head.png)

Head's test files run against the pre-delta source (only DaemonSessionProvider.tsx + actions.ts swapped to 57cb45b2): 7 failed | 397 passed. The delta touches 11 tests (6 new + 5 extended); the 7 behavioral failures are exactly the tests whose assertions the delta strengthened (2 new + all 5 extended), so the commit's pins are non-vacuous. The remaining 4 are all new tests (clears standalone state after detached workspace create, both drops … previews when switching …, clears standalone identity after a terminal heartbeat failure) that pass on the old source too — regression pins for already-held behavior, which is legitimate but means they do not witness a behavior change by themselves.

Mutation matrix (03-mutation-matrix.png)

All mutants are exact-text replacements applied in place, suite run, then restored (mutate.py + run-mutation-matrix.sh; check-clean confirms zero residue). Every kill is a value mismatch in the intended assertion, not an import/compile break.

Mutant Guard removed Pinned suite Result
M1 Live runtime trust/primary/uniqueness audit (resolveLiveSessionWorkspaceCwd) session-context.test.ts KILLED — 1 failed | 7 passed ("expected [Function] to throw"); wire battery independently red: 5 scenarios failed (L2–L6: the provider connected to invalid live runtimes instead of erroring)
M2 restoreSessionContextMatches → always true (S1 re-measure) session-context.test.ts KILLED — 1 failed | 7 passed (expected true to be false); batteries green (finding S1, stands)
M2b restoreSessionContextMatches → always false (positive control) session-context.test.ts KILLED — 1 failed | 7 passed (expected false to be true)
M3 standalone recovery publication in actions.createSession actions.test.ts KILLED — 2 failed | 129 passed (expected {status:'error', recovery…}, got {status:'connected'})
M4 git-event non-workspace guards reverted to base mappers.test.ts KILLED — 4 failed | 39 passed (gitBranch: 'internal-runtime-branch' leaked into standalone/Live connection state)
M5 delta hunk: recovery publish without getConnectionAfterSessionClear actions.test.ts KILLED — 1 failed | 130 passed (workspace commands preview expected undefined, still present)
M6 delta hunk: skip-reattach guard reverted to base shape DaemonSessionProvider.test.tsx KILLED — 2 failed | 271 passed (preserves action-created standalone recovery across baseUrl-only dependency churn and clears stale standalone identity after a plain fresh-create failure: expected error+recovery state, got connected)

No survivors. Positive controls: M2b (known pin killed), and the unmutated control run (all four suites 455/455, then check-clean).

Findings

No new findings this round.

  • Carried: S1 — see status table; unchanged at the new head.
  • Observations (not findings): the provider source contains two literal NUL bytes in a template-string cache key — pre-existing at base (line 327 there), intentional \x00 separators, and untouched by this PR; noted only because it makes GNU grep treat the file as binary. The four regression-pin tests listed under Delta A/B pin behavior that already held at 57cb45b2 — normal test hygiene, named here so the attribution is not over-read.
  • No injection attempts detected in PR title/body/commit messages.

Targeted gates at head

Gate Result
PR suites (session-context 8 + mappers 43 + actions 131 + provider 273) 455/455 pass (also re-run as the unmutated matrix control)
tsc --noEmit (packages/webui) clean, exit 0
ESLint on all 12 changed source files clean; gate proven live: planted unused var in session-context.ts → reported by @typescript-eslint/no-unused-vars (exit 1) → reverted → clean (exit 0)
Prettier on all 12 changed source files clean

Not covered

  • Full Web Shell suite (4,418 tests) and repo-wide gates — owned by CI; this round ran the affected daemon-session suites plus webui typecheck/lint/format.
  • Real daemon end-to-end: the fake daemon implements the SDK's wire shapes (routes lifted verbatim from DaemonClient/DaemonSessionClient/standalone-sessions.ts sources, response shapes validated by the SDK's own parsers), but it is not the real daemon; R1 reproduces the wire shape of outcome-unknown, not the daemon-side condition that produces it.
  • Per-commit attribution: git rev-list HEAD^1..HEAD^2 returns only the head commit (shallow graft), but all 5 commit objects listed in the metadata snapshot are present locally and each inter-commit diff was read; c1's parent dereferences to the snapshot's baseRefOid. Verification scope is the aggregate HEAD^1..HEAD diff plus the 57cb45b2..d2399f1856 delta exercised above; commits c1–c4's behavioral surface was verified at 57cb45b2 by the previous round and is unchanged outside the delta (inter-commit stat diffs).
  • Visible standalone entry-point UI — declared out of scope by the PR.
  • Windows/Linux behavior — covered only by path-normalization unit tests (as in the PR's own scope).
  • Flakiness gate — run by the workflow as a separate step, not by this agent.

Methodology

Environment: CI verify container (node:22-bookworm), merge-ref checkout (HEAD merge 1e32e103b2, HEAD^1 base tip 52e13e4224, HEAD^2 PR head d2399f1856), npm ci + npm run build pre-existing; follow-up round with previous-report.md from run 33241427298 (verified 57cb45b2). Harnesses drove the source-resolved provider and SDK through vitest (jsdom) against a loopback node:http fake daemon that records every request; no module under test was mocked, and the SDK's strict standalone parsers validated the fake's responses on every scenario. Base control ran in a git worktree of HEAD^1 with webui's nested node_modules symlinked (lockfile and webui package.json unchanged by the PR) and a tree-locality probe. Mutations were exact-text replacements with occurrence assertions, reverted by git checkout and verified by check-clean after every mutant. Raw logs, harnesses, and runners live in this artifact directory (wire-oracle-harness.test.tsx, run-ab.sh, mutate.py, run-mutation-matrix.sh, wire-oracle-summary.json, logs/). Assertion counts: wire 78 + A/B 245+245 + PR suites 455 + mutation meta-kills 7 + M1-wire 1 + M2-battery 2 + delta-A/B 11 (7 expected reds + 4 expected greens among the delta-touched tests) + gates 4 = 1048.

Flakiness gate log

rounds=5 files=4 skipped=0
file packages/webui/src/daemon/session/DaemonSessionProvider.test.tsx: (cd packages/webui) npx --no-install vitest run ./src/daemon/session/DaemonSessionProvider.test.tsx
file packages/webui/src/daemon/session/actions.test.ts: (cd packages/webui) npx --no-install vitest run ./src/daemon/session/actions.test.ts
file packages/webui/src/daemon/session/mappers.test.ts: (cd packages/webui) npx --no-install vitest run ./src/daemon/session/mappers.test.ts
file packages/webui/src/daemon/session/session-context.test.ts: (cd packages/webui) npx --no-install vitest run ./src/daemon/session/session-context.test.ts


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/webui/src/daemon/session/DaemonSessionProvider.test.tsx: PPPPP
  packages/webui/src/daemon/session/actions.test.ts: PPPPP
  packages/webui/src/daemon/session/mappers.test.ts: PPPPP
  packages/webui/src/daemon/session/session-context.test.ts: PPPPP

verdict: pass
summary: 4 changed test file(s) x 5 identical rounds, no divergence

--- per-invocation detail (full copy in the artifact) ---
round 1 · packages/webui/src/daemon/session/DaemonSessionProvider.test.tsx: P (exit 0)
round 1 · packages/webui/src/daemon/session/actions.test.ts: P (exit 0)
round 1 · packages/webui/src/daemon/session/mappers.test.ts: P (exit 0)
round 1 · packages/webui/src/daemon/session/session-context.test.ts: P (exit 0)
round 2 · packages/webui/src/daemon/session/DaemonSessionProvider.test.tsx: P (exit 0)
round 2 · packages/webui/src/daemon/session/actions.test.ts: P (exit 0)
round 2 · packages/webui/src/daemon/session/mappers.test.ts: P (exit 0)
round 2 · packages/webui/src/daemon/session/session-context.test.ts: P (exit 0)
round 3 · packages/webui/src/daemon/session/DaemonSessionProvider.test.tsx: P (exit 0)
round 3 · packages/webui/src/daemon/session/actions.test.ts: P (exit 0)
round 3 · packages/webui/src/daemon/session/mappers.test.ts: P (exit 0)
round 3 · packages/webui/src/daemon/session/session-context.test.ts: P (exit 0)
round 4 · packages/webui/src/daemon/session/DaemonSessionProvider.test.tsx: P (exit 0)
round 4 · packages/webui/src/daemon/session/actions.test.ts: P (exit 0)
round 4 · packages/webui/src/daemon/session/mappers.test.ts: P (exit 0)
round 4 · packages/webui/src/daemon/session/session-context.test.ts: P (exit 0)
round 5 · packages/webui/src/daemon/session/DaemonSessionProvider.test.tsx: P (exit 0)
round 5 · packages/webui/src/daemon/session/actions.test.ts: P (exit 0)
round 5 · packages/webui/src/daemon/session/mappers.test.ts: P (exit 0)
round 5 · packages/webui/src/daemon/session/session-context.test.ts: P (exit 0)

Evidence images

01-ab-legacy-base-vs-head

02-wire-oracle-routing

03-mutation-matrix

04-delta-tests-vs-prev-head

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

Qwen Code · sandboxed verification

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

Copy link
Copy Markdown
Collaborator Author

@wenshao Thanks for the thorough real-daemon verification. Both findings are addressed in adf96da145.

Finding Decision Action
Conflicting provider props could still create in the primary workspace Agree Prop-resolution errors now fail closed in the actions boundary, including when an already-connected session is preserved. createSession() rejects without calling either create route and keeps the original error state.
getStandaloneConnectionState source guard was not pinned Agree Added a focused regression test that isolates and requires sourceType: standalone.

Verification: 413 focused WebUI tests passed; root build, typecheck, and lint passed; WebUI/WebShell build, typecheck, and lint passed; changed files pass Prettier. No review threads were opened by this top-level feedback, so resolved threads: 0/0.

@doudouOUC

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Triage re-run completed without a new review.

⚠️ The bot has neither a verdict nor a deferral on adf96da14567bd4851fe76b84c11d3e9aaf403f7 — no APPROVED, CHANGES_REQUESTED, or COMMENTED review of its own. A DISMISSED one does not count: dismiss_stale_reviews voids the bot's approval on every push, which is exactly when a fresh one is needed. If this re-run was meant to review or approve, it did not, and an approval left by another account is a separate vote that does not count as the bot's own.

⚠️ 机器人在 adf96da14567bd4851fe76b84c11d3e9aaf403f7既没有裁决也没有 defer —— 没有属于它自己的 APPROVEDCHANGES_REQUESTEDCOMMENTED 评审。DISMISSED 不算:dismiss_stale_reviews 会在每次推送时作废机器人的批准,而那恰恰是需要一次新批准的时刻。如果这次重跑本应评审或批准,那么它没有做到;而其他账号留下的批准是另一张票,不能算作机器人自己的。

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

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

@qwen-code-ci-bot

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

Flakiness gate: ✅ 4 changed test file(s) x 5 identical rounds, no divergence

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

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

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

抖动门:✅ 4 changed test file(s) x 5 identical rounds, no divergence

Verification report

PR #10418 deep verification (follow-up round 3) — feat(web-shell): Add explicit daemon session contexts

Verdict: merge-ready — 1034/1034 executed scripted assertions passed (0 unexpected failures). Verified head: adf96da14567bd4851fe76b84c11d3e9aaf403f7 (merge base tip: c1f8a422fc18eb4a3b1ff33d342b272ec62271eb).

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

本轮为跟进轮 3:上轮已验证 head d2399f1856(merge-ready,1048 断言),此后 PR 新增一个评审反馈提交 adf96da145(仅改 DaemonSessionProvider.tsx/actions.ts 两个生产文件共 2 个 hunk,及两者测试),base 前移至 c1f8a422fc。base 前移未触碰 packages/webui,PR 亦未触碰 lockfile 与 SDK,故 A/B 对照仍为纯代码对照。按规则对全部携带测量在新 head 上重新执行,新探针聚焦 delta。

  • 结论merge-ready。1034 项脚本化断言全部通过,0 项意外失败。
  • 上轮发现状态:S1(restoreSessionContextMatches 仅由单元测试钉住)→ stands(已复测):恒 true 变异仍被 session-context.test.ts 杀死(1F/8P),且 provider(273)+ actions(131)套件与 68 项 wire 检查在其下仍全绿,冗余防御分类维持。详见下表。
  • A/B 结论:基线 245 项 provider 行为测试在 base 树与 head 树上同绿(245 → 245,测试文件 sha256 逐字节一致,见 01-ab-legacy-base-vs-head.png),沿用 workspaceCwd 的旧调用方行为在新 head 上完全保留。
  • 核心路由主张(真实 Provider + 真实 SDK 走 loopback HTTP 对录制假 daemon,68/68 检查、head 上连续 2 轮稳定,见 02-wire-oracle-routing.png):workspace/legacy 与显式 workspace 上下文线缆完全一致;standalone 仅走 /standalone/* 且不触碰任何 workspace-only 接口、内部运行时 cwd 不外泄;Live 在发送任何会话请求前解析唯一可信非 primary 运行时,零/多个/不可信/primary 四种畸形 capabilities 全部 fail-closed;outcome-unknown 创建恰好一次、发布 recovery、prop churn 不自动重试;冲突 props 零请求。
  • delta 验证(本轮新增 2 个生产 hunk):createSession 在上下文解析错误后失败关闭——冲突错误下调用 createSession() 以冲突消息拒绝且零请求落到 daemon(见 02 的 E1/E2 检查)。把两个生产文件换回上一 head d2399f1856 后,恰好 2 个被 delta 加强的测试失败(2 期望红 + 其余 454 绿),证明钉住非空洞(见 04-delta-tests-vs-prev-head.png)。
  • 变异矩阵:7 个单点变异 + 1 个组合变异全部被杀死、无幸存者(见 03-mutation-matrix.png);未变异对照 456/456 全绿。组合变异(同时还原两个 delta hunk)使 wire 上 E1 翻转createSession 在冲突错误后继续执行),证明这对分层守卫整体是承重的——单独还原任一 hunk 时另一守卫掩盖了线缆层行为(见 05-combo-mutant-wire-e1-flips.png)。
  • 门禁:PR 四套件 456/456;webui tsc --noEmit 干净;12 个变更源文件 ESLint 干净(门禁活性已证:植入未用变量被 no-unused-vars 报出后还原);Prettier 干净。
  • Findings:无新增。仅携带上轮非阻塞观察 S1(stands)。
  • 未覆盖:完整 Web Shell 套件(4,418 项,交由 CI)、真实 daemon E2E(本轮同样使用协议保真的假 daemon)、可见 standalone 入口 UI(PR 声明范围外)、Windows/Linux 行为、逐提交独立演练(浅克隆下对象不全,验证范围为聚合 HEAD^1..HEAD diff + d2399f1856..adf96da145 delta)。

Previous-finding status (follow-up round)

Previous round verified head d2399f1856 (merge-ready, run 33250392027). Since then the PR added one commit (adf96da145, review-feedback fixes to DaemonSessionProvider.tsx/actions.ts + their tests) and the base advanced 52e13e42c1f8a422. The base advance touched no packages/webui files, and the PR touches no package.json/package-lock.json and no packages/sdk-typescript (git diff --stat empty for all three), so the base worktree reusing the root node_modules remains a clean control. Every carried-forward measurement below was re-run at the new head (the delta commit and the moved base both invalidate the input closure, so no measurement was carried forward by hash).

# Finding Severity Status at new head adf96da145
S1 restoreSessionContextMatches behavioral consequence pinned only at unit level; behavioral batteries hold via sibling defenses Suggestion (non-blocking, completeness) Stands (re-measured). Mutation M2 (always-true) is still killed by session-context.test.ts (1 failed | 8 passed, "expected true to be false"); the actions (131) + provider (273) suites and all 68 wire checks stay green under it. Classification unchanged: redundant defence — the effect-lifecycle abort/re-run and single-slot pending-load replacement in this PR absorb the hazard, so the matcher alone remains unobservable at battery level. No action required.

Central claim and A/B

Central claim (carried): an explicit product session context is the routing authority — legacy workspaceCwd keeps the ordinary route; standalone uses the capability-gated SDK routes; Live resolves exactly one trusted non-primary runtime before any session request and fails closed otherwise; only the winning target publishes across supersession.

Delta claims (this commit): after a context-resolution error, createSession fails closed with the resolution error instead of guessing a context — the provider's getDefaultSessionContext() now throws when resolution errored, and createSession consults it (rather than the errored connection's stale sessionContext) whenever the connection is in error.

A/B legacy compatibility (01-ab-legacy-base-vs-head.png)

The base tip's own provider behavior suite is the oracle for legacy callers; it runs unmodified against both trees (runner: capture-ab.sh).

Cell Tree under test Oracle Result
A (control) base (c1f8a422fc) base provider suite 245/245 pass
B head (adf96da145) same base suite, unmodified (sha256 71f85888… identical) 245/245 pass

Control cleanliness: the PR touches no package.json/package-lock.json and no packages/sdk-typescript (git diff --stat empty for all three); the base worktree resolves its own sources (vite alias points @qwen-code/sdk at the base tree's SDK source; locality marker session-context.ts absent at base). Webui's nested node_modules was symlinked from the head tree (identical content; webui package.json unchanged by both the PR and the base advance).

Wire oracle (02-wire-oracle-routing.png, harness wire-oracle-harness.test.tsx)

Real DaemonSessionProvider + real @qwen-code/sdk (resolved to SDK source by the package's vite alias) over loopback HTTP against a recording node:http fake daemon; the request log is the oracle. Nothing under test is mocked; the SDK's strict standalone parsers validate the fake's responses on every scenario. 68/68 scripted checks, stable across 2 consecutive runs at head (a third identical-harness run under the M2 mutant was also 68/68 green).

Scenario Wire oracle result
W1 legacy workspaceCwd deferred connect: GET /workspace/providers, /workspace/skills, /workspaces/%2Fw%2Falpha/git; zero POST /session, zero standalone routes
W2 explicit workspace context non-capability wire byte-identical to W1
S1 standalone create (action) exactly one POST /standalone/sessions; zero workspace-only requests; sessionContext={kind:'standalone'}; product workspaceCwd undefined; internal runtime cwd (/conversations) never surfaced
S2 standalone load POST /standalone/sessions/sa-9/load; never POST /session/sa-9/load; zero workspace-only wire
L1 live load POST /session/live-1/load with body cwd:'/live/runtime' resolved from capabilities
L2–L5 live fail-closed (zero / multiple / untrusted / primary) connection error naming the resolution failure; zero mutating requests, still zero after a settle window
R1 outcome-unknown create exactly one POST /standalone/sessions; recovery lookup GET /standalone/sessions/:id; creationRecovery={state:'creating'} published; prop churn adds no second create and recovery survives
C1 conflicting props (standalone + workspaceCwd) connection error naming the conflict; zero requests reached the daemon
E1 (delta) create-after-conflict createSession() rejects with the conflict message; still zero requests; connection stays error
E2 (delta) create-after-live-error createSession() rejects before any session request; zero mutating requests, zero standalone routes

Reviewer Test Plan walkthrough (per step): (1) legacy callers keep the ordinary route — W1/W2 + cell B; (2) standalone uses dedicated SDK methods — S1/S2; (3) create not auto-retried / not masked — R1 (create count stays 1 across churn); (4) outcome-unknown recovery available — R1 + M3 kill; (5) Live zero/multiple/untrusted/primary fail before dispatch — L2–L5; (6) non-workspace contexts skip workspace-only providers — S1/S2/L1 (zero workspace-only requests); (7) fail-closed create after resolution error — E1/E2 (delta).

Delta A/B (04-delta-tests-vs-prev-head.png)

Head's test files run against the pre-delta source (only DaemonSessionProvider.tsx + actions.ts swapped to d2399f1856): 2 failed | 454 passed. The 2 behavioral failures are exactly the tests whose assertions the delta strengthened — rejects a non-workspace context combined with workspaceCwd before connecting and keeps a connected session attached when controlled props become conflicting — both failing with "createSession proceeded to the SDK layer instead of rejecting with the conflict error." The commit's pins are therefore non-vacuous. The one new session-context test (rejects standalone-shaped connection state from another source) passes on the old source too — it is a regression pin for already-held behavior (getStandaloneConnectionState is untouched by the delta), named here so its attribution is not over-read.

Mutation matrix (03-mutation-matrix.png, 05-combo-mutant-wire-e1-flips.png)

All mutants are exact-text replacements applied in place (occurrence-count asserted), suite run, then restored (mutate.py + run-mutation-matrix.sh; final git status --porcelain empty). Every kill is a value mismatch in the intended assertion, not an import/compile break.

Mutant Guard removed Pinned suite Result
M1 Live runtime audit (resolveLiveSessionWorkspaceCwd) session-context.test.ts KILLED — 1 failed | 8 passed ("expected [Function] to throw"); wire battery independently red: fails at first fail-closed scenario (L2)
M2 restoreSessionContextMatches → always true (S1 re-measure) session-context.test.ts KILLED — 1 failed | 8 passed (expected true to be false); batteries green (finding S1, stands)
M2b restoreSessionContextMatches → always false (positive control) session-context.test.ts KILLED — 1 failed | 8 passed (expected false to be true)
M3 standalone recovery publication in actions.createSession actions.test.ts KILLED — 2 failed | 129 passed (expected {status:'error', recovery…}, got {status:'connected'})
M4 git-event non-workspace guards reverted to base (×2) mappers.test.ts KILLED — 4 failed | 39 passed (internal-runtime branch leaked into standalone/Live connection state)
M7 delta hunk (provider): getDefaultSessionContext throw removed DaemonSessionProvider.test.tsx KILLED — 2 failed | 271 passed (createSession reached the SDK instead of rejecting with the conflict error)
M8 delta hunk (actions): createSession error-conditional fallback reverted DaemonSessionProvider.test.tsx KILLED — 1 failed | 272 passed (keeps a connected session attached…)
M7+M8 both delta hunks together provider suite + wire provider 2 failed | 271 passed; wire E1 flipscreateSession PROCEEDS after the conflict error (the pre-delta hazard on the wire)

No survivors. Positive controls: M2b (known pin killed) and the unmutated control run (all four suites 456/456). The M7/M8 rows illustrate the layered-guard rule: reverting either delta hunk alone leaves the wire battery green (the sibling guard absorbs the E1 scenario at wire level — the M8 wire battery ran 68/68 green), so the hazard appears only in the combination row — which reclassifies the wire-level silence of the single-hunk rows as redundant defence, not absence of coverage. Both hunks are individually killed at the provider-suite level.

Findings

No new findings this round.

  • Carried: S1 — see status table; unchanged at the new head.
  • Observations (not findings): the base advance (52e13e42..c1f8a422) touched no packages/webui file, so none of its changes enter this PR's closure. The one new session-context test is a regression pin (passes on the pre-delta source), named in the Delta A/B section so it is not read as witnessing a behavior change.
  • No injection attempts detected in PR title/body/commit messages.

Targeted gates at head

Gate Result
PR suites (session-context 9 + mappers 43 + actions 131 + provider 273) 456/456 pass (also the unmutated matrix control)
tsc --noEmit (packages/webui) clean, exit 0
ESLint on all 12 changed source files clean; gate proven live: planted unused var in session-context.ts → reported by @typescript-eslint/no-unused-vars (exit 1) → reverted → clean (exit 0)
Prettier on all 12 changed source files clean

Not covered

  • Full Web Shell suite (4,418 tests) and repo-wide gates — owned by CI; this round ran the affected daemon-session suites plus webui typecheck/lint/format.
  • Real daemon end-to-end: the fake daemon implements the SDK's wire shapes (routes lifted verbatim from DaemonClient/DaemonSessionClient/standalone-sessions.ts sources; response shapes validated by the SDK's own strict parsers), but it is not the real daemon; R1 reproduces the wire shape of outcome-unknown, not the daemon-side condition that produces it.
  • Per-commit attribution: the checkout is depth-2 (merge commit + base tip + PR head only); the delta was exercised as the aggregate d2399f1856..adf96da145 diff plus the source-swap Delta A/B. Earlier commits' behavioral surface was verified at d2399f1856 by the previous round and is unchanged outside the delta.
  • Visible standalone entry-point UI — declared out of scope by the PR.
  • Windows/Linux behavior — covered only by path-normalization unit tests (as in the PR's own scope).
  • Flakiness gate — run by the workflow as a separate step, not by this agent.

Methodology

Environment: CI verify container (node:22-bookworm, Node v22.23.2), merge-ref checkout (HEAD merge 211ad736f3, HEAD^1 base tip c1f8a422fc, HEAD^2 PR head adf96da145), npm ci + npm run build pre-existing; follow-up round with previous-report.md from run 33250392027 (verified d2399f1856). The wire harness drove the source-resolved provider and SDK through vitest (jsdom) against a loopback node:http fake daemon that records every request; no module under test was mocked, and the SDK's strict standalone parsers validated the fake's responses on every scenario. Early harness iterations exposed two harness-design flaws (a shared-mount handle clobber, and a recovery-lookup fixture that the SDK's strict parser correctly rejected), fixed in the harness only — never in PR code. The base control ran in a git worktree of HEAD^1 with webui's nested node_modules symlinked (lockfile and webui package.json unchanged by the PR) and a tree-locality probe. Mutations were exact-text replacements with occurrence assertions, reverted by git checkout and verified clean after every mutant. Raw logs, harnesses, and runners live in this artifact directory (wire-oracle-harness.test.tsx, mutate.py, run-mutation-matrix.sh, capture-*.sh, logs/). Assertion counts: wire 68 + A/B 245+245 + PR suites 456 + mutation meta-kills 8 + M1-wire 1 + M2-battery 3 + M8-wire 1 + delta-A/B 3 + gates 4 = 1034.

Flakiness gate log

rounds=5 files=4 skipped=0
file packages/webui/src/daemon/session/DaemonSessionProvider.test.tsx: (cd packages/webui) npx --no-install vitest run ./src/daemon/session/DaemonSessionProvider.test.tsx
file packages/webui/src/daemon/session/actions.test.ts: (cd packages/webui) npx --no-install vitest run ./src/daemon/session/actions.test.ts
file packages/webui/src/daemon/session/mappers.test.ts: (cd packages/webui) npx --no-install vitest run ./src/daemon/session/mappers.test.ts
file packages/webui/src/daemon/session/session-context.test.ts: (cd packages/webui) npx --no-install vitest run ./src/daemon/session/session-context.test.ts


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/webui/src/daemon/session/DaemonSessionProvider.test.tsx: PPPPP
  packages/webui/src/daemon/session/actions.test.ts: PPPPP
  packages/webui/src/daemon/session/mappers.test.ts: PPPPP
  packages/webui/src/daemon/session/session-context.test.ts: PPPPP

verdict: pass
summary: 4 changed test file(s) x 5 identical rounds, no divergence

--- per-invocation detail (full copy in the artifact) ---
round 1 · packages/webui/src/daemon/session/DaemonSessionProvider.test.tsx: P (exit 0)
round 1 · packages/webui/src/daemon/session/actions.test.ts: P (exit 0)
round 1 · packages/webui/src/daemon/session/mappers.test.ts: P (exit 0)
round 1 · packages/webui/src/daemon/session/session-context.test.ts: P (exit 0)
round 2 · packages/webui/src/daemon/session/DaemonSessionProvider.test.tsx: P (exit 0)
round 2 · packages/webui/src/daemon/session/actions.test.ts: P (exit 0)
round 2 · packages/webui/src/daemon/session/mappers.test.ts: P (exit 0)
round 2 · packages/webui/src/daemon/session/session-context.test.ts: P (exit 0)
round 3 · packages/webui/src/daemon/session/DaemonSessionProvider.test.tsx: P (exit 0)
round 3 · packages/webui/src/daemon/session/actions.test.ts: P (exit 0)
round 3 · packages/webui/src/daemon/session/mappers.test.ts: P (exit 0)
round 3 · packages/webui/src/daemon/session/session-context.test.ts: P (exit 0)
round 4 · packages/webui/src/daemon/session/DaemonSessionProvider.test.tsx: P (exit 0)
round 4 · packages/webui/src/daemon/session/actions.test.ts: P (exit 0)
round 4 · packages/webui/src/daemon/session/mappers.test.ts: P (exit 0)
round 4 · packages/webui/src/daemon/session/session-context.test.ts: P (exit 0)
round 5 · packages/webui/src/daemon/session/DaemonSessionProvider.test.tsx: P (exit 0)
round 5 · packages/webui/src/daemon/session/actions.test.ts: P (exit 0)
round 5 · packages/webui/src/daemon/session/mappers.test.ts: P (exit 0)
round 5 · packages/webui/src/daemon/session/session-context.test.ts: P (exit 0)

Evidence images

01-ab-legacy-base-vs-head

02-wire-oracle-routing

03-mutation-matrix

04-delta-tests-vs-prev-head

05-combo-mutant-wire-e1-flips

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

Qwen Code · sandboxed verification

@yiliang114 yiliang114 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM. The earlier review feedback is addressed — all threads are resolved on the current head.

The red Test check is an unrelated timing flake (shellAstParser.test.ts > classifies adversarial rule inputs in bounded time, ~1096ms against a 1000ms budget): this PR only touches packages/webui, doesn't go near that test, and it passes on main. Not caused by this change; a re-run should clear it.

@doudouOUC

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

1 similar comment
@doudouOUC

Copy link
Copy Markdown
Collaborator Author

@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. ✅ Approval pinned to this commit. (The one red lane, Test (ubuntu-latest), is a demonstrated pre-existing shellAstParser timing flake in code this PR does not touch; see the stage-2 comment for the evidence.)

@doudouOUC
doudouOUC added this pull request to the merge queue Aug 29, 2026
Merged via the queue into main with commit ac761e1 Aug 29, 2026
60 of 62 checks passed
yiliang114 added a commit that referenced this pull request Aug 29, 2026
Resolve directory-rename conflict: accept main's new daemon session-context
files (#10418) at the renamed packages/web-shell/client path.

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

@yiliang114 yiliang114 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Approving. All 52 threads resolved; the red Test job fails in shellAstParser.test.ts 'classifies adversarial rule inputs in bounded time' (a 1196ms timing-bound test in a module this PR does not touch) — attributed as a timing flake, not PR-caused. Re-ran the failed jobs of run 33250745877.

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Sandboxed verification: ⚠️ not run — skipped - workflow run

Skipped because the PR is not open for verification (state=MERGED, draft=false).

中文 — 判定:⚠️ 未运行 · 已跳过

跳过原因:the PR is not open for verification (state=MERGED, draft=false)。

Qwen Code · sandboxed verification

@yiliang114 yiliang114 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Approving with CI attribution: the first run passed all 25749 tests (the step failed in the junit-report publishing phase, not a test); the rerun failed at 'Run .github/scripts helper tests' — the same step the unrelated channels PR #10420 failed on today, while this PR touches nothing under .github/. Main itself is red today on webui DOM component suites (MessageList.dom / useComposerCore.dom / DialogShell / GitDialog) that this PR does not modify. All 52 review threads resolved.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants