diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 71f14c14a9..ae2c27bce7 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,11 +1,11 @@ # Default reviewers -* @lidge-jun @Ingwannu @Wibias +* @lidge-jun @Ingwannu # High-impact runtime behavior -/src/adapters/ @lidge-jun @Ingwannu @Wibias -/src/providers/ @lidge-jun @Ingwannu @Wibias -/src/codex/ @lidge-jun @Ingwannu @Wibias -/src/server/ @lidge-jun @Ingwannu @Wibias +/src/adapters/ @lidge-jun @Ingwannu +/src/providers/ @lidge-jun @Ingwannu +/src/codex/ @lidge-jun @Ingwannu +/src/server/ @lidge-jun @Ingwannu # Repository automation and release security /.github/ @lidge-jun @Ingwannu diff --git a/MAINTAINERS.md b/MAINTAINERS.md index 3214adfdf1..43377c093d 100644 --- a/MAINTAINERS.md +++ b/MAINTAINERS.md @@ -9,7 +9,6 @@ review and merge policy. | --- | --- | --- | | [@lidge-jun](https://github.com/lidge-jun) | Project owner | Project direction, releases, repository administration, and final governance decisions | | [@Ingwannu](https://github.com/Ingwannu) | Maintainer | Issue and pull-request triage, `dev` integration, security review, and repository maintenance | -| [@Wibias](https://github.com/Wibias) | Maintainer | Issue and pull-request triage, `dev` integration, and provider/CI maintenance | The table describes project responsibilities. Actual repository permissions remain controlled through GitHub repository settings. @@ -17,6 +16,16 @@ through GitHub repository settings. `dev` is the only integration line. The former `dev2-go` carry duty is retired; see [The retired `dev2-go` line](#the-retired-dev2-go-line). +## Former maintainers + +| GitHub account | Project role | Period | +| --- | --- | --- | +| [@Wibias](https://github.com/Wibias) | Maintainer | 2026-07-27 – 2026-08-19 | + +Former maintainers keep contributor standing and are welcome to open issues and pull requests like +anyone else. Authorship credit in git history, release notes, and code comments is not rewritten +when a maintainer steps down. + ## Review and merge policy - Pull requests target `dev`. It is the only integration line, and promotion to @@ -98,6 +107,24 @@ Adding or removing a maintainer requires: ### Change log +- 2026-08-19 — [@Wibias](https://github.com/Wibias) stepped down as a maintainer + and is now a contributor. This follows his own decision to stop developing + opencodex; it is not a disciplinary action, and it was made with the owner's + agreement (requirement 1). Requirement 2 does not apply to a maintainer's own + resignation, which needs no second maintainer to ratify it. Requirement 3 is + met by this file and `.github/CODEOWNERS`, where the default-reviewer line + and the four runtime paths that listed him (`/src/adapters/`, + `/src/providers/`, `/src/codex/`, `/src/server/`) drop back to the two + remaining maintainers. Repository permission was reduced to read access at + the same time, so the roster and the GitHub settings agree again. + + Nothing he authored is being unwound. His commits, the pull requests he + merged, the release-note attributions, and the code comments citing his + reviews stay exactly as they are, and the trust-lane gate derived from his + work in `.github/scripts/pr-sponsored-surface.cjs` keeps its attribution. + Returning to the maintainer table later would go through the same three + requirements that govern every addition. + - 2026-07-27 — [@Wibias](https://github.com/Wibias) added as a maintainer. Requirement 1 (agreement from the project owner) is met: the owner requested the addition. **Requirement 2 (review by another current maintainer) was @@ -105,10 +132,10 @@ Adding or removing a maintainer requires: carried the addition (`a2693c02`, `dc3a4ade`, `02bbd47a`) landed on `dev` as direct owner pushes with no associated pull request, so no second maintainer reviewed them. Requirement 3 is met by this file and `.github/CODEOWNERS`. - The addition is in effect regardless: @Wibias holds write access on the - repository and has been merging pull requests since 2026-07-26. This entry - records the gap rather than papering over it — a later maintainer change - should go through a reviewed pull request. + The addition took effect regardless: @Wibias held write access on the + repository and merged pull requests from 2026-07-26 until he stepped down on + 2026-08-19. This entry records the gap rather than papering over it — a later + maintainer change should go through a reviewed pull request. Scope covers issue and pull-request triage, `dev` integration, and provider/CI maintenance. (This entry originally also described carrying diff --git a/src/providers/antigravity-models.ts b/src/providers/antigravity-models.ts index bf155b543c..1dc20d01f7 100644 --- a/src/providers/antigravity-models.ts +++ b/src/providers/antigravity-models.ts @@ -49,6 +49,15 @@ const RETIRED_FLASH_TIERS: Record = { "gemini-3-flash-agent": "high", }; +// Some discovery responses still publish the current Flash thinking levels as +// separate rows. These IDs are picker-visible when the response contains only a +// partial tier set, but CCA accepts them only through the tiered wire ID. +const CURRENT_FLASH_DISCOVERY_TIERS: Record = { + "gemini-3.7-flash-low": "low", + "gemini-3.7-flash-medium": "medium", + "gemini-3.7-flash-high": "high", +}; + const ANTIGRAVITY_WIRE_MODELS = [ "gemini-3.7-flash-tiered", "gemini-3.1-pro-low", @@ -511,17 +520,25 @@ export function retiredAntigravityFlashTier(modelId: string): string | undefined * Resolve a picker-visible base model + optional reasoning effort to the CCA wire model ID. * * Precedence (evaluated in order): - * 1. Suffix wire ID or compat alias → resolve via `resolveAntigravityWireModelId`, no thinkingConfig. - * 2. Mapped Gemini base with effort → return mapped wire ID + thinkingLevel. - * 3. Mapped Gemini base without effort → return default-effort wire ID, no thinkingConfig. - * 4. Claude Opus with effort → return identity + thinkingLevel (no suffix variants exist). - * 5. All other IDs → return `resolveAntigravityWireModelId(modelId)`, no thinkingConfig. + * 1. Current Flash discovery tier → tiered wire ID + its thinkingLevel. + * 2. Suffix wire ID or compat alias → resolve via `resolveAntigravityWireModelId`, no thinkingConfig. + * 3. Mapped Gemini base with effort → return mapped wire ID + thinkingLevel. + * 4. Mapped Gemini base without effort → return default-effort wire ID, no thinkingConfig. + * 5. Claude Opus with effort → return identity + thinkingLevel (no suffix variants exist). + * 6. All other IDs → return `resolveAntigravityWireModelId(modelId)`, no thinkingConfig. */ export function resolveAntigravityEffortWireModel( modelId: string, effort?: string, baseUrl?: string, ): { wireModelId: string; thinkingLevel?: string } { + const discoveryTier = Object.hasOwn(CURRENT_FLASH_DISCOVERY_TIERS, modelId) + ? CURRENT_FLASH_DISCOVERY_TIERS[modelId] + : undefined; + if (discoveryTier) { + return { wireModelId: GEMINI_FLASH_WIRE_ID, thinkingLevel: discoveryTier }; + } + // A collapsed picker row reports ONE representative wire id (whichever tier CCA // listed first), so live discovery cannot describe a ladder — it can only name a // single rung. Letting it answer for a base model we already have a ladder for diff --git a/tests/google-antigravity-wire.test.ts b/tests/google-antigravity-wire.test.ts index 986b3eef45..d613346e3c 100644 --- a/tests/google-antigravity-wire.test.ts +++ b/tests/google-antigravity-wire.test.ts @@ -288,6 +288,24 @@ describe("antigravity CCA envelope", () => { } }); + test("routes partial Gemini 3.7 discovery tiers through thinkingLevel", async () => { + for (const [modelId, thinkingLevel] of [ + ["gemini-3.7-flash-low", "low"], + ["gemini-3.7-flash-medium", "medium"], + ["gemini-3.7-flash-high", "high"], + ] as const) { + expect(resolveAntigravityEffortWireModel(modelId)).toEqual({ + wireModelId: "gemini-3.7-flash-tiered", + thinkingLevel, + }); + + const req = await createGoogleAdapter(effortProvider).buildRequest(parsedWithEffort(modelId)); + const env = JSON.parse(req.body); + expect(env.model).toBe("gemini-3.7-flash-tiered"); + expect(env.request.generationConfig.thinkingConfig).toEqual({ thinkingLevel }); + } + }); + test("ignores inherited CCA model and alias properties", () => { const inheritedModels = Object.create(null) as Record; Object.defineProperty(inheritedModels, "__proto__", {