Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
121 commits
Select commit Hold shift + click to select a range
c7ddc00
chore(release): open v3.8.29 development cycle
diegosouzapw Jun 18, 2026
d6cb8b5
deps: bump the production group with 5 updates (#4121)
dependabot[bot] Jun 18, 2026
e64ae8d
chore(deps): bump github/codeql-action from 3 to 4 (#4120)
dependabot[bot] Jun 18, 2026
f31e27b
chore(deps): bump actions/setup-python from 5 to 6 (#4119)
dependabot[bot] Jun 18, 2026
cf716e9
fix(vscode): sanitize implicit editor context (#4124)
zhiru Jun 18, 2026
9f14c12
test: align stale integration tests surfaced post-v3.8.28 on main (#4…
diegosouzapw Jun 18, 2026
ee1d0fb
fix(ci): derive oasdiff base-ref from package version + flag mutation…
diegosouzapw Jun 18, 2026
c978920
test(db,sse): de-flake db-backup + chatcore streaming timing assertio…
diegosouzapw Jun 18, 2026
9e5c00d
docs(ci): correct mutation-gate note — no regression (stryker -c is -…
diegosouzapw Jun 18, 2026
34bde60
chore(quality): close v3.8.28 cycle gate drift (re-baseline + nightly…
diegosouzapw Jun 18, 2026
3919661
feat(sse): transparent stream recovery (free-claude-code port, Fase 4…
diegosouzapw Jun 18, 2026
677d447
fix(compression): show engine preview output (#4128)
megamen32 Jun 18, 2026
69c2b79
feat(agent-bridge): maintenance & diagnostics dashboard controls (#4127)
diegosouzapw Jun 18, 2026
91183dc
feat(dashboard): compact grid layout for no-auth provider accounts (#…
felipesartori Jun 18, 2026
1faf72b
feat(traffic-inspector): live (in-flight) request filter (Gap 5) (#4130)
diegosouzapw Jun 18, 2026
d828e49
feat(search): free DuckDuckGo web search as last-resort provider (FCC…
diegosouzapw Jun 18, 2026
541ff3b
feat(dashboard): unified visual identity — grid, primitives, tables, …
diegosouzapw Jun 18, 2026
ce8157c
feat(mitm): Fase 3 Epic A spike — TPROXY command builder (#4139)
diegosouzapw Jun 18, 2026
dd1f79d
feat(logging): add credential-redaction safety net in the pino logger…
diegosouzapw Jun 18, 2026
2c09f5c
feat(dashboard): make identity grid visible + unify focus ring on acc…
diegosouzapw Jun 18, 2026
7170d71
feat(mitm): TPROXY setup layer — transactional apply/revert (Epic A) …
diegosouzapw Jun 18, 2026
9f1d5a0
fix(free-tiers): retire dead-tier hasFree, round headline ~1.6B, rege…
diegosouzapw Jun 18, 2026
3beba2d
style(dashboard): shrink identity grid cell 46px -> 32px (~30% smalle…
diegosouzapw Jun 18, 2026
c5c612e
feat(api): no-thinking gateway model IDs (FCC port, Fase 8.1) (#4145)
diegosouzapw Jun 18, 2026
7fd4723
feat(sse): per-provider sliding-window rate-limit fallback (FCC port,…
diegosouzapw Jun 18, 2026
0ca7a01
ci(docs): harden fabricated-docs checker + enforce --strict (QG v2 Fa…
diegosouzapw Jun 18, 2026
97173b1
feat(mitm): TPROXY IP_TRANSPARENT native addon + conditional loader (…
diegosouzapw Jun 18, 2026
3cdaedc
feat(sse): mid-stream continuation for truncated streams (FCC port, T…
diegosouzapw Jun 18, 2026
c82462d
fix(free-tiers): retire 4 re-verified-dead free tiers, flag iflytek/s…
diegosouzapw Jun 18, 2026
464db4b
fix(sse): restore MCP/third-party tool names on native Claude path (#…
diegosouzapw Jun 18, 2026
6ffde2a
ci(mutation): split nightly into 3 parallel batches to fit 180min bud…
diegosouzapw Jun 18, 2026
5c0c974
fix(dashboard): self-heal logs auto-refresh in embedded/proxied hosts…
diegosouzapw Jun 18, 2026
9aae6b9
fix(capabilities): unify vision model-id detection into one shared so…
diegosouzapw Jun 18, 2026
46c7610
fix(mitm): TPROXY OUTPUT-based recipe for local traffic (validated e2…
diegosouzapw Jun 18, 2026
a0e7e92
fix(capabilities): resolve synced vision metadata for Mistral -latest…
diegosouzapw Jun 18, 2026
e0fe4fa
feat(dashboard): grid wallpaper on all standalone screens + fluid 4K …
diegosouzapw Jun 18, 2026
0283308
feat(mitm): add setSocketMark to the TPROXY addon (anti-loop primitiv…
diegosouzapw Jun 18, 2026
0e33b2b
refactor(combo): god-file split pilot — types + validateQuality + pre…
diegosouzapw Jun 18, 2026
305474d
refactor(sse): split chatCore.ts pure helpers into chatCore/ modules …
diegosouzapw Jun 18, 2026
1e4ce6c
fix(sse): clear error when request queue drops a job, not fake-upstre…
diegosouzapw Jun 18, 2026
0fc305e
fix(api): advertise built-in auto/* combos in /v1/models (#4164) (#4170)
diegosouzapw Jun 18, 2026
a9e7e38
feat(mitm): TPROXY capture-mode listener + connectMarked (Epic A) (#4…
diegosouzapw Jun 18, 2026
fa210de
feat(compression): replace headroom tabular encoder with vendored GCF…
blackwell-systems Jun 18, 2026
f788045
fix(providers): qwen-web model discovery lists live catalog (#3931) (…
diegosouzapw Jun 18, 2026
aaa740f
feat(mitm): dynamic per-SNI cert authority for TPROXY (TLS decrypt 1/…
diegosouzapw Jun 18, 2026
771f1cf
fix(build): raise Node heap for local next build to stop OOM/stall (#…
diegosouzapw Jun 18, 2026
5ef6a46
feat(dashboard): import only free models + free-model list controls (…
felipesartori Jun 18, 2026
798fce7
refactor(combo): god-file split part 2 — shadow + sorters + structure…
diegosouzapw Jun 18, 2026
10ecda2
feat(mitm): TLS-terminating capture for TPROXY (decrypt 2/N) (#4179)
diegosouzapw Jun 18, 2026
50543c3
fix(sse): surface mid-stream Gemini errors instead of a truncated 200…
diegosouzapw Jun 18, 2026
4537fbe
feat(api): register Kimi K2.7 Code models (kimi-k2.7-code + -highspee…
diegosouzapw Jun 18, 2026
89cd954
fix(antigravity): default includeThoughts for modern Gemini models (#…
dhaern Jun 18, 2026
d4e92db
fix(provider-registry): add correct contextLength to theoldllm models…
herjarsa Jun 18, 2026
75cf6ba
feat(catalog): add kimi-k2.7-code to kmca catalog + qwen-web models d…
diegosouzapw Jun 18, 2026
0df3131
feat(memory): opt-in Qdrant scalar int8 quantization (F4.4 Q1) (#4187)
diegosouzapw Jun 18, 2026
ceb7e73
feat(memory): opt-in sqlite-vec int8 vector quantization (F4.4 Q2) (#…
diegosouzapw Jun 18, 2026
0a3b1de
test(sse): guard Antigravity _toolNameMap through request-capture rou…
diegosouzapw Jun 18, 2026
647cb6a
refactor(chatcore): extract passthrough/header/telemetry helpers (QG …
diegosouzapw Jun 18, 2026
0abe9a3
refactor(combo): god-file split part 3 — auto strategy (QG v2 Fase 9 …
diegosouzapw Jun 18, 2026
31f519b
fix(models): expose combo model token limits (#4189)
megamen32 Jun 18, 2026
4f3a113
docs(readme): expand Acknowledgments into a themed, star-counted cred…
diegosouzapw Jun 18, 2026
cd60eb2
test(compression): close F5.1 coverage gaps (replay reducer, live acc…
diegosouzapw Jun 18, 2026
4876210
refactor(chatcore): extract combo/proxy context cache + semaphore hel…
diegosouzapw Jun 18, 2026
02146ab
fix(combo): keep passthrough quota fallback scoped (#4194)
Svetznaniy33 Jun 18, 2026
7e534d6
fix(compression): harden engines against I/O failures and misconfig (…
diegosouzapw Jun 18, 2026
f06a90d
refactor(combo): extract round-robin sticky state to combo/rrState.ts…
diegosouzapw Jun 18, 2026
9229ac7
feat(api): expand zai provider catalog with GLM-5.2 / GLM-4.7 (#4201)
diegosouzapw Jun 18, 2026
3135be8
feat(mitm): wire TLS decrypt engine into TPROXY capture mode (decrypt…
diegosouzapw Jun 18, 2026
565eb28
refactor(combo): extract reset-aware quota block to combo/quotaStrate…
diegosouzapw Jun 18, 2026
b05bc74
fix(compression): harden RTK raw-output redaction + ReDoS guard for c…
diegosouzapw Jun 18, 2026
8e921ca
chore(ci): re-add 8 combo split leaves to stryker mutate + expand nig…
diegosouzapw Jun 18, 2026
aed2a50
feat(compression): persist RTK grouping config (unlock R5 enableGroup…
diegosouzapw Jun 18, 2026
4fecb34
fix(compression): bound mcpAccessibility maxTextChars on the live rea…
diegosouzapw Jun 18, 2026
4c6cb45
feat(mitm): TPROXY capture-mode manager (decrypt 4a/N) (#4208)
diegosouzapw Jun 18, 2026
8a0863c
chore(ci): add quota + 6 covered chatCore leaves to stryker mutate (Q…
diegosouzapw Jun 18, 2026
12124aa
feat(mitm): local-only route + trust-store installer for TPROXY decry…
diegosouzapw Jun 18, 2026
cfc2bc7
feat(dashboard): derive media serviceKinds from registries (surface M…
diegosouzapw Jun 18, 2026
6a64bad
fix(providers): ZenMux model discovery serves the live catalog incl. …
diegosouzapw Jun 18, 2026
1cdbf73
feat(compression): show an engine node for single-engine runs in the …
diegosouzapw Jun 18, 2026
fe54821
docs(api): document /api/v1/ws chat WebSocket endpoint in openapi.yam…
diegosouzapw Jun 18, 2026
d055b5b
fix(dashboard): make provider card hover visible (was ~invisible 1% o…
diegosouzapw Jun 18, 2026
5f93ae7
feat(dashboard): TPROXY decrypt capture toggle in Traffic Inspector (…
diegosouzapw Jun 18, 2026
9a358c8
feat(compression): live per-engine streaming via compression.step (F3…
diegosouzapw Jun 19, 2026
7d89c18
test(chatcore): dedicated unit tests for 6 leaves + wire into stryker…
diegosouzapw Jun 19, 2026
f19d4b5
fix(sse): map reasoning_effort to DeepSeek V4's native {high, max} vo…
diegosouzapw Jun 19, 2026
2089e5c
feat(compression): runnable A/B benchmark CLI (F2.4) (#4220)
diegosouzapw Jun 19, 2026
eef9d20
feat(compression): wire MCP tool-cardinality reduction (F4.3, opt-in)…
diegosouzapw Jun 19, 2026
90507a8
test(chatcore): tests for telemetry/memory-skills/semantic-cache + wi…
diegosouzapw Jun 19, 2026
afc1a16
chore(compression): remove dead exports + fix stale llmlingua docs (#…
diegosouzapw Jun 19, 2026
0e95c45
feat(sse): adapt the Xiaomi MiMo call flow to its native thinking/vis…
diegosouzapw Jun 19, 2026
90c4224
test(chatcore): semanticCache HIT-path fixture + wire into stryker mu…
diegosouzapw Jun 19, 2026
8b73b37
chore(compression): remove vestigial reconstructCcr/SessionDedup roun…
diegosouzapw Jun 19, 2026
a044246
fix(sse): adapt the Claude flow to Opus 4.7+ adaptive-thinking + fixe…
diegosouzapw Jun 19, 2026
7f4d5f1
fix(mitm): forward anti-loop — put the bypass-marked socket on the Ag…
diegosouzapw Jun 19, 2026
89824fb
feat(compression): honor the per-filter RTK deduplicate flag (#4231)
diegosouzapw Jun 19, 2026
48773fa
fix(combo): opt proactive-fallback compression into TV1 bail-out (no …
diegosouzapw Jun 19, 2026
2911035
fix(dashboard): data tables paint an opaque surface so the grid doesn…
diegosouzapw Jun 19, 2026
910a202
chore(build): build + ship the TPROXY native addon in the standalone …
diegosouzapw Jun 19, 2026
5847610
feat(ci): wire the F2.4 compression budget-gate ratchet (#4232)
diegosouzapw Jun 19, 2026
35166dc
feat(quality): Onda 2 mutation-gate tooling — radiography classifier …
diegosouzapw Jun 19, 2026
86c9c46
feat(routing): advertise auto/cheap, auto/offline, auto/smart combos …
diegosouzapw Jun 19, 2026
60c32f9
feat(compression): make mcpAccessibility config reachable via setting…
diegosouzapw Jun 19, 2026
92eac63
feat(compression): expose the WaterfallInspector via a Canvas/Waterfa…
diegosouzapw Jun 19, 2026
ebd341e
feat(routing): OpenRouter-style auto/<category>:<tier> combos (#4235)…
diegosouzapw Jun 19, 2026
03141b1
feat(compression): wire RTK comment-stripping config + honor preserve…
diegosouzapw Jun 19, 2026
e5cf67c
feat(compression): honor the registry enabled flag in the stacked loo…
diegosouzapw Jun 19, 2026
32c2ee8
feat(compression): add a transcript loader to the replay harness (#4246)
diegosouzapw Jun 19, 2026
cb3119c
fix(providers): GPT-5 Codex/OpenAI param gaps — conditional sampling …
diegosouzapw Jun 19, 2026
f06e63f
feat(api): cost-telemetry parity — X-OmniRoute-* headers em todos os …
diegosouzapw Jun 19, 2026
3bc1a0f
refactor(compression): remove vestigial SLM seam + dead deprecated al…
diegosouzapw Jun 19, 2026
1079fc3
feat(cloud-agent): Cursor Cloud Agent via official REST API key (#422…
diegosouzapw Jun 19, 2026
5cb3cf8
fix(providers): Vercel AI Gateway import lists the live /v1/models ca…
diegosouzapw Jun 19, 2026
a1a9f37
feat(compression): wire ultra's modelPath/slmFallbackToAggressive to …
diegosouzapw Jun 19, 2026
a83409e
feat(cli): remote mode — drive a remote OmniRoute with scoped access …
diegosouzapw Jun 19, 2026
afcfb7b
fix(glm): default max_tokens and extended timeout for GLM-5.2+ thinki…
dhaern Jun 19, 2026
526e5df
ci(mutation): restore cold-seed timeout for a/b (lost in #4225 squash…
diegosouzapw Jun 19, 2026
4ba7f32
feat(deploy): keep optional deps on update (--include=optional) (#4260)
diegosouzapw Jun 19, 2026
e73b025
fix(release): reconcile v3.8.29 cycle gate/test drift surfaced at rel…
diegosouzapw Jun 19, 2026
da000fd
chore(release): v3.8.29 — 2026-06-19 (full CHANGELOG + 41 i18n mirrors)
diegosouzapw Jun 19, 2026
2de71dd
chore(quality): reconcile v3.8.29 cycle gate drift (eslint baseline +…
diegosouzapw Jun 19, 2026
dbb4199
chore(quality): tighten coverage.auth + openapi baselines for v3.8.29…
diegosouzapw Jun 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
33 changes: 33 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,15 @@ ALLOW_API_KEY_REVEAL=false
# PII_RESPONSE_SANITIZATION=false
# PII_RESPONSE_SANITIZATION_MODE=redact # redact = mask PII | warn = log only | block = drop response

# ── VS Code Tokenized-Route Context Sanitizer ──
# Strips implicit active-editor context (editorContext/activeEditor/currentFile/
# selection/openTabs…) from requests on the /v1/vscode/[token]/* routes before
# forwarding upstream, and redacts the content of explicitly-attached sensitive
# files (.env, private keys, kubeconfig, credentials/secrets). Explicit
# attachments otherwise pass through. Secure-by-default: ON unless set to 0.
# Used by: src/app/api/v1/vscode/contextSanitizer.ts
# OMNIROUTE_VSCODE_SANITIZE_CONTEXT=1 # set to 0 to disable

# ═══════════════════════════════════════════════════════════════════════════════
# 6. TOOL & ROUTING POLICIES
# ═══════════════════════════════════════════════════════════════════════════════
Expand Down Expand Up @@ -465,6 +474,11 @@ NEXT_PUBLIC_ENABLE_SOCKS5_PROXY=true
# Legacy alias for OMNIROUTE_API_KEY.
# ROUTER_API_KEY=

# CLI remote-mode context/profile for `omniroute` commands (overrides the active
# context in the local contexts store). Equivalent to the `--context <name>` flag.
# Used by: bin/cli/program.mjs, bin/cli/api.mjs (remote mode).
# OMNIROUTE_CONTEXT=

# Enforce scope-based access control on MCP tool calls.
# Used by: open-sse/mcp-server/server.ts — rejects calls outside allowed scopes.
# OMNIROUTE_MCP_ENFORCE_SCOPES=false
Expand Down Expand Up @@ -1250,6 +1264,25 @@ APP_LOG_TO_FILE=true
# Accepted values: true|1|on (enable). Unset or anything else = disabled (default).
# PROVIDER_COOLDOWN_ENABLED=true

# Transparent stream recovery (free-claude-code port). When enabled, the opening SSE
# window is briefly held (up to STREAM_RECOVERY.HOLDBACK_MS) so an upstream truncation
# before any byte reaches the client can be retried invisibly. Opt-in: holding the
# window adds up to that much time-to-first-token latency on every stream, so it is
# OFF by default. Seeds ResilienceSettings.streamRecovery.enabled.
# Used by: open-sse/services/streamRecovery.ts, open-sse/handlers/chatCore.ts
# Accepted values: true|1|on (enable). Unset or anything else = disabled (default).
# STREAM_RECOVERY_ENABLED=true

# Mid-stream continuation (Fase 4.4): when an upstream stream truncates AFTER bytes
# already reached the client, re-request with the partial text as an assistant prefill
# and stitch the missing suffix (plain-text OpenAI-compatible streams only; never with a
# tool call in flight). OFF by default — the recovered tail arrives as one burst, not
# token-by-token. Independent of STREAM_RECOVERY_ENABLED (different risk profile).
# Seeds ResilienceSettings.streamRecovery.continueMidStream.
# Used by: open-sse/services/streamRecovery.ts, open-sse/handlers/chatCore.ts
# Accepted values: true|1|on (enable). Unset or anything else = disabled (default).
# STREAM_RECOVERY_MIDSTREAM_ENABLED=true

# Stagger interval (ms) between provider token healthchecks at startup.
# Used by: src/lib/tokenHealthCheck.ts. Default: 3000.
# HEALTHCHECK_STAGGER_MS=3000
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,8 @@ jobs:
run: npm run check:cognitive-complexity
- name: Type coverage ratchet
run: npm run check:type-coverage
- name: Compression budget ratchet (F2.4 / N4)
run: npm run check:compression-budget
# CodeQL alerts ratchet — BLOQUEANTE (promovido de advisory na v3.8.26).
# Lê metrics.codeqlAlerts.value de quality-baseline.json e sai 1 SOMENTE numa
# regressão real (alertas abertos > baseline). Falha de medição (gh/auth/api)
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,10 @@ jobs:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
with:
persist-credentials: false
- uses: github/codeql-action/init@dd903d2e4f5405488e5ef1422510ee31c8b32357 # v3
- uses: github/codeql-action/init@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4.36.2
with:
languages: javascript-typescript
queries: security-extended
- uses: github/codeql-action/analyze@dd903d2e4f5405488e5ef1422510ee31c8b32357 # v3
- uses: github/codeql-action/analyze@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4.36.2
with:
category: "/language:javascript-typescript"
2 changes: 1 addition & 1 deletion .github/workflows/dast-smoke.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ jobs:
if curl -sf http://localhost:20128/api/monitoring/health >/dev/null; then echo up; break; fi
sleep 2
done
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
with:
python-version: "3.12"
- run: pip install schemathesis
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/docker-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -377,7 +377,7 @@ jobs:
- name: Upload Trivy SARIF to Security tab
if: needs.prepare.outputs.version != 'main'
continue-on-error: true
uses: github/codeql-action/upload-sarif@v3
uses: github/codeql-action/upload-sarif@v4
with:
sarif_file: trivy-results.sarif
category: trivy-image
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/nightly-llm-security.yml
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ jobs:
if curl -sf http://localhost:20128/api/monitoring/health >/dev/null; then echo up; break; fi
sleep 2
done
- uses: actions/setup-python@v5
- uses: actions/setup-python@v6
if: steps.gate.outputs.run == 'true'
with: { python-version: "3.12" }
- run: pip install garak
Expand Down
91 changes: 76 additions & 15 deletions .github/workflows/nightly-mutation.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,18 +9,77 @@ permissions:

jobs:
stryker:
name: Stryker mutation testing (8 critical modules — advisory)
name: Stryker mutation (batch ${{ matrix.batch.name }} — advisory)
runs-on: ubuntu-latest
# Mutation testing is expensive (~15k mutants across 8 modules). It runs only
# on the nightly schedule / manual dispatch, never on PRs. The score is NOT
# yet enforced as a ratchet (wired in a later INT phase) — for now the job
# just produces the HTML/JSON report and uploads it as an artifact.
#
# Runs at stryker concurrency=4 (was 1) now that ./tests/_setup/isolateDataDir.ts
# gives each test process its own DATA_DIR — at concurrency=1 the full phase did
# not finish inside the timeout (the cancelled 2026-06-16/17 runs). 180 min leaves
# headroom for the first cold run before the incremental cache is seeded.
timeout-minutes: 180
# Mutation testing is expensive. History of the budget:
# - Full 8-module set TIMED OUT at the 180min cap (run 27705123780 = exactly 180min).
# The two god-files chatCore.ts/combo.ts dominated ~2/3 of the mutants and were
# removed from stryker.conf.json `mutate`.
# - The remaining 6 modules in 3 batches: auth.ts and accountFallback.ts are large; the
# a (auth+publicCreds) and b (accountFallback+error) batches still ran near the 180min
# cap (the perTest dry-run over ~130 covering test files is itself costly), so the two
# big modules are now ISOLATED into their own batches (a=auth, b=accountFallback).
# - Onda 3 / Fase 9 T5 re-add: combo.ts was split into 11 leaves; the 8 well-covered
# combo/* leaves are back in `mutate` (covered by the 24 combo-*.test.ts), grouped into
# 2 batches (d=heavy, e=light). After #4204 (D7b) merged, the reset-aware quota pair
# quotaScoring/quotaStrategies was added as batch f. A covering-test audit then added the
# 6 chatCore/* leaves with direct unit coverage as batch g. A follow-up then wrote dedicated
# unit tests for 6 more leaves and added them as batch h. A final follow-up added dedicated
# tests (no mock.module — fetch-override + crafted inputs + temp-DATA_DIR) for telemetryHelpers
# + memorySkillsInjection + semanticCache (its cache-HIT block now has a setCachedResponse
# fixture) as batch i — ALL 15/15 chatCore leaves are now mutated. See
# _mutate_godfiles_excluded_comment in stryker.conf.json.
# 9 PARALLEL batches, each overriding the mutate set via `--mutate` (Stryker 9 CLI:
# `-m, --mutate <comma-list>`; the conf's `mutate[]` remains the local-run default/union).
# - Cold-seeding budget (per-batch `timeout-minutes: ${{ matrix.batch.timeout || 180 }}`):
# a COLD run must COMPLETE once to write stryker-incremental.json (Stryker writes it only on
# a successful finish); a job cancelled at the cap writes nothing, so the next run is cold
# again — an infinite never-seeds loop. actions/cache is also branch-scoped, so each branch
# (incl. release) must seed its OWN cache via a run with enough headroom. Measured cold runs
# (run 27801802713): a/b never finished even isolated; c=180min CANCELLED (4 modules),
# d=180min CANCELLED (3 combo modules), g=142min, h=132min, e=66, f=45, i=33. So a/b/c/d get
# 350min (job max 360) and g/h a 240min variance buffer; once seeded, later nightlies only
# re-test changed mutants and fit well under the default. NOTE: batch c's old "2 modules ~2h"
# assumption went stale when c grew to 4 modules — keep this budget in sync with the matrix.
# Full coverage every night in parallel; wall-clock = the slowest batch's cold run until seeded.
# Runs at stryker concurrency=4 with per-process DATA_DIR isolation
# (tests/_setup/isolateDataDir.ts) — see _concurrency_comment in stryker.conf.json.
strategy:
fail-fast: false
matrix:
batch:
# Per-batch `timeout` (minutes) tiers the cold-seeding budget by measured cost — see the
# cold-run measurements in the comment above. Batches without the key default to 180.
# a/b (large isolated modules) + c/d (4 and 3 modules, observed to exceed 180min cold) get
# 350 (GitHub-hosted job max is 360); g/h (142/132min cold — within runner-variance distance
# of the 180 cap) get a 240 buffer. e/f/i (33-66min) stay at the 180 default.
- name: a
mutate: "src/sse/services/auth.ts"
timeout: 350
- name: b
mutate: "open-sse/services/accountFallback.ts"
timeout: 350
- name: c
mutate: "src/server/authz/routeGuard.ts,src/shared/utils/circuitBreaker.ts,open-sse/utils/error.ts,open-sse/utils/publicCreds.ts"
timeout: 350
- name: d
mutate: "open-sse/services/combo/comboStructure.ts,open-sse/services/combo/autoStrategy.ts,open-sse/services/combo/validateQuality.ts"
timeout: 350
- name: e
mutate: "open-sse/services/combo/shadowRouting.ts,open-sse/services/combo/targetSorters.ts,open-sse/services/combo/comboPredicates.ts,open-sse/services/combo/rrState.ts,open-sse/services/combo/comboData.ts"
- name: f
mutate: "open-sse/services/combo/quotaScoring.ts,open-sse/services/combo/quotaStrategies.ts"
- name: g
mutate: "open-sse/handlers/chatCore/comboContextCache.ts,open-sse/handlers/chatCore/idempotency.ts,open-sse/handlers/chatCore/passthroughHelpers.ts,open-sse/handlers/chatCore/responseHeaders.ts,open-sse/handlers/chatCore/sanitization.ts,open-sse/handlers/chatCore/upstreamTimeouts.ts"
timeout: 240
- name: h
mutate: "open-sse/handlers/chatCore/headers.ts,open-sse/handlers/chatCore/logTruncation.ts,open-sse/handlers/chatCore/memoryExtraction.ts,open-sse/handlers/chatCore/nonStreamingSse.ts,open-sse/handlers/chatCore/passthroughToolNames.ts,open-sse/handlers/chatCore/executorHelpers.ts"
timeout: 240
- name: i
mutate: "open-sse/handlers/chatCore/telemetryHelpers.ts,open-sse/handlers/chatCore/memorySkillsInjection.ts,open-sse/handlers/chatCore/semanticCache.ts"
# Per-batch budget: a/b/c/d override to 350min, g/h to 240min; the rest default to 180min.
# `matrix.batch.timeout` is null for batches without the key -> `|| 180`.
timeout-minutes: ${{ matrix.batch.timeout || 180 }}
steps:
- uses: actions/checkout@v6
with:
Expand All @@ -34,17 +93,19 @@ jobs:
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
with:
path: reports/mutation/stryker-incremental.json
key: stryker-incremental-${{ github.run_id }}
restore-keys: stryker-incremental-
key: stryker-incremental-${{ matrix.batch.name }}-${{ github.run_id }}
restore-keys: stryker-incremental-${{ matrix.batch.name }}-
- name: Run Stryker (advisory)
id: stryker
continue-on-error: true
run: npx stryker run
env:
BATCH_MUTATE: ${{ matrix.batch.mutate }}
run: npx stryker run --mutate "$BATCH_MUTATE"
- name: Upload mutation report
if: always()
uses: actions/upload-artifact@v7
with:
name: mutation-report
name: mutation-report-${{ matrix.batch.name }}
path: reports/mutation/
if-no-files-found: warn
retention-days: 14
2 changes: 1 addition & 1 deletion .github/workflows/nightly-schemathesis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ jobs:
if curl -sf http://localhost:20128/api/monitoring/health >/dev/null; then echo "server up"; break; fi
sleep 2
done
- uses: actions/setup-python@v5
- uses: actions/setup-python@v6
with: { python-version: "3.12" }
- name: Install schemathesis
run: pip install schemathesis
Expand Down
Loading
Loading