Skip to content

feat(serve): MCP guardrail push events + hysteresis (#4175 Wave 3 PR 14b)#4271

Merged
doudouOUC merged 14 commits into
mainfrom
feat/serve-mcp-guardrail-events
May 18, 2026
Merged

feat(serve): MCP guardrail push events + hysteresis (#4175 Wave 3 PR 14b)#4271
doudouOUC merged 14 commits into
mainfrom
feat/serve-mcp-guardrail-events

Conversation

@doudouOUC
Copy link
Copy Markdown
Collaborator

Summary

PR 14b layers a real-time push channel on top of the snapshot surface introduced by PR 14 (#4247 / #4175 Wave 3). Operators dashboarding /workspace/mcp already see budget pressure via budgets[0].status and per-server disabledReason: 'budget'; this PR adds typed SSE events so SDK clients can react without polling.

Two new event types on GET /session/:id/events:

  • mcp_budget_warning — fires once on the upward 75% crossing of reservedSlots.size / clientBudget. Re-arms only after the ratio drops below 37.5% (MCP_BUDGET_REARM_FRACTION). Mirrors PR 10's slow_client_warning hysteresis but at the manager level rather than the per-subscriber backlog level. Fires under both warn and enforce modes; off skips the state machine entirely.
  • mcp_child_refused_batch — coalesced once per discoverAllMcpTools* pass when ≥1 server was refused, AND as a length-1 batch on the readResource lazy-spawn refusal path. mode is the literal 'enforce' since warn mode never refuses.

What's wired

  • Core (McpClientManager): new evaluateBudgetState() + emitRefusedBatchIfAny() methods, pendingRefusalNames queue distinct from snapshot-visible lastRefusedServerNames (PR 14 contract preserved), and setOnBudgetEvent(cb) setter so acpAgent registers the callback after loadCliConfig returns but before discovery starts.
  • ACP transport: child→bridge connection.extNotification with method qwen/notify/session/mcp-budget-event (mirrors the authenticate/update precedent at acpAgent.ts:355). Payload carries v: 1 envelope + sessionId for routing.
  • Bridge handler: BridgeClient.extNotification resolves session via byId.get(sessionId) and republishes as a session-scoped SSE frame. Unknown methods, unknown kinds, and missing sessionIds drop silently for forward-compat.
  • Capability tag: mcp_guardrail_events (always-on, distinct from PR 14's mcp_guardrails snapshot tag).
  • SDK typed-event registry: KnownDaemonEvent gains DaemonMcpGuardrailEvent union member; reducer adds 4 fields on DaemonSessionViewState (mcpBudgetWarningCount, lastMcpBudgetWarning, mcpRefusedBatchCount, lastMcpRefusedBatch). Predicate guards reject mode: 'warn' on refused-batch (literal-'enforce' invariant) and unknown transport families (forward-compat: a daemon emitting a new transport speaks newer wire than this SDK).

Backward compatibility

Every new field is optional; reducer state defaults to zeros; old daemons advertise mcp_guardrails only and SDK consumers fall back to snapshot polling per the existing PR 14 contract. EVENT_SCHEMA_VERSION stays at 1 — push events are an additive narrowable extension, not a wire bump. Off-mode constructor strips onBudgetEvent (defense in depth: even a stray internal call can't fire).

Test plan

  • 11 new manager unit tests (state machine arms/fires/rearms; refused batch coalescing; transport preservation across families; off-mode no-op; readResource length-1 batch; stop() re-arms state).
  • 2 new acpAgent unit tests (extNotification dispatch with sessionId closure capture; defensive no-op when getMcpClientManager absent on stubbed test ToolRegistries).
  • 3 new bridge unit tests (warning + refused-batch publish on the right SSE frame type; drop unknown methods / kinds / sessionIds silently).
  • 5 new SDK validation tests (predicate accepts good shapes; rejects thresholdRatio !== 0.75; rejects mode: 'warn' on refused-batch; rejects unknown transports; reducer counters increment + last* capture; safety-net routes malformed payloads through unrecognizedKnownEventCount).
  • 1 new integration test: pgrep -P × subprocessCount cross-check validates the in-process counter (PR 14b's event source) against external observation. Skip-gated like PR 1 (POSIX, non-sandbox).
  • 1 new capability-shape test for mcp_guardrail_events.
  • EXPECTED_STAGE1_FEATURES updated with the new tag.
  • Verified: 865/865 tests pass across 30 files; typecheck clean across 4 workspaces; lint clean on 11 touched files.

Files changed

13 files, +1828 / -16 lines:

File Change
packages/core/src/tools/mcp-client-manager.ts (+test) State machine, callback wiring, refused-batch coalescing
packages/cli/src/acp-integration/acpAgent.ts (+test) setOnBudgetEvent registration; ext-notification dispatch
packages/cli/src/serve/httpAcpBridge.ts (+test) extNotification handler on BridgeClient
packages/cli/src/serve/capabilities.ts (+ server.test.ts) mcp_guardrail_events tag + shape assertion
packages/sdk-typescript/src/daemon/events.ts (+test) Typed events, predicates, reducer state
integration-tests/cli/qwen-serve-baseline.test.ts pgrep -P × subprocessCount cross-check
docs/users/qwen-serve.md + docs/developers/qwen-serve-protocol.md Push event description, capability list, snapshot-vs-events guidance

Refs #4175.

🤖 Generated with Qwen Code

…14b)

Adds typed SSE push events for the MCP budget surface introduced by
PR 14 (#4247). Operators dashboarding `/workspace/mcp` snapshot already
see budget pressure via `budgets[0].status` + per-server
`disabledReason: 'budget'`; PR 14b layers a real-time push channel on
top so SDK clients can react without polling.

Two new event types on `GET /session/:id/events`:

- `mcp_budget_warning` — fires once on the upward 75% crossing of
  `reservedSlots.size / clientBudget`; re-arms only after the ratio
  drops below 37.5% (`MCP_BUDGET_REARM_FRACTION`). Mirrors PR 10's
  `slow_client_warning` hysteresis but at the manager level rather
  than the per-subscriber backlog level. Fires under both `warn` and
  `enforce` modes.
- `mcp_child_refused_batch` — fires at end of each
  `discoverAllMcpTools*` pass when ≥1 server was refused, AND as a
  length-1 batch on the `readResource` lazy-spawn refusal path.
  `mode` is the literal `'enforce'` since `warn` mode never refuses.

Wired end-to-end:

- Core `McpClientManager` gains `evaluateBudgetState()` +
  `emitRefusedBatchIfAny()`, a `pendingRefusalNames` queue distinct
  from the snapshot-visible `lastRefusedServerNames` (PR 14
  contract: refusals survive between passes for the snapshot — the
  emit log is independent), and a `setOnBudgetEvent(cb)` setter so
  acpAgent can register the callback after `loadCliConfig` returns
  but before discovery fires.
- ACP child→bridge transport: `connection.extNotification` with
  method `qwen/notify/session/mcp-budget-event` (mirrors the
  `authenticate/update` precedent at `acpAgent.ts:355`). Payload
  carries `v: 1` envelope + sessionId for routing.
- BridgeClient gains `extNotification` handler; resolves session via
  `byId.get(sessionId)` and republishes as a session-scoped SSE
  frame. Unknown methods, unknown kinds, and missing sessionIds drop
  silently for forward-compat.
- Capability tag `mcp_guardrail_events` (always-on, distinct from
  PR 14's `mcp_guardrails` snapshot tag).
- SDK typed-event registry: `KnownDaemonEvent` gains
  `DaemonMcpGuardrailEvent` union member; reducer adds 4 fields
  (`mcpBudgetWarningCount`, `lastMcpBudgetWarning`,
  `mcpRefusedBatchCount`, `lastMcpRefusedBatch`) on
  `DaemonSessionViewState`. Predicate guards reject `mode: 'warn'` on
  refused-batch (literal-`'enforce'` invariant) + unknown transport
  families (forward-compat: a daemon emitting a new transport speaks
  newer wire than this SDK).

Tests:

- 11 new manager tests (state machine arms/fires/rearms, refused
  batch coalescing, transport preservation, off-mode no-op,
  `readResource` length-1 batch, stop-resets-state).
- 2 new acpAgent tests (extNotification dispatch with sessionId
  closure; defensive no-op when `getMcpClientManager` absent).
- 3 new bridge tests (warning + refused-batch publish; drop unknown
  methods / kinds / sessionIds).
- 5 new SDK tests (predicate accepts good shapes, rejects
  `thresholdRatio !== 0.75`, rejects `mode: 'warn'` on refused-batch,
  rejects unknown transport; reducer counters increment + last*
  capture; safety-net routes malformed payloads through
  `unrecognizedKnownEventCount`).
- 1 new integration test: `pgrep -P` × `subprocessCount` cross-check
  validates the in-process counter (PR 14b's event source) against
  external observation. Skip-gated like PR 1 (POSIX, non-sandbox).
- 1 new capability shape test for `mcp_guardrail_events`.
- 1 added EXPECTED_STAGE1_FEATURES entry.

Backward compat: every new field optional; reducer state initialized
to zero defaults; old daemons advertise `mcp_guardrails` only and
SDK consumers fall back to snapshot polling per the existing PR 14
contract. `EVENT_SCHEMA_VERSION` stays at `1` — push events are an
additive, narrowable extension, not a wire bump.

Verified: 865/865 tests pass across 30 files (manager, serve,
acp-integration, sdk-typescript); typecheck clean across 4
workspaces; lint clean on 11 touched files.

Refs #4175.
@github-actions
Copy link
Copy Markdown
Contributor

📋 Review Summary

This PR (14b) adds real-time SSE push events for MCP budget guardrails on top of the snapshot surface from PR 14 (#4247). It introduces two new event types (mcp_budget_warning with hysteresis and mcp_child_refused_batch coalesced per discovery pass) that allow SDK clients to react to budget pressure without polling. The implementation is well-structured with comprehensive test coverage across all layers (core manager, ACP transport, bridge handler, and SDK validation).

🔍 General Feedback

  • Strong architectural layering: The implementation cleanly separates concerns across four layers (McpClientManager → ACP transport → Bridge handler → SDK reducer), with each layer having clear responsibilities and appropriate test coverage.
  • Excellent forward-compatibility design: Unknown methods, kinds, sessionIds, and transport families are all dropped silently, allowing future extensions without breaking existing clients.
  • Well-documented hysteresis logic: The dual-threshold state machine (75% fire / 37.5% re-arm) mirrors PR 10's slow_client_warning pattern and is clearly explained in comments.
  • Comprehensive test coverage: 11 manager unit tests, 2 acpAgent tests, 3 bridge tests, and 5 SDK validation tests cover state machine behavior, edge cases, and wire-format validation.
  • Consistent patterns: The code follows established conventions from PR 10's slow_client_warning implementation, making it easier to understand and maintain.

🎯 Specific Feedback

🟡 High Priority Issues

  • packages/core/src/tools/mcp-client-manager.ts:1842 - The inline call to evaluateBudgetState() in the readResource lazy-spawn path is marked as a PR 14b addition but the comment states it's needed because this path "bypasses the bulk evaluateBudgetState at end-of-pass." Consider extracting this into a dedicated method like maybeEvaluateBudgetStateInline() to make the intent clearer and avoid code duplication if this pattern expands.

  • packages/sdk-typescript/src/daemon/events.ts:800 - The isMcpRefusedServerEntry function validates transport against a hardcoded list of known kinds. While the forward-compat rationale is sound (reject unknown transports silently), this creates a maintenance burden—every new transport kind added to McpTransportKind must be remembered here. Consider deriving this validation from the type definition itself or adding a lint rule to catch drift.

🟢 Medium Priority Improvements

  • packages/cli/src/serve/httpAcpBridge.ts:1241 - The extNotification handler strips routing fields (v, sessionId, kind) from the payload with inline void statements. While the comment explains why, consider extracting this into a helper function stripRoutingFields(params) to make the transformation more explicit and testable.

  • packages/core/src/tools/mcp-client-manager.ts:67 - The MCP_BUDGET_REARM_FRACTION constant is exported but the comment mentions it "mirrors PR 10's eventBus.ts:WARN_RESET_RATIO". Consider adding a reference comment linking to the original pattern (e.g., // Mirrors eventBus.ts:WARN_RESET_RATIO pattern from PR 10) for easier cross-referencing.

  • packages/sdk-typescript/src/daemon/events.ts:773 - The isMcpBudgetWarningData predicate checks thresholdRatio === 0.75 as a literal. The comment notes "a future PR adding 0.50 / 0.95 thresholds would extend both the daemon emit + this predicate." Consider defining MCP_BUDGET_WARN_FRACTION as a shared constant imported from core (or defined in the SDK) rather than magic numbers in both places, even though they're currently in sync by design.

🔵 Low Priority Suggestions

  • packages/cli/src/serve/httpAcpBridge.ts:1243-1248 - The ternary chain mapping kind to type could benefit from a small lookup object for clarity:

    const KIND_TO_TYPE: Record<string, string> = {
      budget_warning: 'mcp_budget_warning',
      refused_batch: 'mcp_child_refused_batch',
    };
    const type = KIND_TO_TYPE[kind];
  • packages/sdk-typescript/src/daemon/events.ts:280 - The comment for DaemonMcpGuardrailEvent explains why it's grouped separately from DaemonStreamLifecycleEvent. Consider adding a similar explanatory comment to the union definition itself (not just the JSDoc) for readers skimming the type hierarchy.

  • packages/core/src/tools/mcp-client-manager.test.ts:2127 - The hysteresis test is comprehensive but quite long (70+ lines). Consider breaking it into smaller focused tests: one for the initial fire, one for the "no re-arm above 37.5%" behavior, and one for the re-arm + refire sequence.

✅ Highlights

  • Excellent test design: The test patterns mirror established conventions (e.g., slow_client_warning tests) and cover edge cases like empty refusedServers arrays, malformed payloads routing through unrecognizedKnownEventCount, and transport preservation across families.
  • Defense-in-depth approach: The off-mode constructor strips onBudgetEvent entirely, preventing stray internal calls from firing events. This is called out explicitly in both code and comments.
  • Clean wire-format design: Stripping routing fields (v, sessionId, kind) from the SSE data payload avoids duplication since the SSE envelope already carries this information.
  • Non-terminal event handling: Both event types correctly preserve stream alive state—they're status signals, not lifecycle terminators. The reducer comments make this explicit.
  • Comprehensive validation: The SDK predicates reject mode: 'warn' on refused-batch events (since warn mode never refuses), catching protocol violations early rather than letting malformed shapes through.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Adds MCP guardrail push events (SSE) on top of the existing /workspace/mcp snapshot surface so SDK/clients can react to MCP budget pressure and refusals without polling, and wires child→bridge notifications to publish session-scoped frames.

Changes:

  • Core: add budget-warning hysteresis + refused-batch coalescing and an onBudgetEvent callback hook in McpClientManager.
  • CLI/serve bridge: forward budget events via ACP extNotification and publish them as typed SSE frames; advertise new mcp_guardrail_events capability.
  • SDK: extend known event typing + predicates + reducer view-state counters for the new frame types; add tests/docs/integration coverage.

Reviewed changes

Copilot reviewed 13 out of 13 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
packages/core/src/tools/mcp-client-manager.ts Adds hysteresis budget-warning evaluation, refused-batch coalescing, and callback wiring for push events.
packages/core/src/tools/mcp-client-manager.test.ts Adds unit coverage for budget-warning hysteresis and refused-batch emission behavior.
packages/cli/src/acp-integration/acpAgent.ts Wires manager budget events into child→bridge ACP extNotification messages.
packages/cli/src/acp-integration/acpAgent.test.ts Tests setOnBudgetEvent wiring and defensive no-op behavior.
packages/cli/src/serve/httpAcpBridge.ts Implements extNotification handling to translate budget events into SSE frames.
packages/cli/src/serve/httpAcpBridge.test.ts Tests SSE publishing and silent drops for unknown/invalid notifications.
packages/cli/src/serve/capabilities.ts Adds mcp_guardrail_events capability registration.
packages/cli/src/serve/server.test.ts Asserts the new capability tag is present in the registry/baseline.
packages/sdk-typescript/src/daemon/events.ts Adds typed event unions, predicates, and reducer state for MCP guardrail events.
packages/sdk-typescript/test/unit/daemonEvents.test.ts Adds validation + reducer tests for the new MCP guardrail frames.
integration-tests/cli/qwen-serve-baseline.test.ts Adds a baseline cross-check test intended to validate daemon accounting vs pgrep.
docs/users/qwen-serve.md Documents the new push-event behavior and feature-detection guidance.
docs/developers/qwen-serve-protocol.md Extends protocol docs with the new capability tag and event shapes.

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

Comment thread packages/cli/src/acp-integration/acpAgent.ts Outdated
Comment thread packages/core/src/tools/mcp-client-manager.ts Outdated
Comment thread integration-tests/cli/qwen-serve-baseline.test.ts Outdated
Comment thread packages/core/src/tools/mcp-client-manager.ts
Comment thread packages/core/src/tools/mcp-client-manager.ts
Copy link
Copy Markdown
Collaborator

@wenshao wenshao left a comment

Choose a reason for hiding this comment

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

Follow-up audit on commit 22ac97b. The two earlier critical threads (r3257175080 incremental-batch coalesce, r3257175089 re-arm gap on slot release) are still open in this commit. Adding one new inline below — the hysteresis test currently masks the re-arm gap, so once r3257175089 is fixed, the synthetic re-discover trigger should be removable.

Also noting alongside Copilot's r3257030112: the integration test claims to cross-check the event source (liveCount / subprocessCount, i.e. getMcpClientAccounting().total) against pgrep, but the assertions only read snapshot.clientCount. The push-event invariant (events' liveCount matches OS truth) isn't actually guarded — please assert on the field the test description names.

Comment thread packages/core/src/tools/mcp-client-manager.test.ts
Copy link
Copy Markdown
Collaborator

@wenshao wenshao left a comment

Choose a reason for hiding this comment

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

[Critical] disconnectServer (L1209), removeServer (L1731), and the weReservedSlot catch path in discoverMcpToolsForServerInternal (L1115) all call this.reservedSlots.delete(serverName) but do NOT call this.evaluateBudgetState(). After a budget_warning fires (warnArmed = false), if the operator disconnects/removes servers until the ratio drops below 37.5% (MCP_BUDGET_REARM_FRACTION), warnArmed stays false permanently — no re-arm. Only stop() (next full discovery pass) or a successful reconnect can unstick it. These lines are unchanged code in the diff, so they can't be inline comments.

Fix: Add this.evaluateBudgetState() after each this.reservedSlots.delete(serverName) call in all three locations.

See inline comments below for additional findings.

— DeepSeek/deepseek-v4-pro via Qwen Code /review

Comment thread packages/core/src/tools/mcp-client-manager.ts
Comment thread packages/core/src/tools/mcp-client-manager.ts Outdated
Comment thread packages/cli/src/serve/httpAcpBridge.ts
Comment thread packages/sdk-typescript/src/daemon/events.ts
Comment thread packages/sdk-typescript/src/daemon/events.ts Outdated
doudouOUC added 2 commits May 18, 2026 16:58
Codex review round 1 of #4271 flagged four P2 issues; this fixup
commit addresses all of them with bounded changes:

#1 Bridge early-event buffer (httpAcpBridge.ts +
   `BridgeClient.earlyEvents` Map / `bufferEarlyEvent` /
   `sweepExpiredEarlyEvents` / `drainEarlyEvents`):
   Budget events fired during the child's `newSession` handler reach
   `BridgeClient.extNotification` before `byId.set` populates the
   session entry — pre-fix those frames hit `resolveEntry → undefined`
   and got dropped, so SSE subscribers never saw the events that
   crossed during session creation. Now we buffer per-sessionId with
   triple bounds (64 sessions × 32 frames × 60s TTL ≈ 400 KB worst
   case) and drain on `createSessionEntry`'s `byId.set`. Lazy TTL
   sweep + bounded capacity defends against malicious / buggy
   children spamming bogus sessionIds.

#2 Pre-init callback registration (config.ts new
   `setMcpBudgetEventCallback` shim + acpAgent moves registration):
   Pre-fix acpAgent registered `setOnBudgetEvent` AFTER
   `config.initialize()` returned. In `QWEN_CODE_LEGACY_MCP_BLOCKING=1`
   mode discovery completes synchronously inside `initialize`, so
   end-of-pass events for the first pass were lost 100%; in default
   progressive mode there was a real race window. The Config-level
   shim stashes the callback and applies it inside `createToolRegistry`
   right after manager construction, so the manager has its callback
   wired BEFORE either `discoverAllTools` (legacy) or
   `startMcpDiscoveryInBackground` (default) fires.

#3 Bulk-pass refused-batch coalescing (mcp-client-manager.ts new
   `bulkPassDepth` counter + `emitRefusedBatchIfAny` early-return
   guard): Pre-fix `discoverAllMcpToolsIncremental` walked N new
   servers and the per-server `discoverMcpToolsForServerInternal`
   refusal path emitted N length-1 batches inline, breaking the
   documented "one batch per `discoverAllMcpTools*` pass" contract.
   Now the bulk entry/exit increments/decrements `bulkPassDepth` in
   try/finally; while > 0, `emitRefusedBatchIfAny` no-ops. The
   bulk-pass `finally` decrements to 0 BEFORE its own emit, so the
   terminal call drains the queue once as a coalesced length-N batch.

#4 Hysteresis re-arm on slot release (mcp-client-manager.ts new
   `releaseSlotName` helper + inline `evaluateBudgetState` in
   `tryReserveSlot`): Pre-fix the state machine only ran on bulk-pass
   end-of-pass + per-server success, so slot-release paths
   (`disconnectServer`, `removeServer`, `runWithDiscoveryTimeout`,
   connect-failure catch blocks) deleted from `reservedSlots` without
   touching `warnArmed`. Operator scenario "4/4 fire → drop to 1/4
   → up to 4/4" never fired the second warning. Now every slot
   mutation drives the state machine via a single helper pair —
   `tryReserveSlot` calls evaluate after `add`, `releaseSlotName`
   wraps `delete + evaluate`. All 6 `reservedSlots.delete` sites
   migrated; redundant standalone `evaluateBudgetState` calls dropped
   from end-of-pass + per-server success + readResource late-reserve
   paths (the helper covers them).

Tests:

- `mcp-client-manager.test.ts`: +2 new tests
  (`discoverAllMcpToolsIncremental coalesces multi-server refusals
  into ONE batch`, `disconnectServer drives the hysteresis re-arm
  path`); 1 existing test's `reservedCount` assertion updated from
  4→3 to reflect inline-at-crossing semantics.

- `acpAgent.test.ts`: pre-init wiring test rewritten to assert the
  strict ordering invariant `setMcpBudgetEventCallback` →
  `initialize` via `callOrder` array; defensive test now exercises
  the new `Config.setMcpBudgetEventCallback` absence path.

- `httpAcpBridge.test.ts`: +1 new test (`buffers events for a
  not-yet-registered sessionId, drains them on registration`)
  exercising the buffer + drain mechanism via thread-scope
  pre-buffering for a future session id.

Verified: 868/868 tests pass across 30 files (manager 71 incl. 14
PR 14b + 2 fixup; serve 137 incl. 4 PR 14b + 1 fixup; acpAgent 55
incl. 2 PR 14b updated; sdk 27 PR 14b unchanged); typecheck clean
across 4 workspaces; lint clean on 7 touched files.
…ail-events

# Conflicts:
#	packages/cli/src/serve/capabilities.ts
#	packages/cli/src/serve/server.test.ts
#	packages/sdk-typescript/src/daemon/events.ts
#	packages/sdk-typescript/test/unit/daemonEvents.test.ts
Copy link
Copy Markdown
Collaborator

@wenshao wenshao left a comment

Choose a reason for hiding this comment

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

One additional typecheck failure could not be mapped to a changed diff line: packages/sdk-typescript/test/unit/daemonEvents.test.ts:667 fails with TS2345 for the existing slow_client_warning fixture because the object literal is inferred with widened type: string. Please apply the same literal-preserving fix there as well.

— mimo-v2.5-pro via Qwen Code /review

Comment thread packages/sdk-typescript/test/unit/daemonEvents.test.ts
Comment thread packages/sdk-typescript/test/unit/daemonEvents.test.ts
Comment thread packages/core/src/tools/mcp-client-manager.ts
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 18, 2026

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 77.33% 77.33% 79.91% 79.97%
Core 79.38% 79.38% 82% 82.77%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   77.33 |    79.97 |   79.91 |   77.33 |                   
 src               |   75.73 |    69.15 |   80.55 |   75.73 |                   
  gemini.tsx       |   68.53 |     66.4 |   76.47 |   68.53 | ...29,946-949,957 
  ...ractiveCli.ts |      80 |    68.61 |   78.57 |      80 | ...1020,1058,1161 
  ...liCommands.ts |   74.51 |     72.5 |     100 |   74.51 | ...41-265,290,391 
  ...ActiveAuth.ts |     100 |     87.5 |     100 |     100 | 66-80             
 ...cp-integration |   61.49 |    64.49 |   77.77 |   61.49 |                   
  acpAgent.ts      |   62.85 |    64.59 |   82.75 |   62.85 | ...2076,2090-2098 
  authMethods.ts   |   12.19 |      100 |       0 |   12.19 | 11-31,34-38,41-50 
  errorCodes.ts    |       0 |        0 |       0 |       0 | 1-22              
  ...DirContext.ts |     100 |      100 |     100 |     100 |                   
 ...ration/service |   68.65 |    83.33 |   66.66 |   68.65 |                   
  filesystem.ts    |   68.65 |    83.33 |   66.66 |   68.65 | ...32,77-94,97-98 
 ...ration/session |   76.97 |    72.12 |   86.25 |   76.97 |                   
  ...ryReplayer.ts |   67.34 |     75.6 |   81.81 |   67.34 | ...54-269,282-283 
  Session.ts       |   76.32 |    70.86 |   88.46 |   76.32 | ...2537,2543-2546 
  ...entTracker.ts |   90.85 |    84.84 |      90 |   90.85 | ...35,199,251-260 
  index.ts         |       0 |        0 |       0 |       0 | 1-40              
  ...ssionUtils.ts |   84.21 |    77.77 |     100 |   84.21 | ...37-153,209-211 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...ssion/emitters |   96.01 |    90.75 |    92.3 |   96.01 |                   
  BaseEmitter.ts   |   76.92 |    66.66 |      80 |   76.92 | 23-24,39-40,55-56 
  ...ageEmitter.ts |     100 |    89.47 |     100 |     100 | 109,111           
  PlanEmitter.ts   |     100 |      100 |     100 |     100 |                   
  ...allEmitter.ts |   98.06 |     92.3 |     100 |   98.06 | 227-228,327,335   
  index.ts         |       0 |        0 |       0 |       0 | 1-10              
 ...ession/rewrite |   90.36 |    87.83 |   94.11 |   90.36 |                   
  LlmRewriter.ts   |      81 |       84 |     100 |      81 | ...,88-89,155-159 
  ...Middleware.ts |   95.83 |    85.71 |     100 |   95.83 | 119,127-129       
  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/auth          |    97.7 |    94.81 |   95.45 |    97.7 |                   
  allProviders.ts  |     100 |      100 |     100 |     100 |                   
  ...iderConfig.ts |    97.6 |    95.04 |     100 |    97.6 | ...61,411,433-434 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 src/auth/install  |   98.57 |    88.88 |     100 |   98.57 |                   
  ...nstallPlan.ts |   98.57 |    88.88 |     100 |   98.57 | 80,93             
 ...viders/alibaba |   96.96 |    66.66 |   66.66 |   96.96 |                   
  ...baStandard.ts |     100 |      100 |     100 |     100 |                   
  codingPlan.ts    |   93.67 |    66.66 |   66.66 |   93.67 | 83,87-89,94       
  tokenPlan.ts     |     100 |      100 |     100 |     100 |                   
 ...oviders/custom |     100 |      100 |     100 |     100 |                   
  ...omProvider.ts |     100 |      100 |     100 |     100 |                   
 ...roviders/oauth |    91.5 |    77.03 |   97.05 |    91.5 |                   
  openrouter.ts    |   84.37 |    33.33 |     100 |   84.37 | 43-48             
  ...outerOAuth.ts |    91.9 |    79.06 |   96.87 |    91.9 | ...53-655,699-701 
 ...ers/thirdParty |     100 |      100 |     100 |     100 |                   
  deepseek.ts      |     100 |      100 |     100 |     100 |                   
  idealab.ts       |     100 |      100 |     100 |     100 |                   
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  zai.ts           |     100 |      100 |     100 |     100 |                   
 src/commands      |   47.93 |    85.71 |   43.47 |   47.93 |                   
  auth.ts          |     100 |    83.33 |     100 |     100 | 11,14             
  channel.ts       |   56.66 |      100 |       0 |   56.66 | 15-19,27-34       
  extensions.tsx   |   96.55 |      100 |      50 |   96.55 | 37                
  hooks.tsx        |   66.66 |      100 |       0 |   66.66 | 20-24             
  mcp.ts           |   94.73 |      100 |      50 |   94.73 | 28                
  review.ts        |   51.85 |      100 |       0 |   51.85 | 24-35,38          
  serve.ts         |    7.74 |      100 |       0 |    7.74 | ...51-147,149-230 
 ...mmands/channel |   39.25 |    79.45 |      50 |   39.25 |                   
  ...l-registry.ts |    8.57 |      100 |       0 |    8.57 | 6-21,24-42        
  config-utils.ts  |      92 |      100 |   66.66 |      92 | 21-26             
  configure.ts     |    14.7 |      100 |       0 |    14.7 | 18-21,23-84       
  pairing.ts       |   26.31 |      100 |       0 |   26.31 | ...30,40-50,52-65 
  pidfile.ts       |   96.34 |    86.95 |     100 |   96.34 | 49,59,91          
  start.ts         |   30.98 |       52 |   69.23 |   30.98 | ...72-475,484-486 
  status.ts        |   17.85 |      100 |       0 |   17.85 | 15-26,32-76       
  stop.ts          |      20 |      100 |       0 |      20 | 14-48             
 ...nds/extensions |    84.5 |    88.95 |   81.81 |    84.5 |                   
  consent.ts       |   71.65 |    89.28 |   42.85 |   71.65 | ...85-141,156-162 
  disable.ts       |     100 |      100 |     100 |     100 |                   
  enable.ts        |     100 |      100 |     100 |     100 |                   
  install.ts       |    75.6 |    66.66 |   66.66 |    75.6 | ...39-142,145-153 
  link.ts          |     100 |      100 |     100 |     100 |                   
  list.ts          |     100 |      100 |     100 |     100 |                   
  new.ts           |     100 |      100 |     100 |     100 |                   
  settings.ts      |   99.15 |      100 |   83.33 |   99.15 | 151               
  uninstall.ts     |    37.5 |      100 |   33.33 |    37.5 | 23-45,57-64,67-70 
  update.ts        |   96.32 |      100 |     100 |   96.32 | 101-105           
  utils.ts         |   60.24 |    28.57 |     100 |   60.24 | ...81,83-87,89-93 
 ...les/mcp-server |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-60              
 src/commands/mcp  |   92.29 |    86.08 |   88.88 |   92.29 |                   
  add.ts           |     100 |    98.03 |     100 |     100 | 293               
  list.ts          |   91.22 |    80.76 |      80 |   91.22 | ...19-121,146-147 
  reconnect.ts     |   76.72 |    71.42 |   85.71 |   76.72 | 35-48,153-175     
  remove.ts        |     100 |       80 |     100 |     100 | 21-25             
 ...ommands/review |   11.57 |      100 |       0 |   11.57 |                   
  cleanup.ts       |   17.94 |      100 |       0 |   17.94 | ...01-106,108-109 
  deterministic.ts |   13.75 |      100 |       0 |   13.75 | ...22-738,740-741 
  fetch-pr.ts      |   11.36 |      100 |       0 |   11.36 | ...80-201,203-204 
  load-rules.ts    |   11.32 |      100 |       0 |   11.32 | ...41-153,155-156 
  pr-context.ts    |    6.22 |      100 |       0 |    6.22 | ...97-312,314-315 
  presubmit.ts     |    9.35 |      100 |       0 |    9.35 | ...62-287,289-290 
 ...nds/review/lib |      30 |      100 |       0 |      30 |                   
  gh.ts            |   22.58 |      100 |       0 |   22.58 | ...49,53-54,62-69 
  git.ts           |   22.72 |      100 |       0 |   22.72 | 15-18,29-39,43-44 
  paths.ts         |   52.94 |      100 |       0 |   52.94 | ...26,37-38,42-43 
 src/config        |   92.79 |    85.18 |   88.09 |   92.79 |                   
  auth.ts          |   86.98 |    80.32 |     100 |   86.98 | ...26-227,243-244 
  config.ts        |   88.31 |    84.87 |      80 |   88.31 | ...1841,1843-1851 
  keyBindings.ts   |   96.55 |       50 |     100 |   96.55 | 193-196           
  ...idersScope.ts |      92 |       90 |     100 |      92 | 11-12             
  sandboxConfig.ts |   61.64 |    71.87 |   66.66 |   61.64 | ...54-68,73,77-89 
  settings.ts      |   85.76 |    87.25 |   89.18 |   85.76 | ...1148,1153-1156 
  ...ingsSchema.ts |     100 |      100 |     100 |     100 |                   
  ...tedFolders.ts |   96.22 |       94 |     100 |   96.22 | ...88-190,205-206 
 ...nfig/migration |   94.89 |    78.94 |   83.33 |   94.89 |                   
  index.ts         |   94.87 |    88.88 |     100 |   94.87 | 91-92             
  scheduler.ts     |   96.55 |    77.77 |     100 |   96.55 | 19-20             
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...ation/versions |   94.74 |       96 |     100 |   94.74 |                   
  ...-v2-shared.ts |     100 |      100 |     100 |     100 |                   
  v1-to-v2.ts      |   81.75 |    90.19 |     100 |   81.75 | ...28-229,231-247 
  v2-to-v3.ts      |     100 |      100 |     100 |     100 |                   
  v3-to-v4.ts      |     100 |      100 |     100 |     100 |                   
 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    |   63.09 |    64.51 |   55.55 |   63.09 |                   
  ...tputBridge.ts |   62.94 |    65.51 |   56.25 |   62.94 | ...22-323,331-334 
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/export        |       0 |        0 |       0 |       0 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-7               
 src/generated     |     100 |      100 |     100 |     100 |                   
  git-commit.ts    |     100 |      100 |     100 |     100 |                   
 src/i18n          |   81.47 |    75.94 |   65.71 |   81.47 |                   
  index.ts         |   63.68 |    69.56 |   53.84 |   63.68 | ...70-271,281-286 
  languages.ts     |   96.92 |    86.66 |     100 |   96.92 | 134-135,167,184   
  ...nslateKeys.ts |     100 |      100 |     100 |     100 |                   
  ...lationDict.ts |   93.33 |    66.66 |     100 |   93.33 | 15                
 src/i18n/locales  |     100 |      100 |     100 |     100 |                   
  ca.js            |     100 |      100 |     100 |     100 |                   
  de.js            |     100 |      100 |     100 |     100 |                   
  en.js            |     100 |      100 |     100 |     100 |                   
  fr.js            |     100 |      100 |     100 |     100 |                   
  ja.js            |     100 |      100 |     100 |     100 |                   
  pt.js            |     100 |      100 |     100 |     100 |                   
  ru.js            |     100 |      100 |     100 |     100 |                   
  zh-TW.js         |     100 |      100 |     100 |     100 |                   
  zh.js            |     100 |      100 |     100 |     100 |                   
 ...nonInteractive |   72.57 |    71.12 |   74.07 |   72.57 |                   
  session.ts       |   76.64 |     69.4 |   85.71 |   76.64 | ...23-824,833-843 
  types.ts         |    42.5 |      100 |   33.33 |    42.5 | ...80-581,584-585 
 ...active/control |   77.04 |    88.23 |      80 |   77.04 |                   
  ...rolContext.ts |    7.14 |        0 |       0 |    7.14 | 49-84             
  ...Dispatcher.ts |   91.66 |    91.83 |   88.88 |   91.66 | ...54-372,388,391 
  ...rolService.ts |       8 |        0 |       0 |       8 | 46-179            
 ...ol/controllers |    7.04 |       80 |   13.33 |    7.04 |                   
  ...Controller.ts |   19.32 |      100 |      60 |   19.32 | 81-118,127-210    
  ...Controller.ts |       0 |        0 |       0 |       0 | 1-56              
  ...Controller.ts |    3.96 |      100 |   11.11 |    3.96 | ...61-379,389-494 
  ...Controller.ts |   14.06 |      100 |       0 |   14.06 | ...82-117,130-133 
  ...Controller.ts |    5.21 |      100 |       0 |    5.21 | ...21-433,442-471 
 .../control/types |       0 |        0 |       0 |       0 |                   
  serviceAPIs.ts   |       0 |        0 |       0 |       0 | 1                 
 ...Interactive/io |   97.98 |    93.72 |   95.18 |   97.98 |                   
  ...putAdapter.ts |   97.89 |    92.82 |   98.07 |   97.89 | ...1303,1398-1399 
  ...putAdapter.ts |      96 |    91.66 |   85.71 |      96 | 51-52             
  ...nputReader.ts |     100 |    94.73 |     100 |     100 | 67                
  ...putAdapter.ts |   98.28 |      100 |      90 |   98.28 | 81-82,122-123     
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/patches       |       0 |        0 |       0 |       0 |                   
  is-in-ci.ts      |       0 |        0 |       0 |       0 | 1-17              
 src/remoteInput   |   86.98 |       75 |   85.71 |   86.98 |                   
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  ...putWatcher.ts |   88.12 |    76.08 |   91.66 |   88.12 | ...21-222,233-236 
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/serve         |   79.92 |    79.13 |   92.17 |   79.92 |                   
  auth.ts          |   88.49 |    88.63 |     100 |   88.49 | ...49-150,153-155 
  capabilities.ts  |     100 |     90.9 |     100 |     100 | 264               
  debugMode.ts     |     100 |      100 |     100 |     100 |                   
  demo.ts          |     100 |      100 |     100 |     100 |                   
  envSnapshot.ts   |    92.3 |       84 |     100 |    92.3 | 108-111,170-177   
  eventBus.ts      |   88.88 |    89.39 |   85.71 |   88.88 | ...38-446,524-526 
  httpAcpBridge.ts |   78.38 |     77.5 |   95.49 |   78.38 | ...5253,5284-5325 
  ...oryChannel.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  loopbackBinds.ts |     100 |      100 |     100 |     100 |                   
  runQwenServe.ts  |   73.81 |    87.83 |   55.55 |   73.81 | ...87-703,728-730 
  server.ts        |   85.52 |    80.64 |   90.62 |   85.52 | ...2369,2434-2443 
  status.ts        |    93.5 |    96.96 |   88.88 |    93.5 | 369-376,574-575   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...paceAgents.ts |   64.87 |    70.45 |    90.9 |   64.87 | ...1306,1316-1326 
  ...paceMemory.ts |   87.13 |    78.46 |     100 |   87.13 | ...54-361,421-428 
 src/serve/auth    |   79.72 |    78.66 |   88.37 |   79.72 |                   
  deviceFlow.ts    |   96.08 |    78.37 |   97.29 |   96.08 | ...1345,1449,1519 
  ...owProvider.ts |      10 |      100 |   33.33 |      10 | ...43-281,293-304 
 src/serve/fs      |   84.86 |    79.67 |     100 |   84.86 |                   
  audit.ts         |     100 |    96.15 |     100 |     100 | 201               
  errors.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  paths.ts         |   78.26 |    76.76 |     100 |   78.26 | ...38,567-571,584 
  policy.ts        |   90.32 |    89.18 |     100 |   90.32 | 142-150           
  ...FileSystem.ts |   83.55 |    76.22 |     100 |   83.55 | ...1859,1886-1887 
 src/serve/routes  |   89.41 |       70 |     100 |   89.41 |                   
  ...ceFileRead.ts |   94.41 |    76.92 |     100 |   94.41 | ...28-329,390-392 
  ...eFileWrite.ts |    82.1 |    60.52 |     100 |    82.1 | ...42-244,247-249 
 src/services      |   91.67 |    91.21 |   97.56 |   91.67 |                   
  ...mandLoader.ts |     100 |    93.75 |     100 |     100 | 93                
  ...killLoader.ts |     100 |    96.15 |     100 |     100 | 47                
  ...andService.ts |    98.7 |      100 |     100 |    98.7 | 107               
  ...mandLoader.ts |   86.83 |    83.87 |     100 |   86.83 | ...30-335,340-345 
  ...omptLoader.ts |   75.84 |    80.64 |   83.33 |   75.84 | ...10-211,277-278 
  ...mandLoader.ts |     100 |      100 |     100 |     100 |                   
  ...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.21 |    96.66 |     100 |   98.21 | 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 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...ght/generators |    85.9 |    85.61 |   90.47 |    85.9 |                   
  DataProcessor.ts |   85.63 |     85.6 |   92.85 |   85.63 | ...1122,1126-1133 
  ...tGenerator.ts |   98.21 |    85.71 |     100 |   98.21 | 46                
  ...teRenderer.ts |   45.45 |      100 |       0 |   45.45 | 13-51             
 .../insight/types |       0 |       50 |      50 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 | 1                 
 ...mpt-processors |   97.27 |    94.04 |     100 |   97.27 |                   
  ...tProcessor.ts |     100 |      100 |     100 |     100 |                   
  ...eProcessor.ts |   94.52 |    84.21 |     100 |   94.52 | 46-47,93-94       
  ...tionParser.ts |     100 |      100 |     100 |     100 |                   
  ...lProcessor.ts |   97.41 |    95.65 |     100 |   97.41 | 95-98             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services/tips |   97.35 |    83.07 |     100 |   97.35 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  tipHistory.ts    |   92.45 |       70 |     100 |   92.45 | ...22,144,151,160 
  tipRegistry.ts   |     100 |    95.23 |     100 |     100 | 33                
  tipScheduler.ts  |     100 |    91.66 |     100 |     100 | 55                
 src/test-utils    |   93.75 |    83.33 |      80 |   93.75 |                   
  ...omMatchers.ts |   69.69 |       50 |      50 |   69.69 | 32-35,37-39,45-47 
  ...andContext.ts |     100 |      100 |     100 |     100 |                   
  render.tsx       |     100 |      100 |     100 |     100 |                   
 src/ui            |   66.51 |    73.28 |   57.89 |   66.51 |                   
  App.tsx          |     100 |      100 |     100 |     100 |                   
  AppContainer.tsx |   65.03 |    64.98 |   52.94 |   65.03 | ...2951,2955-2959 
  ...tionNudge.tsx |    9.58 |      100 |       0 |    9.58 | 24-94             
  ...ackDialog.tsx |   29.23 |      100 |       0 |   29.23 | 25-75             
  ...tionNudge.tsx |    7.69 |      100 |       0 |    7.69 | 25-103            
  colors.ts        |   52.72 |      100 |   23.52 |   52.72 | ...52,54-55,60-61 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  keyMatchers.ts   |   95.91 |    97.05 |     100 |   95.91 | 25-26             
  ...tic-colors.ts |     100 |      100 |     100 |     100 |                   
  ...inePresets.ts |   98.17 |    88.88 |     100 |   98.17 | ...12,239,387-389 
  textConstants.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/auth       |   55.06 |    51.13 |   35.48 |   55.06 |                   
  AuthDialog.tsx   |   64.26 |    44.44 |   16.66 |   64.26 | ...59,366-388,392 
  ...nProgress.tsx |       0 |        0 |       0 |       0 | 1-64              
  ...etupSteps.tsx |    39.5 |       32 |   38.46 |    39.5 | ...69,472,478,481 
  useAuth.ts       |   76.63 |    68.29 |     100 |   76.63 | ...48,493-499,560 
  ...rSetupFlow.ts |   44.61 |    33.33 |      50 |   44.61 | ...57-378,395-438 
 src/ui/commands   |   73.46 |    81.23 |   81.61 |   73.46 |                   
  aboutCommand.ts  |     100 |      100 |     100 |     100 |                   
  agentsCommand.ts |   83.78 |      100 |      60 |   83.78 | 30-32,42-44       
  ...odeCommand.ts |     100 |      100 |     100 |     100 |                   
  arenaCommand.ts  |   62.81 |    58.73 |   65.21 |   62.81 | ...91-596,681-689 
  authCommand.ts   |     100 |      100 |     100 |     100 |                   
  branchCommand.ts |     100 |      100 |     100 |     100 |                   
  btwCommand.ts    |   95.59 |    71.42 |     100 |   95.59 | 72,154-159        
  bugCommand.ts    |   81.13 |    71.42 |     100 |   81.13 | 60-69             
  clearCommand.ts  |      92 |    76.47 |     100 |      92 | 43-44,72-73,91-92 
  ...essCommand.ts |    64.7 |       50 |      75 |    64.7 | ...48-149,163-166 
  ...extCommand.ts |   34.78 |    22.22 |   45.45 |   34.78 | ...86-521,532-533 
  copyCommand.ts   |   98.28 |    94.89 |     100 |   98.28 | ...80,280,321,327 
  deleteCommand.ts |     100 |      100 |     100 |     100 |                   
  diffCommand.ts   |   99.02 |    86.11 |     100 |   99.02 | 222,226           
  ...ryCommand.tsx |   68.09 |    77.77 |   77.77 |   68.09 | ...56-261,315-323 
  docsCommand.ts   |     100 |    88.88 |     100 |     100 | 25                
  doctorCommand.ts |   95.06 |    88.28 |     100 |   95.06 | ...92-293,320-321 
  dreamCommand.ts  |      75 |    66.66 |   66.66 |      75 | 22-27,44-47       
  editorCommand.ts |     100 |      100 |     100 |     100 |                   
  exportCommand.ts |   98.25 |    91.02 |     100 |   98.25 | ...81,198-199,364 
  ...onsCommand.ts |   48.66 |     90.9 |   63.63 |   48.66 | ...05-109,159-211 
  forgetCommand.ts |   26.82 |      100 |      50 |   26.82 | 18-51             
  goalCommand.ts   |   91.25 |    83.33 |      90 |   91.25 | ...83-186,198-201 
  helpCommand.ts   |     100 |      100 |     100 |     100 |                   
  hooksCommand.ts  |    20.4 |       40 |      40 |    20.4 | ...48-180,204-205 
  ideCommand.ts    |   60.75 |    64.28 |   41.17 |   60.75 | ...05-306,310-324 
  initCommand.ts   |   84.33 |    72.72 |     100 |   84.33 | 68,82-87,89-94    
  ...ghtCommand.ts |   74.56 |    68.42 |     100 |   74.56 | ...31-245,250-273 
  ...ageCommand.ts |   92.17 |    82.69 |     100 |   92.17 | ...43,164,173-183 
  lspCommand.ts    |     100 |    86.95 |     100 |     100 | 31,101-102        
  ...elsCommand.ts |     100 |      100 |     100 |     100 |                   
  mcpCommand.ts    |     100 |      100 |     100 |     100 |                   
  memoryCommand.ts |     100 |      100 |     100 |     100 |                   
  modelCommand.ts  |   75.09 |    78.18 |      75 |   75.09 | ...20-225,262-267 
  ...onsCommand.ts |     100 |      100 |     100 |     100 |                   
  planCommand.ts   |   78.82 |    76.92 |     100 |   78.82 | 30-35,51-56,68-73 
  quitCommand.ts   |     100 |      100 |     100 |     100 |                   
  recapCommand.ts  |   21.81 |      100 |      50 |   21.81 | 24-73             
  ...berCommand.ts |   32.43 |      100 |      50 |   32.43 | 23-57             
  renameCommand.ts |   85.71 |    86.04 |     100 |   85.71 | ...02-209,216-221 
  ...oreCommand.ts |    92.3 |    87.87 |     100 |    92.3 | ...,83-88,129-130 
  resumeCommand.ts |     100 |      100 |     100 |     100 |                   
  rewindCommand.ts |      80 |      100 |      50 |      80 | 19-21             
  ...ngsCommand.ts |     100 |      100 |     100 |     100 |                   
  ...hubCommand.ts |   81.43 |    65.21 |      80 |   81.43 | ...70-173,176-179 
  skillsCommand.ts |   15.04 |      100 |      25 |   15.04 | ...90-106,109-136 
  statsCommand.ts  |   88.19 |    84.21 |     100 |   88.19 | ...,58-61,143-146 
  ...ineCommand.ts |     100 |      100 |     100 |     100 |                   
  ...aryCommand.ts |    6.46 |      100 |      50 |    6.46 | 31-329            
  tasksCommand.ts  |   77.22 |    72.13 |     100 |   77.22 | ...46-150,172-177 
  ...tupCommand.ts |     100 |      100 |     100 |     100 |                   
  themeCommand.ts  |     100 |      100 |     100 |     100 |                   
  toolsCommand.ts  |     100 |      100 |     100 |     100 |                   
  trustCommand.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  vimCommand.ts    |   54.54 |      100 |      50 |   54.54 | 19-29             
 src/ui/components |   65.63 |    75.02 |   69.74 |   65.63 |                   
  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    |   89.39 |       75 |     100 |   89.39 | 35,37-42,44       
  ...odeDialog.tsx |     9.7 |      100 |       0 |     9.7 | 35-47,50-182      
  AsciiArt.ts      |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |   14.63 |      100 |       0 |   14.63 | 18-56             
  ...TextInput.tsx |   77.01 |       76 |     100 |   77.01 | ...20,234-236,263 
  Composer.tsx     |    80.8 |     64.7 |     100 |    80.8 | ...85,103,154,167 
  ...entPrompt.tsx |     100 |      100 |     100 |     100 |                   
  ...ryDisplay.tsx |   75.89 |    62.06 |     100 |   75.89 | ...,88,93-108,113 
  ...geDisplay.tsx |   68.42 |    57.14 |     100 |   68.42 | 16-17,31-32,42-50 
  ...ification.tsx |   28.57 |      100 |       0 |   28.57 | 16-36             
  ...gProfiler.tsx |       0 |        0 |       0 |       0 | 1-36              
  ...ogManager.tsx |    12.2 |      100 |       0 |    12.2 | 64-490            
  ...ngsDialog.tsx |    8.44 |      100 |       0 |    8.44 | 37-195            
  ExitWarning.tsx  |     100 |      100 |     100 |     100 |                   
  ...hProgress.tsx |    87.8 |    33.33 |     100 |    87.8 | 28-31,56          
  ...ustDialog.tsx |     100 |      100 |     100 |     100 |                   
  Footer.tsx       |   79.54 |    54.54 |     100 |   79.54 | ...05-109,133-134 
  ...ngSpinner.tsx |   68.42 |       80 |      50 |   68.42 | 35-52,73,80-81    
  GoalPill.tsx     |   76.19 |    81.81 |     100 |   76.19 | 24-30,46-50       
  Header.tsx       |   98.62 |    94.28 |     100 |   98.62 | 162,164           
  Help.tsx         |   98.32 |    89.88 |     100 |   98.32 | ...24,381,447-448 
  ...emDisplay.tsx |    61.7 |       36 |     100 |    61.7 | ...42,345,348-354 
  ...ngeDialog.tsx |     100 |      100 |     100 |     100 |                   
  InputPrompt.tsx  |   82.75 |    78.96 |   83.33 |   82.75 | ...1425,1490,1540 
  ...Shortcuts.tsx |   20.87 |      100 |       0 |   20.87 | ...6,49-51,67-125 
  ...Indicator.tsx |     100 |    91.42 |     100 |     100 | 65,74             
  ...firmation.tsx |   91.42 |      100 |      50 |   91.42 | 26-31             
  MainContent.tsx  |   81.75 |       75 |     100 |   81.75 | ...70-274,282-286 
  ...elsDialog.tsx |   71.05 |    69.11 |   72.72 |   71.05 | ...77,590,601-603 
  MemoryDialog.tsx |    55.1 |    54.54 |   57.14 |    55.1 | ...56,368,381-383 
  ...geDisplay.tsx |       0 |        0 |       0 |       0 | 1-41              
  ModelDialog.tsx  |   80.12 |    63.55 |     100 |   80.12 | ...39-555,612-616 
  ...tsDisplay.tsx |     100 |    97.22 |     100 |     100 | 270               
  ...fications.tsx |   18.18 |      100 |       0 |   18.18 | 15-58             
  ...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           
  ...dSelector.tsx |   41.26 |    61.53 |   71.42 |   41.26 | ...74-472,476-520 
  ...ionPicker.tsx |   83.66 |    72.13 |     100 |   83.66 | ...96,402,444-466 
  ...onPreview.tsx |   92.42 |    84.37 |     100 |   92.42 | ...,70-71,143-145 
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...putPrompt.tsx |   72.56 |       80 |      40 |   72.56 | ...06-109,114-117 
  ...ngsDialog.tsx |   66.27 |    71.16 |      75 |   66.27 | ...12-820,826-827 
  ...ionDialog.tsx |    87.8 |      100 |   33.33 |    87.8 | 36-39,44-51       
  ...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             
  ...ionPicker.tsx |   17.59 |      100 |       0 |   17.59 | 55-172            
  StatsDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ineDialog.tsx |   93.69 |    83.92 |     100 |   93.69 | ...11,273,293-295 
  ...yTodoList.tsx |   94.17 |       80 |     100 |   94.17 | 56-57,131-134     
  ...nsDisplay.tsx |   87.25 |       64 |     100 |   87.25 | ...45-147,154-156 
  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 |    81.81 |     100 |     100 | 71-86             
  ...ification.tsx |   36.36 |      100 |       0 |   36.36 | 15-22             
  ...ackDialog.tsx |    7.84 |      100 |       0 |    7.84 | 24-134            
 ...nts/agent-view |   38.33 |    70.83 |   36.36 |   38.33 |                   
  ...atContent.tsx |    8.79 |      100 |       0 |    8.79 | 53-265,271-273    
  ...tChatView.tsx |   21.05 |      100 |       0 |   21.05 | 21-39             
  ...tComposer.tsx |    9.95 |      100 |       0 |    9.95 | 57-308            
  AgentFooter.tsx  |   17.07 |      100 |       0 |   17.07 | 28-66             
  AgentHeader.tsx  |   15.38 |      100 |       0 |   15.38 | 27-64             
  AgentTabBar.tsx  |    87.8 |    27.27 |     100 |    87.8 | ...,85,98-106,124 
  ...oryAdapter.ts |     100 |    91.83 |     100 |     100 | 103,109-110,138   
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
 ...mponents/arena |   45.72 |    70.53 |   60.86 |   45.72 |                   
  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 |   10.15 |      100 |       0 |   10.15 | 27-161            
  ...tusDialog.tsx |    5.63 |      100 |       0 |    5.63 | 33-75,80-288      
  ...topDialog.tsx |    6.17 |      100 |       0 |    6.17 | 33-213            
 ...ackground-view |   75.63 |    84.44 |   85.29 |   75.63 |                   
  ...sksDialog.tsx |   70.92 |    80.39 |   76.19 |   70.92 | ...1118,1194-1196 
  ...TasksPill.tsx |   63.75 |    86.95 |     100 |   63.75 | 44,86-106,114-122 
  ...gentPanel.tsx |   99.53 |    93.18 |     100 |   99.53 | 123               
 ...nts/extensions |   45.28 |    33.33 |      60 |   45.28 |                   
  ...gerDialog.tsx |   44.31 |    34.14 |      75 |   44.31 | ...71-480,483-488 
  index.ts         |       0 |        0 |       0 |       0 | 1-9               
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...tensions/steps |   54.88 |    94.23 |   66.66 |   54.88 |                   
  ...ctionStep.tsx |   95.12 |    92.85 |   85.71 |   95.12 | 84-86,89          
  ...etailStep.tsx |    6.18 |      100 |       0 |    6.18 | 17-128            
  ...nListStep.tsx |   88.43 |    94.73 |      80 |   88.43 | 52-53,59-72,106   
  ...electStep.tsx |   13.46 |      100 |       0 |   13.46 | 20-70             
  ...nfirmStep.tsx |   19.56 |      100 |       0 |   19.56 | 23-65             
  index.ts         |     100 |      100 |     100 |     100 |                   
 ...mponents/hooks |   68.67 |    69.07 |   69.56 |   68.67 |                   
  ...etailStep.tsx |   74.68 |    66.66 |   66.66 |   74.68 | ...71-184,188-201 
  ...etailStep.tsx |    87.4 |    73.68 |     100 |    87.4 | 41-42,99-113,119  
  ...abledStep.tsx |     100 |      100 |     100 |     100 |                   
  ...sListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   34.51 |    47.05 |   42.85 |   34.51 | ...78,482-495,499 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-13              
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...components/mcp |   20.98 |    86.36 |   83.33 |   20.98 |                   
  ...ealthPill.tsx |   68.42 |    85.71 |     100 |   68.42 | 40-46             
  ...entDialog.tsx |    3.64 |      100 |       0 |    3.64 | 41-717            
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-30              
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |   95.83 |    88.88 |     100 |   95.83 | 16,20,109-110     
 ...ents/mcp/steps |   26.74 |    54.54 |   42.85 |   26.74 |                   
  ...icateStep.tsx |    5.88 |      100 |       0 |    5.88 | 40-55,58-296      
  ...electStep.tsx |   10.95 |      100 |       0 |   10.95 | 16-88             
  ...etailStep.tsx |    5.26 |      100 |       0 |    5.26 | 31-247            
  ...rListStep.tsx |   75.18 |    59.37 |     100 |   75.18 | ...53-158,169-173 
  ...etailStep.tsx |   10.41 |      100 |       0 |   10.41 | ...1,67-79,82-139 
  ToolListStep.tsx |   69.02 |       50 |     100 |   69.02 | ...22,125,134-143 
 ...nents/messages |   82.44 |    79.55 |    72.6 |   82.44 |                   
  ...ionDialog.tsx |   80.84 |     77.6 |    62.5 |   80.84 | ...98,516,534-536 
  BtwMessage.tsx   |     100 |      100 |     100 |     100 |                   
  ...upDisplay.tsx |   97.67 |    83.72 |     100 |   97.67 | 119,142,150       
  ...onMessage.tsx |   91.93 |    82.35 |     100 |   91.93 | 57-59,61,63       
  ...nMessages.tsx |   79.06 |      100 |      70 |   79.06 | ...51-264,268-280 
  DiffRenderer.tsx |   93.19 |    86.17 |     100 |   93.19 | ...09,237-238,304 
  ...tsDisplay.tsx |   97.82 |    77.27 |     100 |   97.82 | 87,89             
  ...usMessage.tsx |   76.31 |     42.1 |   66.66 |   76.31 | ...99,101,124,155 
  ...ssMessage.tsx |    12.5 |      100 |       0 |    12.5 | 18-59             
  ...edMessage.tsx |   16.66 |      100 |       0 |   16.66 | 22-38             
  ...sMessages.tsx |   55.67 |       40 |   28.57 |   55.67 | ...20-125,133-145 
  ...ryMessage.tsx |   14.28 |      100 |       0 |   14.28 | 23-62             
  ...onMessage.tsx |   81.02 |    69.23 |   33.33 |   81.02 | ...24-426,433-435 
  ...upMessage.tsx |      84 |    93.61 |     100 |      84 | ...56-383,405-420 
  ToolMessage.tsx  |   88.84 |    75.71 |    92.3 |   88.84 | ...44-749,776-778 
 ...ponents/shared |   85.36 |    78.48 |   95.77 |   85.36 |                   
  ...ctionList.tsx |   99.03 |    95.65 |     100 |   99.03 | 85                
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  EnumSelector.tsx |     100 |    96.42 |     100 |     100 | 58                
  MaxSizedBox.tsx  |   83.01 |    86.25 |   88.88 |   83.01 | ...12-513,618-619 
  MultiSelect.tsx  |   84.31 |    74.19 |     100 |   84.31 | ...37,193-195,205 
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  ...eSelector.tsx |     100 |       60 |     100 |     100 | 40-45             
  TextInput.tsx    |   77.01 |    48.78 |      80 |   77.01 | ...08-212,224-230 
  ...apsedTime.tsx |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |     100 |      100 |     100 |     100 |                   
  text-buffer.ts   |   83.68 |    78.55 |   97.61 |   83.68 | ...2270-2272,2368 
  ...er-actions.ts |   86.71 |    67.79 |     100 |   86.71 | ...07-608,809-811 
 ...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.51 |    59.52 |   27.27 |   21.51 |                   
  ...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.42 |    59.52 |     100 |   35.42 | ...20-432,437-439 
  ...iewerStep.tsx |   13.72 |      100 |       0 |   13.72 | 18-73             
  ...gerDialog.tsx |    6.74 |      100 |       0 |    6.74 | 35-341            
 ...mponents/views |   42.16 |    69.23 |   21.42 |   42.16 |                   
  ContextUsage.tsx |     4.7 |      100 |       0 |     4.7 | ...52-167,170-456 
  DoctorReport.tsx |     9.8 |      100 |       0 |     9.8 | 25-54,57-131      
  ...sionsList.tsx |   87.69 |    73.68 |     100 |   87.69 | 65-72             
  McpStatus.tsx    |   89.53 |    60.52 |     100 |   89.53 | ...72,175-177,262 
  SkillsList.tsx   |   27.27 |      100 |       0 |   27.27 | 18-35             
  ToolsList.tsx    |     100 |      100 |     100 |     100 |                   
 src/ui/contexts   |   77.11 |    77.66 |   80.35 |   77.11 |                   
  ...ewContext.tsx |    64.7 |    85.71 |      50 |    64.7 | ...22-225,231-241 
  AppContext.tsx   |      80 |       50 |     100 |      80 | 19-20             
  ...ewContext.tsx |   95.18 |    67.56 |      50 |   95.18 | ...94-195,222-226 
  ...deContext.tsx |     100 |      100 |     100 |     100 |                   
  ...igContext.tsx |   81.81 |       50 |     100 |   81.81 | 15-16             
  ...ssContext.tsx |   81.88 |    82.26 |     100 |   81.88 | ...1153,1159-1161 
  ...owContext.tsx |   89.28 |       80 |   66.66 |   89.28 | 34,47-48,60-62    
  ...deContext.tsx |     100 |      100 |      50 |     100 |                   
  ...onContext.tsx |   43.28 |     62.5 |    62.5 |   43.28 | ...56-259,263-266 
  ...gsContext.tsx |   83.33 |       50 |     100 |   83.33 | 17-18             
  ...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             
  ...nsContext.tsx |   88.23 |       50 |     100 |   88.23 | 113-114           
  ...teContext.tsx |   86.66 |       50 |     100 |   86.66 | 177-178           
  ...deContext.tsx |   76.08 |    72.72 |     100 |   76.08 | 47-48,52-59,77-78 
 src/ui/daemon     |   90.76 |    73.73 |   95.45 |   90.76 |                   
  ...TuiAdapter.ts |   90.76 |    73.73 |   95.45 |   90.76 | ...53,771-772,858 
 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      |   82.44 |    82.53 |   86.66 |   82.44 |                   
  ...dProcessor.ts |   83.12 |    82.56 |     100 |   83.12 | ...88-389,408-435 
  keyToAnsi.ts     |    3.92 |      100 |       0 |    3.92 | 19-77             
  ...dProcessor.ts |    94.8 |    70.58 |     100 |    94.8 | ...76-277,282-283 
  ...dProcessor.ts |   75.75 |    63.01 |   61.53 |   75.75 | ...84,908,927-931 
  ...amingState.ts |   12.22 |      100 |       0 |   12.22 | 54-157            
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...ationFrame.ts |      32 |       60 |     100 |      32 | 42-44,51-90       
  ...odeCommand.ts |   58.82 |      100 |     100 |   58.82 | 28,33-48          
  ...enaCommand.ts |      85 |      100 |     100 |      85 | 23-24,29          
  ...aInProcess.ts |   19.81 |    66.66 |      25 |   19.81 | 57-175            
  ...Completion.ts |   92.77 |    89.09 |     100 |   92.77 | ...86-187,220-223 
  ...ifications.ts |   92.07 |    96.29 |     100 |   92.07 | 116-124           
  ...tIndicator.ts |     100 |    93.75 |     100 |     100 | 63                
  ...waySummary.ts |   96.22 |    69.69 |     100 |   96.22 | 125-127,169       
  ...ndTaskView.ts |   94.21 |    76.08 |     100 |   94.21 | 122-126,213,219   
  ...ketedPaste.ts |    23.8 |      100 |       0 |    23.8 | 19-37             
  ...nchCommand.ts |   94.36 |    74.35 |     100 |   94.36 | ...60,168-169,209 
  ...ompletion.tsx |   95.95 |    82.75 |     100 |   95.95 | ...22-223,225-226 
  ...dMigration.ts |   90.62 |       75 |     100 |   90.62 | 38-40             
  useCompletion.ts |    92.4 |     87.5 |     100 |    92.4 | 68-69,93-94,98-99 
  ...nitMessage.ts |     100 |      100 |     100 |     100 |                   
  ...extualTips.ts |   76.92 |       50 |     100 |   76.92 | 55,68,71-75,88-96 
  ...eteCommand.ts |   78.53 |    88.57 |     100 |   78.53 | ...96-104,112-113 
  ...ialogClose.ts |   15.38 |      100 |     100 |   15.38 | 83-148            
  ...oublePress.ts |   53.12 |       75 |     100 |   53.12 | 33-35,41-54       
  ...orSettings.ts |     100 |      100 |     100 |     100 |                   
  ...Completion.ts |   99.12 |     97.7 |     100 |   99.12 | 182-183           
  ...ionUpdates.ts |   93.45 |     92.3 |     100 |   93.45 | ...83-287,300-306 
  ...agerDialog.ts |   88.88 |      100 |     100 |   88.88 | 21,25             
  ...backDialog.ts |   54.47 |       50 |   33.33 |   54.47 | ...69-171,193-194 
  useFocus.ts      |     100 |      100 |     100 |     100 |                   
  ...olderTrust.ts |     100 |      100 |     100 |     100 |                   
  ...ggestions.tsx |   89.15 |     62.5 |      50 |   89.15 | ...22-124,149-150 
  ...miniStream.ts |   77.38 |    74.63 |   91.66 |   77.38 | ...2465,2478-2486 
  ...BranchName.ts |    90.9 |     92.3 |     100 |    90.9 | 19-20,55-58       
  ...oryManager.ts |   93.15 |    93.75 |     100 |   93.15 | 44,107-110        
  ...ooksDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...stListener.ts |     100 |      100 |     100 |     100 |                   
  ...nAuthError.ts |   76.19 |       50 |     100 |   76.19 | 39-40,43-45       
  ...putHistory.ts |   92.59 |    85.71 |     100 |   92.59 | 63-64,72,94-96    
  ...storyStore.ts |     100 |    94.11 |     100 |     100 | 69                
  useKeypress.ts   |     100 |      100 |     100 |     100 |                   
  ...rdProtocol.ts |   36.36 |      100 |       0 |   36.36 | 24-31             
  ...unchEditor.ts |    9.67 |      100 |       0 |    9.67 | 11-32,39-90       
  ...gIndicator.ts |     100 |      100 |     100 |     100 |                   
  useLogger.ts     |   21.05 |      100 |       0 |   21.05 | 15-37             
  useMCPHealth.ts  |   63.15 |       75 |      50 |   63.15 | 42-52,64-67       
  ...elsCommand.ts |     100 |      100 |     100 |     100 |                   
  useMcpDialog.ts  |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...moryDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...oryMonitor.ts |     100 |      100 |     100 |     100 |                   
  ...ssageQueue.ts |     100 |      100 |     100 |     100 |                   
  ...delCommand.ts |     100 |       75 |     100 |     100 | 22                
  ...raseCycler.ts |   84.74 |    76.47 |     100 |   84.74 | ...49,52-53,69-71 
  ...derUpdates.ts |   86.38 |    77.19 |     100 |   86.38 | ...22,281-293,341 
  useQwenAuth.ts   |     100 |      100 |     100 |     100 |                   
  ...lScheduler.ts |    84.7 |    93.33 |     100 |    84.7 | ...71-276,372-382 
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-7               
  ...umeCommand.ts |   97.08 |    83.33 |     100 |   97.08 | 103-104,133       
  ...ompletion.tsx |   90.59 |    83.33 |     100 |   90.59 | ...01,104,137-140 
  ...ectionList.ts |   96.98 |    95.65 |     100 |   96.98 | ...83-184,238-241 
  ...sionPicker.ts |   92.87 |    90.35 |     100 |   92.87 | ...99-501,503-505 
  ...earchInput.ts |     100 |      100 |     100 |     100 |                   
  ...ngsCommand.ts |   18.75 |      100 |       0 |   18.75 | 10-25             
  ...ellHistory.ts |   91.74 |    79.41 |     100 |   91.74 | ...74,122-123,133 
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-73              
  ...Completion.ts |   82.67 |    85.41 |   94.73 |   82.67 | ...68-670,678-714 
  ...tateAndRef.ts |     100 |      100 |     100 |     100 |                   
  useStatusLine.ts |   97.67 |    91.66 |     100 |   97.67 | ...28-332,344-347 
  ...eateDialog.ts |   88.23 |      100 |     100 |   88.23 | 14,18             
  ...tification.ts |     100 |    85.71 |     100 |     100 | 47                
  ...alProgress.ts |   53.06 |       50 |   66.66 |   53.06 | ...53,61-68,79-85 
  ...rminalSize.ts |   76.19 |      100 |      50 |   76.19 | 21-25             
  ...emeCommand.ts |   67.01 |    29.41 |     100 |   67.01 | ...10-111,115-116 
  useTimer.ts      |   88.09 |    85.71 |     100 |   88.09 | 44-45,51-53       
  ...lMigration.ts |       0 |        0 |       0 |       0 |                   
  ...rustModify.ts |     100 |      100 |     100 |     100 |                   
  ...elcomeBack.ts |   87.36 |     90.9 |     100 |   87.36 | ...,94-96,114-115 
  vim.ts           |   83.77 |    80.31 |     100 |   83.77 | ...55,759-767,776 
 src/ui/layouts    |   89.72 |     87.5 |     100 |   89.72 |                   
  ...AppLayout.tsx |   89.88 |     87.5 |     100 |   89.88 | 51-53,93-98       
  ...AppLayout.tsx |   89.47 |     87.5 |     100 |   89.47 | 58-63             
 ...i/manageModels |   93.61 |       48 |     100 |   93.61 |                   
  manageModels.ts  |   93.61 |       48 |     100 |   93.61 | ...63-166,179,209 
 src/ui/models     |   80.24 |    79.16 |   71.42 |   80.24 |                   
  ...ableModels.ts |   80.24 |    79.16 |   71.42 |   80.24 | ...,61-71,123-125 
 ...noninteractive |     100 |      100 |    7.14 |     100 |                   
  ...eractiveUi.ts |     100 |      100 |    7.14 |     100 |                   
 src/ui/state      |   94.91 |    81.81 |     100 |   94.91 |                   
  extensions.ts    |   94.91 |    81.81 |     100 |   94.91 | 68-69,88          
 src/ui/themes     |   98.53 |    70.58 |     100 |   98.53 |                   
  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   |     100 |      100 |     100 |     100 |                   
  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 |   87.98 |    82.89 |     100 |   87.98 | ...48-357,362-363 
  theme.ts         |     100 |    38.02 |     100 |     100 | ...34-449,457-461 
  xcode.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/utils      |   83.92 |    82.91 |   92.56 |   83.92 |                   
  ...Colorizer.tsx |   79.53 |    83.78 |     100 |   79.53 | ...51-152,249-275 
  ...nRenderer.tsx |   68.83 |    70.14 |      50 |   68.83 | ...52-254,274-293 
  ...wnDisplay.tsx |   86.01 |    87.41 |     100 |   86.01 | ...87,704,729-754 
  ...idDiagram.tsx |   87.79 |    95.34 |     100 |   87.79 | 156-179           
  ...eRenderer.tsx |   92.08 |    80.45 |      95 |   92.08 | ...76-679,723-728 
  ...dWorkUtils.ts |     100 |      100 |     100 |     100 |                   
  ...boardUtils.ts |   59.61 |    58.82 |     100 |   59.61 | ...,86-88,107-149 
  commandUtils.ts  |    95.9 |    88.42 |     100 |    95.9 | ...62,164-165,289 
  computeStats.ts  |     100 |      100 |     100 |     100 |                   
  customBanner.ts  |   90.68 |    91.22 |     100 |   90.68 | ...13,324-327,334 
  displayUtils.ts  |   88.37 |    72.22 |     100 |   88.37 | 23,25,29,31,33    
  formatters.ts    |   95.23 |    98.27 |     100 |   95.23 | 117-120           
  gradientUtils.ts |     100 |      100 |     100 |     100 |                   
  highlight.ts     |     100 |      100 |     100 |     100 |                   
  ...oryMapping.ts |     100 |    94.28 |     100 |     100 | 29,51             
  historyUtils.ts  |   94.11 |       94 |     100 |   94.11 | 94-97             
  isNarrowWidth.ts |     100 |      100 |     100 |     100 |                   
  ...olDetector.ts |    8.23 |      100 |       0 |    8.23 | ...31-132,135-136 
  latexRenderer.ts |   94.95 |     73.8 |     100 |   94.95 | ...76-178,184-187 
  layoutUtils.ts   |     100 |      100 |     100 |     100 |                   
  ...ightLoader.ts |     100 |    89.47 |     100 |     100 | 81,110            
  ...nUtilities.ts |   69.84 |    85.71 |     100 |   69.84 | 75-91,100-101     
  ...ToolGroups.ts |   98.66 |    96.77 |     100 |   98.66 | 48-49             
  ...geRenderer.ts |   86.23 |    69.06 |   95.12 |   86.23 | ...1284,1324-1330 
  ...alRenderer.ts |   86.69 |     71.9 |     100 |   86.69 | ...1476,1513-1519 
  ...lsBySource.ts |     100 |    95.23 |     100 |     100 | 84                
  osc8.ts          |   94.71 |    87.41 |     100 |   94.71 | ...43,428,432-433 
  ...mConstants.ts |     100 |      100 |     100 |     100 |                   
  restoreGoal.ts   |   98.98 |    97.05 |     100 |   98.98 | 98                
  ...storyUtils.ts |   61.89 |    69.87 |      90 |   61.89 | ...76,424,429-451 
  ...ickerUtils.ts |     100 |      100 |     100 |     100 |                   
  ...izedOutput.ts |   94.94 |      100 |   88.88 |   94.94 | 112-117           
  ...wOptimizer.ts |     100 |    96.77 |     100 |     100 | 69                
  terminalSetup.ts |    4.37 |      100 |       0 |    4.37 | 44-393            
  textUtils.ts     |   97.35 |    94.38 |   91.66 |   97.35 | ...50-251,386-387 
  todoSnapshot.ts  |   89.11 |    93.33 |     100 |   89.11 | ...,66-78,180-181 
  updateCheck.ts   |     100 |    80.95 |     100 |     100 | 30-42             
 ...i/utils/export |   56.77 |     40.8 |   79.41 |   56.77 |                   
  collect.ts       |   55.92 |    50.58 |   86.36 |   55.92 | ...25-640,642-647 
  index.ts         |     100 |      100 |     100 |     100 |                   
  normalize.ts     |   57.47 |    20.51 |      80 |   57.47 | ...09-310,324-359 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
  utils.ts         |      40 |      100 |       0 |      40 | 11-13             
 ...ort/formatters |    3.38 |      100 |       0 |    3.38 |                   
  html.ts          |    9.61 |      100 |       0 |    9.61 | ...28,34-76,82-84 
  json.ts          |      50 |      100 |       0 |      50 | 14-15             
  jsonl.ts         |     3.5 |      100 |       0 |     3.5 | 14-76             
  markdown.ts      |    0.94 |      100 |       0 |    0.94 | 13-295            
 src/utils         |   76.06 |    89.51 |   93.82 |   76.06 |                   
  acpModelUtils.ts |     100 |      100 |     100 |     100 |                   
  apiPreconnect.ts |   96.72 |    97.14 |     100 |   96.72 | 165-168           
  checks.ts        |   33.33 |      100 |       0 |   33.33 | 23-28             
  cleanup.ts       |   84.12 |    93.33 |      80 |   84.12 | 75,106-115        
  commands.ts      |     100 |      100 |     100 |     100 |                   
  commentJson.ts   |   87.17 |     90.9 |     100 |   87.17 | 64-73             
  ...Calculator.ts |     100 |      100 |     100 |     100 |                   
  deepMerge.ts     |     100 |       90 |     100 |     100 | 41-43,49          
  ...ScopeUtils.ts |   97.56 |    88.88 |     100 |   97.56 | 67                
  doctorChecks.ts  |   71.06 |       75 |     100 |   71.06 | ...95-301,325-341 
  ...putCapture.ts |   90.65 |    86.17 |     100 |   90.65 | ...72,370,372-373 
  ...arResolver.ts |   94.28 |       88 |     100 |   94.28 | 28-29,125-126     
  errors.ts        |   98.67 |    96.36 |     100 |   98.67 | 67-68             
  events.ts        |     100 |      100 |     100 |     100 |                   
  gitUtils.ts      |   91.91 |    84.61 |     100 |   91.91 | 78-81,124-127     
  ...AutoUpdate.ts |   90.76 |    93.33 |   88.88 |   90.76 | 103-114           
  ...lationInfo.ts |     100 |      100 |     100 |     100 |                   
  languageUtils.ts |   97.89 |    96.42 |     100 |   97.89 | 132-133           
  math.ts          |       0 |        0 |       0 |       0 | 1-15              
  ...iagnostics.ts |   94.57 |    83.01 |   88.88 |   94.57 | ...05,311,315-317 
  ...onfigUtils.ts |     100 |      100 |     100 |     100 |                   
  ...iveHelpers.ts |   96.79 |    93.28 |     100 |   96.79 | ...76-477,575,588 
  osc.ts           |    97.5 |      100 |   88.88 |    97.5 | 195-196           
  package.ts       |   88.88 |       80 |     100 |   88.88 | 33-34             
  processUtils.ts  |     100 |      100 |     100 |     100 |                   
  readStdin.ts     |   79.62 |       90 |      80 |   79.62 | 33-40,52-54       
  relaunch.ts      |   98.07 |    76.92 |     100 |   98.07 | 70                
  resolvePath.ts   |   66.66 |       25 |     100 |   66.66 | 12-13,16,18-19    
  sandbox.ts       |       0 |        0 |       0 |       0 | 1-1047            
  settingsUtils.ts |   82.89 |    90.67 |   89.47 |   82.89 | ...52-663,670-678 
  spawnWrapper.ts  |     100 |      100 |     100 |     100 |                   
  ...upProfiler.ts |   98.46 |    94.52 |     100 |   98.46 | 130-131,305       
  ...upWarnings.ts |     100 |      100 |     100 |     100 |                   
  stdioHelpers.ts  |     100 |       60 |     100 |     100 | 23,32             
  systemInfo.ts    |   95.12 |    89.06 |     100 |   95.12 | ...43-244,249-253 
  ...InfoFields.ts |   87.61 |       65 |     100 |   87.61 | ...22-123,144-145 
  ...iffPreview.ts |   94.11 |    83.33 |     100 |   94.11 | 13                
  ...entEmitter.ts |     100 |      100 |     100 |     100 |                   
  ...upWarnings.ts |   91.17 |    82.35 |     100 |   91.17 | 67-68,73-74,77-78 
  version.ts       |     100 |       50 |     100 |     100 | 11                
  windowTitle.ts   |     100 |      100 |     100 |     100 |                   
  ...WithBackup.ts |   63.15 |    81.25 |     100 |   63.15 | 93,118-157        
-------------------|---------|----------|---------|---------|-------------------
Core Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   79.38 |    82.77 |      82 |   79.38 |                   
 src               |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/__mocks__/fs  |       0 |        0 |       0 |       0 |                   
  promises.ts      |       0 |        0 |       0 |       0 | 1-48              
 src/agents        |   87.58 |    79.07 |   91.76 |   87.58 |                   
  ...transcript.ts |   92.25 |    85.71 |     100 |   92.25 | ...87,306-307,438 
  ...ent-resume.ts |    82.5 |     71.5 |   77.41 |    82.5 | ...1035-1039,1042 
  ...ound-tasks.ts |    95.4 |    86.48 |     100 |    95.4 | ...55-756,827-828 
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/agents/arena  |   76.54 |    66.87 |   78.72 |   76.54 |                   
  ...gentClient.ts |   79.47 |    88.88 |   81.81 |   79.47 | ...68-183,189-204 
  ArenaManager.ts  |   75.37 |    63.37 |   78.26 |   75.37 | ...1860,1866-1867 
  arena-events.ts  |   64.44 |      100 |      50 |   64.44 | ...71-175,178-183 
  diff-summary.ts  |    87.5 |    72.34 |     100 |    87.5 | ...32-133,137-138 
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...gents/backends |   76.29 |    86.15 |   73.04 |   76.29 |                   
  ITermBackend.ts  |   97.97 |    93.93 |     100 |   97.97 | ...78-180,255,307 
  ...essBackend.ts |   91.25 |    90.62 |   86.66 |   91.25 | ...94,249-269,328 
  TmuxBackend.ts   |    90.7 |    76.55 |   97.36 |    90.7 | ...87,697,743-747 
  detect.ts        |   31.25 |      100 |       0 |   31.25 | 34-88             
  index.ts         |     100 |      100 |     100 |     100 |                   
  iterm-it2.ts     |     100 |     92.1 |     100 |     100 | 37-38,106         
  tmux-commands.ts |    6.64 |      100 |    3.03 |    6.64 | ...93-363,386-503 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...agents/runtime |   81.14 |     76.7 |   71.42 |   81.14 |                   
  agent-context.ts |     100 |      100 |     100 |     100 |                   
  agent-core.ts    |   76.49 |    72.35 |   60.86 |   76.49 | ...1608,1635-1682 
  agent-events.ts  |     100 |      100 |     100 |     100 |                   
  ...t-headless.ts |   81.19 |    71.73 |   60.86 |   81.19 | ...98-399,402-403 
  ...nteractive.ts |   79.71 |    79.62 |      75 |   79.71 | ...54,456,458,461 
  ...statistics.ts |   98.19 |    82.35 |     100 |   98.19 | 127,151,192,225   
  agent-types.ts   |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/agents/tasks  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/config        |   78.32 |    81.27 |   65.39 |   78.32 |                   
  config.ts        |   76.12 |    79.96 |   60.63 |   76.12 | ...3659,3670-3682 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  models.ts        |     100 |      100 |     100 |     100 |                   
  storage.ts       |   95.01 |     90.9 |   90.47 |   95.01 | ...71-372,375-376 
 ...nfirmation-bus |   98.29 |    97.14 |     100 |   98.29 |                   
  message-bus.ts   |   98.14 |    97.05 |     100 |   98.14 | 42-43             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/core          |   86.74 |    82.29 |   89.86 |   86.74 |                   
  baseLlmClient.ts |   92.35 |    80.85 |   86.66 |   92.35 | ...34,342-356,495 
  client.ts        |    85.8 |    77.77 |   84.84 |    85.8 | ...1769,1808-1811 
  ...tGenerator.ts |    72.1 |    61.11 |     100 |    72.1 | ...63,365,372-375 
  ...lScheduler.ts |   82.97 |    81.44 |   93.47 |   82.97 | ...2431,2483-2487 
  geminiChat.ts    |   89.32 |     84.8 |   91.48 |   89.32 | ...1454,1521-1522 
  geminiRequest.ts |     100 |      100 |     100 |     100 |                   
  ...htProtocol.ts |    9.09 |      100 |       0 |    9.09 | 34-42,45-49,52-87 
  logger.ts        |   87.33 |    87.02 |     100 |   87.33 | ...61-565,611-625 
  ...tyDefaults.ts |     100 |      100 |     100 |     100 |                   
  ...olExecutor.ts |   92.59 |       75 |      50 |   92.59 | 41-42             
  ...on-helpers.ts |   85.71 |    70.58 |     100 |   85.71 | ...90-191,205-214 
  ...issionFlow.ts |   98.59 |    94.73 |     100 |   98.59 | 93                
  prompts.ts       |   89.16 |    86.41 |   76.92 |   89.16 | ...-965,1168-1169 
  tokenLimits.ts   |     100 |    89.47 |     100 |     100 | 51-52             
  ...okTriggers.ts |   99.31 |    90.41 |     100 |   99.31 | 124,135           
  turn.ts          |   96.42 |    88.88 |     100 |   96.42 | ...00,413-414,462 
 ...ntentGenerator |   94.92 |    82.59 |   93.87 |   94.92 |                   
  ...tGenerator.ts |   96.48 |    84.28 |   92.59 |   96.48 | ...01,919-923,963 
  converter.ts     |   94.51 |    80.72 |     100 |   94.51 | ...06-607,617,823 
  index.ts         |       0 |        0 |       0 |       0 | 1-21              
  usage.ts         |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   91.53 |    71.64 |   93.33 |   91.53 |                   
  ...tGenerator.ts |      90 |    70.96 |   92.85 |      90 | ...80-286,304-305 
  index.ts         |     100 |       80 |     100 |     100 | 50                
 ...ntentGenerator |    92.1 |    80.38 |   90.32 |    92.1 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |   92.08 |    80.38 |   90.32 |   92.08 | ...85,895-896,924 
 ...ntentGenerator |   81.66 |    84.08 |    90.9 |   81.66 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  converter.ts     |   76.88 |    82.25 |    87.5 |   76.88 | ...1589,1610-1616 
  errorHandler.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |   52.38 |    44.44 |      50 |   52.38 | ...77,81-85,89-93 
  ...tGenerator.ts |    66.4 |    70.58 |   88.88 |    66.4 | ...51-157,168-169 
  pipeline.ts      |   93.67 |     84.9 |     100 |   93.67 | ...80-481,489,554 
  ...ureContext.ts |     100 |      100 |     100 |     100 |                   
  ...ingOptions.ts |       0 |        0 |       0 |       0 | 1                 
  ...CallParser.ts |   90.66 |    88.57 |     100 |   90.66 | ...15-319,349-350 
  ...kingParser.ts |     100 |    96.87 |     100 |     100 | 42                
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...rator/provider |   96.69 |    89.17 |   95.45 |   96.69 |                   
  dashscope.ts     |   97.29 |    89.77 |   93.33 |   97.29 | ...81-282,358-359 
  deepseek.ts      |   95.55 |    90.56 |     100 |   95.55 | ...31-132,145-146 
  default.ts       |   94.62 |    86.36 |   85.71 |   94.62 | 86-87,157-159     
  index.ts         |     100 |      100 |     100 |     100 |                   
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  mistral.ts       |   96.07 |    73.33 |     100 |   96.07 | 32-33             
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  openrouter.ts    |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 |                   
 src/extension     |   60.56 |    79.46 |    78.4 |   60.56 |                   
  ...-converter.ts |   62.35 |    47.82 |      90 |   62.35 | ...90-791,800-832 
  ...ionManager.ts |   47.04 |    82.06 |    65.9 |   47.04 | ...1398,1408-1427 
  ...onSettings.ts |   93.46 |    93.05 |     100 |   93.46 | ...17-221,228-232 
  ...-converter.ts |   54.88 |    94.44 |      60 |   54.88 | ...35-146,158-192 
  github.ts        |   44.94 |    88.52 |      60 |   44.94 | ...53-359,398-451 
  index.ts         |     100 |      100 |     100 |     100 |                   
  marketplace.ts   |   97.29 |    93.75 |     100 |   97.29 | ...64,184-185,274 
  npm.ts           |   48.66 |    76.08 |      75 |   48.66 | ...18-420,427-431 
  override.ts      |   94.11 |    88.88 |     100 |   94.11 | 63-64,81-82       
  settings.ts      |   66.26 |      100 |      50 |   66.26 | 81-108,143-149    
  storage.ts       |     100 |      100 |     100 |     100 |                   
  ...ableSchema.ts |     100 |      100 |     100 |     100 |                   
  variables.ts     |   88.75 |    83.33 |     100 |   88.75 | ...28-231,234-237 
 src/followup      |   46.91 |     92.3 |   71.87 |   46.91 |                   
  followupState.ts |      96 |    89.74 |     100 |      96 | 159-161,218-219   
  index.ts         |     100 |      100 |     100 |     100 |                   
  overlayFs.ts     |   95.06 |       84 |     100 |   95.06 | 78,108,122,133    
  speculation.ts   |   13.22 |      100 |   16.66 |   13.22 | 88-458,518-568    
  ...onToolGate.ts |     100 |    96.29 |     100 |     100 | 93                
  ...nGenerator.ts |    38.4 |    95.12 |   33.33 |    38.4 | ...16-318,353-383 
 src/generated     |       0 |        0 |       0 |       0 |                   
  git-commit.ts    |       0 |        0 |       0 |       0 | 1-10              
 src/goals         |   89.23 |    82.44 |   94.11 |   89.23 |                   
  ...eGoalStore.ts |   81.57 |    92.85 |   81.81 |   81.57 | ...43-146,154-162 
  goalHook.ts      |   97.26 |    91.48 |     100 |   97.26 | 100-105           
  goalJudge.ts     |   84.33 |    74.28 |     100 |   84.33 | ...57-358,366-368 
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/hooks         |   83.48 |    84.87 |   86.83 |   83.48 |                   
  ...okRegistry.ts |   86.48 |    77.08 |     100 |   86.48 | ...41-344,362-369 
  ...bortSignal.ts |     100 |      100 |     100 |     100 |                   
  ...terpolator.ts |   96.66 |    93.33 |     100 |   96.66 | 66-67             
  ...HookRunner.ts |   96.68 |    87.23 |     100 |   96.68 | 110-112,231-233   
  ...Aggregator.ts |    96.4 |    90.78 |     100 |    96.4 | ...91,293-294,367 
  ...entHandler.ts |   94.56 |    83.78 |   93.33 |   94.56 | ...38,795-796,806 
  hookPlanner.ts   |   84.13 |    76.59 |      90 |   84.13 | ...38,144,162-173 
  hookRegistry.ts  |   90.17 |    83.33 |     100 |   90.17 | ...33,352,356,360 
  hookRunner.ts    |   58.56 |    71.26 |   66.66 |   58.56 | ...48-749,758-759 
  hookSystem.ts    |   84.57 |      100 |   65.85 |   84.57 | ...21-622,628-629 
  ...HookRunner.ts |   75.51 |     61.9 |      80 |   75.51 | ...05-406,424-425 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...HookRunner.ts |   93.63 |    89.47 |      90 |   93.63 | ...45-353,427-428 
  ...SkillHooks.ts |   78.75 |       75 |   66.66 |   78.75 | 62-66,137-152     
  ...oksManager.ts |   96.66 |    91.66 |     100 |   96.66 | ...90,209-210,223 
  ssrfGuard.ts     |   77.22 |    85.36 |     100 |   77.22 | ...57,261-267,273 
  stopHookCap.ts   |     100 |      100 |     100 |     100 |                   
  trustedHooks.ts  |       0 |        0 |       0 |       0 | 1-124             
  types.ts         |   91.18 |    92.04 |   85.71 |   91.18 | ...40-441,501-505 
  urlValidator.ts  |     100 |      100 |     100 |     100 |                   
 src/ide           |   74.28 |    83.39 |   78.33 |   74.28 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  detect-ide.ts    |     100 |      100 |     100 |     100 |                   
  ide-client.ts    |    64.2 |    81.48 |   66.66 |    64.2 | ...9-970,999-1007 
  ide-installer.ts |   89.06 |    79.31 |     100 |   89.06 | ...36,143-147,160 
  ideContext.ts    |     100 |      100 |     100 |     100 |                   
  process-utils.ts |   84.84 |    71.79 |     100 |   84.84 | ...37,151,193-194 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/lsp           |   41.24 |    52.14 |   51.42 |   41.24 |                   
  ...nfigLoader.ts |   70.27 |    35.89 |   94.73 |   70.27 | ...20-422,426-432 
  ...ionFactory.ts |   42.69 |    79.16 |      50 |   42.69 | ...62-413,419-436 
  ...Normalizer.ts |   23.09 |    13.72 |   30.43 |   23.09 | ...04-905,909-924 
  ...verManager.ts |   25.31 |    62.06 |   41.66 |   25.31 | ...85-704,710-740 
  ...eLspClient.ts |   32.77 |       80 |   17.64 |   32.77 | ...84-288,294-295 
  ...LspService.ts |   48.49 |    67.16 |   65.71 |   48.49 | ...1352,1369-1379 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/mcp           |   78.69 |    75.34 |   75.92 |   78.69 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...h-provider.ts |   86.95 |      100 |   33.33 |   86.95 | ...,93,97,101-102 
  ...h-provider.ts |   73.82 |    53.92 |     100 |   73.82 | ...88-895,902-904 
  ...en-storage.ts |   98.62 |    97.72 |     100 |   98.62 | 87-88             
  oauth-utils.ts   |   70.58 |    85.29 |    90.9 |   70.58 | ...70-290,315-344 
  ...n-provider.ts |   89.83 |    95.83 |   45.45 |   89.83 | ...43,147,151-152 
 .../token-storage |   79.52 |    86.66 |   86.36 |   79.52 |                   
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   82.87 |    82.35 |   92.85 |   82.87 | ...63-173,181-182 
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   68.14 |    82.35 |   64.28 |   68.14 | ...81-295,298-314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/memory        |   68.13 |    76.27 |   66.66 |   68.13 |                   
  const.ts         |     100 |      100 |     100 |     100 |                   
  dream.ts         |   65.65 |    73.33 |      50 |   65.65 | 50,107-148        
  ...entPlanner.ts |   57.84 |    72.72 |   33.33 |   57.84 | ...35,140-147,152 
  entries.ts       |   63.77 |    79.16 |      50 |   63.77 | ...72-180,183-189 
  extract.ts       |    95.2 |    79.16 |     100 |    95.2 | 81-86,125         
  ...entPlanner.ts |   63.08 |    65.71 |   41.17 |   63.08 | ...17,222-223,332 
  ...ionPlanner.ts |       0 |        0 |       0 |       0 | 1                 
  forget.ts        |    45.8 |    61.53 |   44.44 |    45.8 | ...04,211,214-346 
  indexer.ts       |   83.87 |    45.45 |     100 |   83.87 | ...50,56-57,69-70 
  manager.ts       |   75.31 |    81.04 |    75.6 |   75.31 | ...1278,1291-1293 
  memoryAge.ts     |   90.47 |    77.77 |     100 |   90.47 | 50-51             
  paths.ts         |   55.47 |    89.47 |   85.71 |   55.47 | ...,89-90,106-114 
  prompt.ts        |   93.36 |    71.42 |     100 |   93.36 | ...58,161,228-229 
  recall.ts        |   79.56 |    69.38 |   88.88 |   79.56 | ...40-245,269-280 
  ...ceSelector.ts |   91.86 |    77.27 |     100 |   91.86 | ...07,109-110,118 
  scan.ts          |   87.91 |    68.42 |     100 |   87.91 | ...47-48,58,82-87 
  ...entPlanner.ts |    11.5 |      100 |       0 |    11.5 | ...57-192,210-298 
  status.ts        |   10.52 |      100 |       0 |   10.52 | 41-98             
  store.ts         |   94.44 |    83.33 |     100 |   94.44 | 56-57,92-93       
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ontextFile.ts |   79.38 |    78.33 |   81.81 |   79.38 | ...58-272,286-291 
 src/mocks         |       0 |        0 |       0 |       0 |                   
  msw.ts           |       0 |        0 |       0 |       0 | 1-9               
 src/models        |   89.31 |    85.55 |    87.5 |   89.31 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...tor-config.ts |   90.24 |    91.42 |     100 |   90.24 | 142,148,151-160   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nfigErrors.ts |   74.22 |       44 |   84.61 |   74.22 | ...,67-74,106-117 
  ...igResolver.ts |   98.63 |    92.53 |     100 |   98.63 | 161,323,329       
  modelRegistry.ts |     100 |    98.59 |     100 |     100 | 222               
  modelsConfig.ts  |   84.57 |    82.14 |   81.57 |   84.57 | ...1223,1252-1253 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/output        |     100 |      100 |     100 |     100 |                   
  ...-formatter.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/permissions   |   71.18 |    88.76 |   48.57 |   71.18 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...on-manager.ts |   81.42 |    86.66 |      80 |   81.42 | ...29-830,837-846 
  rule-parser.ts   |   95.99 |    93.22 |     100 |   95.99 | ...-864,1013-1015 
  ...-semantics.ts |   58.28 |    85.27 |    30.2 |   58.28 | ...1604-1614,1643 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/prompts       |   83.63 |      100 |    87.5 |   83.63 |                   
  mcp-prompts.ts   |   18.18 |      100 |       0 |   18.18 | 11-19             
  ...t-registry.ts |     100 |      100 |     100 |     100 |                   
 src/qwen          |   83.87 |    77.46 |   95.83 |   83.87 |                   
  ...tGenerator.ts |   98.64 |    98.18 |     100 |   98.64 | 105-106           
  qwenOAuth2.ts    |   80.85 |    70.74 |   90.32 |   80.85 | ...1169-1185,1215 
  ...kenManager.ts |   83.76 |    76.22 |     100 |   83.76 | ...62-767,788-793 
 src/services      |   85.34 |    83.53 |   90.93 |   85.34 |                   
  ...ionTrailer.ts |     100 |      100 |     100 |     100 |                   
  ...llRegistry.ts |   98.44 |    91.83 |     100 |   98.44 | 268-269           
  ...ionService.ts |    95.6 |    96.36 |     100 |    95.6 | ...32,400,402-406 
  ...ingService.ts |   83.91 |       83 |   83.33 |   83.91 | ...1267,1284-1285 
  ...ttribution.ts |   91.73 |    87.71 |      90 |   91.73 | ...80-685,826-827 
  ...utSlimming.ts |     100 |    96.77 |     100 |     100 | 133,182           
  cronScheduler.ts |   97.56 |    92.98 |     100 |   97.56 | 62-63,77,155      
  ...eryService.ts |   80.43 |    95.45 |      75 |   80.43 | ...19-134,140-141 
  ...oryService.ts |   86.25 |    74.35 |    92.3 |   86.25 | ...46-655,696-699 
  fileReadCache.ts |     100 |      100 |     100 |     100 |                   
  ...temService.ts |   91.27 |    82.69 |    90.9 |   91.27 | ...94,196,294-301 
  ...ratedFiles.ts |      96 |    88.23 |     100 |      96 | 119-120,146-147   
  gitInit.ts       |     100 |      100 |     100 |     100 |                   
  gitService.ts    |   68.75 |     92.3 |   55.55 |   68.75 | ...12-122,125-129 
  ...reeService.ts |   73.79 |       70 |   94.87 |   73.79 | ...1365,1393-1394 
  ...ionService.ts |   98.13 |     97.8 |   95.45 |   98.13 | ...32-333,380-381 
  ...orRegistry.ts |   96.54 |    91.73 |     100 |   96.54 | ...70-471,622-623 
  sessionRecap.ts  |   12.04 |      100 |       0 |   12.04 | 49-160            
  ...ionService.ts |   90.19 |     78.7 |   96.66 |   90.19 | ...1285,1289-1290 
  sessionTitle.ts  |   93.87 |    69.81 |     100 |   93.87 | ...33-236,267-268 
  ...ionService.ts |   81.07 |    77.92 |   89.28 |   81.07 | ...1923,1929-1934 
  ...UseSummary.ts |   94.73 |    87.71 |     100 |   94.73 | ...73-175,225-226 
  ...reeCleanup.ts |   14.56 |      100 |   33.33 |   14.56 | 58-185            
 ...icrocompaction |   98.05 |     91.8 |     100 |   98.05 |                   
  microcompact.ts  |   98.05 |     91.8 |     100 |   98.05 | ...19,289,293,391 
 src/skills        |    87.5 |    83.86 |   94.23 |    87.5 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...activation.ts |     100 |     93.1 |     100 |     100 | 93,112            
  skill-load.ts    |   92.94 |    81.63 |     100 |   92.94 | ...06,226,238-240 
  skill-manager.ts |   83.31 |    79.66 |   90.32 |   83.31 | ...1120,1127-1131 
  skill-paths.ts   |   86.74 |    77.77 |     100 |   86.74 | ...00-101,106-107 
  symlinkScope.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/subagents     |   83.13 |    80.24 |   95.23 |   83.13 |                   
  ...tin-agents.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...-selection.ts |     100 |      100 |     100 |     100 |                   
  ...nt-manager.ts |   77.21 |    72.09 |   92.85 |   77.21 | ...1180,1202-1203 
  types.ts         |     100 |      100 |     100 |     100 |                   
  validation.ts    |   92.46 |    95.18 |     100 |   92.46 | 51-56,69-74,78-83 
 src/telemetry     |   74.59 |     85.9 |   78.77 |   74.59 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...attributes.ts |   98.13 |       88 |     100 |   98.13 | 185-187           
  ...-exporters.ts |   46.37 |      100 |   44.44 |   46.37 | ...85,88-89,92-93 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-111             
  ...-processor.ts |   93.93 |    90.21 |   94.11 |   93.93 | ...75-280,299-300 
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-128             
  loggers.ts       |    51.9 |       64 |   57.77 |    51.9 | ...1214,1231-1251 
  metrics.ts       |    74.9 |    82.95 |   74.54 |    74.9 | ...58-978,981-992 
  sanitize.ts      |      80 |    83.33 |     100 |      80 | 35-36,41-42       
  sdk.ts           |   90.45 |    83.56 |   76.92 |   90.45 | ...17-318,338-342 
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...on-tracing.ts |   90.69 |    87.87 |     100 |   90.69 | ...67-471,482-485 
  ...etry-utils.ts |     100 |      100 |     100 |     100 |                   
  ...l-decision.ts |     100 |      100 |     100 |     100 |                   
  ...e-id-utils.ts |     100 |      100 |     100 |     100 |                   
  tracer.ts        |   98.61 |    89.36 |     100 |   98.61 | 53,104            
  types.ts         |   79.17 |    85.83 |   83.33 |   79.17 | ...1149,1152-1181 
  uiTelemetry.ts   |   92.97 |    96.96 |   81.25 |   92.97 | ...93-194,200-207 
 ...ry/qwen-logger |   68.24 |    79.56 |   64.91 |   68.24 |                   
  event-types.ts   |       0 |        0 |       0 |       0 |                   
  qwen-logger.ts   |   68.24 |    79.34 |   64.28 |   68.24 | ...1055,1093-1094 
 src/test-utils    |   93.16 |    95.91 |   76.47 |   93.16 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  ...st-helpers.ts |   94.11 |       90 |     100 |   94.11 | 69-70             
  index.ts         |     100 |      100 |     100 |     100 |                   
  mock-tool.ts     |   91.19 |    97.14 |   72.41 |   91.19 | ...38,202-203,216 
  ...aceContext.ts |     100 |      100 |     100 |     100 |                   
 src/tools         |   78.56 |    81.68 |   86.78 |   78.56 |                   
  ...erQuestion.ts |   88.93 |    76.74 |    90.9 |   88.93 | ...39-340,347-348 
  cron-create.ts   |   97.75 |    88.88 |   83.33 |   97.75 | 30-31             
  cron-delete.ts   |   96.82 |      100 |   83.33 |   96.82 | 26-27             
  cron-list.ts     |   96.66 |      100 |   83.33 |   96.66 | 25-26             
  diffOptions.ts   |     100 |      100 |     100 |     100 |                   
  edit.ts          |   80.52 |    85.98 |   73.33 |   80.52 | ...15-716,803-853 
  ...r-worktree.ts |   82.43 |    68.75 |    87.5 |   82.43 | ...67-170,236-237 
  exit-worktree.ts |   83.47 |       84 |    90.9 |   83.47 | ...80-281,286-299 
  exitPlanMode.ts  |   85.09 |    85.71 |     100 |   85.09 | ...60-163,177-189 
  glob.ts          |   90.63 |    88.33 |   84.61 |   90.63 | ...28,171,302,305 
  grep.ts          |   79.19 |    85.71 |   78.94 |   79.19 | ...20,560,569-576 
  ls.ts            |   96.74 |    90.27 |     100 |   96.74 | 176-181,212,216   
  lsp.ts           |   72.77 |    60.09 |   90.32 |   72.77 | ...1211,1213-1214 
  ...nt-manager.ts |   84.36 |    82.74 |   84.21 |   84.36 | ...2099-2103,2142 
  mcp-client.ts    |   33.18 |    77.65 |   66.66 |   33.18 | ...1490,1494-1497 
  mcp-tool.ts      |   90.98 |    88.88 |   96.42 |   90.98 | ...95-596,646-647 
  memory-config.ts |       0 |        0 |       0 |       0 | 1-47              
  ...iable-tool.ts |     100 |    84.61 |     100 |     100 | 102,109           
  monitor.ts       |   92.36 |    83.94 |      92 |   92.36 | ...29,558-561,574 
  ...nforcement.ts |   82.44 |       90 |     100 |   82.44 | 174-185,234-247   
  read-file.ts     |   95.09 |    88.75 |      90 |   95.09 | ...99,293-296,299 
  ripGrep.ts       |   94.59 |    85.71 |   93.33 |   94.59 | ...60,463,541-542 
  ...-transport.ts |    6.34 |      100 |       0 |    6.34 | 47-145            
  send-message.ts  |   89.32 |    91.66 |   83.33 |   89.32 | 44-45,68-76       
  shell.ts         |   72.96 |     79.6 |    91.3 |   72.96 | ...4216,4265-4271 
  skill-utils.ts   |     100 |      100 |     100 |     100 |                   
  skill.ts         |   88.11 |    91.17 |   84.61 |   88.11 | ...95,399,422-444 
  ...eticOutput.ts |   95.12 |      100 |      80 |   95.12 | 87-88             
  task-stop.ts     |   93.14 |    96.15 |   85.71 |   93.14 | 39-40,54-64       
  todoWrite.ts     |   89.17 |    82.05 |   92.85 |   89.17 | ...41-546,568-569 
  tool-error.ts    |     100 |      100 |     100 |     100 |                   
  tool-names.ts    |     100 |      100 |     100 |     100 |                   
  tool-registry.ts |   74.85 |    76.85 |   80.95 |   74.85 | ...30-831,839-840 
  tool-search.ts   |   95.19 |    86.48 |    92.3 |   95.19 | ...47-153,208-213 
  tools.ts         |   91.98 |    90.19 |   88.88 |   91.98 | ...50-451,467-473 
  web-fetch.ts     |   88.59 |    79.48 |    92.3 |   88.59 | ...12-313,315-316 
  write-file.ts    |   82.23 |    81.17 |   83.33 |   82.23 | ...65-668,680-715 
 src/tools/agent   |   75.01 |    82.55 |   74.62 |   75.01 |                   
  agent.ts         |   75.29 |    82.86 |    75.4 |   75.29 | ...2203,2265-2272 
  fork-subagent.ts |   69.62 |    71.42 |   66.66 |   69.62 | ...04-105,140-151 
 src/utils         |   88.98 |    87.55 |   93.69 |   88.98 |                   
  LruCache.ts      |       0 |        0 |       0 |       0 | 1-41              
  ...ssageQueue.ts |     100 |      100 |     100 |     100 |                   
  ...cFileWrite.ts |   77.96 |    80.48 |     100 |   77.96 | ...35,156,173-176 
  bareMode.ts      |   27.27 |      100 |       0 |   27.27 | 9-15,18-19        
  browser.ts       |    7.69 |      100 |       0 |    7.69 | 17-56             
  bundlePaths.ts   |     100 |      100 |     100 |     100 |                   
  ...igResolver.ts |     100 |      100 |     100 |     100 |                   
  ...engthError.ts |   89.11 |    86.66 |     100 |   89.11 | ...28-129,132-133 
  cronDisplay.ts   |   42.85 |    23.07 |     100 |   42.85 | 26-31,33-45,47-54 
  cronParser.ts    |   89.74 |    85.71 |     100 |   89.74 | ...,63-64,183-186 
  debugLogger.ts   |    95.9 |    93.84 |   94.73 |    95.9 | 106-107,214-218   
  editHelper.ts    |   93.63 |    83.52 |     100 |   93.63 | ...28-429,463-464 
  editor.ts        |   97.61 |    95.71 |     100 |   97.61 | ...70-271,273-274 
  ...arResolver.ts |   94.28 |    88.88 |     100 |   94.28 | 28-29,125-126     
  ...entContext.ts |     100 |    95.45 |     100 |     100 | 83                
  errorParsing.ts  |    97.7 |    97.05 |     100 |    97.7 | 72-73             
  ...rReporting.ts |   88.46 |       90 |     100 |   88.46 | 69-74             
  errors.ts        |   70.92 |    79.59 |   53.33 |   70.92 | ...03-219,223-229 
  fetch.ts         |   70.18 |    71.42 |   71.42 |   70.18 | ...42,148,161,186 
  fileUtils.ts     |   91.46 |    86.19 |   95.23 |   91.46 | ...1188,1192-1198 
  forkedAgent.ts   |    78.5 |    70.73 |   85.71 |    78.5 | ...30-436,441-447 
  formatters.ts    |   81.81 |       75 |     100 |   81.81 | 15-16             
  ...eUtilities.ts |   89.21 |    86.66 |     100 |   89.21 | 16-17,49-55,65-66 
  ...rStructure.ts |   94.36 |    94.28 |     100 |   94.36 | ...17-120,330-335 
  getPty.ts        |    12.5 |      100 |       0 |    12.5 | 21-34             
  gitDiff.ts       |   92.36 |    79.53 |     100 |   92.36 | ...55-856,928-929 
  ...noreParser.ts |    92.3 |    89.36 |     100 |    92.3 | ...15-116,186-187 
  gitUtils.ts      |   56.66 |    85.71 |      75 |   56.66 | ...2,72-73,97-148 
  iconvHelper.ts   |     100 |      100 |     100 |     100 |                   
  ...rePatterns.ts |     100 |      100 |     100 |     100 |                   
  ...ionManager.ts |     100 |     90.9 |     100 |     100 | 26                
  ...lPromptIds.ts |     100 |      100 |     100 |     100 |                   
  jsonl-utils.ts   |    74.1 |    90.76 |   58.33 |    74.1 | ...23-326,336-342 
  ...-detection.ts |     100 |      100 |     100 |     100 |                   
  ...iagnostics.ts |   96.87 |    91.83 |     100 |   96.87 | 214-219,272       
  ...yDiscovery.ts |    83.9 |    79.36 |     100 |    83.9 | ...16,319,411-414 
  ...tProcessor.ts |   93.63 |       90 |     100 |   93.63 | ...96-302,384-385 
  ...Inspectors.ts |   61.53 |      100 |      50 |   61.53 | 18-23             
  modelId.ts       |   98.55 |    96.87 |     100 |   98.55 | 103               
  ...kerChecker.ts |   88.75 |    85.71 |     100 |   88.75 | 69-70,87-93       
  notebook.ts      |   94.35 |    84.78 |     100 |   94.35 | ...10,122,174-176 
  openaiLogger.ts  |   88.05 |    84.09 |     100 |   88.05 | ...44-146,169-174 
  partUtils.ts     |     100 |    98.61 |     100 |     100 | 206               
  pathReader.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |   93.21 |    91.86 |     100 |   93.21 | ...89-390,392-394 
  pdf.ts           |   93.68 |    87.05 |     100 |   93.68 | ...96-297,321-325 
  projectPath.ts   |     100 |      100 |     100 |     100 |                   
  ...ectSummary.ts |   89.39 |    72.41 |     100 |   89.39 | ...37-142,193-196 
  ...tIdContext.ts |     100 |      100 |     100 |     100 |                   
  proxyUtils.ts    |     100 |      100 |     100 |     100 |                   
  ...rDetection.ts |   58.57 |       76 |     100 |   58.57 | ...4,88-89,95-100 
  ...noreParser.ts |   85.45 |    85.18 |     100 |   85.45 | ...59,65-66,72-73 
  rateLimit.ts     |   92.55 |    85.92 |     100 |   92.55 | ...70-272,309-310 
  readManyFiles.ts |   87.96 |    86.95 |     100 |   87.96 | ...05-207,223-234 
  retry.ts         |   89.81 |    88.05 |     100 |   89.81 | ...29,350,357-358 
  ripgrepUtils.ts  |   46.79 |    84.37 |   66.66 |   46.79 | ...45-246,258-335 
  ...sDiscovery.ts |   97.42 |    92.85 |     100 |   97.42 | ...04,182-183,202 
  ...tchOptions.ts |   81.72 |    85.04 |   95.23 |   81.72 | ...11,536,565-574 
  runtimeStatus.ts |    97.5 |    88.57 |     100 |    97.5 | 167-168           
  safeJsonParse.ts |   74.07 |    83.33 |     100 |   74.07 | 40-46             
  ...nStringify.ts |     100 |      100 |     100 |     100 |                   
  ...aConverter.ts |   90.78 |    88.23 |     100 |   90.78 | ...41-42,93,95-96 
  ...aValidator.ts |   94.57 |    80.26 |     100 |   94.57 | ...04,213-216,270 
  ...r-launcher.ts |   76.92 |     91.3 |   66.66 |   76.92 | ...34,136,157-195 
  ...orageUtils.ts |   96.89 |    85.84 |     100 |   96.89 | ...51,367,447,466 
  shell-utils.ts   |   82.93 |    89.89 |     100 |   82.93 | ...1522,1529-1533 
  ...lAstParser.ts |   95.58 |    85.79 |     100 |   95.58 | ...1059-1061,1071 
  ...nlyChecker.ts |   95.75 |    92.39 |     100 |   95.75 | ...00-301,313-314 
  sideQuery.ts     |   98.73 |    94.59 |     100 |   98.73 | 111               
  ...pEventSink.ts |     100 |       80 |     100 |     100 | 61                
  ...tGenerator.ts |     100 |      100 |     100 |     100 |                   
  ...ameContext.ts |     100 |      100 |     100 |     100 |                   
  symlink.ts       |   77.77 |       50 |     100 |   77.77 | 44,54-59          
  ...emEncoding.ts |   96.36 |    91.17 |     100 |   96.36 | 59-60,124-125     
  terminalSafe.ts  |     100 |      100 |     100 |     100 |                   
  ...Serializer.ts |   98.72 |       90 |     100 |   98.72 | 42-43,134,201-203 
  testUtils.ts     |   53.33 |      100 |   33.33 |   53.33 | ...53,59-64,70-72 
  textUtils.ts     |      60 |      100 |   66.66 |      60 | 36-55             
  thoughtUtils.ts  |     100 |    92.85 |     100 |     100 | 71                
  ...-converter.ts |   94.59 |    85.71 |     100 |   94.59 | 35-36             
  tool-utils.ts    |    93.6 |     91.3 |     100 |    93.6 | ...58-159,162-163 
  truncation.ts    |     100 |       92 |     100 |     100 | 52,71             
  windowsPath.ts   |   89.47 |    79.31 |     100 |   89.47 | ...57-58,62,90-91 
  ...aceContext.ts |   93.71 |    89.28 |   93.33 |   93.71 | ...24-225,249-251 
  xml.ts           |     100 |      100 |     100 |     100 |                   
  yaml-parser.ts   |      92 |    84.61 |     100 |      92 | 49-53,65-69       
 ...ils/filesearch |   86.21 |    81.61 |   96.42 |   86.21 |                   
  crawlCache.ts    |     100 |      100 |     100 |     100 |                   
  crawler.ts       |   82.84 |    77.49 |   94.82 |   82.84 | ...1451,1485-1486 
  fileSearch.ts    |   93.58 |    87.32 |     100 |   93.58 | ...46-247,249-250 
  ignore.ts        |     100 |      100 |     100 |     100 |                   
  result-cache.ts  |     100 |     92.3 |     100 |     100 | 46                
 ...uest-tokenizer |   56.63 |    74.52 |   74.19 |   56.63 |                   
  ...eTokenizer.ts |   41.86 |    76.47 |   69.23 |   41.86 | ...70-443,453-507 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tTokenizer.ts |   68.39 |    69.49 |    90.9 |   68.39 | ...24-325,327-328 
  ...ageFormats.ts |      76 |      100 |   33.33 |      76 | 45-48,55-56       
  textTokenizer.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
-------------------|---------|----------|---------|---------|-------------------

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

doudouOUC added 3 commits May 18, 2026 17:56
Codex review round 2 of #4271 flagged two P2 issues on the SDK
surface; both folded in:

#1 Seed SDK replay for startup guardrail events
   (DaemonSessionClient.ts:78-94)

PR 14b's `mcp_budget_warning` / `mcp_child_refused_batch` events fire
during the child's `newSession` handler and are buffered on
`BridgeClient.earlyEvents` until `byId.set(sessionId, entry)` runs;
the bridge drains them onto the per-session bus before
`spawnOrAttach` returns, so they live in the replay ring with ids.
But the SDK's `DaemonSessionClient.createOrAttach` only seeded
`Last-Event-ID: 0` when `req.modelServiceId` was set — every other
new session started its first subscription LIVE, missing the
startup-window guardrail events the new feature advertises.

Unified rule: when `session.attached === false` (newly-created
session) OR `req.modelServiceId` is set, seed `lastEventId: 0`. The
old `modelServiceId`-only branch is preserved for re-attached
sessions that need attach-time switch-event replay; the new
`!attached` branch covers PR 14b's startup window. Re-attached
sessions without `modelServiceId` still start live (caller may have
its own event cursor it doesn't want to reset).

The daemon already treats `Last-Event-ID: 0` as "replay from the
beginning of the bounded ring"; if older events have been evicted
from the ring (subscriber connected past the ring's coverage), the
client receives the retained suffix and continues live from there
— no behavior regression for late subscribers.

#2 Re-export new guardrail event types from SDK barrels
   (daemon/index.ts + src/index.ts)

PR 14b added 6 public types to `events.ts` but didn't thread them
through the package's barrel exports. Consumers importing from
`@qwen-code/sdk` could narrow `DaemonClientEvictedEvent` /
`DaemonSlowClientWarningEvent` (older event types) but not
`DaemonMcpBudgetWarningEvent` etc., breaking the SDK's encapsulation
contract for the `mcp_guardrail_events` capability tag.

Fix: add the 6 missing types to both `daemon/index.ts` and
`src/index.ts`:

- `DaemonMcpBudgetWarningData` / `DaemonMcpBudgetWarningEvent`
- `DaemonMcpRefusedServer`
- `DaemonMcpChildRefusedBatchData` / `DaemonMcpChildRefusedBatchEvent`
- `DaemonMcpGuardrailEvent` (the union)

Tests: 1 new SDK test (`replays from id 0 on freshly-created sessions
so startup-window guardrail events are observable`) pins the
`attached: false` → `Last-Event-ID: 0` invariant; existing 18
DaemonSessionClient tests stay green (the existing
`modelServiceId`-driven replay test still passes because the new
rule is OR-merged with the old one, and the
`starts live when ... no model service replay need` test uses
`attached: true` which bypasses the new branch).

Verified: 1309/1309 tests pass across 43 files (manager, serve,
acp-integration, sdk all green); typecheck clean across 4
workspaces; lint clean on 4 touched files.
Codex review round 3 of #4271 surfaced 6 actionable items across
DeepSeek / mimo / copilot agents; all 6 folded in. Two suggestions
explicitly declined as documented below.

Adopted:

#1 Debug logging for budget events (DeepSeek Critical)
   - mcp-client-manager.ts: evaluateBudgetState emits
     `debugLogger.info` on warning fire AND on re-arm. Pre-fix the
     manager had ZERO log output for budget events, so oncall could
     not distinguish "events emitted but dropped downstream" from
     "events never emitted." Refusal side already had stderr via
     `refuseAndLog`; warning + re-arm now have parity.
   - acpAgent.ts: changed `.catch(() => {})` to
     `.catch((err) => debugLogger.debug(...))`. Pre-fix every
     extNotification failure was silently swallowed — including
     real errors (serialization bugs, protocol violations), not
     just the expected ACP-channel-closed case. `debug` level keeps
     production quiet but gives oncall a debuggable trail when
     they flip debug on.

#2 Rename mcpRefusedBatchCount → mcpChildRefusedBatchCount (DeepSeek)
   ViewState fields dropped "child" from the source event name
   `mcp_child_refused_batch`, breaking the
   `slow_client_warning → slowClientWarningCount` convention. Now
   matches: `mcpChildRefusedBatchCount` / `lastMcpChildRefusedBatch`.
   PR not merged → public API rename is zero-cost. Updated 4 sites
   (events.ts, daemonEvents.test.ts, capabilities.ts comment, and
   qwen-serve-protocol.md).

#3 `satisfies DaemonEvent` on test fixtures (mimo "Critical")
   Adds explicit type annotation to mcp_budget_warning + refused-
   batch test fixtures so literal discriminators (`v: 1`,
   `type: '...'`) stay narrow. Note: the sdk package's
   `tsconfig.json` currently scopes `tsc --noEmit` to
   `src/**/*.ts` — tests aren't gated yet — so the original
   "TS2345" claim was overstated. The fixture is still better
   typed for when tests are eventually included.

#4 emitRefusedBatchIfAny docstring fix (copilot)
   Pre-fix the docstring claimed it "Clears both the names list
   and the transport map after firing", but the implementation
   only clears `pendingRefusalNames`. The other two are reset at
   pass-start / `stop()` / `dropRefusalEntry` per the PR 14
   contract (snapshot-visible refusals survive between passes).
   Updated the docstring + the `lastRefusedTransports` field
   comment to describe reality.

#5 Rename pgrep cross-check test (copilot)
   Test name claimed "in-process subprocessCount matches external
   pgrep observation" but the assertion uses `clientCount`
   (the snapshot's exposed field; `subprocessCount` is
   manager-internal). For stdio-only fixtures the two are
   numerically equal, so the assertion was correct — but the test
   name now matches the field. Comment block reworked to make the
   subprocessCount/clientCount equivalence explicit.

#6 emitBudgetEvent try/catch helper (mimo)
   `evaluateBudgetState` and `emitRefusedBatchIfAny` now route
   through a private `emitBudgetEvent(event)` helper that
   try/catches around `this.onBudgetEvent` and debug-logs failures.
   Pre-fix a synchronously-throwing callback would propagate the
   exception up through MCP discovery / `readResource` /
   `disconnectServer` paths and abort unrelated work — budget push
   events are best-effort telemetry, never critical-path. Production
   ACP adapter is async + already had its own .catch, but the
   manager-side guard makes the contract robust against future test
   fixtures and adapters.

Declined (documented in review-thread replies):

- Bridge structural validation of extNotification payloads (wenshao
  Suggestion / DeepSeek): SDK predicate-based validation already
  routes malformed payloads through `unrecognizedKnownEventCount`;
  bridge-side validation duplicates SDK logic without protecting
  against real attacks (the daemon-child is a trust boundary).
- Relaxing `thresholdRatio: 0.75` literal (wenshao Suggestion /
  DeepSeek): premature widening for a hypothetical second threshold
  (0.5 critical). Better design when actually needed: discriminator
  union (`{ kind: 'warning_75' } | { kind: 'critical_50' }`) rather
  than relaxing the literal.

Verified: 1309/1309 tests pass across 43 files; typecheck clean
across 4 workspaces; lint clean on 6 touched files.
Comment thread packages/core/src/config/config.ts
Codex round 4 of #4271 surfaced 1 actionable item from wenshao
gpt-5.5: the `Config.setMcpBudgetEventCallback → pendingMcpBudgetCallback
→ createToolRegistry → registry.getMcpClientManager().setOnBudgetEvent`
integration boundary had NO test coverage. The acpAgent test stubs the
setter (proves QwenAgent calls it pre-`initialize()`); the manager
tests bypass Config by passing `onBudgetEvent` directly to
`McpClientManager`. Neither covered the actual stash + apply path
inside Config — and that path is the safety net that prevents
startup-window MCP guardrail events from being dropped under legacy
blocking discovery + closes the progressive-mode race window.

Adopted: extend the existing `vi.mock('../tools/tool-registry')` setup
so each ToolRegistry instance stamps a per-instance
`__mcpManagerMock` with `setOnBudgetEvent` + a stubbed
`discoverAllMcpToolsIncremental` (the latter so
`Config.startMcpDiscoveryInBackground` doesn't crash on missing
method during `initialize`). Added 2 new tests under a new
`setMcpBudgetEventCallback handoff to McpClientManager` describe:

- `applies pending callback when registry is created during initialize()`:
  setter called BEFORE `initialize` → callback stashed in
  `pendingMcpBudgetCallback` → `createToolRegistry`'s apply branch
  forwards it to the freshly-constructed manager BEFORE discovery
  fires. Asserts manager's `setOnBudgetEvent` was called exactly
  once with the same callback function.

- `applies callback directly to existing manager when called after initialize()`:
  setter called AFTER `initialize` → dispatches DIRECTLY to the
  existing manager via the `if (this.toolRegistry)` branch (the
  late-call path adapters use when they discover the manager only
  after Config is up). Also covers `cb: undefined` clearing the
  registration.

Verified: 161/161 Config tests pass; 1470/1470 tests pass across
44 files; typecheck clean across 4 workspaces; lint clean on the
1 touched file.

Closes the last open review thread on #4271.
@doudouOUC doudouOUC requested a review from wenshao May 18, 2026 12:57
Comment thread packages/cli/src/serve/httpAcpBridge.ts
doudouOUC added 3 commits May 18, 2026 22:22
…ail-events

# Conflicts:
#	packages/sdk-typescript/src/daemon/events.ts
Codex round 5 of #4271 surfaced 1 Critical correctness/leak finding
from wenshao gpt-5.5: pre-fix, `BridgeClient.extNotification` buffered
guardrail events for ANY unknown sessionId. `resolveEntry(sessionId)`
returns undefined for both newly-creating sessions (the original buffer
target) AND for closed/killed sessions. A late `extNotification` from
a dying child for an old sessionId would therefore land in
`earlyEvents`. If the SAME sessionId came back via `session/load` or
`session/resume` within the 60s TTL, `createSessionEntry`'s
`drainEarlyEvents` call would replay stale prior-session telemetry
onto the NEW subscriber — false budget warnings, refused server
names from the OLD session leaking into a different consumer's view.

Fix: tombstone Map for closed/killed session ids on `BridgeClient`.
- Marked when the bridge removes a sessionId from `byId` (3 sites:
  channel.exited handler, closeSession, killSession).
- Concurrently purges any in-flight `earlyEvents[id]` so a
  buffered-but-undrained frame can't leak either.
- `bufferEarlyEvent` rejects tombstoned ids (the dying child's late
  notification just gets dropped).
- `drainEarlyEvents` clears the tombstone — a fresh
  `createSessionEntry` for the same id is the legitimate
  "load/resume of a persisted session id" case, and at that point
  any stale event has already been rejected at buffer time.
- TTL = `EARLY_EVENT_TTL_MS` (60s) — same as the early-event
  buffer, so by the time a tombstone expires there can be no stale
  frame for that id anywhere in the system.
- Lazy `sweepExpiredTombstones` keeps the Map bounded.

3 byId.delete sites covered:
- channel.exited handler (line ~2216): `info.client.markSessionClosed`
- closeSession (line ~3367): `ci?.client.markSessionClosed`
- killSession (line ~3787): `ci?.client.markSessionClosed`

Test: new `tombstones closed sessionIds so late notifications cannot
leak into a future load of the same id` exercises the full
close-then-stale-notification → load-same-id-no-leak invariant via
FakeAgent's loadSessionImpl returning the requested id verbatim.

Verified: 1555/1555 tests pass across 46 files; typecheck clean
across 4 workspaces; lint clean.
…ail-events

# Conflicts:
#	docs/developers/qwen-serve-protocol.md
@doudouOUC doudouOUC requested a review from wenshao May 18, 2026 14:49
Comment thread packages/cli/src/serve/httpAcpBridge.ts Outdated
Comment thread packages/sdk-typescript/src/daemon/events.ts Outdated
Comment thread packages/cli/src/serve/httpAcpBridge.ts
Comment thread packages/core/src/tools/mcp-client-manager.ts
Comment thread packages/core/src/config/config.ts
Codex round 6 of #4271 surfaced 5 actionable items: 1 Critical
regression introduced by round 5 + 4 observability/hardening
suggestions. All 5 adopted.

#1 (Critical) Tombstone-vs-restore window — `httpAcpBridge.ts`

The round 5 tombstone (60s post-close) was rejecting LEGITIMATE
restore-time guardrail events. `markSessionClosed` sets the
tombstone; `drainEarlyEvents` clears it — but
`drainEarlyEvents` only runs AFTER the ACP `loadSession` /
`unstable_resumeSession` returns. The restored child's MCP
discovery firing during that ACP call window had its budget
events buffered → tombstone-rejected → lost. Same close → load
sequence within 60s lost the entire startup window of the
re-opened session.

Fix: new `inFlightRestoreIds: Set<string>` allow-list on
BridgeClient. `markRestoreInFlight(sid)` called BEFORE the ACP
restore call (in the IIFE that wraps `connection.loadSession` /
`unstable_resumeSession`). `clearRestoreInFlight(sid)` paired in
the IIFE's `finally` so success and failure both release.
`bufferEarlyEvent` skips the tombstone check for ids in the
allow-list. Idempotent (Set semantics) so coalesced restores work
correctly.

#2 (Suggestion) `thresholdRatio` predicate relaxed —
`packages/sdk-typescript/src/daemon/events.ts`

Pre-fix `isMcpBudgetWarningData` required `thresholdRatio === 0.75`
exactly; daemon emits `MCP_BUDGET_WARN_FRACTION` from a separate
package. A daemon-side bump (e.g. 0.80) would silently route
every warning through `unrecognizedKnownEventCount` — a
cross-package coordination hazard with no operator-visible
failure mode. Relaxed to `isFiniteNumber` with a comment
explaining the SDK's role is wire-shape validation, not threshold
enforcement (semantics owned by daemon constant + protocol docs).
NaN/Infinity rejection preserved. Test updated to assert that 0.5
is now accepted (forward-compat) and NaN is rejected (still wire-
sane).

#3 (Suggestion) Early-event buffer drops now log —
`httpAcpBridge.ts`

Pre-fix the 3 drop paths in `bufferEarlyEvent` (tombstone reject,
session-cap reached, per-session-cap reached) silently `return`'d
while every other drop site in this PR has stderr/debug
breadcrumbs. Now each drop emits `writeStderrLine` (not
`debugLogger.debug` — these drops can indicate operator-actionable
abuse / fanout, so they're at the visible level matching
`refuseAndLog`'s pattern).

#4 (Suggestion) `emitRefusedBatchIfAny` defensive branches log —
`packages/core/src/tools/mcp-client-manager.ts`

Two "should never happen" branches (mode/budget invariant
violation, names/queue sync gap) silently `clear` and `return`
pre-fix. Now each emits `debugLogger.warn` so a future regression
that reaches either branch leaves a diagnostic trail.

#5 (Suggestion) Clear `pendingMcpBudgetCallback` after apply —
`packages/core/src/config/config.ts`

Pre-fix the field persisted for Config's lifetime. Subagent
override paths (`createApprovalModeOverride` /
`buildSubagentContextOverride`) call `createToolRegistry` again
and would re-apply the parent session's callback to a fresh
manager — routing subagent telemetry through the wrong ACP
session. Now cleared to `undefined` after the apply. Late-call
setter (`setMcpBudgetEventCallback` after initialize) unaffected
— it dispatches directly to the existing manager.

Verified: 1580/1580 tests pass across 47 files; typecheck clean
across 4 workspaces; lint clean on 5 touched files.
Copy link
Copy Markdown
Collaborator

@wenshao wenshao left a comment

Choose a reason for hiding this comment

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

[Critical] [typecheck] packages/sdk-typescript/test/unit/daemonEvents.test.ts:670

tsc --noEmit reports TS2345: the pre-existing slow_client_warning fixture at line 664 is inferred with widened literal types (v: number, type: string) and fails the asKnownDaemonEvent parameter check. The same type-widening pattern was fixed for the new PR 14b fixtures at lines 776 and 914 (satisfies DaemonEvent), but this older sibling fixture was missed.

    const warning = {
      v: 1,
      type: 'slow_client_warning',
      data: { queueSize: 192, maxQueued: 256, lastEventId: 42 },
    } satisfies DaemonEvent;

(This finding cannot be posted as an inline comment because line 670 is unchanged code outside the PR diff — the regression is caused by the PR's type additions in events.ts which widen TypeScript's inference for existing object literals.)

— qwen-latest-series-invite-beta-v28 via Qwen Code /review

doudouOUC added 3 commits May 19, 2026 00:33
Codex round 7 of #4271 surfaced 3 lifecycle issues — 1 Critical
subagent isolation hole + 1 P2 stale-frame leak on restore failure
+ 1 P3 unbounded tombstone map. All 3 adopted.

#1 (P2) Late-call setMcpBudgetEventCallback should not stash —
   `packages/core/src/config/config.ts`

Pre-fix: the late-call branch (after `initialize()`) assigned to
`pendingMcpBudgetCallback` BEFORE applying directly to the existing
manager. Round 6 #5 cleared the field inside `createToolRegistry`,
but the late-call setter re-set it — so a subsequent
`createToolRegistry` (subagent override) inherited the parent
session's callback and routed subagent telemetry through the wrong
ACP session.

Fix: restructured to two paths.
- Late-call (`toolRegistry` exists): apply directly + clear
  `pendingMcpBudgetCallback`. Never stash on this path.
- Pre-init (no registry yet): stash for `createToolRegistry` to
  consume — the only way to reach a manager that doesn't exist yet.

Test: new `does NOT stash the callback when called after initialize()`
asserts that after a late-call setter + a subsequent
`config.createToolRegistry({ forSubAgent: true })`, the subagent
manager's `setOnBudgetEvent` was never called.

#2 (P2) Drop buffered guardrail events on restore failure —
   `packages/cli/src/serve/httpAcpBridge.ts`

Pre-fix: round 6 #1 added `markRestoreInFlight` so `bufferEarlyEvent`
accepts frames during restore. Failure path called
`clearRestoreInFlight` but did NOT purge `earlyEvents[id]`. A
subsequent successful retry (`session/load` of the same id within
60s) would `drainEarlyEvents` those stale frames into the new
session — exactly the leak round 5's tombstone was meant to prevent.

Fix: in the restore IIFE's `finally` block, when `registeredEntry`
is undefined (failure path), call `markSessionClosed(req.sessionId)`.
That helper already does both required actions: refresh tombstone
+ delete `earlyEvents[id]`.

Test: new `purges buffered guardrail events when restore fails` —
spawn + close + load (fails after child queues guardrail event) +
load again (succeeds) → assert no stale `mcp_budget_warning` in the
ring.

#3 (P3) Sweep tombstones in markSessionClosed —
   `packages/cli/src/serve/httpAcpBridge.ts`

Pre-fix: `sweepExpiredTombstones` was only called inside
`bufferEarlyEvent`. On a daemon with high session-churn but few
extNotifications (the common production pattern when MCP guardrail
mode is `off`), the tombstone map grew monotonically — the
documented 60s TTL didn't bound memory.

Fix: sweep at the top of `markSessionClosed`. Cheap (one integer
compare per entry); under any realistic workload the map stays
small.

Verified: 1582/1582 tests pass across 47 files; typecheck clean
across 4 workspaces; lint clean on 4 touched files.
…ail-events

# Conflicts:
#	docs/developers/qwen-serve-protocol.md
#	packages/core/src/tools/mcp-client-manager.ts
Codex round 8 flagged `slow_client_warning` (line 670, this file)
as the sibling of PR 14b's `mcp_budget_warning` /
`mcp_child_refused_batch` fixtures (rounds 3 #3) — same widening
shape (`v: 1` → `number`, `type: '…'` → `string`), same describe
block, same `asKnownDaemonEvent` call site.

Note: the reviewer's claim that the issue was "caused by the PR's
type additions in events.ts which widen TypeScript's inference for
existing object literals" is **inaccurate**. The widening is
inherent to TypeScript's literal-inference rules for `let`-style
object bindings and predates PR 14b. Verified by running explicit
`tsc --noEmit test/unit/daemonEvents.test.ts`: 18 TS2345 errors
across the file, ~16 of which involve `model_switched` /
`permission_request` / `session_update` / `client_evicted` /
`stream_error` fixtures that PR 14b never touched.

Why fix only one: `slow_client_warning` is the closest topical
sibling to PR 14b's two fixtures (the round 3 #3 contract
explicitly was "PR 14b's own fixtures"). Extending to the other
17 widening sites would (a) bloat the PR diff with PR 4 / PR 10 /
PR 11 era test debt unrelated to PR 14b's review focus, and (b)
still leave the underlying root cause (sdk `tsconfig.json`
excludes the test directory from typecheck) — `npm run typecheck`
passes clean before AND after this commit because tests aren't
in scope. A future PR can opt tests into the typecheck scope and
fix all 17 in one batch with the actual gating change.

Verified: 46/46 sdk daemonEvents tests pass; 1656/1656 across the
sweep; typecheck clean across 4 workspaces; lint clean.
@doudouOUC doudouOUC requested a review from wenshao May 18, 2026 16:47
Copy link
Copy Markdown
Collaborator

@wenshao wenshao left a comment

Choose a reason for hiding this comment

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

No review findings. Downgraded from Approve to Comment: CI failing: Post Coverage Comment (ubuntu-latest, 22.x), Test (windows-latest, Node 22.x), Test (macos-latest, Node 22.x), Test (ubuntu-latest, Node 22.x). — qwen-latest-series-invite-beta-v28 via Qwen Code /review

@wenshao
Copy link
Copy Markdown
Collaborator

wenshao commented May 18, 2026

Local validation report

Verified head 61b1f144a on a clean checkout (Node v22.22.2) against a live qwen serve daemon with budget enforcement and a minimal MCP stub speaking the real stdio JSON-RPC protocol.

Build & static checks

Step Result
npm install clean
npm run build clean
npm run typecheck (cli + core + sdk-typescript + webui) clean
eslint --max-warnings 0 over all 17 PR-touched files 0 warnings, 0 errors

Unit tests (1654 passed)

Suite Result
packages/core/src/tools/mcp-client-manager.test.ts 71 passed — exhaustive state-machine coverage (arm / fire / re-arm hysteresis, refused-batch coalescing, transport preservation across families, off-mode no-op, readResource length-1 batch, stop() re-arms state)
packages/core/src/config/config.test.ts 162 passed
packages/cli/src/serve/** + acp-integration/** 1000 passed (+ 2 unrelated root-DAC failures — see Caveats)
packages/sdk-typescript/test/unit/** 421 passed — including 5 new predicate/reducer cases (rejects thresholdRatio !== 0.75, rejects mode: 'warn' on refused-batch, rejects unknown transports, reducer counter + last* capture, malformed payloads → unrecognizedKnownEventCount)

Capability advertisement

GET /capabilities advertises both PR-14 (mcp_guardrails — snapshot) and PR-14b (mcp_guardrail_events — push) tags, distinct as designed. Total feature count: 38 (was 37 on origin/main pre-PR).

Live HTTP smoke under real budget pressure

Daemon launched with --mcp-client-budget=2 --mcp-budget-mode=enforce and 5 stub MCP servers configured in .qwen/settings.json. The stub is a minimal Node script speaking 2024-11-05 MCP stdio that returns one ping tool — needed because mcp-client.ts:648 rejects servers exposing zero tools and zero prompts.

Scenario Result
Daemon boots; PR-14 snapshot reflects budget pressure budgets[0] = {liveCount: 2, refusedCount: 3, budget: 2, mode: enforce, status: error, errorKind: budget_exhausted}
Refused servers each carry disabledReason: "budget" + errorKind: "budget_exhausted" + remediation hint ✅ stub-3 / stub-4 / stub-5
In-budget servers transition to mcpStatus: "connected" ✅ stub-1 / stub-2
Daemon stderr emits qwen serve: MCP server 'X' refused (budget exhausted, budget=2, mode=enforce) per refused server, per discovery pass ✅ — state-machine callback fires; the two emissions per server reflect the two boot-time discovery passes, consistent with the PR's coalescing contract (length-N batch per pass, not per-server)
POST /workspace/mcp/stub-3/restart (refused server, soft-refuse path) ✅ 200 {restarted: false, skipped: true, reason: "budget_would_exceed"}
POST /workspace/mcp/stub-1/restart (live server, happy path) ✅ 200 {restarted: true, durationMs: 22}
SSE delivery of MCP events on /session/:id/events mcp_server_restarted and mcp_server_restart_refused arrive on the session bus — same extNotification → bridge → SSE wire as the two PR-14b events

Why mcp_budget_warning and mcp_child_refused_batch were not literally observed over the wire

These events are session-scoped, published into entry.events.publish on each live session bus. The state machine fires them at first 75% threshold crossing and at end of each discovery pass with ≥1 refusal. In real conditions:

  • Initial boot fires the events before any session SSE exists. With budget=2 and 5 servers, ratio reaches 100% on the first discovery pass, so mcp_budget_warning fires; the 3-server refusal also coalesces into one mcp_child_refused_batch. Both fire into a manager that has zero session subscribers at that point → the events drop on the floor. This is intentional per the PR description: "Operators dashboarding /workspace/mcp already see budget pressure via budgets[0].status and per-server disabledReason: 'budget'; this PR adds typed SSE events so SDK clients can react without polling". Snapshot is the source of truth for initial state; push events are for subsequent deltas.
  • Re-firing requires the ratio to drop below 37.5% before crossing 75% upward again. With budget=2 that's <0.75 live → 0 live, which has no clean external trigger (restart keeps the slot occupied; there is no "stop server" HTTP route in this PR's surface). The 71 manager unit tests drive this state machine end-to-end with deterministic timing, and mcp_server_restarted / mcp_server_restart_refused arriving on the same wire proves the extNotification → bridge republish path is sound.

If you'd like a literal wire capture of mcp_budget_warning, a follow-up integration-tests/cli/qwen-serve-baseline.test.ts case can boot the daemon, attach SSE first, then send a tools/call against a refused server's lazy-spawn path — the PR already wires the length-1 batch on that path. Not blocking.

Cross-cutting verification

  • mcp_guardrails vs mcp_guardrail_events capability separation: both advertised, distinct strings — older SDKs that only understand mcp_guardrails will continue to poll and remain forward-compatible.
  • EVENT_SCHEMA_VERSION = 1 unchanged: confirmed in events.ts — push events are an additive narrowable extension as the PR claims, not a wire bump.
  • v: 1 envelope on the qwen/notify/session/mcp-budget-event ext-notification: source-verified in acpAgent.ts dispatch + bridge handler.
  • Off-mode constructor strips onBudgetEvent: verified by the 71 manager tests (off-mode no-op case).

Caveats

Two test failures (workspaceMemory.test.ts:415, workspaceAgents.test.ts:722) when running the full packages/cli/src/serve/ vitest under root locally — both rely on chmod 0o555 to provoke EACCES, which root bypasses via DAC. Introduced by #4249, unrelated to this PR, green on GitHub runners.

Verdict

Approvable. The state machine + extNotification wire + bridge republish + SDK predicate/reducer chain holds together end-to-end. PR 14 snapshot remains correct, PR 14b push tag is advertised, the same SSE wire that delivers mcp_server_restarted / mcp_server_restart_refused will deliver mcp_budget_warning / mcp_child_refused_batch once a session is attached during a state transition.

Minor (non-blocking) observation worth a follow-up note: initial-boot refusal/threshold events have no subscriber to receive them. The PR description correctly directs SDK consumers to the /workspace/mcp snapshot for initial state, but a short note in docs/users/qwen-serve.md near the push-event description — "the first mcp_budget_warning may fire during daemon boot before any client attaches; consult /workspace/mcp for the initial state" — would prevent future "why didn't I get the event?" reports.

Copy link
Copy Markdown
Collaborator

@wenshao wenshao left a comment

Choose a reason for hiding this comment

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

Approving based on the local validation pass posted above — state machine + extNotification + bridge republish + SDK predicate/reducer chain holds end-to-end, PR 14 snapshot remains correct, and the same SSE wire that delivered mcp_server_restarted / mcp_server_restart_refused in real conditions will deliver mcp_budget_warning / mcp_child_refused_batch on subsequent state transitions. The one non-blocking note (a docs sentence pointing initial-state consumers at /workspace/mcp before the first push event fires at boot) can land as a fold-in or follow-up doc PR.

@doudouOUC doudouOUC merged commit 3ffe321 into main May 18, 2026
9 checks passed
Copy link
Copy Markdown
Collaborator

@wenshao wenshao left a comment

Choose a reason for hiding this comment

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

No issues found. LGTM! ✅ — qwen-latest-series-invite-beta-v28 via Qwen Code /review

doudouOUC added a commit that referenced this pull request May 18, 2026
…#4175 PR 22a) (#4295)

* refactor(acp-bridge): create skeleton + lift zero-coupling primitives (#4175 PR 22a)

First slice of #4175 Wave 5 PR 22 (`refactor(serve): extract acp bridge
primitives`). Lifts the three primitives from `packages/cli/src/serve/`
that have zero coupling to the rest of `serve/`, so PR 22a can land
ahead of PR 17 (#4282) and PR 14b (#4271) without merge-conflict risk
on `httpAcpBridge.ts`. Also seeds the `PermissionMediator` interface
contract that PR 24 will implement (4 strategies — first-responder /
designated / consensus / local-only — replacing the inline
first-responder voting in `BridgeClient.requestPermission`).

What moves
- `cli/src/serve/eventBus.ts` (578 LOC, no internal imports) →
  `packages/acp-bridge/src/eventBus.ts`
- `cli/src/serve/inMemoryChannel.ts` (73 LOC, only depends on
  `@agentclientprotocol/sdk`) → `packages/acp-bridge/src/inMemoryChannel.ts`
- `httpAcpBridge.ts:638-677` `AcpChannel` / `AcpChannelExitInfo` /
  `ChannelFactory` types → `packages/acp-bridge/src/channel.ts`
- Both test files moved alongside their sources

What's new
- `packages/acp-bridge/` package (`@qwen-code/acp-bridge`, internal,
  not published to npm yet)
- `packages/acp-bridge/src/permission.ts` — type-only
  `PermissionMediator` / `PermissionPolicy` / `PermissionResolution`
  / `PermissionRequestRecord` / `PermissionVote` /
  `PermissionVoteOutcome`. No implementation; PR 24 fills it in.
- `packages/cli/src/serve/eventBus.ts` and `inMemoryChannel.ts` are
  now one-line re-export wrappers for backward compat.
- `httpAcpBridge.ts:638-677` is now a one-line `import type` +
  `export type` re-export.

Backward compatibility
- All existing relative imports (`./eventBus.js`,
  `./inMemoryChannel.js`, `../serve/eventBus.js`) keep resolving via
  the wrappers — no churn for the 8 importer sites in
  `cli/src/serve/` plus `cli/src/commands/serve.ts:14`.
- `httpAcpBridge.ts` continues to export `AcpChannel` /
  `AcpChannelExitInfo` / `ChannelFactory` so any external consumer
  is unaffected.
- Zero `/capabilities` payload changes, zero HTTP route changes,
  zero SDK behavior changes, zero spawn-site behavior changes.

What's not in this slice (deferred to PR 22b after PR 17/14b land)
- `BridgeClient` + `createHttpAcpBridge` factory + `defaultSpawnChannelFactory`
  (~3000 LOC, lines 1082-3770 + 4106-4307 of `httpAcpBridge.ts`).
- Channel and VSCode-IDE-companion own-spawn migrations.

Tests
- `npm test --workspace @qwen-code/acp-bridge` — 28/28 pass
  (eventBus 20 + inMemoryChannel 8) at the new location.
- `cd packages/cli && npx vitest run src/serve/` — 567/567 pass
  (no regressions).
- `cd packages/cli && npx tsc --noEmit` clean.

References
- #4175 Wave 5 PR 22 row
- #3803 chiga0's "Stage 1.5-prereq AcpChannel lift"
- `httpAcpBridge.ts:679-696` FIXME for the four `PermissionMediator`
  strategies this slice declares

* fix(acp-bridge): minimize package-lock.json diff to acp-bridge entries only

The previous commit ran `npm install --ignore-scripts`, which npm 11
treated as license to renormalize peer-dependency markers across the
entire lockfile and resolve `@types/react@18.3.28`,
`@types/react-dom@18.3.7`, and `@types/prop-types@15.7.15` away from
their pinned versions. CI's `npm ci` then refused to install because
the manifests no longer matched the lockfile.

Restored package-lock.json to origin/main and surgically added only the
three entries the new package actually requires:

- `node_modules/@qwen-code/acp-bridge` workspace symlink
- `packages/acp-bridge` workspace manifest snapshot
- `@qwen-code/acp-bridge` listed under `packages/cli`'s dependencies

`npm ci --no-audit --ignore-scripts` now succeeds (1453 packages, no
warnings about stale lockfile entries). Re-verified `acp-bridge`
package tests (28/28 pass) and `tsc --build` clean.

* fix(acp-bridge): address PR 22a review feedback

Three review-driven fixes:

1. **wenshao**: removed `src/**/*.test.ts` from `tsconfig.json` exclude
   so the moved `eventBus.test.ts` and `inMemoryChannel.test.ts`
   regain typecheck coverage. Pre-fix, a future change to
   `BridgeEvent` / `SubscribeOptions` shape would only fail at
   runtime; post-fix `tsc --noEmit` catches the mismatch. Matches
   `packages/core/tsconfig.json`'s pattern (no test exclude;
   emitted test artefacts in dist/ are accepted convention).

2. **Copilot**: corrected the FIXME line citation in
   `permission.ts` and `README.md` from `1144-1154` to the actual
   range `1096-1106` (the four-strategy FIXME inside
   `BridgeClient.requestPermission`). Verified via grep against
   current `httpAcpBridge.ts`.

3. **Copilot review summary**: added a "Imports — root vs subpaths"
   section to README.md explaining when to use the barrel root
   (`@qwen-code/acp-bridge`) vs per-module subpaths
   (`/eventBus`, `/inMemoryChannel`, `/channel`, `/permission`),
   and added `@see` JSDoc pointers in `cli/src/serve/eventBus.ts`
   and `inMemoryChannel.ts` wrappers to the implementation files
   for the design-rationale comments that moved to acp-bridge.

Verification: 28/28 acp-bridge tests + 567/567 cli serve tests
pass; `tsc --noEmit` clean across both packages including the
moved test files.

Declined (replied on the PR):
- Move `@agentclientprotocol/sdk` to `peerDependencies` — sound
  advice in general but not yet relevant; package is internal
  (`files: ["dist"]`, no npm publish), so dedupe is automatic
  through monorepo file: links. Will revisit during PR 28
  (npm alpha publish).
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.

3 participants