Repository navigation
fix(combos): guard isActive toggle against partial-state 400 (CAS on version) - #4925
KooshaPari wants to merge 79 commits into
Conversation
* chore(release): open v3.8.34 development cycle * chore(quality): release-green pre-flight validator + nightly signal (C+D) (diegosouzapw#4622) C — scripts/quality/validate-release-green.mjs (npm run check:release-green): reproduces the release-equivalent validation (typecheck, eslint, db-rules, public-creds, full unit, vitest, ratchets, optional --with-build package-artifact) against the current working tree and classifies each red as HARD (real defect, exit 1) vs DRIFT (ratchet — reported, never affects exit / never blocks). Pure helpers exported + orchestration behind a direct-run guard; unit-tested. D — .github/workflows/nightly-release-green.yml: runs C on the active release branch nightly (and on workflow_dispatch) and opens/updates a single tracking issue on HARD failures. Never a required check, never touches a contributor PR. Closes the gap where the full gate (ci.yml) only ran on the release PR, so reds accrued silently on release/** and surfaced in 40-min layers at release time. Non-blocking by construction; drift is the maintainer's to rebaseline at release. Co-authored-by: Diego Rodrigues de Sa e Souza <diego.souza@cdwasolutions.com.br> * fix(providers): show revealed connection API keys (diegosouzapw#4583) Integrated into release/v3.8.34 * fix(resilience): respect upstream retry hint toggle (diegosouzapw#4585) Integrated into release/v3.8.34 * feat(settings): expose stream recovery feature flags (diegosouzapw#4586) Integrated into release/v3.8.34 * fix(logs): make active request stale sweep configurable (diegosouzapw#4599) Integrated into release/v3.8.34 * fix(plugin): auto-prefix providerId with 'opencode-' for OC 1.17.8+ native gate (diegosouzapw#4527) Integrated into release/v3.8.34 (supersedes diegosouzapw#4445) * fix(models): treat unknown output caps as unset (diegosouzapw#4584) Integrated into release/v3.8.34 * fix(executors): strip temperature for GitHub Copilot gpt-5.4 family (diegosouzapw#4564) Integrated into release/v3.8.34 (rebuilt onto tip) * fix(oauth): update Qwen OAuth URLs from chat.qwen.ai to qwen.ai (diegosouzapw#4561) Integrated into release/v3.8.34 (rebuilt onto tip) * fix(api/settings): prevent cached /api/settings responses (port from 9router#951) (diegosouzapw#4566) Integrated into release/v3.8.34 (rebuilt onto tip) * feat(audio): MiniMax T2A v2 TTS dispatch in audioSpeech (port diegosouzapw#1043) (diegosouzapw#4553) Integrated into release/v3.8.34 (rebuilt onto tip) * fix(dashboard): surface manual config CTA when Open Claw CLI auto-detect fails (diegosouzapw#4562) Integrated into release/v3.8.34 (rebuilt onto tip) * feat(providers): optional model ID for custom API-key validation (diegosouzapw#4555) Integrated into release/v3.8.34 (rebuilt onto tip) * fix(cli): align data dir and env loading with runtime (diegosouzapw#4607) Integrated into release/v3.8.34 (rebuilt onto tip) * fix(quota): expose Bailian quota windows (diegosouzapw#4610) Integrated into release/v3.8.34 (rebuilt onto tip) * fix: retain provider cooldowns for configured max window (diegosouzapw#4588) Integrated into release/v3.8.34 (rebuilt — bundled commits stripped) * fix: reject invalid provider cooldown bounds (diegosouzapw#4589) Integrated into release/v3.8.34 (rebuilt — bundled commits stripped) * fix: preserve production combo metrics on shadow eviction (diegosouzapw#4590) Integrated into release/v3.8.34 (rebuilt — bundled commits stripped) * fix(stream): estimate input tokens when upstream reports prompt_tokens=0 (diegosouzapw#4615) Integrated into release/v3.8.34 (rebuilt onto tip) * fix(catalog): shorten no-thinking gateway prefix to no-think/ (diegosouzapw#4525) Integrated into release/v3.8.34 (rebuilt — kept only the prefix rename, dropped stale-base reverts) * fix(relay): apply IP rate limit to bifrost sidecar (diegosouzapw#4593) Integrated into release/v3.8.34 (rebuilt onto tip; merge before diegosouzapw#4612) * fix(bifrost): finalize SSE relay usage after stream (diegosouzapw#4612) Integrated into release/v3.8.34 (rebuilt + reconciled with diegosouzapw#4593) * feat(compression): per-request `x-omniroute-compression` header (Phase 3) (diegosouzapw#4645) * docs(compression): Phase 3 per-request header design spec Approved brainstorming output for the x-omniroute-compression header: header-first precedence, name-first combo matching (Decision A), explicit value bypasses auto-trigger (Decision B), DerivedPlan.source, and the X-OmniRoute-Compression response header. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * docs(compression): Phase 3 per-request header implementation plan 4-task TDD plan (resolver header-first + source, parser, chatCore wiring + response header, docs/file-size) with full code and exact commands. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * feat(compression): header-first resolver + plan source (Phase 3 core) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * feat(compression): resolveCompressionHeader parser (Phase 3) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * feat(compression): wire x-omniroute-compression header + response header (Phase 3) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * refactor(compression): extract plan-resolution leaf (planResolution.ts) under size cap (Phase 3) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * docs(compression): document x-omniroute-compression header (Phase 3) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(compression): harden named-combo map + trim engine: header id (Phase 3 review) Addresses gemini-code-assist review on diegosouzapw#4645: - Extract buildNamedComboLookup (pure) so a blank/whitespace/null combo name contributes only its id key (no '' key, no throw that disables all combos). - Trim the engine:<id> header value so 'engine: rtk' resolves. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Diego Rodrigues de Sa e Souza <diego.souza@cdwasolutions.com.br> Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Co-authored-by: Diego Rodrigues de Sa e Souza <souzamiriamrodrigues790@gmail.com> * fix: exclude exhausted connections from auto scoring (diegosouzapw#4592) Integrated into release/v3.8.34 (rebuilt + opt-in gate fix) * fix(dashboard): memoize compatible provider groups (diegosouzapw#4613) Integrated into release/v3.8.34 (rebuilt + test added) * fix(dashboard): isolate quota widget refresh clock (diegosouzapw#4611) Integrated into release/v3.8.34 (rebuilt + jsdom test) * fix(dashboard): gate topology side effects behind widget visibility (diegosouzapw#4606) Integrated into release/v3.8.34 (rebuilt + jsdom test) * fix(dashboard): keep play_arrow spinning on provider Test All buttons (diegosouzapw#4563) Integrated into release/v3.8.34 (rebuilt onto tip; UI-cosmetic per owner) * fix(db): schedule retention cleanup + fix cleanup table/column names (extracted from diegosouzapw#4428) (diegosouzapw#4691) Integrated into release/v3.8.34 (cleanup core extracted from diegosouzapw#4428, credit @oyi77) * fix(telemetry): back off live-WS event forwarding when the sidecar is unreachable (diegosouzapw#4604) (diegosouzapw#4687) Co-authored-by: Diego Rodrigues de Sa e Souza <souzamiriamrodrigues790@gmail.com> * fix(api): serve GET /v1/models/{model} as JSON, not the HTML dashboard (diegosouzapw#4674) (diegosouzapw#4677) Co-authored-by: Diego Rodrigues de Sa e Souza <souzamiriamrodrigues790@gmail.com> * feat(opencode): add go deepseek reasoning variants (diegosouzapw#4647) Integrated into release/v3.8.34 * fix(executors): robust deepseek-web tool-call parsing and agentic context retention (diegosouzapw#4644) Integrated into release/v3.8.34 * fix(cli): authenticate `omniroute logs` and honor active context (diegosouzapw#4638) Integrated into release/v3.8.34 (authored by Rahul Sharma, AI co-author trailer stripped per project policy) * fix(proxy): apply pipelining:0 + connections cap to the direct dispatcher (diegosouzapw#4580) (diegosouzapw#4684) Co-authored-by: Diego Rodrigues de Sa e Souza <souzamiriamrodrigues790@gmail.com> * fix(executors): Firecrawl web_fetch 500 with include_metadata=true (diegosouzapw#4692) Integrated into release/v3.8.34 * fix(routing): include all noAuth models in auto-combos + add reka-flash + best-free template (diegosouzapw#4621) Integrated into release/v3.8.34 (dead getFirstRegistryModelId dropped, rebuilt onto tip) * fix(dashboard): gate home topology live-WS networking (diegosouzapw#4596) (diegosouzapw#4618) Integrated into release/v3.8.34 (adapted onto diegosouzapw#4606's extracted topology section: default-hidden flip + enabled gate on useLiveDashboard) * fix(cli): align `omniroute` env loading with the runtime data dir (diegosouzapw#4597) (diegosouzapw#4619) Integrated into release/v3.8.34 (data-dir.mjs refactor reconciled with diegosouzapw#4607; loadEnvFile aligned to getDefaultDataDir) * chore(quality): reconcile file-size baseline for diegosouzapw#4644 (deepseek-web.ts 1117->1125) (diegosouzapw#4695) file-size reconcile for diegosouzapw#4644 * Support quota scraping for OpenCode Go and Ollama Cloud (diegosouzapw#4642) Integrated into release/v3.8.34 (Ollama Cloud + OpenCode Go dashboard quota scraping; rebuilt onto tip, gates green: typecheck/public-creds/file-size/lint/docs-sync + 31 tests) * feat(executors): land M365 Copilot pure framing + connection helpers (diegosouzapw#4042) (diegosouzapw#4696) Land M365 pure modules ahead of draft diegosouzapw#4400 * deps: bump production + development groups; migrate js-yaml to v5 ESM (diegosouzapw#4697) Incorporates Dependabot diegosouzapw#4667 + diegosouzapw#4668 + js-yaml v5 ESM migration into release/v3.8.34 * fix: noAuth provider validation + kimi executor routing (diegosouzapw#4699) Integrated into release/v3.8.34 (noAuth in NOAUTH_PROVIDERS dynamic check + remove misrouted kimi web alias; 9 tests) * refactor(imageGeneration): extract 8 provider families to co-located files (diegosouzapw#4609) Integrated into release/v3.8.34 (extraction completed: added missing imports/exports per module, main imports handlers locally; 145 image-gen tests pass, typecheck/cycles/file-size green) * chore(release): v3.8.34 — finalize changelog, rebaseline drift, fix release-green reds - Finalize CHANGELOG [3.8.34] (43 bullets, full contributor attribution) + seed i18n mirrors - Rebaseline inherited cycle drift surfaced by release-green pre-flight: eslint warnings 3900->3907, cognitive-complexity 797->801 (release-finalize touches no prod code; all drift is from this cycle's contributor merges) - fix(providers): keep reka-flash-3 as the Reka provider default. diegosouzapw#4621 inserted reka-flash at the head of the model list, silently changing the default from reka-flash-3 (the free-tier model) to reka-flash; reorder so reka-flash-3 stays default, reka-flash retained. - test: align provider-models-config / provider-models-route / web-cookie-providers-new with diegosouzapw#4621 (reka-flash now in the Reka catalog) and diegosouzapw#4699 (the `kimi` API-key provider correctly falls through to DefaultExecutor instead of KimiWebExecutor) - chore(quality): allowlist the COMPRESSION_GUIDE doc name in check-fabricated-docs (false-positive env-var match; docs/compression/COMPRESSION_GUIDE.md exists) * fix(release-green): resolve release-PR full-CI reds for v3.8.34 Surfaced only on the release PR (these gates don't run on PR->release fast-gates): - fix(quota): complete HTML-comment sanitization in opencodeOllamaUsage SSR reset-time parsing — strip any <!--...--> generically instead of the two literal React hydration markers, so no partial "<!--" can survive (CodeQL js/incomplete-multi-character- sanitization, HIGH, introduced by diegosouzapw#4642). Regression test added. - test(codex): correct the Codex-fingerprint body key order assertion to match the canonical bodyFieldOrder (prompt_cache_key precedes include); diegosouzapw#4584 flipped the two and integration tests don't run on fast-gates so it never executed until the release PR. - chore(quality): rebaseline inherited cycle drift surfaced by full CI — zizmorFindings 152->155 (+3 unpinned-uses in nightly-release-green.yml from diegosouzapw#4622, same @vn convention as ci.yml) and openapiCoverage.pct 38.4->37.8 (-0.6, contributor routes added faster than openapi docs). Release-finalize touches no prod routes. * fix(release-green): complete CodeQL sanitization + rebaseline complexity drift - fix(quota): handle unterminated HTML comments in opencodeOllamaUsage SSR reset-time parsing — the `(?:-->|$)` arm consumes a trailing "<!--" with no closing "-->", so no partial "<!--" can survive (CodeQL js/incomplete-multi-character-sanitization persisted with the plain <!--...--> form because an unclosed comment could still leave "<!--"). - chore(quality): rebaseline cyclomatic complexity 1915->1916 (+1) — inherited v3.8.34 cycle drift (contributor feature branches); check:complexity does not run on PR->release fast-gates so it surfaced only on the release PR. Release-finalize adds 0 complexity (measured 1916 with/without the regex tweak). dead-code/cognitive/type-coverage/ compression-budget/codeql ratchets all pass. --------- Co-authored-by: Diego Rodrigues de Sa e Souza <diego.souza@cdwasolutions.com.br> Co-authored-by: Randi <55005611+rdself@users.noreply.github.com> Co-authored-by: Hernan Javier Ardila Sanchez <hjasgr@gmail.com> Co-authored-by: KooshaPari <42529354+KooshaPari@users.noreply.github.com> Co-authored-by: Abhishek Divekar <adivekar@utexas.edu> Co-authored-by: Rahul sharma <sharmaR0810@gmail.com> Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Co-authored-by: Diego Rodrigues de Sa e Souza <souzamiriamrodrigues790@gmail.com> Co-authored-by: Ronald Estacion <DevEstacion@users.noreply.github.com> Co-authored-by: Igor <60442260+BugsBag@users.noreply.github.com> Co-authored-by: Oonishi <275808243+ponkcore@users.noreply.github.com> Co-authored-by: Paijo <14921983+oyi77@users.noreply.github.com> Co-authored-by: Jan Leon <Jan.gaschler@gmail.com>
* chore(release): open v3.8.35 development cycle * fix db vacuum scheduler settings (diegosouzapw#4726) Scheduled VACUUM now follows Storage page settings (scheduledVacuum/vacuumHour) as single source of truth; env-flag control path removed. 11/11 vacuum-scheduler tests pass against release/v3.8.35 tip; no orphaned env refs. Integrated into release/v3.8.35. * fix(tier): noAuth providers count as free; free filter returns empty … (diegosouzapw#4753) noAuth providers now classified free (union of legacy list + NOAUTH_PROVIDERS chat-tier derivation), -free arena_elo alias, and auto/<cat>:free returns an empty pool when no free candidate matches (opt-in legacy fallback via OMNIROUTE_AUTO_FREE_FALLBACK_TO_FULL_POOL). New env var documented in .env.example + ENVIRONMENT.md; CHANGELOG bullet added (maintainer co-author). 46/46 node + 56/56 vitest tests pass on release tip; env-doc-sync, docs-sync, typecheck:core, lint, file-size all green. Integrated into release/v3.8.35. * refactor(chatCore): extrai 11 helpers de nível superior para 6 leaves puros (diegosouzapw#3501) (diegosouzapw#4571) chatCore god-file decomposition (diegosouzapw#3501): extract 6 pure leaves (cacheUsageMeta, executorClientHeaders, nonStreamingResponseBody, skillsFormat, streamErrorResult, streamFinalize) from chatCore.ts. Rebased onto release/v3.8.35 tip (resolved single chatCore.ts conflict — removed now-extracted inline buildExecutorClientHeaders). 265/265 chatcore tests, 26/26 new leaf tests, typecheck:core, cycles, file-size all green. Integrated into release/v3.8.35. * refactor(chatCore): extrai resolveExecutorWithProxy + getExecutionCredentials para leaves (diegosouzapw#3501) (diegosouzapw#4646) chatCore diegosouzapw#3501: extract resolveExecutorWithProxy + getExecutionCredentials to leaves (executorProxy.ts, executionCredentials.ts). Clean cherry-pick onto release tip post-diegosouzapw#4571. 12/12 new leaf tests, typecheck:core, cycles, file-size green. Integrated into release/v3.8.35. * refactor(chatCore): extrai transforms de mensagens Claude p/ leaf (diegosouzapw#3501) (diegosouzapw#4708) chatCore diegosouzapw#3501: extract Claude upstream-message transforms to leaf (claudeUpstreamMessages.ts + claudeMessageTypes.ts). Clean cherry-pick post-diegosouzapw#4646. 8/8 new leaf tests, typecheck/cycles/file-size green. Integrated into release/v3.8.35. * refactor(chatCore): extrai persistAttemptLogs para leaf (diegosouzapw#3501) (diegosouzapw#4717) chatCore diegosouzapw#3501: extract persistAttemptLogs to leaf (attemptLogging.ts). Rebased onto release tip post-diegosouzapw#4708 (resolved imports conflict: kept tip's resolveCompressionHeader from compression Phase 3, dropped now-unused logTruncation import moved into the leaf). 288/288 chatcore tests, typecheck/cycles/file-size green. Integrated into release/v3.8.35. * refactor(chatCore): extrai stageTrace + compressionUsageReceipt para leaves (diegosouzapw#3501) (diegosouzapw#4721) chatCore diegosouzapw#3501: extract stageTrace + compressionUsageReceipt to leaves. Clean cherry-pick post-diegosouzapw#4717. 6/6 new leaf tests, typecheck/cycles/file-size green. Integrated into release/v3.8.35. * refactor(chatCore): extrai prepareUpstreamBody (1ª sub-fatia do executeProviderRequest, diegosouzapw#3501) (diegosouzapw#4730) chatCore diegosouzapw#3501: extract prepareUpstreamBody (first sub-slice of executeProviderRequest) to leaf (upstreamBody.ts). Clean cherry-pick post-diegosouzapw#4721. 7/7 new leaf tests, full 301/301 chatcore suite, typecheck/cycles/file-size green. Completes the 6-PR chatCore decomposition stack into release/v3.8.35. * fix(db): make db-backup import size cap configurable (diegosouzapw#4719) (diegosouzapw#4757) Co-authored-by: Diego Rodrigues de Sa e Souza <souzamiriamrodrigues790@gmail.com> * chore(quality): expand check:release-green to the FULL release-PR gate set (diegosouzapw#4758) The release-green pre-flight (Solution C) previously covered only a subset of the gates that run exclusively on the release PR (PR→main), so reds still accrued silently on release/** and surfaced in ~40-min layers at release time (v3.8.34: 3 CI rounds — CodeQL sanitization, then the fail-fast Quality Ratchet revealing openapi then cyclomatic-complexity one push at a time, plus zizmor/integration). Now check:release-green reproduces the COMPLETE release-PR gate set and reports EVERY red in one pass (collected, not fail-fast): - New DRIFT ratchets (report-only, rebaselined at release, never block): cyclomatic complexity, dead-code, type-coverage, compression-budget, openapi-coverage, workflow-lint (zizmor), codeql-ratchet. - New HARD gates (real defects): docs-all (fabricated-docs strict + i18n mirror sync) and the integration test suite (gated behind !--quick). The only release-PR gates it still cannot reproduce locally are GitHub-side CodeQL semantic analysis and SonarQube/SonarCloud (external services). The nightly-release-green workflow and /green-prs inherit the expanded coverage automatically (they invoke this script), so cycle drift is now surfaced continuously and the release PR is green on its first CI run. Co-authored-by: Diego Rodrigues de Sa e Souza <souzamiriamrodrigues790@gmail.com> * fix(dashboard): add missing onboarding.tiers step title (diegosouzapw#4698) (diegosouzapw#4755) Co-authored-by: Diego Rodrigues de Sa e Souza <souzamiriamrodrigues790@gmail.com> * feat(compression): Output Styles registry + D0 telemetry (Phase 4A) (diegosouzapw#4694) Phase 4A: Output Styles registry + D0 telemetry. Integrated into release/v3.8.35. * feat(compression): SLM tier for ultra (Phase 4B) [stacked on diegosouzapw#4694] (diegosouzapw#4707) Phase 4B: SLM tier for ultra. Integrated into release/v3.8.35. * feat(compression): context-budget adaptive compression (Phase 4C) [stacked on diegosouzapw#4707] (diegosouzapw#4716) Phase 4C: adaptive context-budget compression. Integrated into release/v3.8.35. * feat(compression): offline evaluation harness (Phase 4 D1) [stacked on diegosouzapw#4716] (diegosouzapw#4720) Phase 4 D1: offline evaluation harness. Integrated into release/v3.8.35. * fix(sse): deepseek-web folds role:tool results into prompt transcript (diegosouzapw#4712) (diegosouzapw#4756) Co-authored-by: Diego Rodrigues de Sa e Souza <souzamiriamrodrigues790@gmail.com> * fix(dashboard): remove dead unconditional useLiveRequests call in HomePageClient (diegosouzapw#4759, diegosouzapw#4745, diegosouzapw#4596) (diegosouzapw#4761) Co-authored-by: Diego Rodrigues de Sa e Souza <souzamiriamrodrigues790@gmail.com> * fix(dashboard): dedupe provider nodes by id on compatible-provider add (diegosouzapw#4746) (diegosouzapw#4768) Co-authored-by: Diego Rodrigues de Sa e Souza <souzamiriamrodrigues790@gmail.com> * chore(db): re-export compressionRunTelemetry from localDb to satisfy db-rules (diegosouzapw#4775) Co-authored-by: Diego Rodrigues de Sa e Souza <souzamiriamrodrigues790@gmail.com> * docs(security): add canonical STRIDE-based threat model (diegosouzapw#4783) Canonical STRIDE threat model. Integrated into release/v3.8.35. * test(dashboard): add smoke test for home client dashboard (diegosouzapw#4793) Smoke test guarding the dashboard home client render (regression diegosouzapw#4745/diegosouzapw#4759). Code fix already landed via diegosouzapw#4761; this PR's jsdom smoke test is the net-new regression guard. Integrated into release/v3.8.35. * fix(combos): auto-promote zeroLatencyOptimizationsEnabled so legacy configs (pre-3.8.33 fallbackCompressionMode="lite") round-trip on the first GUI edit (diegosouzapw#4774) Auto-promote zeroLatencyOptimizationsEnabled + strip v3.8.31-era removed keys so legacy combo configs round-trip through PUT /api/combos/{id} on first GUI edit (closes diegosouzapw#4382 followup). Pre-merge: rewrote the now-stale reject test to assert auto-promotion + added passthrough/round-trip regression guards; reconciled combos/page.tsx file-size baseline. Integrated into release/v3.8.35. * refactor(chatCore): extrai parse + usage-stats não-streaming do executeProviderRequest (diegosouzapw#3501) (diegosouzapw#4762) chatCore diegosouzapw#3501: extract parseNonStreamingResponseBody + recordNonStreamingUsageStats. Integrated into release/v3.8.35. * refactor(chatCore): extrai recordContextEditingTelemetryHook (diegosouzapw#3501) (diegosouzapw#4779) chatCore diegosouzapw#3501: extract recordContextEditingTelemetryHook. Integrated into release/v3.8.35. * refactor(chatCore): extrai recordCompressionCacheStats (diegosouzapw#3501) (diegosouzapw#4792) chatCore diegosouzapw#3501: extract recordCompressionCacheStats. Integrated into release/v3.8.35. * refactor(chatCore): extrai writeCavemanOutputAnalytics (diegosouzapw#3501) (diegosouzapw#4794) chatCore diegosouzapw#3501: extract writeCavemanOutputAnalytics. Integrated into release/v3.8.35. * refactor(chatCore): extrai scheduleQuotaShareConsumption (POST-hook não-streaming, diegosouzapw#3501) (diegosouzapw#4780) chatCore diegosouzapw#3501: extract scheduleQuotaShareConsumption (non-streaming POST-hook). Integrated into release/v3.8.35. * refactor(chatCore): extrai emitRequestGamificationEvent (helper compartilhado DRY, diegosouzapw#3501) (diegosouzapw#4776) chatCore diegosouzapw#3501: extract emitRequestGamificationEvent (DRY streaming/non-streaming). Integrated into release/v3.8.35. * refactor(chatCore): extrai runPluginOnResponseHook (diegosouzapw#3501) (diegosouzapw#4782) chatCore diegosouzapw#3501: extract runPluginOnResponseHook. Integrated into release/v3.8.35. * refactor(chatCore): extrai scheduleStreamingQuotaShareConsumption (POST-hook streaming, diegosouzapw#3501) (diegosouzapw#4784) chatCore diegosouzapw#3501: extract scheduleStreamingQuotaShareConsumption (streaming POST-hook). Integrated into release/v3.8.35. * refactor(chatCore): extrai recordStreamingUsageStats (analytics de usage streaming, diegosouzapw#3501) (diegosouzapw#4791) chatCore diegosouzapw#3501: extract recordStreamingUsageStats. Integrated into release/v3.8.35. * refactor(chatCore): extrai recordStreamingCost (custo por-request streaming, diegosouzapw#3501) (diegosouzapw#4790) chatCore diegosouzapw#3501: extract recordStreamingCost (per-request streaming cost). Integrated into release/v3.8.35. * docs(readme): credit ponytail + OmniCompress; restore env-doc-sync release-green (diegosouzapw#4799) README compression credits (ponytail/OmniCompress) + env-doc-sync ignore for eval-only OMNIROUTE_EVAL_CREDENTIALS (restores release-green after diegosouzapw#4720). Integrated into release/v3.8.35. * chore(quality): trim combo-config.test.ts comments under file-size cap (diegosouzapw#4774 follow-up) (diegosouzapw#4800) Restore file-size release-green. Integrated into release/v3.8.35. * feat(api-docs): Redoc-rendered /api/docs + consolidate OpenAPI spec to docs/openapi.yaml (diegosouzapw#4781) Redoc /api/docs + OpenAPI spec consolidated to docs/openapi.yaml (canonical 201-path complete spec; old path → legacy fallback). All refs/gates/tests/CI updated. Integrated into release/v3.8.35. * docs(compression): declare Phase 4 layers — Output Styles, adaptive dial, per-request control (diegosouzapw#4801) The README compression section listed the 9 input engines but not the Phase 4 layers now in production: - Output Styles (output-axis steering: terse-prose / less-code / terse-cjk, lite/full/ultra) - adaptive context-budget dial (reserve-output|percentage|absolute · floor|replace-autotrigger|off) - per-request x-omniroute-compression precedence + the offline eval harness Also bumped the highlights range to v3.8.35, expanded the compression feature bullet, and marked the GUIDE's Phase 4 row Shipped (was 'Planned' — it's merged on v3.8.35). Co-authored-by: Diego Rodrigues de Sa e Souza <souzamiriamrodrigues790@gmail.com> Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * chore(release): finalize v3.8.35 CHANGELOG + docs reconciliation - CHANGELOG: complete 3.8.35 section (all 35 commits since v3.8.34, contributor attribution: @rdself @megamen32 @KooshaPari @JxnLexn) - docs(security): align THREAT_MODEL.md refs with real code (routeGuard.ts, tokenLimits.ts, /api/monitoring/health) — fabricated-docs gate - check:fabricated-docs: skip docs/superpowers/specs (dated research reports) - i18n: sync 3.8.35 section into 41 CHANGELOG mirrors (docs-sync size gate) - ratchet rebaseline: cyclomatic 1916->1920, eslintWarnings 3907->3912 (inherited cycle drift; release-finalize diff is docs-only) * fix(release): resolve inherited base-reds surfaced by v3.8.35 release CI Cycle base-reds that only run on PR→main (not the PR→release fast-path): - test(autoCombo): suffixComposition-4517 used node:test in a vitest-only dir (diegosouzapw#4753) → vitest found no suite. Switch to the vitest API. (Vitest job) - test(agentSkills): openapiParser fixture wrote docs/reference/openapi.yaml; parser reads docs/openapi.yaml since diegosouzapw#4781 → point fixture at the new path. (Unit/Coverage/Node24/Node26 shard 4) - test(integration): proxy-pipeline source-scan expected inline streaming-cost code that diegosouzapw#4790/diegosouzapw#3501 extracted to the recordStreamingCost leaf → assert the delegation instead. (Integration 1/2) - fix(chatCore): derive the log trace id from crypto, not Math.random (CodeQL js/insecure-randomness — log-correlation id, not a secret). - test(resilience): circuit-breaker invalid-cooldown fallback asserted t>29000, flaking on slow CI where ~1.6s elapsed gave t=28401 → tolerate wall-clock drift (t>25000). (Unit 6/8) * fix(usage): derive pending-request id from crypto, not Math.random CodeQL js/insecure-randomness (#669): the pending-request id generated in trackPendingRequest (usageHistory.ts) flows into attempt logging and was flagged as insecure randomness in a security context. It's a log-correlation id, not a secret — switch to crypto RNG to clear the alert. Pairs with the chatCore traceId fix in 37c4978 (same sink). --------- Co-authored-by: Diego Rodrigues de Sa e Souza <souzamiriamrodrigues790@gmail.com> Co-authored-by: Randi <55005611+rdself@users.noreply.github.com> Co-authored-by: Demiurge The Single <megamen932@gmail.com> Co-authored-by: KooshaPari <42529354+KooshaPari@users.noreply.github.com> Co-authored-by: Jan Leon <Jan.gaschler@gmail.com> Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
) (diegosouzapw#4826) Integrated into release/v3.8.36 (diegosouzapw#3501 chatCore extraction stack 1/13)
…iegosouzapw#3501) (diegosouzapw#4824) Integrated into release/v3.8.36 (diegosouzapw#3501 chatCore extraction stack 2/13)
… (diegosouzapw#4811) Integrated into release/v3.8.36 (diegosouzapw#3501 chatCore extraction stack 3/13)
… completo, diegosouzapw#3501) (diegosouzapw#4817) Integrated into release/v3.8.36 (diegosouzapw#3501 chatCore extraction stack 4/13)
…diegosouzapw#4827) Integrated into release/v3.8.36 (diegosouzapw#3501 chatCore extraction stack 5/13)
… usage non-streaming, diegosouzapw#3501) (diegosouzapw#4832) Integrated into release/v3.8.36 (diegosouzapw#3501 chatCore extraction stack 6/13)
…ardrail post-call, diegosouzapw#3501) (diegosouzapw#4831) Integrated into release/v3.8.36 (diegosouzapw#3501 chatCore extraction stack 7/13)
…n-streaming, diegosouzapw#3501) (diegosouzapw#4828) Integrated into release/v3.8.36 (diegosouzapw#3501 chatCore extraction stack 8/13)
…de resposta non-streaming, diegosouzapw#3501) (diegosouzapw#4835) Integrated into release/v3.8.36 (diegosouzapw#3501 chatCore extraction stack 9/13)
… JSON→SSE streaming, diegosouzapw#3501) (diegosouzapw#4833) Integrated into release/v3.8.36 (diegosouzapw#3501 chatCore extraction stack 10/13)
…de resposta streaming, diegosouzapw#3501) (diegosouzapw#4836) Integrated into release/v3.8.36 (diegosouzapw#3501 chatCore extraction stack 11/13)
…-store streaming, diegosouzapw#3501) (diegosouzapw#4829) Integrated into release/v3.8.36 (diegosouzapw#3501 chatCore extraction stack 12/13)
…orms streaming, diegosouzapw#3501) (diegosouzapw#4837) Integrated into release/v3.8.36 (diegosouzapw#3501 chatCore extraction stack 13/13)
…ease-acceleration) (diegosouzapw#4857) * feat(quality): add check:test-runner-api gate (vitest-only dirs must use vitest API) * feat(release): reusable CHANGELOG i18n-mirror sync script * chore(ops): add prune-stale-worktrees.sh (dry-run by default) * ci(quality): run test-runner-api + docs-all + vitest + full unit suite on PR->release fast-path --------- Co-authored-by: Diego Rodrigues de Sa e Souza <souzamiriamrodrigues790@gmail.com>
…) + limite EPSILON não bloqueia (diegosouzapw#4830) Integrated into release/v3.8.36 — quota-exclusive qtSd/ listing (diegosouzapw#4806) + EPSILON placeholder no longer blocks; rebuilt from stale base (3 defining commits cherry-picked clean over release tip)
…) (diegosouzapw#4769) Integrated into release/v3.8.36 — Google Flow video-generation provider (diegosouzapw#4569), release-green validated (typecheck + 21 tests + file-size)
…_CREDENTIALS (diegosouzapw#4694, diegosouzapw#4720) (diegosouzapw#4796) Integrated into release/v3.8.36 — auth on compression run-telemetry + OMNIROUTE_EVAL_CREDENTIALS doc, release-green validated (typecheck + 3 tests + env-doc-sync)
…rough (port from 9router#1157) (diegosouzapw#4624) Integrated into release/v3.8.36 — port (rebuilt from stale base; defining commit cherry-picked clean over release tip, release-green validated)
…rmat providers (diegosouzapw#4625) Integrated into release/v3.8.36 — port (rebuilt from stale base; defining commit cherry-picked clean over release tip, release-green validated)
…ocks (diegosouzapw#4633) Integrated into release/v3.8.36 — port (rebuilt from stale base; defining commit cherry-picked clean over release tip, release-green validated)
…thropic providers (diegosouzapw#4650) Integrated into release/v3.8.36 — port (rebuilt from stale base; defining commit cherry-picked clean over release tip, release-green validated)
…iegosouzapw#4651) Integrated into release/v3.8.36 — port (rebuilt from stale base; defining commit cherry-picked clean over release tip, release-green validated)
…apw#4654) Integrated into release/v3.8.36 — port (rebuilt from stale base; defining commit cherry-picked clean over release tip, release-green validated)
…iegosouzapw#4656) Integrated into release/v3.8.36 — port (rebuilt from stale base; defining commit cherry-picked clean over release tip, release-green validated)
…ttings (diegosouzapw#4659) Integrated into release/v3.8.36 — port (rebuilt from stale base; defining commit cherry-picked clean over release tip, release-green validated)
) (diegosouzapw#4629) Integrated into release/v3.8.36 — kiro region SSRF guard (GHSA-6mwv-4mrm-5p3m), port rebuilt clean over release tip
…egosouzapw#4628) Integrated into release/v3.8.36 — port rebuilt clean over release tip, release-green validated
Integrated into release/v3.8.36
…lover + anti-flap) (diegosouzapw#4864) Integrated into release/v3.8.36
…iegosouzapw#4861) Integrated into release/v3.8.36
….8.36 (diegosouzapw#4886) - env-doc-sync: document PIN_DROP_BACKOFF_LEVEL / PIN_DROP_GRACE_MS (added by the ccp-pin health gate diegosouzapw#4864) in .env.example + ENVIRONMENT.md. - file-size: rebaseline image-generation-handler.test.ts 1996 -> 2019 to its actual size (pre-existing drift). Co-authored-by: Diego Rodrigues de Sa e Souza <souzamiriamrodrigues790@gmail.com>
…eam (env-gated, diegosouzapw#4602) (diegosouzapw#4715) Integrated into release/v3.8.36
…gosouzapw#4863) Integrated into release/v3.8.36
…loses diegosouzapw#4873) (diegosouzapw#4877) Integrated into release/v3.8.36 (live-ws + combo-api commits; Tailscale CGNAT commit held pending opt-in/opt-out decision)
…7, Codex 0.132.0→0.142.0 (diegosouzapw#4883) Integrated into release/v3.8.36
…/Vercel (diegosouzapw#4899) Integrated into release/v3.8.36
… [Fase 3 #8] (diegosouzapw#4900) Integrated into release/v3.8.36
…o [Fase 3 #10] (diegosouzapw#4901) Integrated into release/v3.8.36
…age (diegosouzapw#4885) Integrated into release/v3.8.36
…r" (diegosouzapw#4733) Integrated into release/v3.8.36
…onarQube (diegosouzapw#4670) Integrated into release/v3.8.36
…gosouzapw#4685) Integrated into release/v3.8.36
…iegosouzapw#4690) Integrated into release/v3.8.36
…IDs, identity caveat (diegosouzapw#4718) Integrated into release/v3.8.36
…e-green, babysit, nightly) (diegosouzapw#4679) Integrated into release/v3.8.36
…(port from 9router#1321) (diegosouzapw#4639) Integrated into release/v3.8.36
…fficial Go endpoints) (diegosouzapw#4711) Integrated into release/v3.8.36
…#4676) Integrated into release/v3.8.36 (migration renumbered 103→105; endpoint plumbed through extracted usage-stats helpers)
…SStatusItem orphan (diegosouzapw#4732) Integrated into release/v3.8.36
diegosouzapw#4640) Integrated into release/v3.8.36 (relay type added to RELAY_TYPES set; dropdown UX preserved + Cloudflare item added; proxies.ts file-size rebaselined 1057→1060)
There was a problem hiding this comment.
Code Review
This pull request introduces several updates, including new environment variables in .env.example, the addition of comprehensive incident response, performance budget, and threat model documentation, and various CLI improvements such as better context forwarding in the logs command. It also modifies the OpenCode plugin to automatically prefix provider IDs with opencode- to comply with native-adapter gates, and updates the lazily installed systray2 runtime with permission fixes and child process cleanup. Review feedback highlights the need to guard against prefixing allowed native adapters like openai and anthropic in the OpenCode plugin, and to ensure a localhost fallback is provided in the logs command if getBaseUrl resolves to undefined.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
| const providerId = rawProviderId.startsWith("opencode-") | ||
| ? rawProviderId | ||
| : `opencode-${rawProviderId}`; |
There was a problem hiding this comment.
The native-adapter gate allows openai and anthropic as valid provider IDs. Prefixing them with opencode- will break configurations that explicitly use these native adapters. We should guard against prefixing if the rawProviderId is already one of the allowed native adapters.
| const providerId = rawProviderId.startsWith("opencode-") | |
| ? rawProviderId | |
| : `opencode-${rawProviderId}`; | |
| const providerId = rawProviderId.startsWith("opencode-") || rawProviderId === "openai" || rawProviderId === "anthropic" | |
| ? rawProviderId | |
| : "opencode-" + rawProviderId; |
| // Resolve the base URL the same way every other CLI command does: an explicit | ||
| // --base-url wins, otherwise fall back to the active context / env / localhost. | ||
| // Without this, `logs` always hit localhost and ignored a connected remote. | ||
| const baseUrl = opts.baseUrl || opts["base-url"] || getBaseUrl({ context: opts.context }); |
There was a problem hiding this comment.
If getBaseUrl returns undefined (e.g., when no active context is configured and no environment variables are set), baseUrl will resolve to undefined. This will cause subsequent API calls or stream connections to fail. We should provide a fallback to the default localhost URL.
| const baseUrl = opts.baseUrl || opts["base-url"] || getBaseUrl({ context: opts.context }); | |
| const baseUrl = opts.baseUrl || opts["base-url"] || getBaseUrl({ context: opts.context }) || "http://localhost:20128"; |
|
Closing — base is stale at Tracking continues on the 3 unique-value PRs (#4777 refactor, #4778 constants extraction, #4979 composite-tiers back-compat shim), all on |
Summary