From 04683029a64bd967b5ff9fbcf677f04ea95daaf8 Mon Sep 17 00:00:00 2001 From: Diego Rodrigues de Sa e Souza Date: Thu, 6 Aug 2026 02:19:57 -0300 Subject: [PATCH] fix(build): exec native esbuild binary directly in prepublish (dast-smoke base-red) (#9558) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(build): exec native tool binaries directly in runBuildTool #8858 routed every resolved local bin through process.execPath to avoid Windows .cmd shims — but esbuild >=0.25 ships bin/esbuild as the NATIVE platform executable (ELF on Linux), so Node parsed machine code as JS and build:cli died with 'SyntaxError: Invalid or unexpected token', turning dast-smoke red for every PR. runBuildTool now sniffs the entry's magic bytes (ELF / Mach-O / PE) and execs native binaries directly; JS entries keep going through this Node binary (the .cmd-shim avoidance #8858 wanted). Validation (RED->GREEN on this box): - RED: node node_modules/esbuild/bin/esbuild --version -> SyntaxError (ELF) - GREEN: the exact failing CI step reproduced via the new logic bundles open-sse/mcp-server/server.ts successfully (4.2MB output, 1.3s). * fix(docs): add MDX frontmatter to the 20 remaining docs without it Same failure class as AGENTROUTER_WAF (#9503) and DOCKER_RELEASE_CHANNELS (this run's dast-smoke red): any doc without frontmatter breaks the fumadocs MDX loader during next build, killing build:cli/dast-smoke for every PR. Swept ALL of docs/ (i18n mirrors excluded) in one pass so this class cannot recur one file at a time. * docs(env): document OMNIROUTE_INTERNAL_SERVICE_TOKEN(+_FILE), OPENROUTER_PROVIDER_STATS_* and embedded-Redis binding vars Pre-existing env/docs contract drift from recently merged features made check:env-doc-sync red for any docs-touching PR. Values and defaults read from the defining modules (internalServiceAuth.ts, openrouterProviderStats.ts). * fix(build): resolve bundled npm-cli.js in the standard Unix layout + safe npm fallback off-Windows The opencode-plugin step hard-failed on GitHub runners because resolveBundledNpmEntry only looked next to the node binary (Windows zip layout); hostedtoolcache Node keeps npm at /lib/node_modules/npm. Added that candidate, and when neither exists on non-Windows the step now falls back to plain 'npm' — the .cmd-shim hazard #8858 avoids is Windows-only. * test(mutation): register xai-agent-tools-passthrough.test.ts in stryker tap.testFiles The test landed on release/v3.8.50 covering open-sse/handlers/chatCore/passthroughHelpers.ts without the stryker registration, so Fast Quality Gates' drift detection reds any PR that carries it. Mechanical registration so its mutant kills count. --------- Co-authored-by: diegosouzapw --- .env.example | 13 +++++ .../fixes/prepublish-native-esbuild.md | 1 + docs/INCIDENT_RESPONSE.md | 6 +++ docs/PERF_BUDGETS.md | 6 +++ docs/ROADMAP.md | 6 +++ docs/assets/flags/README.md | 6 +++ docs/combo-context-requirements.md | 6 +++ docs/getting-started/AUTO-COMBO-GUIDE.md | 6 +++ docs/getting-started/FREE-TIERS-GUIDE.md | 6 +++ docs/getting-started/PROVIDERS-GUIDE.md | 6 +++ docs/getting-started/QUICK-START.md | 6 +++ docs/guides/DOCKER_RELEASE_CHANNELS.md | 6 +++ docs/proxy-port-clash-report.md | 6 +++ docs/proxy-subscriptions.md | 6 +++ docs/redis-production-config.md | 6 +++ docs/reference/ENVIRONMENT.md | 22 +++++++++ .../00_SESSION_OVERVIEW.md | 6 +++ .../01_RESEARCH.md | 6 +++ .../02_SPECIFICATIONS.md | 6 +++ .../03_DAG_WBS.md | 6 +++ .../04_IMPLEMENTATION_STRATEGY.md | 6 +++ .../05_KNOWN_ISSUES.md | 6 +++ .../06_TESTING_STRATEGY.md | 6 +++ scripts/build/prepublish.ts | 49 +++++++++++++++++-- stryker.conf.json | 15 ++++-- 25 files changed, 211 insertions(+), 9 deletions(-) create mode 100644 changelog.d/fixes/prepublish-native-esbuild.md diff --git a/.env.example b/.env.example index 5660c922f6..71f7a728f9 100644 --- a/.env.example +++ b/.env.example @@ -2395,3 +2395,16 @@ QUOTA_STORE_DRIVER=sqlite # sqlite | redis # OMNIROUTE_DATA_DIR are both unset. Locates the Notion web-thread session cache. # ───────────────────────────────────────────────────────────────────────────── # VIBEPROXY_DATA_DIR= + +# ── Internal service auth (management-plane service-to-service calls) ───────── +# Inline token for internal service authentication; prefer the _FILE variant in +# containerized deployments so the secret never lands in the environment table. +# OMNIROUTE_INTERNAL_SERVICE_TOKEN= +# Path to a file containing the internal service token (overrides the inline var). +# OMNIROUTE_INTERNAL_SERVICE_TOKEN_FILE= + +# ── OpenRouter provider stats (catalog enrichment) ──────────────────────────── +# On by default; set to "false" to skip fetching OpenRouter per-provider stats. +# OPENROUTER_PROVIDER_STATS_ENABLED=true +# Cache TTL for the fetched stats, in milliseconds. +# OPENROUTER_PROVIDER_STATS_TTL_MS=3600000 diff --git a/changelog.d/fixes/prepublish-native-esbuild.md b/changelog.d/fixes/prepublish-native-esbuild.md new file mode 100644 index 0000000000..60c7b76d94 --- /dev/null +++ b/changelog.d/fixes/prepublish-native-esbuild.md @@ -0,0 +1 @@ +- fix(build): exec native esbuild binary directly in prepublish — esbuild ≥0.25 ships an ELF at bin/esbuild and running it through node crashed every build:cli (dast-smoke red on all PRs) diff --git a/docs/INCIDENT_RESPONSE.md b/docs/INCIDENT_RESPONSE.md index 5218255bb2..e6bd5accd7 100644 --- a/docs/INCIDENT_RESPONSE.md +++ b/docs/INCIDENT_RESPONSE.md @@ -1,3 +1,9 @@ +--- +title: "Incident Response Runbook — OmniRoute (2026-06-18)" +version: 3.8.50 +lastUpdated: 2026-08-06 +--- + # Incident Response Runbook — OmniRoute (2026-06-18) **Status**: Authoritative. The 71-pillar audit (L61) references this doc diff --git a/docs/PERF_BUDGETS.md b/docs/PERF_BUDGETS.md index 05bf56b373..995aaf6bf4 100644 --- a/docs/PERF_BUDGETS.md +++ b/docs/PERF_BUDGETS.md @@ -1,3 +1,9 @@ +--- +title: "Performance Budgets — OmniRoute (2026-06-18)" +version: 3.8.50 +lastUpdated: 2026-08-06 +--- + # Performance Budgets — OmniRoute (2026-06-18) **Status**: Authoritative. SLO targets that the 71-pillar audit (L13) diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index e3a2251c59..120376fabb 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -1,3 +1,9 @@ +--- +title: "OmniRoute Roadmap" +version: 3.8.50 +lastUpdated: 2026-08-06 +--- + # OmniRoute Roadmap > Version-gated, not date-gated: each milestone ships when its quality gates pass. diff --git a/docs/assets/flags/README.md b/docs/assets/flags/README.md index 11aaae3e5f..e0a53db382 100644 --- a/docs/assets/flags/README.md +++ b/docs/assets/flags/README.md @@ -1,3 +1,9 @@ +--- +title: "Flag icons" +version: 3.8.50 +lastUpdated: 2026-08-06 +--- + # Flag icons SVG country flags used by the language selector in the root `README.md`. diff --git a/docs/combo-context-requirements.md b/docs/combo-context-requirements.md index 9dc39fcf68..3c1c863d2d 100644 --- a/docs/combo-context-requirements.md +++ b/docs/combo-context-requirements.md @@ -1,3 +1,9 @@ +--- +title: "Combo Context Requirements Feature" +version: 3.8.50 +lastUpdated: 2026-08-06 +--- + # Combo Context Requirements Feature ## Overview diff --git a/docs/getting-started/AUTO-COMBO-GUIDE.md b/docs/getting-started/AUTO-COMBO-GUIDE.md index bc3bc66cd8..503e73b807 100644 --- a/docs/getting-started/AUTO-COMBO-GUIDE.md +++ b/docs/getting-started/AUTO-COMBO-GUIDE.md @@ -1,3 +1,9 @@ +--- +title: "Auto-Combo: Let OmniRoute Pick the Best AI for You" +version: 3.8.50 +lastUpdated: 2026-08-06 +--- + # Auto-Combo: Let OmniRoute Pick the Best AI for You > **TL;DR**: Set your model to `auto` and OmniRoute automatically picks the best AI provider for each request. No configuration needed. diff --git a/docs/getting-started/FREE-TIERS-GUIDE.md b/docs/getting-started/FREE-TIERS-GUIDE.md index c06ad1709e..da8ddd3589 100644 --- a/docs/getting-started/FREE-TIERS-GUIDE.md +++ b/docs/getting-started/FREE-TIERS-GUIDE.md @@ -1,3 +1,9 @@ +--- +title: "Free Tiers Guide: Get Free AI Without a Credit Card" +version: 3.8.50 +lastUpdated: 2026-08-06 +--- + # Free Tiers Guide: Get Free AI Without a Credit Card > **TL;DR**: OmniRoute aggregates free tiers from 50+ providers. Connect multiple free providers for unlimited free AI with automatic fallback. diff --git a/docs/getting-started/PROVIDERS-GUIDE.md b/docs/getting-started/PROVIDERS-GUIDE.md index 5331957d7f..c1c237862e 100644 --- a/docs/getting-started/PROVIDERS-GUIDE.md +++ b/docs/getting-started/PROVIDERS-GUIDE.md @@ -1,3 +1,9 @@ +--- +title: "Providers Guide: Connect AI Models to OmniRoute" +version: 3.8.50 +lastUpdated: 2026-08-06 +--- + # Providers Guide: Connect AI Models to OmniRoute > **TL;DR**: A provider is a connection to an AI service (like OpenAI, Anthropic, Google). You need at least one provider to use OmniRoute. diff --git a/docs/getting-started/QUICK-START.md b/docs/getting-started/QUICK-START.md index c15e8ed366..a451327602 100644 --- a/docs/getting-started/QUICK-START.md +++ b/docs/getting-started/QUICK-START.md @@ -1,3 +1,9 @@ +--- +title: "Quick Start: Get OmniRoute Running in 3 Minutes" +version: 3.8.50 +lastUpdated: 2026-08-06 +--- + # Quick Start: Get OmniRoute Running in 3 Minutes > **TL;DR**: Install → Connect a free provider → Point your IDE to OmniRoute. Done. diff --git a/docs/guides/DOCKER_RELEASE_CHANNELS.md b/docs/guides/DOCKER_RELEASE_CHANNELS.md index 46b4e44406..afc47318a0 100644 --- a/docs/guides/DOCKER_RELEASE_CHANNELS.md +++ b/docs/guides/DOCKER_RELEASE_CHANNELS.md @@ -1,3 +1,9 @@ +--- +title: "Docker Release Channels" +version: 3.8.50 +lastUpdated: 2026-08-06 +--- + # Docker Release Channels OmniRoute publishes separate Docker channels for stable releases, active release-branch testing, and development builds. diff --git a/docs/proxy-port-clash-report.md b/docs/proxy-port-clash-report.md index 56536c01e0..5d09331fc2 100644 --- a/docs/proxy-port-clash-report.md +++ b/docs/proxy-port-clash-report.md @@ -1,3 +1,9 @@ +--- +title: "Proxy Port Clash Investigation" +version: 3.8.50 +lastUpdated: 2026-08-06 +--- + # Proxy Port Clash Investigation ## Summary diff --git a/docs/proxy-subscriptions.md b/docs/proxy-subscriptions.md index cae473954e..1a1e725029 100644 --- a/docs/proxy-subscriptions.md +++ b/docs/proxy-subscriptions.md @@ -1,3 +1,9 @@ +--- +title: "Operator Proxy Subscriptions (Karing-style)" +version: 3.8.50 +lastUpdated: 2026-08-06 +--- + # Operator Proxy Subscriptions (Karing-style) > Feature design + implementation notes for OmniRoute's operator-level proxy diff --git a/docs/redis-production-config.md b/docs/redis-production-config.md index 660ec4843d..e8749c7bbc 100644 --- a/docs/redis-production-config.md +++ b/docs/redis-production-config.md @@ -1,3 +1,9 @@ +--- +title: "Redis Production Configuration Guide" +version: 3.8.50 +lastUpdated: 2026-08-06 +--- + # Redis Production Configuration Guide ## Overview diff --git a/docs/reference/ENVIRONMENT.md b/docs/reference/ENVIRONMENT.md index 3e19495178..7a425f9aa9 100644 --- a/docs/reference/ENVIRONMENT.md +++ b/docs/reference/ENVIRONMENT.md @@ -1312,3 +1312,25 @@ Used by `src/lib/vncSession/manifest.ts` to configure Docker-based headless Chro | `OMNIROUTE_VNC_READY_MS` | `45000` | `src/lib/vncSession/manifest.ts` | Browser readiness timeout (ms). | | `OMNIROUTE_VNC_HARVEST_MS` | `20000` | `src/lib/vncSession/manifest.ts` | Harvest/cleanup timeout (ms). | | `VIBEPROXY_DATA_DIR` | _(unset)_ | `open-sse/services/notionThreadSessions.ts` | Directory for Notion thread session persistence. | + +### Internal service auth + +| Variable | Default | Description | +| --- | --- | --- | +| `OMNIROUTE_INTERNAL_SERVICE_TOKEN` | – | Inline token for management-plane service-to-service authentication. | +| `OMNIROUTE_INTERNAL_SERVICE_TOKEN_FILE` | – | Path to a file containing the internal service token (preferred in containers; overrides the inline variable). | + +### OpenRouter provider stats + +| Variable | Default | Description | +| --- | --- | --- | +| `OPENROUTER_PROVIDER_STATS_ENABLED` | `true` | Set to `false` to skip fetching OpenRouter per-provider stats for catalog enrichment. | +| `OPENROUTER_PROVIDER_STATS_TTL_MS` | `3600000` | Cache TTL (ms) for the fetched OpenRouter provider stats. | + +### Embedded Redis binding + +| Variable | Default | Description | +| --- | --- | --- | +| `REDIS_BIND_HOST` | `127.0.0.1` | Bind address for the embedded Redis service. | +| `REDIS_PORT` | `6379` | Port for the embedded Redis service. | +| `OMNIROUTE_REDIS_BIND_HOST` | – | OmniRoute-scoped override for the embedded Redis bind address. | diff --git a/docs/sessions/20260714-issue-agent-executable-triage/00_SESSION_OVERVIEW.md b/docs/sessions/20260714-issue-agent-executable-triage/00_SESSION_OVERVIEW.md index 378c4454e9..ee14070eb6 100644 --- a/docs/sessions/20260714-issue-agent-executable-triage/00_SESSION_OVERVIEW.md +++ b/docs/sessions/20260714-issue-agent-executable-triage/00_SESSION_OVERVIEW.md @@ -1,3 +1,9 @@ +--- +title: "Issue-Agent Executable Triage: Session Overview" +version: 3.8.50 +lastUpdated: 2026-08-06 +--- + # Issue-Agent Executable Triage: Session Overview Machine status: `in_progress` diff --git a/docs/sessions/20260714-issue-agent-executable-triage/01_RESEARCH.md b/docs/sessions/20260714-issue-agent-executable-triage/01_RESEARCH.md index d0af543d87..242e08186d 100644 --- a/docs/sessions/20260714-issue-agent-executable-triage/01_RESEARCH.md +++ b/docs/sessions/20260714-issue-agent-executable-triage/01_RESEARCH.md @@ -1,3 +1,9 @@ +--- +title: "Issue-Agent Executable Triage: Research" +version: 3.8.50 +lastUpdated: 2026-08-06 +--- + # Issue-Agent Executable Triage: Research Machine status: `complete_for_current_phase` diff --git a/docs/sessions/20260714-issue-agent-executable-triage/02_SPECIFICATIONS.md b/docs/sessions/20260714-issue-agent-executable-triage/02_SPECIFICATIONS.md index 636b543a54..5024487d7b 100644 --- a/docs/sessions/20260714-issue-agent-executable-triage/02_SPECIFICATIONS.md +++ b/docs/sessions/20260714-issue-agent-executable-triage/02_SPECIFICATIONS.md @@ -1,3 +1,9 @@ +--- +title: "Issue-Agent Executable Triage: Specifications" +version: 3.8.50 +lastUpdated: 2026-08-06 +--- + # Issue-Agent Executable Triage: Specifications Machine status: `in_progress` diff --git a/docs/sessions/20260714-issue-agent-executable-triage/03_DAG_WBS.md b/docs/sessions/20260714-issue-agent-executable-triage/03_DAG_WBS.md index 284a885c5c..959660d714 100644 --- a/docs/sessions/20260714-issue-agent-executable-triage/03_DAG_WBS.md +++ b/docs/sessions/20260714-issue-agent-executable-triage/03_DAG_WBS.md @@ -1,3 +1,9 @@ +--- +title: "Issue-Agent Executable Triage: DAG and WBS" +version: 3.8.50 +lastUpdated: 2026-08-06 +--- + # Issue-Agent Executable Triage: DAG and WBS Machine status: `in_progress` diff --git a/docs/sessions/20260714-issue-agent-executable-triage/04_IMPLEMENTATION_STRATEGY.md b/docs/sessions/20260714-issue-agent-executable-triage/04_IMPLEMENTATION_STRATEGY.md index 1c59174973..42909529c2 100644 --- a/docs/sessions/20260714-issue-agent-executable-triage/04_IMPLEMENTATION_STRATEGY.md +++ b/docs/sessions/20260714-issue-agent-executable-triage/04_IMPLEMENTATION_STRATEGY.md @@ -1,3 +1,9 @@ +--- +title: "Issue-Agent Executable Triage: Implementation Strategy" +version: 3.8.50 +lastUpdated: 2026-08-06 +--- + # Issue-Agent Executable Triage: Implementation Strategy Machine status: `in_progress` diff --git a/docs/sessions/20260714-issue-agent-executable-triage/05_KNOWN_ISSUES.md b/docs/sessions/20260714-issue-agent-executable-triage/05_KNOWN_ISSUES.md index 6c3f0fbe0e..45e24ca42a 100644 --- a/docs/sessions/20260714-issue-agent-executable-triage/05_KNOWN_ISSUES.md +++ b/docs/sessions/20260714-issue-agent-executable-triage/05_KNOWN_ISSUES.md @@ -1,3 +1,9 @@ +--- +title: "Issue-Agent Executable Triage: Known Issues" +version: 3.8.50 +lastUpdated: 2026-08-06 +--- + # Issue-Agent Executable Triage: Known Issues Machine status: `open` diff --git a/docs/sessions/20260714-issue-agent-executable-triage/06_TESTING_STRATEGY.md b/docs/sessions/20260714-issue-agent-executable-triage/06_TESTING_STRATEGY.md index 006908ef71..5ecdc9cc8f 100644 --- a/docs/sessions/20260714-issue-agent-executable-triage/06_TESTING_STRATEGY.md +++ b/docs/sessions/20260714-issue-agent-executable-triage/06_TESTING_STRATEGY.md @@ -1,3 +1,9 @@ +--- +title: "Issue-Agent Executable Triage: Testing Strategy" +version: 3.8.50 +lastUpdated: 2026-08-06 +--- + # Issue-Agent Executable Triage: Testing Strategy Machine status: `in_progress` diff --git a/scripts/build/prepublish.ts b/scripts/build/prepublish.ts index 309180a2c7..50cdaf8cbf 100644 --- a/scripts/build/prepublish.ts +++ b/scripts/build/prepublish.ts @@ -22,6 +22,9 @@ import { readdirSync, statSync, chmodSync, + openSync, + readSync, + closeSync, } from "node:fs"; import { join, dirname } from "node:path"; import { fileURLToPath } from "node:url"; @@ -70,6 +73,30 @@ function resolveLocalBinEntry(packageName: string, binName: string): string | nu * tool lives in the local dependency tree; when it is not installed there the call * falls back to the Node-resolved `npx` entry point, and only then to the shim. */ +/** + * esbuild ≥0.25 ships its `bin/esbuild` as the NATIVE platform executable on + * Linux/macOS (ELF / Mach-O) instead of a JS shim — running it through + * `process.execPath` makes Node parse machine code as JavaScript and crash with + * "SyntaxError: Invalid or unexpected token". Sniff the magic bytes and exec + * native entries directly; JS entries keep going through this Node binary. + */ +function isNativeExecutable(entryPath: string): boolean { + try { + const fd = openSync(entryPath, "r"); + const head = Buffer.alloc(4); + readSync(fd, head, 0, 4, 0); + closeSync(fd); + return ( + (head[0] === 0x7f && head[1] === 0x45 && head[2] === 0x4c && head[3] === 0x46) || // ELF + head.readUInt32BE(0) === 0xfeedfacf || // Mach-O 64 + head.readUInt32BE(0) === 0xcffaedfe || // Mach-O 64 (LE on disk) + (head[0] === 0x4d && head[1] === 0x5a) // PE (Windows MZ) + ); + } catch { + return false; + } +} + function runBuildTool( packageName: string, binName: string, @@ -78,6 +105,10 @@ function runBuildTool( ): void { const localEntry = resolveLocalBinEntry(packageName, binName); if (localEntry) { + if (isNativeExecutable(localEntry)) { + execFileSync(localEntry, [...args], options); + return; + } execFileSync(process.execPath, [localEntry, ...args], options); return; } @@ -405,15 +436,23 @@ if (existsSync(opencodePluginSrc) && existsSync(join(opencodePluginSrc, "package // types). Without this install a fresh CI publish fails at this step. if (!existsSync(join(opencodePluginSrc, "node_modules"))) { const npmEntry = resolveBundledNpmEntry("npm-cli.js"); - if (!npmEntry) { + if (npmEntry) { + execFileSync(process.execPath, [npmEntry, "install", "--no-audit", "--no-fund"], { + cwd: opencodePluginSrc, + stdio: "inherit", + }); + } else if (process.platform !== "win32") { + // No bundled npm entry found (non-standard Node layout). Plain `npm` is + // safe here — the .cmd-shim hazard #8858 guards against is Windows-only. + execFileSync("npm", ["install", "--no-audit", "--no-fund"], { + cwd: opencodePluginSrc, + stdio: "inherit", + }); + } else { throw new Error( "npm-cli.js not found next to the running Node binary; cannot install the plugin dependencies without falling back to a .cmd shim." ); } - execFileSync(process.execPath, [npmEntry, "install", "--no-audit", "--no-fund"], { - cwd: opencodePluginSrc, - stdio: "inherit", - }); } runBuildTool("tsup", "tsup", [], { cwd: opencodePluginSrc, diff --git a/stryker.conf.json b/stryker.conf.json index 191104f480..e729c958c7 100644 --- a/stryker.conf.json +++ b/stryker.conf.json @@ -39,7 +39,9 @@ "incremental": true, "incrementalFile": "reports/mutation/stryker-incremental.json", "testRunner": "tap", - "plugins": ["@stryker-mutator/tap-runner"], + "plugins": [ + "@stryker-mutator/tap-runner" + ], "tap": { "testFiles": [ "tests/unit/7993-noauth-proxy-routing.test.ts", @@ -84,9 +86,9 @@ "tests/unit/bug-7940-gemini-retrydelay.test.ts", "tests/unit/build/check-circular-deps.test.ts", "tests/unit/cache-sweeps.test.ts", - "tests/unit/chat-adaptive-admission-binding.test.ts", "tests/unit/cc-bridge-openai-image-7777.test.ts", "tests/unit/cc-compatible-provider.test.ts", + "tests/unit/chat-adaptive-admission-binding.test.ts", "tests/unit/chat-combo-live-test.test.ts", "tests/unit/chat-context-relay.test.ts", "tests/unit/chat-cooldown-aware-retry.test.ts", @@ -312,7 +314,8 @@ "tests/unit/upstream-retry-hints-toggle.test.ts", "tests/unit/upstream-timeout-model-override.test.ts", "tests/unit/usage-service-hardening.test.ts", - "tests/unit/validate-response-quality.test.ts" + "tests/unit/validate-response-quality.test.ts", + "tests/unit/xai-agent-tools-passthrough.test.ts" ], "nodeArgs": [ "--import", @@ -421,7 +424,11 @@ ".worktrees", ".stryker-tmp" ], - "reporters": ["progress", "html", "json"], + "reporters": [ + "progress", + "html", + "json" + ], "htmlReporter": { "fileName": "reports/mutation/mutation.html" },