Repository navigation
Release v3.8.33 - #4515
Release v3.8.33#4515
Conversation
Thanks @KooshaPari! Rebased onto release/v3.8.32 (clean cherry-pick — coexists with #4467's specialty changes, 118/118 unit + 12/12 memory-pipeline integration). Codex fingerprint ordering + memory-search contract fixes land. (cherry picked from commit 21d61c6)
…4464) Thanks @KooshaPari! Merged the core of this PR (provider-asset shrink + budget gate + usage-rollup same-day cutoff fix + test), rebuilt scoped on release/v3.8.32. On review we dropped the codeqlAlerts 0->1 baseline loosening and the off-topic changes (the codex/memory contract fixes already landed via #4474; getProviderNames removal + cognitive baseline left out). Asset gate passes, rollup 22/22. (cherry picked from commit 911e1fb)
… envelope (port from 9router#1926) (#4485) The unified thinking adapter can set Claude/OpenAI-native thinking fields (thinking, reasoning_effort, reasoning, enable_thinking, thinking_budget) at the request body root. The Antigravity envelope spreads ...passthroughFields, so these leaked into the Google Cloud Code envelope and Google rejected the request with `400 Bad input: oneOf at '/' not met` (or `Unknown name "thinking"`), breaking every reasoning/thinking model served via Antigravity (e.g. claude-opus-4-x-thinking). Extends the existing #1944 envelope strip (output_config/output_format) to also drop the whole thinking family. Gemini's own generationConfig.thinkingConfig travels inside the inner request and is unaffected, so thinking still works. Reported-by: theseven99 (decolua/9router#1926) Co-authored-by: Arcfoz <62255009+Arcfoz@users.noreply.github.com> (cherry picked from commit 5a7c1e1)
Thanks @megamen32! Rebased onto release/v3.8.32. On review (owner decision) the auto-routing quota cutoff was made OPT-IN behind QuotaPreflightSettings.enabled (default OFF, so current behavior is unchanged) and the ...eligibleTargets last-resort fallback was restored so a quota-blocked target survives as final fallback rather than vanishing. The 429-when-all-blocked guard stays for the enabled path. typecheck clean, 13/13 tests. (cherry picked from commit 1831c6e)
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
There was a problem hiding this comment.
Code Review
This pull request introduces an opt-in hard quota cutoff feature in the auto-routing strategy to filter out low-quota candidates before scoring, supported by new preflight evaluation logic. It also prevents API errors in the Antigravity executor by stripping Claude and OpenAI-native thinking fields from the request envelope, adds a provider asset validation script to the quality gates, and refactors usage analytics queries to use date strings instead of ISO strings. Feedback from the review highlights opportunities to improve defensive programming by adding null/undefined checks for window information in the quota preflight logic and safely handling undefined window names in the auto-routing thresholds.
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.
| for (const [windowName, windowInfo] of Object.entries(windows)) { | ||
| if (!Number.isFinite(windowInfo.percentUsed)) continue; |
There was a problem hiding this comment.
Add a null/undefined check for windowInfo before accessing its properties. If the upstream API or parsed object contains null or unexpected values for a window, accessing windowInfo.percentUsed will throw a TypeError at runtime.
| for (const [windowName, windowInfo] of Object.entries(windows)) { | |
| if (!Number.isFinite(windowInfo.percentUsed)) continue; | |
| for (const [windowName, windowInfo] of Object.entries(windows)) { | |
| if (!windowInfo || !Number.isFinite(windowInfo.percentUsed)) continue; |
References
- Enforce defensive programming by ensuring appropriate null/nil/undefined checks exist before object property accesses.
| resolveMinRemainingPercent: (windowName: string | null): number => { | ||
| if (windowName !== null) { |
There was a problem hiding this comment.
Use windowName != null instead of windowName !== null to safely guard against both null and undefined values at runtime. If windowName is undefined, windowName !== null evaluates to true, which will cause a crash when calling toLowerCase() inside quotaWindowLookupNames.
| resolveMinRemainingPercent: (windowName: string | null): number => { | |
| if (windowName !== null) { | |
| resolveMinRemainingPercent: (windowName: string | null | undefined): number => { | |
| if (windowName != null) { |
References
- Enforce defensive programming by ensuring appropriate null/nil/undefined checks exist before object property accesses.
…4510) Adds an MCP tool to extract URL content via the existing /v1/web/fetch endpoint (Firecrawl/Jina/Tavily). Mirrors omniroute_web_search; scope execute:search; mcp_audit logged. Integrated into release/v3.8.33.
Disambiguates display names when the same model name appears across distinct provider prefixes. Pure, non-mutating; complementary to id-dedupe. Integrated into release/v3.8.33.
Removes dead exports DOCS_TARGET_LOCALES and getLanguage (zero callers, Knip-reported) and adds config-adapter coverage test. Integrated into release/v3.8.33.
…utoff (#4398) Adds USD usage percentages and reset hints to @@om-usage and 400 quota rejections, and cuts the weekly USD window at the real observed reset via quota_snapshots instead of resetAt-7d. Rebuilt onto release/v3.8.33 (squash-base-stale; delta = 5 files/+353). Integrated into release/v3.8.33.
CI Coverage Report
Coverage artifact was not available for this run. |
…s; preserve upstream codes (#4519) Context-overflow and param-validation 400s now fall through to the next combo target (different targets have different context windows / output limits); normalizeUpstreamFailure keeps context_length_exceeded=400 and rate-limit=429. Pure predicates extracted + tested (Rule #18). The codex.ts compression seen in the raw diff was base-divergence noise, not in the feature commit. Integrated into release/v3.8.33.
Adds a scheduled SQLite VACUUM job that persists last-run state to key_value and fixes the hardcoded lastVacuumAt:null in getDatabaseSettings. Review fixes: corrected the key_value write (no updated_at column), dropped a dead/colliding migration, rewrote the test from Vitest to node:test against the real interface. Integrated into release/v3.8.33.
…okens (#4518) clampMaxTokens now uses the per-model maxOutputTokens from REGISTRY['command-code'] as the upper bound (falls back to MAX_COMMAND_CODE_TOKENS), so GLM-5.x stops being rejected for max_tokens > 131072. Rebuilt onto release/v3.8.33 (passthrough block from the PR base is already present via #2986); 3 tests added. Integrated into release/v3.8.33.
Compression config Phase 2: named profiles + single active-combo selector wired into the runtime. Integrated into release/v3.8.33.
…er (#4487) Rebuilt onto release/v3.8.33 (squash-base-stale). Integrated into release/v3.8.33.
#4488) Rebuilt onto release/v3.8.33 (squash-base-stale). Integrated into release/v3.8.33.
…on (#4434) Rebuilt onto release/v3.8.33 (squash-base-stale). Integrated into release/v3.8.33.
Rebuilt onto release/v3.8.33 (squash-base-stale). Integrated into release/v3.8.33.
#4493) Rebuilt onto release/v3.8.33 (squash-base-stale). Integrated into release/v3.8.33.
…e_limits fallback (#4494) Rebuilt onto release/v3.8.33 (squash-base-stale). Integrated into release/v3.8.33.
Integrated into release/v3.8.33
) (#4565) Closes #4438. Dedupes quota_snapshots writes for idle connections via pure quotaSnapshotChanged() gate. TDD 5/5. Admin-merged over a pre-existing, unrelated base red (model-lockout-max-cooldown.test.ts 'markAccountUnavailable local 404 ... maxCooldownMs', from #4530 incomplete wiring) proven to fail on release/v3.8.33 HEAD without this change.
…ndidate pool (#4558) Integrated into release/v3.8.33
…e renormalization (#4489) Integrated into release/v3.8.33
…r4) (#4570) Reconcile complexity baseline
…4560) Integrated into release/v3.8.33
Integrated into release/v3.8.33
Integrated into release/v3.8.33
…#4554) Integrated into release/v3.8.33
…r4 owner batch) (#4579) Reconcile complexity baseline
…ion for selection strategies (#4537) Integrated into release/v3.8.33
…h for precise lockout decay and success telemetry (#4550) (#4581) Integrated into release/v3.8.33 (cherry-pick of #4550 with stale reverts dropped; @Chewji9875 credited in CHANGELOG)
…ct id (#4421) (#4576) * fix(api): resolve compatible provider node by base type, not only exact id (#4421) * chore(quality): rebaseline db/providers.ts file-size 1050->1063 (#4421) * chore(quality): mark providerNodeSelect db-internal in db-rules allowlist (#4421) --------- Co-authored-by: Diego Rodrigues de Sa e Souza <diego.souza@cdwasolutions.com.br>
…ted base-reds - Reconcile [3.8.33] CHANGELOG to 1:1 commit coverage (51 bullets) + env contract (QUOTA_PREFLIGHT_CUTOFF_ENABLED, KIRO_VERIFY_FULL_CRC) + README What's New range. - fix(translator): dedupe the duplicate input_audio handler in geminiHelper; mp3 normalizes to canonical audio/mpeg and the data: prefix is stripped (#912/#913). - fix(auth): wire admin-configured maxCooldownMs to all 4 markAccountUnavailable model-lockout sites (#4530 follow-up — combo.ts sites were already covered). - fix(api): add src/models/ to package.json files so the published --mcp closure ships it (#3578 gate). - test: align stale expectations to intentional code (10 essential MCP tools incl. web_fetch; busy_timeout 2s cap from v3.8.32). - chore(quality): rebaseline file-size for auth.ts 2279->2289 + db-core-init.test.ts.
src/models/index.ts was added to package.json "files" so the published --mcp import closure ships it (#3578 gate); the bidirectional pack-artifact validator also needs the matching src/models/ prefix in PACK_ARTIFACT_ALLOWED_PATH_PREFIXES, otherwise it flags the newly-shipped file as an unexpected artifact. Mirrors the src/lib/ / src/sse/ entries. Covered by tests/unit/pack-artifact-policy.test.ts.
…cted set (28->29) #4576 added src/lib/db/providerNodeSelect.ts (pure node-resolution helper, not re-exported from localDb) which the audit gate correctly classifies as internal, but the regression guard's expected-set count wasn't updated → deterministic red across the unit-test shards. Aligns the expected list + count to the real module set.
…rift) Cumulative warnings drift across this cycle's parallel-session merges, surfaced only by the release PR's full CI (the Quality Ratchet doesn't run on PR→release fast-gates). My release-finalize changes contribute 0 warnings (verified). No coverage/openapi/i18n regressions.
…e drift) Pre-existing drift on origin/release/v3.8.33 surfaced by the release full CI (cognitive-complexity doesn't run on PR->release fast-gates). My release-finalize prod changes add 0 new violations to the count (verified: geminiHelper merge is intra-function; auth.ts only gained args). +4 from this cycle's combo logic (#4537/#4489/#4581). Structural shrink tracked in #3501.
|
Release v3.8.33 — full CHANGELOG in the PR body. Blocking gates green (Build, Lint, Unit Tests 8/8, Package Artifact, Quality Gates, Quality Ratchet, Docs Sync, PR Test Policy, test-vitest). Admin-merged over a Node 26 future-compat timer flake (1/4) + an E2E UI flake (3/9) — both verified non-deterministic; full test:unit validated locally (16936 pass).
Release v3.8.33 — full CHANGELOG in the PR body. Blocking gates green (Build, Lint, Unit Tests 8/8, Package Artifact, Quality Gates, Quality Ratchet, Docs Sync, PR Test Policy, test-vitest). Admin-merged over a Node 26 future-compat timer flake (1/4) + an E2E UI flake (3/9) — both verified non-deterministic; full test:unit validated locally (16936 pass).
Release v3.8.33 — full CHANGELOG in the PR body. Blocking gates green (Build, Lint, Unit Tests 8/8, Package Artifact, Quality Gates, Quality Ratchet, Docs Sync, PR Test Policy, test-vitest). Admin-merged over a Node 26 future-compat timer flake (1/4) + an E2E UI flake (3/9) — both verified non-deterministic; full test:unit validated locally (16936 pass).




Release v3.8.33 —
release/v3.8.33→main. Finalized release notes.[3.8.33] — 2026-06-21
✨ New Features
nestedComboMode: execute) — selection strategies can now treat a combo-reference step as a black box, executing the referenced combo as a single unit instead of flattening its targets. (#4537 — thanks @adivekar-utexas)web_searchrequests to a configured model — CCR-style webSearch scenario: requests carrying aweb_search*tool can be routed to a dedicatedwebSearchRouteModel, configurable from the Routing tab. (#4509 — thanks @shafqatevo / @diegosouzapw)omniroute_web_fetchtool for URL content extraction — new MCP tool that fetches and extracts the content of a URL. (#4510 — thanks @ponkcore)input_audiomessage parts are now translated through to Gemini. (#4434 — thanks @diegosouzapw)authHintto the existing APIKEY_PROVIDERS entry — surfaces the auth hint for the bazaarlink provider. (#4522 — thanks @adivekar-utexas)additional_rate_limitsfallback — exposes the Codex code-review weekly window and falls back toadditional_rate_limitswhen present. (#4494 — thanks @diegosouzapw)gpt-4oon the built-in GitHub Copilot (gh) provider (#4487 — thanks @diegosouzapw)qwprovider (#4488 — thanks @diegosouzapw)🔧 Bug Fixes
providerNodeSelecthelper. (#4576 — thanks @aleksesipenko / @diegosouzapw)X-OmniRoute-Selected-Connection-Idresponse header (instead of the often-empty statictarget.connectionId), so model-lockout decay,recordProviderSuccess, LKGP and success/failure telemetry attribute to the right connection on both the priority and round-robin paths. The pre-screen "unavailable" snapshot is also no longer a permanent skip — availability is re-checked on each retry since connection cooldowns can expire mid-request. (#4550 — thanks @Chewji9875)buildAutoCandidatesto drop low-quota candidates before scoring, with a 429 guard when all candidates fall below cutoff. The cutoff is opt-in behindQuotaPreflightSettings.enabled(default OFF viaQUOTA_PREFLIGHT_CUTOFF_ENABLED), so default behavior is unchanged. (#4483 — thanks @megamen32)oneOf at '/' not met— the Cloud Code envelope passthrough also leaked the Claude/OpenAI-native thinking fields (thinking,reasoning_effort,reasoning,enable_thinking,thinking_budget) the unified thinking adapter sets at the body root; Google rejected them with400 Bad input: oneOf at '/' not met. The whole thinking family is now stripped before the envelope is built; Gemini's owngenerationConfig.thinkingConfigis unaffected. (#4485 — port from 9router#1926, thanks @theseven99 / @diegosouzapw)cache_control-markedtool_resultblocks — reasoning-token-keeping no longer drops tool_result blocks that carry acache_controlmarker. (#4560 — thanks @diegosouzapw)isHidden) in the auto-combo candidate pool — hidden models are excluded from auto-combo candidates. (#4558 — thanks @herjarsa)</think>-marked visible output — visible text wrapped in Cursor Composer's</think>markers is now decoded correctly. (#4554 — thanks @diegosouzapw)/responsesendpoint — connection test hits the actual Codex/responsesendpoint. (#4551 — thanks @diegosouzapw)webFetchInputemitsURL is requiredfor a missing url — clearer validation error for the web-fetch tool. (#4541 — thanks @ponkcore / @diegosouzapw)enginesExplicitthrough the PUT validation schema — the compression settings PUT no longer rejects theenginesExplicitflag. (#4532 — thanks @DevEstacion)maxCooldownMsfrom settings to therecordModelLockoutFailurecall sites (#4530 — thanks @Chewji9875)max_tokensper model using the registrymaxOutputTokens(#4518 — thanks @adivekar-utexas)gemini-pro-agent(#4508 — thanks @diegosouzapw)/v1/models— low-noise model output without alias/canonical duplicates. (#4506 — thanks @Rahulsharma0810 / @diegosouzapw)useCopyToClipboardhook (#4502 — thanks @diegosouzapw)lastVacuumAt— a newvacuumScheduler.tspersists the last run timestamp and last error to thekey_valuetable (migration 102) and feeds the database settings panel; wired into the Next.js lifecycle (default 24h, window 02:00–04:00 local). New env flags:OMNIROUTE_VACUUM_ENABLED,OMNIROUTE_VACUUM_INTERVAL_HOURS,OMNIROUTE_VACUUM_WINDOW. (#4480 — thanks @KooshaPari / @oyi77)quota_snapshotsrows from idle connections — the 60s background refresh persisted a snapshot for every window of every connection regardless of change, generating 400K+ rows/day from idle accounts.setQuotaCachenow skips the write when a window'sremaining_percentage/is_exhaustedis unchanged from the last cached observation; the first observation and every real change still persist. (#4565, #4438 — thanks @oyi77)🔒 Security
Math.random()with a crypto-secure source in the combo/deck weighted-selection path. (#4455 — thanks @diegosouzapw)📝 Maintenance
check:provider-assetsgate, plus a usage-analytics rollup cutoff fix. (#4464 — thanks @KooshaPari)chatCore.ts— incremental decomposition of the chat-core handler into pure, individually-testable leaves (system-role extraction, upstream-header build, failure usage-record builder, key-health, request-format, claude-effort, target-format, Background-Task-Redirect decision, Codex quota-state persistence). (#4548, #4547, #4544, #4538, #4526, #4492 — [refactor] Decompose providers/[id]/page.tsx god-component (12,882 LOC → ≤800, phased/strangler) #3501, thanks @diegosouzapw)🙌 Contributors
Thanks to everyone whose work landed in v3.8.33: