Skip to content

fix(usage): normalize Antigravity and agy provider quotas - #3604

Merged
diegosouzapw merged 4 commits into
diegosouzapw:release/v3.8.21from
dhaern:fix/antigravity-provider-quota-pr-b
Jun 11, 2026
Merged

diegosouzapw merged 4 commits into
diegosouzapw:release/v3.8.21from
dhaern:fix/antigravity-provider-quota-pr-b

Conversation

@dhaern

@dhaern dhaern commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

Summary

This is the second split-out PR from #3584. It contains the Antigravity/agy Provider Quota accuracy work and is intended to be reviewed after #3603.

Stacking note: GitHub does not allow opening an upstream PR whose base is a branch that only exists in a fork. This PR is therefore opened against release/v3.8.21, but it depends on #3603. After #3603 lands, this branch can be rebased so the diff contains only the quota commit.

Changes:

  • normalizes Antigravity and agy quota bucket IDs to the same clean public IDs used by the model catalog
  • prefers retrieveUserQuota when Google reports live consumption data
  • keeps fetchAvailableModels as a fallback for buckets that are only available from the catalog/eligibility response
  • uses local usage_history as a fallback signal for fetchAvailableModels-only buckets that otherwise stay at 100% / 0 used
  • sanitizes cached Provider Limits entries so retired upstream IDs are not re-exposed in the UI/API
  • schedules a small deduplicated post-usage refresh for Antigravity/agy connections after successful usage records
  • preserves the v3.8.21 GLM monthly/no-cap quota behavior

Scope

Included:

  • Provider Limits backend normalization
  • quota source priority and cache sanitization
  • post-usage quota refresh for Antigravity/agy
  • minimal UI parsing/auto-refresh changes required to show accurate quota data

Not included:

  • reasoning leak sanitizer/translator changes

Dependency

Depends on #3603 because the quota normalization uses the clean Antigravity/agy model IDs introduced there.

Validation

Ran focused tests locally:

bun test tests/unit/agy-usage-quota.test.ts \
  tests/unit/provider-columns.test.ts \
  tests/unit/usage-service-hardening.test.ts

Result: 36 pass, 0 fail.

Also tested the combined local stack against OmniRoute v3.8.21 with omniroute-install-local-build --restart and confirmed the Provider Quota view updates against the cleaned model set.

@dhaern
dhaern requested a review from diegosouzapw as a code owner June 11, 2026 01:47
@gemini-code-assist

Copy link
Copy Markdown
Contributor

Warning

You have reached your daily quota limit. Please wait up to 24 hours and I will start processing your requests again!

diegosouzapw and others added 2 commits June 11, 2026 00:06
…avity-provider-quota-pr-b

# Conflicts:
#	open-sse/config/antigravityModelAliases.ts
#	tests/unit/antigravity-model-aliases.test.ts
…-core scope)

The post-usage provider-limits refresh used a dynamic import("./providerLimits")
inside usageHistory. providerLimits imports the executors barrel (and the whole
translator graph), so that edge pulled ~390 modules into the typecheck-core
surface and surfaced pre-existing strictNullChecks errors in unrelated
translators (kiro/stream/default/...). Replace the dynamic import with a
lightweight usageEvents bus: usageHistory emits, providerLimits subscribes at
module load. No behavior change; typecheck-core scope stays at its prior set.

Co-authored-by: diegosouzapw <diegosouza.pw@gmail.com>
@diegosouzapw
diegosouzapw merged commit 68b71bc into diegosouzapw:release/v3.8.21 Jun 11, 2026
2 checks passed
diegosouzapw added a commit that referenced this pull request Jun 11, 2026
…as) + #3605 (reasoning wrappers)

Co-authored-by: diegosouzapw <diegosouza.pw@gmail.com>
@diegosouzapw

Copy link
Copy Markdown
Owner

Merged into release/v3.8.21 🎉 Thanks @dhaern — the retrieveUserQuota-first accuracy work is great. One maintainer follow-up (co-authored): the post-usage refresh originally used import("./providerLimits") inside usageHistory, which transitively pulled the executors/translator graph into the typecheck:core surface and surfaced ~390 pre-existing strictNullChecks errors in unrelated translators (0 → 394). I decoupled it via a lightweight usageEvents bus (usageHistory emits, providerLimits subscribes at load) — same behavior, typecheck:core back to 0. Quota + new event-bus tests green. Ships next release.

@kilo-code-bot

kilo-code-bot Bot commented Jun 11, 2026 •

Copy link
Copy Markdown

Code Review Summary

Status: No Issues Found | Recommendation: Merge

This PR introduces a sophisticated quota tracking system for Antigravity/agy providers that addresses several important issues:

Overview

Severity Count
CRITICAL 0
WARNING 0
SUGGESTION 0

Key Changes Reviewed

  1. open-sse/services/usage.ts:

    • Added fetchAntigravityUserQuotaCached function to fetch real-time user quota from retrieveUserQuota endpoint
    • Added toClientAntigravityQuotaModelId normalization for retired model ID mapping (e.g., gemini-3-flash-agent → gemini-3.5-flash-high)
    • Added applyLocalUsageFallback to supplement catalog quota data with actual usage from DB
    • Modified getAntigravityUsage to prefer retrieveUserQuota buckets over catalog quotaInfo
    • Proper inflight deduplication and TTL cache management
  2. src/lib/usage/providerLimits.ts:

    • Added getSanitizedCachedProviderLimitsMap to normalize quota keys before returning cached data
    • Added notifyProviderUsageRecorded and post-usage refresh scheduling (5s delay)
    • Added sanitizeUsageQuotasForProvider and normalizeUsageQuotasForProvider with source ranking
    • Source ranking correctly prioritizes: retrieveUserQuota (2) > localUsageHistory (1) > fetchAvailableModels (0)
  3. src/lib/usage/usageEvents.ts (new file):

    • Lightweight event bus to decouple usageHistory from providerLimits
    • Proper error handling with try/catch per listener
  4. Tests updated:

    • Changed mock usage to direct globalThis.fetch assignment (better pattern for Node.js native test runner)
    • Added tests for retrieveUserQuota preference and retired bucket normalization
    • Added usage-events.test.ts for event bus coverage

Architecture Quality

  • The event bus pattern correctly prevents circular import dependencies (usageHistory ← providerLimits via executors)
  • Model ID normalization handles the transition from legacy to clean model names
  • Source ranking logic correctly deduplicates same-key entries while preferring higher-quality sources
  • Cache TTL is consistent with other Antigravity caches (60s)
  • Auto-refresh logic only triggers when gemini quotas lack retrieveUserQuota source

Files Reviewed (8 files)

  • open-sse/services/usage.ts
  • src/lib/usage/providerLimits.ts
  • src/lib/usage/usageEvents.ts
  • src/lib/usage/usageHistory.ts
  • src/app/api/usage/provider-limits/route.ts
  • src/app/(dashboard)/dashboard/usage/components/ProviderLimits/index.tsx
  • src/app/(dashboard)/dashboard/usage/components/ProviderLimits/utils.tsx
  • tests/unit/*/*.ts (multiple test files)

Reviewed by laguna-m.1-20260312:free · 3,037,332 tokens

diegosouzapw added a commit that referenced this pull request Jun 11, 2026
* chore(release): open v3.8.21 development cycle

* fix: pass through valid max_tokens-truncated responses instead of fake 502 (#3572) (#3595)

* fix: /v1/completions returns legacy text-completion format, not chat (#3571) (#3596)

* fix: z.ai/GLM coding plan no longer shows Monthly 0% when no monthly cap (#3580) (#3597)

* docs: mark DISCOVERY_TOOL_DESIGN endpoints as Phase-2 not-yet-implemented (#3498) (#3599)

* fix(agent-bridge): add validate-only upstream-ca/test route (#3488) (#3600)

* fix(gamification): add level/badges/badges-earned profile routes (#3484)

* security(oauth): migrate 5 public client_ids to resolvePublicCred (#3493)

* fix(mcp): ship MCP server source closure in npm files + coverage gate (#3578)

* fix: add reasoning token buffer for combo routing (fixes #3587) (#3588)

Integrated into release/v3.8.21

* Refactor: Extract chatCore phases into modular files (#3598)

Integrated into release/v3.8.21 — chatCore phase modularization. Adjusted: re-derive idempotencyKey for the save path after the check moved into the module (co-authored). Thanks @oyi77!

* docs(changelog): credit #3598 (chatCore modularization) + #3588 (combo reasoning buffer)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(api): implement GET /api/guardrails + POST /api/guardrails/test, drop shadow/guardrails doc-fiction (#3496) (#3602)

Integrated into release/v3.8.21 — implements GET /api/guardrails + POST /api/guardrails/test, removes shadow/guardrails doc-fiction. TDD-validated (5/5) + check-docs-symbols/typecheck/eslint green.

* fix(gemini): isolate textual reasoning wrappers (#3605)

Split-out PR C from #3584. Isolates textual reasoning wrappers (<think>/<thinking>/<thought>/<internal_thought>, including malformed/open tags) into reasoning_content across both the non-streaming sanitizer and the Gemini streaming translator, with split-chunk buffering. Additive to the existing textual tool-call pipeline; does not touch the #3569 native functionResponse path. Integrated into release/v3.8.21. Thanks @dhaern!

* fix(antigravity): normalize Gemini 3.5 Flash tier IDs (#3603)

Split-out PR A from #3584. Normalizes the Antigravity/agy Gemini 3.5 Flash tier IDs to clean public names (gemini-3.5-flash-low/medium/high), maps them to the live upstream IDs at the executor boundary, and removes Antigravity from the global model resolver so the executor owns wire normalization. Maintainer follow-up: kept gemini-3.5-flash-preview as a hidden backward-compat alias routing to the High tier (so saved combos/configs keep working). Live-validated the tier set via the agy CLI catalog. Integrated into release/v3.8.21. Thanks @dhaern!

* fix(agent-bridge): surface real MITM startup-failure cause, not always port 443 (#3606) (#3608)

Integrated into release/v3.8.21 (#3606)

* fix(oauth): surface real Kiro import-token failure cause, not a bare 500 (#3589) (#3609)

Integrated into release/v3.8.21 (#3589)

* docs(opencode-provider): soft-deprecate in favor of @omniroute/opencode-plugin (#3419) (#3613)

Integrated into release/v3.8.21 (#3419)

* fix(usage): normalize Antigravity and agy provider quotas (#3604)

Split-out PR B from #3584. Normalizes Antigravity/agy provider quotas: prefers retrieveUserQuota for live consumption, falls back to fetchAvailableModels and local usage_history, sanitizes cached Provider Limits so retired upstream IDs are not re-exposed, and schedules a deduplicated post-usage refresh. Maintainer follow-up: decoupled the post-usage refresh via a lightweight usageEvents bus (usageHistory no longer dynamic-imports providerLimits) so it does not pull the executors/translator graph into the typecheck-core surface — typecheck:core stays at 0. Integrated into release/v3.8.21. Thanks @dhaern!

* feat(cli): add autostart on/off/toggle shorthand for headless serve mode (#3331) (#3614)

Integrated into release/v3.8.21 (#3331)

* docs(changelog): credit #3603 (Flash tier IDs) + #3604 (provider quotas) + #3605 (reasoning wrappers)

Co-authored-by: diegosouzapw <diegosouza.pw@gmail.com>

* fix(review): resolve findings from /review-reviews battery (v3.8.21 hardening) (#3618)

Pre-release hardening from the /review-reviews battery — 15 findings resolved (L1-L13,L15) + L14 live-verified WONTFIX, convergence re-review clean. lint/typecheck:core/test:vitest(146)/build green; zero new test:unit failures vs baseline 797de43.

* chore(release): v3.8.21 CHANGELOG + i18n + env-doc sync

---------

Co-authored-by: Hernan Javier Ardila Sanchez <hjasgr@gmail.com>
Co-authored-by: Paijo <14921983+oyi77@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Raxxoor <manker_lol@hotmail.com>
oyi77 pushed a commit to oyi77/OmniRoute that referenced this pull request Jun 12, 2026
…pw#3604)

Split-out PR B from diegosouzapw#3584. Normalizes Antigravity/agy provider quotas: prefers retrieveUserQuota for live consumption, falls back to fetchAvailableModels and local usage_history, sanitizes cached Provider Limits so retired upstream IDs are not re-exposed, and schedules a deduplicated post-usage refresh. Maintainer follow-up: decoupled the post-usage refresh via a lightweight usageEvents bus (usageHistory no longer dynamic-imports providerLimits) so it does not pull the executors/translator graph into the typecheck-core surface — typecheck:core stays at 0. Integrated into release/v3.8.21. Thanks @dhaern!
oyi77 pushed a commit to oyi77/OmniRoute that referenced this pull request Jun 12, 2026
…zapw#3604 (provider quotas) + diegosouzapw#3605 (reasoning wrappers)

Co-authored-by: diegosouzapw <diegosouza.pw@gmail.com>
oyi77 pushed a commit to oyi77/OmniRoute that referenced this pull request Jun 12, 2026
…pw#3604)

Split-out PR B from diegosouzapw#3584. Normalizes Antigravity/agy provider quotas: prefers retrieveUserQuota for live consumption, falls back to fetchAvailableModels and local usage_history, sanitizes cached Provider Limits so retired upstream IDs are not re-exposed, and schedules a deduplicated post-usage refresh. Maintainer follow-up: decoupled the post-usage refresh via a lightweight usageEvents bus (usageHistory no longer dynamic-imports providerLimits) so it does not pull the executors/translator graph into the typecheck-core surface — typecheck:core stays at 0. Integrated into release/v3.8.21. Thanks @dhaern!
oyi77 pushed a commit to oyi77/OmniRoute that referenced this pull request Jun 12, 2026
…zapw#3604 (provider quotas) + diegosouzapw#3605 (reasoning wrappers)

Co-authored-by: diegosouzapw <diegosouza.pw@gmail.com>
oyi77 pushed a commit to oyi77/OmniRoute that referenced this pull request Jun 12, 2026
…pw#3604)

Split-out PR B from diegosouzapw#3584. Normalizes Antigravity/agy provider quotas: prefers retrieveUserQuota for live consumption, falls back to fetchAvailableModels and local usage_history, sanitizes cached Provider Limits so retired upstream IDs are not re-exposed, and schedules a deduplicated post-usage refresh. Maintainer follow-up: decoupled the post-usage refresh via a lightweight usageEvents bus (usageHistory no longer dynamic-imports providerLimits) so it does not pull the executors/translator graph into the typecheck-core surface — typecheck:core stays at 0. Integrated into release/v3.8.21. Thanks @dhaern!
oyi77 pushed a commit to oyi77/OmniRoute that referenced this pull request Jun 12, 2026
…zapw#3604 (provider quotas) + diegosouzapw#3605 (reasoning wrappers)

Co-authored-by: diegosouzapw <diegosouza.pw@gmail.com>
oyi77 pushed a commit to oyi77/OmniRoute that referenced this pull request Jun 12, 2026
…pw#3604)

Split-out PR B from diegosouzapw#3584. Normalizes Antigravity/agy provider quotas: prefers retrieveUserQuota for live consumption, falls back to fetchAvailableModels and local usage_history, sanitizes cached Provider Limits so retired upstream IDs are not re-exposed, and schedules a deduplicated post-usage refresh. Maintainer follow-up: decoupled the post-usage refresh via a lightweight usageEvents bus (usageHistory no longer dynamic-imports providerLimits) so it does not pull the executors/translator graph into the typecheck-core surface — typecheck:core stays at 0. Integrated into release/v3.8.21. Thanks @dhaern!
oyi77 pushed a commit to oyi77/OmniRoute that referenced this pull request Jun 12, 2026
…zapw#3604 (provider quotas) + diegosouzapw#3605 (reasoning wrappers)

Co-authored-by: diegosouzapw <diegosouza.pw@gmail.com>
oyi77 pushed a commit to oyi77/OmniRoute that referenced this pull request Jun 12, 2026
…pw#3604)

Split-out PR B from diegosouzapw#3584. Normalizes Antigravity/agy provider quotas: prefers retrieveUserQuota for live consumption, falls back to fetchAvailableModels and local usage_history, sanitizes cached Provider Limits so retired upstream IDs are not re-exposed, and schedules a deduplicated post-usage refresh. Maintainer follow-up: decoupled the post-usage refresh via a lightweight usageEvents bus (usageHistory no longer dynamic-imports providerLimits) so it does not pull the executors/translator graph into the typecheck-core surface — typecheck:core stays at 0. Integrated into release/v3.8.21. Thanks @dhaern!
oyi77 pushed a commit to oyi77/OmniRoute that referenced this pull request Jun 12, 2026
…zapw#3604 (provider quotas) + diegosouzapw#3605 (reasoning wrappers)

Co-authored-by: diegosouzapw <diegosouza.pw@gmail.com>
oyi77 pushed a commit to oyi77/OmniRoute that referenced this pull request Jun 12, 2026
…pw#3604)

Split-out PR B from diegosouzapw#3584. Normalizes Antigravity/agy provider quotas: prefers retrieveUserQuota for live consumption, falls back to fetchAvailableModels and local usage_history, sanitizes cached Provider Limits so retired upstream IDs are not re-exposed, and schedules a deduplicated post-usage refresh. Maintainer follow-up: decoupled the post-usage refresh via a lightweight usageEvents bus (usageHistory no longer dynamic-imports providerLimits) so it does not pull the executors/translator graph into the typecheck-core surface — typecheck:core stays at 0. Integrated into release/v3.8.21. Thanks @dhaern!
oyi77 pushed a commit to oyi77/OmniRoute that referenced this pull request Jun 12, 2026
…zapw#3604 (provider quotas) + diegosouzapw#3605 (reasoning wrappers)

Co-authored-by: diegosouzapw <diegosouza.pw@gmail.com>
oyi77 pushed a commit to oyi77/OmniRoute that referenced this pull request Jun 12, 2026
…pw#3604)

Split-out PR B from diegosouzapw#3584. Normalizes Antigravity/agy provider quotas: prefers retrieveUserQuota for live consumption, falls back to fetchAvailableModels and local usage_history, sanitizes cached Provider Limits so retired upstream IDs are not re-exposed, and schedules a deduplicated post-usage refresh. Maintainer follow-up: decoupled the post-usage refresh via a lightweight usageEvents bus (usageHistory no longer dynamic-imports providerLimits) so it does not pull the executors/translator graph into the typecheck-core surface — typecheck:core stays at 0. Integrated into release/v3.8.21. Thanks @dhaern!
oyi77 pushed a commit to oyi77/OmniRoute that referenced this pull request Jun 12, 2026
…zapw#3604 (provider quotas) + diegosouzapw#3605 (reasoning wrappers)

Co-authored-by: diegosouzapw <diegosouza.pw@gmail.com>
HouMinXi pushed a commit to HouMinXi/OmniRoute that referenced this pull request Aug 2, 2026
* chore(release): open v3.8.21 development cycle

* fix: pass through valid max_tokens-truncated responses instead of fake 502 (diegosouzapw#3572) (diegosouzapw#3595)

* fix: /v1/completions returns legacy text-completion format, not chat (diegosouzapw#3571) (diegosouzapw#3596)

* fix: z.ai/GLM coding plan no longer shows Monthly 0% when no monthly cap (diegosouzapw#3580) (diegosouzapw#3597)

* docs: mark DISCOVERY_TOOL_DESIGN endpoints as Phase-2 not-yet-implemented (diegosouzapw#3498) (diegosouzapw#3599)

* fix(agent-bridge): add validate-only upstream-ca/test route (diegosouzapw#3488) (diegosouzapw#3600)

* fix(gamification): add level/badges/badges-earned profile routes (diegosouzapw#3484)

* security(oauth): migrate 5 public client_ids to resolvePublicCred (diegosouzapw#3493)

* fix(mcp): ship MCP server source closure in npm files + coverage gate (diegosouzapw#3578)

* fix: add reasoning token buffer for combo routing (fixes diegosouzapw#3587) (diegosouzapw#3588)

Integrated into release/v3.8.21

* Refactor: Extract chatCore phases into modular files (diegosouzapw#3598)

Integrated into release/v3.8.21 — chatCore phase modularization. Adjusted: re-derive idempotencyKey for the save path after the check moved into the module (co-authored). Thanks @oyi77!

* docs(changelog): credit diegosouzapw#3598 (chatCore modularization) + diegosouzapw#3588 (combo reasoning buffer)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(api): implement GET /api/guardrails + POST /api/guardrails/test, drop shadow/guardrails doc-fiction (diegosouzapw#3496) (diegosouzapw#3602)

Integrated into release/v3.8.21 — implements GET /api/guardrails + POST /api/guardrails/test, removes shadow/guardrails doc-fiction. TDD-validated (5/5) + check-docs-symbols/typecheck/eslint green.

* fix(gemini): isolate textual reasoning wrappers (diegosouzapw#3605)

Split-out PR C from diegosouzapw#3584. Isolates textual reasoning wrappers (<think>/<thinking>/<thought>/<internal_thought>, including malformed/open tags) into reasoning_content across both the non-streaming sanitizer and the Gemini streaming translator, with split-chunk buffering. Additive to the existing textual tool-call pipeline; does not touch the diegosouzapw#3569 native functionResponse path. Integrated into release/v3.8.21. Thanks @dhaern!

* fix(antigravity): normalize Gemini 3.5 Flash tier IDs (diegosouzapw#3603)

Split-out PR A from diegosouzapw#3584. Normalizes the Antigravity/agy Gemini 3.5 Flash tier IDs to clean public names (gemini-3.5-flash-low/medium/high), maps them to the live upstream IDs at the executor boundary, and removes Antigravity from the global model resolver so the executor owns wire normalization. Maintainer follow-up: kept gemini-3.5-flash-preview as a hidden backward-compat alias routing to the High tier (so saved combos/configs keep working). Live-validated the tier set via the agy CLI catalog. Integrated into release/v3.8.21. Thanks @dhaern!

* fix(agent-bridge): surface real MITM startup-failure cause, not always port 443 (diegosouzapw#3606) (diegosouzapw#3608)

Integrated into release/v3.8.21 (diegosouzapw#3606)

* fix(oauth): surface real Kiro import-token failure cause, not a bare 500 (diegosouzapw#3589) (diegosouzapw#3609)

Integrated into release/v3.8.21 (diegosouzapw#3589)

* docs(opencode-provider): soft-deprecate in favor of @omniroute/opencode-plugin (diegosouzapw#3419) (diegosouzapw#3613)

Integrated into release/v3.8.21 (diegosouzapw#3419)

* fix(usage): normalize Antigravity and agy provider quotas (diegosouzapw#3604)

Split-out PR B from diegosouzapw#3584. Normalizes Antigravity/agy provider quotas: prefers retrieveUserQuota for live consumption, falls back to fetchAvailableModels and local usage_history, sanitizes cached Provider Limits so retired upstream IDs are not re-exposed, and schedules a deduplicated post-usage refresh. Maintainer follow-up: decoupled the post-usage refresh via a lightweight usageEvents bus (usageHistory no longer dynamic-imports providerLimits) so it does not pull the executors/translator graph into the typecheck-core surface — typecheck:core stays at 0. Integrated into release/v3.8.21. Thanks @dhaern!

* feat(cli): add autostart on/off/toggle shorthand for headless serve mode (diegosouzapw#3331) (diegosouzapw#3614)

Integrated into release/v3.8.21 (diegosouzapw#3331)

* docs(changelog): credit diegosouzapw#3603 (Flash tier IDs) + diegosouzapw#3604 (provider quotas) + diegosouzapw#3605 (reasoning wrappers)

Co-authored-by: diegosouzapw <diegosouza.pw@gmail.com>

* fix(review): resolve findings from /review-reviews battery (v3.8.21 hardening) (diegosouzapw#3618)

Pre-release hardening from the /review-reviews battery — 15 findings resolved (L1-L13,L15) + L14 live-verified WONTFIX, convergence re-review clean. lint/typecheck:core/test:vitest(146)/build green; zero new test:unit failures vs baseline 6d24708.

* chore(release): v3.8.21 CHANGELOG + i18n + env-doc sync

---------

Co-authored-by: Hernan Javier Ardila Sanchez <hjasgr@gmail.com>
Co-authored-by: Paijo <14921983+oyi77@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Raxxoor <manker_lol@hotmail.com>
Poid-ZA pushed a commit to Poid-ZA/OmniRoute that referenced this pull request Aug 5, 2026
* chore(release): open v3.8.21 development cycle

* fix: pass through valid max_tokens-truncated responses instead of fake 502 (diegosouzapw#3572) (diegosouzapw#3595)

* fix: /v1/completions returns legacy text-completion format, not chat (diegosouzapw#3571) (diegosouzapw#3596)

* fix: z.ai/GLM coding plan no longer shows Monthly 0% when no monthly cap (diegosouzapw#3580) (diegosouzapw#3597)

* docs: mark DISCOVERY_TOOL_DESIGN endpoints as Phase-2 not-yet-implemented (diegosouzapw#3498) (diegosouzapw#3599)

* fix(agent-bridge): add validate-only upstream-ca/test route (diegosouzapw#3488) (diegosouzapw#3600)

* fix(gamification): add level/badges/badges-earned profile routes (diegosouzapw#3484)

* security(oauth): migrate 5 public client_ids to resolvePublicCred (diegosouzapw#3493)

* fix(mcp): ship MCP server source closure in npm files + coverage gate (diegosouzapw#3578)

* fix: add reasoning token buffer for combo routing (fixes diegosouzapw#3587) (diegosouzapw#3588)

Integrated into release/v3.8.21

* Refactor: Extract chatCore phases into modular files (diegosouzapw#3598)

Integrated into release/v3.8.21 — chatCore phase modularization. Adjusted: re-derive idempotencyKey for the save path after the check moved into the module (co-authored). Thanks @oyi77!

* docs(changelog): credit diegosouzapw#3598 (chatCore modularization) + diegosouzapw#3588 (combo reasoning buffer)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(api): implement GET /api/guardrails + POST /api/guardrails/test, drop shadow/guardrails doc-fiction (diegosouzapw#3496) (diegosouzapw#3602)

Integrated into release/v3.8.21 — implements GET /api/guardrails + POST /api/guardrails/test, removes shadow/guardrails doc-fiction. TDD-validated (5/5) + check-docs-symbols/typecheck/eslint green.

* fix(gemini): isolate textual reasoning wrappers (diegosouzapw#3605)

Split-out PR C from diegosouzapw#3584. Isolates textual reasoning wrappers (<think>/<thinking>/<thought>/<internal_thought>, including malformed/open tags) into reasoning_content across both the non-streaming sanitizer and the Gemini streaming translator, with split-chunk buffering. Additive to the existing textual tool-call pipeline; does not touch the diegosouzapw#3569 native functionResponse path. Integrated into release/v3.8.21. Thanks @dhaern!

* fix(antigravity): normalize Gemini 3.5 Flash tier IDs (diegosouzapw#3603)

Split-out PR A from diegosouzapw#3584. Normalizes the Antigravity/agy Gemini 3.5 Flash tier IDs to clean public names (gemini-3.5-flash-low/medium/high), maps them to the live upstream IDs at the executor boundary, and removes Antigravity from the global model resolver so the executor owns wire normalization. Maintainer follow-up: kept gemini-3.5-flash-preview as a hidden backward-compat alias routing to the High tier (so saved combos/configs keep working). Live-validated the tier set via the agy CLI catalog. Integrated into release/v3.8.21. Thanks @dhaern!

* fix(agent-bridge): surface real MITM startup-failure cause, not always port 443 (diegosouzapw#3606) (diegosouzapw#3608)

Integrated into release/v3.8.21 (diegosouzapw#3606)

* fix(oauth): surface real Kiro import-token failure cause, not a bare 500 (diegosouzapw#3589) (diegosouzapw#3609)

Integrated into release/v3.8.21 (diegosouzapw#3589)

* docs(opencode-provider): soft-deprecate in favor of @omniroute/opencode-plugin (diegosouzapw#3419) (diegosouzapw#3613)

Integrated into release/v3.8.21 (diegosouzapw#3419)

* fix(usage): normalize Antigravity and agy provider quotas (diegosouzapw#3604)

Split-out PR B from diegosouzapw#3584. Normalizes Antigravity/agy provider quotas: prefers retrieveUserQuota for live consumption, falls back to fetchAvailableModels and local usage_history, sanitizes cached Provider Limits so retired upstream IDs are not re-exposed, and schedules a deduplicated post-usage refresh. Maintainer follow-up: decoupled the post-usage refresh via a lightweight usageEvents bus (usageHistory no longer dynamic-imports providerLimits) so it does not pull the executors/translator graph into the typecheck-core surface — typecheck:core stays at 0. Integrated into release/v3.8.21. Thanks @dhaern!

* feat(cli): add autostart on/off/toggle shorthand for headless serve mode (diegosouzapw#3331) (diegosouzapw#3614)

Integrated into release/v3.8.21 (diegosouzapw#3331)

* docs(changelog): credit diegosouzapw#3603 (Flash tier IDs) + diegosouzapw#3604 (provider quotas) + diegosouzapw#3605 (reasoning wrappers)

Co-authored-by: diegosouzapw <diegosouza.pw@gmail.com>

* fix(review): resolve findings from /review-reviews battery (v3.8.21 hardening) (diegosouzapw#3618)

Pre-release hardening from the /review-reviews battery — 15 findings resolved (L1-L13,L15) + L14 live-verified WONTFIX, convergence re-review clean. lint/typecheck:core/test:vitest(146)/build green; zero new test:unit failures vs baseline 797de43.

* chore(release): v3.8.21 CHANGELOG + i18n + env-doc sync

---------

Co-authored-by: Hernan Javier Ardila Sanchez <hjasgr@gmail.com>
Co-authored-by: Paijo <14921983+oyi77@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Raxxoor <manker_lol@hotmail.com>
tkgo11 pushed a commit to tkgo11/OmniRoute that referenced this pull request Sep 23, 2026
…pw#3604)

Split-out PR B from diegosouzapw#3584. Normalizes Antigravity/agy provider quotas: prefers retrieveUserQuota for live consumption, falls back to fetchAvailableModels and local usage_history, sanitizes cached Provider Limits so retired upstream IDs are not re-exposed, and schedules a deduplicated post-usage refresh. Maintainer follow-up: decoupled the post-usage refresh via a lightweight usageEvents bus (usageHistory no longer dynamic-imports providerLimits) so it does not pull the executors/translator graph into the typecheck-core surface — typecheck:core stays at 0. Integrated into release/v3.8.21. Thanks @dhaern!
tkgo11 pushed a commit to tkgo11/OmniRoute that referenced this pull request Sep 23, 2026
…zapw#3604 (provider quotas) + diegosouzapw#3605 (reasoning wrappers)

Co-authored-by: diegosouzapw <diegosouza.pw@gmail.com>
muhamadgalihsaputra pushed a commit to niyatna/NiyatnaRoute that referenced this pull request Sep 27, 2026
* chore(release): open v3.8.21 development cycle

* fix: pass through valid max_tokens-truncated responses instead of fake 502 (diegosouzapw#3572) (diegosouzapw#3595)

* fix: /v1/completions returns legacy text-completion format, not chat (diegosouzapw#3571) (diegosouzapw#3596)

* fix: z.ai/GLM coding plan no longer shows Monthly 0% when no monthly cap (diegosouzapw#3580) (diegosouzapw#3597)

* docs: mark DISCOVERY_TOOL_DESIGN endpoints as Phase-2 not-yet-implemented (diegosouzapw#3498) (diegosouzapw#3599)

* fix(agent-bridge): add validate-only upstream-ca/test route (diegosouzapw#3488) (diegosouzapw#3600)

* fix(gamification): add level/badges/badges-earned profile routes (diegosouzapw#3484)

* security(oauth): migrate 5 public client_ids to resolvePublicCred (diegosouzapw#3493)

* fix(mcp): ship MCP server source closure in npm files + coverage gate (diegosouzapw#3578)

* fix: add reasoning token buffer for combo routing (fixes diegosouzapw#3587) (diegosouzapw#3588)

Integrated into release/v3.8.21

* Refactor: Extract chatCore phases into modular files (diegosouzapw#3598)

Integrated into release/v3.8.21 — chatCore phase modularization. Adjusted: re-derive idempotencyKey for the save path after the check moved into the module (co-authored). Thanks @oyi77!

* docs(changelog): credit diegosouzapw#3598 (chatCore modularization) + diegosouzapw#3588 (combo reasoning buffer)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(api): implement GET /api/guardrails + POST /api/guardrails/test, drop shadow/guardrails doc-fiction (diegosouzapw#3496) (diegosouzapw#3602)

Integrated into release/v3.8.21 — implements GET /api/guardrails + POST /api/guardrails/test, removes shadow/guardrails doc-fiction. TDD-validated (5/5) + check-docs-symbols/typecheck/eslint green.

* fix(gemini): isolate textual reasoning wrappers (diegosouzapw#3605)

Split-out PR C from diegosouzapw#3584. Isolates textual reasoning wrappers (<think>/<thinking>/<thought>/<internal_thought>, including malformed/open tags) into reasoning_content across both the non-streaming sanitizer and the Gemini streaming translator, with split-chunk buffering. Additive to the existing textual tool-call pipeline; does not touch the diegosouzapw#3569 native functionResponse path. Integrated into release/v3.8.21. Thanks @dhaern!

* fix(antigravity): normalize Gemini 3.5 Flash tier IDs (diegosouzapw#3603)

Split-out PR A from diegosouzapw#3584. Normalizes the Antigravity/agy Gemini 3.5 Flash tier IDs to clean public names (gemini-3.5-flash-low/medium/high), maps them to the live upstream IDs at the executor boundary, and removes Antigravity from the global model resolver so the executor owns wire normalization. Maintainer follow-up: kept gemini-3.5-flash-preview as a hidden backward-compat alias routing to the High tier (so saved combos/configs keep working). Live-validated the tier set via the agy CLI catalog. Integrated into release/v3.8.21. Thanks @dhaern!

* fix(agent-bridge): surface real MITM startup-failure cause, not always port 443 (diegosouzapw#3606) (diegosouzapw#3608)

Integrated into release/v3.8.21 (diegosouzapw#3606)

* fix(oauth): surface real Kiro import-token failure cause, not a bare 500 (diegosouzapw#3589) (diegosouzapw#3609)

Integrated into release/v3.8.21 (diegosouzapw#3589)

* docs(opencode-provider): soft-deprecate in favor of @omniroute/opencode-plugin (diegosouzapw#3419) (diegosouzapw#3613)

Integrated into release/v3.8.21 (diegosouzapw#3419)

* fix(usage): normalize Antigravity and agy provider quotas (diegosouzapw#3604)

Split-out PR B from diegosouzapw#3584. Normalizes Antigravity/agy provider quotas: prefers retrieveUserQuota for live consumption, falls back to fetchAvailableModels and local usage_history, sanitizes cached Provider Limits so retired upstream IDs are not re-exposed, and schedules a deduplicated post-usage refresh. Maintainer follow-up: decoupled the post-usage refresh via a lightweight usageEvents bus (usageHistory no longer dynamic-imports providerLimits) so it does not pull the executors/translator graph into the typecheck-core surface — typecheck:core stays at 0. Integrated into release/v3.8.21. Thanks @dhaern!

* feat(cli): add autostart on/off/toggle shorthand for headless serve mode (diegosouzapw#3331) (diegosouzapw#3614)

Integrated into release/v3.8.21 (diegosouzapw#3331)

* docs(changelog): credit diegosouzapw#3603 (Flash tier IDs) + diegosouzapw#3604 (provider quotas) + diegosouzapw#3605 (reasoning wrappers)

Co-authored-by: diegosouzapw <diegosouza.pw@gmail.com>

* fix(review): resolve findings from /review-reviews battery (v3.8.21 hardening) (diegosouzapw#3618)

Pre-release hardening from the /review-reviews battery — 15 findings resolved (L1-L13,L15) + L14 live-verified WONTFIX, convergence re-review clean. lint/typecheck:core/test:vitest(146)/build green; zero new test:unit failures vs baseline 408d91a2c.

* chore(release): v3.8.21 CHANGELOG + i18n + env-doc sync

---------

Co-authored-by: Hernan Javier Ardila Sanchez <hjasgr@gmail.com>
Co-authored-by: Paijo <14921983+oyi77@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Raxxoor <manker_lol@hotmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants