Skip to content

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

Merged
diegosouzapw merged 1 commit into
release/v3.8.21from
fix/3580-glm-coding-plan-monthly
Jun 10, 2026
Merged

diegosouzapw merged 1 commit into
release/v3.8.21from
fix/3580-glm-coding-plan-monthly

Conversation

@diegosouzapw

Copy link
Copy Markdown
Collaborator

Closes #3580

Problem

z.ai/GLM coding plans have no monthly quota (only 5-hour windows). The quota API returns the TIME_LIMIT ("Monthly") entry with total=0, and getGlmUsage computed remainingPercentage = total > 0 ? round(remaining/total*100) : 0 → a misleading Monthly 0% remaining, which can skew downstream model-choice.

Fix

Extracted glmMonthlyRemainingPercentage(total, remaining): with an absolute cap it stays remaining/total; with no cap (total=0) it falls back to the percentage-derived remaining (full/100% when 0% used) instead of 0.

⚠️ Inference-based: derived from the code path + the reporter's screenshot, without the raw z.ai coding-plan data.limits payload. The change is logically safe (no monthly cap ≠ 0% remaining) and guarded by a unit test; if the real payload routes differently we can refine with @gdevenyi's raw response.

Regression test (Rule #18 — TDD, RED→GREEN)

tests/unit/glm-coding-plan-monthly-3580.test.ts (4 cases): no-cap → 100%, absolute cap still remaining/total, clamping. Verified RED (3 fail returning 0) on the pre-fix logic, GREEN after. typecheck:core clean.

@diegosouzapw
diegosouzapw merged commit fde956a into release/v3.8.21 Jun 10, 2026
2 checks passed

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request resolves an issue where the z.ai/GLM coding-plan quota card incorrectly displayed "Monthly 0%" when no monthly cap was set (total = 0). It introduces the glmMonthlyRemainingPercentage helper function to handle this fallback scenario and adds corresponding unit tests. The reviewer recommends refactoring the newly added unit tests to use Vitest's native test and expect APIs instead of Node's built-in test runner to maintain consistency with the project's testing framework.

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.

Comment on lines +1 to +31
import test from "node:test";
import assert from "node:assert/strict";

import { glmMonthlyRemainingPercentage } from "../../open-sse/services/usage.ts";

// #3580 — z.ai/GLM coding plans have no monthly cap (only 5-hour windows), so the
// quota API reports the TIME_LIMIT ("Monthly") entry with total=0. The previous
// `total > 0 ? … : 0` fallback rendered that as a misleading "Monthly 0% remaining",
// which can skew downstream model-choice. With no absolute cap we now fall back to the
// percentage-derived remaining (full/100% when 0% used).

test("#3580 no monthly cap (total=0), 0% used → 100% remaining (was 0%)", () => {
assert.equal(glmMonthlyRemainingPercentage(0, 100), 100);
});

test("#3580 no monthly cap (total=0), no usage signal → defaults to full (100)", () => {
// remaining defaults to max(0, 100 - percentage); 0% used → 100
assert.equal(glmMonthlyRemainingPercentage(0, 100), 100);
});

test("#3580 absolute monthly cap still computes remaining/total", () => {
assert.equal(glmMonthlyRemainingPercentage(1000, 500), 50);
assert.equal(glmMonthlyRemainingPercentage(1000, 1000), 100);
assert.equal(glmMonthlyRemainingPercentage(1000, 0), 0);
});

test("#3580 clamps out-of-range values to [0,100]", () => {
assert.equal(glmMonthlyRemainingPercentage(0, 250), 100); // no cap, absolute remaining > 100 → clamp full
assert.equal(glmMonthlyRemainingPercentage(1000, 5000), 100);
assert.equal(glmMonthlyRemainingPercentage(0, -5), 0);
});

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The codebase is configured to use Vitest (as indicated by vitest.config.ts in the root and the repository style guide's reference to Vitest files). Using Node's built-in node:test and node:assert runner can lead to inconsistent test execution, missing coverage reporting, and fragmented assertion styles.

It is highly recommended to use Vitest's native test and expect APIs to ensure full integration with the project's test runner and coverage tools.

import { test, expect } from "vitest";

import { glmMonthlyRemainingPercentage } from "../../open-sse/services/usage.ts";

// #3580 — z.ai/GLM coding plans have no monthly cap (only 5-hour windows), so the
// quota API reports the TIME_LIMIT ("Monthly") entry with total=0. The previous
// `total > 0 ? … : 0` fallback rendered that as a misleading "Monthly 0% remaining",
// which can skew downstream model-choice. With no absolute cap we now fall back to the
// percentage-derived remaining (full/100% when 0% used).

test("#3580 no monthly cap (total=0), 0% used → 100% remaining (was 0%)", () => {
  expect(glmMonthlyRemainingPercentage(0, 100)).toBe(100);
});

test("#3580 no monthly cap (total=0), no usage signal → defaults to full (100)", () => {
  // remaining defaults to max(0, 100 - percentage); 0% used → 100
  expect(glmMonthlyRemainingPercentage(0, 100)).toBe(100);
});

test("#3580 absolute monthly cap still computes remaining/total", () => {
  expect(glmMonthlyRemainingPercentage(1000, 500)).toBe(50);
  expect(glmMonthlyRemainingPercentage(1000, 1000)).toBe(100);
  expect(glmMonthlyRemainingPercentage(1000, 0)).toBe(0);
});

test("#3580 clamps out-of-range values to [0,100]", () => {
  expect(glmMonthlyRemainingPercentage(0, 250)).toBe(100); // no cap, absolute remaining > 100 → clamp full
  expect(glmMonthlyRemainingPercentage(1000, 5000)).toBe(100);
  expect(glmMonthlyRemainingPercentage(0, -5)).toBe(0);
});
References
  1. The repository style guide explicitly references Vitest files and configuration, indicating Vitest is the standard test runner for the codebase. (link)

// which can skew downstream model-choice. With no absolute cap we now fall back to the
// percentage-derived remaining (full/100% when 0% used).

test("#3580 no monthly cap (total=0), 0% used → 100% remaining (was 0%)", () => {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

SUGGESTION: Redundant test case — this assertion is identical to the one on line 16 (glmMonthlyRemainingPercentage(0, 100) === 100). Consider removing one or varying the inputs to cover distinct scenarios.

@kilo-code-bot

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

Copy link
Copy Markdown

Code Review Summary

Status: 1 Issue Found | Recommendation: Address before merge

Overview

Severity Count
SUGGESTION 1
Issue Details (click to expand)
File Line Issue
tests/unit/glm-coding-plan-monthly-3580.test.ts 12 Redundant test case — assertion on line 12 is identical to line 16 (glmMonthlyRemainingPercentage(0, 100) === 100). Remove one or vary inputs to cover distinct scenarios.
Other Observations (not in diff)

No issues outside the diff.

Files Reviewed (3 files)
  • CHANGELOG.md - No issues
  • open-sse/services/usage.ts - No issues
  • tests/unit/glm-coding-plan-monthly-3580.test.ts - 1 suggestion

Fix these issues in Kilo Cloud


Reviewed by step-3.7-flash · 280,862 tokens

@diegosouzapw
diegosouzapw deleted the fix/3580-glm-coding-plan-monthly branch June 11, 2026 00:14
rafacpti23 pushed a commit to rafacpti23/OmniRoute that referenced this pull request Jun 11, 2026
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>
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 (cheaper-inference#3572) (cheaper-inference#3595)

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

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

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

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

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

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

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

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

Integrated into release/v3.8.21

* Refactor: Extract chatCore phases into modular files (cheaper-inference#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 cheaper-inference#3598 (chatCore modularization) + cheaper-inference#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 (cheaper-inference#3496) (cheaper-inference#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 (cheaper-inference#3605)

Split-out PR C from cheaper-inference#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 cheaper-inference#3569 native functionResponse path. Integrated into release/v3.8.21. Thanks @dhaern!

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

Split-out PR A from cheaper-inference#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 (cheaper-inference#3606) (cheaper-inference#3608)

Integrated into release/v3.8.21 (cheaper-inference#3606)

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

Integrated into release/v3.8.21 (cheaper-inference#3589)

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

Integrated into release/v3.8.21 (cheaper-inference#3419)

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

Split-out PR B from cheaper-inference#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 (cheaper-inference#3331) (cheaper-inference#3614)

Integrated into release/v3.8.21 (cheaper-inference#3331)

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

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

* fix(review): resolve findings from /review-reviews battery (v3.8.21 hardening) (cheaper-inference#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 (cheaper-inference#3572) (cheaper-inference#3595)

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

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

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

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

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

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

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

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

Integrated into release/v3.8.21

* Refactor: Extract chatCore phases into modular files (cheaper-inference#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 cheaper-inference#3598 (chatCore modularization) + cheaper-inference#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 (cheaper-inference#3496) (cheaper-inference#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 (cheaper-inference#3605)

Split-out PR C from cheaper-inference#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 cheaper-inference#3569 native functionResponse path. Integrated into release/v3.8.21. Thanks @dhaern!

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

Split-out PR A from cheaper-inference#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 (cheaper-inference#3606) (cheaper-inference#3608)

Integrated into release/v3.8.21 (cheaper-inference#3606)

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

Integrated into release/v3.8.21 (cheaper-inference#3589)

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

Integrated into release/v3.8.21 (cheaper-inference#3419)

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

Split-out PR B from cheaper-inference#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 (cheaper-inference#3331) (cheaper-inference#3614)

Integrated into release/v3.8.21 (cheaper-inference#3331)

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

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

* fix(review): resolve findings from /review-reviews battery (v3.8.21 hardening) (cheaper-inference#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>
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 (cheaper-inference#3572) (cheaper-inference#3595)

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

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

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

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

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

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

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

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

Integrated into release/v3.8.21

* Refactor: Extract chatCore phases into modular files (cheaper-inference#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 cheaper-inference#3598 (chatCore modularization) + cheaper-inference#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 (cheaper-inference#3496) (cheaper-inference#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 (cheaper-inference#3605)

Split-out PR C from cheaper-inference#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 cheaper-inference#3569 native functionResponse path. Integrated into release/v3.8.21. Thanks @dhaern!

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

Split-out PR A from cheaper-inference#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 (cheaper-inference#3606) (cheaper-inference#3608)

Integrated into release/v3.8.21 (cheaper-inference#3606)

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

Integrated into release/v3.8.21 (cheaper-inference#3589)

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

Integrated into release/v3.8.21 (cheaper-inference#3419)

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

Split-out PR B from cheaper-inference#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 (cheaper-inference#3331) (cheaper-inference#3614)

Integrated into release/v3.8.21 (cheaper-inference#3331)

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

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

* fix(review): resolve findings from /review-reviews battery (v3.8.21 hardening) (cheaper-inference#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.

1 participant