From 71c57ea647fbc376d1207f11d851c09504c9c02d Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Tue, 25 Aug 2026 10:37:05 +0900 Subject: [PATCH 1/3] release: v2.32.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f73ed2d0e5..063ecfe73e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@bitkyc08/opencodex", - "version": "2.32.0", + "version": "2.32.1", "description": "Universal provider proxy for OpenAI Codex & Claude Code — use any LLM with Codex CLI/App/SDK and Claude Code", "type": "module", "main": "./bin/package-main.mjs", From ec51e42d745d2645bcb22cb67855fa053ba1778e Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Tue, 25 Aug 2026 20:25:22 +0900 Subject: [PATCH 2/3] release: v2.33.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 063ecfe73e..6f8499ffbf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@bitkyc08/opencodex", - "version": "2.32.1", + "version": "2.33.0", "description": "Universal provider proxy for OpenAI Codex & Claude Code — use any LLM with Codex CLI/App/SDK and Claude Code", "type": "module", "main": "./bin/package-main.mjs", From c0c47c363a6326ff83b983c8e30326ae976ba4a8 Mon Sep 17 00:00:00 2001 From: luvs01 Date: Mon, 31 Aug 2026 11:36:29 +0900 Subject: [PATCH 3/3] fix(cursor): isolate Max Mode capability evidence --- src/adapters/cursor/catalog.ts | 28 +++------------------------- src/codex/catalog/provider-fetch.ts | 4 ---- tests/cursor-umbrella-rows.test.ts | 14 +++----------- 3 files changed, 6 insertions(+), 40 deletions(-) diff --git a/src/adapters/cursor/catalog.ts b/src/adapters/cursor/catalog.ts index 9c7fa8b2bb..d6c1f5cba6 100644 --- a/src/adapters/cursor/catalog.ts +++ b/src/adapters/cursor/catalog.ts @@ -441,8 +441,8 @@ function composeWireId(baseId: string, kind: CursorVariantKind, effort: string | * Legacy slugs (thinking/fast/-1m variants) keep resolving forever — picker * rows shrink, routability does not (alias-retention contract, 003). * - * `liveMaxModeIds` optionally extends the static maxMode evidence with the - * bases the live GetUsableModels roster flags (union semantics). + * `liveMaxModeIds` optionally extends the static maxMode evidence with + * route-scoped bases from the selected account's GetUsableModels roster. */ export function resolveCursorSelection( pickedId: string, @@ -465,32 +465,10 @@ export function resolveCursorSelection( ? `${capability.wirePrefix}${canonicalId}` : canonicalId; const ultraRequested = parsed.ultra || reasoning?.toLowerCase() === "ultra"; - const evidence = liveMaxModeIds ?? liveCursorMaxModeBases; - const maxModeArmed = capability.maxModeVerified === true || evidence.has(parsed.baseId); + const maxModeArmed = capability.maxModeVerified === true || liveMaxModeIds?.has(parsed.baseId) === true; return { wireId, canonicalId, maxMode: ultraRequested && maxModeArmed, known: true }; } -/** - * Live Max-Mode evidence (GetUsableModels maxModeModels). Provider discovery - * records the BASES the live roster flags; the resolver unions this with the - * static `maxModeVerified` gate so ultra generalizes automatically as evidence - * arrives — never from window size (devlog 260828 blocker-4 fold). - */ -let liveCursorMaxModeBases: ReadonlySet = new Set(); - -export function recordLiveCursorMaxModeModels(liveIds: readonly string[]): void { - const bases = new Set(); - for (const id of liveIds) { - const parsed = parseCursorVariantId(id); - if (parsed.known) bases.add(parsed.baseId); - } - liveCursorMaxModeBases = bases; -} - -export function liveCursorMaxModeBasesForTests(): ReadonlySet { - return liveCursorMaxModeBases; -} - export interface CursorUmbrellaRow { readonly id: string; readonly efforts: readonly string[]; diff --git a/src/codex/catalog/provider-fetch.ts b/src/codex/catalog/provider-fetch.ts index 6ca2c5a700..cbe654ffc7 100644 --- a/src/codex/catalog/provider-fetch.ts +++ b/src/codex/catalog/provider-fetch.ts @@ -46,7 +46,6 @@ import { routedSlug, slugEquals, slugEquivalenceKey, slugsEquivalent } from "../ import { CODEX_GPT5_IDENTITY_LINE } from "../../adapters/identity"; import { filterCursorConfiguredModelsByLiveDiscovery } from "../../adapters/cursor/discovery"; import { fetchCursorUsableModels } from "../../adapters/cursor/live-models"; -import { recordLiveCursorMaxModeModels } from "../../adapters/cursor/catalog"; import { isCanonicalOpenAiForwardProvider, OPENAI_API_PROVIDER_ID, OPENAI_CODEX_PROVIDER_ID } from "../../providers/openai-tiers"; import { COMBO_NAMESPACE, @@ -1328,9 +1327,6 @@ async function fetchProviderModelsWithAuth( }); if (liveResult.ok) { const available = filterCursorConfiguredModelsByLiveDiscovery(configured, liveResult.models); - // Live Max-Mode evidence feeds the umbrella resolver's ultra gate - // (devlog 260828_cursor_umbrella_catalog; union with static evidence). - recordLiveCursorMaxModeModels(liveResult.maxModeModels ?? []); const result = available.length > 0 ? available : configured; // Cache the discovery-filtered roster without combo retention so a later // gather can re-apply the current capture's retain set on read. diff --git a/tests/cursor-umbrella-rows.test.ts b/tests/cursor-umbrella-rows.test.ts index c560c376ce..cc5777db52 100644 --- a/tests/cursor-umbrella-rows.test.ts +++ b/tests/cursor-umbrella-rows.test.ts @@ -1,7 +1,6 @@ import { describe, expect, test } from "bun:test"; import { cursorUmbrellaRows, - recordLiveCursorMaxModeModels, resolveCursorSelection, } from "../src/adapters/cursor/catalog"; import { CURSOR_STATIC_MODELS, cursorModelReasoningEfforts } from "../src/adapters/cursor/discovery"; @@ -81,17 +80,10 @@ describe("cursor umbrella picker rows (devlog 260828_cursor_umbrella_catalog)", }); }); - describe("live Max-Mode evidence generalizes ultra", () => { - test("recorded live maxModeModels arm ultra for their bases and reset cleanly", () => { - recordLiveCursorMaxModeModels(["claude-opus-4-8-high-fast"]); - try { - expect(resolveCursorSelection("claude-opus-4-8", "ultra").maxMode).toBe(true); - expect(resolveCursorSelection("claude-opus-4-7", "ultra").maxMode).toBe(false); - } finally { - recordLiveCursorMaxModeModels([]); - } + describe("Max-Mode evidence stays request-scoped", () => { + test("omitted live evidence cannot arm ultra for an unverified base", () => { expect(resolveCursorSelection("claude-opus-4-8", "ultra").maxMode).toBe(false); - // Static evidence survives the reset. + // Static evidence remains available without account-local discovery. expect(resolveCursorSelection("kimi-k3", "ultra").maxMode).toBe(true); }); });