Skip to content

Conversation

@acoliver
Copy link
Collaborator

@acoliver acoliver commented Dec 30, 2025

Summary

This PR fixes five related issues affecting tool execution, cancellation, and search functionality.

Issues Fixed

#945 - search_file_content glob include issues

Problem: Brace expansion patterns like *.{ts,tsx,js} don't work with git grep, causing silent failures or fallback to slow JS glob scan.

Solution: Added hasBraceExpansion() helper to detect patterns with {...} syntax. When detected, we skip git grep entirely and use system grep (which supports --include globs with brace expansion) or the JS fallback.

#948 - Shell cancellation doesn't kill the process

Problem: ESC shows "cancelled" but the shell process continues running. The _signal parameter in DiscoveredTool.execute() was being ignored (underscore prefix indicated unused).

Solution: Added proper abort signal handling that kills the spawned child process when abort is triggered, following the same pattern used in ShellExecutionService.

#951 - History ID uniqueness/key collisions

Problem: React keys could collide when multiple useHistory hook instances generated IDs using the same baseTimestamp because the counter was per-instance (useRef).

Solution: Changed to a module-level global counter so IDs are unique across all hook instances. Also multiplied timestamp by 1000 to provide more ID space.

#952 & #957 - Tool read hangs / "Tool call cancelled while in queue" error

Problem: Two related issues stemming from the same root cause:

  1. handleMessageBusResponse created a NEW AbortController instead of using the original signal from the scheduled request
  2. publishBufferedResults could race when called from multiple async tool completions

Solution:

  • Added callIdToSignal map to store the original signal for each tool call
  • Use stored signal in message bus response handler instead of creating new one
  • Added reentrancy guard (isPublishingBufferedResults) to prevent race conditions

Testing

  • npm run format - passed
  • npm run lint - passed
  • npm run typecheck - passed
  • npm run test - all tests pass
  • npm run build - passed
  • Manual test with node scripts/start.js --profile-load synthetic --prompt "write me a haiku"

Related

Fixes #945, #948, #951, #952, #957

Summary by CodeRabbit

  • Bug Fixes

    • Tool cancellation reliably terminates running operations and no longer surfaces cancellation errors to the UI.
    • Message ID generation strengthened to avoid collisions across history instances.
    • Search now handles shell-style brace expansion by falling back to a compatible method.
    • Resolved race conditions in tool result buffering to ensure ordered, consistent result delivery.
  • Tests

    • Added tests covering buffered parallel execution and out-of-order completion scenarios.

✏️ Tip: You can customize this high-level summary in your review settings.

- #945: Skip git grep for unsupported brace expansion patterns like *.{ts,tsx}
  Git grep pathspecs don't support shell-style brace expansion, so we now
  detect these patterns and fall back to system grep which handles them.

- #948: Kill child process on abort in DiscoveredTool.execute
  The abort signal was being ignored (prefixed with underscore). Now we
  properly listen for abort and kill the spawned child process.

- #951: Use global counter for history message IDs to prevent collisions
  Changed from per-instance useRef counter to module-level counter so
  different hook instances using the same timestamp won't collide.

- #952/#957: Fix tool confirmation abort signal handling
  - Store original abort signal per callId in callIdToSignal map
  - Use stored signal in handleMessageBusResponse instead of creating new one
  - Add reentrancy guard to publishBufferedResults to prevent race conditions

Fixes #945, #948, #951, #952, #957
@github-actions github-actions bot added the maintainer:e2e:ok Trusted contributor; maintainer-approved E2E run label Dec 30, 2025
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Dec 30, 2025

Walkthrough

Replaces per-instance history IDs with a module-level global counter; adds brace-expansion detection and abort handling to grep; propagates and stores per-call AbortSignals in CoreToolScheduler and reuses them on confirmations; adds reentrancy guard for buffered publishing; wires AbortSignal handling into DiscoveredTool.execute.

Changes

Cohort / File(s) Summary
History ID Generation
packages/cli/src/ui/hooks/useHistoryManager.ts
Replace per-instance counter with a module-level globalMessageIdCounter; compute IDs as baseTimestamp * 1000 + globalCounter; stop resetting local counter on clearItems.
Tool Scheduling & Signal Propagation
packages/core/src/core/coreToolScheduler.ts
Add callIdToSignal: Map<string, AbortSignal> to store per-call signals; store signal at schedule time; reuse stored signal on TOOL_CONFIRMATION_RESPONSE; add isPublishingBufferedResults reentrancy guard, pendingPublishRequest coalescing, ordered publish loop, and cleanup of per-call signal mappings on completion.
Tool Execution & Abort Handling
packages/core/src/tools/tool-registry.ts
Rename _signalsignal in DiscoveredTool.execute; attach abort listener to kill spawned child process; capture exitSignal from process close event and return it; ensure abort-listener cleanup in finally.
Grep Tool: Brace Expansion & Abort
packages/core/src/tools/grep.ts
Add hasBraceExpansion(pattern) to detect {a,b} patterns and avoid git grep when present; attach AbortSignal listeners to kill child processes for both git and system grep flows; consistent cleanup of listeners/handlers on success, error, or abort.
React Scheduler Callsite
packages/cli/src/ui/hooks/useReactToolScheduler.ts
Swallow cancellation-related rejections from scheduler.schedule(...) by attaching .catch(...) to avoid propagating aborts as errors to the caller.
Tests: Scheduler Race Coverage
packages/core/src/core/coreToolScheduler.test.ts
Add tests to exercise buffered parallel execution and out-of-order completions verifying ordered publish and reentrancy behavior.
Plan / Docs
project-plans/20251230fixes/plan.md
Add plan and verification notes summarizing history ID, grep, abort handling, and scheduler signal-preservation changes.

Sequence Diagram(s)

sequenceDiagram
    participant UI as UI / Caller
    participant Scheduler as CoreToolScheduler
    participant SigMap as callIdToSignal (Map)
    participant Tool as DiscoveredTool
    participant Child as Spawned Child Process

    UI->>Scheduler: schedule(callId, params, signal)
    Scheduler->>SigMap: store(callId → signal)
    Scheduler->>Tool: execute(params, signal)
    Tool->>Child: spawn process
    Tool->>Tool: attach abort listener -> on abort -> kill Child

    alt Normal completion
        Child-->>Tool: close (exitSignal)
        Tool->>Scheduler: resolve with exitSignal
        Scheduler->>SigMap: delete(callId)
        Scheduler->>Scheduler: publishBufferedResults (ordered loop)
    else Abort triggered
        SigMap-->>Scheduler: provide stored signal for callId
        Scheduler->>Tool: use original signal in confirmation handling
        Tool->>Child: abort listener kills Child
        Tool->>Scheduler: reject/resolve as aborted
        Scheduler->>SigMap: delete(callId)
        Scheduler->>Scheduler: publishBufferedResults (coalesced, guarded)
    end

    Note right of Scheduler: publishBufferedResults guarded by isPublishingBufferedResults and uses pendingPublishRequest to reschedule if new results arrive
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

Poem

🐰 A hop, a nibble, IDs align,

Signals kept through twist and time,
Braces skipped where git can't see,
Processes stop when told to be,
Code settles softly — carrot-time 🥕

Pre-merge checks and finishing touches

✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title 'fix: resolve tool scheduling, cancellation, and search issues' is specific and accurately reflects the main changes addressing five related issues across tool execution, cancellation, and search functionality.
Description check ✅ Passed The description is comprehensive and well-structured, covering all key sections (Summary, Issues Fixed with detailed explanations, Testing, and Related issues), though it deviates slightly from the template structure.
✨ Finishing touches
  • 📝 Generate docstrings

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions
Copy link
Contributor

github-actions bot commented Dec 30, 2025

I'll analyze the PR to review the fixes for tool scheduling, cancellation, and search issues. Let me start by examining the changes and verifying they align with the reported issues.

I'll review PR #961 which addresses several critical issues with tool scheduling, cancellation, and search functionality. Let me analyze the changes:

LLxprt PR Review – PR #961

Issue Alignment
The PR successfully addresses all five linked issues:

Side Effects

  • Global message ID counter persists across conversation clears (by design) - This is intentional to maintain ID uniqueness
  • JS glob fallback is now more likely to be used for complex patterns, which may impact performance but ensures correctness
  • Tool execution now properly respects abort signals, which may increase process cleanup overhead

Code Quality

  • Added comprehensive reentrancy guards and proper signal cleanup
  • Excellent defensive patterns for race conditions in async operations
  • Good separation of concerns with helper functions like hasBraceExpansion()
  • Proper error handling in child process execution with abort support

Tests & Coverage

Verdict

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🧹 Nitpick comments (2)
project-plans/20251230fixes/issues/issue-951.json (1)

1-1: Data quality: Issue body contains excessive repetition.

The issue body field contains the same paragraph repeated many times (appears to be a copy/paste artifact). While this doesn't affect code functionality, consider cleaning up this data file before merging if it will be used for documentation or reference purposes.

packages/core/src/core/coreToolScheduler.ts (1)

497-504: Add logging when AbortController fallback is used for diagnostics.

The stored signal retrieval is correct. The fallback new AbortController().signal (line 499) handles edge cases where the original signal was deleted (e.g., if the tool call completed while the confirmation response was in transit), but this should be rare. Add a debug log when the fallback is used to help diagnose unexpected cases:

const originalSignal = this.callIdToSignal.get(callId);
if (!originalSignal && toolSchedulerLogger.enabled) {
  toolSchedulerLogger.debug(
    () =>
      `Using fallback AbortSignal for callId=${callId} (original signal not found in map)`,
  );
}
const signal = originalSignal ?? new AbortController().signal;
📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between feb9158 and 3651af2.

📒 Files selected for processing (10)
  • packages/cli/src/ui/hooks/useHistoryManager.ts
  • packages/core/src/core/coreToolScheduler.ts
  • packages/core/src/tools/grep.ts
  • packages/core/src/tools/tool-registry.ts
  • project-plans/20251230fixes/issues/issue-945.json
  • project-plans/20251230fixes/issues/issue-948.json
  • project-plans/20251230fixes/issues/issue-951.json
  • project-plans/20251230fixes/issues/issue-952.json
  • project-plans/20251230fixes/issues/issue-957.json
  • project-plans/20251230fixes/plan.md
🧰 Additional context used
📓 Path-based instructions (2)
**/*.{ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.{ts,tsx}: Don't use any - Always specify proper types. Use unknown if the type is truly unknown and add proper type guards.
Do not use console.log or console.debug - Use the sophisticated logging system instead. Log files are written to ~/.llxprt/debug/
Fix all linting errors, including warnings about any types

Files:

  • packages/core/src/tools/tool-registry.ts
  • packages/cli/src/ui/hooks/useHistoryManager.ts
  • packages/core/src/tools/grep.ts
  • packages/core/src/core/coreToolScheduler.ts
**/*.md

📄 CodeRabbit inference engine (CLAUDE.md)

Documentation-only changes (*.md files, docs/) do NOT require build/test/lint cycle

Files:

  • project-plans/20251230fixes/plan.md
🧠 Learnings (5)
📓 Common learnings
Learnt from: acoliver
Repo: vybestack/llxprt-code PR: 0
File: :0-0
Timestamp: 2025-12-26T14:17:41.974Z
Learning: In packages/core/src/core/coreToolScheduler.ts, the `publishBufferedResults()` method (line 1355) is called concurrently by multiple tool completion handlers (line 1510 in each tool's `.then()` callback) when parallel tools finish simultaneously. This causes a race condition where `nextPublishIndex` can be corrupted and tools can hang in 'executing' state forever, blocking the scheduler and causing subsequent tool calls to queue indefinitely. The method must be made reentrant-safe using a mutex/lock pattern to serialize concurrent calls.
📚 Learning: 2025-11-16T22:51:26.374Z
Learnt from: e2720pjk
Repo: vybestack/llxprt-code PR: 583
File: packages/core/src/providers/openai/OpenAIProvider.ts:935-959
Timestamp: 2025-11-16T22:51:26.374Z
Learning: In the llxprt-code codebase (packages/core/src/providers/openai/OpenAIProvider.ts), tools like `run_shell_command` use internal streaming only for real-time UI updates during execution, but each tool execution produces exactly ONE final `ToolResponseBlock` containing the full result. The streaming chunks are never sent to the LLM and are not converted into multiple tool messages. The OpenAI Chat Completions API requires that each tool call (tool_call_id) corresponds to exactly one message with role 'tool', so duplicate tool response detection that removes subsequent tool messages with the same tool_call_id is correct and necessary for API compliance.

Applied to files:

  • project-plans/20251230fixes/issues/issue-948.json
  • project-plans/20251230fixes/issues/issue-957.json
  • project-plans/20251230fixes/issues/issue-952.json
  • packages/core/src/core/coreToolScheduler.ts
📚 Learning: 2025-12-26T14:17:41.974Z
Learnt from: acoliver
Repo: vybestack/llxprt-code PR: 0
File: :0-0
Timestamp: 2025-12-26T14:17:41.974Z
Learning: In packages/core/src/core/coreToolScheduler.ts, the `publishBufferedResults()` method (line 1355) is called concurrently by multiple tool completion handlers (line 1510 in each tool's `.then()` callback) when parallel tools finish simultaneously. This causes a race condition where `nextPublishIndex` can be corrupted and tools can hang in 'executing' state forever, blocking the scheduler and causing subsequent tool calls to queue indefinitely. The method must be made reentrant-safe using a mutex/lock pattern to serialize concurrent calls.

Applied to files:

  • project-plans/20251230fixes/issues/issue-948.json
  • project-plans/20251230fixes/issues/issue-957.json
  • project-plans/20251230fixes/issues/issue-952.json
  • project-plans/20251230fixes/plan.md
  • packages/core/src/core/coreToolScheduler.ts
📚 Learning: 2025-12-18T14:06:22.557Z
Learnt from: acoliver
Repo: vybestack/llxprt-code PR: 0
File: :0-0
Timestamp: 2025-12-18T14:06:22.557Z
Learning: OpenAIResponsesProvider (packages/core/src/providers/openai-responses/OpenAIResponsesProvider.ts) currently bypasses the ephemeral truncation system by using direct `JSON.stringify(toolResponseBlock.result)` and needs to be updated to support ephemeral settings like the other providers.

Applied to files:

  • project-plans/20251230fixes/issues/issue-952.json
📚 Learning: 2025-12-12T23:31:19.937Z
Learnt from: acoliver
Repo: vybestack/llxprt-code PR: 779
File: project-plans/20251212issue488/PLAN.md:1-7
Timestamp: 2025-12-12T23:31:19.937Z
Learning: Do not validate or review plan documents in the vybestack/llxprt-code repository after implementation. Specifically, skip validation for files under project-plans (e.g., project-plans/**/PLAN.md) once the feature is implemented; these documents are not checked in reviews post-implementation.

Applied to files:

  • project-plans/20251230fixes/plan.md
🪛 GitHub Check: CodeQL
packages/core/src/tools/grep.ts

[failure] 37-37: Polynomial regular expression used on uncontrolled data
This regular expression that depends on library input may run slow on strings starting with '{{' and with many repetitions of '{{'.
This regular expression that depends on library input may run slow on strings starting with '{{,' and with many repetitions of ','.

🪛 markdownlint-cli2 (0.18.1)
project-plans/20251230fixes/plan.md

190-190: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

⏰ Context from checks skipped due to timeout of 270000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (7)
  • GitHub Check: Test (macos-latest, 24.x)
  • GitHub Check: Test (windows-latest, 24.x)
  • GitHub Check: Test (ubuntu-latest, 24.x)
  • GitHub Check: E2E Test (Linux) - sandbox:docker
  • GitHub Check: E2E Test (Linux) - sandbox:none
  • GitHub Check: Slow E2E - Win
  • GitHub Check: E2E Test (macOS)
🔇 Additional comments (16)
packages/core/src/tools/grep.ts (1)

511-514: LGTM! Correct strategy selection based on brace expansion.

The logic correctly detects brace expansion patterns and skips git grep (which doesn't support shell-style brace expansion like {ts,tsx,js}), falling back to system grep or the JavaScript implementation which properly handle these patterns.

project-plans/20251230fixes/issues/issue-952.json (1)

1-1: Issue documentation artifact - no code review needed.

This JSON file documents the parallel tool call hanging issue (#952) and its analysis. The documented race condition in publishBufferedResults() aligns with the fix implemented in coreToolScheduler.ts in this PR.

packages/cli/src/ui/hooks/useHistoryManager.ts (3)

16-18: LGTM! Global counter ensures cross-hook ID uniqueness.

Using a module-level counter prevents ID collisions when multiple useHistory hook instances generate IDs with the same baseTimestamp. This correctly addresses issue #951's key collision problem.


69-74: Verify ID uniqueness assumptions for high-frequency operations.

The formula baseTimestamp * 1000 + globalMessageIdCounter works well for typical usage. However, if more than ~1000 items are added within the same millisecond (same baseTimestamp), IDs could theoretically collide with the next millisecond's range. This is unlikely in practice but worth documenting.

Consider adding a brief comment noting the ~1000 items/ms assumption, or using a larger multiplier (e.g., 1_000_000) if higher throughput is anticipated.


135-140: Correct: Counter not reset on clear to maintain session-wide uniqueness.

The comment correctly explains the rationale. Resetting the counter would risk ID collisions if a user clears history and then adds new items with the same timestamp range.

packages/core/src/tools/tool-registry.ts (3)

87-93: LGTM! Proper abort signal handling for discovered tools.

The abort handler correctly:

  1. Checks !child.killed before attempting to kill (prevents errors on already-terminated processes)
  2. Uses SIGTERM for graceful termination
  3. Registers the handler with addEventListener

This matches the cancellation pattern used in ShellExecutionService, fixing issue #948.


134-136: LGTM! Cleanup ensures no listener leaks.

The finally block guarantees the abort listener is removed regardless of how the promise resolves, preventing memory leaks and ensuring the handler doesn't fire after execution completes.


139-145: LGTM! Correct usage of exitSignal in error reporting.

The exitSignal variable now correctly captures the actual signal received by the process (from the close event), providing accurate diagnostics when the tool is terminated by a signal.

project-plans/20251230fixes/issues/issue-945.json (1)

1-1: Issue documentation artifact - no code review needed.

This JSON file documents issue #945 (search_file_content glob handling). The fix implemented in grep.ts with hasBraceExpansion() directly addresses the root cause documented here.

packages/core/src/core/coreToolScheduler.ts (4)

415-417: LGTM! Per-call signal tracking fixes abort propagation.

Storing the abort signal per callId ensures the original signal flows through to tool execution, even when confirmations are processed via the message bus. This directly fixes issue #948 where shell tools continued running after ESC.


1362-1407: Reentrancy guard correctly prevents race conditions.

The isPublishingBufferedResults flag serializes concurrent calls to publishBufferedResults(), preventing the race condition where nextPublishIndex could be corrupted when multiple tools complete simultaneously. This aligns with the learning about this method needing to be reentrant-safe.

The approach of silently returning when already publishing is acceptable because:

  1. The currently-executing call will process all buffered results up to the first gap
  2. When new results arrive, subsequent tool completions will trigger another attempt
  3. The while loop ensures all ready results are published in one pass

Based on learnings, this addresses the race condition in publishBufferedResults().


948-949: LGTM! Signal stored during scheduling.

Storing the signal when the tool call is scheduled ensures it's available later when processing message bus confirmation responses.


1572-1575: LGTM! Proper cleanup of signal mappings.

Deleting entries from callIdToSignal after tool calls complete prevents memory leaks from accumulating stale signal references.

project-plans/20251230fixes/issues/issue-948.json (1)

1-1: Issue documentation artifact - no code review needed.

This JSON file documents issue #948 (shell tool cancellation). The detailed analysis correctly identified the root cause at line 494 where a new AbortController was created, which is now fixed via the callIdToSignal map in coreToolScheduler.ts.

project-plans/20251230fixes/issues/issue-957.json (1)

1-1: Documentation file looks good.

This JSON file documents the investigation and resolution of issue #957, providing valuable context for the fixes implemented in this PR. The detailed CodeRabbit analysis comments trace the debugging process and correctly identify the race condition in publishBufferedResults that matches the implemented fix.

project-plans/20251230fixes/plan.md (1)

1-200: Plan document provides clear roadmap for the fixes.

This plan document effectively organizes the fixes for five related issues, with clear root cause analysis, proposed solutions, and implementation order. The structure helps track the work and provides good context for reviewers.

Based on learnings, plan documents serve as historical tracking and don't require detailed validation post-implementation.

Comment on lines +190 to +200
```
fix: resolve tool scheduling and cancellation issues
- #945: Skip git grep for unsupported brace expansion patterns
- #948: Kill child process on abort in DiscoveredTool.execute
- #951: Use global counter for history message IDs to prevent collisions
- #952/#957: Pass original abort signal through confirmation flow and
add reentrancy guard to publishBufferedResults
Fixes #945, #948, #951, #952, #957
```
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Add language identifier to the fenced code block.

The commit message template code block should specify a language for proper markdown rendering.

🔎 Proposed fix
-```
+```text
 fix: resolve tool scheduling and cancellation issues
 
 - #945: Skip git grep for unsupported brace expansion patterns
 - #948: Kill child process on abort in DiscoveredTool.execute
 - #951: Use global counter for history message IDs to prevent collisions
 - #952/#957: Pass original abort signal through confirmation flow and
   add reentrancy guard to publishBufferedResults
 
 Fixes #945, #948, #951, #952, #957
</details>

As per static analysis tools.

<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

```suggestion

🧰 Tools
🪛 markdownlint-cli2 (0.18.1)

190-190: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🤖 Prompt for AI Agents
project-plans/20251230fixes/plan.md lines 190-200: the fenced code block
containing the commit message template lacks a language identifier which can
hinder proper markdown rendering; update the opening fence to include a language
(e.g., ```text or ```md) so the block is rendered correctly and matches the
proposed fix shown in the comment.

@github-actions
Copy link
Contributor

github-actions bot commented Dec 30, 2025

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 46.21% 46.21% 55.23% 75.35%
Core 69.83% 69.83% 72.55% 78.71%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   46.21 |    75.35 |   55.23 |   46.21 |                   
 src               |   32.66 |    46.59 |      50 |   32.66 |                   
  gemini.tsx       |   14.63 |    66.66 |   28.57 |   14.63 | ...,281-1057,1065 
  ...ractiveCli.ts |   69.23 |    47.72 |   33.33 |   69.23 | ...50-251,284-292 
  ...liCommands.ts |   97.22 |       60 |     100 |   97.22 | 39-40             
  ...ActiveAuth.ts |      36 |    35.71 |      80 |      36 | ...64-169,186-195 
 src/auth          |   46.63 |    65.45 |   64.58 |   46.63 |                   
  ...andlerImpl.ts |   90.72 |    84.61 |   71.42 |   90.72 | ...48-149,155-159 
  ...henticator.ts |    92.3 |    95.23 |   66.66 |    92.3 | 80-88             
  ...ketManager.ts |     100 |      100 |     100 |     100 |                   
  ...h-provider.ts |   58.98 |    59.57 |   66.66 |   58.98 | ...84-518,526-549 
  ...h-provider.ts |   40.74 |    85.71 |   69.23 |   40.74 | ...72-485,489-531 
  ...h-provider.ts |   17.74 |       90 |   27.77 |   17.74 | ...31-562,568-587 
  ...l-oauth-ui.ts |   54.16 |      100 |      40 |   54.16 | 26-32,38-39,57-61 
  ...h-callback.ts |   82.94 |    75.67 |    90.9 |   82.94 | ...74-775,788-790 
  migration.ts     |       0 |        0 |       0 |       0 | 1-69              
  oauth-manager.ts |   41.52 |    53.84 |   70.83 |   41.52 | ...1542,1550-1751 
  ...h-provider.ts |   36.15 |    31.81 |      40 |   36.15 | ...52-490,498-534 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/commands      |   70.45 |      100 |      25 |   70.45 |                   
  extensions.tsx   |   55.55 |      100 |       0 |   55.55 | 21-31,35          
  mcp.ts           |   94.11 |      100 |      50 |   94.11 | 26                
 ...nds/extensions |   45.47 |    97.14 |   32.14 |   45.47 |                   
  disable.ts       |   17.54 |      100 |       0 |   17.54 | 17-30,36-63,65-69 
  enable.ts        |   16.12 |      100 |       0 |   16.12 | 17-36,42-68,70-74 
  install.ts       |   93.22 |    95.45 |   66.66 |   93.22 | 138,141-147       
  link.ts          |   26.31 |      100 |       0 |   26.31 | 20-37,44-49,51-54 
  list.ts          |   32.14 |      100 |       0 |   32.14 | 11-27,34-35       
  new.ts           |     100 |      100 |     100 |     100 |                   
  uninstall.ts     |   44.11 |      100 |   33.33 |   44.11 | 14-22,34-39,42-45 
  update.ts        |   10.94 |      100 |       0 |   10.94 | ...42-157,159-163 
 ...les/mcp-server |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-60              
 src/commands/mcp  |   97.15 |    86.44 |    90.9 |   97.15 |                   
  add.ts           |     100 |    96.15 |     100 |     100 | 210               
  list.ts          |   90.65 |    80.76 |      80 |   90.65 | ...11-113,138-139 
  remove.ts        |     100 |    71.42 |     100 |     100 | 19-23             
 src/config        |   84.74 |    79.57 |   79.06 |   84.74 |                   
  auth.ts          |   90.69 |    89.47 |     100 |   90.69 | 19-20,57-58       
  ...alSettings.ts |   86.66 |    88.88 |     100 |   86.66 | 40-41,44-47       
  config.ts        |   78.23 |    81.72 |      76 |   78.23 | ...1755,1758-1762 
  extension.ts     |   80.06 |    89.26 |   78.78 |   80.06 | ...87-788,791-792 
  keyBindings.ts   |     100 |      100 |     100 |     100 |                   
  paths.ts         |     100 |      100 |     100 |     100 |                   
  ...eBootstrap.ts |      86 |     82.5 |      90 |      86 | ...51-753,762-763 
  sandboxConfig.ts |   66.66 |    47.77 |   89.47 |   66.66 | ...87-494,512-513 
  ...oxProfiles.ts |    8.53 |      100 |       0 |    8.53 | 47-48,51-129      
  settings.ts      |   86.59 |    75.73 |      72 |   86.59 | ...73-774,828-829 
  ...ingsSchema.ts |     100 |      100 |     100 |     100 |                   
  ...tedFolders.ts |   97.94 |    95.45 |     100 |   97.94 | 86,180-181        
 ...fig/extensions |    63.6 |     87.5 |   83.78 |    63.6 |                   
  ...Enablement.ts |   95.37 |    95.52 |     100 |   95.37 | ...87-189,233-235 
  github.ts        |   44.11 |    86.79 |   54.54 |   44.11 | ...57-344,395-448 
  update.ts        |   62.33 |    46.15 |   66.66 |   62.33 | ...19-145,161-169 
  ...ableSchema.ts |     100 |      100 |     100 |     100 |                   
  variables.ts     |   95.34 |    89.47 |     100 |   95.34 | 30-31             
 src/constants     |     100 |      100 |     100 |     100 |                   
  historyLimits.ts |     100 |      100 |     100 |     100 |                   
 src/extensions    |   65.75 |    57.89 |      75 |   65.75 |                   
  ...utoUpdater.ts |   65.75 |    57.89 |      75 |   65.75 | ...49-450,459,461 
 src/generated     |     100 |      100 |     100 |     100 |                   
  git-commit.ts    |     100 |      100 |     100 |     100 |                   
 ...egration-tests |   90.72 |    84.61 |     100 |   90.72 |                   
  test-utils.ts    |   90.72 |    84.61 |     100 |   90.72 | ...01,219-220,230 
 src/patches       |       0 |        0 |       0 |       0 |                   
  is-in-ci.ts      |       0 |        0 |       0 |       0 | 1-17              
 src/providers     |   82.64 |    68.29 |   83.67 |   82.64 |                   
  IFileSystem.ts   |    86.2 |    85.71 |   85.71 |    86.2 | 51-52,67-68       
  ...Precedence.ts |   94.59 |    86.66 |     100 |   94.59 | 40-41             
  index.ts         |       0 |        0 |       0 |       0 | 1-19              
  ...gistration.ts |   77.94 |    68.75 |   33.33 |   77.94 | ...,93-97,103-104 
  ...derAliases.ts |   74.35 |    70.37 |     100 |   74.35 | ...27-133,138-139 
  ...onfigUtils.ts |   92.45 |       75 |     100 |   92.45 | 25-29             
  ...erInstance.ts |   83.64 |    64.75 |   88.46 |   83.64 | ...49-753,770-774 
  types.ts         |       0 |        0 |       0 |       0 | 1-8               
 ...viders/logging |   87.59 |    88.63 |   63.63 |   87.59 |                   
  ...rvice-impl.ts |   44.44 |        0 |       0 |   44.44 | 21-22,25-30,36-37 
  git-stats.ts     |   94.59 |    90.69 |     100 |   94.59 | ...48-149,180-181 
 src/runtime       |   66.99 |    72.04 |   70.24 |   66.99 |                   
  ...imeAdapter.ts |   97.03 |    89.65 |     100 |   97.03 | ...38,344-345,541 
  ...etFailover.ts |   98.93 |    93.54 |     100 |   98.93 | 205               
  messages.ts      |      20 |      100 |       0 |      20 | ...0,38-66,74-102 
  ...pplication.ts |   82.64 |    71.31 |      70 |   82.64 | ...59-662,673-674 
  ...extFactory.ts |   91.28 |    72.41 |     100 |   91.28 | ...63-266,351-358 
  ...meSettings.ts |   55.23 |    66.55 |   56.06 |   55.23 | ...2151,2176-2230 
 src/services      |   71.55 |    87.34 |   82.35 |   71.55 |                   
  ...mandLoader.ts |     100 |      100 |     100 |     100 |                   
  ...ardService.ts |    91.3 |    33.33 |     100 |    91.3 | 35-36             
  ...andService.ts |     100 |      100 |     100 |     100 |                   
  ...mandLoader.ts |   88.77 |    90.47 |     100 |   88.77 | ...79-184,258-265 
  ...omptLoader.ts |   30.68 |    81.25 |      50 |   30.68 | ...80-281,284-288 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...mpt-processors |   97.56 |    94.11 |     100 |   97.56 |                   
  ...tProcessor.ts |     100 |      100 |     100 |     100 |                   
  ...lProcessor.ts |   97.36 |    93.61 |     100 |   97.36 | 77-78,202-203     
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...o-continuation |   86.01 |     78.4 |   94.11 |   86.01 |                   
  ...ionService.ts |   86.01 |     78.4 |   94.11 |   86.01 | ...94,562,588-589 
 src/settings      |   60.13 |    76.19 |     100 |   60.13 |                   
  ...alSettings.ts |   59.58 |    77.55 |     100 |   59.58 | ...16-427,430-436 
  ...aramParser.ts |   71.42 |    57.14 |     100 |   71.42 | 21-22,24-25,30-31 
 src/test-utils    |   57.56 |    78.57 |   42.85 |   57.56 |                   
  ...eExtension.ts |     100 |      100 |     100 |     100 |                   
  ...omMatchers.ts |   21.21 |      100 |       0 |   21.21 | 22-50             
  ...andContext.ts |     100 |      100 |     100 |     100 |                   
  render.tsx       |       0 |        0 |       0 |       0 | 1-37              
  ...e-testing.tsx |       0 |        0 |       0 |       0 | 1-54              
  ...iderConfig.ts |       0 |        0 |       0 |       0 | 1-19              
 src/ui            |    18.1 |    98.38 |   34.78 |    18.1 |                   
  App.tsx          |   33.89 |      100 |       0 |   33.89 | 49-85,91-98       
  AppContainer.tsx |    4.97 |      100 |       0 |    4.97 | 136-145,148-1832  
  ...tionNudge.tsx |    6.75 |      100 |       0 |    6.75 | 26-101            
  colors.ts        |   40.67 |      100 |   28.57 |   40.67 | ...86-287,291-292 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...derOptions.ts |     100 |      100 |     100 |     100 |                   
  keyMatchers.ts   |   95.65 |    96.29 |     100 |   95.65 | 29-30             
  ...ntsEnabled.ts |     100 |      100 |     100 |     100 |                   
  ...submission.ts |     100 |      100 |     100 |     100 |                   
  ...tic-colors.ts |     100 |      100 |     100 |     100 |                   
  textConstants.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/commands   |   65.72 |    75.32 |   63.95 |   65.72 |                   
  aboutCommand.ts  |   74.81 |       24 |     100 |   74.81 | ...05,112-113,140 
  authCommand.ts   |   74.95 |     84.4 |   83.33 |   74.95 | ...39-642,652-676 
  ...urlCommand.ts |      30 |      100 |       0 |      30 | 20-40             
  bugCommand.ts    |   79.16 |     37.5 |     100 |   79.16 | 32-35,42,79-88    
  chatCommand.ts   |   63.38 |    77.27 |      50 |   63.38 | ...87-509,526-536 
  clearCommand.ts  |     100 |      100 |     100 |     100 |                   
  ...essCommand.ts |     100 |    88.88 |     100 |     100 | 71                
  copyCommand.ts   |   98.27 |    94.44 |     100 |   98.27 | 37                
  debugCommands.ts |   13.29 |      100 |       0 |   13.29 | ...48,455,462,469 
  ...icsCommand.ts |    62.5 |    57.14 |   33.33 |    62.5 | ...88,320,427-432 
  ...ryCommand.tsx |   16.86 |      100 |       0 |   16.86 | ...38-148,155-179 
  docsCommand.ts   |     100 |      100 |     100 |     100 |                   
  ...extCommand.ts |   93.18 |    77.77 |     100 |   93.18 | 108-113           
  editorCommand.ts |     100 |      100 |     100 |     100 |                   
  ...onsCommand.ts |   91.86 |    88.88 |     100 |   91.86 | 86-94,96          
  helpCommand.ts   |     100 |      100 |     100 |     100 |                   
  ideCommand.ts    |   66.35 |    68.96 |   55.55 |   66.35 | ...22-225,233-240 
  initCommand.ts   |   83.33 |    71.42 |   66.66 |   83.33 | 35-39,41-85       
  keyCommand.ts    |     100 |    77.77 |     100 |     100 | 47                
  ...ileCommand.ts |   11.11 |      100 |       0 |   11.11 | 23-134            
  ...ingCommand.ts |   10.96 |      100 |       0 |   10.96 | ...59-528,545-556 
  logoutCommand.ts |   15.62 |      100 |       0 |   15.62 | 21-85             
  mcpCommand.ts    |   82.35 |    82.22 |   83.33 |   82.35 | ...09-410,428-429 
  memoryCommand.ts |   88.82 |    83.87 |     100 |   88.82 | 69-83,96-101,152  
  modelCommand.ts  |   25.71 |      100 |       0 |   25.71 | 21-51             
  mouseCommand.ts  |     100 |      100 |     100 |     100 |                   
  ...onsCommand.ts |     100 |      100 |     100 |     100 |                   
  ...iesCommand.ts |   97.02 |    82.85 |     100 |   97.02 | 27,40-41          
  ...acyCommand.ts |   61.53 |      100 |       0 |   61.53 | 22-26             
  ...ileCommand.ts |   65.08 |    72.03 |      90 |   65.08 | ...08-913,932-945 
  ...derCommand.ts |   53.12 |    30.55 |      80 |   53.12 | ...58-262,270-275 
  quitCommand.ts   |   34.48 |      100 |       0 |   34.48 | 16-35             
  ...oreCommand.ts |   92.53 |     87.5 |     100 |   92.53 | ...,90-91,120-125 
  setCommand.ts    |   81.68 |    77.27 |      80 |   81.68 | ...77-782,824-837 
  ...ngsCommand.ts |     100 |      100 |     100 |     100 |                   
  ...hubCommand.ts |     100 |      100 |     100 |     100 |                   
  statsCommand.ts  |   94.33 |     90.9 |     100 |   94.33 | 26-34             
  statusCommand.ts |   13.63 |      100 |       0 |   13.63 | 20-87             
  ...entCommand.ts |   79.57 |    72.04 |   83.33 |   79.57 | ...67-880,883-896 
  ...tupCommand.ts |     100 |      100 |     100 |     100 |                   
  themeCommand.ts  |     100 |      100 |     100 |     100 |                   
  ...matCommand.ts |   26.66 |      100 |       0 |   26.66 | 33-92             
  toolsCommand.ts  |   84.98 |     74.6 |     100 |   84.98 | ...85-294,307-308 
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ileCommand.ts |   61.11 |      100 |       0 |   61.11 | 16-22             
  vimCommand.ts    |   44.44 |      100 |       0 |   44.44 | 14-24             
 ...ommands/schema |   96.22 |    91.02 |    92.3 |   96.22 |                   
  index.ts         |   96.45 |    91.61 |     100 |   96.45 | ...08-412,423-424 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 src/ui/components |   10.82 |    35.95 |     2.5 |   10.82 |                   
  AboutBox.tsx     |    4.06 |      100 |       0 |    4.06 | 27-160            
  AsciiArt.ts      |     100 |      100 |     100 |     100 |                   
  AuthDialog.tsx   |    6.47 |      100 |       0 |    6.47 | 27-187            
  ...nProgress.tsx |   16.66 |      100 |       0 |   16.66 | 18-62             
  ...Indicator.tsx |   15.15 |      100 |       0 |   15.15 | 17-47             
  ...firmation.tsx |    7.43 |      100 |       0 |    7.43 | 45-177            
  ...tsDisplay.tsx |    7.69 |      100 |       0 |    7.69 | 23-34,38-156      
  CliSpinner.tsx   |   38.46 |      100 |       0 |   38.46 | 16-24             
  Composer.tsx     |   10.86 |      100 |       0 |   10.86 | 24-68             
  ...entPrompt.tsx |   18.75 |      100 |       0 |   18.75 | 21-51             
  ...ryDisplay.tsx |   21.05 |      100 |       0 |   21.05 | 17-35             
  ...ryDisplay.tsx |    4.93 |      100 |       0 |    4.93 | 26-112            
  ...geDisplay.tsx |       0 |        0 |       0 |       0 | 1-37              
  ...gProfiler.tsx |   17.88 |      100 |       0 |   17.88 | ...71-116,120-199 
  ...esDisplay.tsx |   10.52 |      100 |       0 |   10.52 | 24-82             
  ...ogManager.tsx |    11.9 |      100 |       0 |    11.9 | 47-302            
  ...ngsDialog.tsx |    6.53 |      100 |       0 |    6.53 | 27-189            
  ...rBoundary.tsx |    9.48 |        0 |       0 |    9.48 | ...15-158,176-188 
  ...ustDialog.tsx |    15.9 |      100 |       0 |    15.9 | 31-121            
  Footer.tsx       |    8.94 |      100 |     100 |    8.94 | ...30-508,512-525 
  ...ngSpinner.tsx |   38.09 |      100 |       0 |   38.09 | 30-46             
  Header.tsx       |    17.5 |      100 |       0 |    17.5 | 22-62             
  Help.tsx         |    3.17 |      100 |       0 |    3.17 | 17-179            
  ...emDisplay.tsx |   18.32 |      100 |       0 |   18.32 | 50-180            
  InputPrompt.tsx  |   37.68 |    37.34 |   66.66 |   37.68 | ...5-883,897-1040 
  ...tsDisplay.tsx |    4.41 |      100 |       0 |    4.41 | 26-37,41-249      
  ...utManager.tsx |       0 |        0 |       0 |       0 | 1-97              
  ...ileDialog.tsx |    6.89 |      100 |       0 |    6.89 | 20-119            
  ...Indicator.tsx |   14.54 |      100 |       0 |   14.54 | 24-81             
  ...ingDialog.tsx |    4.52 |      100 |       0 |    4.52 | ...9,84-90,93-354 
  ...geDisplay.tsx |       0 |        0 |       0 |       0 | 1-40              
  ...tsDisplay.tsx |    6.36 |      100 |       0 |    6.36 | 29-45,49-207      
  ...fications.tsx |   12.98 |      100 |       0 |   12.98 | 27-104            
  ...odeDialog.tsx |    7.31 |      100 |       0 |    7.31 | 30-140            
  ...ustDialog.tsx |    5.88 |      100 |       0 |    5.88 | 29-228            
  PrepareLabel.tsx |   13.33 |      100 |       0 |   13.33 | 20-48             
  ...derDialog.tsx |    3.84 |      100 |       0 |    3.84 | 22-272            
  ...delDialog.tsx |    2.99 |      100 |       0 |    2.99 | 23-361            
  ...eKeyInput.tsx |       0 |        0 |       0 |       0 | 1-98              
  ...ryDisplay.tsx |      50 |      100 |       0 |      50 | 15-17             
  ...ngsDialog.tsx |    1.87 |      100 |       0 |    1.87 | ...9-108,111-1258 
  ...ionDialog.tsx |   14.28 |      100 |       0 |   14.28 | 35-121            
  ...Indicator.tsx |   44.44 |      100 |       0 |   44.44 | 12-17             
  ...MoreLines.tsx |      28 |      100 |       0 |      28 | 18-40             
  StatsDisplay.tsx |     6.5 |      100 |       0 |     6.5 | ...84-159,167-336 
  ...nsDisplay.tsx |    7.76 |      100 |       0 |    7.76 | 49-164            
  ThemeDialog.tsx  |       5 |      100 |       0 |       5 | 34-328            
  Tips.tsx         |      16 |      100 |       0 |      16 | 17-45             
  TodoPanel.tsx    |    4.48 |      100 |       0 |    4.48 | ...20-345,348-511 
  ...tsDisplay.tsx |    7.51 |      100 |       0 |    7.51 | 30-53,56-225      
  ToolsDialog.tsx  |    8.23 |      100 |       0 |    8.23 | 23-115            
  ...ification.tsx |   36.36 |      100 |       0 |   36.36 | 15-22             
  ...ionDialog.tsx |    8.13 |      100 |       0 |    8.13 | 18-114            
  todo-utils.ts    |     100 |      100 |     100 |     100 |                   
 ...nents/messages |   13.12 |    85.71 |    7.14 |   13.12 |                   
  ...onMessage.tsx |   13.72 |      100 |       0 |   13.72 | 24-80             
  DiffRenderer.tsx |    3.33 |      100 |       0 |    3.33 | ...79-360,363-381 
  ErrorMessage.tsx |   22.22 |      100 |       0 |   22.22 | 16-31             
  ...niMessage.tsx |   14.54 |      100 |       0 |   14.54 | 26-82             
  ...geContent.tsx |   19.04 |      100 |       0 |   19.04 | 25-43             
  InfoMessage.tsx  |   26.31 |      100 |       0 |   26.31 | 17-32             
  ...rlMessage.tsx |     100 |       50 |     100 |     100 | 26                
  ...ckDisplay.tsx |      20 |      100 |       0 |      20 | 43-64             
  ...onMessage.tsx |    3.87 |      100 |       0 |    3.87 | 43-507            
  ...upMessage.tsx |   10.36 |      100 |       0 |   10.36 | ...2,65-80,84-254 
  ToolMessage.tsx  |    8.36 |      100 |       0 |    8.36 | ...95-328,331-334 
  UserMessage.tsx  |     100 |      100 |     100 |     100 |                   
  ...llMessage.tsx |   36.36 |      100 |       0 |   36.36 | 17-25             
  ...ngMessage.tsx |   26.31 |      100 |       0 |   26.31 | 17-32             
 ...ponents/shared |   17.12 |     18.6 |   15.38 |   17.12 |                   
  ...ctionList.tsx |    5.55 |      100 |       0 |    5.55 | 53-184            
  MaxSizedBox.tsx  |    2.37 |      100 |       0 |    2.37 | 23-50,99-625      
  ...tonSelect.tsx |   13.63 |      100 |       0 |   13.63 | 57-100            
  ...lableList.tsx |    7.61 |      100 |       0 |    7.61 | 44-152            
  ...lizedList.tsx |    2.04 |      100 |       0 |    2.04 | 55-485            
  text-buffer.ts   |   33.26 |     18.6 |   22.22 |   33.26 | ...1903-1906,1911 
  ...er-actions.ts |    0.78 |      100 |       0 |    0.78 | 26-39,78-814      
 ...mponents/views |    12.9 |      100 |       0 |    12.9 |                   
  ChatList.tsx     |    12.9 |      100 |       0 |    12.9 | 17-46             
 src/ui/constants  |   89.28 |      100 |       0 |   89.28 |                   
  ...ollections.ts |   89.28 |      100 |       0 |   89.28 | 224-245           
 src/ui/containers |       0 |        0 |       0 |       0 |                   
  ...ontroller.tsx |       0 |        0 |       0 |       0 | 1-341             
  UIStateShell.tsx |       0 |        0 |       0 |       0 | 1-15              
 src/ui/contexts   |   58.44 |    74.72 |   49.27 |   58.44 |                   
  ...chContext.tsx |    64.7 |      100 |      50 |    64.7 | 24-29             
  FocusContext.tsx |       0 |        0 |       0 |       0 | 1-11              
  ...ssContext.tsx |   79.97 |    79.89 |   91.66 |   79.97 | ...1192,1224-1227 
  MouseContext.tsx |   78.88 |    66.66 |     100 |   78.88 | ...98-102,108-118 
  ...erContext.tsx |       0 |        0 |       0 |       0 | 1-120             
  ...owContext.tsx |   19.64 |      100 |       0 |   19.64 | 33,36,39-87       
  ...meContext.tsx |   46.51 |       25 |   28.57 |   46.51 | ...89,193-194,199 
  ...lProvider.tsx |   89.16 |    69.81 |     100 |   89.16 | ...79-380,387-388 
  ...onContext.tsx |    6.73 |      100 |       0 |    6.73 | ...88-282,287-294 
  ...teContext.tsx |       0 |        0 |       0 |       0 | 1-61              
  ...gsContext.tsx |      50 |      100 |       0 |      50 | 15-20             
  ...ngContext.tsx |   42.85 |      100 |       0 |   42.85 | 15-22             
  TodoContext.tsx  |   55.55 |      100 |       0 |   55.55 | 19-22,24-27       
  TodoProvider.tsx |    6.94 |      100 |       0 |    6.94 | 24-105            
  ...llContext.tsx |     100 |      100 |       0 |     100 |                   
  ...lProvider.tsx |    6.75 |      100 |       0 |    6.75 | 28-122            
  ...nsContext.tsx |      25 |      100 |       0 |      25 | 138-149,152-157   
  ...teContext.tsx |   27.77 |      100 |       0 |   27.77 | 182-191,194-199   
  ...deContext.tsx |   11.11 |      100 |       0 |   11.11 | 29-81,84-89       
 src/ui/editors    |   94.11 |    85.71 |   66.66 |   94.11 |                   
  ...ngsManager.ts |   94.11 |    85.71 |   66.66 |   94.11 | 55,69-70          
 src/ui/hooks      |   19.68 |    43.24 |   17.17 |   19.68 |                   
  ...dProcessor.ts |    2.53 |        0 |       0 |    2.53 | 31,60-515         
  index.ts         |       0 |        0 |       0 |       0 | 1-10              
  ...dProcessor.ts |    13.2 |      100 |      50 |    13.2 | 33-61,79-308      
  ...dProcessor.ts |    2.67 |      100 |       0 |    2.67 | 73-714            
  ...Completion.ts |   22.22 |      100 |      50 |   22.22 | ...34-157,162-242 
  ...uthCommand.ts |    6.45 |      100 |       0 |    6.45 | 15-135            
  ...tIndicator.ts |    12.5 |      100 |       0 |    12.5 | 19-66             
  ...chedScroll.ts |   16.66 |      100 |       0 |   16.66 | 14-32             
  ...ketedPaste.ts |      20 |      100 |       0 |      20 | 20-38             
  ...ompletion.tsx |   53.04 |    27.27 |     100 |   53.04 | ...06-245,258-274 
  useCompletion.ts |   45.56 |      100 |     100 |   45.56 | ...8,52-77,81-107 
  ...leMessages.ts |       5 |      100 |       0 |       5 | 29-65,68-118      
  ...orSettings.ts |   11.11 |      100 |       0 |   11.11 | 29-81             
  ...AutoUpdate.ts |    9.52 |      100 |       0 |    9.52 | 18-58             
  ...ionUpdates.ts |    4.36 |      100 |       0 |    4.36 | 36-48,51-244      
  ...erDetector.ts |   22.72 |      100 |       0 |   22.72 | 27-43             
  useFocus.ts      |    25.8 |      100 |       0 |    25.8 | 19-48             
  ...olderTrust.ts |   10.46 |      100 |       0 |   10.46 | 24-112            
  ...miniStream.ts |    50.4 |    46.03 |      40 |    50.4 | ...1349,1374-1476 
  ...BranchName.ts |   11.66 |      100 |       0 |   11.66 | 14-79             
  ...oryManager.ts |    5.22 |      100 |       0 |    5.22 | 53-212            
  ...stListener.ts |   12.12 |      100 |       0 |   12.12 | 17-50             
  ...putHistory.ts |    3.75 |      100 |       0 |    3.75 | 24-111            
  ...storyStore.ts |    4.61 |      100 |       0 |    4.61 | 24-112            
  useKeypress.ts   |   21.05 |      100 |       0 |   21.05 | 24-41             
  ...rdProtocol.ts |   36.36 |      100 |       0 |   36.36 | 24-31             
  ...fileDialog.ts |    5.71 |      100 |       0 |    5.71 | 27-135            
  ...gIndicator.ts |   12.24 |      100 |       0 |   12.24 | 14-64             
  useLogger.ts     |   93.75 |      100 |     100 |   93.75 | 26                
  ...oryMonitor.ts |      25 |      100 |       0 |      25 | 19-41             
  useMouse.ts      |   77.77 |    66.66 |     100 |   77.77 | 22-25             
  ...eSelection.ts |    3.13 |      100 |       0 |    3.13 | 36-103,106-315    
  ...oviderInfo.ts |       0 |        0 |       0 |       0 | 1-80              
  ...odifyTrust.ts |    9.09 |      100 |       0 |    9.09 | 46-137            
  ...raseCycler.ts |    9.43 |      100 |       0 |    9.43 | 24-80             
  ...cySettings.ts |    3.38 |      100 |       0 |    3.38 | 17-26,36-156      
  ...Completion.ts |   29.41 |       40 |     100 |   29.41 | ...14-227,236-242 
  ...iderDialog.ts |    7.89 |      100 |       0 |    7.89 | 27-110            
  ...odelDialog.ts |    9.37 |      100 |       0 |    9.37 | 25-86             
  ...lScheduler.ts |   21.22 |    29.41 |   66.66 |   21.22 | ...74-479,481-491 
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-7               
  useResponsive.ts |   28.57 |      100 |       0 |   28.57 | 23-33             
  ...ompletion.tsx |   69.56 |      100 |     100 |   69.56 | 45-47,51-66,78-81 
  ...ectionList.ts |    2.94 |      100 |       0 |    2.94 | ...01-229,243-448 
  useSession.ts    |       0 |        0 |       0 |       0 | 1-23              
  ...ngsCommand.ts |   18.75 |      100 |       0 |   18.75 | 10-25             
  ...ellHistory.ts |    6.48 |      100 |       0 |    6.48 | 22-70,73-138      
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-62              
  ...ompletion.tsx |   32.05 |    31.57 |      25 |   32.05 | ...89-797,822-860 
  ...leCallback.ts |       0 |        0 |       0 |       0 | 1-70              
  ...tateAndRef.ts |   59.09 |      100 |     100 |   59.09 | 23-31             
  ...oryRefresh.ts |   10.34 |      100 |       0 |   10.34 | 17-48             
  ...rminalSize.ts |   11.42 |      100 |       0 |   11.42 | 13-55             
  ...emeCommand.ts |    6.03 |      100 |       0 |    6.03 | 26-151            
  useTimer.ts      |    7.14 |      100 |       0 |    7.14 | 16-65             
  ...ntinuation.ts |       0 |        0 |       0 |       0 | 1-270             
  ...ePreserver.ts |   48.48 |      100 |      75 |   48.48 | 33-50             
  ...oolsDialog.ts |    4.67 |      100 |       0 |    4.67 | 24-145            
  ...eMigration.ts |   10.34 |      100 |       0 |   10.34 | 14-72             
  vim.ts           |    6.13 |      100 |       0 |    6.13 | ...76-111,129-784 
 src/ui/layouts    |    5.44 |      100 |       0 |    5.44 |                   
  ...AppLayout.tsx |    5.44 |      100 |       0 |    5.44 | 57-74,77-629      
 ...noninteractive |      75 |      100 |    6.66 |      75 |                   
  ...eractiveUi.ts |      75 |      100 |    6.66 |      75 | 17-19,23-24,27-28 
 src/ui/privacy    |   26.08 |      100 |       0 |   26.08 |                   
  ...acyNotice.tsx |   10.97 |      100 |       0 |   10.97 | 22-123            
  ...acyNotice.tsx |   14.28 |      100 |       0 |   14.28 | 16-59             
  ...acyNotice.tsx |   12.19 |      100 |       0 |   12.19 | 16-62             
  ...acyNotice.tsx |   42.46 |      100 |       0 |   42.46 | 78-91,99-186      
  ...acyNotice.tsx |   21.95 |      100 |       0 |   21.95 | 20-59,62-64       
 src/ui/reducers   |   77.87 |     90.9 |      50 |   77.87 |                   
  appReducer.ts    |     100 |      100 |     100 |     100 |                   
  ...ionReducer.ts |       0 |        0 |       0 |       0 | 1-52              
 src/ui/state      |   21.51 |      100 |       0 |   21.51 |                   
  extensions.ts    |   21.51 |      100 |       0 |   21.51 | 68-130            
 src/ui/themes     |   99.13 |    89.38 |      96 |   99.13 |                   
  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 |                   
  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 |                   
  green-screen.ts  |     100 |      100 |     100 |     100 |                   
  no-color.ts      |     100 |      100 |     100 |     100 |                   
  ...c-resolver.ts |     100 |      100 |     100 |     100 |                   
  ...tic-tokens.ts |     100 |      100 |     100 |     100 |                   
  ...-of-purple.ts |     100 |      100 |     100 |     100 |                   
  theme-compat.ts  |     100 |       50 |     100 |     100 | 79                
  theme-manager.ts |   89.74 |    82.53 |     100 |   89.74 | ...04-310,315-316 
  theme.ts         |   99.41 |      100 |   85.71 |   99.41 | 185-186           
  xcode.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/utils      |    43.1 |    86.08 |   61.86 |    43.1 |                   
  ...Colorizer.tsx |    5.88 |      100 |       0 |    5.88 | ...16-128,140-229 
  ...olePatcher.ts |      78 |    77.77 |     100 |      78 | 58-69             
  ...nRenderer.tsx |      10 |      100 |       0 |      10 | 26-155,164-173    
  ...wnDisplay.tsx |    6.02 |      100 |       0 |    6.02 | ...73-397,408-412 
  ...eRenderer.tsx |   10.63 |      100 |       0 |   10.63 | ...32-247,260-395 
  ...ketedPaste.ts |   55.55 |      100 |       0 |   55.55 | 11-12,15-16       
  clipboard.ts     |   97.29 |    84.61 |     100 |   97.29 | 40                
  ...boardUtils.ts |   32.25 |     37.5 |     100 |   32.25 | ...55-114,129-145 
  commandUtils.ts  |   92.79 |    88.63 |     100 |   92.79 | ...11,115,117-118 
  computeStats.ts  |     100 |      100 |     100 |     100 |                   
  displayUtils.ts  |     100 |      100 |     100 |     100 |                   
  formatters.ts    |   90.47 |       95 |     100 |   90.47 | 57-60             
  fuzzyFilter.ts   |     100 |    96.42 |     100 |     100 | 75                
  highlight.ts     |   65.43 |      100 |   66.66 |   65.43 | 77-110            
  input.ts         |     100 |    85.71 |     100 |     100 | 18                
  ...olDetector.ts |   12.34 |       50 |   16.66 |   12.34 | ...10-111,114-115 
  ...nUtilities.ts |   69.84 |    85.71 |     100 |   69.84 | 75-91,100-101     
  mouse.ts         |   85.16 |    73.68 |     100 |   85.16 | ...12-213,217-218 
  ...mConstants.ts |     100 |      100 |     100 |     100 |                   
  ...opDetector.ts |       0 |        0 |       0 |       0 | 1-209             
  responsive.ts    |    69.9 |    73.33 |      80 |    69.9 | ...95-103,106-121 
  ...putHandler.ts |   87.36 |    90.32 |     100 |   87.36 | 52-53,74-83       
  terminalLinks.ts |     100 |      100 |     100 |     100 |                   
  ...lSequences.ts |     100 |      100 |     100 |     100 |                   
  terminalSetup.ts |    4.03 |      100 |       0 |    4.03 | 40-340            
  textUtils.ts     |   74.77 |    94.59 |   72.72 |   74.77 | ...14-115,135-137 
  ...Formatters.ts |   17.39 |      100 |       0 |   17.39 | 14-21,29-36,50-52 
  ...icsTracker.ts |     100 |    66.66 |     100 |     100 | 32-34             
  ui-sizing.ts     |   21.05 |      100 |       0 |   21.05 | 11-23,26-31       
  updateCheck.ts   |     100 |    93.33 |     100 |     100 | 27,38             
 src/utils         |   52.96 |    89.69 |   85.43 |   52.96 |                   
  ...ionContext.ts |   79.59 |       75 |     100 |   79.59 | 37-40,62-63,78-81 
  bootstrap.ts     |   94.11 |    88.88 |     100 |   94.11 | 71-72             
  checks.ts        |   33.33 |      100 |       0 |   33.33 | 23-28             
  cleanup.ts       |   72.72 |      100 |      75 |   72.72 | 43-52             
  commands.ts      |    50.9 |    63.63 |     100 |    50.9 | 25-26,45,57-84    
  commentJson.ts   |   92.17 |     92.5 |     100 |   92.17 | 92-100            
  ...ScopeUtils.ts |   19.23 |      100 |       0 |   19.23 | 23-40,46-73       
  ...icSettings.ts |   88.61 |    88.88 |     100 |   88.61 | ...37,40-43,61-64 
  ...arResolver.ts |   96.42 |       96 |     100 |   96.42 | 111-112           
  errors.ts        |   94.59 |       88 |     100 |   94.59 | 49-50,88-89       
  events.ts        |     100 |      100 |     100 |     100 |                   
  gitUtils.ts      |    92.5 |    82.35 |     100 |    92.5 | 61-62,77-80       
  ...AutoUpdate.ts |   52.71 |    95.23 |      50 |   52.71 | 88-153            
  ...lationInfo.ts |     100 |      100 |     100 |     100 |                   
  math.ts          |   66.66 |      100 |       0 |   66.66 | 15                
  package.ts       |   88.88 |    83.33 |     100 |   88.88 | 33-34             
  readStdin.ts     |   79.24 |       90 |      80 |   79.24 | 31-38,50-52       
  relaunch.ts      |     100 |      100 |     100 |     100 |                   
  resolvePath.ts   |   66.66 |       25 |     100 |   66.66 | 12-13,16,18-19    
  sandbox.ts       |       0 |        0 |       0 |       0 | 1-1161            
  ...ionCleanup.ts |   94.58 |    87.69 |     100 |   94.58 | ...74-175,256-257 
  sessionUtils.ts  |    9.23 |      100 |       0 |    9.23 | 43-99,106-120     
  settingsUtils.ts |   84.14 |    90.52 |   93.33 |   84.14 | ...12-439,478-479 
  ...ttingSaver.ts |    1.92 |      100 |       0 |    1.92 | 7-28,36-81        
  spawnWrapper.ts  |     100 |      100 |     100 |     100 |                   
  ...upWarnings.ts |     100 |      100 |     100 |     100 |                   
  ...entEmitter.ts |     100 |      100 |     100 |     100 |                   
  ...upWarnings.ts |     100 |      100 |     100 |     100 |                   
  version.ts       |     100 |       50 |     100 |     100 | 11                
  windowTitle.ts   |     100 |      100 |     100 |     100 |                   
 src/utils/privacy |    46.3 |    68.57 |   52.63 |    46.3 |                   
  ...taRedactor.ts |   60.66 |    70.58 |   55.55 |   60.66 | ...77-479,485-506 
  ...acyManager.ts |       0 |        0 |       0 |       0 | 1-178             
 ...ed-integration |   22.35 |        0 |       0 |   22.35 |                   
  acp.ts           |   14.63 |        0 |       0 |   14.63 | ...31-332,335-342 
  ...temService.ts |   20.58 |      100 |       0 |   20.58 | ...34,37-46,48-49 
  schema.ts        |     100 |      100 |     100 |     100 |                   
  ...ntegration.ts |    4.43 |      100 |       0 |    4.43 | ...1442,1457-1507 
-------------------|---------|----------|---------|---------|-------------------
Core Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   69.83 |    78.71 |   72.55 |   69.83 |                   
 src               |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/__mocks__/fs  |       0 |        0 |       0 |       0 |                   
  promises.ts      |       0 |        0 |       0 |       0 | 1-48              
 src/adapters      |     100 |      100 |     100 |     100 |                   
  ...eamAdapter.ts |     100 |      100 |     100 |     100 |                   
 src/agents        |   77.47 |     68.1 |      90 |   77.47 |                   
  ...vestigator.ts |       0 |        0 |       0 |       0 | 1-152             
  executor.ts      |   88.23 |    67.03 |     100 |   88.23 | ...03-704,740-746 
  invocation.ts    |   96.34 |    76.47 |     100 |   96.34 | 61,65-66          
  registry.ts      |       0 |        0 |       0 |       0 | 1-83              
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |   78.94 |       80 |     100 |   78.94 | 32-35             
 src/auth          |   63.97 |    78.63 |   75.26 |   63.97 |                   
  ...evice-flow.ts |    7.21 |      100 |       0 |    7.21 | ...49-268,274-282 
  ...evice-flow.ts |   46.65 |    57.14 |   63.63 |   46.65 | ...95-484,494-580 
  oauth-errors.ts  |   94.15 |    83.33 |     100 |   94.15 | ...68,609,635-636 
  precedence.ts    |   73.64 |    76.33 |   94.28 |   73.64 | ...78-979,986-987 
  ...evice-flow.ts |    8.33 |        0 |       0 |    8.33 | ...69-206,214-220 
  token-store.ts   |   77.96 |    88.09 |    90.9 |   77.96 | ...51-272,297-298 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/code_assist   |   68.18 |     79.6 |      78 |   68.18 |                   
  codeAssist.ts    |   16.25 |       50 |   33.33 |   16.25 | ...1,80-87,95-108 
  converter.ts     |    94.9 |    93.02 |     100 |    94.9 | ...84,198,215-216 
  ...al-storage.ts |     100 |    79.41 |     100 |     100 | 47-49,80-83       
  oauth2.ts        |    63.4 |    75.29 |   78.57 |    63.4 | ...16-717,722-723 
  server.ts        |   51.89 |    72.72 |   53.84 |   51.89 | ...99-240,243-246 
  setup.ts         |   82.92 |    73.91 |     100 |   82.92 | ...27-129,153-159 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/config        |   75.26 |    80.35 |    60.4 |   75.26 |                   
  config.ts        |   72.79 |    79.46 |   47.58 |   72.79 | ...1817,1823-1827 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  endpoints.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  models.ts        |     100 |      100 |     100 |     100 |                   
  ...ileManager.ts |    94.8 |    85.07 |     100 |    94.8 | ...57-358,364,367 
  storage.ts       |   93.25 |    95.65 |   91.66 |   93.25 | 27-28,49-50,75-76 
  ...entManager.ts |   57.91 |    65.57 |     100 |   57.91 | ...57-458,476-500 
  types.ts         |       0 |        0 |       0 |       0 |                   
 ...nfirmation-bus |   70.23 |    88.46 |   72.72 |   70.23 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-2               
  message-bus.ts   |   69.42 |    91.66 |      80 |   69.42 | ...91-225,234-242 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/core          |   64.41 |    72.93 |   68.67 |   64.41 |                   
  baseLlmClient.ts |   97.26 |       90 |     100 |   97.26 | 55-56,244-245     
  ...ntegration.ts |   96.29 |       95 |     100 |   96.29 | ...18-119,199-200 
  client.ts        |   66.92 |       79 |   69.23 |   66.92 | ...1988,1992-2003 
  ...ion-config.ts |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |   91.08 |    80.76 |     100 |   91.08 | ...32,148,163-166 
  ...lScheduler.ts |   73.44 |    75.67 |   94.59 |   73.44 | ...1718,1722-1775 
  geminiChat.ts    |   45.03 |    53.72 |      50 |   45.03 | ...2680,2703-2704 
  geminiRequest.ts |     100 |      100 |     100 |     100 |                   
  ...nAIWrapper.ts |   88.88 |      100 |   83.33 |   88.88 | 56-59             
  logger.ts        |   81.26 |    81.81 |     100 |   81.26 | ...64-378,419-430 
  ...tGenerator.ts |   10.89 |      100 |       0 |   10.89 | ...93-194,197-200 
  ...olExecutor.ts |   63.28 |    62.74 |   65.21 |   63.28 | ...06-440,449-465 
  prompts.ts       |   65.07 |    62.96 |      60 |   65.07 | ...81,297,335-388 
  subagent.ts      |   55.76 |    65.87 |   58.49 |   55.76 | ...1820,1832-1833 
  ...chestrator.ts |    89.1 |    73.56 |   95.23 |    89.1 | ...17,620-621,626 
  ...tScheduler.ts |       0 |        0 |       0 |       0 | 1                 
  tokenLimits.ts   |   90.27 |    73.07 |     100 |   90.27 | ...72,77,79,83,93 
  ...Governance.ts |    94.2 |     90.9 |     100 |    94.2 | 34-35,51-52       
  turn.ts          |   88.42 |    73.21 |     100 |   88.42 | ...24-425,455-456 
 src/debug         |   78.24 |    87.85 |   90.19 |   78.24 |                   
  ...ionManager.ts |   78.12 |     77.5 |   88.88 |   78.12 | ...21-222,239-243 
  DebugLogger.ts   |   89.47 |    89.28 |      85 |   89.47 | ...77,214,270-273 
  FileOutput.ts    |   96.82 |    95.23 |     100 |   96.82 | 82-83,107-108     
  ...ionManager.ts |       0 |      100 |     100 |       0 | 18-64             
  ...FileOutput.ts |       0 |      100 |     100 |       0 | 15-37             
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 |                   
 src/filters       |   99.15 |    98.76 |     100 |   99.15 |                   
  EmojiFilter.ts   |   99.15 |    98.76 |     100 |   99.15 | 190-191           
 src/hooks         |   88.88 |    33.33 |     100 |   88.88 |                   
  ...ssion-hook.ts |   88.88 |    33.33 |     100 |   88.88 | 24,30             
 src/ide           |   72.88 |    84.61 |      74 |   72.88 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  detect-ide.ts    |     100 |      100 |     100 |     100 |                   
  ide-client.ts    |   54.56 |    75.51 |   56.66 |   54.56 | ...62-470,498-506 
  ide-installer.ts |   90.55 |    85.18 |     100 |   90.55 | ...35,142-146,159 
  ideContext.ts    |    83.8 |      100 |     100 |    83.8 | 75-91             
  process-utils.ts |   89.13 |    82.14 |     100 |   89.13 | ...69-170,211-212 
 src/interfaces    |       0 |        0 |       0 |       0 |                   
  index.ts         |       0 |        0 |       0 |       0 |                   
  ....interface.ts |       0 |        0 |       0 |       0 |                   
 src/mcp           |    78.5 |    77.04 |   71.95 |    78.5 |                   
  ...oken-store.ts |   87.38 |    90.47 |   81.25 |   87.38 | ...33-334,337-338 
  ...h-provider.ts |   83.01 |      100 |      25 |   83.01 | ...69,73,77,81-82 
  ...h-provider.ts |   73.14 |    53.68 |     100 |   73.14 | ...04-811,818-820 
  ...en-storage.ts |    81.5 |    88.88 |   68.18 |    81.5 | ...95-196,201-202 
  oauth-utils.ts   |   70.33 |    81.48 |    90.9 |   70.33 | ...62-283,308-331 
  ...n-provider.ts |   89.28 |    95.65 |      40 |   89.28 | ...37,141,145-146 
  token-store.ts   |     100 |      100 |     100 |     100 |                   
 .../token-storage |   90.08 |    86.86 |   95.34 |   90.08 |                   
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   86.61 |    87.09 |   92.85 |   86.61 | ...64-172,180-181 
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   87.43 |    80.82 |    92.3 |   87.43 | ...20,222,274-275 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/parsers       |   68.08 |       75 |   83.33 |   68.08 |                   
  ...CallParser.ts |   68.08 |       75 |   83.33 |   68.08 | ...1018,1024-1039 
 src/policy        |    88.1 |    81.29 |   86.95 |    88.1 |                   
  config.ts        |   91.01 |    84.21 |     100 |   91.01 | ...05,150,155-157 
  index.ts         |       0 |        0 |       0 |       0 | 1-5               
  policy-engine.ts |     100 |    97.67 |     100 |     100 | 23                
  ...-stringify.ts |   80.23 |    60.52 |      50 |   80.23 | ...22-126,139-140 
  toml-loader.ts   |   87.16 |    83.78 |     100 |   87.16 | ...03-204,215-223 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/prompt-config |   74.73 |    84.16 |    87.8 |   74.73 |                   
  ...lateEngine.ts |    93.9 |    88.52 |     100 |    93.9 | ...29,165,172,192 
  index.ts         |       0 |      100 |     100 |       0 | 5-41              
  prompt-cache.ts  |   99.04 |    97.26 |     100 |   99.04 | 204-205           
  ...-installer.ts |   83.11 |    82.47 |     100 |   83.11 | ...1173,1253-1254 
  prompt-loader.ts |   87.27 |    90.42 |   76.92 |   87.27 | ...22-423,429-430 
  ...t-resolver.ts |   34.85 |    64.17 |   53.84 |   34.85 | ...20-771,774-802 
  ...pt-service.ts |   84.49 |     83.5 |   93.75 |   84.49 | ...21,550,562-563 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...onfig/defaults |   50.11 |    46.75 |     100 |   50.11 |                   
  core-defaults.ts |    37.3 |    39.02 |     100 |    37.3 | ...72,283,289-297 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...est-loader.ts |   81.81 |    79.31 |     100 |   81.81 | ...02-108,116-120 
  ...t-warnings.ts |      92 |    33.33 |     100 |      92 | 17-18             
  ...r-defaults.ts |    41.7 |    39.02 |     100 |    41.7 | ...40,251,257-262 
  ...e-defaults.ts |     100 |      100 |     100 |     100 |                   
  tool-defaults.ts |      50 |       40 |     100 |      50 | ...11-216,229-234 
 src/prompts       |   26.41 |      100 |      25 |   26.41 |                   
  mcp-prompts.ts   |   18.18 |      100 |       0 |   18.18 | 11-19             
  ...t-registry.ts |   28.57 |      100 |   28.57 |   28.57 | ...42,48-55,68-73 
 src/providers     |   62.88 |    78.66 |   64.48 |   62.88 |                   
  BaseProvider.ts  |   80.64 |    79.46 |   80.76 |   80.64 | ...1143,1180-1181 
  ...eratorRole.ts |     100 |      100 |     100 |     100 |                   
  IModel.ts        |       0 |        0 |       0 |       0 |                   
  IProvider.ts     |       0 |        0 |       0 |       0 |                   
  ...derManager.ts |     100 |      100 |     100 |     100 |                   
  ITool.ts         |       0 |        0 |       0 |       0 |                   
  ...ngProvider.ts |   87.91 |    88.61 |   90.62 |   87.91 | ...1106,1137-1139 
  ...derWrapper.ts |   32.82 |    70.51 |   38.46 |   32.82 | ...1268,1275-1282 
  ...tGenerator.ts |    17.3 |      100 |       0 |    17.3 | ...59,62-79,82-85 
  ...derManager.ts |   60.16 |    72.96 |   60.46 |   60.16 | ...1437-1438,1441 
  errors.ts        |   78.57 |    63.63 |      60 |   78.57 | ...43,150-170,191 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...ders/anthropic |   74.45 |    77.86 |   74.54 |   74.45 |                   
  ...icProvider.ts |   76.56 |    81.25 |      75 |   76.56 | ...2349,2357-2358 
  ...aConverter.ts |   51.61 |    40.62 |   71.42 |   51.61 | ...52,258,272-280 
 ...oviders/gemini |   56.39 |    67.94 |   48.78 |   56.39 |                   
  ...niProvider.ts |   51.86 |    56.97 |   46.15 |   51.86 | ...1866,1875-1876 
  ...Signatures.ts |     100 |    98.38 |     100 |     100 | 182               
 ...viders/logging |   39.53 |    78.94 |      75 |   39.53 |                   
  ...tExtractor.ts |       0 |        0 |       0 |       0 | 1-228             
  ...nceTracker.ts |   89.47 |    83.33 |   81.81 |   89.47 | ...66-167,182-183 
 ...oviders/openai |   52.14 |    72.85 |   60.73 |   52.14 |                   
  ...ationCache.ts |   70.49 |    86.66 |   82.35 |   70.49 | ...64-166,216-217 
  ...rateParams.ts |       0 |        0 |       0 |       0 |                   
  ...AIProvider.ts |   39.86 |    62.33 |   46.15 |   39.86 | ...4922,4930-4939 
  ...API_MODELS.ts |     100 |      100 |     100 |     100 |                   
  ...lCollector.ts |   93.13 |    88.46 |     100 |   93.13 | ...46-148,168-169 
  ...Normalizer.ts |   92.64 |    95.83 |     100 |   92.64 | 71-75             
  ...llPipeline.ts |   64.22 |    53.33 |      75 |   64.22 | ...33-142,173-183 
  ...eValidator.ts |   94.02 |    93.75 |     100 |   94.02 | 106-109           
  ...sesRequest.ts |   83.09 |    93.15 |     100 |   83.09 | ...49,282,287-292 
  ...moteTokens.ts |   89.55 |     92.3 |     100 |   89.55 | 101-107           
  ...oviderInfo.ts |    86.2 |    73.52 |     100 |    86.2 | ...31-133,144-145 
  ...uestParams.ts |   93.81 |     82.6 |     100 |   93.81 | ...,95-96,105-106 
  ...nsesStream.ts |   88.43 |    86.66 |     100 |   88.43 | ...80,203-210,234 
  ...aConverter.ts |    24.2 |    42.85 |   28.57 |    24.2 | ...59-260,277-285 
  ...lResponses.ts |   71.98 |    73.91 |      75 |   71.98 | ...97-301,321-335 
  test-types.ts    |       0 |        0 |       0 |       0 |                   
  toolNameUtils.ts |   96.79 |    95.45 |      50 |   96.79 | 102,127,239-241   
 ...enai-responses |   62.63 |    72.72 |   43.33 |   62.63 |                   
  CODEX_MODELS.ts  |     100 |      100 |     100 |     100 |                   
  CODEX_PROMPT.ts  |      80 |       50 |     100 |      80 | 33-34             
  ...esProvider.ts |   74.07 |    77.35 |      50 |   74.07 | ...48,764,768-769 
  ...romContent.ts |   84.93 |    66.66 |     100 |   84.93 | 45-49,71-75,94    
  index.ts         |       0 |        0 |       0 |       0 | 1                 
  ...aConverter.ts |    8.12 |       20 |   14.28 |    8.12 | ...53-277,280-289 
 .../openai-vercel |   66.81 |    67.42 |   66.66 |   66.81 |                   
  ...elProvider.ts |   63.81 |     64.9 |   54.34 |   63.81 | ...1934,1944-1999 
  errors.ts        |   93.23 |    82.05 |     100 |   93.23 | ...50-151,165-169 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...Conversion.ts |   71.63 |    73.17 |   83.33 |   71.63 | ...45,548-549,553 
  ...aConverter.ts |   50.95 |       40 |   71.42 |   50.95 | ...58-259,276-284 
  toolIdUtils.ts   |   86.15 |    84.37 |     100 |   86.15 | ...,94-95,116-117 
 ...ders/reasoning |    42.1 |       90 |      70 |    42.1 |                   
  ...oningUtils.ts |    42.1 |       90 |      70 |    42.1 | ...45-203,235-310 
 ...ers/test-utils |     100 |      100 |     100 |     100 |                   
  ...TestConfig.ts |     100 |      100 |     100 |     100 |                   
 ...ers/tokenizers |    66.1 |    55.55 |      75 |    66.1 |                   
  ...cTokenizer.ts |   57.89 |       25 |     100 |   57.89 | 28-29,34-39       
  ITokenizer.ts    |       0 |        0 |       0 |       0 |                   
  ...ITokenizer.ts |      70 |       80 |   66.66 |      70 | 52-55,62-71       
 ...roviders/types |       0 |        0 |       0 |       0 |                   
  ...iderConfig.ts |       0 |        0 |       0 |       0 |                   
  ...derRuntime.ts |       0 |        0 |       0 |       0 |                   
 ...roviders/utils |   83.53 |    86.01 |   95.83 |   83.53 |                   
  authToken.ts     |   33.33 |       50 |      50 |   33.33 | 14-22,30-35       
  ...sExtractor.ts |   95.45 |     91.3 |     100 |   95.45 | 15-16             
  dumpContext.ts   |    96.1 |    95.65 |     100 |    96.1 | 110-112           
  ...SDKContext.ts |   94.59 |       75 |     100 |   94.59 | 27,49             
  localEndpoint.ts |   89.28 |    91.42 |     100 |   89.28 | ...18-119,138-139 
  ...malization.ts |   79.41 |    92.85 |     100 |   79.41 | 59-66             
  ...nsePayload.ts |    83.8 |    78.12 |     100 |    83.8 | 31-39,69-71,85-89 
  userMemory.ts    |   51.51 |       60 |     100 |   51.51 | 16-18,31-43       
 src/runtime       |   84.52 |    85.99 |   74.28 |   84.52 |                   
  ...imeContext.ts |     100 |      100 |     100 |     100 |                   
  ...timeLoader.ts |      85 |    71.42 |      80 |      85 | ...87-190,228-231 
  ...ntimeState.ts |   95.22 |    92.07 |     100 |   95.22 | ...35-636,652-653 
  ...ionContext.ts |   80.35 |    92.85 |      75 |   80.35 | 64-66,110-117     
  ...imeContext.ts |   89.69 |      100 |   58.33 |   89.69 | ...96,103,111-113 
  index.ts         |       0 |        0 |       0 |       0 | 1-15              
  ...imeContext.ts |    64.7 |    83.33 |     100 |    64.7 | 67-78,83-94       
  ...meAdapters.ts |   54.95 |    68.75 |   43.75 |   54.95 | ...98-108,125-152 
  ...ateFactory.ts |    96.9 |    86.48 |     100 |    96.9 | 95,110,136        
 src/services      |   81.62 |    84.03 |   76.19 |   81.62 |                   
  ...ardService.ts |   93.33 |    92.85 |     100 |   93.33 | 63,67-68          
  ...y-analyzer.ts |   76.32 |    81.17 |   77.77 |   76.32 | ...79-507,513-514 
  ...eryService.ts |   96.29 |    84.21 |     100 |   96.29 | 41,50,100-101     
  ...temService.ts |    61.9 |      100 |   66.66 |    61.9 | 54-61             
  ...ts-service.ts |      50 |      100 |       0 |      50 | 41-42,48-49       
  gitService.ts    |   70.58 |    93.33 |      60 |   70.58 | ...16-126,129-133 
  index.ts         |       0 |        0 |       0 |       0 | 1-15              
  ...ionService.ts |   99.04 |    98.41 |     100 |   99.04 | 270-271           
  ...ionService.ts |   90.12 |    83.33 |   92.85 |   90.12 | ...63,568,577-593 
  ...xt-tracker.ts |   94.87 |       90 |    87.5 |   94.87 | 54-55             
  ...er-service.ts |      42 |     90.9 |      25 |      42 | ...37-140,143-161 
  ...er-service.ts |   69.45 |    55.88 |      80 |   69.45 | ...85-289,311-314 
 ...rvices/history |   78.94 |    82.63 |   77.77 |   78.94 |                   
  ...Converters.ts |   79.88 |    80.31 |      75 |   79.88 | ...58-364,430-453 
  HistoryEvents.ts |       0 |        0 |       0 |       0 |                   
  ...oryService.ts |   79.07 |    83.14 |   86.53 |   79.07 | ...1329,1365-1366 
  IContent.ts      |   73.56 |    92.85 |   36.36 |   73.56 | ...32,299,309-329 
 src/settings      |   92.48 |    77.02 |      92 |   92.48 |                   
  ...ngsService.ts |   91.69 |       75 |   95.23 |   91.69 | ...53-354,384-388 
  ...ceInstance.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 src/storage       |   20.98 |      100 |       0 |   20.98 |                   
  ...FileWriter.ts |   18.98 |      100 |       0 |   18.98 | ...68,71-81,88-94 
  sessionTypes.ts  |     100 |      100 |     100 |     100 |                   
 src/telemetry     |    59.6 |    82.87 |   52.89 |    59.6 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...-exporters.ts |   28.08 |        0 |       0 |   28.08 | ...14-115,118-119 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-17              
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-132             
  loggers.ts       |   63.18 |    70.73 |   55.55 |   63.18 | ...70-583,591-607 
  metrics.ts       |   62.35 |    96.15 |   66.66 |   62.35 | ...41-163,166-189 
  sdk.ts           |   72.54 |    23.07 |     100 |   72.54 | ...35,140-141,143 
  ...l-decision.ts |   33.33 |      100 |       0 |   33.33 | 17-32             
  types.ts         |   56.47 |    94.11 |   50.87 |   56.47 | ...34-636,639-643 
  uiTelemetry.ts   |   95.26 |    96.42 |   91.66 |   95.26 | 152,189-195       
 src/test-utils    |   86.57 |     82.5 |    59.3 |   86.57 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-9               
  mock-tool.ts     |   95.06 |    93.33 |   83.33 |   95.06 | 62-63,118-119     
  ...aceContext.ts |     100 |      100 |     100 |     100 |                   
  ...allOptions.ts |   93.45 |     90.9 |   63.63 |   93.45 | ...07,171,200-203 
  runtime.ts       |      80 |       70 |   41.46 |      80 | ...97-299,308-310 
  tools.ts         |      82 |    76.92 |   78.94 |      82 | ...31,153,157-158 
 src/todo          |   56.28 |    81.48 |      75 |   56.28 |                   
  todoFormatter.ts |   56.28 |    81.48 |      75 |   56.28 | ...11-212,236-237 
 src/tools         |   74.32 |    77.99 |   78.11 |   74.32 |                   
  ...lFormatter.ts |     100 |      100 |     100 |     100 |                   
  ToolFormatter.ts |   20.89 |    76.19 |   33.33 |   20.89 | ...07,514-612,627 
  ...IdStrategy.ts |      95 |    92.85 |     100 |      95 | 237-239,250-252   
  codesearch.ts    |      98 |     87.5 |   85.71 |      98 | 110-111,173       
  ...line_range.ts |   33.55 |      100 |      25 |   33.55 | ...87-221,224-227 
  diffOptions.ts   |     100 |      100 |     100 |     100 |                   
  ...-web-fetch.ts |   93.14 |    72.41 |   77.77 |   93.14 | ...55,165-166,186 
  ...scapeUtils.ts |   61.65 |    72.97 |      50 |   61.65 | ...93,309,311-321 
  edit.ts          |   74.66 |    78.03 |   76.47 |   74.66 | ...68-769,782-823 
  ...web-search.ts |   97.91 |    85.71 |   83.33 |   97.91 | 126-127,191       
  ...y-replacer.ts |   85.71 |    84.35 |     100 |   85.71 | ...47-448,493-494 
  glob.ts          |   90.51 |    80.35 |   88.88 |   90.51 | ...51-252,351-352 
  ...-web-fetch.ts |   94.21 |    87.75 |    92.3 |   94.21 | ...66-367,468-469 
  ...invocation.ts |   54.74 |    38.88 |      75 |   54.74 | ...29-133,165-210 
  ...web-search.ts |     100 |      100 |     100 |     100 |                   
  grep.ts          |   56.95 |    75.22 |   76.47 |   56.95 | ...61-865,875-876 
  ...rt_at_line.ts |    30.3 |      100 |      25 |    30.3 | ...06-236,239-242 
  ...-subagents.ts |   87.28 |    69.56 |   88.88 |   87.28 | ...1,81-89,98,153 
  ls.ts            |   97.42 |    91.66 |     100 |   97.42 | 146-151           
  ...nt-manager.ts |   79.04 |    66.66 |      80 |   79.04 | ...31-138,146-147 
  mcp-client.ts    |   54.67 |     60.8 |   58.06 |   54.67 | ...1342,1346-1349 
  mcp-tool.ts      |   94.21 |    93.75 |   86.95 |   94.21 | ...39-249,311-312 
  memoryTool.ts    |   79.63 |    82.75 |    87.5 |   79.63 | ...55-356,399-439 
  ...iable-tool.ts |   98.34 |       80 |     100 |   98.34 | 168-169           
  read-file.ts     |   91.27 |    79.16 |    90.9 |   91.27 | ...26-227,393-394 
  ...many-files.ts |   71.42 |     77.5 |   88.88 |   71.42 | ...55-556,563-564 
  ...line_range.ts |    74.9 |     65.9 |      80 |    74.9 | ...50-351,355-356 
  ripGrep.ts       |   89.75 |    86.02 |    92.3 |   89.75 | ...47-448,469-470 
  shell.ts         |   79.12 |    77.86 |   82.35 |   79.12 | ...96-697,708-709 
  task.ts          |   79.34 |     63.7 |    91.3 |   79.34 | ...10,613,616-625 
  todo-events.ts   |    62.5 |      100 |       0 |    62.5 | 23-24,27-28,31-32 
  todo-pause.ts    |   87.09 |       80 |     100 |   87.09 | 64-69,73-78,93-98 
  todo-read.ts     |   85.29 |    95.45 |     100 |   85.29 | 112-113,123-138   
  todo-schemas.ts  |     100 |      100 |     100 |     100 |                   
  todo-store.ts    |   86.66 |       80 |     100 |   86.66 | 48-49,55-56,63-64 
  todo-write.ts    |   87.28 |    75.75 |    87.5 |   87.28 | ...17,264-265,290 
  ...tion-types.ts |     100 |      100 |     100 |     100 |                   
  tool-context.ts  |     100 |      100 |     100 |     100 |                   
  tool-error.ts    |    87.5 |      100 |       0 |    87.5 | 102-109           
  tool-names.ts    |     100 |      100 |     100 |     100 |                   
  tool-registry.ts |   72.28 |       71 |   73.68 |   72.28 | ...68-676,684-685 
  toolNameUtils.ts |      80 |     92.1 |     100 |      80 | 59-60,64-65,69-82 
  tools.ts         |   79.03 |    89.28 |   66.66 |   79.03 | ...32-733,736-740 
  write-file.ts    |   75.57 |    64.36 |   73.33 |   75.57 | ...04-605,614-653 
 src/types         |     100 |      100 |     100 |     100 |                   
  modelParams.ts   |     100 |      100 |     100 |     100 |                   
 src/utils         |   82.76 |    87.58 |    85.9 |   82.76 |                   
  LruCache.ts      |       0 |        0 |       0 |       0 | 1-41              
  bfsFileSearch.ts |   88.88 |       90 |     100 |   88.88 | 83-91             
  browser.ts       |    8.69 |      100 |       0 |    8.69 | 17-53             
  editor.ts        |   97.64 |    94.23 |     100 |   97.64 | 159,228,231-232   
  ...entContext.ts |     100 |      100 |     100 |     100 |                   
  errorParsing.ts  |      88 |    78.26 |     100 |      88 | ...07,249,252,258 
  ...rReporting.ts |   83.72 |    84.61 |     100 |   83.72 | 82-86,107-115     
  errors.ts        |   55.55 |    71.42 |   38.46 |   55.55 | ...92-108,112-118 
  fetch.ts         |   30.43 |    66.66 |   33.33 |   30.43 | 22-27,35-36,39-83 
  fileUtils.ts     |    95.2 |    90.07 |     100 |    95.2 | ...34-238,450-456 
  formatters.ts    |   54.54 |       50 |     100 |   54.54 | 12-16             
  ...eUtilities.ts |   96.11 |       96 |     100 |   96.11 | 36-37,67-68       
  ...rStructure.ts |   95.96 |    94.93 |     100 |   95.96 | ...14-117,345-347 
  getPty.ts        |    12.5 |      100 |       0 |    12.5 | 21-34             
  ...noreParser.ts |    91.6 |    85.18 |     100 |    91.6 | ...01-202,206-207 
  ...ineChanges.ts |   58.56 |    79.41 |      80 |   58.56 | ...18-256,264-270 
  gitUtils.ts      |   90.24 |    90.47 |     100 |   90.24 | 40-41,71-72       
  ide-trust.ts     |      60 |      100 |       0 |      60 | 14-15             
  ...rePatterns.ts |     100 |    96.55 |     100 |     100 | 248               
  ...ionManager.ts |     100 |       90 |     100 |     100 | 23                
  ...edit-fixer.ts |       0 |        0 |       0 |       0 | 1-156             
  ...yDiscovery.ts |    85.8 |    75.43 |   77.77 |    85.8 | ...88-389,392-393 
  ...tProcessor.ts |    93.4 |    86.51 |    92.3 |    93.4 | ...87-388,397-398 
  ...Inspectors.ts |   61.53 |      100 |      50 |   61.53 | 18-23             
  output-format.ts |   36.84 |      100 |       0 |   36.84 | 26-37             
  partUtils.ts     |     100 |      100 |     100 |     100 |                   
  pathReader.ts    |       0 |        0 |       0 |       0 | 1-60              
  paths.ts         |   85.32 |    84.37 |     100 |   85.32 | ...,98-99,110-111 
  ...rDetection.ts |   57.62 |    63.15 |     100 |   57.62 | ...9,92-93,99-100 
  retry.ts         |   67.28 |    76.04 |   81.81 |   67.28 | ...19-522,527-528 
  ...thResolver.ts |   84.31 |       84 |     100 |   84.31 | 62-73,96,145-148  
  ...nStringify.ts |     100 |      100 |     100 |     100 |                   
  sanitization.ts  |     100 |      100 |     100 |     100 |                   
  ...aValidator.ts |   83.52 |    82.75 |     100 |   83.52 | 70-81,125-126     
  ...r-launcher.ts |   78.57 |     87.5 |   66.66 |   78.57 | ...33,135,153-188 
  session.ts       |     100 |      100 |     100 |     100 |                   
  shell-markers.ts |     100 |      100 |     100 |     100 |                   
  shell-utils.ts   |   95.25 |    95.38 |     100 |   95.25 | ...94-195,326-331 
  summarizer.ts    |     100 |    88.88 |     100 |     100 | 92                
  ...emEncoding.ts |   97.14 |    91.42 |     100 |   97.14 | 108-109,161       
  testUtils.ts     |   53.33 |      100 |   33.33 |   53.33 | ...53,59-64,70-72 
  textUtils.ts     |    12.5 |      100 |       0 |    12.5 | 15-34             
  thoughtUtils.ts  |     100 |      100 |     100 |     100 |                   
  tool-utils.ts    |   91.48 |    89.47 |     100 |   91.48 | 52-53,56-57       
  ...putLimiter.ts |   85.22 |    76.31 |     100 |   85.22 | ...61-166,210-217 
  unicodeUtils.ts  |     100 |      100 |     100 |     100 |                   
  ...untManager.ts |   91.96 |    88.23 |     100 |   91.96 | 37-39,76-78,94-96 
  ...aceContext.ts |   96.82 |    95.34 |    92.3 |   96.82 | 94-95,109-110     
 ...ils/filesearch |   96.18 |    91.26 |     100 |   96.18 |                   
  crawlCache.ts    |     100 |      100 |     100 |     100 |                   
  crawler.ts       |   96.22 |     92.3 |     100 |   96.22 | 66-67             
  fileSearch.ts    |   93.22 |    86.95 |     100 |   93.22 | ...26-227,229-230 
  ignore.ts        |     100 |      100 |     100 |     100 |                   
  result-cache.ts  |     100 |    91.66 |     100 |     100 | 46                
-------------------|---------|----------|---------|---------|-------------------

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

- Fix ReDoS vulnerability in hasBraceExpansion by using indexOf instead of regex (CodeQL)
- Add abort signal handling to git grep and system grep child processes (#962)
- Add debug logging when fallback AbortSignal is used (CodeRabbit)
- Remove issue JSON files from project-plans (not needed in repo)
@acoliver
Copy link
Collaborator Author

@coderabbitai I've addressed your feedback:

  1. ReDoS vulnerability in hasBraceExpansion (CodeQL) - Fixed by replacing regex with indexOf-based O(n) implementation
  2. Debug logging for fallback AbortSignal - Added the suggested debug logging when original signal not found
  3. Issue JSON files - Removed the issues directory entirely as these were just downloaded copies
  4. plan.md markdown lint - Ignoring as plan documents don't require strict linting

Additionally, I've added abort signal handling to git grep and system grep child processes (related to #962) so ESC actually cancels running searches now.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Dec 30, 2025

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Check the hasBraceExpansion implementation to verify ReDoS fix
echo "=== hasBraceExpansion implementation ==="
ast-grep --pattern $'function hasBraceExpansion($$$) {
  $$$
}'

echo -e "\n=== Debug logging in coreToolScheduler ==="
# Look for the debug logging added for fallback AbortSignal
rg -n -A 2 -B 2 "callIdToSignal" packages/core/src/core/coreToolScheduler.ts | head -40

echo -e "\n=== Abort signal handling in grep.ts ==="
# Check for abort signal handling in git grep and system grep
rg -n -A 5 "gitGrepProcess\." packages/core/src/tools/grep.ts
rg -n -A 5 "grepProcess\." packages/core/src/tools/grep.ts

echo -e "\n=== Check if issues directory exists ==="
# Verify issues directory was removed
if [ -d "project-plans/20251230fixes/issues" ]; then
  echo "Directory still exists"
  ls -la project-plans/20251230fixes/issues/
else
  echo "Directory has been removed"
fi

Length of output: 1211


🏁 Script executed:

#!/bin/bash
# Search for hasBraceExpansion function differently
echo "=== hasBraceExpansion function search ==="
rg -n -A 10 "function hasBraceExpansion" packages/core/src/tools/grep.ts

echo -e "\n=== Alternative: search for hasBraceExpansion ==="
rg -n -B 2 -A 15 "hasBraceExpansion" packages/core/src/tools/grep.ts | head -50

echo -e "\n=== Check abort handling in grep.ts - search for signal ==="
rg -n "signal\." packages/core/src/tools/grep.ts

echo -e "\n=== Check spawn calls in grep.ts ==="
rg -n -A 10 "spawn\(" packages/core/src/tools/grep.ts | head -80

Length of output: 3508


@acoliver Perfect! I've verified all your changes:

  1. ReDoS vulnerability fixed - The hasBraceExpansion function now uses a clean indexOf-based implementation (O(n) complexity) with no regex pattern, completely eliminating the ReDoS risk.

  2. Debug logging added - I can see the debug log statement in coreToolScheduler.ts at lines 499-500 that logs when the original signal isn't found in the callIdToSignal map.

  3. Issue JSON files removed - Confirmed the project-plans/20251230fixes/issues directory has been deleted.

  4. plan.md linting - Acknowledged your decision to skip linting for plan documents.

  5. Bonus fix for FindFiles/glob and search_file_content don't respect abort signals or have timeouts #962 - Excellent addition! I can see you've added proper abort signal handling to both the git grep (lines 547-562) and system grep (lines 628-673) child processes. The abort handlers properly kill the child processes with SIGTERM when the signal is aborted, ensuring ESC actually cancels running searches.

All feedback has been thoroughly addressed, and the additional abort signal handling is a great proactive improvement! 🎉

┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Great work on the fixes! 🎊 ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛


🧠 Learnings used
Learnt from: acoliver
Repo: vybestack/llxprt-code PR: 0
File: :0-0
Timestamp: 2025-12-26T14:17:41.974Z
Learning: In packages/core/src/core/coreToolScheduler.ts, the `publishBufferedResults()` method (line 1355) is called concurrently by multiple tool completion handlers (line 1510 in each tool's `.then()` callback) when parallel tools finish simultaneously. This causes a race condition where `nextPublishIndex` can be corrupted and tools can hang in 'executing' state forever, blocking the scheduler and causing subsequent tool calls to queue indefinitely. The method must be made reentrant-safe using a mutex/lock pattern to serialize concurrent calls.

If you found this review helpful, would you consider giving us a shout-out on X?

Thank you for using CodeRabbit!

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/core/src/tools/grep.ts (1)

314-314: Replace console logging with DebugLogger.

Multiple console.error and console.debug calls violate the coding guidelines. These should use the sophisticated logging system with DebugLogger instead, ensuring logs are written to ~/.llxprt/debug/ and respect logging configuration.

🔎 Suggested approach
  1. Add a DebugLogger instance at the module level:
import { DebugLogger } from '../debug/index.js';

const grepLogger = new DebugLogger('llxprt:tools:grep');
  1. Replace console calls with logger calls:
// Line 314: Replace
console.error(`Error during GrepLogic execution: ${error}`);
// With
grepLogger.error(() => `Error during GrepLogic execution: ${error}`);

// Line 577, 691, 700, 763: Replace console.debug with
grepLogger.debug(() => `message here`);

// Line 778: Replace console.error with
grepLogger.error(() => `message here`);

As per coding guidelines, the logging system writes to ~/.llxprt/debug/ and provides proper log management.

Also applies to: 577-577, 691-691, 700-700, 763-763, 778-778

📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3651af2 and 4ec9278.

📒 Files selected for processing (2)
  • packages/core/src/core/coreToolScheduler.ts
  • packages/core/src/tools/grep.ts
🧰 Additional context used
📓 Path-based instructions (1)
**/*.{ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.{ts,tsx}: Don't use any - Always specify proper types. Use unknown if the type is truly unknown and add proper type guards.
Do not use console.log or console.debug - Use the sophisticated logging system instead. Log files are written to ~/.llxprt/debug/
Fix all linting errors, including warnings about any types

Files:

  • packages/core/src/core/coreToolScheduler.ts
  • packages/core/src/tools/grep.ts
🧠 Learnings (3)
📓 Common learnings
Learnt from: acoliver
Repo: vybestack/llxprt-code PR: 0
File: :0-0
Timestamp: 2025-12-26T14:17:41.974Z
Learning: In packages/core/src/core/coreToolScheduler.ts, the `publishBufferedResults()` method (line 1355) is called concurrently by multiple tool completion handlers (line 1510 in each tool's `.then()` callback) when parallel tools finish simultaneously. This causes a race condition where `nextPublishIndex` can be corrupted and tools can hang in 'executing' state forever, blocking the scheduler and causing subsequent tool calls to queue indefinitely. The method must be made reentrant-safe using a mutex/lock pattern to serialize concurrent calls.
📚 Learning: 2025-12-26T14:17:41.974Z
Learnt from: acoliver
Repo: vybestack/llxprt-code PR: 0
File: :0-0
Timestamp: 2025-12-26T14:17:41.974Z
Learning: In packages/core/src/core/coreToolScheduler.ts, the `publishBufferedResults()` method (line 1355) is called concurrently by multiple tool completion handlers (line 1510 in each tool's `.then()` callback) when parallel tools finish simultaneously. This causes a race condition where `nextPublishIndex` can be corrupted and tools can hang in 'executing' state forever, blocking the scheduler and causing subsequent tool calls to queue indefinitely. The method must be made reentrant-safe using a mutex/lock pattern to serialize concurrent calls.

Applied to files:

  • packages/core/src/core/coreToolScheduler.ts
📚 Learning: 2025-11-16T22:51:26.374Z
Learnt from: e2720pjk
Repo: vybestack/llxprt-code PR: 583
File: packages/core/src/providers/openai/OpenAIProvider.ts:935-959
Timestamp: 2025-11-16T22:51:26.374Z
Learning: In the llxprt-code codebase (packages/core/src/providers/openai/OpenAIProvider.ts), tools like `run_shell_command` use internal streaming only for real-time UI updates during execution, but each tool execution produces exactly ONE final `ToolResponseBlock` containing the full result. The streaming chunks are never sent to the LLM and are not converted into multiple tool messages. The OpenAI Chat Completions API requires that each tool call (tool_call_id) corresponds to exactly one message with role 'tool', so duplicate tool response detection that removes subsequent tool messages with the same tool_call_id is correct and necessary for API compliance.

Applied to files:

  • packages/core/src/core/coreToolScheduler.ts
⏰ Context from checks skipped due to timeout of 270000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (6)
  • GitHub Check: Test (windows-latest, 24.x)
  • GitHub Check: Test (macos-latest, 24.x)
  • GitHub Check: Test (ubuntu-latest, 24.x)
  • GitHub Check: E2E Test (Linux) - sandbox:docker
  • GitHub Check: E2E Test (Linux) - sandbox:none
  • GitHub Check: Slow E2E - Win
🔇 Additional comments (9)
packages/core/src/core/coreToolScheduler.ts (5)

415-417: LGTM: Clear signal tracking infrastructure.

The callIdToSignal map provides the necessary infrastructure to preserve per-call abort signals for later use in confirmation handling, addressing the root cause described in the PR objectives.


954-955: LGTM: Signal stored at the right time.

Storing the signal during the validation phase ensures it's available throughout the tool's lifecycle, including when handling message bus confirmation responses.


1368-1370: LGTM: Reentrancy guard addresses known race condition.

This guard prevents the concurrent execution issue where multiple tool completion handlers could corrupt nextPublishIndex, causing tools to hang indefinitely. Based on learnings, this fix directly addresses the race condition when parallel tools finish simultaneously.


1372-1414: LGTM: Robust reentrancy protection with proper cleanup.

The try/finally pattern ensures the guard is always cleared, even if an exception occurs during publishing. The early return on line 1375 serializes concurrent calls, preventing the race condition. The in-order publishing logic remains intact.


1578-1582: LGTM: Proper cleanup prevents memory leaks.

Cleaning up signal mappings when tool calls complete prevents unbounded growth of the callIdToSignal map over time.

packages/core/src/tools/grep.ts (4)

37-44: LGTM: ReDoS vulnerability correctly addressed.

The indexOf-based approach provides O(n) complexity and avoids the polynomial time behavior of the previous regex pattern. The logic correctly detects brace expansion patterns like {ts,tsx,js}.


517-520: LGTM: Correctly skips git grep for incompatible patterns.

The brace expansion check prevents using git grep with patterns like *.{ts,tsx} that would fail or produce incorrect results due to git pathspec limitations. This properly addresses issue #945.


546-562: LGTM: Proper abort handling for git grep.

The abort handler correctly:

  • Kills the child process on cancellation
  • Removes the listener in all completion paths (error and close)
  • Rejects with a clear error message

This addresses issue #948 by ensuring git grep processes are terminated when aborted.


627-673: LGTM: Comprehensive abort handling for system grep.

The implementation properly handles cancellation:

  • Abort handler kills the child and invokes cleanup
  • The cleanup function consistently removes all event listeners including the abort listener
  • Cleanup is called in all termination paths (abort, error, close)

This addresses issue #948 by ensuring system grep processes are properly terminated and resources are cleaned up.

- Handle schedule() promise rejection when cancelling queued tool calls
- Use pre-aborted fallback signal when original signal is missing
- Fix publishBufferedResults reentrancy to prevent parallel tool hangs

Addresses CodeRabbit feedback on PR #961
The publishBufferedResults method was hanging when parallel tool calls
completed out of order. The root cause was filtering toolCalls by status
('scheduled' or 'executing'), but publishResult() changes status to
'success', causing tools to disappear from the filtered list mid-iteration.

Fix:
- Store currentBatchSize when execution starts (immutable during batch)
- Use executionIndex stored in buffered results for ordering instead of
  relying on filtered array positions
- Add safety net in finally block to reschedule if pending results remain

This approach is more robust because the batch size and execution indices
are fixed at start and don't change as tools complete.

Added tests for race condition scenarios with out-of-order completions.
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (1)
packages/core/src/core/coreToolScheduler.test.ts (1)

8-18: Duplicate ToolCall import may cause confusion.

ToolCall is imported both as a type (line 9) and as a value (line 15). While TypeScript allows this when the value export is a class/const with the same name as a type, this redundancy is confusing. If ToolCall is exported as both a type and a value from coreToolScheduler.js, consider using only the value import (which TypeScript can also use as a type).

🔎 Suggested simplification
-import type {
-  ToolCall,
-  WaitingToolCall,
-  CompletedToolCall,
-} from './coreToolScheduler.js';
-import {
-  CoreToolScheduler,
-  ToolCall,
-  WaitingToolCall,
-  convertToFunctionResponse,
-} from './coreToolScheduler.js';
+import {
+  CoreToolScheduler,
+  type ToolCall,
+  type WaitingToolCall,
+  type CompletedToolCall,
+  convertToFunctionResponse,
+} from './coreToolScheduler.js';
📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between c1cc7b6 and bb0519d.

📒 Files selected for processing (2)
  • packages/core/src/core/coreToolScheduler.test.ts
  • packages/core/src/core/coreToolScheduler.ts
🧰 Additional context used
📓 Path-based instructions (1)
**/*.{ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.{ts,tsx}: Don't use any - Always specify proper types. Use unknown if the type is truly unknown and add proper type guards.
Do not use console.log or console.debug - Use the sophisticated logging system instead. Log files are written to ~/.llxprt/debug/
Fix all linting errors, including warnings about any types

Files:

  • packages/core/src/core/coreToolScheduler.ts
  • packages/core/src/core/coreToolScheduler.test.ts
🧠 Learnings (3)
📓 Common learnings
Learnt from: acoliver
Repo: vybestack/llxprt-code PR: 0
File: :0-0
Timestamp: 2025-12-26T14:17:41.974Z
Learning: In packages/core/src/core/coreToolScheduler.ts, the `publishBufferedResults()` method (line 1355) is called concurrently by multiple tool completion handlers (line 1510 in each tool's `.then()` callback) when parallel tools finish simultaneously. This causes a race condition where `nextPublishIndex` can be corrupted and tools can hang in 'executing' state forever, blocking the scheduler and causing subsequent tool calls to queue indefinitely. The method must be made reentrant-safe using a mutex/lock pattern to serialize concurrent calls.
📚 Learning: 2025-12-26T14:17:41.974Z
Learnt from: acoliver
Repo: vybestack/llxprt-code PR: 0
File: :0-0
Timestamp: 2025-12-26T14:17:41.974Z
Learning: In packages/core/src/core/coreToolScheduler.ts, the `publishBufferedResults()` method (line 1355) is called concurrently by multiple tool completion handlers (line 1510 in each tool's `.then()` callback) when parallel tools finish simultaneously. This causes a race condition where `nextPublishIndex` can be corrupted and tools can hang in 'executing' state forever, blocking the scheduler and causing subsequent tool calls to queue indefinitely. The method must be made reentrant-safe using a mutex/lock pattern to serialize concurrent calls.

Applied to files:

  • packages/core/src/core/coreToolScheduler.ts
  • packages/core/src/core/coreToolScheduler.test.ts
📚 Learning: 2025-11-16T22:51:26.374Z
Learnt from: e2720pjk
Repo: vybestack/llxprt-code PR: 583
File: packages/core/src/providers/openai/OpenAIProvider.ts:935-959
Timestamp: 2025-11-16T22:51:26.374Z
Learning: In the llxprt-code codebase (packages/core/src/providers/openai/OpenAIProvider.ts), tools like `run_shell_command` use internal streaming only for real-time UI updates during execution, but each tool execution produces exactly ONE final `ToolResponseBlock` containing the full result. The streaming chunks are never sent to the LLM and are not converted into multiple tool messages. The OpenAI Chat Completions API requires that each tool call (tool_call_id) corresponds to exactly one message with role 'tool', so duplicate tool response detection that removes subsequent tool messages with the same tool_call_id is correct and necessary for API compliance.

Applied to files:

  • packages/core/src/core/coreToolScheduler.ts
  • packages/core/src/core/coreToolScheduler.test.ts
⏰ Context from checks skipped due to timeout of 270000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (7)
  • GitHub Check: Test (windows-latest, 24.x)
  • GitHub Check: Test (ubuntu-latest, 24.x)
  • GitHub Check: Test (macos-latest, 24.x)
  • GitHub Check: E2E Test (Linux) - sandbox:none
  • GitHub Check: E2E Test (Linux) - sandbox:docker
  • GitHub Check: E2E Test (macOS)
  • GitHub Check: Slow E2E - Win
🔇 Additional comments (9)
packages/core/src/core/coreToolScheduler.test.ts (2)

2258-2396: Well-designed race condition test.

This test effectively exercises the race condition scenario documented in the learning. The deferred promise pattern with explicit resolver control provides precise timing to trigger the edge case where publishBufferedResults might exit prematurely without processing all buffered results.


2398-2496: Good edge case coverage for blocked publishing.

This test validates the scenario where all later tools complete before the first one, ensuring the buffering mechanism correctly holds and publishes results in request order. The timing setup (80ms for tool 1, staggered 5ms increments for others) reliably reproduces the scenario.

packages/core/src/core/coreToolScheduler.ts (7)

415-417: Per-call signal tracking implemented correctly.

The callIdToSignal map properly stores the original AbortSignal per tool call, enabling correct cancellation semantics when handling message bus confirmation responses asynchronously.


497-520: Pre-aborted fallback signal correctly implemented.

When the original signal is missing from callIdToSignal, the code now correctly creates a pre-aborted signal rather than a never-aborted one. This ensures that confirmation handlers won't erroneously proceed when the tool call has already been cleaned up.


964-965: Signal stored at correct point in scheduling flow.

The signal is stored in callIdToSignal early in the scheduling process, before any async operations, ensuring it's available for message bus confirmation handling.


1378-1467: Robust reentrancy guard with safety net.

The implementation correctly addresses the race condition from the learning:

  1. The isPublishingBufferedResults flag prevents concurrent corruption
  2. The pendingPublishRequest flag signals when another publish is needed
  3. The do-while loop handles results arriving during publishing
  4. The finally block safety net (lines 1460-1466) handles the edge case where results arrive between checking pendingPublishRequest and exiting

Using setImmediate for rescheduling is appropriate to prevent stack overflow from deep recursion. Based on learnings, this addresses the publishBufferedResults() race condition that caused tools to hang in 'executing' state.


1543-1545: Batch size captured at correct point.

Setting currentBatchSize at execution start (before any tools complete) ensures the publisher knows exactly how many results to expect, regardless of how tool statuses change during execution.


1636-1640: Signal cleanup prevents memory leaks.

The cleanup of callIdToSignal entries happens after all tool calls reach terminal state, ensuring signals aren't deleted prematurely while confirmation responses might still arrive.


1711-1780: cancelAll correctly delegates signal cleanup.

The cancelAll() method transitions all tool calls to cancelled status, then calls checkAndNotifyCompletion() which handles the callIdToSignal cleanup when all calls are terminal.

@acoliver acoliver merged commit 90da158 into main Dec 31, 2025
23 of 24 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

maintainer:e2e:ok Trusted contributor; maintainer-approved E2E run

Projects

None yet

Development

Successfully merging this pull request may close these issues.

search_file_content: include glob can false-negative and trigger slow fallback

2 participants