Skip to content

feat(telemetry): Phase 2 — tool.blocked_on_user + hook spans (#3731)#4321

Open
doudouOUC wants to merge 17 commits into
mainfrom
feat/telemetry-phase-2-spans
Open

feat(telemetry): Phase 2 — tool.blocked_on_user + hook spans (#3731)#4321
doudouOUC wants to merge 17 commits into
mainfrom
feat/telemetry-phase-2-spans

Conversation

@doudouOUC
Copy link
Copy Markdown
Collaborator

@doudouOUC doudouOUC commented May 19, 2026

Summary

Phase 2 of the hierarchical session-tracing plan in #3731. Adds two OTel span types on top of the infrastructure landed by Phase 1 (#4126) and Phase 1.5 (#4302).

  • qwen-code.tool.blocked_on_user — brackets the time a tool spends in awaiting_approval waiting for the user. Child of the tool span. Records decision (proceed_once / proceed_always / cancel / aborted / auto_approved) and source (cli / ide / hook / auto / system). Status stays UNSET — waiting is neither OK nor ERROR.
  • qwen-code.hook — wraps each pre/post-hook fire site so a slow hook can be told from a slow tool. Records hook_event (PreToolUse / PostToolUse / PostToolUseFailure), tool_name, shouldProceed, shouldStop, blockType, hasAdditionalContext. Status stays UNSET on intentional blocking; ERROR only when the hook throws.

Architectural change

To make blocked_on_user a child of the tool span, the tool span lifecycle moved from executeSingleToolCall to _schedule's validating-loop — covering validating → awaiting_approval → executing in one span. Two new private Maps on CoreToolScheduler hold span refs across method boundaries (callId-keyed). Centralized cleanup via finalizeToolSpan / finalizeBlockedSpan ensures every terminal status path also ends the corresponding span.

  • 8 terminal tool-span end sites: signal.aborted at loop entry, hard deny, plan-mode block, non-interactive deny, permission-hook deny, background-agent deny, _schedule catch, executeSingleToolCall finally.
  • 5 blocked_on_user end sites: handleConfirmationResponse cancel + proceed, autoApproveCompatiblePendingTools, _schedule catch under signal.aborted, global-error catch. ModifyWithEditor stays inside one span until final proceed/cancel — duration_ms reflects total user think-time including editor side trips.
  • 6 hook fire sites wrapped: firePreToolUseHook, firePostToolUseHook, four safelyFirePostToolUseFailureHook variants. fireNotificationHook (permission_prompt) intentionally NOT wrapped — fire-and-forget, duration is meaningless.

Diverges from claude-code on one point

claude-code's endToolBlockedOnUserSpan uses findLast-by-type to locate the span — under concurrent tool calls this can end the wrong span. Our helpers take the span object explicitly via getSpanId(span) lookup. The concurrent blocked spans test asserts the regression that bug would otherwise produce.

Closes Phase 2 in #3731

Ticks off these checklist items in the parent issue under ### Deeper observability (P3) → Phase 2:

  • Add tool.blocked_on_user span type + helper; wire into approval state machine in coreToolScheduler._schedule
  • Add hook span type + helper; wire into pre/post hook execution in coreToolScheduler.executeSingleToolCall

Test plan

  • pnpm typecheck — clean
  • npx vitest run src/telemetry/session-tracing.test.ts src/core/coreToolScheduler.test.ts — 187 / 187 pass (47 telemetry helper tests + 140 scheduler tests)
  • npx vitest run (full core package) — only the preexisting anthropicContentGenerator User-Agent test + a few crawler.test.ts / gitDiff.test.ts filesystem-timing failures remain. Confirmed unrelated to telemetry — none touch the changed files.
  • npx eslint — clean

Rollback

This PR moves the tool span lifecycle. The full set of changes is contained in one commit (38ba22d9c); revert is a single git revert. The new helpers are additive — disabling them would only require dropping the calls in coreToolScheduler.ts and removing the new exports from session-tracing.ts.

🤖 Generated with Qwen Code

Local verification (tmux + vitest)

Run the script below in a tmux pane to verify the PR locally.
Captured output and expected results are inlined.

Script

#!/usr/bin/env bash
# verify-phase-2-spans.sh — verify PR #4321 (Phase 2 telemetry spans)
set -uo pipefail

WORKTREE=/path/to/qwen-code   # adjust to your local checkout
cd "$WORKTREE/packages/core"

echo "[1/3] Branch + HEAD"
git -C "$WORKTREE" rev-parse --abbrev-ref HEAD
git -C "$WORKTREE" log --oneline -3

echo "[2/3] Typecheck"
npx tsc --noEmit && echo "TYPECHECK_OK"

echo "[3/3] Affected tests (Phase 2-tagged only)"
npx vitest run \
  src/telemetry/session-tracing.test.ts \
  src/core/coreToolScheduler.test.ts \
  --reporter=verbose 2>&1 \
  | grep -E "Phase 2|#3731|#4321|#4302|Test Files|Tests " \
  | sort -u

Run via tmux

tmux new-session -d -s phase2-verify -x 200 -y 50 \
  "/path/to/verify-phase-2-spans.sh 2>&1 | tee phase2-output.log; touch /tmp/.phase2-done"
while [ ! -f /tmp/.phase2-done ]; do sleep 5; done
tmux capture-pane -t phase2-verify -pS - > phase2-pane.txt

Expected

Captured output (this PR, branch feat/telemetry-phase-2-spans @ 6767469b2)

[1/3] Branch + HEAD
feat/telemetry-phase-2-spans
6767469b2 fix(telemetry): address #4321 review — Copilot inline + code-reviewer + silent-failure-hunter
38ba22d9c feat(telemetry): Phase 2 — tool.blocked_on_user + hook spans

[2/3] Typecheck
TYPECHECK_OK

[3/3] Affected tests (Phase 2-tagged only)
 ✓ src/core/coreToolScheduler.test.ts > CoreToolScheduler telemetry spans > blocked_on_user span ends with cancel when the user rejects (#3731 Phase 2) 0ms
 ✓ src/core/coreToolScheduler.test.ts > CoreToolScheduler telemetry spans > every span recorded in a successful tool call is ended (#3731 Phase 2) 0ms
 ✓ src/core/coreToolScheduler.test.ts > CoreToolScheduler telemetry spans > execution sub-span: cancelled flag is NOT set on real exceptions (#4302) 0ms
 ✓ src/core/coreToolScheduler.test.ts > CoreToolScheduler telemetry spans > hook span records shouldProceed=false / blockType=denied when pre-hook blocks (#3731 Phase 2) 0ms
 ✓ src/core/coreToolScheduler.test.ts > CoreToolScheduler telemetry spans > hook span records shouldStop=true when post-hook stops execution (#3731 Phase 2) 0ms
 ✓ src/core/coreToolScheduler.test.ts > CoreToolScheduler telemetry spans > tool span is started in _schedule and ended even when pre-hook denies execution (#3731 Phase 2) 0ms
 ✓ src/core/coreToolScheduler.test.ts > CoreToolScheduler request queueing > should auto-approve remaining tool calls when first tool call is approved with ProceedAlways 17ms
 ✓ src/telemetry/session-tracing.test.ts > session-tracing > blocked_on_user spans (#3731 Phase 2) > parents the blocked span under the explicitly-passed tool span 0ms
 ✓ src/telemetry/session-tracing.test.ts > session-tracing > blocked_on_user spans (#3731 Phase 2) > records decision/source attributes on end and leaves status UNSET 0ms
 ✓ src/telemetry/session-tracing.test.ts > session-tracing > blocked_on_user spans (#3731 Phase 2) > is idempotent — second end is a no-op 0ms
 ✓ src/telemetry/session-tracing.test.ts > session-tracing > blocked_on_user spans (#3731 Phase 2) > returns NOOP span when SDK is not initialized 0ms
 ✓ src/telemetry/session-tracing.test.ts > session-tracing > blocked_on_user spans (#3731 Phase 2) > handles concurrent blocked spans without findLast confusion 0ms
 ✓ src/telemetry/session-tracing.test.ts > session-tracing > blocked_on_user spans (#3731 Phase 2) > falls back to resolveParentContext when the tool span was already ended 0ms
 ✓ src/telemetry/session-tracing.test.ts > session-tracing > hook spans (#3731 Phase 2) > parents under the active tool span when called inside runInToolSpanContext 0ms
 ✓ src/telemetry/session-tracing.test.ts > session-tracing > hook spans (#3731 Phase 2) > records shouldProceed/blockType when PreToolUse blocks 0ms
 ✓ src/telemetry/session-tracing.test.ts > session-tracing > hook spans (#3731 Phase 2) > records shouldStop/hasAdditionalContext on PostToolUse 0ms
 ✓ src/telemetry/session-tracing.test.ts > session-tracing > hook spans (#3731 Phase 2) > marks status ERROR only when the hook itself threw 0ms
 ✓ src/telemetry/session-tracing.test.ts > session-tracing > hook spans (#3731 Phase 2) > returns NOOP span when SDK is not initialized 0ms
 ✓ src/telemetry/session-tracing.test.ts > session-tracing > tool execution sub-spans > cancelled: true keeps status UNSET while still recording attributes (#4302) 0ms

 Test Files  2 passed (2)
      Tests  187 passed (187)

Coverage map

Test What it proves
parents the blocked span under the explicitly-passed tool span blocked_on_user is a child of the tool span (claude-code-aligned trace tree)
records decision/source attributes on end and leaves status UNSET new attribute schema works; waiting is correctly UNSET status
handles concurrent blocked spans without findLast confusion regression test for the claude-code findLast bug we deliberately don't have
tool span is started in _schedule and ended even when pre-hook denies tool span lifecycle correctly covers the new validating → terminal range
blocked_on_user span ends with cancel when the user rejects end-to-end Cancel path through handleConfirmationResponse
every span recorded in a successful tool call is ended leak guard — no path forgets to finalize
auto-approve remaining tool calls ... ProceedAlways sibling auto-approve path emits decision: 'auto_approved', source: 'auto'
hook span records shouldProceed=false / blockType=denied when pre-hook blocks PreToolUse hook span records the actual block reason (#4321 review C2)
hook span records shouldStop=true when post-hook stops execution PostToolUse hook span records stop signal
marks status ERROR only when the hook itself threw hook span status semantics (UNSET on intentional block, ERROR on throw)

Adds two OTel span types under the existing hierarchical session-tracing
infrastructure (#3731 Phase 2; depends on Phase 1 #4126 and Phase 1.5 #4302):

1. `qwen-code.tool.blocked_on_user` — brackets the time a tool spends in
   awaiting_approval waiting for the user. Child of the tool span. Records
   decision (proceed_once / proceed_always / cancel / aborted /
   auto_approved) and source (cli / ide / hook / auto / system). Status
   stays UNSET — waiting is neither OK nor ERROR.

2. `qwen-code.hook` — wraps each pre/post-hook fire site so a slow hook can
   be told from a slow tool. Records hook_event (PreToolUse / PostToolUse /
   PostToolUseFailure), tool_name, shouldProceed, shouldStop, blockType,
   hasAdditionalContext. Status stays UNSET on intentional blocking
   decisions; ERROR only when the hook itself throws.

To make blocked_on_user a child of the tool span, the tool span lifecycle
moved from `executeSingleToolCall` to `_schedule`'s validating-loop —
covering validating → awaiting_approval → executing in one span. Two new
private Maps on CoreToolScheduler hold span refs across method boundaries
(callId-keyed). Centralized cleanup via `finalizeToolSpan` /
`finalizeBlockedSpan` private helpers ensures every terminal status path
also ends the corresponding span.

Eight terminal sites now finalize the tool span: signal.aborted at loop
entry, hard deny, plan-mode block, non-interactive deny, permission-hook
deny, background-agent deny, _schedule catch, executeSingleToolCall
finally. Five blocked_on_user end sites: handleConfirmationResponse cancel
and proceed branches, autoApproveCompatiblePendingTools, _schedule catch
under signal.aborted, and the global-error catch. ModifyWithEditor stays
inside one blocked_on_user span until the final proceed/cancel — the
duration_ms reflects total user think-time including editor side trips.

Six hook fire sites are wrapped: firePreToolUseHook, firePostToolUseHook,
and four safelyFirePostToolUseFailureHook variants (success-path
interrupt, toolResult.error path, catch-path interrupt, catch-path real
exception). fireNotificationHook is intentionally NOT wrapped — it's
fire-and-forget and the duration is meaningless.

Mirrors claude-code's session-tracing pattern but deliberately diverges on
one point: every end-helper takes the span object explicitly via
`getSpanId(span)` lookup instead of `findLast`-by-type. Under concurrent
tool calls, claude-code's findLast can end the wrong blocked span; passing
the ref directly is concurrency-safe.

Tests:
- session-tracing.test.ts: 11 new tests covering parent resolution
  (explicit parent for blocked_on_user, ALS-based for hook), idempotent
  end, NOOP behavior, error-status mapping, and a concurrency regression
  test (two parallel blocked spans ended in reverse order).
- coreToolScheduler.test.ts: mock extended with the four new helpers and
  two new metadata fields. New tests cover the tool span outliving a
  pre-hook deny path, blocked_on_user ending with cancel via the
  awaiting_approval flow, hook span recording shouldProceed=false /
  blockType='denied' on pre-hook block and shouldStop=true /
  blockType='stop' on post-hook stop, and a leak guard that asserts
  every recorded lifecycle span is ended after a successful tool call.

🤖 Generated with [Qwen Code](https://github.com/QwenLM/qwen-code)
Copilot AI review requested due to automatic review settings May 19, 2026 09:54
@github-actions
Copy link
Copy Markdown
Contributor

📋 Review Summary

This PR implements Phase 2 of the hierarchical session-tracing plan (#3731), adding two new OTel span types (tool.blocked_on_user and hook) with comprehensive test coverage. The architectural change to move the tool span lifecycle from executeSingleToolCall to _schedule is well-executed, and the explicit span-parenting approach correctly avoids the findLast-by-type concurrency bug present in claude-code. The implementation is thorough, with 8 terminal tool-span end sites and 5 blocked_on_user end sites all accounted for.

🔍 General Feedback

  • Strong architectural decision: Moving the tool span lifecycle to _schedule to cover validating → awaiting_approval → executing in one span is the right call for accurate tracing. This gives a complete picture of tool execution from the user's perspective.
  • Explicit span parenting: Passing the span object directly to startToolBlockedOnUserSpan and startHookSpan is superior to the findLast-by-type approach. The regression test for concurrent blocked spans validates this design choice.
  • Comprehensive cleanup strategy: Centralized cleanup via finalizeToolSpan / finalizeBlockedSpan ensures no span leaks across the 8 terminal tool-span end sites and 5 blocked_on_user end sites. This is a robust pattern.
  • Good test coverage: 187 tests pass, including specific tests for the concurrency bug, idempotency, NOOP span handling, and fallback parent resolution.
  • Thoughtful status handling: Keeping status UNSET for intentional blocking (waiting on user, hook blocking) and only using ERROR for actual hook exceptions is semantically correct for OTel.

🎯 Specific Feedback

🟢 Medium

  • File: packages/core/src/telemetry/session-tracing.ts:557-562 - The startToolBlockedOnUserSpan function has a defensive fallback when the tool span is already ended, but this scenario suggests a potential logic error elsewhere. Consider adding a debug log when this fallback path is taken to help diagnose unexpected span ordering during development:

    if (!parentSpanCtx) {
      debugLogger.debug('blocked_on_user span started without active tool parent - using fallback resolution');
    }
  • File: packages/core/src/core/coreToolScheduler.ts - The diff mentions finalizeToolSpan and finalizeBlockedSpan as centralized cleanup helpers, but these don't appear in the exported function list in session-tracing.ts. If these are private helpers in coreToolScheduler.ts, consider adding a comment explaining why they're not part of the telemetry module's public API (i.e., they're implementation details specific to the scheduler's state management).

🔵 Low

  • File: packages/core/src/telemetry/session-tracing.ts:625 - The endToolBlockedOnUserSpan function has try/catch blocks around attribute setting and span ending, which is good defensive programming. However, the warning messages use debugLogger.warn - consider whether some of these should be debugLogger.error instead, particularly for the span ending failure, as that could indicate a more serious telemetry infrastructure issue.

  • File: packages/core/src/telemetry/session-tracing.ts:715 - The endHookSpan function has a similar pattern. For consistency, consider extracting the try/catch pattern into a helper function since both endToolBlockedOnUserSpan and endHookSpan duplicate this structure:

    function safelyEndSpan(spanCtx: SpanContext, spanType: string): void {
      try {
        spanCtx.span.end();
      } catch (error) {
        debugLogger.warn(`Failed to end ${spanType} span: ${error instanceof Error ? error.message : String(error)}`);
      }
    }
  • File: packages/core/src/telemetry/constants.ts - Consider adding a comment to the new span constants explaining their purpose, similar to the existing span constants. For example:

    /** Span for tracking time a tool spends waiting for user approval/confirmation */
    export const SPAN_TOOL_BLOCKED_ON_USER = 'qwen-code.tool.blocked_on_user';
    /** Span for tracking hook execution (pre/post-tool-use hooks) */
    export const SPAN_HOOK = 'qwen-code.hook';
  • File: packages/core/src/core/coreToolScheduler.ts:2777 - The comment for auto-approving sibling tools mentions ProceedAlways* outcomes. Consider being more explicit about which specific outcomes trigger this path (e.g., ToolConfirmationOutcome.ProceedAlways vs ToolConfirmationOutcome.ProceedAlwaysSession) for future maintainers.

✅ Highlights

  • Excellent regression test: The "concurrent blocked spans without findLast confusion" test is a model example of how to test for a specific bug that exists in a similar codebase. This test will immediately catch any future regression to the findLast-by-type anti-pattern.

  • Comprehensive end-site coverage: The PR description explicitly lists all 8 terminal tool-span end sites and 5 blocked_on_user end sites. This level of thoroughness in tracking all code paths is exemplary and makes the review much easier.

  • Idempotency handling: Both endToolBlockedOnUserSpan and endHookSpan check spanCtx.ended and return early, preventing double-ending spans. This is a subtle but important defensive measure.

  • NOOP span handling: Both new span types correctly return NOOP_SPAN when the SDK is not initialized, and the end functions handle NOOP spans gracefully without throwing. This ensures telemetry is truly optional and doesn't break core functionality.

  • Clear separation of concerns: The fireNotificationHook (permission_prompt) is intentionally NOT wrapped because it's fire-and-forget. This shows good judgment in distinguishing between meaningful duration tracking and meaningless wrapper spans.

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 Phase 2 hierarchical session-tracing spans to improve observability of (1) time spent awaiting user approval for tool calls and (2) hook execution latency/behavior around tool calls.

Changes:

  • Introduces qwen-code.tool.blocked_on_user span helpers and wires them into the tool confirmation state machine.
  • Introduces qwen-code.hook span helpers and wraps pre/post hook fire sites in CoreToolScheduler.
  • Updates telemetry exports/constants and expands unit tests for new span types and scheduler lifecycle behavior.

Reviewed changes

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

Show a summary per file
File Description
packages/core/src/telemetry/session-tracing.ts Adds span helpers for tool.blocked_on_user and hook, including end semantics and attributes.
packages/core/src/telemetry/session-tracing.test.ts Adds unit tests covering parenting, attributes, idempotency, and concurrency behavior for new spans.
packages/core/src/telemetry/index.ts Re-exports new helpers and related types.
packages/core/src/telemetry/constants.ts Adds span name constants for the two new span types.
packages/core/src/core/coreToolScheduler.ts Moves tool span lifecycle to cover validate→approval→execute; creates/ends blocked-on-user + hook spans at relevant sites.
packages/core/src/core/coreToolScheduler.test.ts Extends scheduler telemetry tests to assert new spans are created/ended and metadata is propagated.
Comments suppressed due to low confidence (2)

packages/core/src/core/coreToolScheduler.ts:2026

  • Same issue as earlier: the fallback tool-span creation passes { tool_name, call_id } into startToolSpan, which will record nonstandard attributes and omit 'tool.call_id'. Use namespaced attribute keys (e.g. { 'tool.call_id': callId }) and avoid duplicating tool name (already set by the first argument).
    let toolSpan = this.toolSpans.get(callId);
    if (!toolSpan) {
      toolSpan = startToolSpan(toolName, {
        tool_name: toolName,
        call_id: callId,
      });
      this.toolSpans.set(callId, toolSpan);

packages/core/src/core/coreToolScheduler.ts:1829

  • Proceed path always finalizes the blocked span with source: 'cli', but handleConfirmationResponse() can be invoked by IDE diff resolution as well (see openIdeDiffIfEnabled). Suggest: choose source: 'ide' when in IDE mode / when the confirmation came from the IDE integration, otherwise cli.
      // Proceed: end the blocked span before execution begins. ProceedOnce
      // and the three ProceedAlways* variants all close the awaiting phase.
      // The tool span itself stays open and is finalized in
      // executeSingleToolCall.
      const decision: ToolBlockedDecision =
        outcome === ToolConfirmationOutcome.ProceedOnce
          ? 'proceed_once'
          : 'proceed_always';
      this.finalizeBlockedSpan(callId, decision, 'cli');

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

Comment thread packages/core/src/core/coreToolScheduler.ts Outdated
Comment thread packages/core/src/core/coreToolScheduler.ts Outdated
Comment thread packages/core/src/core/coreToolScheduler.ts Outdated
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 19, 2026

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 76.96% 76.96% 79.65% 79.88%
Core 79.67% 79.67% 82.28% 82.83%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   76.96 |    79.88 |   79.65 |   76.96 |                   
 src               |   75.94 |     69.2 |   81.08 |   75.94 |                   
  gemini.tsx       |   68.69 |    66.66 |   77.77 |   68.69 | ...29,946-949,961 
  ...ractiveCli.ts |   80.23 |     68.3 |   78.57 |   80.23 | ...1054,1092,1195 
  ...liCommands.ts |   74.51 |    73.17 |     100 |   74.51 | ...41-265,290,391 
  ...ActiveAuth.ts |     100 |     87.5 |     100 |     100 | 66-80             
 ...cp-integration |   61.97 |    65.24 |   78.12 |   61.97 |                   
  acpAgent.ts      |   63.32 |    65.35 |   83.05 |   63.32 | ...2112,2126-2134 
  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 |   75.88 |    72.05 |   86.25 |   75.88 |                   
  ...ryReplayer.ts |   67.34 |     75.6 |   81.81 |   67.34 | ...54-269,282-283 
  Session.ts       |   74.93 |    70.81 |   88.46 |   74.93 | ...2658,2664-2667 
  ...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 |    84.88 |   88.09 |   92.79 |                   
  auth.ts          |   86.98 |    80.32 |     100 |   86.98 | ...26-227,243-244 
  config.ts        |   87.96 |    84.36 |      80 |   87.96 | ...1856,1858-1866 
  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.03 |       80 |   13.33 |    7.03 |                   
  ...Controller.ts |   19.32 |      100 |      60 |   19.32 | 81-118,127-210    
  ...Controller.ts |       0 |        0 |       0 |       0 | 1-56              
  ...Controller.ts |    3.94 |      100 |   11.11 |    3.94 | ...63-381,391-496 
  ...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.7 |   95.18 |   97.98 |                   
  ...putAdapter.ts |   97.89 |    92.82 |   98.07 |   97.89 | ...1303,1398-1399 
  ...putAdapter.ts |      96 |     90.9 |   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.3 |     78.8 |   92.85 |    79.3 |                   
  auth.ts          |   88.49 |    88.63 |     100 |   88.49 | ...49-150,153-155 
  capabilities.ts  |     100 |     90.9 |     100 |     100 | 264               
  ...usProvider.ts |   67.01 |    51.42 |     100 |   67.01 | ...40-245,278-286 
  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      |     100 |      100 |     100 |     100 |                   
  httpAcpBridge.ts |   79.62 |    78.84 |   96.38 |   79.62 | ...4246,4277-4318 
  ...oryChannel.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-106             
  loopbackBinds.ts |     100 |      100 |     100 |     100 |                   
  runQwenServe.ts  |   73.98 |    87.83 |   55.55 |   73.98 | ...94-710,735-737 
  server.ts        |   86.18 |    82.94 |   90.62 |   86.18 | ...2478,2543-2552 
  status.ts        |     100 |      100 |     100 |     100 |                   
  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    |   86.54 |    78.75 |   93.75 |   86.54 |                   
  deviceFlow.ts    |   96.33 |    79.51 |    97.5 |   96.33 | ...1526,1630,1700 
  ...owProvider.ts |   45.23 |    74.07 |      75 |   45.23 | ...90-359,375,379 
 src/serve/fs      |   84.85 |    79.75 |     100 |   84.85 |                   
  audit.ts         |     100 |    96.15 |     100 |     100 | 201               
  errors.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  paths.ts         |   77.82 |    77.08 |     100 |   77.82 | ...64,493-497,510 
  policy.ts        |   90.32 |    89.18 |     100 |   90.32 | 142-150           
  ...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            |   65.28 |    73.08 |   60.34 |   65.28 |                   
  App.tsx          |     100 |      100 |     100 |     100 |                   
  AppContainer.tsx |   63.38 |    64.68 |      50 |   63.38 | ...3156,3160-3164 
  ...tionNudge.tsx |    9.58 |      100 |       0 |    9.58 | 24-94             
  ...ackDialog.tsx |   29.23 |      100 |       0 |   29.23 | 25-75             
  ...tionNudge.tsx |    7.69 |      100 |       0 |    7.69 | 25-103            
  colors.ts        |      60 |      100 |   35.29 |      60 | ...52,54-55,60-61 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  keyMatchers.ts   |   95.91 |    97.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.39 |    81.12 |   81.61 |   73.39 |                   
  aboutCommand.ts  |     100 |      100 |     100 |     100 |                   
  agentsCommand.ts |   83.78 |      100 |      60 |   83.78 | 30-32,42-44       
  ...odeCommand.ts |   89.04 |    81.25 |     100 |   89.04 | 91-92,94-99       
  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   |     100 |     87.5 |     100 |     100 | ...61,224-225,238 
  ...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 |   62.86 |    74.64 |   65.25 |   62.86 |                   
  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 |   13.04 |      100 |       0 |   13.04 | 18-61             
  ...TextInput.tsx |   77.01 |       76 |     100 |   77.01 | ...20,234-236,263 
  Composer.tsx     |    81.6 |     64.7 |     100 |    81.6 | ...90,108,160,173 
  ...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 |   11.99 |      100 |       0 |   11.99 | 66-517            
  DiffDialog.tsx   |    2.47 |      100 |       0 |    2.47 | 68-732            
  ...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       |   76.59 |    48.64 |     100 |   76.59 | ...35-136,175-180 
  ...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  |   83.01 |    79.78 |   83.33 |   83.01 | ...1399,1531,1581 
  ...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            
  ...xitDialog.tsx |   80.36 |    43.47 |      60 |   80.36 | ...24-238,248-251 
 ...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.34 |    78.06 |   80.35 |   77.34 |                   
  ...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 |   82.31 |    82.84 |     100 |   82.31 | ...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 | 120-121           
  ...teContext.tsx |   86.66 |       50 |     100 |   86.66 | 195-196           
  ...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.14 |    82.17 |   86.69 |   82.14 |                   
  ...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.59 |    62.58 |   61.53 |   75.59 | ...88,912,931-935 
  ...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 |   83.49 |    70.96 |     100 |   83.49 | ...60,168,170-178 
  ...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 |   13.33 |      100 |     100 |   13.33 | 91-182            
  useDiffData.ts   |   11.62 |      100 |       0 |   11.62 | 44-87             
  ...oublePress.ts |   53.12 |       75 |     100 |   53.12 | 33-35,41-54       
  ...orSettings.ts |     100 |      100 |     100 |     100 |                   
  ...Completion.ts |   99.12 |     97.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.7 |    74.93 |   91.66 |    77.7 | ...2497,2510-2518 
  ...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 |   96.09 |    90.37 |     100 |   96.09 | ...62-365,450-457 
  ...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 |                   
  useTurnDiffs.ts  |   95.12 |    78.57 |     100 |   95.12 | 133-134,156-157   
  ...elcomeBack.ts |   87.36 |     90.9 |     100 |   87.36 | ...,94-96,114-115 
  ...reeSession.ts |   93.75 |       75 |     100 |   93.75 | 44-45,87          
  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 |   14.28 |     100 |                   
  ...eractiveUi.ts |     100 |      100 |   14.28 |     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.98 |    82.97 |   92.61 |   83.98 |                   
  ...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 | 35,57             
  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.61 |    94.84 |   92.85 |   97.61 | ...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.51 |    89.55 |      94 |   76.51 |                   
  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            
  sessionPaths.ts  |   90.84 |    90.56 |     100 |   90.84 | ...81-182,185-186 
  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.67 |    82.83 |   82.28 |   79.67 |                   
 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 |    78.93 |   91.76 |   87.58 |                   
  ...transcript.ts |   92.25 |    85.71 |     100 |   92.25 | ...87,306-307,438 
  ...ent-resume.ts |   82.53 |    71.28 |   77.41 |   82.53 | ...1045-1049,1052 
  ...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.15 |     76.7 |   71.42 |   81.15 |                   
  agent-context.ts |     100 |      100 |     100 |     100 |                   
  agent-core.ts    |   76.51 |    72.35 |   60.86 |   76.51 | ...1609,1636-1683 
  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.3 |    81.93 |   65.78 |    78.3 |                   
  config.ts        |   76.12 |     80.7 |   61.16 |   76.12 | ...3721,3732-3744 
  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          |   87.25 |    82.87 |   90.51 |   87.25 |                   
  baseLlmClient.ts |   87.24 |    76.47 |    87.5 |   87.24 | ...82,484-494,503 
  client.ts        |   87.57 |     81.3 |   86.11 |   87.57 | ...1928,1967-1970 
  ...tGenerator.ts |    72.1 |    61.11 |     100 |    72.1 | ...63,365,372-375 
  ...lScheduler.ts |   84.87 |    82.16 |   94.73 |   84.87 | ...3148,3209-3220 
  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 |       95 |     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.33 |    89.02 |     100 |   99.33 | 144,155           
  turn.ts          |   96.44 |    88.88 |     100 |   96.44 | ...08,421-422,470 
 ...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 |   93.34 |    80.28 |   90.32 |   93.34 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |   93.32 |    80.28 |   90.32 |   93.32 | ...01,911-912,940 
 ...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.83 |    89.55 |   95.65 |   96.83 |                   
  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       |   95.79 |    89.65 |   88.88 |   95.79 | 122-123,193-195   
  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      |   55.57 |    84.14 |   81.25 |   55.57 |                   
  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.02 |      100 |   16.66 |   13.02 | 89-464,524-575    
  ...onToolGate.ts |     100 |    96.42 |     100 |     100 | 94                
  ...nGenerator.ts |    71.6 |    72.13 |   83.33 |    71.6 | ...88-246,316-318 
 src/generated     |       0 |        0 |       0 |       0 |                   
  git-commit.ts    |       0 |        0 |       0 |       0 | 1-10              
 src/goals         |   89.57 |    83.45 |   94.44 |   89.57 |                   
  ...eGoalStore.ts |    85.1 |    95.45 |   84.61 |    85.1 | ...63-166,174-182 
  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.88 |   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.21 |    92.13 |   85.71 |   91.21 | ...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 |    76.57 |   66.66 |      68 |                   
  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        |   77.54 |    69.38 |   88.88 |   77.54 | ...53-258,282-293 
  ...ceSelector.ts |   91.86 |    77.27 |     100 |   91.86 | ...15,117-118,126 
  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 |    81.03 |   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.35 |    85.67 |    87.5 |   89.35 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...tor-config.ts |   90.24 |    91.42 |     100 |   90.24 | 142,148,151-160   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nfigErrors.ts |   74.22 |       44 |   84.61 |   74.22 | ...,67-74,106-117 
  ...igResolver.ts |   98.66 |    92.85 |     100 |   98.66 | 162,324,330       
  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   |   74.28 |    88.55 |   57.55 |   74.28 |                   
  autoMode.ts      |   61.59 |    93.54 |   83.33 |   61.59 | ...00-238,340-356 
  ...transcript.ts |      98 |       84 |     100 |      98 | 200-201           
  classifier.ts    |   92.89 |     87.5 |     100 |   92.89 | 146-153,333-337   
  ...erousRules.ts |     100 |    83.87 |     100 |     100 | 101,113,137-143   
  ...alTracking.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...on-manager.ts |   78.26 |    85.24 |   82.14 |   78.26 | ...-916,1022-1026 
  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 |                   
 ...sifier-prompts |   98.18 |       90 |     100 |   98.18 |                   
  system-prompt.ts |   98.18 |       90 |     100 |   98.18 | 150               
 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.23 |   95.83 |   83.87 |                   
  ...tGenerator.ts |   98.64 |    98.18 |     100 |   98.64 | 105-106           
  qwenOAuth2.ts    |   80.85 |    70.27 |   90.32 |   80.85 | ...1169-1185,1215 
  ...kenManager.ts |   83.76 |    76.22 |     100 |   83.76 | ...62-767,788-793 
 src/services      |   85.31 |    83.27 |   91.28 |   85.31 |                   
  ...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.88 |    83.33 |   83.33 |   83.88 | ...1266,1283-1284 
  ...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.18 |    76.76 |   91.17 |   86.18 | ...1150,1191-1194 
  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.83 |    69.31 |    97.5 |   73.83 | ...1460,1488-1489 
  ...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.65 |      100 |       0 |   12.65 | 44-150            
  ...ionService.ts |   90.23 |     78.8 |   96.77 |   90.23 | ...1294,1298-1299 
  sessionTitle.ts  |   93.87 |    71.15 |     100 |   93.87 | ...33-236,267-268 
  ...ionService.ts |   81.07 |    77.92 |   89.28 |   81.07 | ...1923,1929-1934 
  ...UseSummary.ts |   94.63 |    88.46 |     100 |   94.63 | ...62-164,214-215 
  ...reeCleanup.ts |   14.56 |      100 |   33.33 |   14.56 | 58-185            
  ...ionService.ts |   84.21 |    79.41 |     100 |   84.21 | ...22-223,239-240 
 ...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     |   82.61 |    78.89 |   95.23 |   82.61 |                   
  ...tin-agents.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nt-manager.ts |   77.15 |    71.36 |    93.1 |   77.15 | ...1178,1200-1201 
  types.ts         |     100 |      100 |     100 |     100 |                   
  validation.ts    |   92.46 |    95.18 |     100 |   92.46 | 51-56,69-74,78-83 
 src/telemetry     |   75.48 |    85.93 |   79.37 |   75.48 |                   
  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 |   92.76 |    87.27 |     100 |   92.76 | ...28-831,835-838 
  ...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,108            
  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.53 |     81.6 |   85.98 |   78.53 |                   
  ...erQuestion.ts |   88.93 |    76.74 |    90.9 |   88.93 | ...39-340,347-348 
  cron-create.ts   |   88.11 |    88.88 |    62.5 |   88.11 | ...,43-44,165-172 
  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          |   81.02 |    84.07 |      75 |   81.02 | ...15-716,826-876 
  ...r-worktree.ts |   82.95 |    67.56 |    87.5 |   82.95 | ...82-185,276-277 
  exit-worktree.ts |   84.23 |    85.96 |   91.66 |   84.23 | ...92-293,298-312 
  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       |   91.36 |    83.94 |   88.46 |   91.36 | ...61,574,770-775 
  ...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 |        0 |       0 |    6.34 | 47-145            
  send-message.ts  |   84.68 |    91.66 |    62.5 |   84.68 | ...,82-90,167-170 
  shell.ts         |   73.05 |    79.66 |   91.42 |   73.05 | ...4216,4265-4271 
  skill-utils.ts   |     100 |      100 |     100 |     100 |                   
  skill.ts         |   88.35 |    91.42 |   86.66 |   88.35 | ...12,416,439-461 
  ...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         |   90.49 |    90.19 |   84.21 |   90.49 | ...78-479,495-501 
  web-fetch.ts     |   88.84 |       80 |   92.85 |   88.84 | ...12-313,315-316 
  write-file.ts    |   82.65 |    80.45 |   84.61 |   82.65 | ...65-668,696-731 
 src/tools/agent   |   74.64 |    81.34 |   73.61 |   74.64 |                   
  agent.ts         |    74.9 |     81.6 |   74.24 |    74.9 | ...2390,2399-2402 
  fork-subagent.ts |   69.62 |    71.42 |   66.66 |   69.62 | ...04-105,140-151 
 src/utils         |   89.02 |    87.72 |   93.63 |   89.02 |                   
  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 |     87.5 |     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 |       80 |   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   |   80.68 |    78.12 |   83.33 |   80.68 | ...39-545,550-556 
  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.95 |    98.18 |     100 |   98.95 | 148               
  ...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  |   90.85 |    87.87 |     100 |   90.85 | ...97-199,222-227 
  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.71 |    97.14 |     100 |   98.71 | 110               
  ...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.

… + silent-failure-hunter

Eight discrete fixes plus two new tests, all surfaced in the Phase 2 review
rounds. Grouped here because they touch the same handful of code paths.

Copilot inline (#4321 PR):
1. startToolSpan attrs naming: drop redundant `tool_name` (helper already
   sets `'tool.name'` from the first arg) and rename `call_id` to the
   namespaced `'tool.call_id'`. Two sites: `_schedule` validating-loop
   start, and the defensive fallback in executeSingleToolCall. Without
   this, traces emit non-namespaced `tool_name` / `call_id` attributes
   that consumers grepping for `tool.call_id` miss.
2. PreToolUse hook span: propagate the actual `preHookResult.blockType`
   ('denied' / 'ask' / 'stop') instead of collapsing every block to
   'denied'. Also record `hasAdditionalContext` for parity with the
   PostToolUse / failure-hook spans.
3. blocked_on_user `source` detection: use `config.getIdeMode()` (best-
   effort) so IDE-driven decisions don't all show up as `'cli'`.
   Centralized in a new `getBlockedSource()` helper.

silent-failure-hunter / code-reviewer:
4. Hook span error-tracking is dead code. firePreToolUseHook /
   firePostToolUseHook / safelyFirePostToolUseFailureHook all swallow
   throws internally — every `catch (e) { endMeta = { error, ... };
   throw e }` block in the scheduler was unreachable. Simplify all 6
   sites to `try { ... } finally { endHookSpan(...) }`. The default
   `endMeta = { success: false }` keeps the span sensible if a future
   hook impl decides to throw.
5. handleConfirmationResponse had no error handling. modifyWithEditor /
   _applyInlineModify / attemptExecutionOfScheduledCalls can throw and
   would otherwise leak both the tool span and the blocked_on_user span
   until the 30-min TTL fires. Wrap the body in a try/catch that
   finalizes both spans on rethrow. Extracted the body to
   `_handleConfirmationResponseInner` for clarity.
6. Add `'error'` to the `ToolBlockedDecision` union for system-error
   closes, so dashboards counting `decision: 'cancel'` don't get
   polluted by thrown exceptions.
7. _schedule's outer catch was labelling its non-aborted close as
   `'cancel'`. Switch to `'error'` (uses #6).
8. signal.aborted vs explicit user Cancel: when both are true, the old
   code reported `'aborted'/'system'` even though the user actually
   clicked Cancel. Reverse the precedence so `outcome === Cancel`
   wins, with `getBlockedSource()` for the source.

Tests:
- T1: extend the existing ProceedAlways auto-approve test to assert the
  two siblings' blocked spans end with `decision: 'auto_approved'`,
  `source: 'auto'`, while the first tool ends as `'proceed_always'`/cli.
- T2: existing cancel-during-confirmation test now also asserts exactly
  one blocked span is recorded for the lifecycle — the same invariant
  ModifyWithEditor's intentional preservation across editor side trips
  must not break.

🤖 Generated with [Qwen Code](https://github.com/QwenLM/qwen-code)
@doudouOUC
Copy link
Copy Markdown
Collaborator Author

Follow-up commit 6767469b2 summary

Addresses all 3 Copilot inline comments + the silent-failure-hunter / code-reviewer findings from my own pre-merge review pass.

Fixed

  • C1 Both startToolSpan calls now use the namespaced 'tool.call_id' and drop the redundant tool_name (handled by the helper from the first arg).
  • C2 PreToolUse hook span propagates the actual preHookResult.blockType ('denied' / 'ask' / 'stop') and adds hasAdditionalContext.
  • C3 New getBlockedSource() helper — derives 'ide' from config.getIdeMode(), else 'cli'. Used at the Cancel and Proceed branches.
  • S1 All 6 hook fire sites simplified to try { ... } finally { endHookSpan(...) }. The earlier catch block was dead code (the underlying hook helpers swallow throws). Default endMeta = { success: false } keeps the span sensible if a future impl decides to throw.
  • S2 handleConfirmationResponse now wraps the body in try/catch — modifyWithEditor / _applyInlineModify / attemptExecutionOfScheduledCalls throws no longer leak both spans until the 30-min TTL.
  • S3 Added 'error' to ToolBlockedDecision. _schedule's outer catch now reports 'error'/'system' (was 'cancel'/'system') — keeps user-cancel dashboards clean.
  • S5 outcome === Cancel now wins over a concurrent signal.aborted for the decision attribute.

Tests added

  • T1: extends the existing ProceedAlways auto-approve test to assert the 2 auto-approved siblings end with decision: 'auto_approved' / source: 'auto' while the first tool ends as proceed_always / cli.
  • T2: existing cancel-during-confirmation test now asserts exactly one tool.blocked_on_user record per lifecycle — guards the ModifyWithEditor invariant from regression.

Verification

  • 187 / 187 affected tests pass (coreToolScheduler.test.ts + session-tracing.test.ts)
  • tsc --noEmit clean for core
  • eslint clean

🤖 Generated with Qwen Code

… behaviors

Two follow-ups from the post-#6767469b2 review pass on PR #4321:

1. autoApproveCompatiblePendingTools error path was logging-only and
   leaving the sibling tool's blocked_on_user span open until the 30-min
   TTL fires. Symmetric with the success branch's
   finalizeBlockedSpan('auto_approved', 'auto'), the catch now finalizes
   with ('error', 'system') so the trace deterministically explains why
   the sibling didn't auto-approve.

2. Three behaviors introduced by 6767469 had no test coverage:
   - decision='error' from _schedule's outer catch when
     getConfirmationDetails throws (asserts tool span ends, no blocked
     span ever opens since the throw happens pre-awaiting_approval).
   - source='ide' when getBlockedSource() honors getIdeMode (Cancel
     path with getIdeMode: () => true).
   - Explicit Cancel takes precedence over a concurrent signal.aborted
     in the decision label — the bug the precedence flip was meant to
     fix is now regression-tested.

Extracted a small `buildApprovalScheduler` helper for the two
awaiting_approval-flow tests; the throw-on-confirmation test reuses
StructuredErrorOnConfirmationTool.

🤖 Generated with [Qwen Code](https://github.com/QwenLM/qwen-code)
@doudouOUC
Copy link
Copy Markdown
Collaborator Author

Follow-up commit 32f94d348 — autoApprove leak + 3 test gaps

Addresses the remaining HIGH item from the second-pass review (silent-failure-hunter + code-reviewer agreed) plus the three test gaps both reviewers flagged.

Fixed

  • autoApproveCompatiblePendingTools error path (line 2824) was logging-only — sibling's blocked span leaked to the 30-min TTL. Catch now calls finalizeBlockedSpan(callId, 'error', 'system') symmetric with the success branch's 'auto_approved' / 'auto'.

Tests added

  • decision='error' from _schedule's outer catch when getConfirmationDetails throws (StructuredErrorOnConfirmationTool reused).
  • source='ide' when getBlockedSource() honors getIdeMode: () => true.
  • Explicit Cancel takes precedence over signal.aborted (regression test for the precedence flip in 6767469).

Verification

  • 190 / 190 affected tests pass (was 187, +3 new).
  • tsc --noEmit clean
  • pre-commit (prettier + eslint --fix) clean

🤖 Generated with Qwen Code

…odex P3)

The previous commit 32f94d3 added a `finalizeBlockedSpan(callId, 'error',
'system')` to the autoApproveCompatiblePendingTools catch in the name of
"symmetry with the success branch". Codex review pointed out the bug:
that catch fires when evaluatePermissionFlow throws for a SIBLING tool,
but the sibling itself is still in `awaiting_approval` — the user can
still respond. By closing the blocked span at the catch, the eventual
handleConfirmationResponse → finalizeBlockedSpan call becomes a no-op
(Map.delete already cleared it), and the user's actual decision /
source attributes are lost from the trace.

Revert that line. The previous behavior was correct: log the error,
leave the span open, let the user's eventual decision close it
correctly. If the user never responds, the 30-min TTL in
session-tracing.ts cleans up the orphan span — same fallback that
already covered every other "user walks away" scenario.

The "leak" the original change was trying to fix was a phantom: the
span IS finalized once the user (or the abort signal) drives the tool
to a terminal state. The TTL is just the safety net.

🤖 Generated with [Qwen Code](https://github.com/QwenLM/qwen-code)
@doudouOUC
Copy link
Copy Markdown
Collaborator Author

Codex review disposition (/codex:review --base main)

Two findings; one adopted, one pushed back.

[P3] adopted — 68dea8a58

autoApprove catch finalizeBlockedSpan was wrong. My previous commit 32f94d348 added a finalizeBlockedSpan(callId, 'error', 'system') in the autoApproveCompatiblePendingTools catch (line 2833) for "symmetry with the success branch". Codex correctly pointed out: the sibling tool stays in `awaiting_approval` after evaluatePermissionFlow throws — the user can still respond. Closing the span at the catch makes the user's eventual decision a no-op (Map already cleared) and the actual decision/source attributes are lost.

Reverted that line. The pre-32f94d348 behavior was correct: log + leave span open + let user's decision close it correctly. The 30-min TTL in session-tracing.ts is the existing safety net for "user never responds".

[P2] pushed back — race is theoretical, not real

Codex was concerned that setStatusInternal('awaiting_approval', ...) synchronously fires `onToolCallsUpdate`, which fires `onConfirm`, which fires `handleConfirmationResponse`, which calls `finalizeBlockedSpan` BEFORE the next line (`blockedSpans.set(...)`) has run.

Tracing the actual control flow:

  1. `setStatusInternal` is sync.
  2. `notifyToolCallsUpdate` fires `onToolCallsUpdate` (sync).
  3. consumer calls `onConfirm()` → `handleConfirmationResponse(...)` returns a Promise.
  4. `handleConfirmationResponse`'s body has a single `await this._handleConfirmationResponseInner(...)` wrapping ALL of its finalize calls.
  5. `_handleConfirmationResponseInner`'s first statement is `await originalOnConfirm(...)` — yields a microtask (even if originalOnConfirm is sync).
  6. Yield returns control up the stack to the consumer, then to `notifyToolCallsUpdate`, then to `setStatusInternal`, then back to `_schedule`.
  7. `_schedule` continues: `startToolBlockedOnUserSpan(...)` + `this.blockedSpans.set(...)` run synchronously.
  8. Microtask queue drains: `_handleConfirmationResponseInner` resumes, hits `finalizeBlockedSpan`, `Map.get` succeeds.

The async barrier between `onConfirm()` and the eventual `finalizeBlockedSpan` call is NOT bypassable through synchronous `onToolCallsUpdate` — `await` always yields a microtask. `finalizeBlockedSpan` runs strictly after `blockedSpans.set`. No race in practice.

Verification

  • tsc --noEmit clean
  • npx vitest run src/core/coreToolScheduler.test.ts src/telemetry/session-tracing.test.ts — 190 / 190 pass
  • pre-commit (prettier + eslint) clean

🤖 Generated with Qwen Code

@doudouOUC doudouOUC self-assigned this May 19, 2026
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] coreToolScheduler.ts:1835 — ModifyWithEditor silent failure leaks blocked + tool spans

When getPreferredEditor() returns undefined, the bare return in _handleConfirmationResponseInner leaks both the blocked span (created in _schedule) and the tool span. No log, no user feedback — the tool silently stays in awaiting_approval until the 30-min TTL fires.

        if (!editorType) {
          debugLogger.warn(
            `ModifyWithEditor requested for ${callId} but no editor available`,
          );
          this.finalizeBlockedSpan(callId, 'error', 'system');
          return;
        }

Comment thread packages/core/src/core/coreToolScheduler.ts Outdated
Comment thread packages/core/src/core/coreToolScheduler.test.ts
doudouOUC added 2 commits May 19, 2026 21:30
…ecision

Two #4321 review comments from wenshao, both Critical:

1. `TOOL_FAILURE_KIND_PRE_HOOK_BLOCKED` was being emitted for FIVE distinct
   non-PreToolUse-hook deny paths in `_schedule`:
   - finalPermission === 'deny' (hard deny)
   - plan-mode block
   - non-interactive deny
   - permission_request hook deny
   - background-agent deny
   Dashboards filtering by `failure_kind = 'pre_hook_blocked'` were
   silently picking up all of these, undermining the attribute. Add
   distinct constants + status messages for each path. The original
   PRE_HOOK_BLOCKED label is now used at exactly one site — the actual
   PreToolUse hook deny in `_executeToolCallBody`.

2. `decision: 'proceed_once'` was untested. Existing tests covered
   'cancel' and 'proceed_always' (auto-approve) but not the most common
   user interaction. Add a test that schedules an approval-required tool,
   confirms with ProceedOnce, and asserts the blocked span ends with
   `decision: 'proceed_once'`, `source: 'cli'`.

🤖 Generated with [Qwen Code](https://github.com/QwenLM/qwen-code)
Three review items folded into one follow-up:

1. wenshao Critical (`coreToolScheduler.ts:1851`) — `ModifyWithEditor`
   path silently returned when `getPreferredEditor()` was undefined,
   leaking blocked + tool spans on user-walks-away. Add a
   `debugLogger.warn` so the silent failure is at least visible in debug
   telemetry. Deliberately do NOT finalize spans here, matching the
   Codex P3 / autoApprove decision: ModifyWithEditor stays inside one
   awaiting period, the user can still recover via Cancel/Proceed which
   closes the spans correctly, and the 30-min TTL is the safety net for
   give-up scenarios. Finalizing prematurely would make the user's
   eventual decision a no-op (Map already cleared) and lose the actual
   decision/source attributes.

2. Bot summary Medium (`session-tracing.ts:557-562`) — add a
   `debugLogger.debug` when `startToolBlockedOnUserSpan` falls back to
   `resolveParentContext` because the tool span isn't in `activeSpans`
   anymore. Helps diagnose unexpected ordering during development.

3. Bot summary Low (`constants.ts`) — JSDoc the two new span name
   constants.

🤖 Generated with [Qwen Code](https://github.com/QwenLM/qwen-code)
@doudouOUC
Copy link
Copy Markdown
Collaborator Author

Follow-up commit cc3f7fc1e — wenshao Critical + bot summary nits

wenshao Critical: ModifyWithEditor !editorType silent failure (coreToolScheduler.ts:1851)

Partially adopted. Added the debugLogger.warn you suggested so the silent failure is at least visible in debug telemetry.

Pushed back on the finalizeBlockedSpan(callId, 'error', 'system') part — for consistency with the Codex P3 / autoApprove decision a few commits earlier:

  • ModifyWithEditor is intentionally INTRA-awaiting (the blocked span covers the entire awaiting period including editor side trips per the Phase 2 design).
  • When the editor is unavailable, the tool stays in awaiting_approval — the user can still recover via Cancel or Proceed, and that decision closes the spans correctly with the actual decision/source.
  • Closing the span at the !editorType branch makes the user's eventual handleConfirmationResponse → finalizeBlockedSpan a no-op (Map already cleared) and the real decision attribute is lost.
  • The 30-min TTL in session-tracing.ts is the safety net for genuine "user walks away" cases — same fallback that already covers every other intra-awaiting bail-out path (autoApprove evaluatePermissionFlow throw, etc).

If you have a strong preference for the deterministic close, I can flip it; just want to surface the consistency cost before doing so.

Bot summary nits

# Item Disposition
Medium 1 session-tracing.ts:557-562 debug log on fallback ✅ Adopted
Medium 2 finalizeToolSpan / finalizeBlockedSpan not in telemetry exports ❌ Push back — they're explicitly private scheduler-state-machine helpers, not telemetry public API
Low 1 debugLogger.error instead of warn on span end failure ❌ Push back — span end failures are extremely rare, recoverable, and don't break the service. warn is the existing convention
Low 2 Extract safelyEndSpan helper ❌ Push back — DRY across 3 sites with ~5 lines each isn't worth the indirection. Existing code structure is consistent
Low 3 JSDoc on new SPAN constants ✅ Adopted
Low 4 Be more explicit about ProceedAlways* outcomes ❌ Push back — comment is accurate; listing ProceedAlways / ProceedAlwaysProject / ProceedAlwaysUser would be noise

Verification

  • 191 / 191 tests pass
  • tsc --noEmit clean
  • pre-commit clean

🤖 Generated with Qwen Code

@doudouOUC doudouOUC requested a review from wenshao May 19, 2026 13:47
Comment thread packages/core/src/core/coreToolScheduler.ts Outdated
Comment thread packages/core/src/core/coreToolScheduler.ts Outdated
…ToolSpan param

Two #4321 review Suggestions from wenshao:

1. The 6 hook fire sites (PreToolUse, PostToolUse, 4× PostToolUseFailure)
   each repeated the same try/finally + endMeta init + endHookSpan
   pattern. Future hook span protocol changes had to be made in lockstep.
   Extract a private generic helper:

       withHookSpan<T>(opts, fn, toEndMeta): Promise<T>

   Each fire site collapses from ~12 lines of try/finally scaffolding to
   ~3 lines passing in the fire callback + endMeta builder. The
   `let postHookResult!:` definite-assignment hack at the PostToolUse
   site is gone because the helper returns the awaited result directly.

2. `finalizeToolSpan(callId, metadata?)` had a dead `metadata`
   parameter — every caller pre-sets the span status via
   `setToolSpan{Failure,Cancelled}` and called `finalizeToolSpan` with no
   argument. Removed the parameter.

🤖 Generated with [Qwen Code](https://github.com/QwenLM/qwen-code)
@doudouOUC doudouOUC requested a review from wenshao May 19, 2026 14:42
Comment thread packages/core/src/core/coreToolScheduler.ts
Comment thread packages/core/src/telemetry/session-tracing.ts
Comment thread packages/core/src/core/coreToolScheduler.ts
…id back-compat

Three #4321 review threads from wenshao (#4321 codex P3-equivalent +
two structural concerns):

1. **[Critical] Hook spans reported success on swallowed hook failures.**
   firePreToolUseHook / firePostToolUseHook /
   firePostToolUseFailureHook (and the safelyFire wrapper in
   coreToolScheduler) all catch transport / dispatch errors internally
   and return safe defaults. Before this fix, withHookSpan's `toEndMeta`
   ran on the safe default and recorded `success: true` — a crashing
   hook was indistinguishable from one that allowed execution.
   Add a `hookError?: string` field to the three result types, populate
   it in each catch, and have all 6 toEndMeta callbacks return
   `{ success: false, error: hookError }` when present.
   Existing "graceful error" tests updated to expect the new field.

2. **[Suggestion] ensureCleanupInterval not kicked from new helpers.**
   The 30-min TTL cleanup safety net for leaked spans only starts when
   `startInteractionSpan` is first called. Sub-agent or side-query code
   paths that call `startToolBlockedOnUserSpan` / `startHookSpan`
   without an interaction span first never trigger cleanup. Both
   helpers now call the (idempotent) `ensureCleanupInterval()` early.

3. **[Suggestion] `call_id` → `'tool.call_id'` rename is breaking for
   downstream consumers.** Phase 1's `startToolSpan(name, { tool_name,
   call_id })` shipped non-namespaced attribute keys. My Phase 2 #4321
   review-fix dropped both. Dual-emit `call_id` (legacy alias) +
   `'tool.call_id'` for one release cycle so existing dashboards /
   alerts don't silently return zero. Comment notes the legacy key is
   removed in the next release.

🤖 Generated with [Qwen Code](https://github.com/QwenLM/qwen-code)
@doudouOUC doudouOUC requested a review from wenshao May 19, 2026 16:03
Comment thread packages/core/src/core/coreToolScheduler.test.ts
Comment thread packages/core/src/core/coreToolScheduler.ts


Inline review findings:
- coreToolScheduler.ts: signal.abort drains scheduler-local
  toolSpans/blockedSpans Maps via deferred setTimeout(0) — bridges the
  gap between session-tracing's 30-min TTL (which ends underlying spans
  but cannot reach the Maps) and walk-away-during-awaiting_approval. The
  drain is deferred so explicit Cancel via handleConfirmationResponse
  and mid-execution setToolSpanCancelled paths still win the race and
  set canonical labels.
- coreToolScheduler.test.ts: regression test for permission_hook_denied
  (firePermissionRequestHook deny branch at _schedule:1683) and
  background_agent_denied (getShouldAvoidPermissionPrompts auto-deny at
  _schedule:1697). Both branches were untested — silently dropping
  setToolSpanFailure on either would lose attribution.
- coreToolScheduler.ts: defensive-fallback span in executeSingleToolCall
  uses canonicalToolName(toolName) so dashboards grouping by span name
  don't see two entries for migrated/MCP tools whose canonical and raw
  names differ.

Review-body finding:
- session-tracing.ts: TTL safety net stamps qwen-code.span.ttl_expired
  + qwen-code.span.duration_ms attributes and emits a debug log before
  ending stale spans. Operators can now distinguish "abandoned and
  garbage-collected by the safety net" from "deliberately ended without
  status/attrs". Refactored cleanup loop into sweepStaleSpans(now) and
  exposed runTTLSweepForTesting for unit coverage.

Tests: +3 scheduler tests (~220 LOC), +2 session-tracing tests (~36
LOC). 247/247 in affected files.

🤖 Generated with [Qwen Code](https://github.com/QwenLM/qwen-code)
@doudouOUC
Copy link
Copy Markdown
Collaborator Author

Follow-up commit 9cbbdfc25 — wenshao /review disposition

Adopted

[Critical] coreToolScheduler.ts:766 — Maps not covered by 30-min TTL — Fixed in 9cbbdfc25. Added per-batch signal.addEventListener('abort') in _schedule with a deferred drainSpansForBatch helper. Setting setTimeout(0) rather than running synchronously preserves the existing Cancel-wins-over-abort precedence rule from _handleConfirmationResponseInner and avoids duplicating setToolSpanCancelled against in-flight _executeToolCallBody cancellations. New regression test asserts both Maps drain to size 0 after walk-away abort with decision: 'aborted'/source: 'system'.

[Critical] coreToolScheduler.ts:1650 — permission_hook_denied untested — Fixed in 9cbbdfc25. Test exercises the firePermissionRequestHook deny branch end-to-end through the scheduler and asserts tool.failure_kind === 'permission_hook_denied'.

[Critical] coreToolScheduler.ts:1674 — background_agent_denied untested — Fixed in 9cbbdfc25. Test flips getShouldAvoidPermissionPrompts -> true and asserts tool.failure_kind === 'background_agent_denied'.

[Suggestion] coreToolScheduler.ts:2157 — fallback span uses raw toolName — Fixed in 9cbbdfc25. Defensive fallback in executeSingleToolCall now uses canonicalToolName(toolName).

[Critical] session-tracing.ts:136-143 — TTL ends spans silently — Fixed in 9cbbdfc25. Refactored cleanup loop into sweepStaleSpans(now) and added sentinel attrs qwen-code.span.ttl_expired: true + qwen-code.span.duration_ms: <ms> plus a debugLogger.warn before each stale span.end(). Operators can now distinguish TTL-aborted spans in trace backends. Exposed runTTLSweepForTesting(now) so the path has unit coverage instead of relying on a 30-min wall clock.

Pushed back — deferred follow-up

[Suggestion] firePermissionRequestHook excluded from withHookSpan and hookError propagation — Acknowledging the inconsistency with the other 6 hook fire sites. Deferring because (a) it's marked Suggestion not Critical, (b) plumbing hookError into PermissionRequestHookResult is a public-API change (the type is re-exported from packages/core/src/index.ts:396), and (c) wrapping the call site requires adding a 7th hook event variant or extending the existing taxonomy — both bigger surface-area decisions worth their own PR. Will track as a follow-up.

Verification: 247/247 in session-tracing.test.ts (49) + coreToolScheduler.test.ts (151) + toolHookTriggers.test.ts (47). tsc --noEmit clean.

🤖 Generated with Qwen Code

Adopted ([Critical]):
- coreToolScheduler.ts: ModifyWithEditor `!editorType` path now sets
  `qwen-code.tool.modify_with_editor_unavailable: true` on the live tool
  span so operators can detect the silent-bail-out state in production
  traces without enabling debug logging.
- coreToolScheduler.test.ts: regression test for plan_mode_blocked
  failure_kind path (ApprovalMode.PLAN + non-read-only confirmation
  tool).
- coreToolScheduler.test.ts: regression test for the pre-aborted
  signal early-exit in `_schedule` — asserts
  setToolSpanCancelled (UNSET status) without entering execution.

Adopted ([Suggestion]):
- coreToolScheduler.ts: `withHookSpan` now `catch`-es and surfaces the
  actual thrown message instead of the hardcoded
  `'hook fn threw before toEndMeta'` sentinel. Currently unreachable
  (hook helpers swallow internally) but defensive against contract
  drift.
- coreToolScheduler.ts: re-add `tool_name` (non-namespaced) as a legacy
  alias on both startToolSpan call sites, mirroring the `call_id` /
  `tool.call_id` dual-emit window so pre-Phase-2 dashboards filtering
  on `tool_name` don't silently stop matching during the rollout.
- coreToolScheduler.test.ts: regression test for the
  `_schedule`-driven aborted decision label on the blocked_on_user
  span (companion to the existing tool-span drain test).
- coreToolScheduler.ts: PreToolUse / PostToolUse `toEndMeta` now
  include `shouldProceed: true` / `shouldStop: false` when `hookError`
  is set, mirroring the runtime's allow-on-hook-failure semantics.

Pushed back (separate PR-level reply):
- "sibling failure prematurely closes confirmed tool span" — not
  reachable: `_executeToolCallBody` swallows execution errors so the
  only paths into `handleConfirmationResponse`'s catch are
  `originalOnConfirm` / `modifyWithEditor` / `_applyInlineModify`,
  none of which run after `attemptExecutionOfScheduledCalls` started
  any sibling.
- "PostToolUseFailure hook spans not asserted" — broader scope, defer.
- "finalizeToolSpan accept required metadata" — invariant-redesign,
  out of scope for this PR.

Tests: +3 scheduler tests; 250/250 green in affected files
(coreToolScheduler 154 + session-tracing 49 + toolHookTriggers 47).

🤖 Generated with [Qwen Code](https://github.com/QwenLM/qwen-code)
@doudouOUC
Copy link
Copy Markdown
Collaborator Author

Follow-up commit 31921a93d — DeepSeek /review disposition

Adopted (7)

[Critical] coreToolScheduler.ts:1942 — ModifyWithEditor !editorType silent bail. Now stamps qwen-code.tool.modify_with_editor_unavailable: true on the live tool span so operators see the state in production traces without enabling debug logs.

[Critical] coreToolScheduler.ts:1599plan_mode_blocked test gap. Added regression test (ApprovalMode.PLAN + non-read-only confirmation tool) asserting tool.failure_kind === 'plan_mode_blocked'.

[Critical] coreToolScheduler.ts:1487signal.aborted early-exit test gap. Added test scheduling with a pre-aborted AbortController, asserting execute is never called and the span lands UNSET (matching setToolSpanCancelled).

[Suggestion] coreToolScheduler.ts:1132withHookSpan hardcoded sentinel. Replaced with a real catch (err) clause that captures err.message + rethrows.

[Suggestion] coreToolScheduler.ts:1473,2206tool_name legacy compat dropped. Re-added as a non-namespaced alias on both startToolSpan call sites with the same drop-after-migrate comment as call_id. The Copilot review earlier in this PR pushed for namespaced-only, but the call_id migration window precedent applies here too — silent dashboard drift outweighs the brief duplication.

[Suggestion] _schedule outer-catch aborted decision — added regression test asserting blocked span ends decision: 'aborted', source: 'system' from the per-batch abort listener.

[Suggestion] coreToolScheduler.ts:2304,2508toEndMeta on hookError now sets shouldProceed: true (PreToolUse) / shouldStop: false (PostToolUse) to mirror the runtime's allow-on-hook-failure semantics.

Pushed back (3)

[Critical] "sibling failure prematurely closes confirmed tool span" — not reachable: _executeToolCallBody swallows execution errors at coreToolScheduler.ts:2689 and never rethrows. runConcurrently's Promise.all therefore doesn't reject from a sibling tool's runtime failure; the only paths into the catch are originalOnConfirm / modifyWithEditor / _applyInlineModify, all pre-execution.

[Suggestion] "PostToolUseFailure hook spans not asserted in scheduler tests" — deferred. The existing disableHooks: true cancel/error tests deliberately isolate cancel/error semantics from hook lifecycle; the withHookSpan plumbing is already covered by PreToolUse + PostToolUse hook-span tests (same code path applies to all 4 PostToolUseFailure sites). Suggestion-level follow-up.

[Suggestion] "finalizeToolSpan accept required metadata" — out of scope. Architectural change to the 15+ existing call sites; defaulting to ERROR would mis-tag cancellation paths (UNSET is the right code there).

Verification

  • 250/250 across coreToolScheduler.test.ts (154) + session-tracing.test.ts (49) + toolHookTriggers.test.ts (47).
  • tsc --noEmit clean.
  • ESLint clean on changed files.

🤖 Generated with Qwen Code

@doudouOUC doudouOUC requested a review from wenshao May 20, 2026 02:34
Comment thread packages/core/src/core/coreToolScheduler.ts Outdated
Comment thread packages/core/src/core/coreToolScheduler.ts
Comment thread packages/core/src/core/coreToolScheduler.ts Outdated
- coreToolScheduler.ts: handleConfirmationResponse outer catch now
  branches on signal.aborted — a throw caused by the abort signal
  (e.g. ModifyWithEditor child interrupted by Ctrl+C) lands as
  decision:'aborted'/UNSET status instead of 'error'/tool_exception,
  matching the sister catch in `_schedule` and keeping dashboard
  abort-vs-error counts honest (Critical-shaped Suggestion).

- coreToolScheduler.ts: drop the per-batch abort listener at the end
  of `_schedule` when no batch entries remain in toolSpans /
  blockedSpans. Prevents Node's MaxListenersExceededWarning in
  long-lived sessions where the same AbortSignal sees many _schedule
  batches without a real abort. Listeners that still cover
  awaiting_approval entries stay attached — the user's eventual
  decision closes the spans, and the listener becomes a no-op when it
  later fires (or auto-removes via `{ once: true }` on real abort).

- coreToolScheduler.test.ts: 2 regression tests for PostToolUseFailure
  hook span variants — `is_interrupt:true` on user-abort vs
  `is_interrupt:false` on real-exception. Operators rely on this flag
  to separate user-initiated cancellations from system errors in
  dashboards; a copy-paste regression flipping the value across the 4
  PostToolUseFailure call sites was previously invisible.

Tests: 252/252 across affected files (coreToolScheduler 156 +
session-tracing 49 + toolHookTriggers 47).

🤖 Generated with [Qwen Code](https://github.com/QwenLM/qwen-code)
@doudouOUC
Copy link
Copy Markdown
Collaborator Author

Follow-up commit fc509d50e — wenshao /review round 3

All 3 findings adopted:

[Suggestion → Real bug] handleConfirmationResponse outer catch now branches on signal.aborted so user aborts during ModifyWithEditor / inline-modify flows tag decision: 'aborted' + UNSET status instead of the misleading 'error'/'tool_exception'. Matches the sister catch in _schedule:1797.

[Suggestion] Per-batch abort listener in _schedule is removed at the end of the schedule once the batch is fully drained from toolSpans/blockedSpans. Avoids Node.js MaxListenersExceededWarning in long-lived sessions where the same AbortSignal sees many _schedule batches without an actual abort. Listeners covering awaiting_approval entries stay attached — they become a no-op when handleConfirmationResponse drains the maps, or auto-remove via { once: true } on real abort.

[Suggestion] Two regression tests for PostToolUseFailure hook spans: is_interrupt: true on user-abort vs is_interrupt: false on real-exception. Both test variants of withHookSpan driving through runSingleTool({ disableHooks: false, messageBus }). Closes the test gap I previously deferred.

Verification: 252/252 across affected files. tsc --noEmit clean.

🤖 Generated with Qwen Code

Comment thread packages/core/src/core/coreToolScheduler.ts Outdated
Comment thread packages/core/src/core/coreToolScheduler.ts
Comment thread packages/core/src/telemetry/session-tracing.ts
Comment thread packages/core/src/core/coreToolScheduler.ts
Comment thread packages/core/src/core/coreToolScheduler.ts
Comment thread packages/core/src/telemetry/session-tracing.ts
Comment thread packages/core/src/core/coreToolScheduler.ts
Comment thread packages/core/src/core/coreToolScheduler.ts Outdated
Comment thread packages/core/src/core/coreToolScheduler.ts Outdated
Comment thread packages/core/src/core/coreToolScheduler.ts Outdated
Comment thread packages/core/src/telemetry/session-tracing.ts
Comment thread packages/core/src/core/coreToolScheduler.ts
Comment thread packages/core/src/core/coreToolScheduler.ts
Comment thread packages/core/src/core/coreToolScheduler.ts
Comment thread packages/core/src/telemetry/session-tracing.ts
Comment thread packages/core/src/core/coreToolScheduler.ts
Comment thread packages/core/src/core/coreToolScheduler.ts Outdated
Comment thread packages/core/src/core/coreToolScheduler.ts Outdated
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.

Additional suggestions (not on diff lines):

  • session-tracing.ts:69 — The comment "Phase 2 forward-declarations (no start*/end* helpers wired yet)" is now stale since this PR wires startToolBlockedOnUserSpan, endToolBlockedOnUserSpan, startHookSpan, and endHookSpan. Consider updating to reflect that helpers are now wired.

  • coreToolScheduler.ts:1654firePermissionRequestHook is the only hook fire site on the approval critical path that is NOT wrapped with withHookSpan. All 6 PreToolUse/PostToolUse/PostToolUseFailure sites are wrapped. Operators have no hook-span telemetry for the permission approval flow — a slow policy server would show up as tool-span latency with no hook-level breakdown.

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

Comment thread packages/core/src/core/coreToolScheduler.ts
Comment thread packages/core/src/telemetry/session-tracing.ts Outdated
Comment thread packages/core/src/core/coreToolScheduler.ts Outdated
Comment thread packages/core/src/core/coreToolScheduler.ts Outdated
Adopted ([Critical]):

- coreToolScheduler.ts: full per-batch abort listener cleanup. Replaced
  the closure-local Set + end-of-_schedule cleanup with a class-level
  callIdToBatch Map keyed off a shared BatchAbortState. The listener is
  now released by `finalizeToolSpan` → `releaseBatchListenerIfDrained`
  whenever the last live batch entry drains, regardless of whether
  finalize happens synchronously inside _schedule, later via
  handleConfirmationResponse, or via executeSingleToolCall. Closes
  the awaiting_approval-batches-leak-listeners gap from the previous
  partial fix.

- coreToolScheduler.ts: re-check signal.aborted in the _schedule
  for-loop after `evaluatePermissionFlow`/`getConfirmationDetails`/
  `firePermissionRequestHook` and BEFORE setting awaiting_approval +
  starting the blocked span. Without this, a signal that aborts during
  one of those awaits opens a blocked span on an already-aborted
  signal whose drainSpansForBatch may have already fired, leaving the
  new entry permanently orphaned.

- session-tracing.ts: introduce truncateSpanError(s) (1KB cap) and
  apply it to every endXSpan site that writes metadata.error to span
  attributes / status messages (LLM, tool, tool execution, hook).
  Hook server responses, raw exception stacks, or hostile inputs can
  be unbounded; some OTel backends drop the entire span when any
  field exceeds their limit.

Adopted ([Suggestion]):

- coreToolScheduler.ts: per-callId try/catch inside drainSpansForBatch.
  One bad finalize no longer skips the rest of the batch; failures
  are logged via debugLogger.warn instead of bubbling up as an
  unhandled timer-callback exception.

- session-tracing.ts: TTL sweep robustness — wraps setAttributes and
  span.end() in separate try/catch blocks so a setAttributes throw
  can't leak the OTel span; stamps `decision: 'aborted'`/
  `source: 'system'` on TTL-expired blocked_on_user spans so
  dashboards filtering by decision count walk-aways consistently with
  explicit user aborts; includes tool.name + tool.call_id in the
  warn log so it's actionable in production without a trace-backend
  lookup.

- coreToolScheduler.ts: extract the 4 byte-identical PostToolUseFailure
  toEndMeta lambdas into a single `postToolUseFailureEndMeta` member.
  Future protocol changes only need to touch one place.

- coreToolScheduler.test.ts: 3 new tests
  * outer-catch aborted branch — pre-aborted signal + throwing
    onConfirm asserts decision='aborted'/source='system' and
    failure_kind='cancelled'.
  * ModifyWithEditor !editorType — uses a getModifyContext-shimmed
    MockEditTool to enter the modifiable branch and asserts
    qwen-code.tool.modify_with_editor_unavailable=true.
  * per-batch listener removed when batch drains synchronously —
    asserts AbortSignal listenerCount and `callIdToBatch` size.

Pushed back (deferred):

- "firePermissionRequestHook in withHookSpan + hookError field" —
  same as previous deferral. Touches the public PermissionRequestHookResult
  type re-exported from packages/core/src/index.ts; declined per the
  guardrail on public-API changes.

Tests: 255/255 across affected files (coreToolScheduler 159 +
session-tracing 49 + toolHookTriggers 47).

🤖 Generated with [Qwen Code](https://github.com/QwenLM/qwen-code)
@doudouOUC
Copy link
Copy Markdown
Collaborator Author

Follow-up commit f0befac57 — wenshao /review round 3 disposition

Adopted (7 unique findings)

[Critical] coreToolScheduler.ts:1462 — Abort listener accumulation. Replaced the closure-local Set + end-of-_schedule cleanup with a class-level callIdToBatch Map + shared BatchAbortState. finalizeToolSpanreleaseBatchListenerIfDrained removes the listener once the last live entry drains, regardless of where finalize happens (sync inside _schedule, later handleConfirmationResponse, or executeSingleToolCall). Awaiting_approval batches no longer leak.

[Critical] coreToolScheduler.ts:1907 — Outer-catch aborted branch untested. Added regression test pre-aborting the signal + throwing originalOnConfirm, asserting decision: 'aborted' / source: 'system' and tool.failure_kind: 'cancelled'.

[Critical] session-tracing.ts:759 — Unbounded hookError written to spans. Introduced truncateSpanError(s) (1KB cap) and applied at every endXSpan site (LLM, tool, tool execution, hook).

[Critical] coreToolScheduler.ts:1780 — No signal.aborted re-check after awaits in _schedule for-loop. Added re-check after evaluatePermissionFlow / getConfirmationDetails / firePermissionRequestHook and BEFORE setStatusInternal('awaiting_approval', ...) so a signal aborting during one of those awaits no longer creates an orphaned blocked span.

[Suggestion] coreToolScheduler.ts:1089drainSpansForBatch per-callId try/catch with debugLogger.warn on failure. Bad finalize for one callId no longer skips remaining batch entries.

[Suggestion] session-tracing.ts:126 — TTL sweep robustness (3 sub-issues): added decision: 'aborted' + source: 'system' for TTL-expired blocked_on_user spans; included tool.name + tool.call_id in the warn log; separated setAttributes and span.end() try/catch blocks.

[Suggestion] coreToolScheduler.ts:2493,2735,2810,2854 — extracted the 4 byte-identical PostToolUseFailure toEndMeta lambdas into a single postToolUseFailureEndMeta member.

[Suggestion] coreToolScheduler.ts:1855stillLive cleanup in finally. Superseded by the listener-cleanup-on-finalize from finding #1; releaseBatchListenerIfDrained fires regardless of exceptions because it's called from every terminal-state path.

Pushed back (1)

[Suggestion] "firePermissionRequestHook in withHookSpan + hookError field" (sub-items 5.3 and 5.4 of the test-coverage-gaps pattern) — same deferral as the previous review round. Wrapping this site requires extending PermissionRequestHookResult, a public type re-exported from packages/core/src/index.ts:396. Declined per the public-API-change guardrail; tracking as a follow-up PR.

Tests

3 new tests, 255/255 pass across coreToolScheduler.test.ts (159) + session-tracing.test.ts (49) + toolHookTriggers.test.ts (47). tsc --noEmit clean.

🤖 Generated with Qwen Code

@doudouOUC doudouOUC requested a review from wenshao May 20, 2026 05:11
Comment thread packages/core/src/telemetry/session-tracing.ts Outdated
Comment thread packages/core/src/core/coreToolScheduler.ts
- session-tracing.ts: rename `SPAN_ERROR_MAX_BYTES` → `SPAN_ERROR_MAX_CHARS`
  and update the JSDoc to be honest that `truncateSpanError` truncates by
  UTF-16 code units rather than bytes. CJK/emoji-heavy errors land in the
  ~2-3KB UTF-8 range under the same code-unit cap, but that's still well
  under all major OTel backends' per-attribute limits (Jaeger/Honeycomb
  ~64KB, OTLP default ~32KB), so we keep the simpler char-count bound
  rather than paying the encoder cost on every endXSpan.

- coreToolScheduler.ts: move the `withHookSpan` JSDoc block to sit
  directly above the method. The previous order had two consecutive
  JSDoc blocks separated by `postToolUseFailureEndMeta`, which orphaned
  the `withHookSpan` doc — IDE hover tooltips would surface the wrong
  documentation.

Tests: 208/208 in affected files; tsc --noEmit clean.

🤖 Generated with [Qwen Code](https://github.com/QwenLM/qwen-code)
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.

Additional observations (not on diff lines):

  • firePermissionRequestHook not wrapped with withHookSpan (coreToolScheduler.ts:1734): The PR wraps 6 hook fire sites with span instrumentation, but firePermissionRequestHook — a decision-making hook that can return allow/deny — is not wrapped. The HookEvent type also lacks a 'PermissionRequest' variant. This makes the permission hook's latency and decision invisible in traces. If this exclusion is intentional, a comment at the call site noting the rationale would help future maintainers.

  • endToolBlockedOnUserSpan never sets ERROR status (session-tracing.ts:706): When a blocked span is closed with decision: 'error' (e.g., system exception during approval flow), the span status stays UNSET. Operators filtering by SpanStatusCode.ERROR in trace backends won't surface these. Consider setting ERROR status when metadata?.decision === 'error'.

  • Test coverage gaps (pattern): Three specific new code paths lack test coverage: (1) truncateSpanError — no test passes an oversized string to verify truncation; (2) TTL sweep tool.blocked_on_user branch — the type-specific decision: 'aborted' stamping is untested; (3) endHookSpan idempotency — the blocked_on_user span has an idempotency test but the hook span does not.

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

Comment thread packages/core/src/core/coreToolScheduler.ts
Comment thread packages/core/src/core/coreToolScheduler.ts
Comment thread packages/core/src/core/coreToolScheduler.ts
Comment thread packages/core/src/core/coreToolScheduler.ts
Comment thread packages/core/src/telemetry/session-tracing.ts Outdated
Adopted ([Suggestion]):

- coreToolScheduler.ts: `setToolSpanFailure` now applies
  `truncateSpanError` to the status message at this single ingress
  point. Many of its 10+ call sites pass raw `error.message` which can
  be unbounded — the same backend-drop risk that drove
  `truncateSpanError` for the endXSpan attribute writes. Static-
  constant callers see no change since their messages are well under
  the 1024-char cap. Required exporting `truncateSpanError` from
  `session-tracing.ts` and re-exporting from `telemetry/index.ts`.

- coreToolScheduler.ts: in `_schedule`, after the for-loop runs to
  completion, drop the abort listener if `batchState.callIds.size === 0`.
  Closes the all-error-batch leak path: if every newToolCall had
  `status !== 'validating'` (e.g., invalid params, tool not registered,
  queue full), no `finalizeToolSpan` ever fires for the batch and
  `releaseBatchListenerIfDrained` is never invoked. Without this drop,
  one dead listener accumulates per all-error batch.

- coreToolScheduler.ts: `handleConfirmationResponse` outer catch now
  emits a `debugLogger.warn` before rethrowing. Without it, if the
  caller (CLI confirmation UI layer) doesn't log the rejection, the
  error disappears from application logs entirely — operators
  grepping by callId would see nothing despite the trace backend
  showing `failure_kind: tool_exception`.

- session-tracing.test.ts: 4 new tests
  * `truncateSpanError` returns short strings unchanged
  * `truncateSpanError` truncates over 1024 chars + appends sentinel
  * `truncateSpanError` boundary at exactly 1024 chars
  * TTL sweep stamps `decision: 'aborted'` + `source: 'system'` on
    blocked_on_user spans (covers the branch added in review-3 round)

Pushed back ([Suggestion]):

- "TTL sweep can't reach scheduler-local Maps" — accurate but the fix
  is non-trivial: a parallel scheduler-side TTL sweep duplicates the
  session-tracing sweep's bookkeeping, and the practical impact is
  bounded (Maps die with the scheduler instance, which is per-session
  in CLI mode). The bigger leak (listener accumulation on shared
  signals) is already covered by `releaseBatchListenerIfDrained`.
  Marking as out-of-scope architectural follow-up.

Tests: 259/259 across affected files (coreToolScheduler 159 +
session-tracing 53 + toolHookTriggers 47). `tsc --noEmit` clean.

🤖 Generated with [Qwen Code](https://github.com/QwenLM/qwen-code)
@doudouOUC doudouOUC requested a review from wenshao May 20, 2026 09:53
Comment thread packages/core/src/core/coreToolScheduler.test.ts Outdated
- coreToolScheduler.test.ts: convert the `truncateSpanError` mock from
  an inline identity function to `vi.fn(identity)` so individual tests
  can substitute a sentinel return. Added regression test
  `setToolSpanFailure forwards the truncateSpanError result to the span
  status (#4321)` that overrides the spy with `<<TRUNCATED-SENTINEL>>`,
  drives the scheduler through the pre-hook deny path, and asserts the
  span's ERROR status message equals the sentinel — locks the
  integration so a regression dropping the `truncateSpanError(message)`
  call inside `setToolSpanFailure` is caught at the scheduler boundary
  rather than only at the utility's unit test.

Tests: 213/213 across `coreToolScheduler.test.ts` (160) +
`session-tracing.test.ts` (53). `tsc --noEmit` clean.

🤖 Generated with [Qwen Code](https://github.com/QwenLM/qwen-code)
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