From 87524414b83daf5dcfd6c0a5e13302c5c0a0b5c1 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 02:53:03 +0900 Subject: [PATCH 01/88] fix(responses): stop requiring a ChatGPT credential for routed providers #1686 made a caller that proves admission with one of our own secrets substitute the stored main credential, so that secret never leaves the process. That is right for a route that reaches the ChatGPT backend. It was applied by asking HOW the caller authenticated and never WHERE the request routes, so a request bound for a key-authenticated provider - which carries its own credential and never touches ChatGPT - was gated on a credential it has no use for. An install that deliberately never logged into ChatGPT therefore got 401 "No usable Codex main credential" on every routed request, a regression from v2.23.0 reported in #2132. Gate the substitution on route.codexAccountMode, which is set only for the native openai row and is exactly the test for "this route can consume the stored ChatGPT credential". Both pool and direct keep substituting, so #1686's Direct contract is preserved rather than narrowed to pool. Closes #2132 --- src/server/responses/compact.ts | 5 +- src/server/responses/core.ts | 10 +- .../bearer-admission-routed-provider.test.ts | 188 ++++++++++++++++++ 3 files changed, 201 insertions(+), 2 deletions(-) create mode 100644 tests/bearer-admission-routed-provider.test.ts diff --git a/src/server/responses/compact.ts b/src/server/responses/compact.ts index 258d4ece11..ea6813f599 100644 --- a/src/server/responses/compact.ts +++ b/src/server/responses/compact.ts @@ -322,7 +322,10 @@ export async function handleResponsesCompact( // #1686: a bearer-presented admission secret is one of ours, so the stored main credential // is substituted below instead of the caller bearer being forwarded. - const substituteMainCredential = admission?.source === "bearer"; + // #2132: and only when the route is a native Codex one, which is the only route that can + // consume that credential. See the longer note in core.ts resolveResponsesCodexAuth. + const substituteMainCredential = admission?.source === "bearer" + && route.codexAccountMode !== undefined; if (route.codexAccountMode === "direct" && !substituteMainCredential) { try { validateForwardAdmissionCredential(req.headers, config); } catch (err) { diff --git a/src/server/responses/core.ts b/src/server/responses/core.ts index 9e2813d0b5..90fac70755 100644 --- a/src/server/responses/core.ts +++ b/src/server/responses/core.ts @@ -1085,7 +1085,15 @@ async function resolveResponsesCodexAuth( // Refusing it here is what made the codex-cli `env_key` contract unusable against Direct. // Admitting it is only safe because the stored main credential is substituted below, so // the admission secret still never leaves this process. - const substituteMainCredential = options.admission?.source === "bearer"; + // + // #2132: substitution answers "does THIS ROUTE need our stored ChatGPT credential", not + // "how did the caller authenticate". Only a native Codex route reaches the ChatGPT backend + // and can consume that credential; a key-authenticated routed provider carries its own and + // never touches it. Keying on the caller alone made an install that deliberately never + // logged into ChatGPT fail every routed request with "No usable Codex main credential". + // `codexAccountMode` is set only for the native openai row, which is exactly that test. + const substituteMainCredential = options.admission?.source === "bearer" + && route.codexAccountMode !== undefined; if (route.codexAccountMode === "direct" && !substituteMainCredential) { validateForwardAdmissionCredential(req.headers, config); } diff --git a/tests/bearer-admission-routed-provider.test.ts b/tests/bearer-admission-routed-provider.test.ts new file mode 100644 index 0000000000..2baa300393 --- /dev/null +++ b/tests/bearer-admission-routed-provider.test.ts @@ -0,0 +1,188 @@ +import { afterEach, beforeEach, describe, expect, test } from "bun:test"; +import { mkdtempSync, rmSync, writeFileSync } from "node:fs"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import { saveConfig } from "../src/config"; +import { startServer } from "../src/server"; +import type { OcxConfig } from "../src/types"; + +/** + * Issue #2132: bearer admission must not require a stored ChatGPT credential. + * + * #1686 made a caller that proves admission with one of OUR secrets substitute the stored + * main credential, so the admission secret never leaves the process. That is right for a + * route that actually reaches the ChatGPT backend. It was applied by asking HOW the caller + * authenticated and never WHERE the request routes, so a request bound for a + * key-authenticated provider — which carries its own credential and never touches ChatGPT — + * was gated on a credential it has no use for. An install that deliberately never logged + * into ChatGPT got 401 "No usable Codex main credential" on every request. + * + * The substitution itself is unchanged and still fails closed for native routes; only the + * question it is asked changes. + */ + +const originalFetch = globalThis.fetch; +const previousOcxHome = process.env.OPENCODEX_HOME; +const previousCodexHome = process.env.CODEX_HOME; +const previousDataToken = process.env.OPENCODEX_API_AUTH_TOKEN; + +let ocxHome = ""; +let codexHome = ""; +let routedAuth: Array = []; +let nativeAuth: Array = []; + +const ADMISSION_SECRET = "ocx_data_2132secret"; +const ROUTED_KEY = "sk-routed-provider-key"; + +/** A JWT whose `exp` is far in the future, so a stored main token reads as live. */ +function liveJwt(): string { + const payload = Buffer.from(JSON.stringify({ exp: Math.floor(Date.now() / 1000) + 86_400 })).toString("base64url"); + return `header.${payload}.signature`; +} + +/** + * A remote bind (so admission is required rather than loopback-waived) with BOTH a native + * openai row and a key-authenticated routed provider. The routed provider is the one under + * test; the native row has to exist for the negative case to be reachable. + */ +function mixedConfig(): OcxConfig { + return { + port: 0, + hostname: "0.0.0.0", + defaultProvider: "openai", + openaiProviderTierVersion: 2, + providers: { + openai: { + adapter: "openai-responses", + baseUrl: "https://chatgpt.com/backend-api/codex", + authMode: "forward", + codexAccountMode: "direct", + defaultModel: "gpt-5.6-luna", + }, + gateway: { + adapter: "openai-chat", + baseUrl: "https://gateway.example.com/v1", + authMode: "key", + apiKey: ROUTED_KEY, + models: ["gateway-model"], + }, + }, + apiKeys: [ + { id: "env-key", name: "env_key", key: ADMISSION_SECRET, createdAt: "2026-08-20T00:00:00.000Z" }, + ], + } as OcxConfig; +} + +beforeEach(() => { + ocxHome = mkdtempSync(join(tmpdir(), "ocx-2132-home-")); + codexHome = mkdtempSync(join(tmpdir(), "ocx-2132-codex-")); + process.env.OPENCODEX_HOME = ocxHome; + process.env.CODEX_HOME = codexHome; + delete process.env.OPENCODEX_API_AUTH_TOKEN; + routedAuth = []; + nativeAuth = []; + globalThis.fetch = (async (input, init) => { + const raw = input instanceof Request ? input.url : String(input); + const url = new URL(raw); + const headers = new Headers(input instanceof Request ? input.headers : init?.headers); + if (url.hostname === "gateway.example.com") { + routedAuth.push(headers.get("authorization")); + return Response.json({ + id: "chatcmpl_2132", + object: "chat.completion", + created: 0, + model: "gateway-model", + choices: [{ index: 0, message: { role: "assistant", content: "ok" }, finish_reason: "stop" }], + }); + } + if (url.hostname === "chatgpt.com" || url.hostname === "api.openai.com") { + nativeAuth.push(headers.get("authorization")); + return Response.json({ id: "resp_2132", object: "response", status: "completed", output: [] }); + } + return originalFetch(input, init); + }) as typeof fetch; +}); + +afterEach(() => { + globalThis.fetch = originalFetch; + if (previousOcxHome === undefined) delete process.env.OPENCODEX_HOME; + else process.env.OPENCODEX_HOME = previousOcxHome; + if (previousCodexHome === undefined) delete process.env.CODEX_HOME; + else process.env.CODEX_HOME = previousCodexHome; + if (previousDataToken === undefined) delete process.env.OPENCODEX_API_AUTH_TOKEN; + else process.env.OPENCODEX_API_AUTH_TOKEN = previousDataToken; + if (ocxHome) rmSync(ocxHome, { recursive: true, force: true }); + if (codexHome) rmSync(codexHome, { recursive: true, force: true }); + ocxHome = ""; + codexHome = ""; +}); + +async function postResponses(url: string | URL, model: string): Promise { + return originalFetch(new URL("/v1/responses", url), { + method: "POST", + headers: { "content-type": "application/json", authorization: `Bearer ${ADMISSION_SECRET}` }, + body: JSON.stringify({ model, input: "hi", stream: false }), + }); +} + +describe("#2132 bearer admission does not require a ChatGPT credential for routed providers", () => { + test("a key-authenticated route is served with no stored main credential", async () => { + saveConfig(mixedConfig()); + // The reported install: no ChatGPT login was ever performed. + writeFileSync(join(codexHome, "auth.json"), JSON.stringify({ tokens: {} })); + + const server = startServer(0); + try { + const response = await postResponses(server.url, "gateway/gateway-model"); + + // Before this change the same request answered 401 "No usable Codex main credential", + // because admission-by-bearer alone decided a ChatGPT token had to be substituted. + expect(response.status).toBe(200); + // The provider's own key is what authenticates it, and our admission secret stays home. + expect(routedAuth).toEqual([`Bearer ${ROUTED_KEY}`]); + expect(routedAuth.join("|")).not.toContain(ADMISSION_SECRET); + expect(nativeAuth).toHaveLength(0); + } finally { + await server.stop(true); + } + }); + + test("a native route with no stored main credential still fails closed", async () => { + saveConfig(mixedConfig()); + writeFileSync(join(codexHome, "auth.json"), JSON.stringify({ tokens: {} })); + + const server = startServer(0); + try { + const response = await postResponses(server.url, "gpt-5.6-luna"); + + // This is the #1686 guarantee and it must survive: a native route genuinely needs the + // stored credential, so it fails BEFORE any upstream I/O rather than forwarding ours. + expect(response.status).toBe(401); + expect(nativeAuth).toHaveLength(0); + expect(routedAuth).toHaveLength(0); + } finally { + await server.stop(true); + } + }); + + test("a native route still substitutes the stored main credential when one exists", async () => { + saveConfig(mixedConfig()); + const stored = liveJwt(); + writeFileSync( + join(codexHome, "auth.json"), + JSON.stringify({ tokens: { access_token: stored, account_id: "stored_main_acc" } }), + ); + + const server = startServer(0); + try { + const response = await postResponses(server.url, "gpt-5.6-luna"); + + expect(response.status).toBe(200); + expect(nativeAuth).toEqual([`Bearer ${stored}`]); + expect(nativeAuth.join("|")).not.toContain(ADMISSION_SECRET); + } finally { + await server.stop(true); + } + }); +}); + From 5904178c349c555704b5f461ef38a47a47324074 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 03:16:11 +0900 Subject: [PATCH 02/88] fix(responses): drop the retired prompt_cache_retention for gpt-5.6 The ChatGPT backend 400s a gpt-5.6 request that still carries prompt_cache_retention: "Unsupported parameter". GPT-5.6 replaced the field with prompt_cache_options.ttl. Strip it on the canonical ChatGPT forward path for the gpt-5.6 family only. The retired value is not translated into the replacement field: 5.6 carries a different TTL contract and implicit caching still applies, so inventing one would change a caching decision the caller never made. The narrowness is the fix, not an omission. An older model may still honor the field, and a self-hosted or third-party forward gateway may still accept it, so both axes are pinned by non-match tests. Based on @lilinxiong's implementation in #2102, with an exact-or-dashed-prefix family match so a future gpt-5.60 is not swept up. Closes #2092 --- src/adapters/openai-responses.ts | 27 +++++++ tests/openai-responses-passthrough.test.ts | 86 ++++++++++++++++++++++ 2 files changed, 113 insertions(+) diff --git a/src/adapters/openai-responses.ts b/src/adapters/openai-responses.ts index a8bbab8bfd..fc70252553 100644 --- a/src/adapters/openai-responses.ts +++ b/src/adapters/openai-responses.ts @@ -185,6 +185,28 @@ function stripUnsupportedReasoningParams(body: unknown): unknown { return { ...body, reasoning: Object.keys(rest).length > 0 ? rest : undefined }; } +/** + * GPT-5.6 replaced the legacy 24-hour retention field with `prompt_cache_options.ttl`, and the + * ChatGPT backend 400s the whole request when the retired field is present (issue #2092). + * + * The retired field is NOT translated to the replacement: 5.6 carries a different TTL contract, + * and implicit caching still applies when the caller sent no replacement options. Inventing a + * value here would silently change a caching decision the caller never made. + * + * Deliberately narrow on both axes, because a wider strip is a behavior change rather than a fix: + * only the gpt-5.6 family (an older model may still honor the field), and only on the canonical + * ChatGPT backend, which is the deployment that rejects it. Matching is exact-or-dashed-prefix so + * a future `gpt-5.60` is not swept up by a bare `startsWith`. + */ +function stripDeprecatedPromptCacheRetention(body: unknown, modelId: unknown): unknown { + if (!isPlainObject(body)) return body; + if (typeof modelId !== "string") return body; + if (modelId !== "gpt-5.6" && !modelId.startsWith("gpt-5.6-")) return body; + if (!Object.hasOwn(body, "prompt_cache_retention")) return body; + const { prompt_cache_retention: _retention, ...rest } = body; + return rest; +} + /** * A false model capability prevents Codex from emitting summary fields after the catalog refresh. * Strip them here as well so an already-running client with a stale catalog cannot keep sending an @@ -1491,6 +1513,11 @@ export function createResponsesPassthroughAdapter(provider: OcxProviderConfig): } if (forward) { outBody = stripUnsupportedForwardParams(outBody); + // Only the canonical ChatGPT backend rejects the retired field; a self-hosted or + // third-party forward gateway may still accept it, so this must not be widened. + if (isCanonicalOpenAiForwardProvider(provider)) { + outBody = stripDeprecatedPromptCacheRetention(outBody, parsed.modelId); + } } else { outBody = preferConfiguredHostedTools( outBody, diff --git a/tests/openai-responses-passthrough.test.ts b/tests/openai-responses-passthrough.test.ts index c2e9d38a71..ca1fe971b9 100644 --- a/tests/openai-responses-passthrough.test.ts +++ b/tests/openai-responses-passthrough.test.ts @@ -822,6 +822,92 @@ describe("OpenAI Responses passthrough sanitization", () => { expect(body.prompt_cache_retention).toBe("24h"); }); + /** + * Issue #2092: the ChatGPT backend 400s a gpt-5.6 request that still carries the retired + * `prompt_cache_retention`. The strip is deliberately narrow, and these cases pin the + * narrowness itself — a wider strip passes the first block and fails the second. + */ + test.each(["gpt-5.6", "gpt-5.6-sol", "gpt-5.6-terra", "gpt-5.6-luna"])( + "drops the retired prompt_cache_retention for %s without inventing replacement options", + modelId => { + const adapter = createResponsesPassthroughAdapter(provider); + const request = adapter.buildRequest({ + modelId, + context: { messages: [] }, + stream: true, + options: {}, + _rawBody: { model: modelId, input: "hi", prompt_cache_retention: "24h" }, + }, { headers: new Headers({ authorization: "Bearer token" }) }); + const body = JSON.parse(request.body) as { + prompt_cache_retention?: string; + prompt_cache_options?: unknown; + }; + + expect(body.prompt_cache_retention).toBeUndefined(); + // Translating "24h" into the replacement field would invent a caching decision the + // caller never made, so absence must stay absence. + expect(body.prompt_cache_options).toBeUndefined(); + }, + ); + + test("keeps caller-sent prompt_cache_options while dropping the retired retention", () => { + const adapter = createResponsesPassthroughAdapter(provider); + const request = adapter.buildRequest({ + modelId: "gpt-5.6-sol", + context: { messages: [] }, + stream: true, + options: {}, + _rawBody: { + model: "gpt-5.6-sol", + input: "hi", + prompt_cache_retention: "24h", + prompt_cache_options: { ttl: "30m" }, + }, + }, { headers: new Headers({ authorization: "Bearer token" }) }); + const body = JSON.parse(request.body) as { + prompt_cache_retention?: string; + prompt_cache_options?: { ttl?: string }; + }; + + expect(body.prompt_cache_retention).toBeUndefined(); + expect(body.prompt_cache_options).toEqual({ ttl: "30m" }); + }); + + test("a near-miss model id is not swept up by the gpt-5.6 family match", () => { + const adapter = createResponsesPassthroughAdapter(provider); + const request = adapter.buildRequest({ + modelId: "gpt-5.60", + context: { messages: [] }, + stream: true, + options: {}, + _rawBody: { model: "gpt-5.60", input: "hi", prompt_cache_retention: "24h" }, + }, { headers: new Headers({ authorization: "Bearer token" }) }); + const body = JSON.parse(request.body) as { prompt_cache_retention?: string }; + + // A bare startsWith("gpt-5.6") would strip here and silently change an unrelated model. + expect(body.prompt_cache_retention).toBe("24h"); + }); + + test("a noncanonical forward gateway keeps the field even for gpt-5.6", () => { + const adapter = createResponsesPassthroughAdapter({ + adapter: "openai-responses", + baseUrl: "https://gateway.example/v1", + authMode: "forward" as const, + }); + const request = adapter.buildRequest({ + modelId: "gpt-5.6-sol", + context: { messages: [] }, + stream: true, + options: {}, + _rawBody: { model: "gpt-5.6-sol", input: "hi", prompt_cache_retention: "24h" }, + }, { headers: new Headers({ authorization: "Bearer token" }) }); + const body = JSON.parse(request.body) as { prompt_cache_retention?: string }; + + // Only the canonical ChatGPT backend is known to reject it. Stripping everywhere would be + // a behavior change for deployments that still honor the field. + expect(body.prompt_cache_retention).toBe("24h"); + }); + const expandedRawBody = { model: "gpt-5.5", previous_response_id: "resp_1", From f9c224b70abcb4237d166d93fd10677791719b51 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 03:28:28 +0900 Subject: [PATCH 03/88] fix(routing): resolve model-keyed lookups the way the runtime resolves them Two evidence surfaces read per-model config with a bare map lookup while the runtime resolves the same keys through modelRecordValue, so family and case overrides were invisible to them and a prototype-shaped id resolved an Object.prototype member instead of missing. Routing capability evidence therefore gave gpt-oss:120b the provider-wide 8k window instead of the gpt-oss family's 131072, and ignored noVisionModels - values that select candidates, not just logs. The Lab behavior report missed the same overrides, and "constructor" resolved to Object.prototype.constructor, which made jcsStringify throw and silently dropped Lab subjects. Exact-own maps (modelPreferHostedTools, modelOpenRouterRouting) deliberately do not family-spread; that boundary is pinned by tests. Both patches are @ntdatt812's work from #2100 and #2077, applied unchanged. Closes #2100 Closes #2077 --- src/routing/capability.ts | 35 ++-- src/routing/compatibility/behavior.ts | 44 ++++- .../routing-capability-model-matching.test.ts | 152 ++++++++++++++++++ ...uting-compatibility-model-matching.test.ts | 126 +++++++++++++++ 4 files changed, 345 insertions(+), 12 deletions(-) create mode 100644 tests/routing-capability-model-matching.test.ts diff --git a/src/routing/capability.ts b/src/routing/capability.ts index b49cac897e..0681f64860 100644 --- a/src/routing/capability.ts +++ b/src/routing/capability.ts @@ -10,7 +10,7 @@ * how that affects eligibility. */ -import type { OcxConfig } from "../types"; +import { modelInList, type OcxConfig } from "../types"; import { isCanonicalOpenAiForwardProvider, OPENAI_CODEX_PROVIDER_ID } from "../providers/openai-tiers"; import { serviceTierSupportForModel } from "../providers/service-tier"; import { PROVIDER_REGISTRY } from "../providers/registry"; @@ -21,6 +21,7 @@ import { nativeReasoningEfforts, } from "../codex/catalog/metadata"; import { readCatalog, readCodexCatalogPath } from "../codex/catalog/parsing"; +import { modelRecordValue } from "../reasoning-effort"; import { statSync } from "node:fs"; import type { RouteCapabilityEvidence } from "./trace"; @@ -159,9 +160,14 @@ export function candidateCapabilityEvidence( const catalogRow = cachedCatalogModels().find(model => model.provider === providerName && model.id === modelId); const isNative = providerName === OPENAI_CODEX_PROVIDER_ID && !modelId.includes("/"); - const rawContextWindow = provider?.modelContextWindows?.[modelId] + // `modelRecordValue`, not a bare lookup: every runtime reader of these three maps + // resolves them that way, so a `gpt-oss` entry covers `gpt-oss:120b`. Reading raw + // made the evidence disagree with the resolver it claims to describe — and for the + // window it did not even degrade to unknown, it fell through to the provider-wide + // value, which is a definite wrong answer rather than an absent one. + const rawContextWindow = modelRecordValue(provider?.modelContextWindows, modelId) ?? provider?.contextWindow - ?? registryEntry?.modelContextWindows?.[modelId] + ?? modelRecordValue(registryEntry?.modelContextWindows, modelId) ?? catalogRow?.contextWindow ?? (isNative ? nativeOpenAiContextWindow(modelId, nativeContextLimits(config)) : undefined); // Native rows go through the accessor (raise-to-ceiling + opt-in). Routed rows keep @@ -170,10 +176,21 @@ export function candidateCapabilityEvidence( ? (nativeOpenAiContextWindow(modelId, nativeContextLimits(config)) ?? rawContextWindow) : rawContextWindow; - const modalities = provider?.modelInputModalities?.[modelId] - ?? registryEntry?.modelInputModalities?.[modelId] - ?? catalogRow?.inputModalities - ?? (isNative ? nativeInputModalities(modelId) : undefined); + // `noVisionModels` is checked before the modality chain because that is the order + // `isModelTextOnly` uses: it matches the no-vision list and returns true before it + // ever reads `modelInputModalities` (`src/vision/index.ts:32`). So a `gpt-oss` + // no-vision entry beats an exact `gpt-oss:120b` entry that lists "image", and + // deriving `image` from the modality chain alone reported vision on a model the + // runtime refuses it for. That matters more here than on the CLI surface fixed in + // #2086: routing *acts* on this evidence, so it would select the candidate for image + // work that execution then rejects. + const noVision = modelInList(provider?.noVisionModels, modelId); + const modalities = noVision + ? ["text"] + : (modelRecordValue(provider?.modelInputModalities, modelId) + ?? modelRecordValue(registryEntry?.modelInputModalities, modelId) + ?? catalogRow?.inputModalities + ?? (isNative ? nativeInputModalities(modelId) : undefined)); const image = Array.isArray(modalities) ? modalities.includes("image") : undefined; @@ -196,8 +213,8 @@ export function candidateCapabilityEvidence( || provider?.parallelToolCalls === true || undefined; - const reasoningEfforts = provider?.modelReasoningEfforts?.[modelId] - ?? registryEntry?.modelReasoningEfforts?.[modelId] + const reasoningEfforts = modelRecordValue(provider?.modelReasoningEfforts, modelId) + ?? modelRecordValue(registryEntry?.modelReasoningEfforts, modelId) ?? (isNative ? nativeReasoningEfforts(modelId) : undefined); const tierSupport = provider diff --git a/src/routing/compatibility/behavior.ts b/src/routing/compatibility/behavior.ts index 5abf08f17d..58e02f62fb 100644 --- a/src/routing/compatibility/behavior.ts +++ b/src/routing/compatibility/behavior.ts @@ -1,3 +1,4 @@ +import { modelRecordValue } from "../../reasoning-effort"; import { modelInList } from "../../types"; import type { OcxConfig, OcxProviderConfig } from "../../types"; import { PROVIDER_REGISTRY } from "../../providers/registry"; @@ -51,8 +52,45 @@ function includesModel(list: string[] | undefined, modelId: string): boolean { return modelInList(list, modelId); } +/** + * Per-model override lookup for the nine family-aware report rows. + * + * Delegates to modelRecordValue so the report reads these maps the way the + * runtime does -- own properties only, then the pre-colon family, then a + * case-folded key. A bare index disagreed on all three: it missed the + * `gpt-oss` entry ollama-cloud's `gpt-oss:120b` actually resolves, missed a + * differently-cased key, and walked the prototype chain, so a routed model id + * of `constructor`/`toString` yielded an Object.prototype function. That last + * one made buildBehaviorFingerprintV1 throw ("unsupported value type + * function"); the caller catches it (`src/routing/compatibility/subject.ts:125`) + * and returns no route, so the subject is silently dropped -- and the linker + * contract says implementations do not throw. + * + * Not every override map belongs here. `modelPreferHostedTools` and + * `modelOpenRouterRouting` are exact-own at runtime and go through + * `exactOwnValue` below; widening those to the family would be this same bug + * with the sign flipped. + */ function modelValue(map: Record | undefined, modelId: string): T | undefined { - return map?.[modelId]; + return modelRecordValue(map, modelId); +} + +/** + * Exact, own-property lookup for the two maps the runtime resolves that way. + * + * `modelPreferHostedTools` and `modelOpenRouterRouting` are deliberately exact: the + * adapter reads the first through `hasOwnProperty` + * (`src/adapters/openai-responses.ts:1001`) and the second through `Object.hasOwn` + * (`src/providers/openrouter-routing.ts:89`), and the type documents the first as + * "Exact-model hosted tools" (`src/types.ts:1584`). Sending them through + * `modelRecordValue` would make the report say a `gpt-oss` entry applies to + * `gpt-oss:120b` when the adapter will never apply it -- the same divergence this + * file exists to remove, pointed the other way. A bare index is not the answer + * either: it walks the prototype chain, which is the bug `modelValue` just fixed. + * Neither existing primitive is right for these two, so this is the third one. + */ +function exactOwnValue(map: Record | undefined, modelId: string): T | undefined { + return map !== undefined && Object.hasOwn(map, modelId) ? map[modelId] : undefined; } const CREDENTIAL_HEADER = /(authorization|api[-_]?key|token|secret|credential|cookie)/i; @@ -69,7 +107,7 @@ function nonCredentialHeaderDigest( } function effectiveOpenRouterRouting(effective: OcxProviderConfig, modelId: string) { - return effective.modelOpenRouterRouting?.[modelId] ?? effective.openRouterRouting; + return exactOwnValue(effective.modelOpenRouterRouting, modelId) ?? effective.openRouterRouting; } /** @@ -184,7 +222,7 @@ export function resolveProductionBehaviorValues( effective.parallelToolCalls ?? (upstreamProtocol === "openai-chat"), ), "tools.hostedPreference": behaviorRow("provider_config", { - tools: modelValue(effective.modelPreferHostedTools, modelId) ?? [], + tools: exactOwnValue(effective.modelPreferHostedTools, modelId) ?? [], }), "tools.builtinNameEscaping": behaviorRow("provider_config", effective.escapeBuiltinToolNames === true), "cache.forwarding": behaviorRow("provider_config", effective.promptCacheKey === true), diff --git a/tests/routing-capability-model-matching.test.ts b/tests/routing-capability-model-matching.test.ts new file mode 100644 index 0000000000..d8839b1f98 --- /dev/null +++ b/tests/routing-capability-model-matching.test.ts @@ -0,0 +1,152 @@ +import { describe, expect, test } from "bun:test"; +import { candidateCapabilityEvidence } from "../src/routing/capability"; +import { PROVIDER_REGISTRY } from "../src/providers/registry"; +import { modelRecordValue } from "../src/reasoning-effort"; +import { isModelTextOnly } from "../src/vision"; +import type { OcxConfig, OcxProviderConfig } from "../src/types"; + +/** + * `candidateCapabilityEvidence` describes what the resolver will do with a candidate, + * so it has to match the resolver. Every runtime reader of `modelContextWindows`, + * `modelInputModalities` and `modelReasoningEfforts` goes through `modelRecordValue` + * (`src/reasoning-effort.ts:108`, `src/server/effort-policy.ts:122`, + * `src/vision/index.ts:34`, `src/codex/catalog/provider-fetch.ts:612`), which accepts a + * family entry for a tagged id. This file pins the evidence to that same rule. + * + * The window matters most: a bare lookup did not degrade to unknown there, it fell + * through to the provider-wide `contextWindow` — a definite wrong answer, which the + * module's own "unknown is not zero" contract is written to avoid. + */ + +function providerWithFamilyEntries(): OcxProviderConfig { + return { + adapter: "openai-chat", + baseUrl: "https://example.test/v1", + contextWindow: 8_000, + models: ["gpt-oss:120b"], + modelContextWindows: { "gpt-oss": 131_072 }, + modelInputModalities: { "gpt-oss": ["text"] }, + modelReasoningEfforts: { "gpt-oss": ["low", "high"] }, + } as unknown as OcxProviderConfig; +} + +function configFor(provider: OcxProviderConfig): OcxConfig { + return { providers: { custom: provider } } as unknown as OcxConfig; +} + +describe("candidateCapabilityEvidence model matching", () => { + test("a family entry covers its tagged siblings, as the resolver does", () => { + const provider = providerWithFamilyEntries(); + + // Ground truth first: what the runtime itself resolves off this config. + expect(modelRecordValue(provider.modelContextWindows, "gpt-oss:120b")).toBe(131_072); + expect(isModelTextOnly(provider, "gpt-oss:120b")).toBe(true); + + const evidence = candidateCapabilityEvidence(configFor(provider), "custom", "gpt-oss:120b"); + expect(evidence.contextWindow).toBe(131_072); + expect(evidence.image).toBe(false); + expect(evidence.reasoningEfforts).toEqual(["low", "high"]); + }); + + test("the window does not fall through to the provider-wide value", () => { + // The specific regression: the provider-wide 8_000 is not "unknown", it is a + // definite answer belonging to a different model, and routing would act on it. + // Asserted as the exact expected number rather than `not.toBe(8_000)`, which + // would also pass for `undefined` or any other wrong value. + const evidence = candidateCapabilityEvidence( + configFor(providerWithFamilyEntries()), + "custom", + "gpt-oss:120b", + ); + expect(evidence.contextWindow).toBe(131_072); + }); + + test("an exact entry still wins over the family entry", () => { + const provider = { + ...providerWithFamilyEntries(), + modelContextWindows: { "gpt-oss": 131_072, "gpt-oss:20b": 32_000 }, + } as unknown as OcxProviderConfig; + expect(candidateCapabilityEvidence(configFor(provider), "custom", "gpt-oss:20b").contextWindow) + .toBe(32_000); + }); + + test("an unrelated model still falls back to the provider-wide window", () => { + const evidence = candidateCapabilityEvidence( + configFor(providerWithFamilyEntries()), + "custom", + "some-other-model", + ); + expect(evidence.contextWindow).toBe(8_000); + expect(evidence.reasoningEfforts).toBeUndefined(); + }); + + test("a registry entry covers its tagged siblings with no provider configured", () => { + // The three registry lookups (capability.ts lines 170/180/206) are a separate branch + // from the configured-provider ones above: they are only reached when the provider is + // absent from the config, which every other case here supplies. + const registryEntry = PROVIDER_REGISTRY.find(entry => entry.id === "xai"); + if (!registryEntry) throw new Error("fixture drift: no `xai` entry in PROVIDER_REGISTRY"); + + // Pin the fixture's shape rather than its values, so registry churn does not turn + // into a false failure here while real drift still does. + const family = "grok-4.6"; + expect(registryEntry.modelContextWindows?.[family]).toBeNumber(); + expect(registryEntry.modelInputModalities?.[family]).toBeArray(); + expect(registryEntry.modelReasoningEfforts?.[family]).toBeArray(); + + const emptyConfig = { providers: {} } as unknown as OcxConfig; + const evidence = candidateCapabilityEvidence(emptyConfig, "xai", `${family}:latest`); + + expect(evidence.contextWindow).toBe(registryEntry.modelContextWindows![family]); + expect(evidence.image).toBe(registryEntry.modelInputModalities![family].includes("image")); + expect(evidence.reasoningEfforts).toEqual(registryEntry.modelReasoningEfforts![family]); + }); + + test("noVisionModels beats an exact modality entry, as isModelTextOnly does", () => { + // `isModelTextOnly` matches the no-vision list and returns true before it ever + // reads `modelInputModalities`, so the `gpt-oss` no-vision entry wins over an + // exact `gpt-oss:120b` entry listing "image". Evidence that disagrees here is + // worse than a wrong window: routing selects the candidate for image work and + // execution then refuses it. + const provider = { + ...providerWithFamilyEntries(), + noVisionModels: ["gpt-oss"], + modelInputModalities: { "gpt-oss:120b": ["text", "image"] }, + } as unknown as OcxProviderConfig; + + // Ground truth first: the resolver this evidence claims to describe says text-only. + expect(isModelTextOnly(provider, "gpt-oss:120b")).toBe(true); + + const evidence = candidateCapabilityEvidence(configFor(provider), "custom", "gpt-oss:120b"); + expect(evidence.image).toBe(false); + }); + + test("a model outside noVisionModels keeps its declared image modality", () => { + // The negative half: the no-vision check must not spread to models the list does + // not cover, or the fix would trade a false positive for a false negative. + const provider = { + ...providerWithFamilyEntries(), + models: ["gpt-oss:120b", "llava:13b"], + noVisionModels: ["gpt-oss"], + modelInputModalities: { "llava:13b": ["text", "image"] }, + } as unknown as OcxProviderConfig; + + expect(isModelTextOnly(provider, "llava:13b")).toBe(false); + expect(candidateCapabilityEvidence(configFor(provider), "custom", "llava:13b").image).toBe(true); + }); + + test("a prototype-shaped model id resolves nothing", () => { + // modelRecordValue uses hasOwnProperty; a bare lookup would return Object.prototype + // members here and hand routing a function as evidence. + for (const modelId of ["constructor", "toString", "valueOf", "hasOwnProperty"]) { + const evidence = candidateCapabilityEvidence( + configFor(providerWithFamilyEntries()), + "custom", + modelId, + ); + expect(evidence.contextWindow).toBe(8_000); + expect(evidence.reasoningEfforts).toBeUndefined(); + expect(evidence.image).toBeUndefined(); + } + }); +}); diff --git a/tests/routing-compatibility-model-matching.test.ts b/tests/routing-compatibility-model-matching.test.ts index 1dee27be25..f3a26f39dd 100644 --- a/tests/routing-compatibility-model-matching.test.ts +++ b/tests/routing-compatibility-model-matching.test.ts @@ -7,6 +7,9 @@ import { describe, expect, test } from "bun:test"; import { resolveProductionBehaviorValues } from "../src/routing/compatibility/behavior"; import { createOpenAIChatAdapter } from "../src/adapters/openai-chat"; +import { buildBehaviorFingerprintV1 } from "../src/lab/subject/behavior-fingerprint"; +import { resolveOpenRouterRouting } from "../src/providers/openrouter-routing"; +import { modelRecordValue } from "../src/reasoning-effort"; import type { OcxConfig, OcxParsedRequest, OcxProviderConfig } from "../src/types"; // ollama-cloud ships `gpt-oss:120b` verbatim (src/providers/registry.ts) and the same @@ -72,3 +75,126 @@ describe("behavior report must agree with the wire the adapter actually builds", expect(v["reasoning.budgetMode"]!.value).toBe(false); }); }); + +// The list-shaped options above are one half of the report. The other half is the +// per-model override maps, which the runtime reads through modelRecordValue: own +// properties, then the pre-colon family, then a case-folded key. + +const OVERRIDES: OcxProviderConfig = { + adapter: "openai-chat", + baseUrl: "https://ollama.com/v1", + apiKey: "sk-test", + authMode: "key", + modelMaxOutputTokens: { "gpt-oss": 1234 }, + modelContextWindows: { "GPT-OSS": 55_555 }, +}; + +const overrideConfig = { providers: { "ollama-cloud": OVERRIDES } } as unknown as OcxConfig; + +const overrideValues = (modelId: string) => + resolveProductionBehaviorValues(overrideConfig, "ollama-cloud", modelId, OVERRIDES, "salt")!; + +describe("behavior report reads per-model overrides the way the runtime does", () => { + test("the adapter really applies the bare-family override to the :tag model (ground truth)", () => { + const parsed: OcxParsedRequest = { + modelId: MODEL, + context: { messages: [{ role: "user", content: "hi", timestamp: 0 }] }, + stream: false, + options: {}, + }; + const body = JSON.parse(createOpenAIChatAdapter(OVERRIDES).buildRequest(parsed).body as string); + expect(body.max_tokens).toBe(1234); + }); + + test("report agrees: limits.maxOutputTokens for the :tag model", () => { + expect(overrideValues(MODEL)["limits.maxOutputTokens"]!.value).toBe(1234); + }); + + test("a case-folded key still resolves", () => { + expect(overrideValues("gpt-oss")["limits.contextWindow"]!.value).toBe(55_555); + }); + + test("an unrelated model gets no override (control)", () => { + expect(overrideValues("glm-5.3")["limits.maxOutputTokens"]!.value).toBeNull(); + }); +}); + +// Model ids are operator-controlled, so one can collide with Object.prototype. +// openai-responses.ts already guards modelPreferHostedTools for exactly this. +describe("a prototype-shaped model id resolves to no override", () => { + test.each(["constructor", "toString", "valueOf", "hasOwnProperty"])( + "%s yields null rather than an inherited function", + (modelId) => { + const v = overrideValues(modelId); + expect(v["limits.contextWindow"]!.value).toBeNull(); + expect(v["limits.maxOutputTokens"]!.value).toBeNull(); + expect(typeof v["modalities.input"]!.value).not.toBe("function"); + }, + ); + + test("so the behavior fingerprint stays computable", () => { + // jcsStringify rejects a function, and resolvePassiveRouteSubjectId swallows the + // throw -- the subject would silently never link. + expect(() => buildBehaviorFingerprintV1(overrideValues("constructor"))).not.toThrow(); + expect(buildBehaviorFingerprintV1(overrideValues("constructor"))) + .toBe(buildBehaviorFingerprintV1(overrideValues("toString"))); + }); +}); + +// Not every override map is family-aware, and the two that are not must stay that way. +// The adapter reads `modelPreferHostedTools` through `hasOwnProperty` +// (`src/adapters/openai-responses.ts:1001`) and `resolveOpenRouterRouting` reads +// `modelOpenRouterRouting` through `Object.hasOwn` (`src/providers/openrouter-routing.ts:89`); +// the type calls the first "Exact-model hosted tools" (`src/types.ts:1584`). Sending +// these through modelRecordValue would be the divergence above with the sign flipped: +// the report would claim an override applies that the adapter will never apply. +const EXACT_ONLY: OcxProviderConfig = { + adapter: "openai-responses", + baseUrl: "https://openrouter.ai/api/v1", + apiKey: "sk-test", + authMode: "key", + modelPreferHostedTools: { "gpt-oss": ["image_generation"] }, + modelOpenRouterRouting: { "gpt-oss": { order: ["fireworks"] } }, +} as unknown as OcxProviderConfig; + +const exactConfig = { providers: { "ollama-cloud": EXACT_ONLY } } as unknown as OcxConfig; + +const exactValues = (modelId: string) => + resolveProductionBehaviorValues(exactConfig, "ollama-cloud", modelId, EXACT_ONLY, "salt")!; + +describe("exact-own override maps must not spread to the family", () => { + test("the runtime really does not apply the bare-family entry to the :tag model (ground truth)", () => { + // openRouter routing is resolvable directly, so this half is executable rather than cited. + expect(resolveOpenRouterRouting(EXACT_ONLY, "gpt-oss")).toEqual({ order: ["fireworks"] }); + expect(resolveOpenRouterRouting(EXACT_ONLY, MODEL)).toBeUndefined(); + + // And the divergence is real rather than theoretical: the family-aware primitive + // resolves the entry that the adapter's own-property guard does not see. + expect(modelRecordValue(EXACT_ONLY.modelPreferHostedTools, MODEL)).toEqual(["image_generation"]); + expect(Object.hasOwn(EXACT_ONLY.modelPreferHostedTools!, MODEL)).toBe(false); + }); + + test("report agrees: the :tag model gets no hosted-tool preference", () => { + expect(exactValues(MODEL)["tools.hostedPreference"]!.value).toEqual({ tools: [] }); + }); + + test("report agrees: the :tag model gets no openrouter routing", () => { + expect(exactValues(MODEL)["openrouter.order"]!.value).toEqual([]); + }); + + test("an exact key still resolves on both maps (control)", () => { + const v = exactValues("gpt-oss"); + expect(v["tools.hostedPreference"]!.value).toEqual({ tools: ["image_generation"] }); + expect(v["openrouter.order"]!.value).toEqual(["fireworks"]); + }); + + test("a prototype-shaped id resolves neither map", () => { + // The bare index this replaced walked the prototype chain here too, so these two + // maps had the original bug and must not simply inherit the family-aware fix. + for (const modelId of ["constructor", "toString", "valueOf"]) { + const v = exactValues(modelId); + expect(v["tools.hostedPreference"]!.value).toEqual({ tools: [] }); + expect(v["openrouter.order"]!.value).toEqual([]); + } + }); +}); From 9b0c5a02d95220161fc18c72aba5756fdcbf68e3 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 03:39:19 +0900 Subject: [PATCH 04/88] fix(codex): retain the K12 short-window quota end to end parseUsageQuota filled shortPercent and setAccountQuotaFromParsed dropped it, so the 5-hour burst window never reached the cache, the accounts DTO, the dashboard, or routing. A saturated short window was invisible to account selection. Carries @Ingwannu's #2056: shortPercent joins hasKnownQuotaValue, a new snapshotHasShort keeps a short-only snapshot from reading as empty, partial weekly/monthly snapshots no longer clobber a known short window, and updateAccountQuota carries the tuple. Also fixes the blocker raised in review on both #2056 and #2062: the scorer took Math.max over every finite window, so a snapshot carrying only shortPercent: 0 scored a flat 0 and made an account whose long windows were never observed look like the emptiest in the pool - pickLowestUsageAmong would then send every request to it. The burst window now refines a known long-window position instead of standing in for one, and returns CODEX_UNKNOWN_USAGE_SCORE until a governing window is actually observed. The ported test asserted the old behavior directly (computeCodexUsageScore({ shortPercent: 0 }) === 0); it is replaced by a case that pins the corrected contract in both directions. Closes #2047 --- src/codex/quota.ts | 31 ++++++++++-- src/codex/routing.ts | 22 +++++---- tests/codex-auth-api.test.ts | 91 ++++++++++++++++++++++++++++++++++++ tests/codex-routing.test.ts | 27 +++++++++++ 4 files changed, 160 insertions(+), 11 deletions(-) diff --git a/src/codex/quota.ts b/src/codex/quota.ts index a4c226db93..104db68d5b 100644 --- a/src/codex/quota.ts +++ b/src/codex/quota.ts @@ -186,7 +186,7 @@ function normalizeResetAt(value: unknown): number | undefined { } function hasKnownQuotaValue(quota: Omit): boolean { - return [quota.weeklyPercent, quota.monthlyPercent] + return [quota.weeklyPercent, quota.monthlyPercent, quota.shortPercent] .some(value => typeof value === "number" && Number.isFinite(value)); } @@ -226,8 +226,14 @@ function snapshotHasMonthly(quota: Omit): boole return quota.monthlyPercent !== undefined || quota.monthlyResetAt !== undefined; } +function snapshotHasShort(quota: Omit): boolean { + return quota.shortPercent !== undefined + || quota.shortResetAt !== undefined + || quota.shortWindowSeconds !== undefined; +} + function snapshotHasUsage(quota: Omit): boolean { - return snapshotHasWeekly(quota) || snapshotHasMonthly(quota); + return snapshotHasWeekly(quota) || snapshotHasMonthly(quota) || snapshotHasShort(quota); } export function setAccountQuotaFromParsed( accountId: string, @@ -246,6 +252,9 @@ export function setAccountQuotaFromParsed( if (existing?.monthlyPercent !== undefined) next.monthlyPercent = existing.monthlyPercent; if (existing?.monthlyResetAt !== undefined) next.monthlyResetAt = existing.monthlyResetAt; if (existing?.monthlyIsPrimaryWindow === true) next.monthlyIsPrimaryWindow = true; + if (existing?.shortPercent !== undefined) next.shortPercent = existing.shortPercent; + if (existing?.shortResetAt !== undefined) next.shortResetAt = existing.shortResetAt; + if (existing?.shortWindowSeconds !== undefined) next.shortWindowSeconds = existing.shortWindowSeconds; next.resetCredits = quota.resetCredits; accountQuota.set(accountId, next); schedulePersistAccountQuotas(); @@ -270,12 +279,25 @@ export function setAccountQuotaFromParsed( // while silently dropping `monthlyIsPrimaryWindow` would look like tertiary-only data to // any future reader, and that failure would be invisible. if (quota.monthlyIsPrimaryWindow === true) next.monthlyIsPrimaryWindow = true; - } else if (snapshotHasWeekly(quota) && existing?.monthlyPercent !== undefined) { + } else if ((snapshotHasWeekly(quota) || snapshotHasShort(quota)) + && existing?.monthlyPercent !== undefined) { next.monthlyPercent = existing.monthlyPercent; if (existing.monthlyResetAt !== undefined) next.monthlyResetAt = existing.monthlyResetAt; if (existing.monthlyIsPrimaryWindow === true) next.monthlyIsPrimaryWindow = true; } + if (snapshotHasShort(quota)) { + if (quota.shortPercent !== undefined) next.shortPercent = quota.shortPercent; + if (quota.shortResetAt !== undefined) next.shortResetAt = quota.shortResetAt; + if (quota.shortWindowSeconds !== undefined) next.shortWindowSeconds = quota.shortWindowSeconds; + } else { + // Header and reset-credit updates are partial snapshots. Preserve the last full WHAM + // burst tuple when those updates do not carry enough window metadata to replace it. + if (existing?.shortPercent !== undefined) next.shortPercent = existing.shortPercent; + if (existing?.shortResetAt !== undefined) next.shortResetAt = existing.shortResetAt; + if (existing?.shortWindowSeconds !== undefined) next.shortWindowSeconds = existing.shortWindowSeconds; + } + if (quota.resetCredits !== undefined) next.resetCredits = quota.resetCredits; else if (existing?.resetCredits !== undefined) next.resetCredits = existing.resetCredits; @@ -369,6 +391,9 @@ export function updateAccountQuota( : {}), ...(existing?.weeklyResetAt !== undefined ? { weeklyResetAt: existing.weeklyResetAt } : {}), ...(existing?.monthlyResetAt !== undefined ? { monthlyResetAt: existing.monthlyResetAt } : {}), + ...(existing?.shortPercent !== undefined ? { shortPercent: existing.shortPercent } : {}), + ...(existing?.shortResetAt !== undefined ? { shortResetAt: existing.shortResetAt } : {}), + ...(existing?.shortWindowSeconds !== undefined ? { shortWindowSeconds: existing.shortWindowSeconds } : {}), ...(existing?.resetCredits !== undefined ? { resetCredits: existing.resetCredits } : {}), updatedAt: Date.now(), }; diff --git a/src/codex/routing.ts b/src/codex/routing.ts index 7e201ea58a..fa6fa63d83 100644 --- a/src/codex/routing.ts +++ b/src/codex/routing.ts @@ -322,16 +322,22 @@ function deleteScopedHealth(accountId: string, scope: CodexQuotaScope): void { export function computeCodexUsageScore(quota: { weeklyPercent?: number; monthlyPercent?: number; + shortPercent?: number; } | null, plan?: unknown): number { if (!quota) return CODEX_UNKNOWN_USAGE_SCORE; - if (isThirtyDayOnlyCodexPlan(plan)) { - return typeof quota.monthlyPercent === "number" && Number.isFinite(quota.monthlyPercent) - ? quota.monthlyPercent - : CODEX_UNKNOWN_USAGE_SCORE; - } - const values = [quota.weeklyPercent, quota.monthlyPercent] - .filter((value): value is number => typeof value === "number" && Number.isFinite(value)); - return values.length > 0 ? Math.max(...values) : CODEX_UNKNOWN_USAGE_SCORE; + const finite = (value: unknown): value is number => typeof value === "number" && Number.isFinite(value); + const longWindows = isThirtyDayOnlyCodexPlan(plan) + ? [quota.monthlyPercent] + : [quota.weeklyPercent, quota.monthlyPercent]; + const knownLong = longWindows.filter(finite); + // The short burst window only REFINES a known long-window position; it cannot stand in for + // one. A snapshot carrying just `shortPercent: 0` would otherwise score a flat 0 and make an + // account whose weekly/monthly usage is entirely unverified look like the emptiest in the + // pool, so `pickLowestUsageAmong` would send every request to it. Unknown has to stay + // unknown until a governing window is actually observed. + if (knownLong.length === 0) return CODEX_UNKNOWN_USAGE_SCORE; + const values = finite(quota.shortPercent) ? [...knownLong, quota.shortPercent] : knownLong; + return Math.max(...values); } export function classifyCodexUpstreamOutcome( diff --git a/tests/codex-auth-api.test.ts b/tests/codex-auth-api.test.ts index f096c33c8d..d14cedf6be 100644 --- a/tests/codex-auth-api.test.ts +++ b/tests/codex-auth-api.test.ts @@ -1183,6 +1183,56 @@ describe("codex-auth API", () => { expect(getAccountQuota("preserve-valid")).toEqual(before); }); + test("quota cache rebuilds preserve the short-window tuple", () => { + setAccountQuotaFromParsed("short-cache", { + weeklyPercent: 1, + weeklyResetAt: 2_000_586_800, + monthlyPercent: 3, + monthlyResetAt: 2_002_592_000, + shortPercent: 0, + shortResetAt: 2_000_000_000, + shortWindowSeconds: 18_000, + }); + expect(getAccountQuota("short-cache")).toMatchObject({ + weeklyPercent: 1, + shortPercent: 0, + shortResetAt: 2_000_000_000, + shortWindowSeconds: 18_000, + }); + + setAccountQuotaFromParsed("short-cache", { + shortPercent: 4, + shortResetAt: 2_000_000_100, + shortWindowSeconds: 18_000, + }); + expect(getAccountQuota("short-cache")).toMatchObject({ + weeklyPercent: 1, + monthlyPercent: 3, + shortPercent: 4, + shortResetAt: 2_000_000_100, + shortWindowSeconds: 18_000, + }); + + updateAccountQuota("short-cache", 2, 2_000_586_900); + expect(getAccountQuota("short-cache")).toMatchObject({ + weeklyPercent: 2, + monthlyPercent: 3, + shortPercent: 4, + shortResetAt: 2_000_000_100, + shortWindowSeconds: 18_000, + }); + + setAccountQuotaFromParsed("short-cache", { resetCredits: 3 }); + expect(getAccountQuota("short-cache")).toMatchObject({ + weeklyPercent: 2, + monthlyPercent: 3, + shortPercent: 4, + shortResetAt: 2_000_000_100, + shortWindowSeconds: 18_000, + resetCredits: 3, + }); + }); + test("GET /api/codex-auth/quota returns stored quotas", async () => { updateAccountQuota("q-test", 30); const req = new Request("http://localhost/api/codex-auth/quota", { method: "GET" }); @@ -1230,6 +1280,47 @@ describe("codex-auth API", () => { } }); + test("GET /api/codex-auth/accounts preserves a parsed K12 short window through cache and DTO", async () => { + const config = makeConfig(); + seedPoolAccount(config, { + id: "pool-k12-short", + email: "pool-k12-short@example.com", + plan: "k12", + accessToken: "tok", + refreshToken: "ref", + chatgptAccountId: "acc-pool-k12-short", + }); + + const originalFetch = globalThis.fetch; + globalThis.fetch = (async () => Response.json({ + plan_type: "k12", + rate_limit: { + primary_window: { used_percent: 0, reset_at: 2_000_000_000, limit_window_seconds: 18_000 }, + secondary_window: { used_percent: 1, reset_at: 2_000_586_800, limit_window_seconds: 604_800 }, + }, + })) as typeof fetch; + + try { + const req = new Request("http://localhost/api/codex-auth/accounts?refresh=1", { method: "GET" }); + const resp = await handleCodexAuthAPI(req, new URL(req.url), config); + expect(resp!.status).toBe(200); + const data = await resp!.json() as { + accounts: Array<{ id: string; quota?: Record }>; + }; + const quota = data.accounts.find(account => account.id === "pool-k12-short")?.quota; + expect(quota).toMatchObject({ + weeklyPercent: 1, + weeklyResetAt: 2_000_586_800, + shortPercent: 0, + shortResetAt: 2_000_000_000, + shortWindowSeconds: 18_000, + }); + expect(getAccountQuota("pool-k12-short")).toMatchObject(quota!); + } finally { + globalThis.fetch = originalFetch; + } + }); + test("GET /api/codex-auth/accounts refresh=1 bypasses cached pool quota", async () => { const config = makeConfig(); seedPoolAccount(config, { diff --git a/tests/codex-routing.test.ts b/tests/codex-routing.test.ts index 18d7a21ca0..d84725722b 100644 --- a/tests/codex-routing.test.ts +++ b/tests/codex-routing.test.ts @@ -119,9 +119,22 @@ describe("codex routing", () => { test("usage score uses the hottest known quota window", () => { expect(computeCodexUsageScore({ weeklyPercent: 81 })).toBe(81); expect(computeCodexUsageScore({ weeklyPercent: 15, monthlyPercent: 91 })).toBe(91); + expect(computeCodexUsageScore({ weeklyPercent: 15, monthlyPercent: 20, shortPercent: 92 })).toBe(92); expect(computeCodexUsageScore({ weeklyPercent: 15 })).toBe(15); }); + test("a short-only snapshot is unknown usage, not zero usage", () => { + // The burst window refines a known long-window position; it cannot stand in for one. + // Scoring a bare `shortPercent: 0` as 0 would make an account whose weekly/monthly usage + // was never observed look like the emptiest in the pool, and pickLowestUsageAmong would + // send every request to it. + expect(computeCodexUsageScore({ shortPercent: 0 })).toBe(CODEX_UNKNOWN_USAGE_SCORE); + expect(computeCodexUsageScore({ shortPercent: 87 })).toBe(CODEX_UNKNOWN_USAGE_SCORE); + // Once a governing window is known, the burst still wins when it is hotter. + expect(computeCodexUsageScore({ weeklyPercent: 1, shortPercent: 100 })).toBe(100); + expect(computeCodexUsageScore({ weeklyPercent: 40, shortPercent: 0 })).toBe(40); + }); + test("exact-account failures record health without rotating the active Pool account", () => { const transient = makeConfig({ upstreamFailoverThreshold: 1, activeCodexAccountId: "a" }); const transientThread = "fixed-transient-thread"; @@ -179,6 +192,7 @@ describe("codex routing", () => { test("go and free plans use only the 30d quota window", () => { expect(computeCodexUsageScore({ weeklyPercent: 99, monthlyPercent: 12 }, "go")).toBe(12); expect(computeCodexUsageScore({ weeklyPercent: 99, monthlyPercent: 13 }, "free")).toBe(13); + expect(computeCodexUsageScore({ weeklyPercent: 99, monthlyPercent: 12, shortPercent: 14 }, "go")).toBe(14); expect(computeCodexUsageScore({ weeklyPercent: 1 }, "go")).toBe(CODEX_UNKNOWN_USAGE_SCORE); }); @@ -1274,6 +1288,19 @@ describe("codex routing", () => { }); }); + test("a zero-valued short-only WHAM snapshot remains known quota (#2047)", () => { + expect(parseUsageQuota({ + plan_type: "k12", + rate_limit: { + primary_window: { used_percent: 0, reset_at: 2000000000, limit_window_seconds: 18000 }, + }, + })).toMatchObject({ + shortPercent: 0, + shortResetAt: 2000000000, + shortWindowSeconds: 18000, + }); + }); + test("an exhausted burst window takes the account out of rotation (#1791)", () => { // Upstream enforces the 5-hour window independently, so an account at 100% there is // genuinely blocked even while its weekly quota is untouched. Reporting it as usable From 0bce9516d8d987d5b209d1c92cce24d278941b55 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 04:51:56 +0900 Subject: [PATCH 05/88] fix(codex): gate account-native models by entitlement gpt-daybreak-blue-latest is in the static native set, so catalog sync copied it onto every account selector and Pool could bind a bare Daybreak request to an account whose authenticated roster never contained it. The upstream answered "The 'gpt-daybreak-blue-latest' model is not supported when using Codex with a ChatGPT account." Make the authenticated ChatGPT roster the source of truth: discover per-account entitlement, advertise the gated row only where an eligible account confirms it, and refuse selection of an account that cannot serve it. Discovery failures fail closed - the row disappears rather than being offered on unproven evidence. Carries @Ingwannu's #2101, with three corrections: Selector compact missed the wire rewrite. accountGatedCompactWireModel was derived from the caller's raw model string, and an account-qualified selector like side/gpt-daybreak-blue-latest does not match the gated map, so it still took the native compact endpoint the guard exists to avoid. It now derives from route.modelId, the same value core.ts normalizes from. Direct callers shared one 64-entry roster cache with main/Pool. A burst of distinct Direct callers evicted the very entries the catalog projects from, so the gated row vanished until rediscovery. The two classes now evict separately. A comment in native-models.ts still claimed routing never collapses Daybreak into gpt-5.6-sol, which the wire normalization does exactly. Stacked on #2137: this consumes the substituteMainCredential value that PR corrects, so it must not land ahead of it. Closes #2097 --- .../content/docs/guides/codex-app-models.md | 20 +- src/codex/account-usability.ts | 3 + src/codex/auth-context.ts | 57 ++- src/codex/catalog/metadata.ts | 20 +- src/codex/catalog/native-models.ts | 36 +- src/codex/catalog/sync.ts | 68 +++- src/codex/convergence.ts | 74 +++- src/codex/model-entitlements.ts | 353 ++++++++++++++++++ src/server/index.ts | 62 ++- src/server/responses/compact.ts | 56 ++- src/server/responses/core.ts | 142 +++++-- structure/03_catalog-and-subagents.md | 7 + structure/08_openai-provider-tiers.md | 51 +++ tests/claude-models-discovery.test.ts | 27 +- tests/codex-auth-context.test.ts | 117 ++++++ tests/codex-catalog-sync-hardening.test.ts | 31 +- ...odex-convergence-account-selectors.test.ts | 80 +++- tests/codex-model-entitlements.test.ts | 155 ++++++++ tests/native-model-toggle.test.ts | 42 ++- tests/server-auth.test.ts | 199 +++++++++- 20 files changed, 1477 insertions(+), 123 deletions(-) create mode 100644 src/codex/model-entitlements.ts create mode 100644 tests/codex-model-entitlements.test.ts diff --git a/docs-site/src/content/docs/guides/codex-app-models.md b/docs-site/src/content/docs/guides/codex-app-models.md index 0a5008f6fa..b0910bd9d5 100644 --- a/docs-site/src/content/docs/guides/codex-app-models.md +++ b/docs-site/src/content/docs/guides/codex-app-models.md @@ -23,9 +23,17 @@ the bare or API-key model list. The row is matched on the field shape a real cat which filters malformed entries — it does not prove the id came from an upstream response, since the cache is a user-owned file. See [Exact Codex account selectors](/reference/configuration/routing/#exact-codex-account-selectors). -`gpt-daybreak-blue-latest` follows that observation-only rule for account-qualified rows and is not -added to the bare native allowlist. A separate, explicit `customModels` entry can expose the same -wire id as `openai/gpt-daybreak-blue-latest` through the canonical Codex-login forward provider: +`gpt-daybreak-blue-latest` is account-gated. opencodex checks each authenticated ChatGPT account's +own Codex model roster before advertising or routing it. In Pool mode, the bare row exists only when +at least one eligible Pool account reports the slug. In Direct mode, the bare row follows the main +account used by the local catalog, and each request also checks the forwarded caller credential (or +the stored main credential when an OpenCodex admission bearer is substituted). A +`/gpt-daybreak-blue-latest` row exists only when that selector's mapped account reports it. +Pool routing excludes unentitled accounts. If no roster can be confirmed, the gated row fails closed +instead of spending a prompt on an upstream 400. + +A separate, explicit `customModels` entry can expose the same wire id as +`openai/gpt-daybreak-blue-latest` through the canonical Codex-login forward provider: ```json { @@ -41,8 +49,8 @@ wire id as `openai/gpt-daybreak-blue-latest` through the canonical Codex-login f Only that exact provider, endpoint, and model id receive the pinned Sol capability snapshot: 922,000 context, 829,800 automatic compaction, the native reasoning ladder, and native Codex tool -metadata. The request still sends `gpt-daybreak-blue-latest`; opencodex does not rewrite it to Sol, -does not create a bare row, and does not grant account entitlement. The separately billed +metadata. The request still sends `gpt-daybreak-blue-latest`; opencodex does not rewrite it to Sol +or grant account entitlement. The separately billed `openai-apikey/daybreak-blue-latest` API row is a different route and its 1,050,000 / 922,000 limits are never copied into the Codex-login row. @@ -68,7 +76,7 @@ gpt-5.6-sol # bare Codex-login route via Pool or Direct /gpt-5.6-sol # stored Codex account mapped by that selector openai-apikey/gpt-5.6-sol # API key openai/gpt-daybreak-blue-latest # explicit Codex-forward custom row (922,000) -/gpt-daybreak-blue-latest # observed account-qualified native id, when available +/gpt-daybreak-blue-latest # account-qualified native id, only when that account reports it openai-apikey/daybreak-blue-latest # separate API-key route (1,050,000 / 922,000) ``` diff --git a/src/codex/account-usability.ts b/src/codex/account-usability.ts index 7036521d0e..d508e19f4d 100644 --- a/src/codex/account-usability.ts +++ b/src/codex/account-usability.ts @@ -10,6 +10,8 @@ export interface CodexAccountUsabilityOptions { nativeMainSelectionOnly?: boolean; /** Test seam for proving whether routing attempted a physical native-token read. */ isMainAccountTokenLive?: typeof isMainAccountTokenLive; + /** Confirmed account ids for an account-gated model; omitted for ordinary native models. */ + modelEligibleAccountIds?: ReadonlySet; } export function isCodexAccountUsable( @@ -17,6 +19,7 @@ export function isCodexAccountUsable( accountId: string, options: CodexAccountUsabilityOptions = {}, ): boolean { + if (options.modelEligibleAccountIds && !options.modelEligibleAccountIds.has(accountId)) return false; if (accountId === MAIN_CODEX_ACCOUNT_ID) { // Startup recovery owns the physical auth/vault boundary. Never parse or select // native __main__ while an encrypted switch journal is pending or inconclusive. diff --git a/src/codex/auth-context.ts b/src/codex/auth-context.ts index 1f8b120112..71a79b1b67 100644 --- a/src/codex/auth-context.ts +++ b/src/codex/auth-context.ts @@ -24,6 +24,13 @@ import { pickAlternateCodexAccount, resolveCodexAccountForThreadDetailed, } from "./routing"; +import { + entitledCodexAccountIdsForModel, + isDirectCallerEntitledToCodexModel, + resolveCodexModelEntitlements, + type CodexModelEntitlementSnapshot, +} from "./model-entitlements"; +import { ACCOUNT_GATED_NATIVE_OPENAI_MODELS } from "./catalog/native-models"; import type { CodexCooldownSource, CodexQuotaScope } from "./routing"; import { maskAccountId } from "../lib/privacy"; import { formatErrorResponse } from "../bridge"; @@ -289,6 +296,14 @@ export interface ResolveCodexAuthContextOptions { isMainAccountTokenLive?: () => boolean; getMainAccountToken?: typeof getMainAccountToken; primeCodexPoolQuotas?: (config: OcxConfig, reason: string) => Promise; + /** Test seam for account-gated native model discovery. */ + resolveCodexModelEntitlements?: ( + config: Pick, + ) => Promise; + /** Direct requests admitted with a proxy bearer substitute the stored native-main credential. */ + substituteMainCredentialForDirect?: boolean; + /** Test seam for a Direct request's own forwarded ChatGPT credential. */ + isDirectCallerEntitledToCodexModel?: (headers: Headers, modelId: string) => Promise; } export interface CodexAccountSelectionAdmission { @@ -312,8 +327,28 @@ export async function resolveCodexAuthContext( // selected stored credential even while the canonical OpenAI provider is globally Direct. if (mode === "direct" && fixedAccountId === undefined) { if (!hasCallerCodexBearer(headers)) throw new CodexDirectAuthenticationError(); + if (options.modelId && ACCOUNT_GATED_NATIVE_OPENAI_MODELS.has(options.modelId)) { + const entitled = options.substituteMainCredentialForDirect + ? entitledCodexAccountIdsForModel( + await (options.resolveCodexModelEntitlements ?? resolveCodexModelEntitlements)(config), + options.modelId, + )?.has(MAIN_CODEX_ACCOUNT_ID) === true + : await (options.isDirectCallerEntitledToCodexModel ?? isDirectCallerEntitledToCodexModel)( + headers, + options.modelId, + ); + if (!entitled) { + throw new CodexPoolAuthenticationError("The selected ChatGPT account does not support this model"); + } + } return { kind: "main", accountId: null }; } + const entitlementSnapshot = options.modelId && ACCOUNT_GATED_NATIVE_OPENAI_MODELS.has(options.modelId) + ? await (options.resolveCodexModelEntitlements ?? resolveCodexModelEntitlements)(config) + : undefined; + const modelEligibleAccountIds = entitlementSnapshot + ? entitledCodexAccountIdsForModel(entitlementSnapshot, options.modelId) + : undefined; // Retained startup recovery makes the physical main identity ineligible. Routing // can still preserve service by selecting a healthy configured pool account. const nativeMainTrafficBlocked = isNativeMainTrafficBlocked(); @@ -325,6 +360,7 @@ export async function resolveCodexAuthContext( nativeMainSelectionOnly: !nativeMainTrafficBlocked && selectionAdmission?.mainProfileDraining === true, isMainAccountTokenLive: options.isMainAccountTokenLive, + modelEligibleAccountIds, }; let accountId: string; const quotaScope = codexQuotaScopeForModel(options.modelId); @@ -354,7 +390,11 @@ export async function resolveCodexAuthContext( const selected = resolution.status === "selected" ? resolution.accountId : null; if (!selected) { if (fixedAccountId !== undefined) { - throw new CodexPoolAuthenticationError("Selected Codex account is unavailable"); + throw new CodexPoolAuthenticationError( + modelEligibleAccountIds && !modelEligibleAccountIds.has(fixedAccountId) + ? "Selected Codex account does not support this model" + : "Selected Codex account is unavailable", + ); } // Recovery deliberately makes physical main ineligible. If no healthy // pool route is configured and main is the intended route, report the @@ -364,7 +404,9 @@ export async function resolveCodexAuthContext( if (nativeMainTrafficBlocked && !options.excludeAccountId) { throw new CodexMainProfileDrainingError(); } - throw new CodexPoolAuthenticationError(); + throw new CodexPoolAuthenticationError( + modelEligibleAccountIds ? "No eligible Codex account supports this model" : undefined, + ); } accountId = selected; if (accountId === MAIN_CODEX_ACCOUNT_ID && nativeMainTrafficBlocked) { @@ -377,6 +419,17 @@ export async function resolveCodexAuthContext( ) { throw new CodexMainProfileDrainingError(); } + // Some legacy Pool fallbacks preserve a configured active account even when it is not + // currently selectable, so token/cooldown code can produce the historical actionable error. + // Model entitlement is different: sending the request would spend a turn on an account whose + // authenticated roster already denied the model. Reassert this boundary after every selector. + if (modelEligibleAccountIds && !modelEligibleAccountIds.has(accountId)) { + throw new CodexPoolAuthenticationError( + fixedAccountId !== undefined + ? "Selected Codex account does not support this model" + : "No eligible Codex account supports this model", + ); + } if (fixedAccountId !== undefined) { if (isCodexAccountPaused(config, accountId)) { throw new CodexPoolAuthenticationError("Selected Codex account is unavailable"); diff --git a/src/codex/catalog/metadata.ts b/src/codex/catalog/metadata.ts index 6733f5aa6c..d071bf59bd 100644 --- a/src/codex/catalog/metadata.ts +++ b/src/codex/catalog/metadata.ts @@ -12,7 +12,7 @@ import { modelInList } from "../../types"; import { CODEX_REASONING_LEVELS, codexEffortRank, configuredReasoningEfforts, modelRecordValue, sanitizeCodexReasoningEfforts } from "../../reasoning-effort"; import { getModelMetadata, getModelMetadataCaseInsensitive, listModelMetadata, resolveMetadataProvider } from "../../generated/model-metadata"; import { enrichProviderFromRegistry, shouldCaseFoldMetadataModelId } from "../../providers/derive"; -import { getProviderRegistryEntry } from "../../providers/registry"; +import { getProviderRegistryEntry, providerCodexAccountMode } from "../../providers/registry"; import { applyProviderContextCap, providerContextCap } from "../../providers/context-cap"; import { routedSlug, slugEquals, slugsEquivalent } from "../../providers/slug-codec"; import { identifyRoutedModel } from "../../adapters/identity"; @@ -38,6 +38,7 @@ import { readCurrentCatalogOrCache, readCurrentCodexCatalog, readCurrentCodexMod import { trustedAccountBoundNativeCatalogSlug, visibleCodexAccountSelectors } from "./account-models"; import { CODEX_NATIVE_ALIAS_CATALOG_KIND } from "./kinds"; import { + ACCOUNT_GATED_NATIVE_OPENAI_MODELS, NATIVE_DAYBREAK_BLUE_MODEL, NATIVE_OPENAI_CAPABILITY_ALIAS_MODELS, NATIVE_OPENAI_MODELS, @@ -45,6 +46,8 @@ import { isNativeOpenAiCapabilityAliasModel, nativeOpenAiCapabilitySourceSlug, } from "./native-models"; +import { cachedAvailableAccountGatedNativeModels } from "../model-entitlements"; +import { MAIN_CODEX_ACCOUNT_ID } from "../main-account"; export { CODEX_NATIVE_ALIAS_CATALOG_KIND } from "./kinds"; export { NATIVE_DAYBREAK_BLUE_MODEL, @@ -390,7 +393,14 @@ export function nativeModelRows(config: Pick !shadowed.has(slug)).map(slug => { + const bareEligibleAccountIds = providerCodexAccountMode( + OPENAI_CODEX_PROVIDER_ID, + config.providers?.[OPENAI_CODEX_PROVIDER_ID], + ) === "direct" ? new Set([MAIN_CODEX_ACCOUNT_ID]) : undefined; + const availableGated = cachedAvailableAccountGatedNativeModels(Date.now(), bareEligibleAccountIds); + return NATIVE_OPENAI_MODELS + .filter(slug => !ACCOUNT_GATED_NATIVE_OPENAI_MODELS.has(slug) || availableGated.has(slug)) + .filter(slug => !shadowed.has(slug)).map(slug => { const contextWindow = nativeOpenAiContextWindow(slug, limits); const maxInputTokens = nativeOpenAiMaxInputTokens(slug, limits); return { @@ -475,7 +485,11 @@ export function shouldUpgradeToUpstreamEntry(entry: RawEntry): boolean { export function nativeOpenAiSlugs(): string[] { const live = catalogNativeSlugs(); - return live.length > 0 ? unique([...live, ...DOCUMENTED_NATIVE_OPENAI_ADDITIONS]) : NATIVE_OPENAI_MODELS; + const availableGated = cachedAvailableAccountGatedNativeModels(); + const candidates = live.length > 0 ? unique([...live, ...DOCUMENTED_NATIVE_OPENAI_ADDITIONS]) : NATIVE_OPENAI_MODELS; + return candidates.filter(slug => ( + !ACCOUNT_GATED_NATIVE_OPENAI_MODELS.has(slug) || availableGated.has(slug) + )); } const ACCOUNT_BOUND_OPENAI_NATIVE_PREFIX = /^(?:gpt-|o1-|o3-|o4-)/; diff --git a/src/codex/catalog/native-models.ts b/src/codex/catalog/native-models.ts index b835f232d4..3fd673f84b 100644 --- a/src/codex/catalog/native-models.ts +++ b/src/codex/catalog/native-models.ts @@ -1,12 +1,22 @@ /** ChatGPT/Codex wire id observed for the account-native Daybreak Blue surface. */ export const NATIVE_DAYBREAK_BLUE_MODEL = "gpt-daybreak-blue-latest"; +/** Native ChatGPT/Codex ids whose availability is proven per authenticated account. */ +export const ACCOUNT_GATED_NATIVE_OPENAI_MODELS: ReadonlySet = new Set([ + NATIVE_DAYBREAK_BLUE_MODEL, +]); + /** * Account-native aliases whose Codex capabilities track another pinned native row. * * This is catalog metadata inheritance only. Routing always preserves the requested - * wire id, so the ChatGPT/Codex `gpt-daybreak-*` surface never collapses into the - * separately billed API-key `daybreak-*-latest` surface or into `gpt-5.6-sol`. + * wire id for the separately billed API-key `daybreak-*-latest` surface, so the two never + * collapse into each other. + * + * The ChatGPT/Codex surface is different: an account-gated request IS rewritten to its + * canonical wire model before it leaves the process (`applyCodexAccountGatedWireNormalization` + * in src/server/responses/core.ts), because the authenticated backend rejects the gated slug + * on shards that do not carry it. The catalog keeps the product identity; only the wire moves. */ const NATIVE_OPENAI_CAPABILITY_SOURCES: Readonly> = Object.freeze({ [NATIVE_DAYBREAK_BLUE_MODEL]: "gpt-5.6-sol", @@ -16,14 +26,14 @@ const NATIVE_OPENAI_CAPABILITY_SOURCES: Readonly> = Objec * Native ids whose capability metadata is inherited from another pinned native row. * * Membership here is about METADATA INHERITANCE only, and is independent of whether the - * slug is also globally allowlisted in `NATIVE_OPENAI_MODELS`. `gpt-daybreak-blue-latest` - * is now in BOTH: it inherits Sol's capability shape AND ships as a globally supported - * native row (owner decision, devlog 260816_codexrs_multiagent_v2_and_history_perf/011). + * slug is also present in `NATIVE_OPENAI_MODELS`. `gpt-daybreak-blue-latest` is now in BOTH: + * it inherits Sol's capability shape AND is a supported account-gated native id (owner decision, + * devlog 260816_codexrs_multiagent_v2_and_history_perf/011). * * The maps that consume the union of these two lists (`PINNED_NATIVE_CAPABILITY_ENTRIES`, * `UPSTREAM_NATIVE_ENTRIES`) are keyed by slug, so an overlapping id collapses to one - * entry. Catalog row generation iterates `NATIVE_OPENAI_MODELS` alone, so it still emits - * exactly one bare row and one row per account selector. + * entry. Catalog row generation iterates `NATIVE_OPENAI_MODELS`, then entitlement evidence limits + * it to at most one bare row and one row per entitled account selector. */ export const NATIVE_OPENAI_CAPABILITY_ALIAS_MODELS = Object.freeze( Object.keys(NATIVE_OPENAI_CAPABILITY_SOURCES), @@ -42,16 +52,14 @@ export function nativeOpenAiCapabilitySourceSlug(slug: string): string { * * `gpt-daybreak-blue-latest` is entitlement-gated upstream: it is absent from codex-rs's * bundled catalog and reaches a client only through an authenticated `/models` response. - * It is listed here by explicit owner decision so the row exists without waiting for an - * observation, because opencodex injects `model_catalog_json` and codex-rs therefore builds + * It is listed here by explicit owner decision so the capability template exists without waiting + * for an observation, because opencodex injects `model_catalog_json` and codex-rs therefore builds * a `StaticModelsManager` whose refresh is a no-op — an entitled account had no way to * discover it on a clean install. * - * Accepted tradeoff: an UNENTITLED account also sees the row. Catalog sync still succeeds; - * selecting the model reaches the canonical OpenAI provider and the backend answers 400 - * "model not supported for this account", which is relayed (a bare pooled route may first - * retry one alternate account on that exact body; a selector-qualified route is fixed and - * relays immediately). `disabledModels` hides the row but is NOT a runtime routing denial. + * Availability is not static: catalog sync and Pool routing require the account's authenticated + * `/models` roster to contain the slug. An unconfirmed or unentitled account never receives the + * request. `disabledModels` remains the independent user visibility control. * * Devlog: 260816_codexrs_multiagent_v2_and_history_perf/011 §4-bis. */ diff --git a/src/codex/catalog/sync.ts b/src/codex/catalog/sync.ts index 1167bacc27..70b93ee7bd 100644 --- a/src/codex/catalog/sync.ts +++ b/src/codex/catalog/sync.ts @@ -30,7 +30,15 @@ import { providerDestinationResolvedError } from "../../lib/destination-policy"; import { redactSecretString } from "../../lib/redact"; import upstreamModelsSnapshot from "../data/upstream-models.json"; import { OPENAI_CODEX_PROVIDER_ID } from "../../providers/openai-tiers"; +import { providerCodexAccountMode } from "../../providers/registry"; import { codexAccountNamespaceEntries, isMainCodexAccountTarget } from "../account-namespaces"; +import { MAIN_CODEX_ACCOUNT_ID } from "../main-account"; +import { + availableAccountGatedNativeModels, + isCodexModelEntitlementSnapshotCurrent, + resolveCodexModelEntitlements, + type CodexModelEntitlementSnapshot, +} from "../model-entitlements"; import { CODEX_CUSTOM_MODEL_CATALOG_KIND, CODEX_PROVIDER_MODEL_CATALOG_KIND, activeCodexModelsCachePath, applyCatalogMetadata, applyMultiAgentMode, applyNativeOpenAiContextOverride, applyRoutedCodexToolMode, catalogBackupPathFor, catalogHasRoutedEntries, catalogModelSlug, ensureStrictCatalogFields, findNativeTemplate, isDefaultCatalogPath, isRoutedModelCompatibilityExcluded, legacyCatalogBackupPath, normalizeRoutedCatalogEntry, normalizeServiceTiers, readCatalog, readCatalogBackup, readCodexCatalogPath, readNativeBaseline } from "./parsing"; @@ -64,6 +72,7 @@ import { } from "../internal/catalog-writer"; import { codexRuntimeStatePath } from "../runtime"; import { accountBoundNativeDisplayName, CODEX_ACCOUNT_BOUND_CATALOG_KIND, trustedAccountBoundNativeCatalogSlug, visibleCodexAccountSelectors } from "./account-models"; +import { ACCOUNT_GATED_NATIVE_OPENAI_MODELS } from "./native-models"; export const MAX_SPAWN_AGENT_MODEL_OVERRIDES = 5; @@ -1238,6 +1247,7 @@ interface RetainedCatalogSyncWrite { readonly read: RetainedCatalogSyncRead; readonly permit: CatalogWritePermit; readonly owningCodexHome: string; + readonly modelEntitlements: CodexModelEntitlementSnapshot; } function optionalFileBytes(path: string): string | null { @@ -1401,6 +1411,7 @@ function writeRetainedCatalogSync({ read, permit, owningCodexHome, + modelEntitlements, }: RetainedCatalogSyncWrite): RetainedCatalogSyncResult { const { catalogPath, catalog, onDiskCatalog } = read; const catalogModelsForMerge = catalogModelsForMergeWithNativeRecovery( @@ -1436,7 +1447,28 @@ function writeRetainedCatalogSync({ const modelPickerOrder = config.modelPickerOrder ?? []; const multiAgentMode: MultiAgentMode = config.multiAgentMode === "v1" || config.multiAgentMode === "v2" ? config.multiAgentMode : "default"; const exactComboSlugs = exactComboCatalogSlugs(config); - const suppressedBareNativeSlugs = desktopAllowlistSuppressedNativeSlugs(config); + const bareEligibleAccountIds = providerCodexAccountMode( + OPENAI_CODEX_PROVIDER_ID, + config.providers[OPENAI_CODEX_PROVIDER_ID], + ) === "direct" ? new Set([MAIN_CODEX_ACCOUNT_ID]) : undefined; + const availableBareGatedNativeSlugs = availableAccountGatedNativeModels( + modelEntitlements, + bareEligibleAccountIds, + ); + const availableAccountGatedNativeSlugs = availableAccountGatedNativeModels(modelEntitlements); + const availableBareNativeSlugs = NATIVE_OPENAI_MODELS.filter(slug => ( + !ACCOUNT_GATED_NATIVE_OPENAI_MODELS.has(slug) || availableBareGatedNativeSlugs.has(slug) + )); + const availableAccountNativeSlugs = NATIVE_OPENAI_MODELS.filter(slug => ( + !ACCOUNT_GATED_NATIVE_OPENAI_MODELS.has(slug) || availableAccountGatedNativeSlugs.has(slug) + )); + const unavailableGatedNativeSlugs = new Set([...ACCOUNT_GATED_NATIVE_OPENAI_MODELS].filter(slug => ( + !availableBareGatedNativeSlugs.has(slug) + ))); + const suppressedBareNativeSlugs = new Set([ + ...desktopAllowlistSuppressedNativeSlugs(config), + ...unavailableGatedNativeSlugs, + ]); const hasPhysicalComboProvider = Object.hasOwn(config.providers, COMBO_NAMESPACE); const includeNativeOpenAi = shouldIncludeNativeOpenAi(config); const includeAccountBoundNativeOpenAi = shouldIncludeAccountBoundNativeOpenAi(config); @@ -1451,12 +1483,21 @@ function writeRetainedCatalogSync({ ...(onDiskCatalog?.models ?? []).filter(entry => trustedAccountBoundNativeCatalogSlug(entry) !== undefined), ]; - const accountNativeSlugs = accountSelectors.length > 0 - ? accountBoundNativeOpenAiSlugs(observedAccountNativeEntries) - : []; + const accountTargets = new Map(codexAccountNamespaceEntries(config)); const accountNativeSlugsBySelector = accountSelectors.length > 0 - ? accountBoundNativeOpenAiSlugsBySelector(config, observedAccountNativeEntries) + ? new Map([...accountBoundNativeOpenAiSlugsBySelector(config, observedAccountNativeEntries)].map(([selector, slugs]) => { + const target = accountTargets.get(selector); + const accountId = target && isMainCodexAccountTarget(target) ? MAIN_CODEX_ACCOUNT_ID : target; + const entitled = accountId ? modelEntitlements.modelsByAccount.get(accountId) : undefined; + const confirmed = accountId ? modelEntitlements.confirmedAccountIds.has(accountId) : false; + return [selector, slugs.filter(slug => ( + !ACCOUNT_GATED_NATIVE_OPENAI_MODELS.has(slug) || (confirmed && entitled?.has(slug) === true) + ))] as const; + })) : new Map(); + const accountNativeSlugs = accountSelectors.length > 0 + ? [...new Set([...accountNativeSlugsBySelector.values()].flatMap(slugs => [...slugs]))] + : []; // Unknown account-native ids have no safe bare/global identity. They are only projected through // the selector map above; the no-selector catalog remains the static native/API-key surface. const observedNativeSlugs: string[] = []; @@ -1510,7 +1551,7 @@ function writeRetainedCatalogSync({ const accountBoundEntries = includeAccountBoundNativeOpenAi && accountSelectors.length > 0 ? buildCatalogEntriesFromObservedState({ template: template ? JSON.parse(JSON.stringify(template)) : null, - gptSlugs: NATIVE_OPENAI_MODELS, + gptSlugs: availableAccountNativeSlugs, goModels: [], featured, wsEnabled, @@ -1550,7 +1591,7 @@ function writeRetainedCatalogSync({ openaiContextCap, policy: { ...CANONICAL_NATIVE_CATALOG_CONTENT_POLICY, - nativeBackfillSlugs: [...NATIVE_OPENAI_MODELS, ...observedNativeSlugs], + nativeBackfillSlugs: [...availableBareNativeSlugs, ...observedNativeSlugs], warningPolicy: "emit", }, }); @@ -1664,10 +1705,13 @@ export async function syncCatalogModels( evidence: retainedCatalogSyncEvidence(config, preflightRead.catalogPath, preflightRead.catalog), processEvidence: retainedCatalogProcessEvidence(), }; - const goModels = await gatherRoutedModels(config, { - comboOmissions, - providerModelOutcomes, - }); + const [goModels, modelEntitlements] = await Promise.all([ + gatherRoutedModels(config, { + comboOmissions, + providerModelOutcomes, + }), + resolveCodexModelEntitlements(config), + ]); const committed = withCatalogWriteSerialization(owningCodexHome, permit => { // Desired state can flip OFF during the provider await above. The catalog // evidence revalidation below cannot see that — intent lives in our config, @@ -1687,6 +1731,7 @@ export async function syncCatalogModels( } const current = revalidateRetainedCatalogSync(config, prepared); if (current === null) return null; + if (!isCodexModelEntitlementSnapshotCurrent(modelEntitlements)) return null; return writeRetainedCatalogSync({ config, goModels, @@ -1695,6 +1740,7 @@ export async function syncCatalogModels( read: current, permit, owningCodexHome, + modelEntitlements, }); }); if (committed.kind === "completed" && committed.value !== null) return committed.value; diff --git a/src/codex/convergence.ts b/src/codex/convergence.ts index 6d501ef85d..d5aeb893b7 100644 --- a/src/codex/convergence.ts +++ b/src/codex/convergence.ts @@ -66,6 +66,17 @@ import { supportedCodexReasoningEffortsFromObservedCatalog, } from "./catalog/effort"; import { codexRuntimeStatePath, peekCodexRuntimeProcessCache } from "./runtime"; +import { codexAccountNamespaceEntries, isMainCodexAccountTarget } from "./account-namespaces"; +import { MAIN_CODEX_ACCOUNT_ID } from "./main-account"; +import { + availableAccountGatedNativeModels, + isCodexModelEntitlementSnapshotCurrent, + resolveCodexModelEntitlements, + type CodexModelEntitlementSnapshot, +} from "./model-entitlements"; +import { ACCOUNT_GATED_NATIVE_OPENAI_MODELS } from "./catalog/native-models"; +import { providerCodexAccountMode } from "../providers/registry"; +import { OPENAI_CODEX_PROVIDER_ID } from "../providers/openai-tiers"; import { withCatalogWriteSerialization } from "./catalog-write-serialization"; import { publishHashedCodexCatalogBackup, @@ -95,7 +106,7 @@ export interface CatalogWriteReceipt { export type CodexCatalogCommitResult = | { readonly kind: "committed"; readonly changed: boolean; readonly writes: CatalogWriteReceipt } - | { readonly kind: "stale"; readonly reason: "generation" | "home-selection" | "source-observation" | "process-local" | "target-identity" | "candidate-consumed" } + | { readonly kind: "stale"; readonly reason: "generation" | "home-selection" | "source-observation" | "process-local" | "target-identity" | "candidate-consumed" | "account-entitlement" } | { readonly kind: "refused"; readonly reason: "source-unreadable" | "source-ambiguous" | "target-unsafe" } | { readonly kind: "failed"; readonly surface: "disk"; readonly writes: CatalogWriteReceipt }; @@ -122,6 +133,7 @@ interface CandidateState { readonly legacyBackup?: PreparedCatalogFileWrite; readonly changed: boolean; readonly notices: readonly CatalogNotice[]; + readonly modelEntitlements: CodexModelEntitlementSnapshot; } const candidateStates = new WeakMap(); @@ -217,6 +229,7 @@ function prepareCatalog( baseline: ReadonlyMap, baselineCatalogModels: readonly Readonly>[], degradedProviderNames: ReadonlySet, + modelEntitlements: CodexModelEntitlementSnapshot, nativeRecoverySources: readonly (readonly RawEntry[])[] = [], observedAccountNativeEntries: readonly RawEntry[] = [], ): RawCatalog { @@ -229,19 +242,46 @@ function prepareCatalog( const multiAgentMode = config.multiAgentMode === "v1" || config.multiAgentMode === "v2" ? config.multiAgentMode : "default"; const exactComboSlugs = exactComboCatalogSlugs(config); - const suppressedBareNativeSlugs = desktopAllowlistSuppressedNativeSlugs(config); + const bareEligibleAccountIds = providerCodexAccountMode( + OPENAI_CODEX_PROVIDER_ID, + config.providers[OPENAI_CODEX_PROVIDER_ID], + ) === "direct" ? new Set([MAIN_CODEX_ACCOUNT_ID]) : undefined; + const availableBareGatedNativeSlugs = availableAccountGatedNativeModels( + modelEntitlements, + bareEligibleAccountIds, + ); + const availableAccountGatedNativeSlugs = availableAccountGatedNativeModels(modelEntitlements); + const availableBareNativeSlugs = NATIVE_OPENAI_MODELS.filter(slug => ( + !ACCOUNT_GATED_NATIVE_OPENAI_MODELS.has(slug) || availableBareGatedNativeSlugs.has(slug) + )); + const availableAccountNativeSlugs = NATIVE_OPENAI_MODELS.filter(slug => ( + !ACCOUNT_GATED_NATIVE_OPENAI_MODELS.has(slug) || availableAccountGatedNativeSlugs.has(slug) + )); + const suppressedBareNativeSlugs = new Set([ + ...desktopAllowlistSuppressedNativeSlugs(config), + ...[...ACCOUNT_GATED_NATIVE_OPENAI_MODELS].filter(slug => !availableBareGatedNativeSlugs.has(slug)), + ]); const hasPhysicalComboProvider = Object.hasOwn(config.providers, COMBO_NAMESPACE); const enabledProviders = Object.entries(config.providers).filter(([, provider]) => provider.disabled !== true); const includeNativeOpenAi = shouldIncludeNativeOpenAi(config); const accountSelectors = shouldIncludeAccountBoundNativeOpenAi(config) ? visibleCodexAccountSelectors(config) : []; - const accountNativeSlugs = accountSelectors.length > 0 - ? accountBoundNativeOpenAiSlugs(observedAccountNativeEntries) - : []; + const accountTargets = new Map(codexAccountNamespaceEntries(config)); const accountNativeSlugsBySelector = accountSelectors.length > 0 - ? accountBoundNativeOpenAiSlugsBySelector(config, observedAccountNativeEntries) + ? new Map([...accountBoundNativeOpenAiSlugsBySelector(config, observedAccountNativeEntries)].map(([selector, slugs]) => { + const target = accountTargets.get(selector); + const accountId = target && isMainCodexAccountTarget(target) ? MAIN_CODEX_ACCOUNT_ID : target; + const entitled = accountId ? modelEntitlements.modelsByAccount.get(accountId) : undefined; + const confirmed = accountId ? modelEntitlements.confirmedAccountIds.has(accountId) : false; + return [selector, slugs.filter(slug => ( + !ACCOUNT_GATED_NATIVE_OPENAI_MODELS.has(slug) || (confirmed && entitled?.has(slug) === true) + ))] as const; + })) : new Map(); + const accountNativeSlugs = accountSelectors.length > 0 + ? [...new Set([...accountNativeSlugsBySelector.values()].flatMap(slugs => [...slugs]))] + : []; // Unknown account-native ids have no safe bare/global identity. They are only projected through // selector-qualified rows when a live selector is configured. const observedNativeSlugs: string[] = []; @@ -269,7 +309,7 @@ function prepareCatalog( ? [] : buildCatalogEntriesFromObservedState({ template: template ? JSON.parse(JSON.stringify(template)) : null, - gptSlugs: NATIVE_OPENAI_MODELS, + gptSlugs: availableAccountNativeSlugs, goModels: [], featured, wsEnabled: websocketsEnabled(config), @@ -314,7 +354,7 @@ function prepareCatalog( suppressedBareNativeSlugs, policy: { ...CANONICAL_NATIVE_CATALOG_CONTENT_POLICY, - nativeBackfillSlugs: [...NATIVE_OPENAI_MODELS, ...observedNativeSlugs], + nativeBackfillSlugs: [...availableBareNativeSlugs, ...observedNativeSlugs], warningPolicy: "suppress", }, }); @@ -356,11 +396,14 @@ export async function gatherCodexCatalogCandidate( const providerModelOutcomes: CatalogGatherProviderModelOutcome[] = []; const discoveryPolicies: CatalogProviderDiscoveryPolicySnapshot[] = []; providerGatherStarted = true; - const routedModels = await gatherRoutedModelsForCatalogGather(snapshot.config, session, { - providerAuthOutcomes: authOutcomes, - providerModelOutcomes, - discoveryPolicySnapshots: discoveryPolicies, - }); + const [routedModels, modelEntitlements] = await Promise.all([ + gatherRoutedModelsForCatalogGather(snapshot.config, session, { + providerAuthOutcomes: authOutcomes, + providerModelOutcomes, + discoveryPolicySnapshots: discoveryPolicies, + }), + resolveCodexModelEntitlements(snapshot.config), + ]); const processLocal = processEvidence(source); const sourceEvidence = sealCatalogGatherEvidenceSession(session); if (!same(sourceEvidence.required, snapshot.sourceEvidence.required)) { @@ -399,6 +442,7 @@ export async function gatherCodexCatalogCandidate( new Set(providerModelOutcomes .filter(outcome => outcome.state === "degraded") .map(outcome => outcome.provider)), + modelEntitlements, [ catalogFrom(keyedBackupBytes)?.models ?? [], catalogFrom(legacyBackupBytes)?.models ?? [], @@ -452,6 +496,7 @@ export async function gatherCodexCatalogCandidate( changed: Buffer.from(activeBytes ?? []).toString("utf8") !== preparedCatalogBytes || Buffer.from(cacheBytes ?? []).toString("utf8") !== preparedCacheBytes, notices: Object.freeze([...notices]), + modelEntitlements, }); return { kind: "candidate", candidate }; } catch (error) { @@ -469,6 +514,9 @@ export async function gatherCodexCatalogCandidate( } function revalidateCandidate(state: CandidateState): CodexCatalogCommitResult | null { + if (!isCodexModelEntitlementSnapshotCurrent(state.modelEntitlements)) { + return { kind: "stale", reason: "account-entitlement" }; + } let session: CatalogFilesystemEvidenceSession; let validatingTargets = false; try { diff --git a/src/codex/model-entitlements.ts b/src/codex/model-entitlements.ts new file mode 100644 index 0000000000..d06100138b --- /dev/null +++ b/src/codex/model-entitlements.ts @@ -0,0 +1,353 @@ +import { createHash } from "node:crypto"; +import { readBoundedResponseBody } from "../lib/bounded-body"; +import type { OcxConfig } from "../types"; +import { isSelectableCodexPoolAccount } from "./account-id"; +import { getValidCodexToken, readCodexAccountRecord } from "./account-store"; +import { getMainAccountToken, MAIN_CODEX_ACCOUNT_ID } from "./main-account"; +import { ACCOUNT_GATED_NATIVE_OPENAI_MODELS } from "./catalog/native-models"; + +const CODEX_MODELS_URL = "https://chatgpt.com/backend-api/codex/models?client_version=0.0.0"; +const MODEL_ROSTER_TTL_MS = 5 * 60_000; +const MODEL_ROSTER_FAILURE_TTL_MS = 15_000; +const MODEL_ROSTER_TIMEOUT_MS = 8_000; +const MODEL_ROSTER_MAX_BYTES = 2 * 1024 * 1024; +const MODEL_ROSTER_CACHE_MAX = 64; +const DIRECT_CALLER_ACCOUNT_PREFIX = "__direct_codex__:"; + +export interface CodexModelEntitlementCredentialSnapshot { + readonly accountId: string; + readonly accessToken: string; + readonly chatgptAccountId: string; + /** Stable local identity for rejecting a catalog commit after credential replacement. */ + readonly credentialIdentity: string; +} + +interface CachedAccountModels { + readonly credentialIdentity: string; + readonly expiresAt: number; + readonly models: ReadonlySet; + readonly confirmed: boolean; +} + +export interface CodexModelEntitlementSnapshot { + readonly modelsByAccount: ReadonlyMap>; + readonly confirmedAccountIds: ReadonlySet; + readonly credentialIdentities: ReadonlyMap; +} + +export interface CodexModelEntitlementResolveOptions { + readonly fetcher?: typeof fetch; + readonly now?: number; + /** Test-only credential seam; production callers enumerate local main + Pool credentials. */ + readonly credentials?: readonly CodexModelEntitlementCredentialSnapshot[]; +} + +const accountModelsCache = new Map(); +const accountModelsFlights = new Map>(); + +/** + * Direct-caller entries are evicted separately from main/Pool entries. + * + * Direct keys are per-credential (`__direct_codex__:`) and unbounded in practice, while + * main/Pool keys are the evidence the CATALOG projects from. Sharing one LRU let 64 distinct + * Direct callers evict `__main__` and the Pool accounts, which makes the gated row vanish from + * the catalog until rediscovery — fail-closed flapping rather than a leak, but still a visible + * model disappearing for a reason the operator cannot see. Two budgets keep one class of caller + * from erasing the other's evidence. + */ +function boundedCacheSet(accountId: string, value: CachedAccountModels): void { + accountModelsCache.delete(accountId); + accountModelsCache.set(accountId, value); + const isDirect = (key: string): boolean => key.startsWith(DIRECT_CALLER_ACCOUNT_PREFIX); + const evictClass = (direct: boolean): void => { + let count = 0; + for (const key of accountModelsCache.keys()) if (isDirect(key) === direct) count += 1; + while (count > MODEL_ROSTER_CACHE_MAX) { + let oldest: string | undefined; + for (const key of accountModelsCache.keys()) { + if (isDirect(key) === direct) { oldest = key; break; } + } + if (oldest === undefined) break; + accountModelsCache.delete(oldest); + count -= 1; + } + }; + evictClass(isDirect(accountId)); +} + +function currentCredentialIdentity(accountId: string): string | undefined { + if (accountId.startsWith(DIRECT_CALLER_ACCOUNT_PREFIX)) { + return `direct:${accountId.slice(DIRECT_CALLER_ACCOUNT_PREFIX.length)}`; + } + if (accountId === MAIN_CODEX_ACCOUNT_ID) { + const token = getMainAccountToken(); + return token ? `main:${token.chatgptAccountId}` : undefined; + } + const record = readCodexAccountRecord(accountId); + if (!record?.credential || record.deletedAt != null) return undefined; + return `pool:${record.generation}:${record.credential.chatgptAccountId}`; +} + +async function accountCredentialSnapshot(accountId: string): Promise { + if (accountId === MAIN_CODEX_ACCOUNT_ID) { + const token = getMainAccountToken(); + return token + ? { + accountId, + accessToken: token.accessToken, + chatgptAccountId: token.chatgptAccountId, + credentialIdentity: `main:${token.chatgptAccountId}`, + } + : null; + } + try { + const token = await getValidCodexToken(accountId); + return { + accountId, + accessToken: token.accessToken, + chatgptAccountId: token.chatgptAccountId, + credentialIdentity: `pool:${token.generation}:${token.chatgptAccountId}`, + }; + } catch { + return null; + } +} + +function parseAccountModels(text: string): ReadonlySet | null { + try { + const payload = JSON.parse(text) as { models?: unknown }; + if (!Array.isArray(payload.models)) return null; + const models = payload.models.flatMap(entry => { + if (!entry || typeof entry !== "object" || Array.isArray(entry)) return []; + const row = entry as { slug?: unknown; supported_in_api?: unknown; visibility?: unknown }; + if (typeof row.slug !== "string" || row.supported_in_api !== true || row.visibility === "hide") return []; + return [row.slug]; + }); + return new Set(models); + } catch { + return null; + } +} + +async function fetchAccountModels( + credential: CodexModelEntitlementCredentialSnapshot, + fetcher: typeof fetch, + now: number, +): Promise { + const controller = new AbortController(); + const timer = setTimeout(() => controller.abort(new DOMException("Codex model discovery timed out", "TimeoutError")), MODEL_ROSTER_TIMEOUT_MS); + try { + const headers = new Headers({ + Authorization: `Bearer ${credential.accessToken}`, + Accept: "application/json", + }); + if (credential.chatgptAccountId) headers.set("ChatGPT-Account-Id", credential.chatgptAccountId); + const response = await fetcher(CODEX_MODELS_URL, { + headers, + redirect: "error", + signal: controller.signal, + }); + const body = await readBoundedResponseBody(response, { + signal: controller.signal, + maxBytes: MODEL_ROSTER_MAX_BYTES, + fatalUtf8: true, + }); + const models = response.ok && body.displaySafe && !body.truncated + ? parseAccountModels(body.text) + : null; + return { + credentialIdentity: credential.credentialIdentity, + expiresAt: now + (models ? MODEL_ROSTER_TTL_MS : MODEL_ROSTER_FAILURE_TTL_MS), + models: models ?? new Set(), + confirmed: models !== null, + }; + } catch { + return { + credentialIdentity: credential.credentialIdentity, + expiresAt: now + MODEL_ROSTER_FAILURE_TTL_MS, + models: new Set(), + confirmed: false, + }; + } finally { + clearTimeout(timer); + } +} + +function directCallerCredential(headers: Headers): CodexModelEntitlementCredentialSnapshot | null { + const match = /^Bearer\s+(\S+)$/i.exec(headers.get("authorization")?.trim() ?? ""); + if (!match) return null; + const accessToken = match[1]!; + const chatgptAccountId = headers.get("chatgpt-account-id")?.trim() ?? ""; + const fingerprint = createHash("sha256") + .update(accessToken) + .update("\0") + .update(chatgptAccountId) + .digest("hex"); + return { + accountId: `${DIRECT_CALLER_ACCOUNT_PREFIX}${fingerprint}`, + accessToken, + chatgptAccountId, + credentialIdentity: `direct:${fingerprint}`, + }; +} + +async function modelsForCredential( + credential: CodexModelEntitlementCredentialSnapshot, + fetcher: typeof fetch, + now: number, +): Promise { + const cached = accountModelsCache.get(credential.accountId); + if ( + cached + && cached.credentialIdentity === credential.credentialIdentity + && cached.expiresAt > now + ) return cached; + + const flightKey = `${credential.accountId}\u0000${credential.credentialIdentity}`; + const existing = accountModelsFlights.get(flightKey); + if (existing) return existing; + const flight = fetchAccountModels(credential, fetcher, now) + .then(result => { + if (currentCredentialIdentity(credential.accountId) === credential.credentialIdentity) { + boundedCacheSet(credential.accountId, result); + } + return result; + }) + .finally(() => { + if (accountModelsFlights.get(flightKey) === flight) accountModelsFlights.delete(flightKey); + }); + accountModelsFlights.set(flightKey, flight); + return flight; +} + +function candidateAccountIds(config: Pick): string[] { + return [ + MAIN_CODEX_ACCOUNT_ID, + ...(config.codexAccounts ?? []) + .filter(isSelectableCodexPoolAccount) + .map(account => account.id), + ]; +} + +/** + * Fetch the authenticated model roster for every locally usable Codex account. + * + * [Decision Log] + * - 목적과 의도: Account-gated native models must be advertised and selected only for accounts + * whose own authenticated upstream catalog confirms the model. + * - 기존 구현 및 제약 조건: The injected Codex catalog is static, while Pool may contain + * accounts with different entitlements. A global allowlist therefore exposed unusable rows. + * - 검토한 주요 대안: Infer access from plan labels, learn only after a failed prompt, or rewrite + * Daybreak to its current physical model. + * - 선택한 방식: Cache bounded authenticated `/models` rosters per credential generation and + * fail closed for unconfirmed accounts. + * - 다른 대안 대신 이 방식을 선택한 이유: Plan names do not prove grants, post-failure + * learning spends a real turn, and model rewriting changes the requested product identity. + * - 장점, 단점 및 영향: Catalog and routing share exact account evidence. Cold gated requests + * pay one bounded discovery call per account; discovery failure temporarily hides the gated row. + */ +export async function resolveCodexModelEntitlements( + config: Pick, + options: CodexModelEntitlementResolveOptions = {}, +): Promise { + const now = options.now ?? Date.now(); + const fetcher = options.fetcher ?? fetch; + const credentials = options.credentials + ? [...options.credentials] + : (await Promise.all(candidateAccountIds(config).map(accountCredentialSnapshot))) + .filter((value): value is CodexModelEntitlementCredentialSnapshot => value !== null); + const results = await Promise.all(credentials.map(async credential => ({ + credential, + result: await modelsForCredential(credential, fetcher, now), + }))); + return { + modelsByAccount: new Map(results.map(({ credential, result }) => [credential.accountId, result.models])), + confirmedAccountIds: new Set(results.flatMap(({ credential, result }) => result.confirmed ? [credential.accountId] : [])), + credentialIdentities: new Map(results.map(({ credential }) => [credential.accountId, credential.credentialIdentity])), + }; +} + +/** Fail-closed entitlement check for a Direct request's own forwarded ChatGPT credential. */ +export async function isDirectCallerEntitledToCodexModel( + headers: Headers, + modelId: string, + options: Pick = {}, +): Promise { + if (!ACCOUNT_GATED_NATIVE_OPENAI_MODELS.has(modelId)) return true; + const credential = directCallerCredential(headers); + if (!credential) return false; + const result = await modelsForCredential( + credential, + options.fetcher ?? fetch, + options.now ?? Date.now(), + ); + return result.confirmed && result.models.has(modelId); +} + +export function entitledCodexAccountIdsForModel( + snapshot: CodexModelEntitlementSnapshot, + modelId: string | undefined, +): ReadonlySet | undefined { + if (!modelId || !ACCOUNT_GATED_NATIVE_OPENAI_MODELS.has(modelId)) return undefined; + return new Set([...snapshot.modelsByAccount].flatMap(([accountId, models]) => ( + snapshot.confirmedAccountIds.has(accountId) && models.has(modelId) ? [accountId] : [] + ))); +} + +export function availableAccountGatedNativeModels( + snapshot: CodexModelEntitlementSnapshot, + eligibleAccountIds?: ReadonlySet, +): ReadonlySet { + return new Set([...ACCOUNT_GATED_NATIVE_OPENAI_MODELS].filter(modelId => ( + [...snapshot.modelsByAccount].some(([accountId, models]) => ( + (!eligibleAccountIds || eligibleAccountIds.has(accountId)) + && snapshot.confirmedAccountIds.has(accountId) + && models.has(modelId) + )) + ))); +} + +/** Synchronous projection for management/catalog readers after a discovery pass. */ +export function cachedAvailableAccountGatedNativeModels( + now = Date.now(), + eligibleAccountIds?: ReadonlySet, +): ReadonlySet { + return new Set([...ACCOUNT_GATED_NATIVE_OPENAI_MODELS].filter(modelId => ( + [...accountModelsCache].some(([accountId, entry]) => ( + (!eligibleAccountIds || eligibleAccountIds.has(accountId)) + && !accountId.startsWith(DIRECT_CALLER_ACCOUNT_PREFIX) + && entry.confirmed + && entry.expiresAt > now + && entry.models.has(modelId) + )) + ))); +} + +export function isCodexModelEntitlementSnapshotCurrent(snapshot: CodexModelEntitlementSnapshot): boolean { + for (const [accountId, identity] of snapshot.credentialIdentities) { + if (currentCredentialIdentity(accountId) !== identity) return false; + } + return true; +} + +export function invalidateCodexModelEntitlementsForAccount(accountId: string | null | undefined): void { + if (accountId) accountModelsCache.delete(accountId); +} + +export function resetCodexModelEntitlementCacheForTests(): void { + accountModelsCache.clear(); + accountModelsFlights.clear(); +} + +export function seedCodexModelEntitlementsForTests( + accountId: string, + models: readonly string[], + now = Date.now(), +): void { + boundedCacheSet(accountId, { + credentialIdentity: `test:${accountId}`, + expiresAt: now + MODEL_ROSTER_TTL_MS, + models: new Set(models), + confirmed: true, + }); +} diff --git a/src/server/index.ts b/src/server/index.ts index b33e3f1750..70433d845c 100644 --- a/src/server/index.ts +++ b/src/server/index.ts @@ -58,6 +58,12 @@ import { cooldownErrorMessage, } from "../codex/auth-context"; import { codexAccountNamespaceForModel } from "../codex/account-namespace-match"; +import { codexAccountNamespaceEntries, isMainCodexAccountTarget } from "../codex/account-namespaces"; +import { MAIN_CODEX_ACCOUNT_ID } from "../codex/main-account"; +import { + availableAccountGatedNativeModels, + resolveCodexModelEntitlements, +} from "../codex/model-entitlements"; export { clearThreadAccountMap, formatCodexProviderForLog, @@ -899,8 +905,12 @@ export function startServer(port?: number, deps: StartServerDeps = {}): Server ( + !ACCOUNT_GATED_NATIVE_OPENAI_MODELS.has(slug) || availableBareGatedNativeSlugs.has(slug) + )); + const availableAccountNativeSlugs = NATIVE_OPENAI_MODELS.filter(slug => ( + !ACCOUNT_GATED_NATIVE_OPENAI_MODELS.has(slug) || availableAccountGatedNativeSlugs.has(slug) + )); const nativeSlugs = includeNativeOpenAi - ? nativeOpenAiSlugs() + ? nativeOpenAiSlugs().filter(slug => ( + !ACCOUNT_GATED_NATIVE_OPENAI_MODELS.has(slug) || availableBareGatedNativeSlugs.has(slug) + )) : []; const disabledNatives = disabledNativeSlugs(config); const disabledModels = new Set(config.disabledModels ?? []); const shadowedNativeSlugs = configuredNativeAliasSlugs(config); - const suppressedBareNativeSlugs = desktopAllowlistSuppressedNativeSlugs(config); + const suppressedBareNativeSlugs = new Set([ + ...desktopAllowlistSuppressedNativeSlugs(config), + ...[...ACCOUNT_GATED_NATIVE_OPENAI_MODELS].filter(slug => !availableBareGatedNativeSlugs.has(slug)), + ]); const accountSelectors = includeAccountBoundNativeOpenAi ? visibleCodexAccountSelectors(config) : []; + const accountTargets = new Map(codexAccountNamespaceEntries(config)); const accountNativeSlugsBySelector = includeAccountBoundNativeOpenAi - ? accountBoundNativeOpenAiSlugsBySelector(config) + ? new Map([...accountBoundNativeOpenAiSlugsBySelector(config)].map(([selector, slugs]) => { + const target = accountTargets.get(selector); + const accountId = target && isMainCodexAccountTarget(target) ? MAIN_CODEX_ACCOUNT_ID : target; + const entitled = accountId ? modelEntitlements.modelsByAccount.get(accountId) : undefined; + const confirmed = accountId ? modelEntitlements.confirmedAccountIds.has(accountId) : false; + return [selector, slugs.filter(slug => ( + !ACCOUNT_GATED_NATIVE_OPENAI_MODELS.has(slug) || (confirmed && entitled?.has(slug) === true) + ))] as const; + })) : new Map(); const accountNativeSlugs = [...new Set( [...accountNativeSlugsBySelector.values()].flatMap(slugs => [...slugs]), )]; + const desktopNativeSlugs = desktopVisibleNativeSlugs(config).filter(slug => ( + !ACCOUNT_GATED_NATIVE_OPENAI_MODELS.has(slug) || availableBareGatedNativeSlugs.has(slug) + )); const goEnabled = filterCatalogVisibleModels(goModels, config); const goOrdered = orderForSubagents(goEnabled, config.subagentModels); // Claude Code / Claude Desktop gateway model discovery (GET /v1/models with @@ -945,7 +988,7 @@ export function startServer(port?: number, deps: StartServerDeps = {}): Server ({ provider: m.provider, id: m.id, contextWindow: m.contextWindow })), config.claudeCode?.desktopProfile, ); @@ -962,7 +1005,7 @@ export function startServer(port?: number, deps: StartServerDeps = {}): Server 0 - ? [...new Set([...NATIVE_OPENAI_MODELS, ...accountNativeSlugs])] + ? [...new Set([ + ...availableAccountNativeSlugs, + ...accountNativeSlugs, + ])] : nativeSlugs; const entries = buildCatalogEntries( loadCatalogTemplate(), @@ -1043,7 +1089,7 @@ export function startServer(port?: number, deps: StartServerDeps = {}): Server 0 - ? NATIVE_OPENAI_MODELS.filter(slug => !disabledNatives.has(slug)) + ? availableBareNativeSlugs.filter(slug => !disabledNatives.has(slug)) : []; const bareSelectorNativeSlugs = accountSelectors.length > 0 ? selectorNativeSlugs diff --git a/src/server/responses/compact.ts b/src/server/responses/compact.ts index ea6813f599..adc9415ec6 100644 --- a/src/server/responses/compact.ts +++ b/src/server/responses/compact.ts @@ -126,6 +126,7 @@ import type { EffectiveSubagentRoster, SpawnAgentSurface } from "../../codex/cat import { codexAuthContextLogLabel } from "../../codex/account-label"; import { + codexAccountGatedCanonicalWireModel, decodeRequestErrorResponse, handleResponses, preAuthUpstreamHostCircuitKey, @@ -304,6 +305,12 @@ export async function handleResponsesCompact( return formatErrorResponse(404, "invalid_request_error", err instanceof Error ? err.message : String(err)); } const selectedModelId = route.modelId; + // Derive from the RESOLVED route model, not the caller's raw string. An account-qualified + // selector like `side/gpt-daybreak-blue-latest` does not match the gated map — `slugsEquivalent` + // reads the account namespace as a routed provider prefix — so keying on `raw.model` sent + // exactly the selector form back down the native compact endpoint this guard exists to avoid. + // `route.modelId` is the same value `applyCodexAccountGatedWireNormalization` uses in core.ts. + const accountGatedCompactWireModel = codexAccountGatedCanonicalWireModel(selectedModelId); logCtx.requestedModel = raw.model; logCtx.model = selectedModelId; logCtx.routeDecision = route.routeDecision; @@ -337,7 +344,7 @@ export async function handleResponsesCompact( // Native /responses/compact exists on the canonical ChatGPT backend and on the // official OpenAI API. Any other Responses-shaped gateway must take the routed // summarizer path below, or compaction fails against an endpoint it never had (#422). - if (supportsNativeResponsesCompactEndpoint(route.providerName, route.provider)) { + if (supportsNativeResponsesCompactEndpoint(route.providerName, route.provider) && !accountGatedCompactWireModel) { if (req.signal.aborted) { return formatErrorResponse(499, "client_cancelled", "Client cancelled compact request"); } @@ -371,6 +378,7 @@ export async function handleResponsesCompact( authCtx = await resolveCodexAuthContext(req.headers, config, route.codexAccountMode, { accountId: route.codexAccountId, modelId: selectedModelId, + substituteMainCredentialForDirect: substituteMainCredential, beginCodexAccountSelection: codexAccountSelectionForTurn(turnAdmissionLease), }); logCtx.accountLogLabel = codexAuthContextLogLabel(authCtx, config); @@ -668,7 +676,10 @@ export async function handleResponsesCompact( const inputItems = Array.isArray(raw.input) ? (raw.input as unknown[]) : []; const internalBody = { ...raw, - stream: false, + // Canonical ChatGPT Responses rejects non-streaming turns. Daybreak cannot use the + // native compact endpoint either, so run its synthetic compaction as SSE and collapse + // the completed event back into the v1 compact JSON contract below. + stream: accountGatedCompactWireModel ? true : false, input: [...inputItems, { type: "compaction_trigger" }], }; const internalHeaders = new Headers({ "content-type": "application/json" }); @@ -684,10 +695,36 @@ export async function handleResponsesCompact( const response = await handleResponses(internalReq, config, logCtx, { abortSignal: req.signal, turnAdmissionLease, ...(admission ? { admission } : {}) }); if (!response.ok) return response; let json: { output?: unknown[]; status?: unknown; error?: unknown }; - try { - json = await response.json() as { output?: unknown[]; status?: unknown; error?: unknown }; - } catch { - return formatErrorResponse(502, "server_error", "compaction turn returned a non-JSON response"); + if (response.headers.get("content-type")?.includes("text/event-stream")) { + if (!response.body) { + return formatErrorResponse(502, "server_error", "compaction turn returned an empty event stream"); + } + const terminal = { status: "incomplete" as "completed" | "failed" | "incomplete" }; + let completed: { id?: unknown; output?: unknown; status?: unknown } | undefined; + await new Promise(resolve => { + consumeForInspection( + response.body!, + status => { terminal.status = status; }, + req.signal, + resolve, + undefined, + undefined, + value => { completed = value; }, + ); + }); + if (req.signal.aborted) { + return formatErrorResponse(499, "client_cancelled", "Client cancelled compact request"); + } + if (terminal.status !== "completed" || !completed) { + return formatErrorResponse(502, "upstream_error", `compaction turn did not complete (status: ${terminal.status})`); + } + json = completed as { output?: unknown[]; status?: unknown; error?: unknown }; + } else { + try { + json = await response.json() as { output?: unknown[]; status?: unknown; error?: unknown }; + } catch { + return formatErrorResponse(502, "server_error", "compaction turn returned a non-JSON response"); + } } // The internal turn answers 200 even when it failed or was truncated, so the body // has to be inspected. Reporting a failure beats installing "(no summary @@ -716,6 +753,13 @@ export async function handleResponsesCompact( `compaction turn produced ${compactionItems.length} compaction items, expected exactly 1`, ); } + // The canonical Responses stream returns a real OpenAI-encrypted compaction item. OCX cannot + // and should not decrypt it; /responses/compact callers can consume that item directly. + if (accountGatedCompactWireModel) { + return new Response(JSON.stringify({ output: compactionItems }), { + headers: { "Content-Type": "application/json" }, + }); + } const encrypted = compactionItems[0]!.encrypted_content; const decoded = typeof encrypted === "string" ? decodeCompactionSummary(encrypted) : null; // An empty `ocx1:` envelope decodes to "" rather than null, so length is what matters. diff --git a/src/server/responses/core.ts b/src/server/responses/core.ts index 90fac70755..cd3073276d 100644 --- a/src/server/responses/core.ts +++ b/src/server/responses/core.ts @@ -109,6 +109,12 @@ import { stripCodexRuntimeProviderFields, type CodexAuthContext, } from "../../codex/auth-context"; +import { + entitledCodexAccountIdsForModel, + invalidateCodexModelEntitlementsForAccount, + resolveCodexModelEntitlements, +} from "../../codex/model-entitlements"; +import { ACCOUNT_GATED_NATIVE_OPENAI_MODELS } from "../../codex/catalog/native-models"; import { computeQuotaCooldown, formatCodexProviderForLog, @@ -530,6 +536,39 @@ type CodexPoolAccountRetryResult = authCtx: Extract; }; +const CODEX_ACCOUNT_GATED_CANONICAL_WIRE_MODELS: ReadonlyMap = new Map([ + // The authenticated catalog currently advertises Daybreak Blue, while successful responses + // identify the serving model as gpt-5.6-sol. Sending the selector itself is shard-dependent: + // live traffic can receive the exact unsupported-model 400 repeatedly from the same entitled + // account. Keep Daybreak as the admission/catalog identity, but use the stable serving id on + // the credential-bearing wire after entitlement selection has completed. + ["gpt-daybreak-blue-latest", "gpt-5.6-sol"], +]); + +export function codexAccountGatedCanonicalWireModel(modelId: string): string | undefined { + const exact = CODEX_ACCOUNT_GATED_CANONICAL_WIRE_MODELS.get(modelId); + if (exact) return exact; + for (const [selector, wireModel] of CODEX_ACCOUNT_GATED_CANONICAL_WIRE_MODELS) { + if (slugsEquivalent(modelId, selector)) return wireModel; + } + return undefined; +} + +function applyCodexAccountGatedWireNormalization(parsed: OcxParsedRequest, route: RouteResult): void { + if (!isCanonicalOpenAiForwardProvider(route.provider)) return; + const wireModel = codexAccountGatedCanonicalWireModel(route.modelId); + if (!wireModel) return; + + parsed.modelId = wireModel; + if (!parsed._rawBody || typeof parsed._rawBody !== "object") return; + const raw = parsed._rawBody as Record; + raw.model = wireModel; + // Daybreak's authenticated catalog does not advertise retention support, and the upstream + // rejects this optional Codex hint before model execution. Removing it preserves request + // semantics while avoiding an otherwise terminal pre-stream 400. + delete raw.prompt_cache_retention; +} + /** * Workspace-denial evidence for a 403, read from the upstream body. * @@ -580,22 +619,32 @@ async function retryCodexPoolOnAlternateAccount( req, config, route, parsed, logCtx, options, firstAuthCtx, firstResponse, outcomeStatus, upstream, connectMs, passthroughEstimate, stream, } = args; - // Defense in depth: exact account selectors must never reach alternate-account resolution, - // even if a future caller forgets to guard this helper. - if (firstAuthCtx.fixedAccount) return { kind: "no-alternate" }; const inboundWire = options.inboundWire ?? "responses"; let retryAuthCtx: CodexAuthContext | undefined; + if (outcomeStatus === 400 && ACCOUNT_GATED_NATIVE_OPENAI_MODELS.has(route.modelId)) { + invalidateCodexModelEntitlementsForAccount(firstAuthCtx.accountId); + const refreshed = await resolveCodexModelEntitlements(config); + if (entitledCodexAccountIdsForModel(refreshed, route.modelId)?.has(firstAuthCtx.accountId)) { + // The authenticated roster still grants this exact model. Retry on the same account: + // upstream shards can briefly disagree during a gated-model rollout, but a pre-stream 400 + // proves no output was committed and keeps this replay bounded. + retryAuthCtx = firstAuthCtx; + } + } + // Exact account selectors may retry the same confirmed account above, but must never resolve + // an alternate. Quota failures and a refreshed entitlement miss remain terminal. + if (!retryAuthCtx && firstAuthCtx.fixedAccount) return { kind: "no-alternate" }; try { - retryAuthCtx = await resolveCodexAuthContext( - req.headers, - config, - "pool", - { - excludeAccountId: firstAuthCtx.accountId, - modelId: route.modelId, - beginCodexAccountSelection: codexAccountSelectionForTurn(options.turnAdmissionLease), - }, - ); + retryAuthCtx ??= await resolveCodexAuthContext( + req.headers, + config, + "pool", + { + excludeAccountId: firstAuthCtx.accountId, + modelId: route.modelId, + beginCodexAccountSelection: codexAccountSelectionForTurn(options.turnAdmissionLease), + }, + ); } catch (error) { if ( !(error instanceof CodexPoolAuthenticationError) @@ -677,27 +726,50 @@ async function retryCodexPoolOnAlternateAccount( logCtx.accountLogLabel, ); - noteAttemptSend(logCtx.activeAttempt, passthroughEstimate); + const retrySameConfirmedAccount = outcomeStatus === 400 + && ACCOUNT_GATED_NATIVE_OPENAI_MODELS.has(route.modelId) + && retryAuthCtx.accountId === firstAuthCtx.accountId; + // Live Daybreak traffic has produced long runs of unsupported-model 400s from different + // upstream shards even while the authenticated roster continues to grant the model. Permit + // seven additional same-account sends (eight total including the original), re-checking the + // exact allow-listed body and fresh entitlement before every later send. Alternate-account and + // quota recovery retain their historical one-send bound. + const maxRetrySends = retrySameConfirmedAccount ? 7 : 1; + let retrySendCount = 0; let upstreamResponse: Response; try { - upstreamResponse = await fetchWithHeaderTimeout( - request.url, - { - method: request.method, - headers: request.headers, - body: request.body, - }, - upstream.signal, - connectMs, - stream, - providerFetch(route.provider, options.codexWsRuntimeIdentity, { - providerName: route.providerName, - modelId: route.modelId, - }), - // Credential-bearing forward send: never follow a redirect into a - // dead-host rejection after the credential was seen (#914). - route.provider.authMode === "forward", - ); + while (true) { + noteAttemptSend(logCtx.activeAttempt, passthroughEstimate); + upstreamResponse = await fetchWithHeaderTimeout( + request.url, + { + method: request.method, + headers: request.headers, + body: request.body, + }, + upstream.signal, + connectMs, + stream, + providerFetch(route.provider, options.codexWsRuntimeIdentity, { + providerName: route.providerName, + modelId: route.modelId, + }), + // Credential-bearing forward send: never follow a redirect into a + // dead-host rejection after the credential was seen (#914). + route.provider.authMode === "forward", + ); + retrySendCount += 1; + if (!retrySameConfirmedAccount || retrySendCount >= maxRetrySends) break; + if (!await shouldRetryCodexPoolAccountModel400( + upstreamResponse, + route.modelId, + options.abortSignal, + )) break; + invalidateCodexModelEntitlementsForAccount(retryAuthCtx.accountId); + const refreshed = await resolveCodexModelEntitlements(config); + if (!entitledCodexAccountIdsForModel(refreshed, route.modelId)?.has(retryAuthCtx.accountId)) break; + await upstreamResponse.body?.cancel().catch(() => undefined); + } } catch (error) { // Attribute the transport failure to the alternate account (already selected). return { kind: "transport", error, authCtx: retryAuthCtx }; @@ -1102,6 +1174,7 @@ async function resolveResponsesCodexAuth( authCtx = await resolveCodexAuthContext(req.headers, config, route.codexAccountMode, { accountId: route.codexAccountId, modelId: route.modelId, + substituteMainCredentialForDirect: substituteMainCredential, beginCodexAccountSelection: codexAccountSelectionForTurn(options.turnAdmissionLease), }); options.onCodexAuthContextResolved?.(authCtx); @@ -2133,6 +2206,7 @@ async function handleResponsesInner( } route.provider = applyCodexAuthContextToProvider(route.provider, authCtx, route.codexAccountMode); + applyCodexAccountGatedWireNormalization(parsed, route); logCtx.provider = route.codexAccountNamespace ? `${route.providerName}-${route.codexAccountNamespace}` : formatCodexProviderForLog(route.providerName, codexLogAccountId(authCtx), config); @@ -2692,7 +2766,7 @@ async function handleResponsesInner( } } - if (usesCodexForwardPoolAuth(authCtx, route.provider) && !authCtx.fixedAccount) { + if (usesCodexForwardPoolAuth(authCtx, route.provider)) { let poolRetryOutcome: number | undefined; if (await shouldRetryCodexPoolAccountModel400( upstreamResponse, @@ -2700,7 +2774,7 @@ async function handleResponsesInner( options.abortSignal, )) { poolRetryOutcome = 400; - } else if (shouldRetryCodexPoolAccountQuota(upstreamResponse)) { + } else if (!authCtx.fixedAccount && shouldRetryCodexPoolAccountQuota(upstreamResponse)) { // Pre-stream only: once SSE has begun, mid-stream quota stays terminal. poolRetryOutcome = upstreamResponse.status; } diff --git a/structure/03_catalog-and-subagents.md b/structure/03_catalog-and-subagents.md index 9f4b6cad33..49272b9f1c 100644 --- a/structure/03_catalog-and-subagents.md +++ b/structure/03_catalog-and-subagents.md @@ -44,6 +44,13 @@ are emitted only as selector-qualified rows whose account provenance matches. Th the bare native or API-key model list. This keeps account-scoped upstream ids such as `gpt-daybreak-blue-latest` callable without treating them as a static release allowlist. +Account-gated native ids are a stricter subset. Their authenticated ChatGPT `/models` roster is +cached per credential generation with a bounded timeout. A bare gated row is emitted only when at +least one confirmed eligible account reports it; a selector-qualified row is emitted only when the +mapped account reports it. A failed or malformed discovery is not positive evidence and therefore +hides the gated row until a later refresh. The same snapshot gates Pool selection, so the catalog +and runtime cannot disagree by advertising through one account and dispatching through another. + The app-server's model list comes from this shared catalog, not from patching the App. Codex Desktop may still apply its remote native-only allowlist after `model/list`; an explicitly configured combo `nativeAlias` is the bounded compatibility path. It replaces one supported bare native row with a diff --git a/structure/08_openai-provider-tiers.md b/structure/08_openai-provider-tiers.md index 49acd21758..a43325674b 100644 --- a/structure/08_openai-provider-tiers.md +++ b/structure/08_openai-provider-tiers.md @@ -115,6 +115,57 @@ preserving a stale one would block every later migration. `daybreak-blue-latest` are distinct wire surfaces. An observed native row follows the pinned Sol capability metadata, but routing strips only the account selector and keeps `gpt-daybreak-blue-latest` byte-for-byte; it never expands the bare list or substitutes Sol. +- Account-gated native rows use each account's authenticated Codex `/models` roster as the + availability authority. Pool selection excludes accounts whose confirmed roster omits the model; + selector rows are generated only for the mapped entitled account. The bare row uses any eligible + account in Pool mode but only main-account evidence in Direct mode; a Direct turn independently + checks the forwarded caller credential, or stored main when an admission bearer is substituted. + Discovery failures fail closed. If an + entitled account still receives the exact pre-stream unsupported-model 400, opencodex invalidates + that account's roster and permits at most seven additional same-account sends, re-confirming the + exact rejection and fresh grant before each later send; otherwise ordinary eligible-account + failover applies. + +- `gpt-daybreak-blue-latest` remains the catalog and entitlement identity, but the canonical + ChatGPT wire uses `gpt-5.6-sol`, the serving id reported by successful Daybreak responses. + Daybreak compaction uses the existing synthetic `/responses` compaction path instead of the + native `/responses/compact` endpoint, whose model support is selector-specific. The internal + turn stays streaming as required by the canonical ChatGPT backend, and OCX returns the opaque + encrypted compaction item without attempting to decrypt or re-encode it. + The optional `prompt_cache_retention` hint is removed on this route because Daybreak's + authenticated catalog does not advertise it and upstream rejects it before execution. + +[Decision Log] +- 목적과 의도: Preserve the account-gated Daybreak UX while avoiding shard-dependent selector + rejection and the unsupported prompt-cache retention parameter. +- 기존 구현 및 제약 조건: The authenticated roster grants Daybreak, but live successful + responses report `gpt-5.6-sol`; the selector can still fail eight consecutive times. +- 검토한 주요 대안: Increase retries indefinitely, hide Daybreak entirely, or canonicalize only + the credential-bearing wire model after entitlement selection. +- 선택한 방식: Keep Daybreak for visibility and account authorization, then send the stable + serving id and remove only the unsupported optional retention hint. +- 다른 대안 대신 이 방식을 선택한 이유: It keeps fail-closed entitlement checks and avoids + unbounded duplicate requests while preserving the user-facing model choice. +- 장점, 단점 및 영향: Requests become deterministic and cheaper; this relies on the serving id + observed from successful upstream responses and must be revisited if the roster exposes a + first-class wire id later. + +[Decision Log] +- 목적과 의도: Prevent account-gated native models from being shown or dispatched through a + ChatGPT account that upstream does not authorize. +- 기존 구현 및 제약 조건: A static global Daybreak row solved clean-install discovery for + entitled accounts, but Pool accounts can hold different grants and Codex's injected catalog does + not refresh itself. +- 검토한 주요 대안: Infer grants from plan labels, learn only from prompt failures, bind Daybreak + permanently to main, or rewrite the wire id to `gpt-5.6-sol`. +- 선택한 방식: Share bounded authenticated per-account model-roster evidence between catalog sync, + `/v1/models`, and Pool auth selection. +- 다른 대안 대신 이 방식을 선택한 이유: Plan labels and account position do not prove a grant; + failure-only learning wastes a turn; permanent main binding rejects valid secondary grants; wire + rewriting changes the requested product identity. +- 장점, 단점 및 영향: Entitled accounts retain clean-install discovery while unentitled accounts + never receive the gated dispatch. A cold gated request may pay one bounded roster fetch per + account, and an unavailable discovery temporarily hides the model rather than guessing. - The two GPT-5.6 surfaces advertise different windows on purpose. API rows use 1,050,000 context with 922,000 max input. Codex-login rows default to the live catalog 272,000 (auto-compact 244,800) and only rise to 922,000 / 829,800 when the user turns the 1M diff --git a/tests/claude-models-discovery.test.ts b/tests/claude-models-discovery.test.ts index ef47458a7f..19f58ac795 100644 --- a/tests/claude-models-discovery.test.ts +++ b/tests/claude-models-discovery.test.ts @@ -370,16 +370,33 @@ test("Codex discovery exposes the observed native as a selector row plus one glo opencodex_account_observed_native: true, }], }), "utf8"); + writeFileSync(join(isolatedCodexHome!.path, "auth.json"), JSON.stringify({ + tokens: { access_token: "main-token", account_id: "main-account" }, + }), "utf8"); const { resetCatalogRuntimeStateForTests } = await import("../src/codex/catalog"); + const { resetCodexModelEntitlementCacheForTests } = await import("../src/codex/model-entitlements"); resetCatalogRuntimeStateForTests(); + resetCodexModelEntitlementCacheForTests(); + const originalFetch = globalThis.fetch; + globalThis.fetch = (async (input, init) => { + const url = new URL(typeof input === "string" ? input : input instanceof URL ? input : input.url); + if (url.hostname === "chatgpt.com" && url.pathname.endsWith("/models")) { + return Response.json({ models: [{ + slug: "gpt-daybreak-blue-latest", + supported_in_api: true, + visibility: "list", + }] }); + } + return originalFetch(input, init); + }) as typeof fetch; const server = startServer(0); try { const plain = await fetch(new URL("/v1/models", server.url)) .then(response => response.json()) as { data: Array<{ id: string }> }; expect(plain.data).toContainEqual(expect.objectContaining({ id: "team/gpt-daybreak-blue-latest" })); - // Daybreak is globally allowlisted (owner decision, devlog 260816_.../011), so the bare - // id is now discoverable too, exactly once. + // Main's authenticated roster confirmed Daybreak above, so the bare id is discoverable + // exactly once alongside the mapped selector row. expect(plain.data.filter(model => model.id === "gpt-daybreak-blue-latest")).toHaveLength(1); const managementUrl = new URL("http://localhost/api/models"); @@ -389,9 +406,8 @@ test("Codex discovery exposes the observed native as a selector row plus one glo config, ); const management = await managementResponse!.json() as Array<{ id: string; native?: boolean }>; - // Once Daybreak is globally allowlisted the management surface reports it under its - // GLOBAL bare identity rather than as an account-qualified discovery row - // (model-rows.ts:59 / metadata.ts:243). Exactly one row, and no selector duplicate. + // The confirmed main entitlement makes the management surface report the bare native row. + // Management rows intentionally use the bare identity rather than duplicating selector rows. expect(management).toContainEqual(expect.objectContaining({ id: "gpt-daybreak-blue-latest", native: true, @@ -417,6 +433,7 @@ test("Codex discovery exposes the observed native as a selector row plus one glo expect(anthropic.data.some(model => model.id === claudeCodeNativeAlias("gpt-daybreak-blue-latest"))).toBe(false); expect(anthropic.data.some(model => model.id === claudeCodeNativeAlias("team/gpt-daybreak-blue-latest"))).toBe(false); } finally { + globalThis.fetch = originalFetch; await server.stop(true); } }); diff --git a/tests/codex-auth-context.test.ts b/tests/codex-auth-context.test.ts index ade8606a40..b4e9f77d86 100644 --- a/tests/codex-auth-context.test.ts +++ b/tests/codex-auth-context.test.ts @@ -65,6 +65,7 @@ import { codexAccountSelectionForTurn, tryAdmitTurn, } from "../src/server/lifecycle"; +import type { CodexModelEntitlementSnapshot } from "../src/codex/model-entitlements"; let testDir: string; let previousOpencodexHome: string | undefined; @@ -342,6 +343,122 @@ describe("Codex auth context", () => { .rejects.toBeInstanceOf(CodexDirectAuthenticationError); }); + test("direct account-gated routing checks the caller credential, not local account state", async () => { + let callerChecks = 0; + let localDiscoveries = 0; + const headers = new Headers({ authorization: "Bearer caller", "chatgpt-account-id": "caller-account" }); + await expect(resolveCodexAuthContext(headers, config(), "direct", { + modelId: "gpt-daybreak-blue-latest", + isDirectCallerEntitledToCodexModel: async (received, modelId) => { + callerChecks += 1; + expect(received).toBe(headers); + expect(modelId).toBe("gpt-daybreak-blue-latest"); + return true; + }, + resolveCodexModelEntitlements: async () => { + localDiscoveries += 1; + throw new Error("must not inspect local accounts"); + }, + })).resolves.toEqual({ kind: "main", accountId: null }); + expect(callerChecks).toBe(1); + expect(localDiscoveries).toBe(0); + }); + + test("Direct admission-bearer substitution checks the stored main account grant", async () => { + const entitledMain: CodexModelEntitlementSnapshot = { + modelsByAccount: new Map([[MAIN_CODEX_ACCOUNT_ID, new Set(["gpt-daybreak-blue-latest"])]]), + confirmedAccountIds: new Set([MAIN_CODEX_ACCOUNT_ID]), + credentialIdentities: new Map(), + }; + let callerChecks = 0; + await expect(resolveCodexAuthContext( + new Headers({ authorization: "Bearer ocx-admission" }), + config(), + "direct", + { + modelId: "gpt-daybreak-blue-latest", + substituteMainCredentialForDirect: true, + resolveCodexModelEntitlements: async () => entitledMain, + isDirectCallerEntitledToCodexModel: async () => { + callerChecks += 1; + return false; + }, + }, + )).resolves.toEqual({ kind: "main", accountId: null }); + expect(callerChecks).toBe(0); + }); + + test("account-gated native routing skips an active account without the model grant", async () => { + const cfg = config(); + writeFileSync(join(testDir, "auth.json"), JSON.stringify({ + tokens: { access_token: "main-token", account_id: "main-account" }, + })); + saveCodexAccountCredential("pool-a", { + accessToken: "pool-token", + refreshToken: "pool-refresh", + expiresAt: Date.now() + 5 * 60_000, + chatgptAccountId: "pool-account", + }); + const entitlementSnapshot: CodexModelEntitlementSnapshot = { + modelsByAccount: new Map([ + [MAIN_CODEX_ACCOUNT_ID, new Set(["gpt-daybreak-blue-latest"])], + ["pool-a", new Set(["gpt-5.6-sol"])], + ]), + confirmedAccountIds: new Set([MAIN_CODEX_ACCOUNT_ID, "pool-a"]), + credentialIdentities: new Map(), + }; + + await expect(resolveCodexAuthContext(new Headers(), cfg, "pool", { + modelId: "gpt-daybreak-blue-latest", + isMainAccountTokenLive: () => true, + getMainAccountToken: () => ({ accessToken: "main-token", chatgptAccountId: "main-account" }), + resolveCodexModelEntitlements: async () => entitlementSnapshot, + primeCodexPoolQuotas: async () => {}, + })).resolves.toMatchObject({ + kind: "main-pool", + accountId: MAIN_CODEX_ACCOUNT_ID, + }); + }); + + test("exact account-gated routing fails closed for an unentitled account", async () => { + const cfg = config(); + saveCodexAccountCredential("pool-a", { + accessToken: "pool-token", + refreshToken: "pool-refresh", + expiresAt: Date.now() + 5 * 60_000, + chatgptAccountId: "pool-account", + }); + const entitlementSnapshot: CodexModelEntitlementSnapshot = { + modelsByAccount: new Map([["pool-a", new Set(["gpt-5.6-sol"])]]), + confirmedAccountIds: new Set(["pool-a"]), + credentialIdentities: new Map(), + }; + + await expect(resolveCodexAuthContext(new Headers(), cfg, "pool", { + accountId: "pool-a", + modelId: "gpt-daybreak-blue-latest", + resolveCodexModelEntitlements: async () => entitlementSnapshot, + })).rejects.toThrow("Selected Codex account does not support this model"); + }); + + test("ordinary native models do not pay the entitlement discovery path", async () => { + saveCodexAccountCredential("pool-a", { + accessToken: "pool-token", + refreshToken: "pool-refresh", + expiresAt: Date.now() + 5 * 60_000, + chatgptAccountId: "pool-account", + }); + let discoveries = 0; + await expect(resolveCodexAuthContext(new Headers(), config(), "pool", { + modelId: "gpt-5.6-sol", + resolveCodexModelEntitlements: async () => { + discoveries += 1; + throw new Error("must not run"); + }, + })).resolves.toMatchObject({ kind: "pool", accountId: "pool-a" }); + expect(discoveries).toBe(0); + }); + test("exact account resolution overrides Direct without consulting Pool selection", async () => { const cfg = config(); cfg.activeCodexAccountId = "pool-b"; diff --git a/tests/codex-catalog-sync-hardening.test.ts b/tests/codex-catalog-sync-hardening.test.ts index 0e65cdc814..29d84ff661 100644 --- a/tests/codex-catalog-sync-hardening.test.ts +++ b/tests/codex-catalog-sync-hardening.test.ts @@ -4,6 +4,7 @@ import { spawnSync } from "node:child_process"; import { tmpdir } from "node:os"; import { dirname, join, resolve } from "node:path"; import { fileURLToPath } from "node:url"; +import { ACCOUNT_GATED_NATIVE_OPENAI_MODELS } from "../src/codex/catalog/native-models"; const repoRoot = dirname(fileURLToPath(new URL("../package.json", import.meta.url))); @@ -379,7 +380,7 @@ describe("Codex catalog sync hardening", () => { expect(JSON.stringify(rows)).not.toContain("Private Display Name"); }); - test("account sync preserves an observed account-only native id without creating a bare row", () => { + test("account sync preserves an observed gated native only after the mapped account confirms it", () => { const catalogPath = join(codexHome, "catalog.json"); writeFileSync(join(codexHome, "config.toml"), 'model_catalog_json = "catalog.json"\n', "utf8"); writeFileSync(catalogPath, JSON.stringify({ @@ -393,8 +394,22 @@ describe("Codex catalog sync hardening", () => { opencodex_account_observed_native: true, }], }, null, 2) + "\n"); + writeFileSync(join(codexHome, "auth.json"), JSON.stringify({ + tokens: { access_token: "main-token", account_id: "main-account" }, + }), "utf8"); const r = runScript(codexHome, opencodexHome, ` + globalThis.fetch = async input => { + const url = new URL(typeof input === "string" ? input : input.url); + if (url.hostname === "chatgpt.com" && url.pathname.endsWith("/models")) { + return Response.json({ models: [{ + slug: "gpt-daybreak-blue-latest", + supported_in_api: true, + visibility: "list" + }] }); + } + throw new Error("unexpected fetch"); + }; const { syncCatalogModels } = require("./src/codex/catalog"); syncCatalogModels({ providers: { @@ -419,8 +434,8 @@ describe("Codex catalog sync hardening", () => { use_responses_lite: true, supports_parallel_tool_calls: true, }); - // Daybreak is globally allowlisted now (owner decision, devlog 260816_.../011), - // so the bare row IS expected — exactly once — alongside the account-qualified row. + // Main's authenticated roster grants Daybreak, so Pool publishes one bare row alongside + // the exact selector row. The observed cache row alone is not entitlement evidence. expect(rows.filter(row => row.slug === "gpt-daybreak-blue-latest")).toHaveLength(1); }); @@ -471,9 +486,9 @@ describe("Codex catalog sync hardening", () => { opencodex_catalog_kind: "custom-model-v1", }); expect(daybreak?.base_instructions).toContain("powered by the gpt-daybreak-blue-latest"); - // The global native row exists (owner decision); the explicit Codex-forward custom row - // above is a separate identity and must not collapse into it. - expect(rows.filter(row => row.slug === "gpt-daybreak-blue-latest")).toHaveLength(1); + // The explicit custom row is independent of native account entitlement. With no confirmed + // account roster, the account-gated bare row stays absent instead of collapsing into it. + expect(rows.filter(row => row.slug === "gpt-daybreak-blue-latest")).toHaveLength(0); expect(rows.some(row => row.slug === "main/gpt-daybreak-blue-latest")).toBe(false); // The separately billed API-key alias must still never reach the Codex surface. expect(rows.some(row => row.slug === "openai-apikey/daybreak-blue-latest")).toBe(false); @@ -640,7 +655,9 @@ describe("Codex catalog sync hardening", () => { expect(r.status).toBe(0); const result = JSON.parse(r.stdout) as { picker: string[]; native: string[]; fallback: string[] }; expect(result.picker).toContain("gpt-5.3-codex-spark"); - expect(result.native).toEqual(result.fallback); + expect(result.native).toEqual( + result.fallback.filter(slug => !ACCOUNT_GATED_NATIVE_OPENAI_MODELS.has(slug)), + ); }); test("account sync recovers supported natives that were hidden before selectors existed", () => { diff --git a/tests/codex-convergence-account-selectors.test.ts b/tests/codex-convergence-account-selectors.test.ts index eedd2616d4..48d15e6da7 100644 --- a/tests/codex-convergence-account-selectors.test.ts +++ b/tests/codex-convergence-account-selectors.test.ts @@ -44,6 +44,9 @@ import { } from "../src/codex/runtime"; import { markModelsFetchFailure } from "../src/codex/model-cache"; import { legacyCustomModelCatalogSlugs } from "../src/codex/custom-model-catalog-migration"; +import { resetCodexModelEntitlementCacheForTests } from "../src/codex/model-entitlements"; +import { ACCOUNT_GATED_NATIVE_OPENAI_MODELS } from "../src/codex/catalog/native-models"; +import { saveCodexAccountCredential } from "../src/codex/account-store"; // The canonical-bytes case spawns real syncs and runs ~2.5s in isolation, on this // tree and on a clean baseline alike. That is half of bun's 5s default, but full @@ -223,6 +226,7 @@ function primeCodexRuntimeFixture(): void { process.env.CODEX_CLI_PATH = createCodexRuntimeFixture(); resetCatalogRuntimeStateForTests(); resetCodexRuntimeResolveCacheForTests(); + resetCodexModelEntitlementCacheForTests(); expect(loadBundledCodexCatalog()?.models?.[0]?.slug).toBe("gpt-5.5"); } @@ -263,6 +267,7 @@ beforeEach(() => { process.env.OPENCODEX_HOME = opencodexHome; resetCatalogRuntimeStateForTests(); resetCodexRuntimeResolveCacheForTests(); + resetCodexModelEntitlementCacheForTests(); }); afterEach(() => { @@ -357,6 +362,9 @@ test("convergence drops unsupported bare native rows and never qualifies them", test("convergence projects the observed Daybreak row onto its selector and one bare row", async () => { writeCatalog([nativeEntry()]); + writeFileSync(join(codexHome, "auth.json"), JSON.stringify({ + tokens: { access_token: "main-token", account_id: "main-chatgpt-account" }, + })); writeFileSync(join(codexHome, "models_cache.json"), JSON.stringify({ models: [{ slug: "gpt-daybreak-blue-latest", @@ -371,7 +379,24 @@ test("convergence projects the observed Daybreak row onto its selector and one b }], }, null, 2) + "\n"); - const catalog = await convergeCatalog(config(true)); + const originalFetch = globalThis.fetch; + globalThis.fetch = (async (input, init) => { + const url = new URL(typeof input === "string" ? input : input instanceof URL ? input : input.url); + if (url.hostname === "chatgpt.com" && url.pathname.endsWith("/models")) { + return Response.json({ models: [{ + slug: "gpt-daybreak-blue-latest", + supported_in_api: true, + visibility: "list", + }] }); + } + return originalFetch(input, init); + }) as typeof fetch; + let catalog: RawCatalog; + try { + catalog = await convergeCatalog(config(true)); + } finally { + globalThis.fetch = originalFetch; + } const models = catalog.models ?? []; const daybreak = models.find(entry => entry.slug === "desktop/gpt-daybreak-blue-latest"); expect(daybreak).toMatchObject({ @@ -388,14 +413,54 @@ test("convergence projects the observed Daybreak row onto its selector and one b }); expect((daybreak?.supported_reasoning_levels as Array<{ effort: string }>).map(level => level.effort)) .toEqual(["low", "medium", "high", "xhigh", "max", "ultra"]); - // Daybreak is globally allowlisted (owner decision, devlog 260816_.../011). A global - // native is seeded onto EVERY visible selector, not only the one that observed it, and the - // bare row now exists. Each must appear exactly once despite the observation also present. - expect(models.filter(entry => entry.slug === "team/gpt-daybreak-blue-latest")).toHaveLength(1); + // Main's authenticated roster confirms Daybreak, so the bare row and main selector exist. + // The side account has no confirmed grant and must not receive a selector row. + expect(models.filter(entry => entry.slug === "team/gpt-daybreak-blue-latest")).toHaveLength(0); expect(models.filter(entry => entry.slug === "desktop/gpt-daybreak-blue-latest")).toHaveLength(1); expect(models.filter(entry => entry.slug === "gpt-daybreak-blue-latest")).toHaveLength(1); }); +test("Direct convergence does not borrow a Pool-only Daybreak grant for the bare row", async () => { + writeCatalog([nativeEntry()]); + writeFileSync(join(codexHome, "auth.json"), JSON.stringify({ + tokens: { access_token: "main-token", account_id: "main-chatgpt-account" }, + })); + saveCodexAccountCredential("side-account-id", { + accessToken: "side-token", + refreshToken: "side-refresh", + expiresAt: Date.now() + 5 * 60_000, + chatgptAccountId: "side-chatgpt-account", + }); + + const originalFetch = globalThis.fetch; + globalThis.fetch = (async (input, init) => { + const url = new URL(typeof input === "string" ? input : input instanceof URL ? input : input.url); + if (url.hostname === "chatgpt.com" && url.pathname.endsWith("/models")) { + const accountId = new Headers(init?.headers).get("chatgpt-account-id"); + return Response.json({ models: [ + { slug: "gpt-5.6-sol", supported_in_api: true, visibility: "list" }, + ...(accountId === "side-chatgpt-account" + ? [{ slug: "gpt-daybreak-blue-latest", supported_in_api: true, visibility: "list" }] + : []), + ] }); + } + return originalFetch(input, init); + }) as typeof fetch; + const directConfig = config(true); + directConfig.providers.openai!.codexAccountMode = "direct"; + let catalog: RawCatalog; + try { + catalog = await convergeCatalog(directConfig); + } finally { + globalThis.fetch = originalFetch; + } + const models = catalog.models ?? []; + + expect(models.filter(entry => entry.slug === "gpt-daybreak-blue-latest")).toHaveLength(0); + expect(models.filter(entry => entry.slug === "desktop/gpt-daybreak-blue-latest")).toHaveLength(0); + expect(models.filter(entry => entry.slug === "team/gpt-daybreak-blue-latest")).toHaveLength(1); +}); + test("convergence preserves unrelated foreign rows alongside fresh configured provider rows", async () => { writeCatalog([ nativeEntry(), @@ -806,7 +871,10 @@ test("retained sync and convergence produce identical canonical bytes in either const models = (JSON.parse(bytes) as RawCatalog).models ?? []; const slugs = models ?.flatMap(entry => typeof entry.slug === "string" ? [entry.slug] : []) ?? []; - for (const slug of NATIVE_OPENAI_MODELS) expect(slugs).toContain(slug); + for (const slug of NATIVE_OPENAI_MODELS) { + if (ACCOUNT_GATED_NATIVE_OPENAI_MODELS.has(slug)) expect(slugs).not.toContain(slug); + else expect(slugs).toContain(slug); + } expect(slugs).not.toContain("gpt-legacy-unsupported"); expect(slugs).toContain("user-native"); expect(models.find(entry => entry.slug === "gpt-5.6-sol")?.visibility) diff --git a/tests/codex-model-entitlements.test.ts b/tests/codex-model-entitlements.test.ts new file mode 100644 index 0000000000..85a55c703e --- /dev/null +++ b/tests/codex-model-entitlements.test.ts @@ -0,0 +1,155 @@ +import { beforeEach, describe, expect, test } from "bun:test"; +import { + availableAccountGatedNativeModels, + cachedAvailableAccountGatedNativeModels, + entitledCodexAccountIdsForModel, + isDirectCallerEntitledToCodexModel, + resetCodexModelEntitlementCacheForTests, + resolveCodexModelEntitlements, + cachedAvailableAccountGatedNativeModels, + seedCodexModelEntitlementsForTests, + seedCodexModelEntitlementsForTests, + type CodexModelEntitlementCredentialSnapshot, +} from "../src/codex/model-entitlements"; + +const DAYBREAK = "gpt-daybreak-blue-latest"; + +function credential(accountId: string): CodexModelEntitlementCredentialSnapshot { + return { + accountId, + accessToken: `token-${accountId}`, + chatgptAccountId: `chatgpt-${accountId}`, + credentialIdentity: `test:${accountId}`, + }; +} + +function roster(...slugs: string[]): Response { + return Response.json({ + models: slugs.map(slug => ({ slug, supported_in_api: true, visibility: "list" })), + }); +} + +beforeEach(() => resetCodexModelEntitlementCacheForTests()); + +describe("Codex account model entitlements", () => { + test("keeps account-gated models scoped to the authenticated account roster", async () => { + const snapshot = await resolveCodexModelEntitlements({ codexAccounts: [] }, { + credentials: [credential("main"), credential("secondary")], + fetcher: (async (_input, init) => { + const accountId = new Headers(init?.headers).get("chatgpt-account-id"); + return accountId === "chatgpt-main" + ? roster("gpt-5.6-sol", DAYBREAK) + : roster("gpt-5.6-sol"); + }) as typeof fetch, + now: 1_000, + }); + + expect([...entitledCodexAccountIdsForModel(snapshot, DAYBREAK)!]).toEqual(["main"]); + expect([...availableAccountGatedNativeModels(snapshot)]).toEqual([DAYBREAK]); + expect(entitledCodexAccountIdsForModel(snapshot, "gpt-5.6-sol")).toBeUndefined(); + }); + + test("fails closed when an account roster cannot be confirmed", async () => { + const snapshot = await resolveCodexModelEntitlements({ codexAccounts: [] }, { + credentials: [credential("broken")], + fetcher: (async () => new Response("not-json", { status: 502 })) as typeof fetch, + now: 1_000, + }); + + expect(snapshot.confirmedAccountIds.size).toBe(0); + expect(entitledCodexAccountIdsForModel(snapshot, DAYBREAK)?.size).toBe(0); + expect(availableAccountGatedNativeModels(snapshot).size).toBe(0); + }); + + test("ignores hidden or API-disabled rows", async () => { + const snapshot = await resolveCodexModelEntitlements({ codexAccounts: [] }, { + credentials: [credential("main")], + fetcher: (async () => Response.json({ models: [ + { slug: DAYBREAK, supported_in_api: true, visibility: "hide" }, + { slug: "gpt-disabled", supported_in_api: false, visibility: "list" }, + ] })) as typeof fetch, + now: 1_000, + }); + + expect(snapshot.confirmedAccountIds.has("main")).toBe(true); + expect(entitledCodexAccountIdsForModel(snapshot, DAYBREAK)?.size).toBe(0); + }); + + test("checks a Direct caller's own bearer instead of a local Pool account", async () => { + let seenAuthorization = ""; + let seenAccount = ""; + const entitled = await isDirectCallerEntitledToCodexModel( + new Headers({ + authorization: "Bearer caller-token", + "chatgpt-account-id": "caller-account", + }), + DAYBREAK, + { + fetcher: (async (_input, init) => { + const headers = new Headers(init?.headers); + seenAuthorization = headers.get("authorization") ?? ""; + seenAccount = headers.get("chatgpt-account-id") ?? ""; + return roster("gpt-5.6-sol", DAYBREAK); + }) as typeof fetch, + now: 1_000, + }, + ); + + expect(entitled).toBe(true); + expect(seenAuthorization).toBe("Bearer caller-token"); + expect(seenAccount).toBe("caller-account"); + }); + + test("Direct entitlement fails closed on an unconfirmed roster", async () => { + await expect(isDirectCallerEntitledToCodexModel( + new Headers({ authorization: "Bearer caller-token" }), + DAYBREAK, + { + fetcher: (async () => new Response("unavailable", { status: 503 })) as typeof fetch, + now: 1_000, + }, + )).resolves.toBe(false); + }); + + test("Direct-caller rosters do not evict main/Pool entitlement evidence", async () => { + // The catalog projects ONLY from main/Pool keys. Under a single shared LRU, a burst of + // distinct Direct callers pushed those out and the gated row vanished from the catalog until + // rediscovery — fail-closed flapping whose cause an operator cannot see. + seedCodexModelEntitlementsForTests("main", [DAYBREAK], 1_000); + expect([...cachedAvailableAccountGatedNativeModels(1_000)]).toContain(DAYBREAK); + + // Far more distinct Direct callers than the per-class cache bound of 64. + for (let i = 0; i < 80; i += 1) { + await isDirectCallerEntitledToCodexModel( + new Headers({ authorization: `Bearer caller-${i}` }), + DAYBREAK, + { fetcher: (async () => roster(DAYBREAK)) as typeof fetch, now: 1_000 }, + ); + } + + // With one shared 64-entry LRU this read came back empty. The main grant is a different + // eviction class and is still inside its TTL, so it must survive. + expect([...cachedAvailableAccountGatedNativeModels(1_000)]).toContain(DAYBREAK); + }); + + test("Direct-caller rosters do not evict main/Pool entitlement evidence", async () => { + // The catalog projects ONLY from main/Pool keys. Under a single shared LRU, a burst of + // distinct Direct callers pushed those out and the gated row vanished from the catalog + // until rediscovery — fail-closed flapping whose cause an operator cannot see. + seedCodexModelEntitlementsForTests("main", [DAYBREAK], 1_000); + expect([...cachedAvailableAccountGatedNativeModels(1_000)]).toContain(DAYBREAK); + + // Far more distinct Direct callers than the per-class cache bound of 64. + for (let i = 0; i < 80; i += 1) { + await isDirectCallerEntitledToCodexModel( + new Headers({ authorization: `Bearer caller-${i}` }), + DAYBREAK, + { fetcher: (async () => roster(DAYBREAK)) as typeof fetch, now: 1_000 }, + ); + } + + // With one shared 64-entry LRU this read came back empty. The main grant is a different + // eviction class and is still inside its TTL, so it must survive. + expect([...cachedAvailableAccountGatedNativeModels(1_000)]).toContain(DAYBREAK); + }); +}); diff --git a/tests/native-model-toggle.test.ts b/tests/native-model-toggle.test.ts index 08e0c4eb19..3dabda66c6 100644 --- a/tests/native-model-toggle.test.ts +++ b/tests/native-model-toggle.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, test } from "bun:test"; +import { afterEach, describe, expect, test } from "bun:test"; import { accountBoundNativeOpenAiSlugs, accountBoundNativeDisplayName, @@ -23,6 +23,13 @@ import { import { handleManagementAPI } from "../src/server/management-api"; import { applyMultiAgentMode, applyNativeOpenAiContextOverride } from "../src/codex/catalog/parsing"; import type { OcxConfig } from "../src/types"; +import { ACCOUNT_GATED_NATIVE_OPENAI_MODELS } from "../src/codex/catalog/native-models"; +import { + resetCodexModelEntitlementCacheForTests, + seedCodexModelEntitlementsForTests, +} from "../src/codex/model-entitlements"; + +afterEach(() => resetCodexModelEntitlementCacheForTests()); function makeConfig(overrides: Partial = {}): OcxConfig { return { port: 10100, providers: {}, defaultProvider: "openai", ...overrides } as OcxConfig; @@ -63,13 +70,32 @@ describe("native GPT model toggles (bare slugs in disabledModels)", () => { expect(filtered.length).toBe(all.length - 1); }); - test("nativeModelRows lists the full static supported set regardless of disabled state", () => { + test("nativeModelRows hides account-gated ids until an authenticated roster confirms them", () => { const rows = nativeModelRows({ disabledModels: ["gpt-5.6-sol"] }); - expect(rows.map(r => r.slug)).toEqual([...NATIVE_OPENAI_MODELS]); + expect(rows.map(r => r.slug)).toEqual( + NATIVE_OPENAI_MODELS.filter(slug => !ACCOUNT_GATED_NATIVE_OPENAI_MODELS.has(slug)), + ); expect(rows.find(r => r.slug === "gpt-5.6-sol")?.disabled).toBe(true); expect(rows.find(r => r.slug === "gpt-5.5")?.disabled).toBe(false); // Known context metadata rides along for the dashboard. expect(rows.find(r => r.slug === "gpt-5.6-sol")?.contextWindow).toBe(272_000); + + seedCodexModelEntitlementsForTests("main", ["gpt-daybreak-blue-latest"]); + expect(nativeModelRows({ disabledModels: [] }).map(row => row.slug)) + .toContain("gpt-daybreak-blue-latest"); + }); + + test("Direct bare rows use only main entitlement while Pool may use any eligible account", () => { + seedCodexModelEntitlementsForTests("pool-a", ["gpt-daybreak-blue-latest"]); + const direct = makeConfig({ + providers: { openai: { authMode: "forward", codexAccountMode: "direct" } }, + }); + const pool = makeConfig({ + providers: { openai: { authMode: "forward", codexAccountMode: "pool" } }, + }); + + expect(nativeModelRows(direct).map(row => row.slug)).not.toContain("gpt-daybreak-blue-latest"); + expect(nativeModelRows(pool).map(row => row.slug)).toContain("gpt-daybreak-blue-latest"); }); test("a per-model window sets the native row and never exceeds the measured ceiling", () => { @@ -276,7 +302,7 @@ describe("native GPT model toggles (bare slugs in disabledModels)", () => { expect(observedAccountBoundNativeOpenAiSlugs(observedEntries)).toEqual(["gpt-future-unlisted"]); }); - test("gpt-daybreak-blue-latest ships as a global native row without an observation", () => { + test("gpt-daybreak-blue-latest has one native capability template when selected for emission", () => { const entries = buildCatalogEntries( nativeTemplate(), [...NATIVE_OPENAI_MODELS], @@ -290,8 +316,8 @@ describe("native GPT model toggles (bare slugs in disabledModels)", () => { new Set(), ); const bare = entries.filter(entry => entry.slug === "gpt-daybreak-blue-latest"); - // Exactly one row: the slug sits in BOTH NATIVE_OPENAI_MODELS and - // NATIVE_OPENAI_CAPABILITY_ALIAS_MODELS, and that overlap must not duplicate it. + // Exactly one row: entitlement decides whether the caller passes this slug into the builder; + // once selected, its overlap with the capability-alias list must not duplicate it. expect(bare).toHaveLength(1); // Capability is inherited from gpt-5.6-sol, so it is a recursive-capable v2 delegate. expect(bare[0]?.multi_agent_version).toBe("v2"); @@ -590,7 +616,9 @@ describe("native GPT model toggles (bare slugs in disabledModels)", () => { ); const rows = await modelsRes!.json() as Array<{ namespaced: string; native?: boolean; disabled: boolean }>; const nativeRows = rows.filter(r => r.native); - expect(nativeRows.map(r => r.namespaced)).toEqual([...NATIVE_OPENAI_MODELS]); + expect(nativeRows.map(r => r.namespaced)).toEqual( + NATIVE_OPENAI_MODELS.filter(slug => !ACCOUNT_GATED_NATIVE_OPENAI_MODELS.has(slug)), + ); expect(nativeRows.find(r => r.namespaced === "gpt-5.6-sol")?.disabled).toBe(true); // Native rows lead the response so the GUI pins the group first. expect(rows[0]?.native).toBe(true); diff --git a/tests/server-auth.test.ts b/tests/server-auth.test.ts index dc3dfbe273..cf50d5250d 100644 --- a/tests/server-auth.test.ts +++ b/tests/server-auth.test.ts @@ -44,6 +44,7 @@ import { ownedServiceHomeInspection } from "./helpers/owned-service-home-inspect import { configuredAdminToken } from "../src/lib/admin-secrets"; import { SYSTEM_RESTART_CAPABILITY_VERSION } from "../src/lib/system-restart-contract"; import { LOCAL_PROVIDER_RELOAD_CAPABILITY_VERSION } from "../src/lib/local-provider-reload-contract"; +import { resetCodexModelEntitlementCacheForTests } from "../src/codex/model-entitlements"; import { watchdogMs } from "./helpers/ci-watchdog"; const previousApiToken = process.env.OPENCODEX_API_AUTH_TOKEN; @@ -141,6 +142,7 @@ afterEach(() => { clearAccountNeedsReauth("pool-a"); clearAccountNeedsReauth("pool-b"); clearAccountQuota(); + resetCodexModelEntitlementCacheForTests(); if (existsSync(TEST_DIR)) rmSync(TEST_DIR, { recursive: true }); }); @@ -161,6 +163,7 @@ type PoolRetryHarness = { model?: string; path?: "/v1/responses" | "/v1/responses/compact"; callerBearer?: boolean; + extraBody?: Record; }) => Promise; restoreFetch: () => void; server: ReturnType; @@ -200,6 +203,7 @@ async function startPoolRetryHarness( reauthAccountIds?: string[]; omitCredentialAccountIds?: string[]; combos?: OcxConfig["combos"]; + modelRosterByAccount?: Record; } = {}, ): Promise { await removeTestDirBestEffort(TEST_DIR); @@ -208,6 +212,7 @@ async function startPoolRetryHarness( clearCodexUpstreamHealth(); clearThreadAccountMap(); clearAccountQuota(); + resetCodexModelEntitlementCacheForTests(); clearRequestLogsForTests(); clearAccountNeedsReauth("pool-a"); clearAccountNeedsReauth("pool-b"); @@ -223,6 +228,15 @@ async function startPoolRetryHarness( port: 0, async fetch(request) { const accountId = request.headers.get("chatgpt-account-id") ?? "missing"; + if (new URL(request.url).pathname === "/models") { + return Response.json({ + models: (options.modelRosterByAccount?.[accountId] ?? []).map(slug => ({ + slug, + supported_in_api: true, + visibility: "list", + })), + }); + } dispatches.push(accountId); return reply(accountId, request); }, @@ -296,13 +310,14 @@ async function startPoolRetryHarness( model = POOL_RETRY_MODEL, path = "/v1/responses", callerBearer = true, + extraBody = {}, } = {}) => originalGlobalFetch(new URL(path, server.url), { method: "POST", headers: { "content-type": "application/json", ...(callerBearer ? { authorization: "Bearer inbound-token" } : {}), }, - body: JSON.stringify({ model, input: path.endsWith("/compact") ? [] : "hello", stream }), + body: JSON.stringify({ model, input: path.endsWith("/compact") ? [] : "hello", stream, ...extraBody }), signal, }), }; @@ -2108,6 +2123,188 @@ describe("server local API auth", () => { } }); + test("#2097: account-gated model selection skips an unentitled active Pool account", async () => { + const model = "gpt-daybreak-blue-latest"; + const harness = await startPoolRetryHarness( + accountId => Response.json({ id: accountId, status: "completed", output: [] }), + { + modelRosterByAccount: { + "acct-pool-a": ["gpt-5.6-sol"], + "acct-pool-b": ["gpt-5.6-sol", model], + }, + }, + ); + try { + const response = await harness.request({ model }); + expect(response.status).toBe(200); + expect((await response.json() as { id: string }).id).toBe("acct-pool-b"); + expect(harness.dispatches).toEqual(["acct-pool-b"]); + } finally { + await stopPoolRetryHarness(harness); + } + }); + + test("#2097: Daybreak keeps its entitlement identity but uses the stable wire model", async () => { + const model = "gpt-daybreak-blue-latest"; + let upstreamBody: Record | undefined; + const harness = await startPoolRetryHarness( + async (_accountId, request) => { + upstreamBody = await request.json() as Record; + return Response.json({ id: "canonical-wire-success", status: "completed", output: [] }); + }, + { + secondAccount: false, + modelRosterByAccount: { "acct-pool-a": ["gpt-5.6-sol", model] }, + }, + ); + try { + const response = await harness.request({ + model, + extraBody: { prompt_cache_retention: "24h" }, + }); + expect(response.status).toBe(200); + expect(upstreamBody?.model).toBe("gpt-5.6-sol"); + expect(upstreamBody).not.toHaveProperty("prompt_cache_retention"); + expect(harness.dispatches).toEqual(["acct-pool-a"]); + } finally { + await stopPoolRetryHarness(harness); + } + }); + + test("#2097: Daybreak compact uses the stable wire model without retention", async () => { + const model = "gpt-daybreak-blue-latest"; + let upstreamBody: Record | undefined; + let upstreamUrl = ""; + const harness = await startPoolRetryHarness( + async (_accountId, request) => { + upstreamUrl = request.url; + upstreamBody = await request.json() as Record; + return new Response([ + 'event: response.output_item.done', + 'data: {"type":"response.output_item.done","output_index":0,"item":{"type":"compaction","encrypted_content":"gAAAAAB-test-opaque"}}', + '', + 'event: response.completed', + 'data: {"type":"response.completed","response":{"status":"completed","output":[]}}', + '', + 'data: [DONE]', + '', + ].join("\n"), { + headers: { "content-type": "text/event-stream" }, + }); + }, + { + secondAccount: false, + modelRosterByAccount: { "acct-pool-a": ["gpt-5.6-sol", model] }, + }, + ); + try { + const response = await harness.request({ + model, + path: "/v1/responses/compact", + extraBody: { prompt_cache_retention: "24h" }, + }); + expect(response.status).toBe(200); + expect(await response.json()).toEqual({ + output: [{ type: "compaction", encrypted_content: "gAAAAAB-test-opaque" }], + }); + expect(upstreamUrl).toEndWith("/responses"); + expect(upstreamBody?.model).toBe("gpt-5.6-sol"); + expect(upstreamBody?.stream).toBe(true); + expect(upstreamBody).not.toHaveProperty("prompt_cache_retention"); + expect(harness.dispatches).toEqual(["acct-pool-a"]); + } finally { + await stopPoolRetryHarness(harness); + } + }); + + test("#2097: a confirmed entitled account survives two transient unsupported-model 400s in place", async () => { + const model = "gpt-daybreak-blue-latest"; + let attempts = 0; + const harness = await startPoolRetryHarness( + () => ++attempts <= 2 + ? rejectionResponse(unsupportedModelBody(model)) + : Response.json({ id: "same-account-success", status: "completed", output: [] }), + { + secondAccount: false, + modelRosterByAccount: { "acct-pool-a": ["gpt-5.6-sol", model] }, + }, + ); + try { + const response = await harness.request({ model }); + expect(response.status).toBe(200); + expect((await response.json() as { id: string }).id).toBe("same-account-success"); + expect(harness.dispatches).toEqual(["acct-pool-a", "acct-pool-a", "acct-pool-a"]); + } finally { + await stopPoolRetryHarness(harness); + } + }); + + test("#2097: an exact account-gated selector may retry only its confirmed account in place", async () => { + const model = "gpt-daybreak-blue-latest"; + let attempts = 0; + const harness = await startPoolRetryHarness( + () => ++attempts <= 2 + ? rejectionResponse(unsupportedModelBody(model)) + : Response.json({ id: "same-exact-account-success", status: "completed", output: [] }), + { + accountMode: "direct", + activeAccountId: "pool-b", + accountNamespaces: { side: "pool-a" }, + modelRosterByAccount: { "acct-pool-a": ["gpt-5.6-sol", model] }, + }, + ); + try { + const response = await harness.request({ model: `side/${model}`, callerBearer: false }); + expect(response.status).toBe(200); + expect((await response.json() as { id: string }).id).toBe("same-exact-account-success"); + expect(harness.dispatches).toEqual(["acct-pool-a", "acct-pool-a", "acct-pool-a"]); + expect(loadConfig().activeCodexAccountId).toBe("pool-b"); + } finally { + await stopPoolRetryHarness(harness); + } + }); + + test("#2097: repeated gated-model rejection remains bounded at eight total sends", async () => { + const model = "gpt-daybreak-blue-latest"; + const body = unsupportedModelBody(model); + const harness = await startPoolRetryHarness( + () => rejectionResponse(body), + { + secondAccount: false, + modelRosterByAccount: { "acct-pool-a": ["gpt-5.6-sol", model] }, + }, + ); + try { + const response = await harness.request({ model }); + expect(response.status).toBe(400); + expect(await response.text()).toBe(body); + expect(harness.dispatches).toEqual(Array(8).fill("acct-pool-a")); + } finally { + await stopPoolRetryHarness(harness); + } + }); + + test("#2097: an account-gated model with no confirmed grant fails before upstream dispatch", async () => { + const model = "gpt-daybreak-blue-latest"; + const harness = await startPoolRetryHarness( + () => Response.json({ id: "must-not-dispatch" }), + { + modelRosterByAccount: { + "acct-pool-a": ["gpt-5.6-sol"], + "acct-pool-b": ["gpt-5.6-sol"], + }, + }, + ); + try { + const response = await harness.request({ model }); + expect(response.status).toBe(401); + expect(await response.text()).toContain("No eligible Codex account supports this model"); + expect(harness.dispatches).toEqual([]); + } finally { + await stopPoolRetryHarness(harness); + } + }); + test.each([400, 402, 429])("exact account selector preserves the original %d without switching accounts", async status => { const body = status === 400 ? unsupportedModelBody() From 7cd270dc2cd4f5a4cb07b2f23b4eb0dfe869b0da Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 05:10:47 +0900 Subject: [PATCH 06/88] fix(xai): stream OAuth Grok through Responses OAuth xai/grok-4.5 and grok-4.6 Codex /v1/responses traffic still used the provider-wide openai-chat adapter, while the official Grok CLI catalog declares api_backend: "responses". Chat Completions compatibility holds the stream until the reasoning turn finishes, so Codex sat blank until the turn was effectively done. Declare the Responses wire default for those two models, scoped to OAuth and to responses-shaped inbound traffic. API-key xAI, Chat/Anthropic translation, other Grok models, and any explicit modelAdapters override all stay on Chat. Native Responses returns before the generic recovery loop, so the OAuth 401 replay never ran on this path. Add the equivalent one-shot: refresh once, rebuild the provider and adapter, replay once. It is a single branch rather than a loop, so a second 401 cannot refresh again. Refresh failures go through the existing public OAuth error projector, which the tests pin against path canaries. Carries @olddonkey's #2104 unchanged. Closes #1886 --- src/providers/fastwire.ts | 47 +++- src/providers/registry.ts | 36 ++- src/providers/service-tier.ts | 24 +- src/server/responses/core.ts | 92 ++++++++ structure/04_transports-and-sidecars.md | 24 +- tests/adapter-resolve.test.ts | 32 +++ tests/fastwire-policy.test.ts | 42 ++++ tests/server-xai-oauth-401-replay.test.ts | 28 ++- tests/server-xai-responses-streaming.test.ts | 223 +++++++++++++++++++ 9 files changed, 515 insertions(+), 33 deletions(-) create mode 100644 tests/server-xai-responses-streaming.test.ts diff --git a/src/providers/fastwire.ts b/src/providers/fastwire.ts index d36a9cf19f..1972c4339f 100644 --- a/src/providers/fastwire.ts +++ b/src/providers/fastwire.ts @@ -7,7 +7,7 @@ import type { } from "../types"; import { MODEL_ADAPTER_OVERRIDE_ALLOWED } from "../types"; import { sanitizeLogMetadataString } from "../lib/redact"; -import type { InboundWire, ModelWireDefault } from "./registry"; +import type { InboundWire, ModelWireDefault, ProviderAuthKind } from "./registry"; const SERVICE_TIER_ADAPTERS = new Set(["openai-chat", "openai-responses"]); const FAST_WIRE_ADAPTERS: Readonly>> = { @@ -31,6 +31,7 @@ export type FastPolicyAuthTransport = export interface FastPolicyAuthority { readonly providerAdapter: string; + readonly providerAuthMode?: ProviderAuthKind; readonly fastWireDeclaration: FastWire | null | undefined; readonly modelWireOverrideAllowed: boolean; readonly authTransport: FastPolicyAuthTransport; @@ -114,21 +115,33 @@ function registryDefaultForModel( defaults: Readonly>, modelId: string, inbound: InboundWire, -): string | undefined { + authMode: ProviderAuthKind | undefined, +): { adapter: string; forwardCallerServiceTier?: boolean } | undefined { const normalizedModelId = modelId.trim().toLowerCase(); if (!Object.hasOwn(defaults, normalizedModelId)) return undefined; const declared = defaults[normalizedModelId]; if (declared === undefined) return undefined; - if (typeof declared !== "string" && !declared.inbound.includes(inbound)) return undefined; + if (typeof declared !== "string") { + if (!declared.inbound.includes(inbound)) return undefined; + if (declared.authModes && (authMode === undefined || !declared.authModes.includes(authMode))) { + return undefined; + } + } const wire = typeof declared === "string" ? declared : declared.wire; - return MODEL_ADAPTER_OVERRIDE_ALLOWED.has(wire) ? wire : undefined; + if (!MODEL_ADAPTER_OVERRIDE_ALLOWED.has(wire)) return undefined; + return { + adapter: wire, + ...(typeof declared !== "string" && declared.forwardCallerServiceTier !== undefined + ? { forwardCallerServiceTier: declared.forwardCallerServiceTier } + : {}), + }; } function resolvePolicyAdapter( authority: FastPolicyAuthority, modelId: string, inbound: InboundWire, -): { adapter: string; hardPinned: boolean } { +): { adapter: string; hardPinned: boolean; forwardCallerServiceTier?: boolean } { // Hard pins and configured overrides deliberately use the same exact-key semantics as // resolveWireProtocolOverride(). Registry defaults alone normalize ids at their boundary. const hardPin = Object.hasOwn(authority.hardPins, modelId) @@ -143,8 +156,21 @@ function resolvePolicyAdapter( return { adapter: configured, hardPinned: false }; } if (MODEL_ADAPTER_OVERRIDE_ALLOWED.has(authority.providerAdapter)) { - const registryDefault = registryDefaultForModel(authority.registryWireDefaults, modelId, inbound); - if (registryDefault !== undefined) return { adapter: registryDefault, hardPinned: false }; + const registryDefault = registryDefaultForModel( + authority.registryWireDefaults, + modelId, + inbound, + authority.providerAuthMode, + ); + if (registryDefault !== undefined) { + return { + adapter: registryDefault.adapter, + hardPinned: false, + ...(registryDefault.forwardCallerServiceTier !== undefined + ? { forwardCallerServiceTier: registryDefault.forwardCallerServiceTier } + : {}), + }; + } } } return { adapter: authority.providerAdapter, hardPinned: false }; @@ -155,7 +181,11 @@ export function resolveFastPolicy( modelId: string, inbound: InboundWire = "responses", ): ResolvedFastPolicy { - const { adapter, hardPinned } = resolvePolicyAdapter(authority, modelId, inbound); + const { adapter, hardPinned, forwardCallerServiceTier } = resolvePolicyAdapter( + authority, + modelId, + inbound, + ); const exactCapability = exactModelValue(authority.capability.models, modelId); const capability = authority.capability.provider === false ? false @@ -173,6 +203,7 @@ export function resolveFastPolicy( // tier still needs the final wire's forwarding permission. const forwardCallerTier = capability !== false && callerWireAvailable + && forwardCallerServiceTier !== false && (adapter !== "openai-chat" || authority.capability.chatServiceTier === true); let eligibility: ResolvedFastPolicy["eligibility"]; diff --git a/src/providers/registry.ts b/src/providers/registry.ts index 53922e75ad..3fd6ac7dd8 100644 --- a/src/providers/registry.ts +++ b/src/providers/registry.ts @@ -31,9 +31,15 @@ export type InboundWire = "responses" | "chat" | "anthropic"; /** * A per-model wire default: a bare string applies to every inbound, while the object - * form applies only to the listed inbound protocols. + * form may scope the default to listed inbound protocols and authentication modes. */ -export type ModelWireDefault = string | { wire: string; inbound: readonly InboundWire[] }; +export type ModelWireDefault = string | { + wire: string; + inbound: readonly InboundWire[]; + authModes?: readonly ProviderAuthKind[]; + /** Whether this registry-selected route may relay a caller-owned service_tier. */ + forwardCallerServiceTier?: boolean; +}; export interface ResponsesTerminalRepairPolicy { /** Quiet time after a structurally complete output graph before synthesizing completion. */ @@ -1017,6 +1023,24 @@ export const PROVIDER_REGISTRY: readonly ProviderRegistryEntry[] = [ // grok-4.5; the reasoning ladder does not — 4.6 adds the documented xhigh rung. models: ["grok-4.6", "grok-4.5", "grok-4.3", "grok-4.20-0309-reasoning", "grok-4.20-0309-non-reasoning", "grok-build-0.1", "grok-composer-2.5-fast"], defaultModel: "grok-4.5", + // The current Grok CLI catalog declares both subscription models as native Responses + // backends. Keep API-key and translated Chat/Anthropic callers on their existing wire; + // Codex Responses traffic can relay xAI's SSE as it arrives instead of waiting for the + // Chat Completions compatibility stream to flush at the end of a reasoning turn. + modelWireDefaults: { + "grok-4.6": { + wire: "openai-responses", + inbound: ["responses"], + authModes: ["oauth"], + forwardCallerServiceTier: false, + }, + "grok-4.5": { + wire: "openai-responses", + inbound: ["responses"], + authModes: ["oauth"], + forwardCallerServiceTier: false, + }, + }, // Vision lineup per docs.x.ai model-capabilities/images/understanding: the grok-4.x chat // models accept image input (JPEG/PNG, URL or base64). Without this the catalog leaves // inputModalities undefined, and deriveComboCatalogModel defaults an undefined member to @@ -2679,8 +2703,12 @@ export function providerModelWireDefault( if (!entry?.modelWireDefaults || !providerMatchesRegistryTransport(id, provider)) return undefined; const declared = entry.modelWireDefaults[modelId.trim().toLowerCase()]; if (declared === undefined) return undefined; - // A bare string applies to every inbound; the object form only to the listed ones. - if (typeof declared !== "string" && !declared.inbound.includes(inbound)) return undefined; + // A bare string applies to every inbound/auth mode; the object form may narrow either. + if (typeof declared !== "string") { + if (!declared.inbound.includes(inbound)) return undefined; + const authMode = provider.authMode ?? entry.authKind; + if (declared.authModes && !declared.authModes.includes(authMode)) return undefined; + } const wire = typeof declared === "string" ? declared : declared.wire; return wire !== undefined && allowedWires.has(wire) ? wire : undefined; } diff --git a/src/providers/service-tier.ts b/src/providers/service-tier.ts index 278f89394e..2a09530d23 100644 --- a/src/providers/service-tier.ts +++ b/src/providers/service-tier.ts @@ -45,7 +45,16 @@ function cloneRegistryWireDefaults( for (const [modelId, declaration] of Object.entries(defaults)) { clone[modelId.trim().toLowerCase()] = typeof declaration === "string" ? declaration - : Object.freeze({ wire: declaration.wire, inbound: Object.freeze([...declaration.inbound]) }); + : Object.freeze({ + wire: declaration.wire, + inbound: Object.freeze([...declaration.inbound]), + ...(declaration.authModes + ? { authModes: Object.freeze([...declaration.authModes]) } + : {}), + ...(declaration.forwardCallerServiceTier !== undefined + ? { forwardCallerServiceTier: declaration.forwardCallerServiceTier } + : {}), + }); } return Object.freeze(clone); } @@ -68,6 +77,7 @@ function buildFastPolicyAuthority( const providerCapability = capabilityProvider.supportsServiceTier ?? registry?.supportsServiceTier; const authority: FastPolicyAuthority = Object.freeze({ providerAdapter: provider.adapter, + providerAuthMode: provider.authMode ?? registry?.authKind ?? "key", fastWireDeclaration: cloneFastWire( provider.fastWire !== undefined ? provider.fastWire : registry?.fastWire, { freeze: true }, @@ -241,13 +251,11 @@ export function serviceTierSupportFromPolicy( ): boolean | undefined { if (policy.eligibility === "eligible") return true; if (policy.eligibility === "unclassified") { - // B1 regression guard: an unclassified chat-wire route whose final adapter will not - // forward any tier cannot serialize service_tier, so projecting "unknown" would let - // require.serviceTier: "unsupported" routing stop matching groq/ollama-class providers - // that main projected as false. Chat + no forwarding stays a definitive false; a - // chat route with chatServiceTier: true (forwarding allowed) keeps the historical - // unknown, as does every unclassified Responses-wire route. - if (policy.adapter === "openai-chat" && !policy.forwardCallerTier) return false; + // An unclassified route that cannot forward a caller tier has definitive negative + // evidence even when its adapter can normally serialize service_tier. This covers both + // Chat routes without chatServiceTier and a registry default that explicitly closes a + // subscription gateway. Generic unclassified Responses routes still project unknown. + if (!policy.forwardCallerTier) return false; return undefined; } return false; diff --git a/src/server/responses/core.ts b/src/server/responses/core.ts index 9e2813d0b5..d503a08c32 100644 --- a/src/server/responses/core.ts +++ b/src/server/responses/core.ts @@ -2622,6 +2622,98 @@ async function handleResponsesInner( request.releaseBodyObservation?.(); } + // Native Responses providers return before the generic adapter recovery loop below. Keep + // their OAuth contract identical: one pre-stream 401 forces a credential refresh and one + // rebuilt replay. xAI's current subscription models use this branch now that their official + // Grok CLI catalog declares the Responses backend. + if (upstreamResponse.status === 401 && isOAuth401ReplayProvider && sentOAuthSnapshot) { + try { void upstreamResponse.body?.cancel().catch(() => {}); } catch { /* already consumed/closed */ } + let refreshed: OAuthAccessSnapshot; + try { + refreshed = await forceRefreshOAuthAccessSnapshot(sentOAuthSnapshot); + } catch (err) { + upstream.abort(); + releaseCodexAuthContextProbeLease(authCtx); + return formatErrorResponse(401, "authentication_error", publicOAuthAuthenticationErrorMessage(err)); + } + sentOAuthSnapshot = refreshed; + replayOAuthCredentialSnapshot = { + accountId: refreshed.accountId, + generation: refreshed.generation, + }; + if (route.providerName === "kiro") { + parsed._kiroAuthContext = { ...(refreshed.kiro ?? {}) }; + } + const refreshedProvider = resolveProviderTransport( + route.providerName, + { ...route.provider, apiKey: refreshed.accessToken }, + parsed.options.promptCacheKey, + route.providerName === "github-copilot" ? getOAuthCredentialApiBaseUrl(route.providerName) : undefined, + ); + route.provider = refreshedProvider; + const refreshedAdapter = resolveAdapter( + resolveWireProtocolOverride(route.providerName, route.modelId, refreshedProvider, inboundWire), + config.cacheRetention, + ); + if (!("passthrough" in refreshedAdapter) || !refreshedAdapter.passthrough) { + upstream.abort(); + return formatErrorResponse(502, "upstream_error", "OAuth refresh changed the provider wire unexpectedly"); + } + bindRouteReasoningReplayScope({ + parsed, + providerName: route.providerName, + provider: refreshedProvider, + adapterName: refreshedAdapter.name, + oauthCredentialSnapshot: replayOAuthCredentialSnapshot, + }); + logCtx.providerAdapter = refreshedAdapter.name; + sealRequestAttemptIdentity( + logCtx.activeAttempt, + logCtx.provider, + refreshedAdapter.name, + logCtx.accountLogLabel, + ); + try { + request = await refreshedAdapter.buildRequest(parsed, { + headers: selectedForwardHeaders, + translatorBudget, + }); + recordAdapterReasoning(logCtx, request); + recordAdapterTier(logCtx, request); + } catch (err) { + upstream.abort(); + if (options.abortSignal?.aborted) return clientCancelledResponse(); + const msg = err instanceof Error ? err.message : String(err); + return formatErrorResponse(400, "invalid_request_error", redactSecretString(msg)); + } + try { + upstreamResponse = await fetchWithTransientRetry( + recovery => { + noteAttemptSend(logCtx.activeAttempt, passthroughEstimate, recovery ?? "oauth-401"); + return fetchWithHeaderTimeout(request.url, applyUpstreamRecoveryInit({ + method: request.method, + headers: request.headers, + body: request.body, + }, recovery), upstream.signal, connectMs, parsed.stream, + providerFetch(route.provider, options.codexWsRuntimeIdentity, { + providerName: route.providerName, + modelId: route.modelId, + }), + route.provider.authMode === "forward") + .then(res => { + settleObservedHostResponse(); + return res; + }); + }, + { abortSignal: upstream.signal, label: safeHostLabel(request.url) }, + ); + } catch (err) { + return transportFailureResponse(err); + } finally { + request.releaseBodyObservation?.(); + } + } + // Same-target 429 wait-and-retry (opt-in `retryOn429`) for key-auth providers on the // passthrough wire. This branch returns before the recovery loop below, so Responses-shaped // key-auth gateways (e.g. the built-in DeepSeek preset) would otherwise surface 429 diff --git a/structure/04_transports-and-sidecars.md b/structure/04_transports-and-sidecars.md index bdb0d15e0c..fbca919cde 100644 --- a/structure/04_transports-and-sidecars.md +++ b/structure/04_transports-and-sidecars.md @@ -51,7 +51,9 @@ requires a compatible FastWire mapping on the final adapter and an eligible poli `fastMode: false` drops it. On classified Chat routes, `chatServiceTier` separately authorizes foreign caller values; an exact-model `true` does not grant that forwarding permission. On unclassified Chat routes it gates every caller tier because no canonical Fast capability has been -validated. Exact `false` +validated. An object-form registry wire default may also set `forwardCallerServiceTier: false` to +close a known subscription gateway while leaving generic unclassified Responses passthrough +unchanged. Exact `false` narrows provider defaults, and provider-level `supportsServiceTier: false` cannot be reopened. Capability is namespaced by the selected provider and model; model-name similarity and adapter type alone never opt a gateway in. @@ -66,7 +68,18 @@ Registry `modelWireDefaults` select an evidence-backed upstream protocol for an changing the provider-wide adapter. Explicit, allowed `modelAdapters` configuration always wins, including an entry that opts the model back into the provider-wide wire. Defaults are applied only while the configured provider still matches the registry transport, so reusing a preset name for a -different custom destination does not inherit its upstream assumptions. +different custom destination does not inherit its upstream assumptions. Object-form defaults may +also narrow the decision by inbound protocol and authentication mode; an auth-scoped default must +not leak from a subscription transport into an API-key or forwarded-credential route. + +xAI keeps `openai-chat` as its provider-wide compatibility wire. The official Grok CLI catalog +declares the Grok 4.5 and 4.6 subscription models as Responses backends, so only OAuth-backed native +Responses traffic for those exact models selects `openai-responses`. API-key requests, translated +Chat/Anthropic callers, other Grok models, and explicit model adapter overrides retain their +existing wire. This lets Codex receive native xAI SSE deltas as they arrive without widening the +credential or compatibility boundary. These OAuth subscription defaults drop caller-owned +`service_tier`; they neither advertise nor inject Fast. The API-key transport remains governed by +its separate capability declaration. OpenCode Go documents `gpt-5.6-luna` on `/zen/go/v1/responses` while sibling models use its Chat or Anthropic endpoints. The built-in preset therefore selects `openai-responses` only for Luna and @@ -601,9 +614,10 @@ Grounded in the open-sourced official client (xai-org/grok-build); unit + eviden `auth.json` load-merge-persist (`src/oauth/store.ts`); generation-guarded persist (`expectedGeneration` → superseded adoption), conditional `needsReauth`, bounded jittered retry for transient token-endpoint failures. -- **Reactive 401 replay:** the serving recovery loop force-refreshes once (singleflight, - generation-checked) and replays OAuth-backed xAI requests exactly once with a re-resolved - transport; API-key/BYOK paths excluded (`src/server/responses.ts`). +- **Reactive 401 replay:** both the adapter recovery loop and native Responses passthrough branch + force-refresh once (singleflight, generation-checked) and replay OAuth-backed xAI requests + exactly once with a re-resolved transport; API-key/BYOK paths are excluded + (`src/server/responses/core.ts`). - **Header parity:** per-attempt `x-grok-req-id` (fresh UUID inside the transport fetch wrapper), stable session/conv affinity headers, always-set User-Agent, and a single compatibility profile const for the Grok client version (`src/providers/xai-transport.ts`); diff --git a/tests/adapter-resolve.test.ts b/tests/adapter-resolve.test.ts index 28b07091b5..ceffd92149 100644 --- a/tests/adapter-resolve.test.ts +++ b/tests/adapter-resolve.test.ts @@ -92,6 +92,38 @@ describe("per-model wire override (#404)", () => { }); describe("registry per-model wire defaults", () => { + function xai(authMode: "oauth" | "key", overrides: Partial = {}): OcxProviderConfig { + return gateway({ + baseUrl: "https://api.x.ai/v1", + authMode, + ...overrides, + }); + } + + test("routes current xAI subscription models through Responses for native Codex traffic", () => { + for (const model of ["grok-4.6", "grok-4.5"]) { + expect(resolveWireProtocolOverride("xai", model, xai("oauth"), "responses").adapter) + .toBe("openai-responses"); + } + }); + + test("keeps xAI key auth and translated callers on their existing Chat wire", () => { + expect(resolveWireProtocolOverride("xai", "grok-4.6", xai("key"), "responses").adapter) + .toBe("openai-chat"); + expect(resolveWireProtocolOverride("xai", "grok-4.6", xai("oauth"), "chat").adapter) + .toBe("openai-chat"); + expect(resolveWireProtocolOverride("xai", "grok-4.6", xai("oauth"), "anthropic").adapter) + .toBe("openai-chat"); + expect(resolveWireProtocolOverride("xai", "grok-4.3", xai("oauth"), "responses").adapter) + .toBe("openai-chat"); + }); + + test("an explicit xAI Chat override opts out of the subscription Responses default", () => { + const provider = xai("oauth", { modelAdapters: { "grok-4.6": "openai-chat" } }); + expect(resolveWireProtocolOverride("xai", "grok-4.6", provider, "responses").adapter) + .toBe("openai-chat"); + }); + function deepseek(overrides: Partial = {}): OcxProviderConfig { return gateway({ baseUrl: "https://api.deepseek.com", diff --git a/tests/fastwire-policy.test.ts b/tests/fastwire-policy.test.ts index 7aed643290..6cd7529a94 100644 --- a/tests/fastwire-policy.test.ts +++ b/tests/fastwire-policy.test.ts @@ -128,6 +128,27 @@ describe("resolveFastPolicy matrix", () => { expect(resolveFastPolicy(authority, MODEL, "responses").adapter).toBe("openai-responses"); }); + test("registry defaults retain their auth-mode constraint", () => { + const base: FastPolicyAuthority = { + ...authorityForMatrix({ + source: "provider-adapter", + declaration: "undefined", + overrideAllowed: true, + capability: "true", + chatForeignTierForward: true, + }), + providerAdapter: "openai-chat", + registryWireDefaults: { + [MODEL]: { wire: "openai-responses", inbound: ["responses"], authModes: ["oauth"] }, + }, + }; + expect(resolveFastPolicy({ ...base, providerAuthMode: "oauth" }, MODEL).adapter) + .toBe("openai-responses"); + expect(resolveFastPolicy({ ...base, providerAuthMode: "key" }, MODEL).adapter) + .toBe("openai-chat"); + expect(resolveFastPolicy(base, MODEL).adapter).toBe("openai-chat"); + }); + test("hard pins and configured overrides retain exact runtime model-key semantics", () => { const authority: FastPolicyAuthority = { ...authorityForMatrix({ @@ -235,6 +256,27 @@ describe("resolveFastPolicy matrix", () => { expect(fastPolicyForModel(provider, MODEL, "fixture").capability).toBe(false); }); + test("captured xAI registry defaults keep OAuth and key transports separate", () => { + const oauthProvider = Object.freeze({ + adapter: "openai-chat", + baseUrl: "https://api.x.ai/v1", + authMode: "oauth" as const, + }); + const keyProvider = Object.freeze({ + adapter: "openai-chat", + baseUrl: "https://api.x.ai/v1", + authMode: "key" as const, + }); + + expect(fastPolicyForModel(oauthProvider, "grok-4.6", "xai")).toMatchObject({ + adapter: "openai-responses", + eligibility: "unclassified", + forwardCallerTier: false, + }); + expect(fastPolicyForModel(keyProvider, "grok-4.6", "xai").adapter) + .toBe("openai-chat"); + }); + test("prototype-named providers and models use only own wire-policy rows", () => { expect(captureWireAdapterHardPins("toString")).toEqual({}); expect(isWirePinnedModel("toString", MODEL)).toBe(false); diff --git a/tests/server-xai-oauth-401-replay.test.ts b/tests/server-xai-oauth-401-replay.test.ts index 0d3e03d0a3..abe2e62673 100644 --- a/tests/server-xai-oauth-401-replay.test.ts +++ b/tests/server-xai-oauth-401-replay.test.ts @@ -11,7 +11,7 @@ import type { OcxConfig } from "../src/types"; import { installIsolatedCodexHome, type IsolatedCodexHome } from "./helpers/isolated-codex-home"; const TOKEN_ENDPOINT = "https://auth.x.ai/oauth/token"; -const CHAT_ENDPOINT = `${XAI_GROK_CLI_BASE_URL}/chat/completions`; +const OAUTH_RESPONSES_ENDPOINT = `${XAI_GROK_CLI_BASE_URL}/responses`; const PUBLIC_OAUTH_AUTHENTICATION_ERROR = "OAuth authentication failed. Check the OpenCodex account status and retry."; const WINDOWS_PATH_CANARY = "C:\\Users\\Alice\\.opencodex\\auth.json.ocx-tmp"; const UNC_PATH_CANARY = "\\\\server\\share\\opencodex\\auth.json.ocx-tmp"; @@ -68,10 +68,18 @@ function xaiConfig(authMode: "oauth" | "key" = "oauth"): OcxConfig { function successBody(text: string): string { return JSON.stringify({ - id: "chatcmpl-xai-401", - object: "chat.completion", - choices: [{ index: 0, message: { role: "assistant", content: text }, finish_reason: "stop" }], - usage: { prompt_tokens: 3, completion_tokens: 2, total_tokens: 5 }, + id: "resp-xai-401", + object: "response", + status: "completed", + model: "grok-4.5", + output: [{ + id: "msg-xai-401", + type: "message", + status: "completed", + role: "assistant", + content: [{ type: "output_text", text, annotations: [] }], + }], + usage: { input_tokens: 3, output_tokens: 2, total_tokens: 5 }, }); } @@ -114,7 +122,11 @@ function installOAuthFetch( expires_in: 3600, }), { headers: { "content-type": "application/json" } }); } - if (url === CHAT_ENDPOINT) { + if (url === OAUTH_RESPONSES_ENDPOINT) { + const body = JSON.parse(String(init?.body)) as Record; + expect(body.model).toBe("grok-4.5"); + expect(body.input).toBe("hello"); + expect(body.messages).toBeUndefined(); chatAuth.push(new Headers(init?.headers).get("authorization") ?? ""); const status = chatStatuses.shift() ?? 200; if (status === 401) { @@ -209,7 +221,7 @@ describe("xAI OAuth upstream 401 replay", () => { const response = await post(server); const json = await response.json() as { error?: { message?: string } }; expect(response.status).toBe(401); - expect(json.error?.message).toContain("Provider error 401"); + expect(json.error?.message).toBe("rejected"); expect(observed.counts.refresh).toBe(1); expect(observed.chatAuth).toEqual(["Bearer rejected-access", "Bearer fresh-access"]); } finally { @@ -277,7 +289,7 @@ describe("xAI OAuth upstream 401 replay", () => { expires_in: 3600, }), { headers: { "content-type": "application/json" } }); } - if (url === CHAT_ENDPOINT) { + if (url === OAUTH_RESPONSES_ENDPOINT) { const bearer = new Headers(init?.headers).get("authorization") ?? ""; attemptsByBearer.set(bearer, (attemptsByBearer.get(bearer) ?? 0) + 1); if (bearer === "Bearer rejected-access") { diff --git a/tests/server-xai-responses-streaming.test.ts b/tests/server-xai-responses-streaming.test.ts new file mode 100644 index 0000000000..7195436a60 --- /dev/null +++ b/tests/server-xai-responses-streaming.test.ts @@ -0,0 +1,223 @@ +import { afterEach, beforeEach, describe, expect, test } from "bun:test"; +import { mkdtempSync, rmSync } from "node:fs"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import { saveConfig } from "../src/config"; +import { saveCredential } from "../src/oauth/store"; +import { + XAI_GROK_CLI_BASE_URL, + XAI_GROK_CLIENT_VERSION, +} from "../src/providers/xai-transport"; +import { startServer } from "../src/server"; +import type { OcxConfig } from "../src/types"; +import { installIsolatedCodexHome, type IsolatedCodexHome } from "./helpers/isolated-codex-home"; + +const RESPONSES_ENDPOINT = `${XAI_GROK_CLI_BASE_URL}/responses`; +const encoder = new TextEncoder(); + +let testDir = ""; +let previousHome: string | undefined; +let isolatedCodexHome: IsolatedCodexHome | null = null; +let originalFetch: typeof fetch; + +beforeEach(async () => { + originalFetch = globalThis.fetch; + previousHome = process.env.OPENCODEX_HOME; + isolatedCodexHome = installIsolatedCodexHome("ocx-xai-responses-codex-"); + testDir = mkdtempSync(join(tmpdir(), "ocx-xai-responses-")); + process.env.OPENCODEX_HOME = testDir; + await saveCredential("xai", { + access: "stream-access", + refresh: "stream-refresh", + expires: Date.now() + 3_600_000, + accountId: "xai-stream-account", + source: "oauth", + }); +}); + +afterEach(() => { + globalThis.fetch = originalFetch; + if (previousHome === undefined) delete process.env.OPENCODEX_HOME; + else process.env.OPENCODEX_HOME = previousHome; + isolatedCodexHome?.restore(); + isolatedCodexHome = null; + if (testDir) rmSync(testDir, { recursive: true, force: true }); +}); + +function config(): OcxConfig { + return { + port: 0, + hostname: "127.0.0.1", + defaultProvider: "xai", + fastMode: true, + providers: { + xai: { + adapter: "openai-chat", + baseUrl: "https://api.x.ai/v1", + authMode: "oauth", + models: ["grok-4.6"], + }, + }, + } as OcxConfig; +} + +function sse(payload: unknown): Uint8Array { + return encoder.encode(`data: ${JSON.stringify(payload)}\n\n`); +} + +describe("xAI OAuth Responses streaming", () => { + test("uses the native Responses wire and relays the first delta before completion", async () => { + let releaseCompletion!: () => void; + const completionGate = new Promise(resolve => { releaseCompletion = resolve; }); + let completionReleased = false; + let outboundBody: Record | undefined; + let outboundHeaders: Headers | undefined; + let upstreamCalls = 0; + + globalThis.fetch = (async (input, init) => { + const url = input instanceof Request ? input.url : String(input); + if (url !== RESPONSES_ENDPOINT) return originalFetch(input, init); + upstreamCalls += 1; + outboundHeaders = new Headers(init?.headers); + outboundBody = JSON.parse(String(init?.body)) as Record; + + const body = new ReadableStream({ + start(controller) { + controller.enqueue(sse({ + type: "response.created", + sequence_number: 0, + response: { + id: "resp_xai_stream", + object: "response", + status: "in_progress", + model: "grok-4.6", + output: [], + }, + })); + controller.enqueue(sse({ + type: "response.output_item.added", + sequence_number: 1, + output_index: 0, + item: { id: "msg_xai_stream", type: "message", status: "in_progress", role: "assistant", content: [] }, + })); + controller.enqueue(sse({ + type: "response.content_part.added", + sequence_number: 2, + item_id: "msg_xai_stream", + output_index: 0, + content_index: 0, + part: { type: "output_text", text: "", annotations: [] }, + })); + controller.enqueue(sse({ + type: "response.output_text.delta", + sequence_number: 3, + item_id: "msg_xai_stream", + output_index: 0, + content_index: 0, + delta: "first", + })); + void completionGate.then(() => { + completionReleased = true; + const message = { + id: "msg_xai_stream", + type: "message", + status: "completed", + role: "assistant", + content: [{ type: "output_text", text: "first second", annotations: [] }], + }; + controller.enqueue(sse({ + type: "response.output_text.delta", + sequence_number: 4, + item_id: "msg_xai_stream", + output_index: 0, + content_index: 0, + delta: " second", + })); + controller.enqueue(sse({ + type: "response.output_item.done", + sequence_number: 5, + output_index: 0, + item: message, + })); + controller.enqueue(sse({ + type: "response.completed", + sequence_number: 6, + response: { + id: "resp_xai_stream", + object: "response", + status: "completed", + model: "grok-4.6", + output: [message], + usage: { input_tokens: 1, output_tokens: 2, total_tokens: 3 }, + }, + })); + controller.close(); + }); + }, + }); + return new Response(body, { headers: { "content-type": "text/event-stream" } }); + }) as typeof fetch; + + saveConfig(config()); + const server = startServer(0); + let reader: ReadableStreamDefaultReader | undefined; + try { + const response = await originalFetch(new URL("/v1/responses", server.url), { + method: "POST", + headers: { "content-type": "application/json" }, + body: JSON.stringify({ + model: "xai/grok-4.6", + input: "hello", + stream: true, + store: false, + service_tier: "priority", + reasoning: { effort: "xhigh", summary: "auto" }, + }), + }); + expect(response.status).toBe(200); + reader = response.body!.getReader(); + const decoder = new TextDecoder(); + let received = ""; + await Promise.race([ + (async () => { + while (!received.includes("response.output_text.delta")) { + const chunk = await reader!.read(); + if (chunk.done) throw new Error("stream ended before the first xAI delta"); + received += decoder.decode(chunk.value, { stream: true }); + } + })(), + new Promise((_, reject) => setTimeout( + () => reject(new Error("the first xAI delta was not relayed before completion")), + 1_500, + )), + ]); + + expect(received).toContain("first"); + expect(completionReleased).toBe(false); + expect(upstreamCalls).toBe(1); + expect(outboundBody?.model).toBe("grok-4.6"); + expect(outboundBody?.input).toBe("hello"); + expect(outboundBody?.stream).toBe(true); + expect(outboundBody?.service_tier).toBeUndefined(); + expect(outboundBody?.reasoning).toMatchObject({ effort: "xhigh" }); + expect(outboundBody?.messages).toBeUndefined(); + expect(outboundBody?.reasoning_effort).toBeUndefined(); + expect(outboundHeaders?.get("authorization")).toBe("Bearer stream-access"); + expect(outboundHeaders?.get("x-grok-client-identifier")).toBe("opencodex"); + expect(outboundHeaders?.get("x-grok-client-version")).toBe(XAI_GROK_CLIENT_VERSION); + + releaseCompletion(); + while (true) { + const chunk = await reader.read(); + if (chunk.done) break; + received += decoder.decode(chunk.value, { stream: true }); + } + expect(received).toContain("response.completed"); + expect(received).toContain(" second"); + } finally { + releaseCompletion(); + await reader?.cancel().catch(() => {}); + await server.stop(true); + } + }, 10_000); +}); From 5df624b07d9563cb28caa43379bb5076c2a82e7d Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 02:04:03 +0900 Subject: [PATCH 07/88] fix(subagents): keep a saved roster slot listed when its model is disabled GET /api/subagent-models built `available` purely from currently-pickable models, so a featured model disabled elsewhere vanished from it. The dashboard filters `chosen` against `available` and then PUTs exactly the rows it holds, which turned a hide into a delete: the next Save wrote the truncated roster to config.json, and the user read it as "ocx service lost my subagent models". Retain a chosen id in `available` when it is not otherwise selectable, appended after the selectable set and deduplicated. Models that are disabled and NOT in the roster stay excluded, so the picker behavior is unchanged for every model the user has not deliberately featured. The combo test asserted the old truncating behavior; it now asserts retention while a roster slot is held, and full exclusion once the slot is released. Closes #2133 --- .../management/agent-settings-routes.ts | 18 ++++- tests/combo-management-api.test.ts | 16 +++- tests/subagent-roster-retention.test.ts | 74 +++++++++++++++++++ 3 files changed, 104 insertions(+), 4 deletions(-) create mode 100644 tests/subagent-roster-retention.test.ts diff --git a/src/server/management/agent-settings-routes.ts b/src/server/management/agent-settings-routes.ts index 4b3e7a1715..9703ca90ef 100644 --- a/src/server/management/agent-settings-routes.ts +++ b/src/server/management/agent-settings-routes.ts @@ -613,15 +613,29 @@ export async function handleAgentSettingsRoutes(ctx: ManagementContext): Promise stored === catalogModelSlug(m) || slugEquals(stored, m.provider, m.id) )) .map(catalogModelSlug))]; - const available = [ + const chosen = config.subagentModels ?? []; + const selectable = [ ...listCatalogNativeSlugs().filter(ns => !disabled.has(ns)), ...visibleRouted, ]; + // A saved roster slot must stay representable even after its model is disabled + // elsewhere (Models page, provider allowlist, a provider row going away). The + // dashboard treats `available` as the set of rows it can render, so a chosen id + // missing from it disappears from the roster UI and the next Save — which PUTs + // exactly what the UI holds — silently truncates the persisted list. Losing a + // deliberate 5-model roster to an unrelated visibility toggle is data loss, not a + // filter. Same reasoning as `fetchGrokCandidateModels`, which deliberately lists a + // model the user already excluded so its switch remains reachable. + const selectableSet = new Set(selectable); + const available = [ + ...selectable, + ...[...new Set(chosen)].filter(model => !selectableSet.has(model)), + ]; // #857: let CLI/GUI show when a running Codex app-server keeps an older // in-memory catalog than the one on disk. const { collectCodexAppServerCatalogState } = await import("../../codex/app-server-processes"); const catalogState = collectCodexAppServerCatalogState(); - return jsonResponse({ chosen: config.subagentModels ?? [], available, catalogState }); + return jsonResponse({ chosen, available, catalogState }); } if (url.pathname === "/api/subagent-models" && req.method === "PUT") { let body: { models?: unknown }; diff --git a/tests/combo-management-api.test.ts b/tests/combo-management-api.test.ts index 75c19f8916..49ec7b53b6 100644 --- a/tests/combo-management-api.test.ts +++ b/tests/combo-management-api.test.ts @@ -655,10 +655,22 @@ describe("combo management API", () => { expect(body.available.filter(model => model === "deepseek-v4-flash")).toHaveLength(1); expect(body.available).not.toContain("combo/free"); + // Disabling an alias hides it from the pickable set, but NOT while it still holds a + // saved roster slot: the dashboard PUTs exactly the rows it can render, so dropping a + // chosen id here silently truncates the persisted roster on the next Save. Covered by + // tests/subagent-roster-retention.test.ts. config.disabledModels = ["deepseek-v4-flash"]; const disabledResponse = await comboApi(config, "GET", "/api/subagent-models"); - const disabledBody = await disabledResponse!.json() as { available: string[] }; - expect(disabledBody.available).not.toContain("deepseek-v4-flash"); + const disabledBody = await disabledResponse!.json() as { chosen: string[]; available: string[] }; + expect(disabledBody.chosen).toEqual(["deepseek-v4-flash"]); + expect(disabledBody.available).toContain("deepseek-v4-flash"); + expect(disabledBody.available.filter(model => model === "deepseek-v4-flash")).toHaveLength(1); + + // Once it no longer occupies a roster slot, the disable takes full effect. + config.subagentModels = []; + const unfeaturedResponse = await comboApi(config, "GET", "/api/subagent-models"); + const unfeaturedBody = await unfeaturedResponse!.json() as { available: string[] }; + expect(unfeaturedBody.available).not.toContain("deepseek-v4-flash"); }, 15_000); test("GET models round-trips a disabled combo alias for the Models GUI", async () => { diff --git a/tests/subagent-roster-retention.test.ts b/tests/subagent-roster-retention.test.ts new file mode 100644 index 0000000000..ad2245fc56 --- /dev/null +++ b/tests/subagent-roster-retention.test.ts @@ -0,0 +1,74 @@ +/** + * A saved subagent roster must survive an unrelated model-visibility change. + * + * The dashboard renders the roster from the reported available list and PUTs exactly what it + * holds, so a + * chosen id that GET omits is not merely hidden: the next Save writes the truncated list + * back to config.json. Disabling a model on the Models page, narrowing a provider + * allowlist, or removing a provider therefore used to silently shrink a deliberate + * 5-model roster. + */ +import { describe, expect, test } from "bun:test"; +import { handleManagementAPI } from "../src/server/management-api"; +import { ManagementRequest as Request } from "./helpers/management-auth"; +import type { OcxConfig } from "../src/types"; + +function makeConfig(overrides: Partial = {}): OcxConfig { + return { port: 10100, providers: {}, defaultProvider: "openai", ...overrides } as OcxConfig; +} + +async function getRoster(config: OcxConfig): Promise<{ chosen: string[]; available: string[] }> { + const res = await handleManagementAPI( + new Request("http://localhost/api/subagent-models"), + new URL("http://localhost/api/subagent-models"), + config, + ); + expect(res).not.toBeNull(); + return await res!.json() as { chosen: string[]; available: string[] }; +} + +describe("/api/subagent-models roster retention", () => { + test("a chosen model disabled elsewhere stays listed in available", async () => { + const chosen = ["gpt-5.5", "gpt-5.6-sol", "gpt-5.6-terra", "gpt-5.6-luna", "gpt-5.4-mini"]; + const config = makeConfig({ + subagentModels: [...chosen], + disabledModels: ["gpt-5.5", "gpt-5.4-mini"], + }); + + const roster = await getRoster(config); + + // The saved list itself is untouched. + expect(roster.chosen).toEqual(chosen); + // And every slot the user saved can still be rendered, so a Save round-trip + // cannot truncate the roster to the models that happen to be enabled today. + for (const model of chosen) expect(roster.available).toContain(model); + }); + + test("retained roster entries are appended once, after the selectable models", async () => { + const config = makeConfig({ + subagentModels: ["gpt-5.5", "gpt-5.5", "gpt-5.6-terra"], + disabledModels: ["gpt-5.5"], + }); + + const { available } = await getRoster(config); + + // A duplicate saved id must not produce a duplicate row. + expect(available.filter(model => model === "gpt-5.5").length).toBe(1); + // An enabled chosen model is already selectable and must not be re-appended. + expect(available.filter(model => model === "gpt-5.6-terra").length).toBe(1); + // Retained-but-disabled entries sort after everything still selectable. + expect(available.indexOf("gpt-5.5")).toBeGreaterThan(available.indexOf("gpt-5.6-terra")); + }); + + test("a disabled model that is NOT in the roster stays out of available", async () => { + const config = makeConfig({ + subagentModels: ["gpt-5.6-terra"], + disabledModels: ["gpt-5.6-sol"], + }); + + const { available } = await getRoster(config); + + expect(available).not.toContain("gpt-5.6-sol"); + expect(available).toContain("gpt-5.6-terra"); + }); +}); From 06e1313577c637aeaaf00d654d5b66ec8ad6383a Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 02:23:00 +0900 Subject: [PATCH 08/88] docs(devlog): plan the bug-PR backlog consolidation as one stack plus siblings --- .../000_research_inventory.md | 133 ++++++++++++++++++ .../010_layer1_bearer_admission_2132.md | 58 ++++++++ .../020_layer2_responses_id_backfill_2131.md | 43 ++++++ .../030_sibling_prompt_cache_retention.md | 38 +++++ .../040_sibling_routing_capability.md | 31 ++++ .../050_sibling_k12_short_window.md | 25 ++++ .../060_supersede_and_close_operations.md | 37 +++++ 7 files changed, 365 insertions(+) create mode 100644 devlog/_plan/260820_bug_pr_backlog_consolidation/000_research_inventory.md create mode 100644 devlog/_plan/260820_bug_pr_backlog_consolidation/010_layer1_bearer_admission_2132.md create mode 100644 devlog/_plan/260820_bug_pr_backlog_consolidation/020_layer2_responses_id_backfill_2131.md create mode 100644 devlog/_plan/260820_bug_pr_backlog_consolidation/030_sibling_prompt_cache_retention.md create mode 100644 devlog/_plan/260820_bug_pr_backlog_consolidation/040_sibling_routing_capability.md create mode 100644 devlog/_plan/260820_bug_pr_backlog_consolidation/050_sibling_k12_short_window.md create mode 100644 devlog/_plan/260820_bug_pr_backlog_consolidation/060_supersede_and_close_operations.md diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/000_research_inventory.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/000_research_inventory.md new file mode 100644 index 0000000000..2959c3b9ea --- /dev/null +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/000_research_inventory.md @@ -0,0 +1,133 @@ +# 000 — Research: open bug-PR backlog inventory, rubric, and disposition + +Unit: 260820_bug_pr_backlog_consolidation +Work-phase: wp1 (docs-only roadmap cycle, LOOP-DOCS-FIRST-01) +Baseline: origin/dev = ceac592d7. Worktree branch codex/fix-subagent-roster-truncation (PR #2134). + +Evidence for every claim below came from six read-only xai/grok-4.6 investigation lanes that +read the actual PR diffs with `gh pr diff` and cross-read the runtime in this worktree. Code +edits stay in the main agent. + +## 1. Inventory + +27 open bug-labeled PRs; 25 authored by someone other than lidge-jun. 17 open bug issues. + +| PR | Author | Draft | Subsystem | Files | +|---|---|---|---|---| +| 2131 | bet4it | no | responses id backfill | server/responses | +| 2127 | agentHits | yes | antigravity thought_signature | adapters/google | +| 2115 | louis-tepe | no | adapter prompt nudge | adapters/* | +| 2110 | drakonkat | no | antigravity baseUrl override | providers/registry, lib/destination-policy | +| 2109 | drakonkat | no | anthropic baseUrl override | providers/registry, lib/destination-policy | +| 2105 | lilinxiong | no | claude shell hook | cli/index, server/system-env | +| 2104 | olddonkey | no | xai OAuth responses streaming | adapters/xai | +| 2102 | lilinxiong | no | gpt-5.6 prompt_cache_retention | adapters/openai-responses | +| 2101 | Ingwannu | no | account entitlement gating | codex/catalog | +| 2100 | ntdatt812 | no | routing capability evidence | routing/capability | +| 2099 | yzxcj797 | yes | gpt-5.6 prompt_cache_retention | adapters/openai-responses | +| 2091 | luvs01 | no | prompt_cache_retention (all forward) | adapters/openai-responses | +| 2082 | yzxcj797 | yes | AgentRouter language preamble | adapters | +| 2077 | ntdatt812 | no | lab behavior overrides | routing/compatibility/behavior | +| 2075 | olddonkey | no | Fast gate native chat (CONFLICTING) | adapters/openai-chat | +| 2067 | waw4303 | yes | opencode-free headers | providers/registry | +| 2063 | yzxcj797 | yes | K12 detail.code denials (CONFLICTING) | codex/quota-rejection | +| 2062 | yzxcj797 | yes | K12 short-window quota | codex/quota, codex/routing | +| 2056 | Ingwannu | no | K12 short-window quota | codex/quota, codex/routing | +| 2054 | keepitmello | yes | cursor checkpoints (CONFLICTING) | adapters/cursor | +| 2053 | Ingwannu | no | superseded OAuth commits | oauth/* | +| 2040 | Ingwannu | no | routed tool_search passthrough | server/responses | +| 2032 | yzxcj797 | yes | claude root bypass | cli/claude | +| 2029 | yzxcj797 | yes | probe session bus absent | service-manager-probe | +| 2027 | yzxcj797 | yes | opencode-go quota gating | providers/quota | + +## 2. Scoring rubric + +Score = severity (0-35) + blast radius (0-25) + evidence quality (0-20) + fix tractability (0-20). +Threshold for this campaign: **>= 60**. + +- severity: does it break a core path (routing, auth, streaming, config persistence) for a + default configuration, or is it peripheral/cosmetic? +- blast radius: how many users/configurations does the defect reach? +- evidence quality: deterministic reproduction with logs/curl, or assertion? +- fix tractability: is a correct, testable fix small and self-contained? + +## 3. Scores and disposition + +| Item | Score | Disposition | +|---|---|---| +| Issue #2132 bearer admission forces ChatGPT credential | 96 | ABSORB — no PR exists; highest-value gap in the backlog | +| Issue #2092 / PRs #2102,#2099,#2091 prompt_cache_retention | 86 | ABSORB #2102 as base; supersede #2099, #2091 | +| Issue #2114/#1939 / PR #2029 probe bus | 80 | SUPERSEDED by maintainer PR #2130 (already open) | +| PR #2131 responses output id backfill | 80 | ABSORB | +| PR #2100 routing capability evidence | 80 | ABSORB | +| PR #2047 / #2056 + #2062 K12 short-window quota | 72 | ABSORB #2056; supersede #2062 | +| PR #2053 superseded OAuth credential commits | 72 | KEEP — C4 auth, needs human security review (MAINTAINERS.md) | +| PRs #2109 + #2110 baseUrl override | 68 | HOLD — unresolved security gap, see §6 | +| PR #2101 account entitlement gating | 64 | KEEP — large (20 files), needs its own cycle | +| PR #2077 lab behavior overrides | 62 | ABSORB | +| PR #2040 routed tool_search passthrough | 62 | KEEP — 14 files, own cycle | +| PR #2105 claude shell hook | 60 | ABSORB | +| PR #2063 K12 detail.code | — | SUPERSEDED by already-merged #2055 | +| PR #2115 code mode nudge | 54 | BELOW THRESHOLD — contracts native-OpenAI detection; needs human adapter pass | +| PR #2082 AgentRouter language | 54 | BELOW THRESHOLD | +| PR #2027 opencode-go quota | 56 | BELOW THRESHOLD | +| PR #2067 opencode-free headers | 50 | BELOW THRESHOLD | +| PR #2054 cursor checkpoints | 46 | BELOW THRESHOLD — hypothesis pending wire trace | +| PR #2032 claude root bypass | 46 | BELOW THRESHOLD — maintainer already rejected the default | +| PR #2104, #2075, #2127 | n/a | Deferred: #2075 and #2054 are CONFLICTING; #2127 is an active draft by its author | + +## 4. Duplicate clusters (evidence-backed) + +**prompt_cache_retention (issue #2092).** #2102 gates on `forward && isCanonicalOpenAiForwardProvider` +and matches `gpt-5.6` / `gpt-5.6-*`. #2099 uses a looser `startsWith("gpt-5.6")` on ANY forward +provider and carries a stray package.json 2.24.2 -> 2.25.0 bump. #2091 strips the field for every +forward request and every model, which inverts the existing gpt-5.5 preserve pin at +tests/openai-responses-passthrough.test.ts:807 — the issue reporter explicitly withdrew the +global claim. #2102 is the correct contract. + +**K12 short-window quota (issue #2047).** #2056 is a strict superset of #2062: it adds +`snapshotHasShort`, partial-snapshot preservation, `updateAccountQuota` carry, and the +parse -> cache -> DTO path the issue requires. Both rewrite the same two functions and WOULD +conflict. #2062 also carries the same stray version bump. + +**Probe bus (issues #2114/#1939).** #2130's `busUnreachable()` is a superset of #2029's two +strings and adds the on-disk unit check that #2029's reviewer demanded. Landing #2029 on top of +#2130 would REGRESS the disk check back to unconditional `absent`. + +## 5. Structural finding: this backlog is not one stack + +DEV-STACK-01 permits stacking only when later parts consume earlier parts' output. Measured file +overlap across the absorb set: + +| Cluster | Files | +|---|---| +| PCR consolidation | src/adapters/openai-responses.ts | +| #2132 + #2131 | src/server/responses/core.ts (**shared**) | +| #2100 | src/routing/capability.ts | +| #2077 | src/routing/compatibility/behavior.ts | +| K12 | src/codex/quota.ts, src/codex/routing.ts | +| #2105 | src/cli/index.ts, src/server/system-env.ts | + +Exactly one real dependency edge exists: **#2132 and #2131 both modify +`src/server/responses/core.ts`**, so they must be ordered. Everything else is disjoint. + +Forcing 12 disjoint fixes into one 12-layer chain would violate DEV-STACK-01's independence +clause and the 2-4 depth guidance, and would impose a false merge order in which an unrelated +layer blocks every layer above it. The honest shape is therefore **one bounded stack rooted on +#2134 for the genuinely dependent Responses work, plus sibling PRs off dev for the disjoint +fixes**. That is recorded here rather than silently reshaped. + +## 6. Security holds (detail deliberately not recorded here) + +The baseUrl-override pair (#2109/#2110) has an unresolved gap already raised publicly in the +CodeRabbit thread on those PRs. Per AGENTS.md, pre-disclosure security reasoning does not go in +this public directory: the analysis lives in scratch only, and these PRs are HOLD, not absorb, +until a human security pass. #2053 is C4 OAuth and requires the security review MAINTAINERS.md +mandates; it is KEEP, not absorb. + +## 7. Attribution contract + +Every superseded PR gets (a) its author credited by @login in the superseding PR body, +(b) a courteous closing comment naming the replacement PR and what was carried over, +(c) no force-push and no edit to the contributor's own branch. + diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/010_layer1_bearer_admission_2132.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/010_layer1_bearer_admission_2132.md new file mode 100644 index 0000000000..dd5da1b8af --- /dev/null +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/010_layer1_bearer_admission_2132.md @@ -0,0 +1,58 @@ +# 010 — Layer 1 (stack bottom): fix issue #2132, bearer admission must not force a ChatGPT credential + +Work-phase: wp2. Branch: `codex/fix-bearer-admission-2132`. Base: `codex/fix-subagent-roster-truncation` (PR #2134). +Absorbs: nothing (no PR exists). Closes: #2132. + +## Why this is the stack bottom + +It is the highest-scoring item in the backlog (96) and it shares `src/server/responses/core.ts` +with layer 2 (#2131). Layer 2 must be based on this, or the two edits to that file collide. + +## Defect + +Reported in #2132: after v2.23.0, a key-auth provider (Cloudflare/etc.) returns 401 +`No usable Codex main credential` when `~/.codex/auth.json` holds no ChatGPT token. Bearer +admission sets `substituteMainCredential` unconditionally, so a route that needs no ChatGPT +identity is still gated on one. + +## P-phase re-verification required (stale check) + +Before editing, confirm against the CURRENT tree — the lane read `dev`, not this branch: +1. `rg -n "substituteMainCredential" src/` — enumerate every producer and consumer. +2. Read `src/server/responses/core.ts`, `src/server/responses/compact.ts`, + `src/codex/auth-context.ts` and establish where the flag is set and where it is read. +3. Reproduce the admission decision in a unit context with a key-auth provider and an + auth.json containing no ChatGPT token. If the current code does NOT reproduce, stop and + amend this doc rather than writing a fix for a defect that is not there. + +## Intended change + +Make the substitution conditional on the resolved route actually requiring a native/ChatGPT +credential. A key-auth routed provider carries its own credential and must be admitted +without one. Exact call sites are fixed during the stale check above; the invariant is: +`substituteMainCredential` is set only when the route's credential source is the native +ChatGPT pool. + +Out of scope: changing what happens once a native route legitimately lacks a credential, +and any change to the pool/account selection itself. + +## Test plan (must fail RED first) + +New `tests/bearer-admission-key-auth.test.ts`: +1. key-auth routed provider + auth.json with NO ChatGPT token -> request is admitted (no 401). +2. native gpt route + no ChatGPT token -> still fails closed with the existing error. +3. key-auth provider + ChatGPT token present -> unchanged behavior (no regression). + +Drive the file against the unpatched tree first and record the failure output; a test that +passes before the fix does not prove anything. + +## Verification + +`bun run typecheck`; `bun test --isolate` on the new file plus the existing responses/auth +suites; full `bun test --isolate tests` before marking review-ready; `bun run privacy:scan`. + +## Standalone thesis (DEV-STACK-03) + +"A provider that carries its own key must not be gated on a ChatGPT credential." Builds and +passes its own tests at its own tip, independent of layer 2. + diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/020_layer2_responses_id_backfill_2131.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/020_layer2_responses_id_backfill_2131.md new file mode 100644 index 0000000000..bb5c088378 --- /dev/null +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/020_layer2_responses_id_backfill_2131.md @@ -0,0 +1,43 @@ +# 020 — Layer 2: absorb PR #2131, backfill missing Responses output ids + +Work-phase: wp3. Branch: `codex/absorb-responses-id-backfill`. Base: `codex/fix-bearer-admission-2132` (layer 1). +Absorbs: **PR #2131 by @bet4it**. Closes: PR #2131 as superseded, with attribution. + +## Dependency edge (the only real one in this backlog) + +#2131 adds `src/server/responses/responses-field-backfill.ts` and calls it from +`src/server/responses/core.ts` — the same file layer 1 edits. This is why it stacks rather +than sitting beside layer 1. + +## Defect + +Strict decoders (grok-build) reject Responses output items that omit `id` on +`message` / `reasoning` / `function_call`. #1941 landed earlier but some relays still omit it. + +## Change to carry over + +@bet4it's implementation, preserved in substance: synthesize stable `msg_ocx_N` / `rs_ocx_N` / +`fc_ocx_N` ids keyed on `output_index`, never overwriting an id that is already present. + +## Correction to apply on top (audit finding, lane: quality) + +An invalid or missing `output_index` collapses to `0`, so two unindexed items can both become +`msg_ocx_0` — duplicate ids, which is the exact class of bug this fixes. Replace the +collapse-to-zero fallback with a monotonic per-response counter so synthesized ids are unique +even when `output_index` is absent or malformed. Add the regression test that pins it. + +Docs: the locale files in #2131 are uneven (EN/FR rewritten, JA/KO/ZH/TR only first sentence). +Carry only the EN change in this layer; locale parity is not this layer's thesis. + +## Test plan (must fail RED first) + +Carry @bet4it's tests (SSE `response.completed`, `output_item.done` via `output_index`, JSON +passthrough, preserve-existing-id, inherited `toString` type) and ADD: +- two items with missing `output_index` receive DISTINCT ids (fails on #2131 as written). + +## Verification + +Same gate as layer 1, plus explicit confirmation that layer 2's branch contains layer 1's +commit (`git log --oneline ..` shows only layer-2 commits) and that the PR +base ref names layer 1's branch. + diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/030_sibling_prompt_cache_retention.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/030_sibling_prompt_cache_retention.md new file mode 100644 index 0000000000..fc66d105c9 --- /dev/null +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/030_sibling_prompt_cache_retention.md @@ -0,0 +1,38 @@ +# 030 — Sibling A: consolidate prompt_cache_retention (issue #2092) + +Work-phase: wp4. Branch: `codex/consolidate-prompt-cache-retention`. Base: **dev** (sibling, not a stack layer). +Absorbs: **PR #2102 by @lilinxiong** (base implementation). Supersedes: **#2099 by @yzxcj797**, **#2091 by @luvs01**. Closes #2092. + +## Why a sibling and not a layer + +It touches only `src/adapters/openai-responses.ts`, which no other absorbed item touches. It has +no dependency on layers 1-2, so stacking it would impose a false merge order (DEV-STACK-01). + +## Chosen contract + +@lilinxiong's #2102: strip `prompt_cache_retention` only when +`forward && isCanonicalOpenAiForwardProvider(provider)` AND the model is `gpt-5.6` or +`gpt-5.6-*`. This matches the issue's own correction — the reporter withdrew the "strip +everywhere" claim, and some non-5.6 deployments still honor the field. + +Rejected: #2091's blanket strip for every forward provider and every model (it inverts the +existing gpt-5.5 preserve pin at tests/openai-responses-passthrough.test.ts:807). +Rejected: #2099's `startsWith("gpt-5.6")`, which also matches `gpt-5.60`, and its stray +package.json 2.24.2 -> 2.25.0 bump. + +## Carried from the superseded PRs + +From @yzxcj797's #2099: the `Fixes #2092` issue link and the repro-shaped fixture +(`store:false`, streamed input array). From @luvs01's #2091: nothing — its key-auth preserve +case is already covered by #2102. + +## Tightening to apply + +Replace the string-prefix family match with the catalog/native-slug predicate if one exists +in the current tree (`rg -n "isGpt56NativeSlug|NATIVE_OPENAI_MODELS" src/`); otherwise keep +the exact `gpt-5.6` / `gpt-5.6-*` match and pin `gpt-5.60` as a NON-match in tests. + +## Test plan (must fail RED first) + +Carry #2102's tests; add `gpt-5.60` non-match; keep the gpt-5.5 preserve pin intact. + diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/040_sibling_routing_capability.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/040_sibling_routing_capability.md new file mode 100644 index 0000000000..62f0016582 --- /dev/null +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/040_sibling_routing_capability.md @@ -0,0 +1,31 @@ +# 040 — Sibling B: routing capability + lab behavior evidence + +Work-phase: wp5. Branch: `codex/absorb-capability-evidence`. Base: **dev**. +Absorbs: **PR #2100 and PR #2077, both by @ntdatt812**. Closes both as superseded. + +## Why these two together, and why a sibling + +#2100 touches `src/routing/capability.ts`; #2077 touches +`src/routing/compatibility/behavior.ts`. Disjoint files, one author, one thesis: *model-keyed +lookups must use the same resolution rules the runtime uses*. Neither depends on layers 1-2. + +Note: #2077 is Lab-adjacent. Verify `tests/core-lab-boundary.test.ts` stays green — the file +already imports Lab types, so this must not newly puncture the boundary. + +## Defects + +#2100: bare map lookups made `gpt-oss:120b` inherit the provider-wide 8k window instead of the +`gpt-oss` family's 131072, and `noVisionModels` was ignored. +#2077: `map[modelId]` missed family/case overrides, and `constructor` resolved to +`Object.prototype.constructor`, making `jcsStringify` throw and silently dropping Lab subjects. + +## Change + +Route both through `modelRecordValue` / `isModelTextOnly` as @ntdatt812 wrote them. Prototype-id +safety (`constructor`, `toString`) is the load-bearing part; keep those tests verbatim. + +## Test plan + +Carry both test files. Confirm the exact-own maps (`modelPreferHostedTools`, +`modelOpenRouterRouting`) still do NOT family-spread. + diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/050_sibling_k12_short_window.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/050_sibling_k12_short_window.md new file mode 100644 index 0000000000..524d543b5c --- /dev/null +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/050_sibling_k12_short_window.md @@ -0,0 +1,25 @@ +# 050 — Sibling C: K12 short-window quota (issue #2047) + +Work-phase: wp6. Branch: `codex/absorb-k12-short-window`. Base: **dev**. +Absorbs: **PR #2056 by @Ingwannu**. Supersedes: **#2062 by @yzxcj797**. Closes #2047. + +## Chosen base + +#2056 is a strict superset of #2062: `snapshotHasShort`, partial-snapshot preservation, +`updateAccountQuota` carry, and the parse -> cache -> DTO path #2047 actually requires. #2062 +drops short on a later weekly/monthly partial snapshot and carries a stray version bump. + +## Blocker to fix before this can land (raised by the maintainer on both PRs) + +A short-only snapshot with `shortPercent: 0` scores `0` instead of `CODEX_UNKNOWN_USAGE_SCORE`, +so `pickLowestUsageAmong` prefers an account whose long windows are unverified. Fix: +include `shortPercent` in `computeCodexUsageScore` only when the plan's governing long window +is finite; otherwise return `CODEX_UNKNOWN_USAGE_SCORE`. Add the short-only regression. + +This blocker is why #2056 is absorbed-and-corrected rather than simply approved. + +## Also close + +**#2063 by @yzxcj797** — superseded by ALREADY-MERGED #2055 (`2648ffa87`), which classifies +`detail.code` with a stricter own-property lookup. Close with attribution; fold nothing. + diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/060_supersede_and_close_operations.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/060_supersede_and_close_operations.md new file mode 100644 index 0000000000..ec55998dfc --- /dev/null +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/060_supersede_and_close_operations.md @@ -0,0 +1,37 @@ +# 060 — Close-out: supersede operations and attribution + +Work-phase: wp7. No code. GitHub state only. + +## Ordering rule + +A PR is closed ONLY after its replacement exists and is pushed. Never close first. + +## Operations + +| Close | Author | Replaced by | Carried over | +|---|---|---|---| +| #2131 | @bet4it | layer 2 (020) | full implementation + tests, plus unique-id correction | +| #2099 | @yzxcj797 | sibling A (030) | issue link, repro fixture | +| #2091 | @luvs01 | sibling A (030) | nothing; contract deliberately narrower | +| #2100 | @ntdatt812 | sibling B (040) | full implementation + tests | +| #2077 | @ntdatt812 | sibling B (040) | full implementation + tests | +| #2102 | @lilinxiong | sibling A (030) | full implementation + tests (base) | +| #2062 | @yzxcj797 | sibling C (050) | nothing; #2056 supersedes | +| #2063 | @yzxcj797 | merged #2055 | nothing | +| #2056 | @Ingwannu | sibling C (050) | full implementation + scorer correction | +| #2029 | @yzxcj797 | maintainer PR #2130 | nothing; #2130 is a superset | + +## Comment template + +> Thanks for this, @ — closing as superseded by #, which carries from your +> patch. Your work is credited in that PR's description. + +## NOT closed, with reasons stated publicly + +- **#2109 / #2110** (@drakonkat): unresolved security gap in the override gate; needs a human + security pass (AGENTS.md security boundary). +- **#2053** (@Ingwannu): C4 OAuth surface; MAINTAINERS.md mandates security review. +- **#2101, #2040**: large (20 and 14 files); each needs its own PABCD cycle. +- **#2115, #2082, #2027, #2067, #2054, #2032**: below the 60 threshold. +- **#2104, #2075, #2127**: #2075/#2054 CONFLICTING; #2127 is an active draft by its author. + From d527c12167fe19f6297d3acf8266032383dc043a Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 02:37:11 +0900 Subject: [PATCH 09/88] =?UTF-8?q?docs(devlog):=20correct=20the=20stack=20p?= =?UTF-8?q?remise=20=E2=80=94=20the=20absorbed=20bug=20PRs=20are=20disjoin?= =?UTF-8?q?t?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../000_research_inventory.md | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/000_research_inventory.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/000_research_inventory.md index 2959c3b9ea..5aec5c3a20 100644 --- a/devlog/_plan/260820_bug_pr_backlog_consolidation/000_research_inventory.md +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/000_research_inventory.md @@ -131,3 +131,82 @@ Every superseded PR gets (a) its author credited by @login in the superseding PR (b) a courteous closing comment naming the replacement PR and what was carried over, (c) no force-push and no edit to the contributor's own branch. + +--- + +# P-phase amendment (A-gate self-audit, 2026-08-20): the stack premise in §5 was WRONG + +The A-phase auditor lane produced nothing across three wait cycles, so it was retired +(DISPATCH-RETIRE-01) and the load-bearing claims were verified directly. Two of them failed. + +## Correction 1 — #2131 does NOT touch `src/server/responses/core.ts` + +`gh pr diff 2131 --name-only` returns `src/server/responses/responses-field-backfill.ts`, +its test, and eight docs locales. `core.ts` already imports that module on `dev` +(`src/server/responses/core.ts:6-7`, called at :3098-3099); #2131 only changes the module's +internals and signature. It never edits `core.ts`. + +#2132's fix lives in `resolveResponsesCodexAuth` (`core.ts:1082-1114`), a different region of +a file #2131 does not modify at all. + +**Therefore the single dependency edge claimed in §5 does not exist.** The corrected file map: + +| Item | Files | Overlap | +|---|---|---| +| #2132 | src/server/responses/core.ts (auth resolution) | none | +| #2131 | src/server/responses/responses-field-backfill.ts | none | +| #2102 | src/adapters/openai-responses.ts | none | +| #2100 | src/routing/capability.ts | none | +| #2077 | src/routing/compatibility/behavior.ts | none | +| #2056 | src/codex/quota.ts, src/codex/routing.ts | none | +| #2105 | src/cli/index.ts, src/server/system-env.ts | none | + +Every absorbed item is disjoint. **There is no dependency-ordered chain in this backlog at all.** + +## Consequence: this work must NOT be stacked + +DEV-STACK-01 forbids stacking independent parts: "the parts are independent — open parallel PRs +off trunk instead, since a stack imposes a false merge order." Building the requested chain +would mean any layer's review blocking every layer above it, for zero dependency benefit, and +would violate the same rule the request asked to follow. + +Docs 010 and 020 are therefore **superseded**: both become siblings based on `dev`, not layers. +PR #2134 remains its own independent PR. The stack rooted on #2134 is cancelled and the reason +is recorded here rather than the plan being quietly reshaped. + +**One exception preserved:** if two absorbed items ever do touch one file, they stack. None do. + +## Correction 2 — issue #2132 is confirmed present, with a sharper mechanism than 010 assumed + +Verified in this worktree: +- `core.ts:1088`: `const substituteMainCredential = options.admission?.source === "bearer";` + keys on HOW the caller authenticated, never on WHERE the request routes. +- `auth-context.ts:542-548`: with `ctx.kind === "main"` and that flag, a missing/dead stored + main token throws `CodexMainSubstitutionUnavailableError`. +- `core.ts:1148-1153`: that becomes the reported 401. +- The `authCtx = { kind: "main" }` fallback at `core.ts:1105` is taken whenever + `route.codexAccountMode` is unset — which is every non-`openai` provider. + +So a key-auth routed provider reaches `kind: "main"` + `substituteMainCredential: true` and +fails, exactly as reported. The defect is real and 010's fix direction stands; only its stack +position changes. + +## Correction 3 — supersede claims re-verified + +`gh pr view 2055`: `MERGED` at 2026-08-19T00:11:27Z, merge commit `2648ffa879edf93e`. #2063's +supersede stands. + +## Revised work-phase map + +| WP | Doc | Branch | Base | Content | +|---|---|---|---|---| +| wp2 | 010 | codex/fix-bearer-admission-2132 | dev | issue #2132 (score 96) | +| wp3 | 030 | codex/consolidate-prompt-cache-retention | dev | absorb #2102; supersede #2099, #2091 | +| wp4 | 040 | codex/absorb-capability-evidence | dev | absorb #2100, #2077 | +| wp5 | 050 | codex/absorb-k12-short-window | dev | absorb #2056; supersede #2062, #2063 | +| wp6 | 020 | codex/absorb-responses-id-backfill | dev | absorb #2131 + unique-id correction | +| wp7 | 060 | — | — | close-outs with attribution | + +Ordered by score, not by dependency, because no dependency exists. Each is independently +reviewable and independently mergeable, which is what DEV-STACK-01 actually asks for. + From a83ee5163392fc3a074aed2dfc20ad8ab3a87dce Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 02:39:21 +0900 Subject: [PATCH 10/88] docs(devlog): record #2130 merged, so #2029 is superseded in fact --- .../000_research_inventory.md | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/000_research_inventory.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/000_research_inventory.md index 5aec5c3a20..6867621ef2 100644 --- a/devlog/_plan/260820_bug_pr_backlog_consolidation/000_research_inventory.md +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/000_research_inventory.md @@ -210,3 +210,26 @@ supersede stands. Ordered by score, not by dependency, because no dependency exists. Each is independently reviewable and independently mergeable, which is what DEV-STACK-01 actually asks for. + +## Correction 4 — #2130 merged mid-cycle; #2029 is now superseded in fact, not in prospect + +`gh pr view 2130`: `MERGED` at 2026-08-19T17:25:26Z. The probe lane's verdict was conditional +("SUPERSEDED, once #2130 merges"); that condition is now satisfied. + +Consequence for `060`: **#2029 (@yzxcj797)** moves from a prospective close to an immediate one. +`dev` now carries `busUnreachable()` — a superset of #2029's two stderr strings — plus the +on-disk unit check that #2029's own reviewer demanded. Landing #2029 on top would REGRESS that +disk check back to an unconditional `absent`. Nothing from #2029 needs to be carried over; its +one unique behavior (keeping `DBUS_SESSION_BUS_ADDRESS not set` as `unknown`) is precisely what +the merged disk check replaces. + +This also removes #2130 from the open-bug-PR set: the fresh count at wp1 close is 26 open bug +PRs, of which exactly one (#2134) is lidge-jun's and 25 are not. + +## wp1 close-out evidence + +`gh pr list --repo lidge-jun/opencodex --state open --label bug --limit 100` at close: +26 total, mine = [2134], non-mine = 25. Every one of those 25 numbers appears in §1/§3 of this +document (verified by a grep loop over the list, exit 0). No open bug PR is left without a +disposition. + From 92178ea7c0ef08b5558cc38e5c077a5d2e75beb9 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 02:52:59 +0900 Subject: [PATCH 11/88] docs(devlog): adjudicate the late auditor FAIL verdict --- .../000_research_inventory.md | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/000_research_inventory.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/000_research_inventory.md index 6867621ef2..1b68a3fe29 100644 --- a/devlog/_plan/260820_bug_pr_backlog_consolidation/000_research_inventory.md +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/000_research_inventory.md @@ -233,3 +233,57 @@ PRs, of which exactly one (#2134) is lidge-jun's and 25 are not. document (verified by a grep loop over the list, exit 0). No open bug PR is left without a disposition. + +--- + +# A-gate amendment 2 — retired auditor returned late with VERDICT: FAIL; findings adjudicated + +The adversarial lane retired under DISPATCH-RETIRE-01 (three empty wait cycles) delivered after +retirement. Its verdict is FAIL. It is adjudicated here rather than discarded, because a late +reviewer is still a reviewer. + +**Findings 1 and 2 — CONFIRMED, and already corrected.** It independently measured the same +`gh pr diff --name-only` evidence and reached the same conclusion as amendment 1: #2131 does not +touch `core.ts`, no dependency edge exists, and rooting a stack on #2134 (which only touches +`agent-settings-routes.ts`) is a second DEV-STACK-01 violation. Two independent measurements now +agree. Recorded as settled. + +**Finding 5 — CONFIRMED, and it is the sharpest catch.** Doc 010 said to gate substitution on +"the native ChatGPT **pool**". That would exclude `codexAccountMode: "direct"` and re-break +#1686, whose whole point is that Direct bearer admission is only safe *because* substitution +still runs. The implemented fix uses `route.codexAccountMode !== undefined`, which covers both +`pool` and `direct` and matches the issue reporter's own suggested gate. 010's prose is +superseded by this line; the code is correct. + +**Finding 3 — CONFIRMED and material.** Overlap was measured only inside the absorb set. Three +OTHER open PRs edit `src/server/responses/core.ts`: + +| PR | Overlap with the #2132 fix | +|---|---| +| #2104 (@olddonkey) | `src/server/responses/core.ts` — review-ready, MERGEABLE | +| #2101 (@Ingwannu) | `core.ts` + `compact.ts` + `auth-context.ts` — all three files this fix touches | +| #2040 (@Ingwannu) | `core.ts` | + +Verified by `gh pr diff --name-only`. The #2132 change is 5 lines across two files and does not +restructure either function, so a textual conflict is possible but small. This is a merge-order +hazard to state on the PR, not a reason to withhold the fix. #2104 is reclassified from `n/a` +to KEEP (review-ready, not a conflicting draft — the auditor is right that grouping it with +CONFLICTING #2075 and draft #2127 was an error, and its inventory row's "adapters/xai" file +attribution was wrong). + +**Finding 4 — CONFIRMED. #2105 would have been lost.** It is scored 60 ABSORB in §3, has no +decade doc, and appears in no row of 060. An above-threshold item with no execution path is +exactly how a contributor's work disappears without a close comment. Disposition corrected to +**KEEP — remains open**, because no replacement exists. It is not closed. + +**Nits accepted:** "strict superset" overstates #2056 vs #2062 (#2062 uniquely adds +`tests/rate-limit-reset-credits.test.ts`); #2130 has empty `closingIssuesReferences` so +#1939/#2114/#2108 will not auto-close; the rubric is recorded as a single integer, so the +component arithmetic is not independently auditable. + +## Net effect on the plan + +No absorbed item is dropped and no new one is added. Two dispositions change (#2104 n/a -> KEEP, +#2105 ABSORB -> KEEP), one prose invariant in 010 is superseded by the implemented predicate, +and one merge hazard is now stated. The sibling shape from amendment 1 stands, reinforced. + From ed6de17ef7f43c715a3db3a6497d7019eb3690f2 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 03:05:44 +0900 Subject: [PATCH 12/88] docs(devlog): banner 010 so the shipped predicate cannot be reverted --- .../010_layer1_bearer_admission_2132.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/010_layer1_bearer_admission_2132.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/010_layer1_bearer_admission_2132.md index dd5da1b8af..991c3bb62a 100644 --- a/devlog/_plan/260820_bug_pr_backlog_consolidation/010_layer1_bearer_admission_2132.md +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/010_layer1_bearer_admission_2132.md @@ -1,3 +1,15 @@ +> **SUPERSEDED IN PART — read `000_research_inventory.md` amendments 1 and 2 first.** +> +> Two things in this document are wrong and were corrected after it was written: +> +> 1. **It is NOT a stack layer and does NOT root on #2134.** No dependency edge exists; +> the shipped PR (#2137) is based on `dev` as a sibling. +> 2. **The substitution predicate is NOT "native ChatGPT pool".** Pool-only would exclude +> `codexAccountMode: "direct"` and re-break #1686, whose Direct admission is only safe +> BECAUSE substitution still runs. The shipped predicate is +> `route.codexAccountMode !== undefined`, covering pool AND direct. Do not "correct" it back. + + # 010 — Layer 1 (stack bottom): fix issue #2132, bearer admission must not force a ChatGPT credential Work-phase: wp2. Branch: `codex/fix-bearer-admission-2132`. Base: `codex/fix-subagent-roster-truncation` (PR #2134). From f639a4552f0e1cdf9dd8d53f8ce4b8a7380f5a09 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 03:19:12 +0900 Subject: [PATCH 13/88] docs(devlog): log wp2 and wp3 shipped state --- .../070_execution_log.md | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md new file mode 100644 index 0000000000..134053e2ea --- /dev/null +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md @@ -0,0 +1,62 @@ +# 070 — Execution log: what actually shipped + +Appended as work-phases close. This is the record of landed state, distinct from the plan. + +## wp2 — issue #2132 (score 96) + +**PR #2137**, branch `codex/fix-bearer-admission-2132`, base `dev`. + +`substituteMainCredential` was computed from how the caller authenticated and never from where +the request routes, so a key-authenticated provider was gated on a ChatGPT credential it cannot +use. The predicate is now +`options.admission?.source === "bearer" && route.codexAccountMode !== undefined` +at both `core.ts:1088` and `compact.ts:325`. + +It covers `pool` AND `direct`. Doc 010's "native ChatGPT pool" wording would have excluded +`direct` and re-broken #1686, whose Direct admission is only safe because substitution still +runs. 010 now carries a banner saying so. + +Evidence: `tests/bearer-admission-routed-provider.test.ts` driven RED (it reproduced the exact +reported 401), full suite 13516 pass / 0 fail, typecheck and privacy scan clean. Re-audit round 2 +by the same adversarial reviewer returned **VERDICT: PASS**. + +## wp3 — issue #2092 (score 86) + +**PR #2138**, branch `codex/consolidate-prompt-cache-retention`, base `dev`. + +Absorbs @lilinxiong's #2102 contract: strip `prompt_cache_retention` on canonical ChatGPT +forward for the `gpt-5.6` family only, with an exact-or-dashed-prefix match so a future +`gpt-5.60` is not swept up. The retired value is not translated into `prompt_cache_options`. + +Evidence: 5 of the new tests fail when only the adapter change is reverted; the two narrowness +guards stay green in both directions, which is what makes them guards rather than restatements. +Full suite 13537 pass / 0 fail. + +### Closed with attribution + +| PR | Author | Superseded by | Carried | +|---|---|---|---| +| #2102 | @lilinxiong | #2138 | the implementation itself | +| #2099 | @yzxcj797 | #2138 | issue link + repro fixture | +| #2091 | @luvs01 | #2138 | nothing; contract deliberately narrower | +| #2029 | @yzxcj797 | merged #2130 | nothing; #2130 adds the disk check review demanded | +| #2063 | @yzxcj797 | merged #2055 | nothing; #2055 is the stricter own-property lookup | + +Each carries a comment naming the replacement and the specific reason, so no contributor has to +guess why their work closed. + +## Still open by decision, not omission + +- #2109 / #2110 (@drakonkat) — unresolved security gap in the override gate; needs a human pass. +- #2053 (@Ingwannu) — C4 OAuth; MAINTAINERS.md mandates security review. +- #2105 (@lilinxiong) — above threshold but no replacement exists yet; closing it now would lose work. +- #2101, #2040 — 20 and 14 files; each needs its own cycle. +- #2104 (@olddonkey) — review-ready and MERGEABLE; reclassified out of the deferred bucket, it is a + KEEP that deserves review rather than supersession. + +## Remaining work-phases + +wp4 (#2100 + #2077 capability evidence), wp5 (#2056 K12 with the scorer correction), wp6 (#2131 +responses id backfill with the duplicate-id fix). Each is a sibling off `dev`; none depends on +another. + From 8c8fe800167ba9ddd2b5a8604cec881f96322813 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 03:52:13 +0900 Subject: [PATCH 14/88] docs(devlog): log wp4 through wp6 and the campaign state --- .../070_execution_log.md | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md index 134053e2ea..185711e293 100644 --- a/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md @@ -60,3 +60,33 @@ wp4 (#2100 + #2077 capability evidence), wp5 (#2056 K12 with the scorer correcti responses id backfill with the duplicate-id fix). Each is a sibling off `dev`; none depends on another. + +## wp6 — PR #2131 (@bet4it) + +**PR #2142**, branch `codex/absorb-responses-id-backfill`, base `dev`. + +Carries @bet4it's implementation and tests, plus one correction: an absent or malformed +`output_index` collapsed to 0, so two such items both synthesized `msg_ocx_0` — duplicate ids, +the exact defect the backfill prevents. Unusable indices now take a monotonic ordinal based far +above any plausible real index. + +Evidence worth naming: applying ONLY @bet4it's original source and running the new suite gives +15 pass / 1 fail, and the single failure is the duplicate-id guard. That is what makes it a guard +rather than a restatement of behavior. + +The inherited assertion `expect(parsed.item.id).toBe("msg_ocx_0")` was replaced, not deleted +quietly, and the replacement is disclosed in the PR body. + +# Campaign state at wp6 close + +Superseded and closed with attribution: #2102, #2099, #2091, #2029, #2063, #2100, #2077, #2056, +#2062, #2131 — ten PRs, each with a comment naming its replacement and the specific reason. + +Opened: #2137 (#2132), #2138 (#2092), #2140 (#2100+#2077), #2141 (#2047), #2142 (#2131), plus +the pre-existing #2134. + +Deliberately still open: #2109/#2110 (security gap), #2053 (C4 OAuth review), #2105 (no +replacement written yet), #2101/#2040 (each needs its own cycle), #2104 (review-ready, deserves +review not supersession), and the below-threshold set (#2115, #2082, #2027, #2067, #2054, #2032, +#2075, #2127). + From 06e0ac0cca5cfe93a72cef91d2d46e0aaa1b4672 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 04:03:40 +0900 Subject: [PATCH 15/88] docs(devlog): log wp7 and close the absorb campaign --- .../070_execution_log.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md index 185711e293..9e939cc158 100644 --- a/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md @@ -90,3 +90,16 @@ replacement written yet), #2101/#2040 (each needs its own cycle), #2104 (review- review not supersession), and the below-threshold set (#2115, #2082, #2027, #2067, #2054, #2032, #2075, #2127). + +## wp7 — PR #2105 (@lilinxiong) + +**PR #2144**, branch `codex/absorb-claude-shell-hook-gate`, base `dev`. + +Implementation and tests carried unchanged. The one addition is a comment on +`reconcileShellHook` recording that "installed" is answered from the calling process's PATH, so +a service context with a stripped PATH can remove a hook an interactive shell would keep — the +reversible direction, and the one this reconcile wants. + +This closes the finding the auditor raised at #2105: it was scored ABSORB with no execution path +and would have been lost. It now has one. + From 0a720d1e7271ae6fd005061c4bf5d28cf48a4cd1 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 04:08:15 +0900 Subject: [PATCH 16/88] docs(devlog): record CI state and the campaign end state --- .../070_execution_log.md | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md index 9e939cc158..e43c15d894 100644 --- a/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md @@ -103,3 +103,46 @@ reversible direction, and the one this reconcile wants. This closes the finding the auditor raised at #2105: it was scored ABSORB with no execution path and would have been lost. It now has one. + +# Campaign close — CI state and honest end state + +All six shipped PRs are green on exact head and MERGEABLE: + +| PR | Fixes | Checks | +|---|---|---| +| #2137 | issue #2132 | 25 pass / 0 fail | +| #2138 | issue #2092 (absorbs #2102) | 25 pass / 0 fail | +| #2140 | absorbs #2100 + #2077 | 25 pass / 0 fail | +| #2141 | issue #2047 (absorbs #2056) | 25 pass / 0 fail | +| #2142 | absorbs #2131 | 23 pass / 0 fail | +| #2144 | absorbs #2105 | 29 pass / 0 fail | + +#2140 first showed `npm-global-smoke` failing on windows-latest with +`EBUSY: resource busy or locked, unlink ...bun.exe` during dependency install — a Windows file +lock during Bun installation, not a defect in the routing change. Rerunning the failed jobs +turned it green, which is the evidence that it was infrastructure rather than the patch. + +## Eleven PRs closed with attribution + +#2102, #2099, #2091, #2029, #2063, #2100, #2077, #2056, #2062, #2131, #2105. + +Each carries a comment naming its replacement, what was carried over, and what was deliberately +not. Where a contributor's own assertion had to be replaced (#2056's `shortPercent: 0` scorer +case, #2131's `msg_ocx_0` collapse case), the replacement is disclosed in both the closing +comment and the superseding PR body rather than done silently. + +## Fourteen PRs deliberately still open + +- **Security holds:** #2109, #2110 (override gate), #2053 (C4 OAuth, MAINTAINERS.md review). +- **Own-cycle scale:** #2101 (20 files), #2040 (14 files). +- **Deserves review, not supersession:** #2104 — review-ready, MERGEABLE, and touching + `core.ts` alongside #2137. +- **Below the 60 threshold:** #2115, #2082, #2027, #2067, #2054, #2032, #2075, #2127. + +Nothing here is an omission. Every one is a recorded decision with a reason. + +## Merging + +Not done. DEV-STACK-04 and DEV-GIT-PUSH-01 both put merge authorization with the user, and +nothing in this campaign changes that. + From c253ce06415d576936a315209b7193f15ea428c5 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 04:53:56 +0900 Subject: [PATCH 17/88] docs(devlog): log wp8 and wp9, including the one real stack layer --- .../070_execution_log.md | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md index e43c15d894..3d8506c5fd 100644 --- a/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md @@ -146,3 +146,35 @@ Nothing here is an omission. Every one is a recorded decision with a reason. Not done. DEV-STACK-04 and DEV-GIT-PUSH-01 both put merge authorization with the user, and nothing in this campaign changes that. + +## wp9 — PR #2101 (@Ingwannu): the ONE real stack layer + +**PR #2146**, branch `codex/absorb-account-entitlement-stacked`, base **`codex/fix-bearer-admission-2132`** (the #2137 branch), not `dev`. + +This is the single genuine dependency edge in the entire backlog. #2101 passes +`substituteMainCredentialForDirect: substituteMainCredential` into `resolveCodexAuthContext` — +the exact value #2137 corrects. Landing it on `dev` alone would silently reintroduce #2132 for +every routed provider. Everything else absorbed in this campaign was disjoint and shipped as a +sibling; this one is stacked because the code says so, not because a plan said so. + +Three corrections on top of @Ingwannu's work: + +1. **Selector compact bypassed the wire rewrite** — `accountGatedCompactWireModel` came from + `raw.model`, which never matches the gated map for `side/gpt-daybreak-blue-latest`, so a + selector-form compact still hit the native endpoint. Now derived from `route.modelId`. +2. **Direct callers evicted catalog evidence** — one 64-entry LRU shared between per-credential + Direct keys and the main/Pool keys the catalog projects from. Split into two eviction classes; + pinned by a test verified to fail against the shared LRU. +3. **Comment rot** — `native-models.ts` claimed routing never collapses Daybreak into + `gpt-5.6-sol`, which the wire normalization does. + +Evidence: full suite 13554 pass / 0 fail at the stacked tip; the composition check +(`codex-model-entitlements` + `bearer-admission-routed-provider` + `codex-auth-context` + +`server-auth`) is 146 pass / 0 fail, which is what proves the two layers agree. +Stack integrity: `git log parent..layer` shows exactly 1 commit, and a stack map was added to +#2137 so a reviewer arriving at the parent sees the chain. + +Two gaps named in the PR rather than carried silently: Direct `/v1/models` can still advertise a +Pool-only grant (advertisement only; dispatch still checks the caller credential), and +same-account gated-400 retry stays Pool-only. + From 4a04ff9815edd3892feeb98845222b4ec0e2de8b Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 05:35:42 +0900 Subject: [PATCH 18/88] docs(devlog): log wp10 through wp12, including both security holds resolved --- .../070_execution_log.md | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md index 3d8506c5fd..b3ce89d97d 100644 --- a/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md @@ -178,3 +178,24 @@ Two gaps named in the PR rather than carried silently: Direct `/v1/models` can s Pool-only grant (advertisement only; dispatch still checks the caller credential), and same-account gated-400 retry stays Pool-only. + +## wp12 — PR #2053 (@Ingwannu), the C4 OAuth hold + +**PR #2149**, branch `codex/absorb-oauth-superseded-commit`, base `dev`. + +Applied unchanged, rebased from 145 commits behind. The persist-boundary placement is the whole +design: `assertBeforePersist` runs inside the file lock, after `fn(store)` and before +`persist()`, so a superseded flow's in-memory mutation is discarded rather than written. +Ownership is identity-checked against the flow's own `AbortController`, not a timestamp. + +**This was a wp1 HOLD and it is resolved by shipping, not by absorbing quietly.** The PR states +plainly that MAINTAINERS.md mandates security review and asks that it not be merged on my +verification alone, and it names three residuals rather than letting the original claim stand: + +1. the description claimed reauth coverage; the diff wires the hook but adds no reauth test +2. `OAuthLoginSupersededError` is not in the public allowlist, so it projects to the generic string +3. a never-finishing Kiro rollback blocks all replacements, by design + +Evidence: reverting `src/oauth/` fails 2 tests including the cancel-then-replace round trip; +full suite 13536 pass / 0 fail. + From df94a433d9c51956f5410a7add4a4d589243324e Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 06:02:54 +0900 Subject: [PATCH 19/88] docs(devlog): close the campaign with the final PR state and both scoring corrections --- .../070_execution_log.md | 92 +++++++++++++++++++ 1 file changed, 92 insertions(+) diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md index b3ce89d97d..cd146a2c99 100644 --- a/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md @@ -199,3 +199,95 @@ verification alone, and it names three residuals rather than letting the origina Evidence: reverting `src/oauth/` fails 2 tests including the cancel-then-replace round trip; full suite 13536 pass / 0 fail. + +## wp14 — PR #2075 (@olddonkey): the second false negative + +**PR #2151**, branch `codex/absorb-fastwire-native-chat`, base `dev`. Closes #1886. + +Same class of error as wp13, different cause. I saw `CONFLICTING` and treated it as a reason not +to read the diff. The rescore put it at **67**: native `/v1/chat/completions` decided +`service_tier` from `chatServiceTier` alone, so a `supportsServiceTier: false` declaration was +fail-open. The conflict was why it could not MERGE, not why it should score LOW — and resolving +it took one import line. + +Rebase, stated exactly: `src/adapters/openai-chat.ts` conflicted because `dev` added +`AdapterTierMetadata` while the PR adds `decideTier` and `ResolvedFastPolicy`. Both kept. +Everything else clean. Typecheck is what confirms the resolution. + +Evidence: reverting `src/` fails the characterization test the author had flipped from +documented-known-bug to passing assertion. Full suite 13552 pass / 0 fail. + +## Two scoring lessons, recorded together + +wp13 and wp14 were both my errors, from two different shortcuts: + +1. **Scoring from titles** — "preserve and replay thought signatures" reads like bookkeeping and + was a core provider 400. +2. **Reading merge state as value** — `CONFLICTING` says a patch cannot land today; it says + nothing about whether the defect matters. + +Both produce false negatives that are indistinguishable from correct low scores without opening +the diff. The rubric was fine; the inputs I fed it were not. + + +# Campaign close (final) + +## 13 PRs open, all green, all MERGEABLE + +| PR | Fixes | Credit | Base | +|---|---|---|---| +| #2137 | issue #2132 | new work | dev | +| #2138 | issue #2092 | @lilinxiong | dev | +| #2140 | #2100 + #2077 | @ntdatt812 | dev | +| #2141 | issue #2047 | @Ingwannu | dev | +| #2142 | #2131 | @bet4it | dev | +| #2144 | #2105 | @lilinxiong | dev | +| #2145 | issue #1950 | @Ingwannu | dev | +| #2146 | issue #2097 | @Ingwannu | **#2137 branch (stacked)** | +| #2147 | issue #1886 | @olddonkey | dev | +| #2148 | #2109 + #2110 | @drakonkat | dev | +| #2149 | #2053 | @Ingwannu | dev | +| #2150 | issue #2125 | @agentHits | dev | +| #2151 | issue #1886 | @olddonkey | dev | + +Plus #2134, which opened this session. + +## 16 PRs closed with attribution + +#2102, #2099, #2091, #2029, #2063, #2100, #2077, #2056, #2062, #2131, #2105, #2040, #2101, +#2104, #2109, #2110, #2053, #2127, #2075. + +Every one carries a comment naming its replacement, what was carried over, and what was +deliberately not. Where a contributor's own assertion had to be replaced — #2141's scorer case, +#2142's `msg_ocx_0` case — the replacement is disclosed in both the comment and the PR body. + +## 6 remain, independently verified below threshold + +#2115 (58), #2082 (46), #2067 (38), #2054 (58), #2032 (37), #2027 (51). + +These are not omissions. A rescore lane read every diff and scored them against the same rubric; +it found exactly two false negatives in my original triage (#2127 at 83, #2075 at 67) and both +were absorbed as wp13 and wp14. The remaining six are genuinely below the line, and four of them +are additionally blocked (draft, CONFLICTING, or CHANGES_REQUESTED). + +Two of them carry real bugs attached to unabsorbable patches: #2054's Cursor context collapse +(#1527) and #2027's Go quota gating (#1924). The right move for both is a clean reimplementation +on `dev`, not absorbing a 19-file conflicting draft. That is stated rather than silently skipped. + +## Corrections made on top of contributor work + +Eight PRs shipped with fixes the originals were missing, each pinned by a test verified to fail +against the contributor's own source: + +- #2141 short-only scorer returning 0 instead of UNKNOWN +- #2142 duplicate `msg_ocx_0` from a collapsed index +- #2145 history-only arming and non-atomic SSE overflow +- #2146 selector compact bypassing the wire rewrite, Direct callers evicting catalog cache +- #2148 `allowPrivateNetwork` bypassing the HTTPS gate for public hosts +- #2138 `gpt-5.60` near-miss match + +## Not merged + +DEV-STACK-04 and DEV-GIT-PUSH-01 both put merge authorization with the user. #2137 must land +before #2146. + From 095db442f495885f9de274272e8d6f81767c5b43 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 08:37:48 +0900 Subject: [PATCH 20/88] fix(providers): identify opencode-free with the client User-Agent it claims opencode-free sent no User-Agent, so Zen saw the bare runtime default (Bun/x.y.z) and rate-limited it harder than a client that identifies itself. Adds "User-Agent: opencode" alongside the existing x-opencode-client: desktop marker. The value is deliberately unversioned. OmniRoute, an independent open-source broker against the same Zen upstream, defaults to exactly this pair and reached it by retreating from its own earlier opencode-cli/1.0.0 pin: a pinned version is a claim about an install we do not have, and it goes stale on the vendor's schedule. The registry edit alone would have shipped to nobody. staticHeaders is documented as merged into every upstream request, but it was only ever copied at seed time, so any config written before a header existed -- or carrying any header of its own -- never received it. routedProviderConfig and buildModelsRequest now fill registry static headers beneath user headers, matched case-insensitively so an override replaces rather than duplicates: spreading "User-Agent" over a user's "user-agent" leaves both keys, which Headers serializes as one comma-joined value. Model discovery gets the same treatment because a provider identified as opencode when it completes but anonymous when it lists its own models reads as two different clients to a rate limiter. --- src/oauth/index.ts | 13 +++- src/providers/registry.ts | 40 ++++++++++++ src/router.ts | 7 ++ tests/management-provider-validation.test.ts | 13 +++- tests/opencode-free-provider.test.ts | 67 +++++++++++++++++++- 5 files changed, 134 insertions(+), 6 deletions(-) diff --git a/src/oauth/index.ts b/src/oauth/index.ts index 0162492f9a..fda4a3ec67 100644 --- a/src/oauth/index.ts +++ b/src/oauth/index.ts @@ -17,7 +17,7 @@ import { loginCommandCode, refreshCommandCodeToken } from "./command-code"; import { ANTIGRAVITY_REQUEST_UA } from "../adapters/google-antigravity-wire"; import { deriveOAuthDefaultModel, deriveOAuthProviderConfig } from "../providers/derive"; import { apiKeyPoolEntryId, sanitizeApiKeyValue } from "../providers/api-keys"; -import { effectiveGoogleMode, getProviderRegistryEntry, providerMatchesRegistryTransport } from "../providers/registry"; +import { effectiveGoogleMode, getProviderRegistryEntry, mergeRegistryStaticHeaders, providerMatchesRegistryTransport } from "../providers/registry"; import { resolveProviderModelDiscoveryUrl } from "../providers/model-discovery"; import { resolveProviderTransport } from "../providers/xai-transport"; import { detectClaudeCodeToken, detectGrokCliToken, hasComparableGrokIdentity, isSameGrokIdentity, shouldAdoptGrokGeneration } from "./local-token-detect"; @@ -828,7 +828,16 @@ export function buildModelsRequest( undefined, copilotApiBaseUrl, ); - const headers: Record = { ...(effectiveProvider.headers ?? {}) }; + // Model discovery is an upstream request like any other, so it carries the same registry + // static headers the inference path does. Without this a provider is identified correctly + // when it answers a completion but anonymously when it lists its own models, which is the + // kind of split fingerprint an upstream rate limiter reads as two different clients. + const registryStaticHeaders = providerMatchesRegistryTransport(providerName, effectiveProvider) + ? getProviderRegistryEntry(providerName)?.staticHeaders + : undefined; + const headers: Record = { + ...(mergeRegistryStaticHeaders(registryStaticHeaders, effectiveProvider.headers) ?? {}), + }; const discoveryUrl = (defaultUrl: string): string => resolveProviderModelDiscoveryUrl( providerName, prov, diff --git a/src/providers/registry.ts b/src/providers/registry.ts index 53922e75ad..de20cfa969 100644 --- a/src/providers/registry.ts +++ b/src/providers/registry.ts @@ -2435,6 +2435,16 @@ export const PROVIDER_REGISTRY: readonly ProviderRegistryEntry[] = [ note: "No key needed — public desktop tier. OpenCode currently advertises about 200 Big Pickle/free-model requests per 5 hours. The same Zen gateway can also short-window rate-limit free models at roughly 15-20 requests/minute, and may return generic 429s without Retry-After (opencodex synthesizes backoff only when that header is omitted). Free models are discovered live from Zen. Data use: per OpenCode's Zen docs (https://opencode.ai/docs/zen/), prompts sent to free models may be retained and used for training/improvement — do not send confidential material through this provider.", dashboardUrl: "https://opencode.ai", staticHeaders: { + // Zen answers a bare runtime User-Agent (Bun/x.y.z) more aggressively than a client + // that identifies itself, which is what the 429 in #2067 traced to. The value is + // deliberately unversioned: a pinned "opencode-cli/" is a claim about an + // install we do not have and goes stale on the vendor's schedule, not ours. + // Corroboration, not authority: OmniRoute — an independent open-source broker against + // the same Zen upstream — defaults to exactly this pair (userAgent "opencode", client + // "desktop") in open-sse/executors/opencode.ts, and got there by RETREATING from its + // own earlier "opencode-cli/1.0.0" pin. An operator can still override either value + // through the provider headers API; user headers win case-insensitively at route time. + "User-Agent": "opencode", "x-opencode-client": "desktop", }, modelReasoningEfforts: Object.fromEntries(OPENCODE_FREE_DEEPSEEK_MODELS.map(id => [id, deepseekThinkingEffortsFor(id)])), @@ -2591,6 +2601,36 @@ export function getProviderRegistryEntry(id: string): ProviderRegistryEntry | un return PROVIDER_REGISTRY.find(entry => entry.id === id); } +/** + * Merge a registry row's `staticHeaders` beneath a provider's own headers. + * + * The field is documented as "merged into every upstream request for this provider", but that + * was only ever true for a freshly seeded config: `providerConfigSeed` copies the block once + * (`derive.ts`), `enrichProviderFromCatalog` fills it only when the whole block is absent, and + * nothing merged it at request time. So an install that predates a header — or that saved any + * header of its own — never received the new one, which is exactly what #2067 would have + * shipped for every existing opencode-free user. + * + * The comparison is case-insensitive on purpose. HTTP header names are case-insensitive, but a + * plain object spread is not: merging a registry `User-Agent` over a user's `user-agent` + * produces two entries that `Headers` serializes as one comma-joined value + * ("opencode, custom-agent"), which is a corrupted request rather than an override. The user's + * spelling and value both win; the registry only fills names the user has not spoken for. + */ +export function mergeRegistryStaticHeaders( + staticHeaders: Record | undefined, + userHeaders: Record | undefined, +): Record | undefined { + if (!staticHeaders) return userHeaders; + if (!userHeaders) return { ...staticHeaders }; + const claimed = new Set(Object.keys(userHeaders).map(name => name.toLowerCase())); + const merged: Record = { ...userHeaders }; + for (const [name, value] of Object.entries(staticHeaders)) { + if (!claimed.has(name.toLowerCase())) merged[name] = value; + } + return merged; +} + /** Whether this registry row's per-model service-tier evidence applies to one configured target. */ export function registryModelServiceTierCapabilityApplies( entry: Pick, diff --git a/src/router.ts b/src/router.ts index 297795180e..d4839e24e0 100644 --- a/src/router.ts +++ b/src/router.ts @@ -14,6 +14,7 @@ import { assertProviderDestinationAllowed } from "./lib/destination-policy"; import { redactSecretString, redactUrlForLog } from "./lib/redact"; import { PROVIDER_REGISTRY, + mergeRegistryStaticHeaders, providerCodexAccountMode, registryModelServiceTierCapabilityApplies, } from "./providers/registry"; @@ -296,6 +297,11 @@ export function routedProviderConfig(providerName: string, provider: OcxProvider ? mergePositiveNumberCaps(registryEntry.modelContextWindows, provider.modelContextWindows) : mergeRecordFill(registryEntry.modelContextWindows, provider.modelContextWindows); const modelInputModalities = mergeRecordFill(registryEntry.modelInputModalities, provider.modelInputModalities); + // Registry static headers are documented as applying to every upstream request, so they are + // filled at resolve time rather than only at seed time: a config written before a header + // existed, or one carrying any header of its own, would otherwise never receive it. User + // headers win, matched case-insensitively so an override replaces rather than duplicates. + const headers = mergeRegistryStaticHeaders(registryEntry.staticHeaders, provider.headers); const modelMaxInputTokens = providerName === OPENAI_API_PROVIDER_ID ? mergePositiveNumberCaps(registryEntry.modelMaxInputTokens, provider.modelMaxInputTokens) : mergeRecordFill(registryEntry.modelMaxInputTokens, provider.modelMaxInputTokens); @@ -372,6 +378,7 @@ export function routedProviderConfig(providerName: string, provider: OcxProvider authMode: canonicalAuthMode, apiKey: resolvedApiKey, ...(staticModelCatalog ? { liveModels: false } : {}), + ...(headers ? { headers } : {}), // Backfill the Google wire mode + Vertex project/location from the registry when the user // config omits them, so a minimal `google-vertex`/`google-antigravity` entry still routes // through the correct branch (CCA/Vertex) instead of falling back to AI Studio. diff --git a/tests/management-provider-validation.test.ts b/tests/management-provider-validation.test.ts index fd79c750e9..600c040f41 100644 --- a/tests/management-provider-validation.test.ts +++ b/tests/management-provider-validation.test.ts @@ -2888,11 +2888,18 @@ describe("provider management validation", () => { }; // Clearing user-managed headers must not delete the registry-owned static - // metadata (opencode-free's x-opencode-client marker) the transport relies on. + // metadata (opencode-free's User-Agent and x-opencode-client markers) the transport + // relies on. expect((await patch("opencode-free", { headers: null }))?.status).toBe(200); - expect(liveConfig.providers["opencode-free"].headers).toEqual({ "x-opencode-client": "desktop" }); + expect(liveConfig.providers["opencode-free"].headers).toEqual({ + "User-Agent": "opencode", + "x-opencode-client": "desktop", + }); const saved = JSON.parse(readFileSync(join(TEST_DIR, "config.json"), "utf8")) as OcxConfig; - expect(saved.providers["opencode-free"]?.headers).toEqual({ "x-opencode-client": "desktop" }); + expect(saved.providers["opencode-free"]?.headers).toEqual({ + "User-Agent": "opencode", + "x-opencode-client": "desktop", + }); }); test("concurrent provider PATCHes merge different headers", async () => { if (existsSync(TEST_DIR)) rmSync(TEST_DIR, { recursive: true }); diff --git a/tests/opencode-free-provider.test.ts b/tests/opencode-free-provider.test.ts index 097fd98ef9..0db4aafb3e 100644 --- a/tests/opencode-free-provider.test.ts +++ b/tests/opencode-free-provider.test.ts @@ -2,6 +2,8 @@ import { describe, expect, test } from "bun:test"; import { PROVIDER_REGISTRY } from "../src/providers/registry"; import { providerConfigSeed, deriveKeyLoginMap, deriveFeaturedProviderIds } from "../src/providers/derive"; import { createOpenAIChatAdapter } from "../src/adapters/openai-chat"; +import { routedProviderConfig } from "../src/router"; +import { buildModelsRequest } from "../src/oauth"; import type { OcxParsedRequest, OcxProviderConfig } from "../src/types"; function minimalRequest(model = "kimi-k2.7-code"): OcxParsedRequest { @@ -27,14 +29,16 @@ describe("opencode-free provider", () => { expect(entry?.models).toBeUndefined(); }); - test("static headers include only the public client marker", () => { + test("static headers include only the public client markers", () => { expect(entry?.staticHeaders?.["Authorization"]).toBeUndefined(); + expect(entry?.staticHeaders?.["User-Agent"]).toBe("opencode"); expect(entry?.staticHeaders?.["x-opencode-client"]).toBe("desktop"); }); test("providerConfigSeed propagates static headers", () => { const seed = providerConfigSeed(entry!); expect(seed.headers?.["Authorization"]).toBeUndefined(); + expect(seed.headers?.["User-Agent"]).toBe("opencode"); expect(seed.headers?.["x-opencode-client"]).toBe("desktop"); expect(seed.keyOptional).toBe(true); expect(seed.liveModels).toBe(true); @@ -55,6 +59,7 @@ describe("opencode-free provider", () => { const req = adapter.buildRequest(minimalRequest()); const headers = req.headers as Record; expect(headers["Authorization"]).toBeUndefined(); + expect(headers["User-Agent"]).toBe("opencode"); expect(headers["x-opencode-client"]).toBe("desktop"); expect(req.url).toBe("https://opencode.ai/zen/v1/chat/completions"); }); @@ -84,6 +89,66 @@ describe("opencode-free provider", () => { expect(Object.keys(headers)).toContain("Authorization"); }); + // A seeded config is the easy case. The one that actually reaches users is a config written + // BEFORE a static header existed: it is on disk with the old header set (or with none at all, + // because the management API strips a block that exactly matches the registry), and nothing + // rewrites it. If the header only arrives at seed time, every existing install stays on the + // old fingerprint forever — which is what the original #2067 patch would have shipped. + describe("existing installs receive newly added static headers", () => { + const persisted = (headers?: Record): OcxProviderConfig => ({ + adapter: "openai-chat", + baseUrl: "https://opencode.ai/zen/v1", + keyOptional: true, + ...(headers ? { headers } : {}), + }); + + test("a config saved with no header block gains the full registry set", () => { + const routed = routedProviderConfig("opencode-free", persisted()); + expect(routed.headers?.["User-Agent"]).toBe("opencode"); + expect(routed.headers?.["x-opencode-client"]).toBe("desktop"); + }); + + test("a config saved with only the older marker gains the new one", () => { + const routed = routedProviderConfig("opencode-free", persisted({ "x-opencode-client": "desktop" })); + expect(routed.headers?.["User-Agent"]).toBe("opencode"); + expect(routed.headers?.["x-opencode-client"]).toBe("desktop"); + }); + + test("the merged headers reach the wire, not just the resolved config", () => { + const routed = routedProviderConfig("opencode-free", persisted({ "x-opencode-client": "desktop" })); + const req = createOpenAIChatAdapter(routed).buildRequest(minimalRequest()); + expect((req.headers as Record)["User-Agent"]).toBe("opencode"); + }); + + test("a user override wins and does not become a second comma-joined value", () => { + // HTTP header names are case-insensitive but object keys are not: a naive spread would + // leave both "user-agent" and "User-Agent", which `Headers` serializes as + // "custom-agent, opencode" — a corrupted request rather than an override. + const routed = routedProviderConfig("opencode-free", persisted({ "user-agent": "custom-agent" })); + const uaKeys = Object.keys(routed.headers ?? {}).filter(k => k.toLowerCase() === "user-agent"); + expect(uaKeys).toEqual(["user-agent"]); + expect(routed.headers?.["user-agent"]).toBe("custom-agent"); + expect(new Headers(routed.headers as Record).get("user-agent")).toBe("custom-agent"); + // Names the user did not claim are still filled. + expect(routed.headers?.["x-opencode-client"]).toBe("desktop"); + }); + + test("model discovery carries the same fingerprint as inference", () => { + // A provider identified as `opencode` when it completes but anonymous when it lists its + // own models reads as two different clients to an upstream rate limiter. + const req = buildModelsRequest(persisted({ "x-opencode-client": "desktop" }), undefined, "opencode-free"); + expect(req.headers["User-Agent"]).toBe("opencode"); + expect(req.headers["x-opencode-client"]).toBe("desktop"); + }); + + test("model discovery honors a user User-Agent override", () => { + const req = buildModelsRequest(persisted({ "user-agent": "custom-agent" }), undefined, "opencode-free"); + const uaKeys = Object.keys(req.headers).filter(k => k.toLowerCase() === "user-agent"); + expect(uaKeys).toEqual(["user-agent"]); + expect(req.headers["user-agent"]).toBe("custom-agent"); + }); + }); + test("provider note mentions no key needed", () => { expect(entry?.note?.toLowerCase()).toContain("no key needed"); expect(entry?.note?.toLowerCase()).toContain("200"); From 057e8575c3138f4e90d31e23feccbad60511a2fe Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 09:24:46 +0900 Subject: [PATCH 21/88] fix(anthropic): frame the opening turn so AgentRouter stops blocking non-English AgentRouter answers 400 content-blocked when the first user message is not in English (#2074) while the identical English request returns 200. The gateway inspects the opening user content, so an Anthropic system string never reaches the filter -- the framing has to sit in that turn. Two corrections on top of @yzxcj797's #2082. The host test was hostname.includes("agentrouter"), which also matches notagentrouter.example and agentrouter.org.attacker.example. A prompt mutation keyed on a provider's identity has to be keyed on that identity exactly, so this matches agentrouter.org or a real subdomain of it. The original spliced the marker into the user's own string. That edits what the user wrote: logs, retries, and any upstream echo then show a sentence the user never typed as if they had. The framing is now its own leading text block, so the original text survives byte-for-byte. Idempotence is keyed on the leading block being exactly the marker rather than a substring test, so a user who quotes the marker later in their prompt does not suppress their own framing. --- src/adapters/anthropic.ts | 59 ++++++++ ...ropic-agentrouter-language-framing.test.ts | 126 ++++++++++++++++++ 2 files changed, 185 insertions(+) create mode 100644 tests/anthropic-agentrouter-language-framing.test.ts diff --git a/src/adapters/anthropic.ts b/src/adapters/anthropic.ts index e012a78198..626a45f286 100644 --- a/src/adapters/anthropic.ts +++ b/src/adapters/anthropic.ts @@ -594,6 +594,63 @@ function orphanToolResultText(msg: OcxToolResultMessage): string { return `[tool_result without adjacent tool_use: ${label}]\n${content}`; } +/** + * AgentRouter answers 400 `content-blocked` when the first user message is not in English + * (#2074), while the same request in English returns 200. The gateway is inspecting the opening + * user content, so an Anthropic `system` string cannot reach it — the framing has to sit in the + * first user turn. + */ +const AGENTROUTER_LANGUAGE_PREAMBLE = + "[Instruction: Process the user request below and respond in the appropriate language.]"; + +/** + * Exact host match, not a substring. + * + * A `hostname.includes("agentrouter")` test also matches `notagentrouter.example` and + * `agentrouter.org.attacker.example`, which would let an unrelated destination silently + * receive an injected instruction block. A prompt mutation keyed on a provider's identity + * must be keyed on that identity exactly. + */ +function isAgentRouterEndpoint(baseUrl: string): boolean { + try { + const { hostname } = new URL(baseUrl); + return hostname === "agentrouter.org" || hostname.endsWith(".agentrouter.org"); + } catch { + return false; + } +} + +/** + * Prepend the framing as its OWN text block instead of splicing it into the user's string. + * + * The distinction matters: rewriting `content` to `${marker}\n\n${original}` edits what the + * user wrote, and every downstream consumer — logs, retries, an upstream that echoes the turn — + * then sees a sentence the user never typed as if they had. A separate leading block carries the + * same signal to the filter while the original text survives byte-for-byte. + * + * Only the first user turn is framed, because only the first is what the gateway rejects. + */ +function applyAgentRouterLanguageFraming(messages: unknown[]): void { + const firstUser = messages.find( + (m): m is { role: string; content: unknown } => + typeof m === "object" && m !== null && (m as { role?: unknown }).role === "user", + ); + if (!firstUser) return; + const preamble = { type: "text", text: AGENTROUTER_LANGUAGE_PREAMBLE }; + if (typeof firstUser.content === "string") { + firstUser.content = firstUser.content === "" + ? [preamble] + : [preamble, { type: "text", text: firstUser.content }]; + return; + } + if (!Array.isArray(firstUser.content)) return; + // Idempotence is keyed on the LEADING block being exactly the marker. A substring test would + // let a user who quotes the marker later in their own prompt suppress the framing entirely. + const [head] = firstUser.content as { type?: unknown; text?: unknown }[]; + if (head?.type === "text" && head.text === AGENTROUTER_LANGUAGE_PREAMBLE) return; + (firstUser.content as unknown[]).unshift(preamble); +} + function messagesToAnthropicFormat( parsed: OcxParsedRequest, toolNames: { toWire: (name: string) => string }, @@ -833,6 +890,8 @@ export function createAnthropicAdapter(provider: OcxProviderConfig, cacheRetenti } const { system, messages } = messagesToAnthropicFormat(parsed, toolNames); + // Before image normalization, so the framing block is present for every downstream pass. + if (isAgentRouterEndpoint(provider.baseUrl)) applyAgentRouterLanguageFraming(messages); // Primary image layer: resize/re-encode to fit Anthropic limits without dropping // (anthropic-image-normalize.ts); the guard below remains the deterministic backstop. // imageTierBias > 0 = upstream-413 tightened retry (030): start every image one tier lower. diff --git a/tests/anthropic-agentrouter-language-framing.test.ts b/tests/anthropic-agentrouter-language-framing.test.ts new file mode 100644 index 0000000000..09782a6835 --- /dev/null +++ b/tests/anthropic-agentrouter-language-framing.test.ts @@ -0,0 +1,126 @@ +import { describe, expect, test } from "bun:test"; +import { createAnthropicAdapter as createAnthropicAdapterProduction } from "../src/adapters/anthropic"; +import { withTestTranslatorBudget } from "./helpers/translator-budget"; +import type { OcxMessage, OcxParsedRequest, OcxProviderConfig } from "../src/types"; + +const createAnthropicAdapter = (...args: Parameters) => + withTestTranslatorBudget(createAnthropicAdapterProduction(...args)); + +const PREAMBLE = "[Instruction: Process the user request below and respond in the appropriate language.]"; +const PORTUGUESE = "responda apenas: OK"; + +interface TextBlock { type: string; text?: string } +interface WireMessage { role: string; content: string | TextBlock[] } +interface WireBody { messages: WireMessage[] } + +function providerAt(baseUrl: string): OcxProviderConfig { + return { adapter: "anthropic", baseUrl, apiKey: "key", authMode: "key" }; +} + +function requestWith(messages: OcxMessage[]): OcxParsedRequest { + return { + modelId: "claude-opus-4-6", + stream: false, + context: { messages, tools: [] }, + options: {}, + }; +} + +async function bodyFor(baseUrl: string, messages: OcxMessage[]): Promise { + const req = await createAnthropicAdapter(providerAt(baseUrl)).buildRequest(requestWith(messages)); + return JSON.parse(req.body as string) as WireBody; +} + +/** + * The adapter also stamps `cache_control` onto the trailing block, which is orthogonal to this + * fix. Comparing the text sequence keeps these assertions about the framing and stops them from + * going red the next time the cache policy is tuned. + */ +function texts(message: WireMessage | undefined): (string | undefined)[] { + if (!message) throw new Error("expected a message at that index"); + if (typeof message.content === "string") return [message.content]; + return message.content.map(block => block.text); +} + +// AgentRouter answers 400 content-blocked when the first user message is not in English +// (#2074) while the identical English request returns 200. The gateway reads the opening user +// content, so the framing has to live in that turn -- an Anthropic `system` string never +// reaches the filter. Absorbed from #2082 by @yzxcj797. +describe("AgentRouter language framing", () => { + test("frames the first user turn without touching the user's own text", async () => { + const body = await bodyFor("https://agentrouter.org/v1", [{ role: "user", content: PORTUGUESE }]); + // The framing is its OWN block. Splicing it into the user's string would make every + // downstream reader -- logs, retries, an upstream that echoes the turn -- attribute a + // sentence to the user that they never typed. + expect(texts(body.messages[0])).toEqual([PREAMBLE, PORTUGUESE]); + }); + + test("an existing block array keeps every original block, in order, after the preamble", async () => { + const body = await bodyFor("https://agentrouter.org/v1", [ + { role: "user", content: [{ type: "text", text: "primeiro" }, { type: "text", text: "segundo" }] }, + ]); + expect(texts(body.messages[0])).toEqual([PREAMBLE, "primeiro", "segundo"]); + }); + + test("only the first user turn is framed", async () => { + const body = await bodyFor("https://agentrouter.org/v1", [ + { role: "user", content: PORTUGUESE }, + { role: "assistant", content: "OK" }, + { role: "user", content: "e agora?" }, + ]); + expect(texts(body.messages[0])).toEqual([PREAMBLE, PORTUGUESE]); + // Index-free on purpose: the adapter may coalesce adjacent turns, so the invariant is + // "exactly one preamble, on the opening turn", not "the preamble is absent at index 2". + const userTurns = body.messages.filter(m => m.role === "user"); + expect(texts(userTurns.at(-1))).toEqual(["e agora?"]); + expect(JSON.stringify(body.messages).split(PREAMBLE)).toHaveLength(2); + }); + + test("direct Anthropic is untouched", async () => { + const body = await bodyFor("https://api.anthropic.com/v1", [{ role: "user", content: PORTUGUESE }]); + expect(texts(body.messages[0])).toEqual([PORTUGUESE]); + expect(JSON.stringify(body)).not.toContain(PREAMBLE); + }); + + // A hostname.includes("agentrouter") test would match both of these, quietly injecting an + // instruction block into a destination that never asked for one. + test.each([ + "https://notagentrouter.example/v1", + "https://agentrouter.org.attacker.example/v1", + ])("a lookalike host is not treated as AgentRouter: %s", async baseUrl => { + const body = await bodyFor(baseUrl, [{ role: "user", content: PORTUGUESE }]); + expect(texts(body.messages[0])).toEqual([PORTUGUESE]); + expect(JSON.stringify(body)).not.toContain(PREAMBLE); + }); + + test("a real AgentRouter subdomain is still AgentRouter", async () => { + const body = await bodyFor("https://api.agentrouter.org/v1", [{ role: "user", content: PORTUGUESE }]); + expect(texts(body.messages[0])).toEqual([PREAMBLE, PORTUGUESE]); + }); + + test("building twice yields exactly one preamble each time", async () => { + const adapter = createAnthropicAdapter(providerAt("https://agentrouter.org/v1")); + for (const attempt of [0, 1]) { + const req = await adapter.buildRequest(requestWith([{ role: "user", content: PORTUGUESE }])); + const body = JSON.parse(req.body as string) as WireBody; + expect(texts(body.messages[0]).filter(t => t === PREAMBLE)).toHaveLength(1); + expect(attempt).toBeLessThan(2); + } + }); + + // Idempotence keyed on a substring would let a user who quotes the marker mid-prompt + // suppress their own framing, which is the failure the workaround exists to prevent. + test("a user quoting the marker later still gets the leading preamble", async () => { + const quoted = `o servidor respondeu ${PREAMBLE} e falhou`; + const body = await bodyFor("https://agentrouter.org/v1", [{ role: "user", content: quoted }]); + expect(texts(body.messages[0])).toEqual([PREAMBLE, quoted]); + }); + + // An assistant-only request is synthesized into a "(continue)" user turn upstream of this + // code, so the framing lands on that synthetic turn rather than on nothing. Pinned because it + // is the one case where the preamble is attached to text the user did not send. + test("an assistant-only request frames the synthesized continue turn", async () => { + const body = await bodyFor("https://agentrouter.org/v1", [{ role: "assistant", content: "só isso" }]); + expect(texts(body.messages[0])).toEqual([PREAMBLE, "(continue)"]); + }); +}); From a19140a61cd1d35e3acf1d1cd60c8715ae993aa4 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 08:14:07 +0900 Subject: [PATCH 22/88] docs(devlog): record the residual bug-PR dispositions and the wp15 outcome --- .../080_residual_dispositions.md | 166 ++++++++++++++++++ 1 file changed, 166 insertions(+) create mode 100644 devlog/_plan/260820_bug_pr_backlog_consolidation/080_residual_dispositions.md diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/080_residual_dispositions.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/080_residual_dispositions.md new file mode 100644 index 0000000000..e47d8aa35b --- /dev/null +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/080_residual_dispositions.md @@ -0,0 +1,166 @@ +# 080 — Residual dispositions: #2115, #2054, #2032, #2067, #2082, #2027, #2155 + +Unit: 260820_bug_pr_backlog_consolidation +Work-phases: wp15 (this doc's first three), wp16-wp19 (one PR each), wp20 (closeout). +Baseline: origin/dev; worktree branch `codex/fix-subagent-roster-truncation`. + +The wp1 rubric put six PRs below the 60 threshold and left them open. The user reviewed +that reasoning and issued explicit per-PR dispositions, plus one new arrival (#2155). This +doc records the dispositions and the evidence each one rests on. Evidence came from five +read-only gpt-5.6-sol investigation lanes that read every diff and the surrounding runtime. + +## wp15 — the three that need no new code + +### #2115 @louis-tepe — CLOSE + +The PR is titled as Code Mode edit guidance, but `src/adapters/openai-chat.ts:548` swaps the +local "hostname is exactly api.openai.com" test for a new `isCanonicalNativeOpenAIRoute` +predicate in `src/adapters/tool-catalog-nudge.ts:118-132`. That predicate is not +prompt-only. Through `messagesToChatFormat` (`openai-chat.ts:629`) it decides whether +developer messages stay as ordered `role: "developer"` entries or fold into the leading +system message; through `toolChoiceToChatFormat` (`:1232-1246`) it decides whether a single +required tool becomes a forced named function; and through `buildRequest` (`:1333`) it +decides native `reasoning_effort` versus gateway-style `reasoning`. One predicate change +therefore moves three wire semantics that have nothing to do with edit guidance. + +Second defect, independent of the first: `codeModeExecName` is withheld when a bare shell +bridge is present (`tool-catalog-nudge.ts:203-207`), but the new suffix injection checks +only `codeModeExecTool` (`:214-218`). A freeform `exec` sitting beside a top-level +`exec_command` still receives "targeted code edits" guidance even though the repository's +own predicate classifies that catalog as not Code Mode — a contract pinned at +`tests/tool-catalog-nudge.test.ts:114-123`. + +Blast radius if the guidance predicate is wrong: every routed Code Mode request on +Anthropic, Google/Vertex/Antigravity, Command Code, and every OpenAI-compatible host +without a literal `openai`/`chatgpt` DNS label — gateways, DeepSeek, Groq, Ollama, vLLM, +LM Studio, custom routes. Kiro (`src/adapters/kiro.ts:466-469`) picks up the reworded +generic sentence without being able to receive the suffix at all. + +The underlying request is legitimate. The implementation is not absorbable as-is because +the correct version is a narrower Code Mode seam that does not redefine native route +identity. + +### #2054 @keepitmello — STAY OPEN, probe requested + +The PR stores Cursor's returned `ConversationStateStructure` and replays it as the next +`AgentRunRequest.conversation_state` instead of rebuilding history every turn +(`src/adapters/cursor/protobuf-request.ts:823` on dev is the full-replay path). The +hypothesis is that full replay defeats Cursor's own checkpoint cache and produces the +large-context collapse in #1527. + +The PR proves the request construction changed — smaller `rootBytes` — and states plainly +that it did not reproduce the `kimi-k3` collapse or the 429. So the causal link is exactly +the thing still missing, and it is cheap for the author to capture: a matched three-turn +baseline-vs-head run at the issue's 75k-95k token shape, recording per turn the request +`conversation_id`, a digest and byte length of `conversation_state`, its +`root_prompt_messages_json` count, `turns` count, and `token_details.used_tokens`, against +the same fields on the response's `conversation_checkpoint_update`. The decisive comparison +is whether turn N+1's request state equals turn N's returned checkpoint while +`conversation_id` holds. `ocx debug provider on` / `ocx debug provider logs -f` +(`docs-site/src/content/docs/reference/cli/agents.md:102`, `src/lib/debug.ts:15`) already +carries the construction mode; exact state equality needs payload-free digests added +locally. + +Checkpoint reuse WITHOUT the collapse disappearing would refute the causal claim, which is +why the request is worth making rather than guessing. + +### #2032 @yzxcj797 — CLOSE + +This is a decision that was already made by a human, not a scoring call. The maintainer's +CHANGES_REQUESTED review says it directly: "Passing --dangerously-skip-permissions does not +create an OS sandbox" and "A viable revision needs a real sandboxed launch path, or it must +leave the vendor root guard intact." + +The diff injects `IS_SANDBOX=1` whenever the flag appears in argv (PR head +`src/cli/claude.ts:126-131`, `:329-331`) with no UID check and no sandbox establishment, +so it suppresses Claude Code's root guard while the child keeps ordinary root filesystem and +process access. The added tests (`tests/claude-cli.test.ts:271-295`) assert environment +assembly, not an isolation boundary. It also carries an unrelated `package.json` version +bump to 2.25.0. + +On dev, opencodex does not drop, refuse, or warn about the flag: `src/cli/dispatch.ts:500` +forwards trailing args and `src/cli/claude.ts:338` passes them through unchanged. The +refusal comes from Claude Code itself. A user who has genuinely isolated their environment +can already export `IS_SANDBOX=1`, because `buildClaudeEnv` starts from the caller's +environment (`src/cli/claude.ts:76`) and the docs promise exported variables win +(`docs-site/src/content/docs/guides/claude-code.md:56`). + +## wp15 outcome (executed) + +| PR | Action | Receipt | +|---|---|---| +| #2115 | CLOSED with reason | `issuecomment-5349122248`, state CLOSED | +| #2054 | comment only, left OPEN | `issuecomment-5349122708`, state OPEN | +| #2032 | CLOSED with reason | `issuecomment-5349122937`, state CLOSED | + +Verified by `gh pr view --json state` after the fact, not from the write's own exit code. + +## wp16 — #2067 @waw4303: ABSORB, and the reason is external corroboration + +The user's instruction was to check how **omniroute** — a separate open-source project +brokering free quota against the same upstream — builds these headers, then decide. That +turned out to be the decisive evidence, and it moved the answer. + +The PR head changed while the lane was reading it. The original commit `a5183abb` sent +`opencode-cli/1.0.0` / `cli` / `default`; the current head `6a79c42e` sends only +`User-Agent: opencode` alongside the existing `x-opencode-client: desktop`. + +omniroute (`diegosouzapw/OmniRoute`, commit `3d7ed7aa`, 2026-08-19) resolves the same +headers in `open-sse/executors/opencode.ts:408-448`: + +```ts +userAgent: process.env[envUAKey]?.trim() || process.env.OPENCODE_USER_AGENT?.trim() || "opencode", +client: process.env.OPENCODE_CLIENT?.trim() || "desktop", +project: process.env.OPENCODE_PROJECT?.trim() || "global", +``` + +It does not fetch or derive an installed CLI version at runtime. It falls back to a bare +unversioned `opencode`, preserves a real incoming `opencode-cli/` when one exists, +and lets an operator override via env. + +Three-way comparison: + +| Header | ours today | #2067 head | omniroute | +|---|---|---|---| +| `User-Agent` | absent (uncontrolled runtime default) | `opencode` | `opencode`, configurable, preserves real `opencode-cli/` | +| `x-opencode-client` | `desktop` | `desktop` | `desktop`, configurable | +| `x-opencode-project` | absent | absent | `global`, configurable | +| `x-opencode-request` | absent | absent | fresh UUID | +| `x-opencode-session` | absent | absent | conversation-derived or UUID | + +The important finding is the one that reverses a wp1 assumption. wp1 scored this 38 partly +because a pinned CLI version marker has a short shelf life — and that criticism was correct +against `a5183abb`. omniroute made the same mistake and then deliberately backed it out: +its July implementation (`234956dd`) used exactly `opencode-cli/1.0.0` / `cli` / `default`, +and PR #10571 replaced them with `opencode` / `desktop` / `global`. So the version pin is +not corroborated by an independent implementation; the *revised* values are, and by one that +arrived at them by retreating from the pin. + +That removes the "value with a short lifetime" objection entirely. What remains is a real +defect: we send no `User-Agent` at all today (`src/providers/registry.ts:2427`), so the +runtime default goes out uncontrolled, which is what the reporter's 429 is attributed to. + +Precedent for pinning a client fingerprint already exists here — Anthropic +(`src/adapters/anthropic.ts:936`, asserted at `tests/client-fingerprint.test.ts:120`), xAI +(`src/providers/xai-transport.ts:7`, `tests/xai-transport.test.ts:55`), Command Code with a +configurable fallback (`src/adapters/command-code.ts:482`). And the value stays +operator-overridable through the existing case-insensitive provider header override at +`src/server/management/provider-routes.ts:288`. + +Decision: **ABSORB the revised shape**, not the original. + +```ts +staticHeaders: { + "User-Agent": "opencode", + "x-opencode-client": "desktop", +} +``` + +Deliberately NOT copied from omniroute: `x-opencode-project`, `x-opencode-request`, +`x-opencode-session`. None is needed to fix the demonstrated failure, and adding a +conversation-derived session identifier is a privacy-relevant change that needs its own +evidence rather than a sibling project's precedent. + +## wp17-wp19 — the three that need new code + +Recorded here as each is decided; each is its own PABCD cycle. From 9e386201acdca53ada88db94e421afc9525d0eca Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 09:04:51 +0900 Subject: [PATCH 23/88] docs(devlog): record wp16 and the staticHeaders delivery bug it uncovered --- .../080_residual_dispositions.md | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/080_residual_dispositions.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/080_residual_dispositions.md index e47d8aa35b..460885e19f 100644 --- a/devlog/_plan/260820_bug_pr_backlog_consolidation/080_residual_dispositions.md +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/080_residual_dispositions.md @@ -161,6 +161,56 @@ Deliberately NOT copied from omniroute: `x-opencode-project`, `x-opencode-reques conversation-derived session identifier is a privacy-relevant change that needs its own evidence rather than a sibling project's precedent. +### wp16 outcome — and the bug the absorb uncovered + +**PR #2160**, branch `codex/absorb-opencode-free-static-headers`, base `dev`. #2067 closed +with attribution (`issuecomment-5349492578`). + +The audit is the interesting part. The plan as written — add the header to the registry row — +passed my own reading and FAILED the reviewer, correctly. `staticHeaders` is documented at +`registry.ts:149` as "merged into every upstream request for this provider", and that was +false. It was copied at seed time only: `providerConfigSeed` writes the block once, +`enrichProviderFromCatalog` fills it only when the whole block is absent, and nothing merged +it at request time. `rg -n 'headers' src/router.ts` returned zero hits. + +Reproduced directly before accepting the finding: + +| persisted config | `routedProviderConfig("opencode-free", ...).headers` | +|---|---| +| no headers block | `undefined` | +| `{x-opencode-client: desktop}` | unchanged — no UA | +| `{user-agent: custom-agent}` | unchanged — no client marker | + +So the contributor's one-line registry patch would have shipped a header that **no existing +install ever receives**. The management API strips a persisted block that exactly matches the +registry set, which means the most common on-disk state is "no headers at all" — and that +state gained nothing. + +Implementation, three parts: + +1. `mergeRegistryStaticHeaders(staticHeaders, userHeaders)` in `registry.ts` — registry values + fill only names the user has not claimed, compared **case-insensitively**. That last word is + load-bearing: HTTP header names are case-insensitive but object keys are not, so spreading a + registry `User-Agent` over a user's `user-agent` leaves both keys and `Headers` serializes + them as `"custom-agent, opencode"` — a corrupted request wearing the costume of an override. +2. `routedProviderConfig` (`router.ts`) merges at resolve time. +3. `buildModelsRequest` (`oauth/index.ts`) does the same, because a provider identified as + `opencode` when it completes but anonymous when it lists its own models reads as two + different clients to a rate limiter. + +Residual, stated rather than skipped: `validateApiKey` (`key-providers.ts:102`) still sends +only `Authorization`. It is an auth probe by design; widening an auth-path request shape is a +separate change with its own review burden. + +Evidence: 6 new regressions; reverting only `router.ts` + `oauth/index.ts` while keeping the +registry header fails exactly 5 of them (13 pass / 5 fail), which is what makes them delivery +tests rather than restatements of the registry constant. Full suite 13519 pass / 10 skip / +0 fail across 856 files; typecheck and privacy scan clean. + +One existing expectation moved: `tests/management-provider-validation.test.ts` "provider PATCH +clear keeps registry static headers" now asserts the two-header set. That is the same edit +#2067 made, and it is the correct one — the test pins the registry-owned set, which grew. + ## wp17-wp19 — the three that need new code Recorded here as each is decided; each is its own PABCD cycle. From 4b9814c11489db02e7ca382c97e24f85e8e917e8 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 09:34:36 +0900 Subject: [PATCH 24/88] docs(devlog): record wp17 and plan wp18 --- .../080_residual_dispositions.md | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/080_residual_dispositions.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/080_residual_dispositions.md index 460885e19f..3aa59cc031 100644 --- a/devlog/_plan/260820_bug_pr_backlog_consolidation/080_residual_dispositions.md +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/080_residual_dispositions.md @@ -214,3 +214,61 @@ clear keeps registry static headers" now asserts the two-header set. That is the ## wp17-wp19 — the three that need new code Recorded here as each is decided; each is its own PABCD cycle. + +### wp17 — #2082 @yzxcj797: AgentRouter language framing + +**PR #2162**, branch `codex/absorb-agentrouter-language-framing`, base `dev`. #2082 closed +(`issuecomment-5349709140`). Fixes #2074. + +The diagnosis was the contributor's and it was correct: AgentRouter answers 400 +`content-blocked` on a non-English first user message while the same request in English +returns 200, and the filter reads that turn, so an Anthropic `system` string cannot reach it. + +Two corrections. + +**Host predicate.** `hostname.includes("agentrouter")` also matches `notagentrouter.example` +and `agentrouter.org.attacker.example`. This is a prompt mutation keyed on a provider's +identity, so the key has to be that identity exactly — otherwise an unrelated destination +quietly receives an injected instruction block. Now `agentrouter.org` or a real subdomain. + +**Where the marker goes.** The original spliced it into the user's string: +`firstUser.content = \`\${MARKER}\\n\\n\${firstUser.content}\``. That edits what the user +wrote, and every downstream reader then attributes a sentence to them that they never typed — +the hidden user-turn mutation named in #1804. The framing is now its own leading text block. +It still adds content to the user turn, which is unavoidable against a filter that reads the +first user message, but additive-and-visible is a different risk class than a silent rewrite. + +Idempotence is keyed on the LEADING block being exactly the marker, not a substring test: a +user who quotes the marker mid-prompt must not suppress their own framing. + +Evidence: 10 regressions; reverting only the adapter fails 7. The 3 that stay green are the +lookalike-host and direct-Anthropic cases — green on unpatched `dev` precisely because `dev` +frames nobody, which is what makes them guards against the substring predicate rather than +restatements of it. Full suite 13529 pass / 10 skip / 0 fail; typecheck and privacy clean. + +`CONFLICTING` was an inherited `package.json` bump alone; the Anthropic hunks merge cleanly. +No version change in the replacement. + +### wp18 — #2027 @yzxcj797: OpenCode Go quota, planned + +The investigation moved the answer here too. The real issue is #1924: sibling rows +(`opencode-go-2` … `-5`) show no quota in the dashboard and no rows in +`ocx provider quota --refresh --json`, because dispatch gates on the literal provider NAME at +`src/providers/quota.ts:2087`. + +The contributor's fix swaps that for a base-URL comparison. Closer, but it does not check the +adapter, so a row pointed at the canonical URL with a different adapter would be probed. + +The repository already has the exact predicate: `registryEntryForProviderDestination` +(`registry.ts:2678`) identifies a renamed fixed key provider by normalized endpoint + adapter ++ auth mode, and is already the convention for renamed rows +(`opencode-zen-rate-limit.ts:28-43`, `derive.ts:398-425`). + +Rejected alternative, recorded: `providerMatchesRegistryTransport("opencode-go", provider)` +would need `preserveCustomDestination: true` on the registry entry, which also changes ROUTING +for a same-named custom row (`router.ts:269-274` vs `:320-336`). That may be worth doing, but +not as a side effect of a quota fix. + +The defensive canonical-URL check inside `fetchOpenCodeGoQuota` (`quota.ts:485-494`) stays: it +is what stops an API key being sent to a non-canonical host, and it should not depend on the +dispatch predicate being correct. From 293494cfa0c89542320a14bb3af6e4a3f31935a2 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 09:44:17 +0900 Subject: [PATCH 25/88] fix(quota): identify OpenCode Go by where it routes, not what it is named A multi-account setup points several provider rows at the same OpenCode Go endpoint under names the registry has never heard of -- opencode-go-2 through -5. Quota dispatch gated on the literal name "opencode-go", so those rows had no dashboard quota panel and no report in `ocx provider quota --refresh --json` even though each one holds a working key for the same upstream (#1924). Identity is now answered by registryEntryForProviderDestination, the predicate this repository already uses for renamed fixed-key rows: it matches on normalized endpoint plus adapter plus key auth. A bare URL comparison would have been enough for the reported symptom but would also probe a row that points at that host through a different adapter, which speaks a different protocol and is not the provider whose quota shape we parse. The defensive canonical-URL check inside fetchOpenCodeGoQuota stays. Whether an API key may be sent to a host must not depend on the dispatch gate above it being correct. Absorbed from #2027 by @yzxcj797. --- src/providers/quota.ts | 11 +++++-- tests/opencode-go-quota.test.ts | 57 +++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 2 deletions(-) diff --git a/src/providers/quota.ts b/src/providers/quota.ts index bb3bab2837..24b06ef7a9 100644 --- a/src/providers/quota.ts +++ b/src/providers/quota.ts @@ -13,7 +13,7 @@ import { getAccountCredential, getAccountSet, getCredential } from "../oauth/sto import { antigravityUserAgent } from "../adapters/client-fingerprint"; import { apiKeyPoolEntryId } from "./api-keys"; import { XAI_GROK_CLIENT_VERSION, XAI_GROK_COMPATIBILITY } from "./xai-transport"; -import { getProviderRegistryEntry, providerCodexAccountMode } from "./registry"; +import { getProviderRegistryEntry, providerCodexAccountMode, registryEntryForProviderDestination } from "./registry"; import type { OcxConfig, OcxProviderConfig } from "../types"; import { isCanonicalOpenAiForwardProvider, OPENAI_CODEX_PROVIDER_ID } from "./openai-tiers"; import { @@ -2084,7 +2084,14 @@ async function maybeFetchProviderQuota( && isCanonicalCommandCodeBaseUrl(provider.baseUrl)) { return fetchCommandCodeQuota(name, provider); } - if ((provider.authMode ?? "key") === "key" && name === "opencode-go") { + // Identify OpenCode Go by where it routes, not by what the row is called. Multi-account + // setups keep the same destination under names like `opencode-go-2` (#1924), and those rows + // silently had no quota panel and no `ocx provider quota --json` report while the literal + // name was the gate. `registryEntryForProviderDestination` is the existing predicate for + // exactly this question: normalized endpoint + adapter + key auth, so a canonical URL behind + // a different adapter is still not OpenCode Go. The defensive URL check inside + // `fetchOpenCodeGoQuota` stays — sending a key anywhere must not depend on this gate. + if ((provider.authMode ?? "key") === "key" && registryEntryForProviderDestination(provider)?.id === "opencode-go") { return fetchOpenCodeGoQuota(name, provider); } if ((provider.authMode ?? "key") === "key" && isCanonicalA6apiBaseUrl(provider.baseUrl)) { diff --git a/tests/opencode-go-quota.test.ts b/tests/opencode-go-quota.test.ts index ece8d22b53..df2bb52525 100644 --- a/tests/opencode-go-quota.test.ts +++ b/tests/opencode-go-quota.test.ts @@ -87,4 +87,61 @@ describe("OpenCode Go provider quota", () => { expect(fetchCalls).toBe(0); expect(result.reports).toEqual([]); }); + + // #1924: a multi-account setup points several rows at the same OpenCode Go endpoint under + // names the registry has never heard of. Gating dispatch on the literal name `opencode-go` + // meant those rows had no dashboard quota panel and no `ocx provider quota --json` report, + // even though each one holds a working key for the same upstream. + test("a canonical sibling row under any name is probed and reported", async () => { + const bearers: string[] = []; + globalThis.fetch = (async (_input: RequestInfo | URL, init?: RequestInit) => { + const headers = init?.headers as Record | undefined; + if (headers?.Authorization) bearers.push(headers.Authorization); + return new Response(JSON.stringify({ + usage: { rolling: { status: "ok", percent: 12, resetsAt: "2026-08-12T20:00:00.000Z" } }, + }), { status: 200, headers: { "content-type": "application/json" } }); + }) as typeof fetch; + + const config = openCodeGoConfig(); + config.providers["opencode-go-2"] = { + adapter: "openai-chat", + authMode: "key", + baseUrl: "https://opencode.ai/zen/go/v1", + // Kept under the privacy scanner's bearer-token length floor: a longer fixture reads as + // a real credential to `privacy:scan` even inside a test. + apiKey: "sibling-secret", + }; + + const result = await fetchProviderQuotaReports(config, true); + + expect(result.reports.map(report => report.provider).sort()).toEqual(["opencode-go", "opencode-go-2"]); + expect(bearers.sort()).toEqual(["Bearer opencode-go-secret", "Bearer sibling-secret"]); + expect(JSON.stringify(result)).not.toContain("sibling-secret"); + }); + + // The distinction between "routes to the OpenCode Go endpoint" and "is the OpenCode Go + // provider": a bare URL match would probe this row, but a different adapter speaks a + // different protocol to that host and is not the provider whose quota shape we parse. + test("a canonical URL behind a different adapter is not OpenCode Go", async () => { + let fetchCalls = 0; + globalThis.fetch = (async () => { + fetchCalls += 1; + return new Response("{}", { status: 200, headers: { "content-type": "application/json" } }); + }) as typeof fetch; + + const result = await fetchProviderQuotaReports({ + defaultProvider: "not-really-go", + providers: { + "not-really-go": { + adapter: "anthropic", + authMode: "key", + baseUrl: "https://opencode.ai/zen/go/v1", + apiKey: "unrelated-secret", + }, + }, + } as OcxConfig, true); + + expect(fetchCalls).toBe(0); + expect(result.reports).toEqual([]); + }); }); From 772d375fed252f838c41b9315cf88046f64d192a Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 09:57:10 +0900 Subject: [PATCH 26/88] fix(openai-chat): treat a non-string repeat as padding once that field is known Some OpenAI-compatible streamers repeat an already-sent id, name, or arguments as a non-string placeholder on a continuation delta rather than as null. Validation ran before the pending-call lookup, so the whole turn died with a 502 and the tool never ran -- even though the value being repeated was already held in canonical form. The lookup now happens first and tolerance is per field, keyed on that field's own provenance. Two corrections on top of @waw4303's #2155. It gated arguments acceptance on the call having a canonical NAME. A name says nothing about whether arguments was ever sent as a string, so a real argument payload could be silently dropped. PendingToolCall now carries sawArgumentsString; an empty string counts, because it proves the upstream sent the field with the right wire type. It also left a non-string repeated id unconditionally terminal even after a canonical id was stored. Ids now follow the same rule as the other two. Diagnostics are passed from the rejection site instead of rescanned. A stateless rescan stops at the first structurally odd value, so a stream carrying accepted padding on call 0 and a real defect on call 1 blamed call 0. --- src/adapters/openai-chat.ts | 141 +++++++++++++++++++--------- tests/openai-chat-hardening.test.ts | 96 +++++++++++++++++++ 2 files changed, 191 insertions(+), 46 deletions(-) diff --git a/src/adapters/openai-chat.ts b/src/adapters/openai-chat.ts index c5338d5eaa..8e59559094 100644 --- a/src/adapters/openai-chat.ts +++ b/src/adapters/openai-chat.ts @@ -308,8 +308,13 @@ function invalidToolCallsEvent( rawToolCalls: unknown, mode: "stream" | "response", usage?: OcxUsage, + diagnosticOverride?: InvalidToolCallDiagnostic, ): Extract { - const diagnostic = diagnoseInvalidToolCalls(rawToolCalls, mode); + // The streamed accumulator knows things a rescan cannot: which field on which pending call + // was actually rejected. Without the override, a stream carrying accepted padding on call 0 + // and a real defect on call 1 blames call 0, because the stateless scan stops at the first + // structurally odd value it sees. + const diagnostic = diagnosticOverride ?? diagnoseInvalidToolCalls(rawToolCalls, mode); const detail = diagnostic ? ` (${diagnostic.reason}${diagnostic.callIndex !== undefined ? `; callIndex=${diagnostic.callIndex}` : ""}; valueType=${diagnostic.valueType})` : ""; @@ -527,9 +532,13 @@ function diagnoseInvalidToolCalls( return undefined; } -function logInvalidToolCalls(mode: "stream" | "response", rawToolCalls: unknown): void { +function logInvalidToolCalls( + mode: "stream" | "response", + rawToolCalls: unknown, + diagnosticOverride?: InvalidToolCallDiagnostic, +): void { if (!isDebugEnabled()) return; - const diagnostic = diagnoseInvalidToolCalls(rawToolCalls, mode); + const diagnostic = diagnosticOverride ?? diagnoseInvalidToolCalls(rawToolCalls, mode); if (!diagnostic) return; const fieldShape = fingerprintInvalidField(invalidToolCallField(rawToolCalls, diagnostic)); debugProviderDiagnostic("openai-chat", "invalid-tool-calls", { @@ -1499,7 +1508,20 @@ export function createOpenAIChatAdapter(provider: OcxProviderConfig): ProviderAd const budgetEncoder = new TextEncoder(); let buffer = ""; let bufferBytes = 0; - interface PendingToolCall { key: string; id: string; name: string; args: string; argsBytes: number } + interface PendingToolCall { + key: string; + id: string; + name: string; + args: string; + argsBytes: number; + /** + * Whether this call has ever received `arguments` as an actual string, empty included. + * An empty string still counts: it proves the upstream sent the field with the right + * wire type, which is what a later malformed repeat of that field would be padding for. + * A canonical NAME is not evidence about the ARGUMENTS field and must not stand in. + */ + sawArgumentsString: boolean; + } const pendingToolCalls: PendingToolCall[] = []; let toolCallSeq = 0; const closeToolCalls = (): PendingToolCall[] => { @@ -1613,61 +1635,88 @@ export function createOpenAIChatAdapter(provider: OcxProviderConfig): ProviderAd logInvalidToolCalls("stream", rawToolCalls); return yield* terminateWithError(invalidToolCallsEvent(rawToolCalls, "stream", pendingUsage)); } - for (const rawToolCall of rawToolCalls) { + for (let callIndex = 0; callIndex < rawToolCalls.length; callIndex++) { + const rawToolCall: unknown = rawToolCalls[callIndex]; if (!isRecord(rawToolCall)) { - logInvalidToolCalls("stream", rawToolCalls); - return yield* terminateWithError(invalidToolCallsEvent(rawToolCalls, "stream", pendingUsage)); + const diagnostic: InvalidToolCallDiagnostic = { + reason: "tool_call_not_object", + callIndex, + valueType: rawToolCall === null ? "null" : Array.isArray(rawToolCall) ? "array" : typeof rawToolCall, + }; + logInvalidToolCalls("stream", rawToolCalls, diagnostic); + return yield* terminateWithError(invalidToolCallsEvent(rawToolCalls, "stream", pendingUsage, diagnostic)); } - const tc = rawToolCall as { - index?: number; - id?: string; - function?: { name?: string; arguments?: string }; - }; - // That cast is a TypeScript convenience, not a runtime guarantee: this is - // upstream JSON. Validate the fields before they are stored, so a non-string - // name or arguments value fails closed through the #1325 channel here rather - // than escaping later as a TypeError from string handling at flush time. - const rawFunction = (rawToolCall as { function?: unknown }).function; - if (rawFunction !== undefined && rawFunction !== null) { - if (!isRecord(rawFunction)) { - logInvalidToolCalls("stream", rawToolCalls); - return yield* terminateWithError(invalidToolCallsEvent(rawToolCalls, "stream", pendingUsage)); - } - const rawName = rawFunction.name; - const rawArguments = rawFunction.arguments; - // Some OpenAI-compatible streamers repeat already-sent fields as null on - // continuation deltas. Treat only null/undefined as absent; every other - // non-string value still fails closed before entering the accumulator. - if (isInvalidStreamStringField(rawName) || isInvalidStreamStringField(rawArguments)) { - logInvalidToolCalls("stream", rawToolCalls); - return yield* terminateWithError(invalidToolCallsEvent(rawToolCalls, "stream", pendingUsage)); - } + // This is upstream JSON, so every field is validated before it is stored: a + // malformed value must fail closed through the #1325 channel here rather than + // escaping later as a TypeError from string handling at flush time. + const rawFunction = rawToolCall.function; + if (rawFunction !== undefined && rawFunction !== null && !isRecord(rawFunction)) { + const diagnostic: InvalidToolCallDiagnostic = { + reason: "tool_call_function_not_object", + callIndex, + valueType: Array.isArray(rawFunction) ? "array" : typeof rawFunction, + }; + logInvalidToolCalls("stream", rawToolCalls, diagnostic); + return yield* terminateWithError(invalidToolCallsEvent(rawToolCalls, "stream", pendingUsage, diagnostic)); } - if (isInvalidStreamStringField(tc.id)) { - logInvalidToolCalls("stream", rawToolCalls); - return yield* terminateWithError(invalidToolCallsEvent(rawToolCalls, "stream", pendingUsage)); - } - const key = typeof tc.index === "number" - ? `i:${tc.index}` - : tc.id - ? `id:${tc.id}` + const fnRecord = isRecord(rawFunction) ? rawFunction : undefined; + const rawName = fnRecord?.name; + const rawArguments = fnRecord?.arguments; + const rawId = rawToolCall.id; + const idDelta = typeof rawId === "string" ? rawId : ""; + const rawIndex = rawToolCall.index; + + // Resolve the pending call BEFORE judging the fields. Some OpenAI-compatible + // streamers repeat an already-sent field as a non-string placeholder on a + // continuation delta; judging first meant the whole stream died with a 502 even + // though the value being repeated was already held in canonical form. + const key = typeof rawIndex === "number" + ? `i:${rawIndex}` + : idDelta + ? `id:${idDelta}` : pendingToolCalls[pendingToolCalls.length - 1]?.key; let call = key !== undefined ? pendingToolCalls.find(c => c.key === key) : undefined; - if (!call && tc.id) call = pendingToolCalls.find(c => c.id === tc.id); + if (!call && idDelta) call = pendingToolCalls.find(c => c.id === idDelta); if (!call) { - call = { key: key ?? `seq:${pendingToolCalls.length}`, id: "", name: "", args: "", argsBytes: 0 }; + call = { + key: key ?? `seq:${pendingToolCalls.length}`, + id: "", + name: "", + args: "", + argsBytes: 0, + sawArgumentsString: false, + }; pendingToolCalls.push(call); budget.openCall(call.key); } - if (tc.id && !call.id) call.id = tc.id; - if (tc.function?.name && !call.name) call.name = tc.function.name; - if (tc.function?.arguments) { + + // Tolerance is per FIELD, keyed on that field's own provenance. A canonical name + // says nothing about whether `arguments` was ever sent as a string, so it cannot + // authorize a malformed arguments value — that would silently drop a real + // argument payload the model intended to send. + const rejection: InvalidToolCallDiagnostic | undefined = + isInvalidStreamStringField(rawName) && call.name.trim() === "" + ? { reason: "tool_call_function_name_invalid", callIndex, valueType: typeof rawName } + : isInvalidStreamStringField(rawArguments) && !call.sawArgumentsString + ? { reason: "tool_call_function_arguments_invalid", callIndex, valueType: typeof rawArguments } + : isInvalidStreamStringField(rawId) && call.id === "" + ? { reason: "tool_call_id_invalid", callIndex, valueType: typeof rawId } + : undefined; + if (rejection) { + logInvalidToolCalls("stream", rawToolCalls, rejection); + return yield* terminateWithError(invalidToolCallsEvent(rawToolCalls, "stream", pendingUsage, rejection)); + } + + if (idDelta && !call.id) call.id = idDelta; + if (typeof rawName === "string" && rawName && !call.name) call.name = rawName; + if (typeof rawArguments === "string") call.sawArgumentsString = true; + if (typeof rawArguments === "string" && rawArguments) { const previousBytes = call.argsBytes; - const nextBytes = previousBytes + budgetEncoder.encode(tc.function.arguments).byteLength; + const nextBytes = previousBytes + budgetEncoder.encode(rawArguments).byteLength; const scope = { kind: "tool_args" as const, callId: call.key }; const reservation = budget.reserveTransient(nextBytes, scope); try { - call.args += tc.function.arguments; + call.args += rawArguments; reservation.commitRetained(); budget.releaseRetained(previousBytes, scope); call.argsBytes = nextBytes; diff --git a/tests/openai-chat-hardening.test.ts b/tests/openai-chat-hardening.test.ts index f7435e0a28..81671b0968 100644 --- a/tests/openai-chat-hardening.test.ts +++ b/tests/openai-chat-hardening.test.ts @@ -476,6 +476,102 @@ describe("openai-chat stream response hardening", () => { expect(lines).toContain('"callIndex":1'); expect(lines).not.toContain('"tool_call_function_name_invalid"'); }); + + // Some OpenAI-compatible streamers repeat an already-sent field as a non-string placeholder + // instead of null. Before #2155 that killed the whole turn with a 502 even though the value + // being repeated was already held in canonical form, so the tool never ran. + test("a non-string repeat is padding once that field has string provenance (#2155)", async () => { + const adapter = createOpenAIChatAdapter(provider()); + const response = new Response([ + `data: ${JSON.stringify({ choices: [{ delta: { tool_calls: [ + { index: 0, id: "call_a", function: { name: "shell", arguments: "" } }, + ] } }] })}\n\n`, + `data: ${JSON.stringify({ choices: [{ delta: { tool_calls: [ + { index: 0, id: { padding: true }, function: { name: { padding: true }, arguments: { padding: true } } }, + ] } }] })}\n\n`, + `data: ${JSON.stringify({ choices: [{ delta: { tool_calls: [ + { index: 0, function: { arguments: "{}" } }, + ] } }] })}\n\n`, + 'data: {"choices":[{"delta":{},"finish_reason":"tool_calls"}]}\n\n', + "data: [DONE]\n\n", + ].join("")); + + const events = await collect(adapter.parseStream(response)); + expect(events.some(event => event.type === "error")).toBe(false); + expect(events).toContainEqual({ type: "tool_call_start", id: "call_a", name: "shell" }); + expect(events).toContainEqual({ type: "tool_call_delta", arguments: "{}" }); + }); + + // Tolerance is per field. A canonical NAME is not evidence that `arguments` was ever sent + // as a string, and accepting a malformed object here would silently discard an argument + // payload the model meant to send. + test("a canonical name does not authorize a malformed arguments value (#2155)", async () => { + const adapter = createOpenAIChatAdapter(provider()); + const response = new Response([ + `data: ${JSON.stringify({ choices: [{ delta: { tool_calls: [ + { index: 0, id: "call_a", function: { name: "shell" } }, + ] } }] })}\n\n`, + `data: ${JSON.stringify({ choices: [{ delta: { tool_calls: [ + { index: 0, function: { arguments: { bad: true } } }, + ] } }] })}\n\n`, + "data: [DONE]\n\n", + ].join("")); + + expect(await collect(adapter.parseStream(response))).toEqual([{ + type: "error", + status: 502, + errorType: "upstream_error", + message: "upstream response contained invalid tool calls (tool_call_function_arguments_invalid; callIndex=0; valueType=object)", + }]); + }); + + test("a malformed id stays terminal until that call has a canonical id (#2155)", async () => { + const adapter = createOpenAIChatAdapter(provider()); + const response = new Response([ + `data: ${JSON.stringify({ choices: [{ delta: { tool_calls: [ + { index: 0, function: { name: "shell", arguments: "{}" } }, + ] } }] })}\n\n`, + `data: ${JSON.stringify({ choices: [{ delta: { tool_calls: [ + { index: 0, id: { bad: true } }, + ] } }] })}\n\n`, + "data: [DONE]\n\n", + ].join("")); + + expect(await collect(adapter.parseStream(response))).toEqual([{ + type: "error", + status: 502, + errorType: "upstream_error", + message: "upstream response contained invalid tool calls (tool_call_id_invalid; callIndex=0; valueType=object)", + }]); + }); + + // The reason the diagnostic is passed from the rejection site rather than rescanned: a + // stateless rescan stops at the first structurally odd value, which here is the ACCEPTED + // padding on call 0, and would blame the wrong call for the real defect on call 1. + test("parallel calls blame the unresolved call, not the accepted padding (#2155)", async () => { + process.env.OCX_DEBUG = "1"; + const adapter = createOpenAIChatAdapter(provider()); + const response = new Response([ + `data: ${JSON.stringify({ choices: [{ delta: { tool_calls: [ + { index: 0, id: "call_a", function: { name: "alpha", arguments: "" } }, + { index: 1, id: "call_b", function: { name: "beta" } }, + ] } }] })}\n\n`, + `data: ${JSON.stringify({ choices: [{ delta: { tool_calls: [ + { index: 0, function: { arguments: { padding: true } } }, + { index: 1, function: { arguments: { bad: true } } }, + ] } }] })}\n\n`, + "data: [DONE]\n\n", + ].join("")); + + expect(await collect(adapter.parseStream(response))).toEqual([{ + type: "error", + status: 502, + errorType: "upstream_error", + message: "upstream response contained invalid tool calls (tool_call_function_arguments_invalid; callIndex=1; valueType=object)", + }]); + const lines = getDebugLogEntries().map(entry => entry.line).join("\n"); + expect(lines).toContain('"callIndex":1'); + }); }); describe("openai-chat credential hardening", () => { From 9a9c090727c5785e35f2e9df841b506a4107a442 Mon Sep 17 00:00:00 2001 From: Nguyen Thanh Dat Date: Wed, 19 Aug 2026 22:14:40 +0700 Subject: [PATCH 27/88] test(ws-upstream): hold the eager-relay marker to the win32 rule, not to a constant `tests/ws-upstream.test.ts` has two cases failing on Windows since 5a75e57f: (fail) an HTTP fallback remains on the configured legacy tee path (fail) an older runtime stays on HTTP SSE without opening a WebSocket Measured, not inferred -- both bisect endpoints were run rather than assumed: dec332c49 23 pass / 0 fail 5a75e57ff 21 pass / 2 fail fix(grok): ... backfill required annotations That commit adds `createResponsesFieldBackfillBlockRewrite()` to `blockRewrites` unconditionally, and the factory returns an `SseBlockRewrite` rather than `undefined`, so the chain is never empty and `needsClientRewrite` in `handleResponses` is now a constant `true`. `isWin32EagerRewrite` is `platform === "win32" && needsClientRewrite` (src/lib/bun-stream-caps.ts:126), so on Windows every Responses stream now takes the eager single-reader relay -- which is exactly what #864 asks for, since all traffic is now rewrite traffic. Instrumented at the gate to confirm the mechanism rather than deduce it: [EAGER] {"forceCodexWsEagerRelay":false,"useEagerRelay":null, "win32EagerRewrite":true,"needsClientRewrite":true, "platform":"win32","blockRewrites":1} So the source behaviour is intended and the assertions are stale. Both cases are about the *WebSocket* path not being taken, and both already assert that directly through `FakeWebSocket.instances`; the `isEagerRelaySseResponse(...)` assertion was a second-order signal that stopped tracking WS selection on win32. Holds it to the documented rule instead of to `false`, so it stays honest on every platform rather than encoding a pre-backfill world. Adds one precondition case pinning the coupling itself -- the rewrite chain being non-empty, and the platform rule -- so if either half moves it fails somewhere that names the real cause instead of inside a WebSocket assertion. Tests only; no src change. 24 pass / 0 fail in the file (was 21/2), and the new case is mutation-checked: forcing `isWin32EagerRewrite` to `false` turns it red. 58 pass / 3 skip / 0 fail across ws-upstream, responses-field-backfill, responses-snapshot-repair-server and subagent-fallback-handle-responses. `bun run typecheck` exit 0. --- tests/ws-upstream.test.ts | 38 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/tests/ws-upstream.test.ts b/tests/ws-upstream.test.ts index 5f8782f271..6c89b590eb 100644 --- a/tests/ws-upstream.test.ts +++ b/tests/ws-upstream.test.ts @@ -2,6 +2,8 @@ import { afterEach, describe, expect, jest, test } from "bun:test"; import { providerFetch } from "../src/server/responses/fetch-helpers"; import { handleResponses } from "../src/server/responses"; import { isEagerRelaySseResponse } from "../src/server/relay"; +import { isWin32EagerRewrite } from "../src/lib/bun-stream-caps"; +import { createResponsesFieldBackfillBlockRewrite } from "../src/server/responses/responses-field-backfill"; import { bunSupportsBoundedCodexWsRelay, codexWsUpstreamFetch as rawCodexWsUpstreamFetch, @@ -17,6 +19,17 @@ import type { OcxConfig } from "../src/types"; const CODEX_URL = "https://chatgpt.com/backend-api/codex/responses"; const BOUNDED_WS_RUNTIME = "1.4.0"; +// #864 keeps win32 rewrite traffic out of the tee()+JS-pull chain, so +// `isWin32EagerRewrite(platform, needsClientRewrite)` sends it through the eager +// single-reader relay instead. Since the annotations backfill became an +// unconditional block rewrite (5a75e57f, `createResponsesFieldBackfillBlockRewrite()`), +// `needsClientRewrite` is true for every Responses stream — so on win32 the eager +// relay marker is set no matter which upstream transport was chosen. Cases below +// that are about *not* taking the WebSocket path assert that directly through +// `FakeWebSocket.instances`; they hold the marker to this rule rather than to a +// constant that only held before the backfill landed. +const EAGER_RELAY_FORCED_BY_PLATFORM = isWin32EagerRewrite(process.platform, true); + function shouldUseCodexWsUpstream(url: string, init?: RequestInit): boolean { return rawShouldUseCodexWsUpstream(url, init, BOUNDED_WS_RUNTIME); } @@ -288,7 +301,7 @@ describe("handleResponses Codex WS relay selection", () => { }); expect(FakeWebSocket.instances).toHaveLength(1); - expect(isEagerRelaySseResponse(response)).toBe(false); + expect(isEagerRelaySseResponse(response)).toBe(EAGER_RELAY_FORCED_BY_PLATFORM); expect(await response.text()).toContain("response.completed"); }); @@ -330,12 +343,33 @@ describe("handleResponses Codex WS relay selection", () => { const response = await handleResponses(request(), forwardConfig(), { model: "", provider: "" }); expect(FakeWebSocket.instances).toHaveLength(0); - expect(isEagerRelaySseResponse(response)).toBe(false); + expect(isEagerRelaySseResponse(response)).toBe(EAGER_RELAY_FORCED_BY_PLATFORM); expect(await response.text()).toContain("response.completed"); }, ); }); +describe("eager-relay marker preconditions", () => { + test("the client rewrite chain is never empty, so win32 always takes the eager path", () => { + // This is the coupling that silently changed the two cases above. + // `createResponsesFieldBackfillBlockRewrite()` is added to `blockRewrites` + // unconditionally and returns a rewrite rather than `undefined`, so + // `needsClientRewrite` in `handleResponses` is a constant `true`. Combined with + // the win32 rule that makes the eager relay the only safe path for rewrite + // traffic, every Responses stream on Windows is marked. If either half changes, + // this fails here rather than in an assertion that looks like it is about + // WebSocket selection. + expect(typeof createResponsesFieldBackfillBlockRewrite()).toBe("function"); + + expect(isWin32EagerRewrite("win32", true)).toBe(true); + expect(isWin32EagerRewrite("win32", false)).toBe(false); + expect(isWin32EagerRewrite("darwin", true)).toBe(false); + expect(isWin32EagerRewrite("linux", true)).toBe(false); + + expect(EAGER_RELAY_FORCED_BY_PLATFORM).toBe(process.platform === "win32"); + }); +}); + describe("codexWsUpstreamFetch", () => { test("relays event frames as an SSE response and sends one response.create frame", async () => { installFake(ws => { From 7bfcec4041f942b342cabb1cbad3eb4fe9973ffc Mon Sep 17 00:00:00 2001 From: Nguyen Thanh Dat Date: Thu, 20 Aug 2026 09:05:46 +0700 Subject: [PATCH 28/88] test(ws-upstream): prove the rewrite chain through handleResponses, not the factory The `eager-relay marker preconditions` test asserted only that `createResponsesFieldBackfillBlockRewrite()` returns a function. That would stay green if `handleResponses` stopped adding it to `blockRewrites`, so it did not actually protect the contract the two marker assertions depend on. Replace it with an integration case in the existing `handleResponses` describe: drive a Responses stream whose `output_text` part omits the required `annotations` field, then read the client bytes back. Seeing `annotations: []` there is only possible if the rewrite is registered and ran, which is exactly what makes `clientBlockRewrite !== undefined` and `needsClientRewrite === true`. The platform half stays a pure unit test on the real exported helper. Verified on win32, exact head: - bun run typecheck exit 0 - bun test tests/ws-upstream.test.ts 25 pass / 0 fail Mutation-checked: - dropping `createResponsesFieldBackfillBlockRewrite()` from `blockRewrites` fails the new case on `toHaveProperty("annotations")` (3 fail) - widening `isWin32EagerRewrite` past win32 fails the truth table (1 fail) Still test-only; no runtime change. --- tests/ws-upstream.test.ts | 64 +++++++++++++++++++++++++++++++-------- 1 file changed, 51 insertions(+), 13 deletions(-) diff --git a/tests/ws-upstream.test.ts b/tests/ws-upstream.test.ts index 6c89b590eb..2a6c747970 100644 --- a/tests/ws-upstream.test.ts +++ b/tests/ws-upstream.test.ts @@ -3,7 +3,6 @@ import { providerFetch } from "../src/server/responses/fetch-helpers"; import { handleResponses } from "../src/server/responses"; import { isEagerRelaySseResponse } from "../src/server/relay"; import { isWin32EagerRewrite } from "../src/lib/bun-stream-caps"; -import { createResponsesFieldBackfillBlockRewrite } from "../src/server/responses/responses-field-backfill"; import { bunSupportsBoundedCodexWsRelay, codexWsUpstreamFetch as rawCodexWsUpstreamFetch, @@ -347,20 +346,59 @@ describe("handleResponses Codex WS relay selection", () => { expect(await response.text()).toContain("response.completed"); }, ); -}); -describe("eager-relay marker preconditions", () => { - test("the client rewrite chain is never empty, so win32 always takes the eager path", () => { - // This is the coupling that silently changed the two cases above. - // `createResponsesFieldBackfillBlockRewrite()` is added to `blockRewrites` - // unconditionally and returns a rewrite rather than `undefined`, so - // `needsClientRewrite` in `handleResponses` is a constant `true`. Combined with - // the win32 rule that makes the eager relay the only safe path for rewrite - // traffic, every Responses stream on Windows is marked. If either half changes, - // this fails here rather than in an assertion that looks like it is about - // WebSocket selection. - expect(typeof createResponsesFieldBackfillBlockRewrite()).toBe("function"); + // The two cases above assert the marker against `EAGER_RELAY_FORCED_BY_PLATFORM`, + // which is only the right expectation while `needsClientRewrite` is genuinely + // `true`. Rather than assert that through the rewrite factory — which would stay + // green if `handleResponses` stopped registering it — this drives a real Responses + // stream through the handler and reads the rewrite's own effect off the client + // bytes. `createResponsesFieldBackfillBlockRewrite()` is the unconditional entry in + // `blockRewrites`, so observing its transformation is what proves + // `clientBlockRewrite !== undefined`, hence `needsClientRewrite === true`. + test("the registered rewrite chain transforms the client stream, so needsClientRewrite is true", async () => { + const upstreamEvent = { + type: "response.completed", + response: { + id: "r-backfill", + status: "completed", + // Deliberately spec-non-compliant: `annotations` is required on + // `output_text` and this upstream omits it. Only the backfill rewrite + // puts it back. + output: [{ + type: "message", + role: "assistant", + content: [{ type: "output_text", text: "hi" }], + }], + }, + }; + globalThis.fetch = (async () => new Response( + `event: response.completed\ndata: ${JSON.stringify(upstreamEvent)}\n\n`, + { status: 200, headers: { "content-type": "text/event-stream" } }, + )) as typeof fetch; + + const response = await handleResponses(request(), forwardConfig(), { model: "", provider: "" }); + const text = await response.text(); + + const payload = text + .split("\n") + .filter(line => line.startsWith("data: ") && line !== "data: [DONE]") + .map(line => JSON.parse(line.slice("data: ".length))) + .find(event => event.type === "response.completed"); + + expect(payload).toBeDefined(); + // Absent on the wire, present to the client: the chain ran. + expect(payload.response.output[0].content[0]).toHaveProperty("annotations"); + expect(payload.response.output[0].content[0].annotations).toEqual([]); + + // And with the chain proven non-empty, the marker is exactly the win32 rule. + expect(isEagerRelaySseResponse(response)).toBe(EAGER_RELAY_FORCED_BY_PLATFORM); + }); +}); +describe("isWin32EagerRewrite", () => { + test("marks rewrite traffic on win32 only", () => { + // #864 is a win32-only Bun sink defect, so the rule must not widen to other + // platforms, and must not fire when there is nothing to rewrite. expect(isWin32EagerRewrite("win32", true)).toBe(true); expect(isWin32EagerRewrite("win32", false)).toBe(false); expect(isWin32EagerRewrite("darwin", true)).toBe(false); From 8ff77e11ebe7bc6472164d29c89c779986b9469a Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 03:50:44 +0900 Subject: [PATCH 29/88] fix(responses): backfill missing ids on output items for strict decoders Some relays omit the required id on message, reasoning, and function_call output items, so strict decoders reject the response even after #1941. Synthesize a stable msg_ocx_N / rs_ocx_N / fc_ocx_N id keyed on output_index, and never overwrite an id the upstream actually sent. Carries @bet4it's #2131 implementation and tests. One correction on top: an absent or malformed output_index collapsed to 0, so two such items both became msg_ocx_0 - duplicate ids, which is the defect this backfill exists to prevent. An unusable index now falls back to a monotonic ordinal based far above any plausible real index, so a synthesized id cannot collide with an index-derived one. The well-formed path is unchanged and still produces the stable index-derived id. Locale docs are limited to the English source here; the translated guides in the original PR were uneven and locale parity is not this change's thesis. Closes #2131 --- .../src/content/docs/guides/grok-build.md | 21 +-- .../responses/responses-field-backfill.ts | 62 +++++- tests/responses-field-backfill.test.ts | 178 ++++++++++++++++++ 3 files changed, 244 insertions(+), 17 deletions(-) diff --git a/docs-site/src/content/docs/guides/grok-build.md b/docs-site/src/content/docs/guides/grok-build.md index 08a1073805..f1192b73e2 100644 --- a/docs-site/src/content/docs/guides/grok-build.md +++ b/docs-site/src/content/docs/guides/grok-build.md @@ -3,10 +3,10 @@ title: Grok Build description: Use any opencodex-routed model from xAI's Grok Build CLI — models are auto-registered into ~/.grok/config.toml while the proxy runs. --- -opencodex serves an OpenAI-compatible `POST /v1/chat/completions` (and `/v1/responses`) on its -local port, and Grok Build supports custom models against OpenAI-compatible servers. Starting -with this integration, opencodex registers its whole visible catalog into Grok Build -automatically — no manual config editing required. +opencodex serves an OpenAI-compatible `POST /v1/responses` on its local port, and Grok Build +supports custom models against OpenAI-compatible servers. Starting with this integration, +opencodex registers its whole visible catalog into Grok Build automatically — no manual config +editing required. ## Auto-registration @@ -18,7 +18,7 @@ into `~/.grok/config.toml`: [model.ocx-gpt-5-6-sol] model = "gpt-5.6-sol" base_url = "http://127.0.0.1:10100/v1" -api_backend = "chat_completions" +api_backend = "responses" api_key = "opencodex-loopback" name = "OCX gpt-5.6-sol" # ... one [model.ocx-*] table per visible model ... @@ -61,12 +61,11 @@ in Codex. Models with an empty tier list keep no effort control, matching Codex behavior. Native GPT-5.6 entries are separate: they preserve and expose their pinned upstream reasoning ladders rather than provider-configured routed metadata. -Grok Build talks to opencodex over Chat Completions and sends `reasoning_effort` when -the ladder is advertised. The Chat Completions inbound translator defaults the internal -Responses `reasoning.summary` to `auto` in that case, so thinking traces reach Grok as -`delta.reasoning_content` instead of being hidden. Set `include_reasoning: false` (or -`reasoning.summary: "none"`) if a client wants the model to think without returning the -trace. An explicit `reasoning.summary` wins when both knobs are present. +Grok Build talks to opencodex over the Responses API. When the route advertises a reasoning +ladder, the Responses passthrough forwards `reasoning.summary` as configured, so thinking +traces reach Grok natively as Responses reasoning items. Set `reasoning.summary: "none"` if +a client wants the model to think without returning the trace. An explicit `reasoning.summary` +wins over the route default. ## Authentication note diff --git a/src/server/responses/responses-field-backfill.ts b/src/server/responses/responses-field-backfill.ts index dff2da1158..67f6a1b796 100644 --- a/src/server/responses/responses-field-backfill.ts +++ b/src/server/responses/responses-field-backfill.ts @@ -29,6 +29,46 @@ function isPlainObject(value: unknown): value is Record { return !!value && typeof value === "object" && !Array.isArray(value); } +/** Wire prefixes for Responses output item ids, matching OpenAI's id shapes. */ +const ITEM_ID_PREFIXES: Readonly> = { + message: "msg_", + reasoning: "rs_", + function_call: "fc_", + web_search_call: "ws_", + file_search_call: "fs_", + code_interpreter_call: "ci_", + computer_call: "cc_", + image_gen_call: "ig_", +}; + +/** + * Backfill a required id on an output item when absent. Strict Responses + * decoders (e.g. grok-build serde types) fail with "missing field id" when a + * message or reasoning item has no id, which some upstream relays omit. The + * generated id is deterministic per (type, output index) so it stays stable + * across streaming events that reference the same item. + */ +function backfillItemId(item: Record, outputIndex: number): Record { + if (typeof item.id === "string" && item.id.length > 0) return item; + const type = typeof item.type === "string" ? item.type : ""; + const prefix = Object.prototype.hasOwnProperty.call(ITEM_ID_PREFIXES, type) ? ITEM_ID_PREFIXES[type] : "item_"; + return { ...item, id: prefix + "ocx_" + outputIndex }; +} + +/** + * Monotonic ordinal for an event whose `output_index` is absent or malformed. + * + * Starts far above any plausible real index so a synthesized id can never collide with an + * index-derived one inside the same response. Process-global rather than per-response because + * this module is stateless by design and the value only has to be unique, not meaningful. + */ +const SYNTHETIC_ITEM_ORDINAL_BASE = 1_000_000; +let syntheticItemOrdinal = 0; +function nextSyntheticItemOrdinal(): number { + syntheticItemOrdinal += 1; + return SYNTHETIC_ITEM_ORDINAL_BASE + syntheticItemOrdinal; +} + /** * Backfill annotations: [] on an output_text content part if missing. * Returns the same object reference if no change is needed. @@ -60,14 +100,16 @@ function backfillContentArray(content: unknown): unknown { /** * Walk an output item and backfill output_text parts in its content. + * Also backfills a missing required id on the item itself. * Returns the same object reference if nothing changed. */ -function backfillOutputItem(item: unknown): unknown { +function backfillOutputItem(item: unknown, outputIndex: number): unknown { if (!isPlainObject(item)) return item; const content = item.content; const repaired = backfillContentArray(content); - if (repaired === content) return item; - return { ...item, content: repaired }; + const withId = backfillItemId(item, outputIndex); + if (repaired === content && withId === item) return item; + return { ...withId, ...(repaired === content ? {} : { content: repaired }) }; } /** @@ -79,9 +121,9 @@ function backfillResponseOutput(response: unknown): unknown { const output = response.output; if (!Array.isArray(output)) return response; let changed = false; - const repaired = output.map((item) => { + const repaired = output.map((item, idx) => { if (!isPlainObject(item)) return item; - const next = backfillOutputItem(item); + const next = backfillOutputItem(item, idx); if (next !== item) changed = true; return next; }); @@ -100,7 +142,15 @@ function rewriteEvent(event: Record): Record { // output_item.added / output_item.done: item.content[] -> output_text parts if ((type === "response.output_item.added" || type === "response.output_item.done") && isPlainObject(event.item)) { - const item = backfillOutputItem(event.item); + const rawIndex = event.output_index; + // A malformed or absent `output_index` must not collapse to 0: two such events would then + // both synthesize `msg_ocx_0`, and duplicate ids are the very thing this backfill exists to + // prevent. Fall back to a per-process counter so the synthesized id stays unique. Position + // is not recoverable in that case, but a unique id is what strict decoders require, and a + // well-formed stream still gets the stable index-derived id. + const item = typeof rawIndex === "number" && Number.isInteger(rawIndex) && rawIndex >= 0 + ? backfillOutputItem(event.item, rawIndex) + : backfillOutputItem(event.item, nextSyntheticItemOrdinal()); if (item !== event.item) { next = { ...next, item }; changed = true; diff --git a/tests/responses-field-backfill.test.ts b/tests/responses-field-backfill.test.ts index 8071323e5a..022ff86e4f 100644 --- a/tests/responses-field-backfill.test.ts +++ b/tests/responses-field-backfill.test.ts @@ -170,4 +170,182 @@ describe("responses-field-backfill", () => { expect(result.output[0].content[3].annotations).toBe("not-an-array"); expect(result.output[0].content[4].annotations).toEqual({ unexpected: true }); }); + + test("backfills missing ids on response.completed output items", () => { + const event = { + type: "response.completed", + sequence_number: 42, + response: { + id: "resp_1", + object: "response", + status: "completed", + output: [ + { type: "reasoning", summary: [{ type: "summary_text", text: "thinking" }] }, + { + type: "message", + role: "assistant", + status: "completed", + content: [{ type: "output_text", text: "hello" }], + }, + { + type: "function_call", + call_id: "call_1", + name: "todo_write", + arguments: "{}", + }, + ], + }, + }; + const [out] = apply(sseBlock(event)); + const parsed = parseData([out])[0]; + expect(parsed.response.output[0].id).toBe("rs_ocx_0"); + expect(parsed.response.output[1].id).toBe("msg_ocx_1"); + expect(parsed.response.output[2].id).toBe("fc_ocx_2"); + }); + + test("preserves existing item ids", () => { + const event = { + type: "response.completed", + sequence_number: 42, + response: { + id: "resp_1", + object: "response", + status: "completed", + output: [ + { type: "message", id: "msg_real", role: "assistant", content: [{ type: "output_text", text: "hi" }] }, + ], + }, + }; + const [out] = apply(sseBlock(event)); + const parsed = parseData([out])[0]; + expect(parsed.response.output[0].id).toBe("msg_real"); + }); + + test("uses output_index when backfilling output_item.done id", () => { + const event = { + type: "response.output_item.done", + output_index: 3, + item: { + type: "message", + role: "assistant", + status: "completed", + content: [{ type: "output_text", text: "hi" }], + }, + }; + const [out] = apply(sseBlock(event)); + const parsed = parseData([out])[0]; + expect(parsed.item.id).toBe("msg_ocx_3"); + }); + + test("falls back to item_ prefix for inherited type names", () => { + const event = { + type: "response.output_item.done", + output_index: 0, + item: { + type: "toString", + role: "assistant", + status: "completed", + content: [{ type: "output_text", text: "hi" }], + }, + }; + const [out] = apply(sseBlock(event)); + const parsed = parseData([out])[0]; + expect(parsed.item.id).toBe("item_ocx_0"); + }); + + test("an invalid output_index still yields a well-formed synthesized id", () => { + for (const badIndex of [-1, 1.5, NaN, Infinity, "0", null, undefined]) { + const event = { + type: "response.output_item.done", + output_index: badIndex, + item: { + type: "message", + role: "assistant", + status: "completed", + content: [{ type: "output_text", text: "hi" }], + }, + }; + const [out] = apply(sseBlock(event)); + const parsed = parseData([out])[0]; + expect(parsed.item.id).toMatch(/^msg_ocx_\d+$/); + } + }); + + test("two items with an unusable output_index do not collide on one id", () => { + // Collapsing an unusable index to 0 would synthesize `msg_ocx_0` twice, which is the + // duplicate-id defect this backfill exists to prevent. Position is unrecoverable here; + // uniqueness is not optional. + const event = (text: string) => ({ + type: "response.output_item.done", + item: { + type: "message", + role: "assistant", + status: "completed", + content: [{ type: "output_text", text }], + }, + }); + const first = parseData(apply(sseBlock(event("one"))))[0]; + const second = parseData(apply(sseBlock(event("two"))))[0]; + + expect(first.item.id).toMatch(/^msg_ocx_\d+$/); + expect(second.item.id).toMatch(/^msg_ocx_\d+$/); + expect(first.item.id).not.toBe(second.item.id); + }); + + test("a well-formed output_index still produces the stable index-derived id", () => { + const event = { + type: "response.output_item.done", + output_index: 3, + item: { + type: "message", + role: "assistant", + status: "completed", + content: [{ type: "output_text", text: "hi" }], + }, + }; + // Stability across events referencing the same item is the whole point of index-derivation, + // so the fallback must not leak into the well-formed path. + expect(parseData(apply(sseBlock(event)))[0].item.id).toBe("msg_ocx_3"); + expect(parseData(apply(sseBlock(event)))[0].item.id).toBe("msg_ocx_3"); + }); + + test("backfillResponsesFieldsJson backfills missing ids on output items", () => { + const response = { + id: "resp_1", + object: "response", + status: "completed", + output: [ + { type: "reasoning", summary: [{ type: "summary_text", text: "thinking" }] }, + { + type: "message", + role: "assistant", + status: "completed", + content: [{ type: "output_text", text: "hello" }], + }, + { + type: "function_call", + call_id: "call_1", + name: "todo_write", + arguments: "{}", + }, + ], + }; + const result = JSON.parse(backfillResponsesFieldsJson(JSON.stringify(response))) as typeof response; + expect(result.output[0].id).toBe("rs_ocx_0"); + expect(result.output[1].id).toBe("msg_ocx_1"); + expect(result.output[2].id).toBe("fc_ocx_2"); + }); + + test("backfillResponsesFieldsJson preserves existing item ids", () => { + const response = { + id: "resp_1", + object: "response", + status: "completed", + output: [ + { type: "message", id: "msg_real", role: "assistant", content: [{ type: "output_text", text: "hi" }] }, + ], + }; + const result = JSON.parse(backfillResponsesFieldsJson(JSON.stringify(response))) as typeof response; + expect(result.output[0].id).toBe("msg_real"); + }); }); From 16345ab8b0a9e5d6fdc8a237786339b674fc374c Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 04:31:16 +0900 Subject: [PATCH 30/88] fix(responses): bridge routed tool_search through the Responses passthrough Passthrough forwarded Codex's private {type:"tool_search"} unchanged to third-party /v1/responses gateways, which only understand public function tools. The model never saw a callable tool_search and emitted zero tool_search_call items, so deferred tool discovery silently did nothing on every routed provider. Lower the private tool to a public function on noncanonical forward targets, rewrite tool_choice and replayed history to match, then restore the private tool_search_call lifecycle on the way back so Codex sees what it can execute. Canonical ChatGPT forward is untouched. Carries @Ingwannu's #2040 implementation and tests, with two corrections for findings that were still open on it: History-only replay. A turn may replay tool_search history without re-declaring the tool. The history was lowered either way, but restoration was armed only when a declaration was present, so the client got back a public function_call for what it had issued as a private search call. SSE overflow was not atomic. Both overflow branches cleared routedItemIds along with the pending buffer, so an item already restored to tool_search_call started emitting function_call_arguments frames again and the client saw a mixed private/public lifecycle for one call. Overflow now stops buffering unknown frames without forgetting what was already classified. Closes #1950 --- .../src/content/docs/ja/reference/adapters.md | 9 +- .../src/content/docs/ko/reference/adapters.md | 13 +- .../src/content/docs/reference/adapters.md | 13 +- .../content/docs/zh-cn/reference/adapters.md | 11 +- src/adapters/base.ts | 2 + src/adapters/openai-responses.ts | 10 + src/responses/parser.ts | 12 +- src/responses/tool-search-compat.ts | 301 +++++++++ src/server/responses-tool-search-repair.ts | 211 +++++++ src/server/responses/core.ts | 20 +- structure/04_transports-and-sidecars.md | 8 + tests/openai-responses-passthrough.test.ts | 30 + tests/responses-parser.test.ts | 22 + tests/responses-tool-search-repair.test.ts | 578 ++++++++++++++++++ 14 files changed, 1218 insertions(+), 22 deletions(-) create mode 100644 src/responses/tool-search-compat.ts create mode 100644 src/server/responses-tool-search-repair.ts create mode 100644 tests/responses-tool-search-repair.test.ts diff --git a/docs-site/src/content/docs/ja/reference/adapters.md b/docs-site/src/content/docs/ja/reference/adapters.md index e637c4cc26..54bd07eef8 100644 --- a/docs-site/src/content/docs/ja/reference/adapters.md +++ b/docs-site/src/content/docs/ja/reference/adapters.md @@ -43,8 +43,13 @@ interface ProviderAdapter { ## `openai-responses` -**対象:** OpenAI **Responses API**。**`passthrough: true`** — 元のリクエスト本文をそのまま渡し、レスポンスを **変換せずに** ストリーミングします。 -**認証:** `forward`(呼び出し元ヘッダー中継)または `key`。 +**対象:** OpenAI **Responses API**。**`passthrough: true`** — 通常は元のリクエストとレスポンスをそのまま渡し、ルーティング先ゲートウェイに必要な限定的な互換変換だけを適用します。 +**認証:** canonical OpenAI `forward` は安全な呼び出し元ヘッダー許可リストだけを中継します。非 canonical な `forward` は呼び出し元の authorization を中継せず、設定済みの静的ヘッダーだけを使用します。`key` は設定済み provider key を使用します。 + +非 canonical な Responses ゲートウェイには、Codex のクライアント実行型 `tool_search` +宣言を既存の公開 function tool と衝突しない名前で送り、対応するリクエスト履歴と JSON/SSE +function call をクライアント向けの非公開 `tool_search` ライフサイクルに復元します。 +canonical OpenAI forward はネイティブな非公開型を維持します。 `key` 認証では、[`retryOn429`](/ja/reference/configuration/) もここに適用されます: プリストリームの 429 は、翻訳された `openai-chat` / Anthropic リクエスト経路と同様に、他の処理やフェイルオーバーに diff --git a/docs-site/src/content/docs/ko/reference/adapters.md b/docs-site/src/content/docs/ko/reference/adapters.md index 58c61cd7e4..06eedf2773 100644 --- a/docs-site/src/content/docs/ko/reference/adapters.md +++ b/docs-site/src/content/docs/ko/reference/adapters.md @@ -49,9 +49,16 @@ interface ProviderAdapter { ## `openai-responses` -**대상:** OpenAI **Responses API**. **`passthrough: true`** — 원본 요청 본문을 전달하고 응답을 -**변환하지 않은 채** 스트리밍합니다. -**인증:** `forward`(호출자 헤더 중계) 또는 `key`. +**대상:** OpenAI **Responses API**. **`passthrough: true`** — 일반적으로 원본 요청과 응답을 +그대로 전달하되, 라우팅된 게이트웨이에 필요한 좁은 호환성 변환만 적용합니다. +**인증:** 정규 OpenAI `forward`는 안전한 호출자 헤더 허용 목록만 중계합니다. 비정규 +`forward`는 호출자 authorization을 중계하지 않고 설정된 정적 헤더만 사용하며, `key`는 +설정된 provider 키를 사용합니다. + +비정규 Responses 게이트웨이에는 Codex의 클라이언트 실행형 `tool_search` 선언을 공개 function +도구와 충돌하지 않는 이름으로 전달합니다. 일치하는 요청 기록과 JSON/SSE function call은 +클라이언트용 비공개 `tool_search` 수명 주기로 복원합니다. 정규 OpenAI forward 경로는 +네이티브 비공개 타입을 그대로 유지합니다. `key` 인증에서는 [`retryOn429`](/ko/reference/configuration/)도 여기에 적용됩니다: 사전 스트림 429는 번역된 `openai-chat`/Anthropic 요청 경로와 동일하게 다른 처리나 페일오버보다 먼저 diff --git a/docs-site/src/content/docs/reference/adapters.md b/docs-site/src/content/docs/reference/adapters.md index 8a9bd05c45..0895ad07e8 100644 --- a/docs-site/src/content/docs/reference/adapters.md +++ b/docs-site/src/content/docs/reference/adapters.md @@ -49,9 +49,16 @@ provider — xAI, Kimi, DeepSeek, GLM, Groq, OpenRouter, Ollama (local & cloud), ## `openai-responses` -**Targets:** the OpenAI **Responses API**. **`passthrough: true`** — forwards the raw request body and -streams the response back **untranslated**. -**Auth:** `forward` (relay the caller's headers) or `key`. +**Targets:** the OpenAI **Responses API**. **`passthrough: true`** — normally forwards the raw request +body and response, with narrow compatibility rewrites for routed gateways. +**Auth:** canonical OpenAI `forward` relays only the safe caller-header allowlist; noncanonical +`forward` uses configured static headers without relaying caller authorization; `key` uses the +configured provider key. + +Noncanonical Responses gateways receive Codex's client-executed `tool_search` declaration as a +collision-safe public function tool. Matching request history and JSON/SSE function calls are +translated back to the private `tool_search` lifecycle for the client. Canonical OpenAI forward +keeps the native private type unchanged. For `key` auth, [`retryOn429`](/reference/configuration/) applies here too: a pre-stream 429 waits and replays the identical request on the same key before any other handling, exactly like diff --git a/docs-site/src/content/docs/zh-cn/reference/adapters.md b/docs-site/src/content/docs/zh-cn/reference/adapters.md index 07dbfcf441..5786952810 100644 --- a/docs-site/src/content/docs/zh-cn/reference/adapters.md +++ b/docs-site/src/content/docs/zh-cn/reference/adapters.md @@ -45,9 +45,14 @@ interface ProviderAdapter { ## `openai-responses` -**目标:** OpenAI **Responses API**。**`passthrough: true`** —— 转发原始请求 body,并把响应 -**不经转换**地流式传回。 -**认证:** `forward`(转发调用方 header)或 `key`。 +**目标:** OpenAI **Responses API**。**`passthrough: true`** —— 通常原样转发请求与响应,仅对 +路由网关应用范围有限的兼容性转换。 +**认证:** 规范 OpenAI `forward` 只转发安全的调用方 header allowlist;非规范 `forward` 不会 +转发调用方 authorization,只使用已配置的静态 header;`key` 使用已配置的 provider key。 + +对于非规范 Responses 网关,Codex 的客户端执行型 `tool_search` 声明会作为公共 function tool +以不与现有 function 名称冲突的方式发送;匹配的请求历史和 JSON/SSE function call 会恢复为 +客户端私有的 `tool_search` 生命周期。规范 OpenAI forward 路径仍保持原生私有类型不变。 使用 `key` 认证时,[`retryOn429`](/zh-cn/reference/configuration/) 同样适用:流开始前的 429 会等待并先于其他处理或故障转移,在相同 key 上重放完全相同请求,与翻译后的 diff --git a/src/adapters/base.ts b/src/adapters/base.ts index 7d3a8be07b..faeea0e959 100644 --- a/src/adapters/base.ts +++ b/src/adapters/base.ts @@ -70,6 +70,8 @@ export interface AdapterRequest { body: string; /** Custom-tool names actually lowered to upstream function calls while building this request. */ convertedRoutedCustomToolNames?: ReadonlySet; + /** Client tool-search names actually lowered to upstream function calls for this request. */ + convertedRoutedToolSearchNames?: ReadonlySet; /** Releases observation of a serialized request body after its final fetch attempt settles. */ releaseBodyObservation?: () => void; /** Exact reasoning parameter emitted by the adapter, for request-log diagnostics only. */ diff --git a/src/adapters/openai-responses.ts b/src/adapters/openai-responses.ts index a8bbab8bfd..7bc0bf9cec 100644 --- a/src/adapters/openai-responses.ts +++ b/src/adapters/openai-responses.ts @@ -11,6 +11,7 @@ import { OCX_REASONING_PREFIX } from "../responses/reasoning-envelope"; import { modelRecordValue } from "../reasoning-effort"; import type { TranslatorBudget } from "../lib/translator-budget"; import { rewriteRoutedCustomToolsForUpstream } from "../responses/custom-tool-compat"; +import { rewriteRoutedToolSearchForUpstream } from "../responses/tool-search-compat"; import { openaiResponsesUrl } from "./openai-responses-url"; import { createAdapterTierMetadata, @@ -1468,6 +1469,7 @@ export function createResponsesPassthroughAdapter(provider: OcxProviderConfig): const forward = provider.authMode === "forward"; let convertedRoutedCustomToolNames: Set | undefined; + let convertedRoutedToolSearchNames: Set | undefined; const unexpandedMiss = !!parsed.previousResponseId && parsed._previousResponseInputExpanded !== true; let outBody = stripPreviousResponseId( parsed._rawBody, @@ -1522,6 +1524,13 @@ export function createResponsesPassthroughAdapter(provider: OcxProviderConfig): outBody = rewritten.body; convertedRoutedCustomToolNames = rewritten.names; } + if (!isCanonicalOpenAiForwardProvider(provider)) { + // Run after custom-tool lowering so the search compatibility layer can choose a + // collision-free public function name against the final routed function catalog. + const rewritten = rewriteRoutedToolSearchForUpstream(outBody); + outBody = rewritten.body; + convertedRoutedToolSearchNames = rewritten.names; + } const sanitizedBody = normalizeToolSchemas(stripSparkCompatibility(stripUnsupportedReasoningParams(stripItemIdsWhenUnstored(stripInvalidItemIds(stripUnsupportedHostedTools(sanitizeReasoningInputContent(scrubOcxCompactionItems(outBody), { preserveRawReasoningContent: provider.preserveResponsesReasoningContent === true }))))))); const finalBody = stripDisabledReasoningSummaries( normalizeConfiguredReasoningSummaryDelivery(sanitizedBody, provider, parsed.modelId), @@ -1549,6 +1558,7 @@ export function createResponsesPassthroughAdapter(provider: OcxProviderConfig): body, releaseBodyObservation, ...(convertedRoutedCustomToolNames ? { convertedRoutedCustomToolNames } : {}), + ...(convertedRoutedToolSearchNames ? { convertedRoutedToolSearchNames } : {}), ...(tierLog ? { tierLog } : {}), }; }, diff --git a/src/responses/parser.ts b/src/responses/parser.ts index ca9f425f29..ed7e83588c 100644 --- a/src/responses/parser.ts +++ b/src/responses/parser.ts @@ -20,6 +20,7 @@ import { previousResponseReplayPrefixLength } from "./state"; import { decodeReasoningEnvelope } from "./reasoning-envelope"; import { extractHostedWebSearch, WEB_SEARCH_TOOL_NAME } from "../web-search/synthetic-tool"; import { extractHostedImageGeneration, IMAGE_GEN_TOOL_NAME } from "../images/synthetic-tool"; +import { toolSearchDescription, toolSearchParameters } from "./tool-search-compat"; function isObj(v: unknown): v is Record { return typeof v === "object" && v !== null && !Array.isArray(v); @@ -214,15 +215,8 @@ function buildTools(tools: unknown[] | undefined): OcxTool[] | undefined { // Expose as a function so chat models can call it; the bridge relays it as a tool_search_call. out.push({ name: "tool_search", - description: (t.description as string) ?? "Search for additional tools to load for the next turn.", - parameters: (isObj(t.parameters) ? t.parameters : { - type: "object", - properties: { - query: { type: "string", description: "Search query for tools to load." }, - limit: { type: "number", description: "Maximum number of tools to return." }, - }, - required: ["query"], - }) as Record, + description: toolSearchDescription(t), + parameters: normalizeParameters(toolSearchParameters(t)), toolSearch: true, }); } diff --git a/src/responses/tool-search-compat.ts b/src/responses/tool-search-compat.ts new file mode 100644 index 0000000000..38eb6deb8b --- /dev/null +++ b/src/responses/tool-search-compat.ts @@ -0,0 +1,301 @@ +export const TOOL_SEARCH_FUNCTION_NAME = "tool_search"; +export const TOOL_SEARCH_DEFAULT_DESCRIPTION = "Search for additional tools to load for the next turn."; +const TOOL_SEARCH_WIRE_ALIAS_PREFIX = "opencodex_tool_search"; + +function isPlainObject(value: unknown): value is Record { + return !!value && typeof value === "object" && !Array.isArray(value); +} + +export function toolSearchDescription(tool: unknown): string { + return isPlainObject(tool) && typeof tool.description === "string" + ? tool.description + : TOOL_SEARCH_DEFAULT_DESCRIPTION; +} + +export function toolSearchParameters(tool: unknown): Record { + if (isPlainObject(tool) && isPlainObject(tool.parameters)) return tool.parameters; + // Fresh per parse/build: downstream normalizers are allowed to clone or extend schemas, and a + // shared mutable default would couple otherwise unrelated requests. + return { + type: "object", + properties: { + query: { type: "string", description: "Search query for tools to load." }, + limit: { type: "number", description: "Maximum number of tools to return." }, + }, + required: ["query"], + }; +} + +function collectToolDeclarationNames(tools: unknown[], names: Set, namespace?: string): void { + for (const tool of tools) { + if (!isPlainObject(tool) || tool.type === "tool_search") continue; + if (tool.type === "function" && isPlainObject(tool.function) && typeof tool.function.name === "string") { + names.add(tool.function.name); + } + if (typeof tool.name === "string") { + names.add(tool.name); + if (namespace) names.add(`${namespace}__${tool.name}`); + } + if (tool.type === "namespace" && Array.isArray(tool.tools)) { + collectToolDeclarationNames(tool.tools, names, typeof tool.name === "string" ? tool.name : undefined); + } + } +} + +function declaredToolNames(body: Record): Set { + const names = new Set(); + if (Array.isArray(body.tools)) collectToolDeclarationNames(body.tools, names); + if (Array.isArray(body.input)) { + for (const item of body.input) { + if (isPlainObject(item) && item.type === "additional_tools" && Array.isArray(item.tools)) { + collectToolDeclarationNames(item.tools, names); + } + } + } + return names; +} + +function hasToolSearchDeclaration(tools: unknown[]): boolean { + return tools.some(tool => isPlainObject(tool) && tool.type === "tool_search"); +} + +function chooseToolSearchWireName(usedNames: ReadonlySet): string { + if (!usedNames.has(TOOL_SEARCH_FUNCTION_NAME)) return TOOL_SEARCH_FUNCTION_NAME; + if (!usedNames.has(TOOL_SEARCH_WIRE_ALIAS_PREFIX)) return TOOL_SEARCH_WIRE_ALIAS_PREFIX; + for (let suffix = 2; ; suffix++) { + const candidate = `${TOOL_SEARCH_WIRE_ALIAS_PREFIX}_${suffix}`; + if (!usedNames.has(candidate)) return candidate; + } +} + +function rewriteToolList(tools: unknown[], wireName: string): { tools: unknown[]; changed: boolean } { + let changed = false; + const rewritten = tools.map(tool => { + if (!isPlainObject(tool) || tool.type !== "tool_search") return tool; + const { + execution: _execution, + defer_loading: _deferLoading, + ...rest + } = tool; + changed = true; + return { + ...rest, + type: "function", + name: wireName, + description: toolSearchDescription(tool), + parameters: toolSearchParameters(tool), + }; + }); + return changed ? { tools: rewritten, changed: true } : { tools, changed: false }; +} + +function rewriteToolChoice(choice: unknown, wireName: string): unknown { + if (!isPlainObject(choice)) return choice; + if (choice.type === "tool_search") { + return { type: "function", name: wireName }; + } + if (choice.type !== "allowed_tools" || !Array.isArray(choice.tools)) return choice; + let changed = false; + const tools = choice.tools.map(tool => { + if (!isPlainObject(tool) || tool.type !== "tool_search") return tool; + changed = true; + return { type: "function", name: wireName }; + }); + return changed ? { ...choice, tools } : choice; +} + +function toolChoiceAllowsPrivateSearch(choice: unknown): boolean { + if (choice === undefined || choice === null || choice === "auto" || choice === "required") return true; + if (choice === "none") return false; + if (!isPlainObject(choice)) return true; + if (choice.type === "tool_search") return true; + if (choice.type === "allowed_tools" && Array.isArray(choice.tools)) { + return choice.tools.some(tool => isPlainObject(tool) && tool.type === "tool_search"); + } + // A forced ordinary function named `tool_search` is distinct from the private tool kind. + return false; +} + +function upstreamToolSearchItemId(id: unknown): unknown { + if (typeof id !== "string") return id; + return id.startsWith("tsc_") ? `fc_${id.slice(4)}` : id; +} + +function toolSearchArgumentsText(value: unknown): string { + if (typeof value === "string") return value; + return JSON.stringify(isPlainObject(value) ? value : {}); +} + +function toolSearchOutputText(value: Record): string { + const payload: Record = { + tools: Array.isArray(value.tools) ? value.tools : [], + }; + if (typeof value.status === "string") payload.status = value.status; + return JSON.stringify(payload); +} + +function rewriteHistoryItem(item: Record, wireName: string): Record { + if (item.type === "tool_search_call") { + const { + execution: _execution, + arguments: argumentsValue, + id, + ...rest + } = item; + return { + ...rest, + type: "function_call", + ...(id === undefined ? {} : { id: upstreamToolSearchItemId(id) }), + name: wireName, + arguments: toolSearchArgumentsText(argumentsValue), + }; + } + if (item.type === "tool_search_output") { + const { + execution: _execution, + id: _id, + tools: _tools, + status: _status, + ...rest + } = item; + return { + ...rest, + type: "function_call_output", + output: toolSearchOutputText(item), + }; + } + return item; +} + +/** + * Third-party Responses gateways generally implement the public function-tool schema, not Codex's + * private client-executed `tool_search` declaration. Lower only request catalogs sent to a + * noncanonical upstream; the caller-facing response is restored separately. + */ +export function rewriteRoutedToolSearchForUpstream(body: unknown): { + body: unknown; + names: Set; +} { + const names = new Set(); + if (!isPlainObject(body)) return { body, names }; + + const topLevelSearch = Array.isArray(body.tools) && hasToolSearchDeclaration(body.tools); + const inputItems = Array.isArray(body.input) ? body.input : []; + const additionalSearch = inputItems.some(item => + isPlainObject(item) + && item.type === "additional_tools" + && Array.isArray(item.tools) + && hasToolSearchDeclaration(item.tools)); + const historySearch = inputItems.some(item => + isPlainObject(item) + && (item.type === "tool_search_call" || item.type === "tool_search_output")); + if (!topLevelSearch && !additionalSearch && !historySearch) return { body, names }; + + const wireName = chooseToolSearchWireName(declaredToolNames(body)); + const declarationChanged = topLevelSearch || additionalSearch; + + let tools = body.tools; + if (Array.isArray(tools)) { + const result = rewriteToolList(tools, wireName); + tools = result.tools; + } + + let input = body.input; + let historyLowered = false; + if (Array.isArray(input)) { + input = input.map(item => { + if (!isPlainObject(item)) return item; + if (item.type === "additional_tools" && Array.isArray(item.tools)) { + const result = rewriteToolList(item.tools, wireName); + return result.changed ? { ...item, tools: result.tools } : item; + } + const rewritten = rewriteHistoryItem(item, wireName); + if (rewritten !== item) historyLowered = true; + return rewritten; + }); + } + + // A turn can replay `tool_search_call` history WITHOUT re-declaring the tool — Codex normally + // sends the declaration, but a history-only body is legal. The history is lowered to + // `function_call` either way, so restoration has to be armed on that too: leaving `names` + // empty there would hand the client a public `function_call` for what it issued as a private + // search call, and the round trip would silently stop matching. + if ((declarationChanged || historyLowered) && toolChoiceAllowsPrivateSearch(body.tool_choice)) { + names.add(wireName); + } + const toolChoice = declarationChanged ? rewriteToolChoice(body.tool_choice, wireName) : body.tool_choice; + return { + body: { + ...body, + ...(tools !== body.tools ? { tools } : {}), + ...(input !== body.input ? { input } : {}), + ...(toolChoice !== body.tool_choice ? { tool_choice: toolChoice } : {}), + }, + names, + }; +} + +export function toolSearchItemId(id: unknown): unknown { + if (typeof id !== "string") return id; + return id.startsWith("fc_") ? `tsc_${id.slice(3)}` : id; +} + +function toolSearchArguments(value: unknown): Record { + if (isPlainObject(value)) return value; + if (typeof value !== "string" || value.length === 0) return {}; + try { + const parsed: unknown = JSON.parse(value); + return isPlainObject(parsed) ? parsed : {}; + } catch { + return {}; + } +} + +export function restoreRoutedToolSearchCalls( + value: unknown, + names: ReadonlySet, +): { value: unknown; changed: boolean } { + if (Array.isArray(value)) { + let changed = false; + const restored = value.map(entry => { + const result = restoreRoutedToolSearchCalls(entry, names); + changed ||= result.changed; + return result.value; + }); + return changed ? { value: restored, changed: true } : { value, changed: false }; + } + if (!isPlainObject(value)) return { value, changed: false }; + + let changed = false; + const restored: Record = {}; + for (const [key, entry] of Object.entries(value)) { + const result = restoreRoutedToolSearchCalls(entry, names); + restored[key] = result.value; + changed ||= result.changed; + } + + if (value.type === "function_call" && typeof value.name === "string" && names.has(value.name)) { + restored.type = "tool_search_call"; + restored.id = toolSearchItemId(value.id); + restored.execution = "client"; + restored.arguments = toolSearchArguments(value.arguments); + delete restored.name; + changed = true; + } + return changed ? { value: restored, changed: true } : { value, changed: false }; +} + +export function restoreRoutedToolSearchCallsInJson( + text: string, + names: ReadonlySet, +): string { + if (names.size === 0) return text; + let payload: unknown; + try { + payload = JSON.parse(text); + } catch { + return text; + } + const restored = restoreRoutedToolSearchCalls(payload, names); + return restored.changed ? JSON.stringify(restored.value) : text; +} diff --git a/src/server/responses-tool-search-repair.ts b/src/server/responses-tool-search-repair.ts new file mode 100644 index 0000000000..8aa5c48130 --- /dev/null +++ b/src/server/responses-tool-search-repair.ts @@ -0,0 +1,211 @@ +import { + isTranslatorBudgetExceededError, + type TranslatorBudget, +} from "../lib/translator-budget"; +import { + restoreRoutedToolSearchCalls, +} from "../responses/tool-search-compat"; +import { + replaceSseDataPayload, + sseDataPayload, + type SseBlockRewrite, +} from "./sse-payload-rewrite"; + +function isPlainObject(value: unknown): value is Record { + return !!value && typeof value === "object" && !Array.isArray(value); +} + +type PendingArgumentBlock = { + block: string; + itemId?: string; + outputIndex?: number; + retainedBytes: number; +}; + +const MAX_PENDING_ARGUMENT_FRAMES = 256; +const MAX_PENDING_ARGUMENT_BYTES = 1024 * 1024; + +/** + * Public Responses gateways stream a lowered search as a normal function lifecycle. Codex expects + * only `tool_search_call` items, so classify each item before dropping its function-argument + * frames. Unknown early argument frames stay bounded until their item arrives. + */ +export function createRoutedToolSearchRestoreBlockRewrite( + names: ReadonlySet, + budget?: TranslatorBudget, +): SseBlockRewrite { + const routedItemIds = new Set(); + const ordinaryItemIds = new Set(); + let pendingArguments: PendingArgumentBlock[] = []; + let pendingArgumentBytes = 0; + let passthrough = false; + let disposed = false; + + const releaseAll = (): void => { + if (disposed) return; + disposed = true; + if (pendingArgumentBytes > 0) { + budget?.releaseRetained(pendingArgumentBytes, { kind: "retained_collectors" }); + } + pendingArguments = []; + pendingArgumentBytes = 0; + routedItemIds.clear(); + ordinaryItemIds.clear(); + }; + + const retainPending = ( + block: string, + itemId: string | undefined, + outputIndex: number | undefined, + ): readonly string[] | null => { + const retainedBytes = Buffer.byteLength(block, "utf8"); + const overflow = pendingArguments.length >= MAX_PENDING_ARGUMENT_FRAMES + || pendingArgumentBytes + retainedBytes > MAX_PENDING_ARGUMENT_BYTES; + if (overflow) { + const flushed = [...pendingArguments.map(pending => pending.block), block]; + if (pendingArgumentBytes > 0) { + budget?.releaseRetained(pendingArgumentBytes, { kind: "retained_collectors" }); + } + pendingArguments = []; + pendingArgumentBytes = 0; + passthrough = true; + // Deliberately KEEP routedItemIds. Overflow means we stop buffering UNKNOWN frames, not + // that we forget what we already classified: an item restored to `tool_search_call` + // upstream of here would otherwise start emitting `function_call_arguments.*` again and + // the client would see a mixed private/public lifecycle for one call. + ordinaryItemIds.clear(); + return flushed; + } + if (retainedBytes > 0) { + try { + budget?.chargeRetained(retainedBytes, { kind: "retained_collectors" }); + } catch (error) { + if (!isTranslatorBudgetExceededError(error)) throw error; + const flushed = [...pendingArguments.map(pending => pending.block), block]; + if (pendingArgumentBytes > 0) { + budget?.releaseRetained(pendingArgumentBytes, { kind: "retained_collectors" }); + } + pendingArguments = []; + pendingArgumentBytes = 0; + passthrough = true; + // Same reasoning as the frame/byte overflow above: an already-restored routed item + // must keep its frames suppressed even once buffering stops. + ordinaryItemIds.clear(); + return flushed; + } + } + pendingArguments.push({ block, itemId, outputIndex, retainedBytes }); + pendingArgumentBytes += retainedBytes; + return null; + }; + + const takePending = ( + itemId: string | undefined, + outputIndex: number | undefined, + ): string[] => { + const matched: PendingArgumentBlock[] = []; + const remaining: PendingArgumentBlock[] = []; + for (const pending of pendingArguments) { + const matches = pending.itemId !== undefined + ? itemId !== undefined && pending.itemId === itemId + : outputIndex !== undefined && pending.outputIndex === outputIndex; + (matches ? matched : remaining).push(pending); + } + pendingArguments = remaining; + const retainedBytes = matched.reduce((total, pending) => total + pending.retainedBytes, 0); + if (retainedBytes > 0) { + budget?.releaseRetained(retainedBytes, { kind: "retained_collectors" }); + pendingArgumentBytes = Math.max(0, pendingArgumentBytes - retainedBytes); + } + return matched.map(pending => { + if (pending.itemId !== undefined || itemId === undefined) return pending.block; + const payload = sseDataPayload(pending.block); + if (payload === null) return pending.block; + try { + const parsed: unknown = JSON.parse(payload); + return isPlainObject(parsed) + ? replaceSseDataPayload(pending.block, JSON.stringify({ ...parsed, item_id: itemId })) + : pending.block; + } catch { + return pending.block; + } + }); + }; + + const rewrite: SseBlockRewrite = (block: string): readonly string[] => { + if (disposed) return [block]; + const payload = sseDataPayload(block); + if (payload === null || payload === "[DONE]") return [block]; + let parsed: unknown; + try { + parsed = JSON.parse(payload); + } catch { + return [block]; + } + if (!isPlainObject(parsed)) return [block]; + + const type = typeof parsed.type === "string" ? parsed.type : ""; + // After overflow we stop BUFFERING unknown frames, but an item already restored to + // `tool_search_call` must keep its public argument frames suppressed — otherwise the client + // receives a private item followed by `function_call_arguments.*` for the same id, which is + // exactly the mixed lifecycle this rewrite exists to prevent. Everything else passes through. + if (passthrough) { + const passthroughItemId = typeof parsed.item_id === "string" ? parsed.item_id : undefined; + const isArgumentEvent = type === "response.function_call_arguments.delta" + || type === "response.function_call_arguments.done"; + if (isArgumentEvent && passthroughItemId && routedItemIds.has(passthroughItemId)) return []; + return [block]; + } + const outputIndex = typeof parsed.output_index === "number" + && Number.isInteger(parsed.output_index) + && parsed.output_index >= 0 + ? parsed.output_index + : undefined; + if ( + (type === "response.output_item.added" || type === "response.output_item.done") + && isPlainObject(parsed.item) + && parsed.item.type === "function_call" + && typeof parsed.item.name === "string" + ) { + const itemId = typeof parsed.item.id === "string" ? parsed.item.id : undefined; + const routed = names.has(parsed.item.name); + if (itemId) { + if (routed) { + routedItemIds.add(itemId); + ordinaryItemIds.delete(itemId); + } else { + ordinaryItemIds.add(itemId); + routedItemIds.delete(itemId); + } + } + const pending = takePending(itemId, outputIndex); + const restored = routed ? restoreRoutedToolSearchCalls(parsed, names) : { value: parsed, changed: false }; + const restoredBlock = restored.changed + ? replaceSseDataPayload(block, JSON.stringify(restored.value)) + : block; + if (type === "response.output_item.done" && itemId) { + routedItemIds.delete(itemId); + ordinaryItemIds.delete(itemId); + } + return routed ? [restoredBlock] : [...pending, restoredBlock]; + } + + const itemId = typeof parsed.item_id === "string" ? parsed.item_id : undefined; + const argumentEvent = type === "response.function_call_arguments.delta" + || type === "response.function_call_arguments.done"; + if (argumentEvent && (!itemId || (!routedItemIds.has(itemId) && !ordinaryItemIds.has(itemId)))) { + return retainPending(block, itemId, outputIndex) ?? []; + } + if (argumentEvent && itemId && routedItemIds.has(itemId)) return []; + + const terminal = type === "response.completed" || type === "response.failed" || type === "response.incomplete"; + if (!terminal) return [block]; + const restored = restoreRoutedToolSearchCalls(parsed, names); + releaseAll(); + return restored.changed + ? [replaceSseDataPayload(block, JSON.stringify(restored.value))] + : [block]; + }; + rewrite.dispose = releaseAll; + return rewrite; +} diff --git a/src/server/responses/core.ts b/src/server/responses/core.ts index 9e2813d0b5..67f6c07ceb 100644 --- a/src/server/responses/core.ts +++ b/src/server/responses/core.ts @@ -267,6 +267,8 @@ import { } from "../sse-payload-rewrite"; import { restoreRoutedCustomCallsInJson } from "../../responses/custom-tool-compat"; import { createRoutedCustomToolRestoreBlockRewrite } from "../responses-custom-tool-repair"; +import { restoreRoutedToolSearchCallsInJson } from "../../responses/tool-search-compat"; +import { createRoutedToolSearchRestoreBlockRewrite } from "../responses-tool-search-repair"; import { collectDeclaredWireToolNames, createUndeclaredToolCallGuardBlockRewrite, @@ -2399,6 +2401,7 @@ async function handleResponsesInner( ? new Map() : imageGenToolCallAliases(toolBridgeMaps.toolNsMap, parsed._rawBody, translatorBudget); const routedCustomToolNames = new Set(); + const routedToolSearchNames = new Set(); // Local continuation cache for the ChatGPT passthrough. Codex WS turns chain with // previous_response_id, ocx converts them to internal HTTP requests, and the ChatGPT Codex // REST backend rejects the parameter — the adapter strips it in forward mode, so the ONLY @@ -2432,6 +2435,12 @@ async function handleResponsesInner( if (toolBridgeMaps.freeformToolNames.has(name)) routedCustomToolNames.add(name); } } + for (const name of request.convertedRoutedToolSearchNames ?? []) { + // The adapter already keeps this set empty when tool_choice forbids the private search. + // Its wire name may be collision-aliased, so comparing it to the caller-facing name here + // would incorrectly disable restoration for the exact ambiguous-name case the alias fixes. + routedToolSearchNames.add(name); + } // #1700: the bridged paths refuse a call to a tool the request never declared // (`declaredToolNames`, src/bridge.ts). The passthrough had no equivalent, so a routed // provider's top-level `apply_patch` — which under Codex code mode exists only as a nested @@ -2894,6 +2903,9 @@ async function handleResponsesInner( routedCustomToolNames.size > 0 ? createRoutedCustomToolRestoreBlockRewrite(routedCustomToolNames, translatorBudget) : undefined, + routedToolSearchNames.size > 0 + ? createRoutedToolSearchRestoreBlockRewrite(routedToolSearchNames, translatorBudget) + : undefined, githubCopilotRepairEnabled ? createGithubCopilotResponsesBlockRewrite(translatorBudget) : undefined, @@ -3091,9 +3103,13 @@ async function handleResponsesInner( restoreImageGenCallsInJson(text, imageGenCallAliases), routedCustomToolNames, ); + const restoredToolSearch = restoreRoutedToolSearchCallsInJson( + restored, + routedToolSearchNames, + ); const repaired = hasResponsesSnapshotRepair(route.provider.responsesSnapshotRepair) - ? repairResponsesSnapshotJson(restored, outboundRequestBody) - : restored; + ? repairResponsesSnapshotJson(restoredToolSearch, outboundRequestBody) + : restoredToolSearch; const modelRewritten = parsed._responseModelId !== undefined && parsed._responseModelId !== parsed.modelId ? rewriteResponsesModelJson(backfillResponsesFieldsJson(repaired), parsed._responseModelId) : backfillResponsesFieldsJson(repaired); diff --git a/structure/04_transports-and-sidecars.md b/structure/04_transports-and-sidecars.md index bdb0d15e0c..708140e828 100644 --- a/structure/04_transports-and-sidecars.md +++ b/structure/04_transports-and-sidecars.md @@ -31,6 +31,14 @@ Responses-compatible streaming output. - 다른 대안 대신 이 방식을 선택한 이유: Model guidance is not an enforcement boundary, while automatic translation would invent executable caller intent and arguments after generation. - 장점, 단점 및 영향: Streaming and non-streaming routed responses now fail closed with an actionable provider-contract error; providers that emit aliases they never advertised must correct their adapter mapping instead of relying on client abort behavior. +[Decision Log] +- 목적과 의도: Keep Codex client-side deferred tool discovery usable through third-party Responses-compatible gateways that implement public function tools but reject the private `tool_search` declaration. +- 기존 구현 및 제약 조건: The chat translation path already exposed search as a function and bridged its call back to `tool_search_call`; passthrough only promoted definitions returned by an earlier search, so it could not initiate discovery on a strict third-party Responses endpoint. +- 검토한 주요 대안: Require every gateway to implement Codex-private tool types; route affected models through `openai-chat`; lower the declaration only; lower the noncanonical request and restore both JSON and SSE response lifecycles. +- 선택한 방식: On noncanonical Responses passthrough only, lower an actually declared `tool_search` to a collision-free public function name, translate its replayed call/output history to public function pairs, record only caller-authorized request-local conversions, and restore matching JSON/SSE calls to client `tool_search_call` items. Canonical OpenAI forward remains byte-shape native. +- 다른 대안 대신 이 방식을 선택한 이유: Provider-specific workarounds fragment the contract, while unconditional restoration could turn an untrusted ordinary function call into a privileged client discovery action. +- 장점, 단점 및 영향: Strict third-party Responses gateways can start and continue deferred discovery without changing native ChatGPT behavior; ordinary same-named functions remain distinct, and the proxy performs a capped SSE lifecycle rewrite only when the request actually required compatibility translation. + The option-aware `openai` provider uses `openai-responses` with `authMode: "forward"`. Pool mode resolves main plus added accounts through affinity/quota/cooldown ownership; Direct forwards only the allowed Codex/OpenAI auth/session headers from the current request and short-circuits pool diff --git a/tests/openai-responses-passthrough.test.ts b/tests/openai-responses-passthrough.test.ts index c2e9d38a71..ed5c484d1a 100644 --- a/tests/openai-responses-passthrough.test.ts +++ b/tests/openai-responses-passthrough.test.ts @@ -346,6 +346,34 @@ describe("OpenAI Responses passthrough sanitization", () => { .not.toHaveProperty("defer_loading"); expect(namespace?.tools?.find(tool => tool.name === "deferred_read")) .not.toHaveProperty("defer_loading"); + expect(body.tools.find(tool => tool.name === "tool_search")).toMatchObject({ + type: "function", + name: "tool_search", + description: "Search deferred tools", + }); + }); + + test("noncanonical forward passthrough also lowers tool_search without caller credential relay", () => { + const adapter = createResponsesPassthroughAdapter({ + adapter: "openai-responses", + baseUrl: "https://provider.example/v1", + authMode: "forward", + headers: { authorization: "Bearer provider-static" }, + }); + const request = adapter.buildRequest({ + modelId: deferredToolBody.model, + context: { messages: [] }, + stream: true, + options: {}, + _rawBody: deferredToolBody, + }, { headers: new Headers({ authorization: "Bearer caller-secret" }) }); + const body = JSON.parse(request.body) as { tools: Array> }; + + expect(body.tools.find(tool => tool.name === "tool_search")).toMatchObject({ + type: "function", + name: "tool_search", + }); + expect(request.headers.authorization).toBe("Bearer provider-static"); }); test("canonical forward passthrough leaves tool-search loading to the native backend", () => { @@ -397,6 +425,8 @@ describe("OpenAI Responses passthrough sanitization", () => { "declared_deferred_read", "deferred_read", ]); + expect(additionalTools?.find(tool => tool.name === "tool_search")) + .toMatchObject({ type: "function", name: "tool_search" }); }); test("normalizes top-level function schemas in the serialized raw body (#745)", () => { diff --git a/tests/responses-parser.test.ts b/tests/responses-parser.test.ts index 1f5f991e14..f236a6f2e5 100644 --- a/tests/responses-parser.test.ts +++ b/tests/responses-parser.test.ts @@ -32,6 +32,28 @@ describe("Responses parser", () => { ]); }); + test("normalizes tool_search parameter schemas to the same object-root contract", () => { + const parsed = parseRequest({ + model: "test-model", + input: "find a tool", + tools: [{ + type: "tool_search", + parameters: { properties: { query: { type: "string" } }, required: ["query"] }, + }], + }); + + expect(parsed.context.tools).toEqual([{ + name: "tool_search", + description: "Search for additional tools to load for the next turn.", + parameters: { + type: "object", + properties: { query: { type: "string" } }, + required: ["query"], + }, + toolSearch: true, + }]); + }); + test("unwraps Chat-shaped function tools while retaining flat function tools", () => { const parameters = { type: "object", diff --git a/tests/responses-tool-search-repair.test.ts b/tests/responses-tool-search-repair.test.ts new file mode 100644 index 0000000000..c208d3c1d0 --- /dev/null +++ b/tests/responses-tool-search-repair.test.ts @@ -0,0 +1,578 @@ +import { describe, expect, test } from "bun:test"; +import { + restoreRoutedToolSearchCallsInJson, + rewriteRoutedToolSearchForUpstream, +} from "../src/responses/tool-search-compat"; +import { createRoutedToolSearchRestoreBlockRewrite } from "../src/server/responses-tool-search-repair"; +import { handleResponses } from "../src/server/responses"; +import type { OcxConfig } from "../src/types"; +import { createTestTranslatorBudget } from "./helpers/translator-budget"; + +function frame(event: string, payload: Record): string { + return `event: ${event}\ndata: ${JSON.stringify({ type: event, ...payload })}`; +} + +function dataPayload(block: string): Record { + const line = block.split(/\r?\n/).find(entry => entry.startsWith("data:")); + if (!line) throw new Error("missing SSE data line"); + return JSON.parse(line.slice(5).trim()) as Record; +} + +const searchTool = { + type: "tool_search", + execution: "client", + description: "Search deferred tools", + parameters: { + type: "object", + properties: { query: { type: "string" } }, + required: ["query"], + additionalProperties: false, + }, +}; + +function fixtureConfig(): OcxConfig { + return { + port: 0, + defaultProvider: "fixture", + providers: { + fixture: { + adapter: "openai-responses", + baseUrl: "https://fixture.test/v1", + authMode: "key", + apiKey: "fixture-key", + }, + }, + } as OcxConfig; +} + +describe("routed Responses tool-search compatibility", () => { + test("lowers top-level and Responses Lite declarations plus tool choice without mutating input", () => { + const raw = { + model: "deepseek-v4-flash", + input: [{ type: "additional_tools", tools: [searchTool] }], + tools: [searchTool, { type: "function", name: "ordinary", parameters: { type: "object" } }], + tool_choice: { + type: "allowed_tools", + mode: "required", + tools: [{ type: "tool_search" }, { type: "function", name: "ordinary" }], + }, + }; + + const rewritten = rewriteRoutedToolSearchForUpstream(raw); + const body = rewritten.body as { + tools: Array>; + input: Array<{ tools: Array> }>; + tool_choice: { mode: string; tools: Array> }; + }; + + expect(rewritten.names).toEqual(new Set(["tool_search"])); + expect(rewritten.body).not.toBe(raw); + expect(raw.tools[0]).toHaveProperty("type", "tool_search"); + expect(body.tools[0]).toEqual({ + type: "function", + name: "tool_search", + description: "Search deferred tools", + parameters: searchTool.parameters, + }); + expect(body.input[0]?.tools[0]).toMatchObject({ type: "function", name: "tool_search" }); + expect(body.tool_choice.mode).toBe("required"); + expect(body.tool_choice.tools[0]).toEqual({ type: "function", name: "tool_search" }); + expect(body.tools[1]).toEqual(raw.tools[1]); + }); + + test("does not mark an ordinary same-named function for privileged restoration", () => { + const raw = { + tools: [{ type: "function", name: "tool_search", parameters: { type: "object" } }], + }; + const rewritten = rewriteRoutedToolSearchForUpstream(raw); + + expect(rewritten.body).toBe(raw); + expect(rewritten.names).toEqual(new Set()); + }); + + test("aliases a private search away from an ordinary same-named function", () => { + const raw = { + tools: [ + searchTool, + { type: "function", name: "tool_search", parameters: { type: "object" } }, + ], + tool_choice: { + type: "allowed_tools", + mode: "required", + tools: [ + { type: "tool_search" }, + { type: "function", name: "tool_search" }, + ], + }, + }; + const rewritten = rewriteRoutedToolSearchForUpstream(raw); + const body = rewritten.body as { + tools: Array>; + tool_choice: { tools: Array> }; + }; + + expect(rewritten.names).toEqual(new Set(["opencodex_tool_search"])); + expect(body.tools[0]).toMatchObject({ type: "function", name: "opencodex_tool_search" }); + expect(body.tools[1]).toEqual(raw.tools[1]); + expect(body.tool_choice.tools).toEqual([ + { type: "function", name: "opencodex_tool_search" }, + { type: "function", name: "tool_search" }, + ]); + + const restored = JSON.parse(restoreRoutedToolSearchCallsInJson(JSON.stringify({ + output: [ + { type: "function_call", name: "opencodex_tool_search", arguments: "{}" }, + { type: "function_call", name: "tool_search", arguments: "{}" }, + ], + }), rewritten.names)) as { output: Array> }; + expect(restored.output[0]?.type).toBe("tool_search_call"); + expect(restored.output[1]).toMatchObject({ type: "function_call", name: "tool_search" }); + }); + + test("a forced ordinary same-named function does not authorize private-search restoration", () => { + const rewritten = rewriteRoutedToolSearchForUpstream({ + tools: [ + searchTool, + { type: "function", name: "tool_search", parameters: { type: "object" } }, + ], + tool_choice: { type: "function", name: "tool_search" }, + }); + const body = rewritten.body as { + tools: Array>; + tool_choice: Record; + }; + + expect(body.tools[0]).toMatchObject({ type: "function", name: "opencodex_tool_search" }); + expect(body.tool_choice).toEqual({ type: "function", name: "tool_search" }); + expect(rewritten.names).toEqual(new Set()); + }); + + test("rewrites prior private search history to public function call pairs", () => { + const previousTools = [{ type: "function", name: "deferred_read", parameters: { type: "object" } }]; + const rewritten = rewriteRoutedToolSearchForUpstream({ + tools: [searchTool], + input: [ + { + type: "tool_search_call", + id: "tsc_previous", + call_id: "call_previous", + execution: "client", + arguments: { query: "database" }, + status: "completed", + }, + { + type: "tool_search_output", + call_id: "call_previous", + execution: "client", + status: "completed", + tools: previousTools, + }, + ], + }); + const input = (rewritten.body as { input: Array> }).input; + + expect(input[0]).toEqual({ + type: "function_call", + id: "fc_previous", + call_id: "call_previous", + name: "tool_search", + arguments: '{"query":"database"}', + status: "completed", + }); + expect(input[1]).toMatchObject({ + type: "function_call_output", + call_id: "call_previous", + }); + expect(JSON.parse(String(input[1]?.output))).toEqual({ tools: previousTools, status: "completed" }); + }); + + test("restores only the converted function name in bounded JSON", () => { + const restored = JSON.parse(restoreRoutedToolSearchCallsInJson(JSON.stringify({ + id: "resp_1", + output: [ + { type: "function_call", id: "fc_search", call_id: "call_search", name: "tool_search", arguments: '{"query":"database"}', status: "completed" }, + { type: "function_call", id: "fc_other", call_id: "call_other", name: "ordinary", arguments: "{}", status: "completed" }, + ], + }), new Set(["tool_search"]))) as { output: Array> }; + + expect(restored.output[0]).toEqual({ + type: "tool_search_call", + id: "tsc_search", + call_id: "call_search", + execution: "client", + arguments: { query: "database" }, + status: "completed", + }); + expect(restored.output[1]).toMatchObject({ type: "function_call", name: "ordinary" }); + }); + + test("restores the SSE item lifecycle and suppresses function argument frames", () => { + const budget = createTestTranslatorBudget(); + const rewrite = createRoutedToolSearchRestoreBlockRewrite(new Set(["tool_search"]), budget); + + expect(rewrite(frame("response.function_call_arguments.delta", { + output_index: 0, + item_id: "fc_search", + delta: '{"query":', + }))).toEqual([]); + expect(budget.snapshot().currentBytes).toBeGreaterThan(0); + + const added = rewrite(frame("response.output_item.added", { + output_index: 0, + item: { + type: "function_call", + id: "fc_search", + call_id: "call_search", + name: "tool_search", + arguments: "", + status: "in_progress", + }, + })); + expect(added).toHaveLength(1); + expect(dataPayload(added[0]!).item).toEqual({ + type: "tool_search_call", + id: "tsc_search", + call_id: "call_search", + execution: "client", + arguments: {}, + status: "in_progress", + }); + expect(budget.snapshot().currentBytes).toBe(0); + + expect(rewrite(frame("response.function_call_arguments.done", { + output_index: 0, + item_id: "fc_search", + arguments: '{"query":"database"}', + }))).toEqual([]); + + const done = rewrite(frame("response.output_item.done", { + output_index: 0, + item: { + type: "function_call", + id: "fc_search", + call_id: "call_search", + name: "tool_search", + arguments: '{"query":"database"}', + status: "completed", + }, + })); + expect(dataPayload(done[0]!).item).toMatchObject({ + type: "tool_search_call", + id: "tsc_search", + arguments: { query: "database" }, + }); + rewrite.dispose?.(); + expect(budget.snapshot().currentBytes).toBe(0); + }); + + test("replays an ordinary pending argument frame and releases unmatched terminal state", () => { + const budget = createTestTranslatorBudget(); + const rewrite = createRoutedToolSearchRestoreBlockRewrite(new Set(["tool_search"]), budget); + + expect(rewrite(frame("response.function_call_arguments.delta", { + output_index: 1, + delta: '{"path":', + }))).toEqual([]); + const ordinary = rewrite(frame("response.output_item.added", { + output_index: 1, + item: { + type: "function_call", + id: "fc_regular", + call_id: "call_regular", + name: "ordinary", + arguments: "", + status: "in_progress", + }, + })); + expect(ordinary).toHaveLength(2); + expect(dataPayload(ordinary[0]!).item_id).toBe("fc_regular"); + expect(dataPayload(ordinary[1]!).item).toMatchObject({ type: "function_call", name: "ordinary" }); + + expect(rewrite(frame("response.function_call_arguments.delta", { + output_index: 9, + delta: "unmatched", + }))).toEqual([]); + expect(budget.snapshot().currentBytes).toBeGreaterThan(0); + expect(rewrite(frame("response.completed", { + response: { id: "resp_done", status: "completed", output: [] }, + }))).toHaveLength(1); + expect(budget.snapshot().currentBytes).toBe(0); + }); + + test("falls back to raw pass-through when the pending collector budget is exhausted", () => { + const budget = createTestTranslatorBudget({ maxTurnBytes: 64 }); + const rewrite = createRoutedToolSearchRestoreBlockRewrite(new Set(["tool_search"]), budget); + const pending = frame("response.function_call_arguments.delta", { + output_index: 0, + delta: "x".repeat(256), + }); + + expect(rewrite(pending)).toEqual([pending]); + expect(budget.snapshot().currentBytes).toBe(0); + const added = frame("response.output_item.added", { + output_index: 0, + item: { + type: "function_call", + id: "fc_search", + call_id: "call_search", + name: "tool_search", + arguments: "", + }, + }); + expect(rewrite(added)).toEqual([added]); + }); + + test("handleResponses lowers and restores a streaming search call", async () => { + const savedFetch = globalThis.fetch; + let outboundBody: Record | undefined; + const upstreamItem = { + type: "function_call", + id: "fc_search", + call_id: "call_search", + name: "tool_search", + arguments: '{"query":"database"}', + status: "completed", + }; + const upstream = [ + frame("response.output_item.added", { output_index: 0, item: { ...upstreamItem, arguments: "", status: "in_progress" } }), + frame("response.function_call_arguments.delta", { output_index: 0, item_id: "fc_search", delta: upstreamItem.arguments }), + frame("response.function_call_arguments.done", { output_index: 0, item_id: "fc_search", arguments: upstreamItem.arguments }), + frame("response.output_item.done", { output_index: 0, item: upstreamItem }), + frame("response.completed", { response: { id: "resp_1", status: "completed", output: [upstreamItem] } }), + "data: [DONE]", + ].join("\n\n") + "\n\n"; + globalThis.fetch = (async (_input, init) => { + outboundBody = JSON.parse(String(init?.body)) as Record; + return new Response(upstream, { headers: { "content-type": "text/event-stream" } }); + }) as typeof fetch; + + try { + const response = await handleResponses(new Request("http://localhost/v1/responses", { + method: "POST", + headers: { "content-type": "application/json" }, + body: JSON.stringify({ + model: "fixture/deepseek-v4-flash", + stream: true, + input: [{ role: "user", content: [{ type: "input_text", text: "find a database tool" }] }], + tools: [ + searchTool, + { type: "custom", name: "exec", description: "Run JavaScript", format: { type: "grammar", syntax: "lark" } }, + ], + }), + }), fixtureConfig(), { model: "", provider: "" }); + const clientSse = await response.text(); + const outboundTools = outboundBody?.tools as Array> | undefined; + + expect(outboundTools?.[0]).toMatchObject({ type: "function", name: "tool_search" }); + expect(outboundTools?.[1]).toMatchObject({ type: "function", name: "exec" }); + expect(clientSse).toContain('"type":"tool_search_call"'); + expect(clientSse).toContain('"id":"tsc_search"'); + expect(clientSse).not.toContain("response.function_call_arguments"); + } finally { + globalThis.fetch = savedFetch; + } + }); + + test("handleResponses restores a non-streaming search call", async () => { + const savedFetch = globalThis.fetch; + let outboundBody: Record | undefined; + globalThis.fetch = (async (_input, init) => { + outboundBody = JSON.parse(String(init?.body)) as Record; + return new Response(JSON.stringify({ + id: "resp_json", + status: "completed", + output: [{ + type: "function_call", + id: "fc_search", + call_id: "call_search", + name: "tool_search", + arguments: '{"query":"database"}', + status: "completed", + }], + }), { headers: { "content-type": "application/json" } }); + }) as typeof fetch; + + try { + const response = await handleResponses(new Request("http://localhost/v1/responses", { + method: "POST", + headers: { "content-type": "application/json" }, + body: JSON.stringify({ + model: "fixture/deepseek-v4-flash", + stream: false, + input: [{ role: "user", content: [{ type: "input_text", text: "find a database tool" }] }], + tools: [searchTool], + }), + }), fixtureConfig(), { model: "", provider: "" }); + const body = await response.json() as { output: Array> }; + const outboundTools = outboundBody?.tools as Array> | undefined; + + expect(outboundTools?.[0]).toMatchObject({ type: "function", name: "tool_search" }); + expect(body.output[0]).toEqual({ + type: "tool_search_call", + id: "tsc_search", + call_id: "call_search", + execution: "client", + arguments: { query: "database" }, + status: "completed", + }); + } finally { + globalThis.fetch = savedFetch; + } + }); + + test("handleResponses forwards second-turn search history in public function form", async () => { + const savedFetch = globalThis.fetch; + let outboundBody: Record | undefined; + globalThis.fetch = (async (_input, init) => { + outboundBody = JSON.parse(String(init?.body)) as Record; + return new Response(JSON.stringify({ id: "resp_next", status: "completed", output: [] }), { + headers: { "content-type": "application/json" }, + }); + }) as typeof fetch; + + try { + await handleResponses(new Request("http://localhost/v1/responses", { + method: "POST", + headers: { "content-type": "application/json" }, + body: JSON.stringify({ + model: "fixture/deepseek-v4-flash", + stream: false, + tools: [searchTool], + input: [ + { + type: "tool_search_call", + id: "tsc_previous", + call_id: "call_previous", + execution: "client", + arguments: { query: "database" }, + status: "completed", + }, + { + type: "tool_search_output", + call_id: "call_previous", + execution: "client", + status: "completed", + tools: [{ type: "function", name: "deferred_read", parameters: { type: "object" } }], + }, + { role: "user", content: [{ type: "input_text", text: "use the loaded tool" }] }, + ], + }), + }), fixtureConfig(), { model: "", provider: "" }); + const input = outboundBody?.input as Array> | undefined; + + expect(input?.[0]).toMatchObject({ + type: "function_call", + id: "fc_previous", + call_id: "call_previous", + name: "tool_search", + }); + expect(typeof input?.[0]?.arguments).toBe("string"); + expect(input?.[1]).toMatchObject({ + type: "function_call_output", + call_id: "call_previous", + }); + expect(input?.some(item => item.type === "tool_search_call" || item.type === "tool_search_output")).toBe(false); + } finally { + globalThis.fetch = savedFetch; + } + }); + + test("tool_choice none prevents restoring an ignored upstream search call", async () => { + const savedFetch = globalThis.fetch; + globalThis.fetch = (async () => new Response(JSON.stringify({ + id: "resp_json", + status: "completed", + output: [{ + type: "function_call", + id: "fc_search", + call_id: "call_search", + name: "tool_search", + arguments: '{"query":"database"}', + status: "completed", + }], + }), { headers: { "content-type": "application/json" } })) as typeof fetch; + + try { + const response = await handleResponses(new Request("http://localhost/v1/responses", { + method: "POST", + headers: { "content-type": "application/json" }, + body: JSON.stringify({ + model: "fixture/deepseek-v4-flash", + stream: false, + input: [{ role: "user", content: [{ type: "input_text", text: "do not call tools" }] }], + tools: [searchTool], + tool_choice: "none", + }), + }), fixtureConfig(), { model: "", provider: "" }); + const body = await response.json() as { output: Array> }; + + expect(body.output[0]).toMatchObject({ + type: "function_call", + name: "tool_search", + }); + expect(body.output[0]).not.toHaveProperty("execution"); + } finally { + globalThis.fetch = savedFetch; + } + }); + + test("history-only replay still arms restoration for the lowered call", () => { + // A turn may replay tool_search history WITHOUT re-declaring the tool. The history is + // lowered to function_call either way, so leaving \`names\` empty would hand the client a + // public function_call for what it issued as a private search call. + const { body, names } = rewriteRoutedToolSearchForUpstream({ + model: "fixture/deepseek-v4-flash", + tools: [{ type: "function", name: "read_file", parameters: { type: "object" } }], + input: [ + { + type: "tool_search_call", + id: "tsc_old", + call_id: "call_old", + execution: "client", + arguments: { query: "x" }, + status: "completed", + }, + { type: "tool_search_output", call_id: "call_old", execution: "client", status: "completed", tools: [] }, + ], + }); + + expect(names.has("tool_search")).toBe(true); + const input = body.input as Array>; + expect(input[0]).toMatchObject({ type: "function_call", id: "fc_old", name: "tool_search" }); + expect(input[1]).toMatchObject({ type: "function_call_output", call_id: "call_old" }); + }); + + test("overflow keeps suppressing frames for an already-restored routed item", () => { + const rewrite = createRoutedToolSearchRestoreBlockRewrite(new Set(["tool_search"])); + + // Open and restore a routed item. + const opened = rewrite(frame("response.output_item.added", { + output_index: 0, + item: { type: "function_call", id: "fc_search", name: "tool_search", arguments: "" }, + })); + expect(dataPayload(opened[0]!).item).toMatchObject({ type: "tool_search_call", id: "tsc_search" }); + + // Overflow the pending buffer on a DIFFERENT, unclassified item id. + for (let i = 0; i <= 256; i += 1) { + rewrite(frame("response.function_call_arguments.delta", { + output_index: 1, + item_id: "fc_unknown", + delta: "x", + })); + } + + // The restored item's public argument frames must still be suppressed. Clearing the routed + // id on overflow would leak them and give the client a mixed private/public lifecycle for + // one call — the exact defect this rewrite exists to prevent. + const leaked = rewrite(frame("response.function_call_arguments.delta", { + output_index: 0, + item_id: "fc_search", + delta: "{", + })); + expect(leaked).toEqual([]); + + // Unrelated traffic still passes through untouched after overflow. + const other = rewrite(frame("response.output_text.delta", { output_index: 2, delta: "hi" })); + expect(other).toHaveLength(1); + }); +}); From 713dce9294fe451d9507579bb28397ff6b34bd00 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 11:23:04 +0900 Subject: [PATCH 31/88] fix(responses): give synthesized ids a namespace that cannot collide Two defects CodeRabbit found on #2142. ITEM_ID_PREFIXES was keyed on image_gen_call, but the Responses wire type is image_generation_call, so every real one fell through to the generic item_ prefix. Both spellings now map to ig_. The malformed-index fallback counter started at 1_000_000 and shared the numeric namespace with real output indexes. That pushed a collision out of reach rather than removing it: a response whose real index reached 1_000_001 produced the same id as the first fallback, and a duplicate id is the one thing this backfill exists to prevent. Index-derived and fallback ids now come from lexically disjoint namespaces, so no integer index can ever produce a fallback id. --- .../responses/responses-field-backfill.ts | 39 ++++++++---- tests/responses-field-backfill.test.ts | 60 ++++++++++++++++++- 2 files changed, 83 insertions(+), 16 deletions(-) diff --git a/src/server/responses/responses-field-backfill.ts b/src/server/responses/responses-field-backfill.ts index 67f6a1b796..285ad3d956 100644 --- a/src/server/responses/responses-field-backfill.ts +++ b/src/server/responses/responses-field-backfill.ts @@ -38,6 +38,9 @@ const ITEM_ID_PREFIXES: Readonly> = { file_search_call: "fs_", code_interpreter_call: "ci_", computer_call: "cc_", + // The Responses wire type is `image_generation_call`; `image_gen_call` is kept only so a + // relay that emits the short spelling is not silently demoted to the generic `item_`. + image_generation_call: "ig_", image_gen_call: "ig_", }; @@ -48,25 +51,35 @@ const ITEM_ID_PREFIXES: Readonly> = { * generated id is deterministic per (type, output index) so it stays stable * across streaming events that reference the same item. */ -function backfillItemId(item: Record, outputIndex: number): Record { +function backfillItemId(item: Record, slot: ItemIdSlot): Record { if (typeof item.id === "string" && item.id.length > 0) return item; const type = typeof item.type === "string" ? item.type : ""; const prefix = Object.prototype.hasOwnProperty.call(ITEM_ID_PREFIXES, type) ? ITEM_ID_PREFIXES[type] : "item_"; - return { ...item, id: prefix + "ocx_" + outputIndex }; + return { ...item, id: prefix + "ocx_" + (slot.kind === "index" ? String(slot.index) : "fallback_" + slot.ordinal) }; } +/** + * Which namespace a synthesized id comes from. + * + * Keeping the fallback counter in the SAME numeric namespace as real output indexes only + * pushed the collision out of reach rather than removing it: a response whose real index + * happened to be 1_000_001 would produce the same id as the first malformed-index fallback, + * and a duplicate id is exactly what this backfill exists to prevent. The namespaces are now + * lexically disjoint, so no index value can ever collide with a fallback. + */ +type ItemIdSlot = { kind: "index"; index: number } | { kind: "fallback"; ordinal: number }; + /** * Monotonic ordinal for an event whose `output_index` is absent or malformed. * - * Starts far above any plausible real index so a synthesized id can never collide with an - * index-derived one inside the same response. Process-global rather than per-response because - * this module is stateless by design and the value only has to be unique, not meaningful. + * Process-global rather than per-response because this module is stateless by design and the + * value only has to be unique, not meaningful. It carries its own `fallback_` namespace, so + * uniqueness no longer depends on a real index never reaching some arbitrary ceiling. */ -const SYNTHETIC_ITEM_ORDINAL_BASE = 1_000_000; let syntheticItemOrdinal = 0; -function nextSyntheticItemOrdinal(): number { +function nextSyntheticItemSlot(): ItemIdSlot { syntheticItemOrdinal += 1; - return SYNTHETIC_ITEM_ORDINAL_BASE + syntheticItemOrdinal; + return { kind: "fallback", ordinal: syntheticItemOrdinal }; } /** @@ -103,11 +116,11 @@ function backfillContentArray(content: unknown): unknown { * Also backfills a missing required id on the item itself. * Returns the same object reference if nothing changed. */ -function backfillOutputItem(item: unknown, outputIndex: number): unknown { +function backfillOutputItem(item: unknown, slot: ItemIdSlot): unknown { if (!isPlainObject(item)) return item; const content = item.content; const repaired = backfillContentArray(content); - const withId = backfillItemId(item, outputIndex); + const withId = backfillItemId(item, slot); if (repaired === content && withId === item) return item; return { ...withId, ...(repaired === content ? {} : { content: repaired }) }; } @@ -123,7 +136,7 @@ function backfillResponseOutput(response: unknown): unknown { let changed = false; const repaired = output.map((item, idx) => { if (!isPlainObject(item)) return item; - const next = backfillOutputItem(item, idx); + const next = backfillOutputItem(item, { kind: "index", index: idx }); if (next !== item) changed = true; return next; }); @@ -149,8 +162,8 @@ function rewriteEvent(event: Record): Record { // is not recoverable in that case, but a unique id is what strict decoders require, and a // well-formed stream still gets the stable index-derived id. const item = typeof rawIndex === "number" && Number.isInteger(rawIndex) && rawIndex >= 0 - ? backfillOutputItem(event.item, rawIndex) - : backfillOutputItem(event.item, nextSyntheticItemOrdinal()); + ? backfillOutputItem(event.item, { kind: "index", index: rawIndex }) + : backfillOutputItem(event.item, nextSyntheticItemSlot()); if (item !== event.item) { next = { ...next, item }; changed = true; diff --git a/tests/responses-field-backfill.test.ts b/tests/responses-field-backfill.test.ts index 022ff86e4f..8575b0727c 100644 --- a/tests/responses-field-backfill.test.ts +++ b/tests/responses-field-backfill.test.ts @@ -267,7 +267,8 @@ describe("responses-field-backfill", () => { }; const [out] = apply(sseBlock(event)); const parsed = parseData([out])[0]; - expect(parsed.item.id).toMatch(/^msg_ocx_\d+$/); + // The fallback carries its own namespace so it can never equal an index-derived id. + expect(parsed.item.id).toMatch(/^msg_ocx_fallback_\d+$/); } }); @@ -287,8 +288,8 @@ describe("responses-field-backfill", () => { const first = parseData(apply(sseBlock(event("one"))))[0]; const second = parseData(apply(sseBlock(event("two"))))[0]; - expect(first.item.id).toMatch(/^msg_ocx_\d+$/); - expect(second.item.id).toMatch(/^msg_ocx_\d+$/); + expect(first.item.id).toMatch(/^msg_ocx_fallback_\d+$/); + expect(second.item.id).toMatch(/^msg_ocx_fallback_\d+$/); expect(first.item.id).not.toBe(second.item.id); }); @@ -348,4 +349,57 @@ describe("responses-field-backfill", () => { const result = JSON.parse(backfillResponsesFieldsJson(JSON.stringify(response))) as typeof response; expect(result.output[0].id).toBe("msg_real"); }); + + test("the canonical image_generation_call type gets its own prefix", () => { + const response = { + id: "resp_1", + object: "response", + status: "completed", + output: [{ type: "image_generation_call", result: "..." }], + }; + const result = JSON.parse(backfillResponsesFieldsJson(JSON.stringify(response))) as { + output: { id: string }[]; + }; + // The wire type is `image_generation_call`; keying the table on the short spelling alone + // silently demoted every real one to the generic `item_` prefix. + expect(result.output[0]!.id).toBe("ig_ocx_0"); + }); + + // A malformed `output_index` falls back to a counter. While that counter lived in the same + // numeric namespace as real indexes, a response whose real index reached the counter's base + // produced the SAME id as a fallback — a duplicate, which is the one thing this backfill + // exists to prevent. + test("a fallback id cannot collide with any index-derived id", () => { + const malformed = parseData(apply(sseBlock({ + type: "response.output_item.added", + output_index: "not-a-number", + item: { type: "message", role: "assistant", content: [] }, + }))); + const fallbackId = (malformed[0]!.item as { id: string }).id; + + // Every index-derived id is `msg_ocx_`; the fallback namespace is lexically + // disjoint from it, so no integer index can ever produce this string. + expect(fallbackId).toMatch(/^msg_ocx_fallback_\d+$/); + expect(fallbackId).not.toMatch(/^msg_ocx_\d+$/); + + for (const index of [0, 1, 1_000_000, 1_000_001, 1_000_002]) { + const derived = parseData(apply(sseBlock({ + type: "response.output_item.added", + output_index: index, + item: { type: "message", role: "assistant", content: [] }, + }))); + expect((derived[0]!.item as { id: string }).id).not.toBe(fallbackId); + } + }); + + test("consecutive malformed indexes still get distinct ids", () => { + const ids = [0, 1].map(() => { + const out = parseData(apply(sseBlock({ + type: "response.output_item.added", + item: { type: "message", role: "assistant", content: [] }, + }))); + return (out[0]!.item as { id: string }).id; + }); + expect(new Set(ids).size).toBe(2); + }); }); From 8b7b65cb8946c763ea9ad44d8e9f2cc89ba78abf Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 11:27:04 +0900 Subject: [PATCH 32/88] fix(responses): keep tool-search item classification past output_item.done The routed and ordinary id sets were cleared at output_item.done, but done ends the item, not the id's relevance. For a ROUTED id that was a leak: an upstream that emits a trailing function_call_arguments.done after the item closes found the classification gone, fell through to the unknown-id branch, and the frame reached the client as a public argument event for an item the client was told is a private tool_search_call. That mixed lifecycle is the defect this rewrite exists to prevent. For an ORDINARY id it was not a leak but was not free either: the same fall-through buffered its trailing frames as unknown and held them for an item that would never arrive. Both are now retained until the terminal event releases everything. Found by CodeRabbit on #2145. --- src/server/responses-tool-search-repair.ts | 14 ++++-- tests/responses-tool-search-repair.test.ts | 53 ++++++++++++++++++++++ 2 files changed, 63 insertions(+), 4 deletions(-) diff --git a/src/server/responses-tool-search-repair.ts b/src/server/responses-tool-search-repair.ts index 8aa5c48130..6c18708406 100644 --- a/src/server/responses-tool-search-repair.ts +++ b/src/server/responses-tool-search-repair.ts @@ -183,10 +183,16 @@ export function createRoutedToolSearchRestoreBlockRewrite( const restoredBlock = restored.changed ? replaceSseDataPayload(block, JSON.stringify(restored.value)) : block; - if (type === "response.output_item.done" && itemId) { - routedItemIds.delete(itemId); - ordinaryItemIds.delete(itemId); - } + // Classification is retained past `output_item.done` for BOTH kinds, until the terminal + // event releases everything. + // + // `done` ends the item, not the id's relevance. Forgetting a ROUTED id let a trailing + // `function_call_arguments.*` — which some upstreams emit after done — fall through to + // the unknown-id branch and reach the client as a public frame for an item the client + // was told is a private `tool_search_call`: the mixed lifecycle this rewrite exists to + // prevent. Forgetting an ORDINARY id is not leak-shaped but is not free either, because + // the same fall-through buffers its trailing frames as unknown and delays them until an + // item that will never arrive. Neither id is dropped early. return routed ? [restoredBlock] : [...pending, restoredBlock]; } diff --git a/tests/responses-tool-search-repair.test.ts b/tests/responses-tool-search-repair.test.ts index c208d3c1d0..a080574a3d 100644 --- a/tests/responses-tool-search-repair.test.ts +++ b/tests/responses-tool-search-repair.test.ts @@ -575,4 +575,57 @@ describe("routed Responses tool-search compatibility", () => { const other = rewrite(frame("response.output_text.delta", { output_index: 2, delta: "hi" })); expect(other).toHaveLength(1); }); + + // `output_item.done` ends the ITEM, not the id's relevance. Forgetting the routed id there + // meant a trailing argument frame — which some upstreams emit after done — fell through to + // the unknown-id branch and reached the client as a public `function_call_arguments.*` for + // an item the client was told is a private `tool_search_call`. + test("a routed id stays suppressed after output_item.done", () => { + const rewrite = createRoutedToolSearchRestoreBlockRewrite(new Set(["tool_search"])); + + rewrite(frame("response.output_item.added", { + output_index: 0, + item: { type: "function_call", id: "fc_search", name: "tool_search", arguments: "" }, + })); + const done = rewrite(frame("response.output_item.done", { + output_index: 0, + item: { type: "function_call", id: "fc_search", name: "tool_search", arguments: "{}" }, + })); + expect(dataPayload(done[0]!).item).toMatchObject({ type: "tool_search_call" }); + + const trailing = rewrite(frame("response.function_call_arguments.done", { + output_index: 0, + item_id: "fc_search", + arguments: "{}", + })); + expect(trailing).toEqual([]); + + const trailingDelta = rewrite(frame("response.function_call_arguments.delta", { + output_index: 0, + item_id: "fc_search", + delta: "x", + })); + expect(trailingDelta).toEqual([]); + }); + + test("an ordinary item's frames still pass through after its done", () => { + const rewrite = createRoutedToolSearchRestoreBlockRewrite(new Set(["tool_search"])); + + rewrite(frame("response.output_item.added", { + output_index: 0, + item: { type: "function_call", id: "fc_plain", name: "not_routed", arguments: "" }, + })); + rewrite(frame("response.output_item.done", { + output_index: 0, + item: { type: "function_call", id: "fc_plain", name: "not_routed", arguments: "{}" }, + })); + + // Retaining routed ids must not accidentally start swallowing ordinary ones. + const trailing = rewrite(frame("response.function_call_arguments.delta", { + output_index: 0, + item_id: "fc_plain", + delta: "x", + })); + expect(trailing).toHaveLength(1); + }); }); From 1adcfde0cfff10589eefdaa33aae077ffe404bcc Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 05:50:07 +0900 Subject: [PATCH 33/88] fix(google): preserve and replay thought signatures across stream chunks Antigravity thinking models 400 on multi-turn tool loops: the historical tool calls are replayed without their thought_signature, so exec/wait/agent tools break once history is long enough to matter. Two holes, both in the #897 "pair the signature to the next call and drop the rest" contract: pendingThoughtSig was cleared by the first functionCall, so a parallel tool turn left every call after the first unsigned. It now survives the turn. A signature and its function call can arrive in different SSE chunks, so the pending value was lost at the chunk boundary. It is now carried across. The parser also reads the snake_case thought_signature alongside the camelCase form, which is what the upstream actually sends on some turns. Carries @agentHits's #2127 unchanged. Closes #2125 --- src/adapters/google-antigravity-replay.ts | 24 ++++++--- src/adapters/google.ts | 25 +++++++-- tests/google-antigravity-replay.test.ts | 27 ++++++++++ ...google-signature-history-roundtrip.test.ts | 53 +++++++++++++++++++ 4 files changed, 117 insertions(+), 12 deletions(-) diff --git a/src/adapters/google-antigravity-replay.ts b/src/adapters/google-antigravity-replay.ts index d3ffa480c8..745ac44f9b 100644 --- a/src/adapters/google-antigravity-replay.ts +++ b/src/adapters/google-antigravity-replay.ts @@ -599,12 +599,20 @@ export function antigravityUsesReplayCache(model: string): boolean { * Observe a parsed CCA chunk's `candidates[0].content.parts` and record thought signatures keyed by * the functionCall identity (name + args). Accumulates across the whole session so a sequential * multi-step tool loop keeps EVERY prior call's signature, not just the latest part-index slot. - * A signature on a standalone thought part is paired with the next functionCall in the same - * array (#897); a call's own signature takes precedence and an unpaired one is dropped. + * A signature on a standalone thought part applies to the functionCall parts that follow it in + * the same array AND to later arrays of the same turn: streaming splits a thought part and its + * calls across SSE chunks, so `carriedThoughtSig` threads the still-unpaired signature from the + * previous chunk and the return value hands the remainder to the next one (#897, #2125). A call's + * own signature always takes precedence over a carried one. * `parts` is the already-unwrapped `response.candidates[0].content.parts`. */ -export function observeAntigravityReplay(model: string, sessionId: string, parts: unknown[]): void { - if (!antigravityUsesReplayCache(model) || !Array.isArray(parts) || parts.length === 0) return; +export function observeAntigravityReplay( + model: string, + sessionId: string, + parts: unknown[], + carriedThoughtSig?: string, +): string | undefined { + if (!antigravityUsesReplayCache(model) || !Array.isArray(parts) || parts.length === 0) return carriedThoughtSig; ensureReplaySnapshotLoaded(); const now = Date.now(); deleteExpiredReplaySessionsThrottled(now); @@ -618,7 +626,7 @@ export function observeAntigravityReplay(model: string, sessionId: string, parts lastActiveAtMs: 0, }; let inserted = false; - let pendingThoughtSig: string | undefined; + let pendingThoughtSig: string | undefined = carriedThoughtSig; for (const raw of parts) { if (!raw || typeof raw !== "object") continue; const part = raw as Record; @@ -632,7 +640,6 @@ export function observeAntigravityReplay(model: string, sessionId: string, parts continue; } const callSig = sig ?? pendingThoughtSig; // a signature on the call part itself wins - pendingThoughtSig = undefined; if (!callSig) continue; const ck = functionCallKey(fc.name, fc.args); if (!ck) continue; // only function-call signatures are replayable by identity @@ -645,7 +652,7 @@ export function observeAntigravityReplay(model: string, sessionId: string, parts replayBytes += sizeBytes; inserted = true; } - if (!inserted) return; + if (!inserted) return pendingThoughtSig; // Charge the fixed outer key only when the session is actually stored. if (!existing) replayBytes += REPLAY_SESSION_KEY_BYTES; evictInnerCalls(entry); @@ -659,7 +666,7 @@ export function observeAntigravityReplay(model: string, sessionId: string, parts } else { replayBytes -= REPLAY_SESSION_KEY_BYTES; } - return; + return pendingThoughtSig; } entry.expiresAtMs = now + REPLAY_TTL_MS; entry.lastActiveAtMs = now; @@ -668,6 +675,7 @@ export function observeAntigravityReplay(model: string, sessionId: string, parts evictIfNeeded(); enforceAppOwnedMemoryBudget(); markReplayDirty(); + return pendingThoughtSig; } /** diff --git a/src/adapters/google.ts b/src/adapters/google.ts index a3be021a76..f152d91741 100644 --- a/src/adapters/google.ts +++ b/src/adapters/google.ts @@ -342,6 +342,7 @@ interface GoogleResponsePart { text?: string; thought?: boolean; thoughtSignature?: string; + thought_signature?: string; functionCall?: { name: string; args: unknown }; } @@ -352,8 +353,9 @@ interface GoogleResponsePart { */ function googleToolCallMetadataFromPart( part: GoogleResponsePart, + fallbackSignature?: string, ): { providerMetadata: OcxProviderOpaqueToolCallMetadata } | undefined { - const signature = part.thoughtSignature; + const signature = part.thoughtSignature ?? part.thought_signature ?? fallbackSignature; if (!isLikelyRealThoughtSignature(signature)) return undefined; return { providerMetadata: { google: { thoughtSignature: signature } } }; } @@ -601,6 +603,7 @@ export function createGoogleAdapter(provider: OcxProviderConfig): ProviderAdapte let lastFinishReason: string | undefined; let sawAnyFrame = false; let sawTerminalSignal = false; + let pendingStreamThoughtSig: string | undefined; const handleDataLine = async function* (line: string): AsyncGenerator { const payload = line.slice(5).trim(); @@ -697,10 +700,19 @@ export function createGoogleAdapter(provider: OcxProviderConfig): ProviderAdapte const replaySession = provider.googleMode === "cloud-code-assist" ? antigravitySession : vertexReplaySession; if ((provider.googleMode === "cloud-code-assist" || provider.googleMode === "vertex") && parts && replayModel && replaySession) { - observeAntigravityReplay(replayModel, replaySession, parts as unknown[]); + pendingStreamThoughtSig = observeAntigravityReplay( + replayModel, + replaySession, + parts as unknown[], + pendingStreamThoughtSig, + ); } if (parts) { for (const part of parts) { + const sig = part.thoughtSignature ?? part.thought_signature; + if (part.thought === true && sig && isLikelyRealThoughtSignature(sig)) { + pendingStreamThoughtSig = sig; + } const textEvent = googlePartTextEvent(part); if (textEvent) { emittedContentEvent = true; @@ -729,7 +741,7 @@ export function createGoogleAdapter(provider: OcxProviderConfig): ProviderAdapte type: "tool_call_start", id, name: restoreGoogleToolName(part.functionCall.name), - ...googleToolCallMetadataFromPart(part), + ...googleToolCallMetadataFromPart(part, pendingStreamThoughtSig), }; yield { type: "tool_call_delta", arguments: JSON.stringify(part.functionCall.args ?? {}) }; yield { type: "tool_call_end" }; @@ -926,7 +938,12 @@ export function createGoogleAdapter(provider: OcxProviderConfig): ProviderAdapte && replayModel && replaySession) { observeAntigravityReplay(replayModel, replaySession, candidates[0].content.parts as unknown[]); } + let pendingThoughtSig: string | undefined; for (const part of candidates[0].content.parts) { + const sig = part.thoughtSignature ?? part.thought_signature; + if (part.thought === true && sig && isLikelyRealThoughtSignature(sig)) { + pendingThoughtSig = sig; + } const textEvent = googlePartTextEvent(part); if (textEvent) events.push(textEvent); const inline = (part as { inlineData?: { mimeType?: string; data?: string } }).inlineData; @@ -950,7 +967,7 @@ export function createGoogleAdapter(provider: OcxProviderConfig): ProviderAdapte type: "tool_call_start", id, name: restoreGoogleToolName(part.functionCall.name), - ...googleToolCallMetadataFromPart(part), + ...googleToolCallMetadataFromPart(part, pendingThoughtSig), }); events.push({ type: "tool_call_delta", arguments: JSON.stringify(part.functionCall.args ?? {}) }); events.push({ type: "tool_call_end" }); diff --git a/tests/google-antigravity-replay.test.ts b/tests/google-antigravity-replay.test.ts index eb02fd6006..0ef9524533 100644 --- a/tests/google-antigravity-replay.test.ts +++ b/tests/google-antigravity-replay.test.ts @@ -97,6 +97,33 @@ describe("antigravity reasoning-replay cache", () => { expect((contents[0].parts[0] as { thoughtSignature?: string }).thoughtSignature).toBe(SIG); }); + test("a signature on a standalone thought part replays onto all subsequent functionCalls in the same turn", () => { + observeAntigravityReplay(MODEL, SESSION, [ + { thought: true, thoughtSignature: SIG }, + fcPart("get_x", { a: 1 }), + fcPart("get_y", { b: 2 }), + ]); + const contents = [{ + role: "model", + parts: [ + { functionCall: { name: "get_x", args: { a: 1 } } }, + { functionCall: { name: "get_y", args: { b: 2 } } }, + ], + }]; + applyAntigravityReplay(MODEL, SESSION, contents); + expect((contents[0].parts[0] as { thoughtSignature?: string }).thoughtSignature).toBe(SIG); + expect((contents[0].parts[1] as { thoughtSignature?: string }).thoughtSignature).toBe(SIG); + }); + + test("carried thought signature across separate stream chunks pairs with subsequent functionCalls", () => { + const carried = observeAntigravityReplay(MODEL, SESSION, [{ thought: true, thought_signature: SIG }]); + expect(carried).toBe(SIG); + observeAntigravityReplay(MODEL, SESSION, [fcPart("get_x", { a: 1 })], carried); + const contents = [{ role: "model", parts: [{ functionCall: { name: "get_x", args: { a: 1 } } }] }]; + applyAntigravityReplay(MODEL, SESSION, contents); + expect((contents[0].parts[0] as { thoughtSignature?: string }).thoughtSignature).toBe(SIG); + }); + test("a call's own signature wins over a preceding standalone thought signature", () => { observeAntigravityReplay(MODEL, SESSION, [ { thought: true, thoughtSignature: "sig-standalone-aaaa" }, diff --git a/tests/google-signature-history-roundtrip.test.ts b/tests/google-signature-history-roundtrip.test.ts index 499c7c8c3f..b40c21f074 100644 --- a/tests/google-signature-history-roundtrip.test.ts +++ b/tests/google-signature-history-roundtrip.test.ts @@ -132,6 +132,59 @@ describe("#1735 thought signature survives history replay", () => { expect(signatures).toEqual([SIGNATURE, SIGNATURE_B]); }); + test("a standalone thought part's signature attaches to all subsequent functionCalls in non-streaming parse", async () => { + const adapter = createGoogleAdapter(provider); + await adapter.buildRequest(firstTurn()); + const events = await adapter.parseResponse!(new Response(JSON.stringify(googleBody([ + { text: "thinking...", thought: true, thoughtSignature: SIGNATURE }, + { functionCall: { name: "shell_command", args: { command: "pwd" } } }, + { functionCall: { name: "shell_command", args: { command: "ls" } } }, + ])))); + const starts = events.filter((e: AdapterEvent) => e.type === "tool_call_start"); + expect(starts.length).toBe(2); + expect("providerMetadata" in starts[0] ? starts[0].providerMetadata?.google?.thoughtSignature : undefined) + .toBe(SIGNATURE); + expect("providerMetadata" in starts[1] ? starts[1].providerMetadata?.google?.thoughtSignature : undefined) + .toBe(SIGNATURE); + }); + + test("streaming SSE chunks carry thought signature across chunk boundaries to function calls", async () => { + const adapter = createGoogleAdapter(provider); + await adapter.buildRequest(firstTurn()); + // Each SSE frame arrives as its own transport chunk so the signature has to + // survive the chunk boundary between the thought part and the function calls. + const frames = [ + `data: ${JSON.stringify(googleBody([{ text: "thinking...", thought: true, thought_signature: SIGNATURE }]))}\n\n`, + `data: ${JSON.stringify(googleBody([{ functionCall: { name: "shell_command", args: { command: "pwd" } } }]))}\n\n`, + `data: ${JSON.stringify(googleBody([{ functionCall: { name: "shell_command", args: { command: "ls" } } }]))}\n\n`, + // usageMetadata is the terminal signal; no [DONE] sentinel needed. + `data: ${JSON.stringify({ usageMetadata: { promptTokenCount: 5, candidatesTokenCount: 2 } })}\n\n`, + ]; + + const stream = new ReadableStream({ + start(controller) { + const encoder = new TextEncoder(); + for (const frame of frames) controller.enqueue(encoder.encode(frame)); + controller.close(); + }, + }); + + const events: AdapterEvent[] = []; + for await (const event of adapter.parseStream(new Response(stream))) { + events.push(event); + } + + // The turn completes cleanly: no error events, terminal done last. + expect(events.some((e: AdapterEvent) => e.type === "error")).toBe(false); + expect(events[events.length - 1]?.type).toBe("done"); + const starts = events.filter((e: AdapterEvent) => e.type === "tool_call_start"); + expect(starts.length).toBe(2); + expect("providerMetadata" in starts[0] ? starts[0].providerMetadata?.google?.thoughtSignature : undefined) + .toBe(SIGNATURE); + expect("providerMetadata" in starts[1] ? starts[1].providerMetadata?.google?.thoughtSignature : undefined) + .toBe(SIGNATURE); + }); + test("a signature replayed through Responses history reaches the rebuilt Google part", async () => { // No cache is warmed here: this is a cold process replaying client-supplied history. const parsed = parseRequestScoped({ From 647b98eb8ae4d4ca3c16e1d515dc17a97e5993e4 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 06:00:42 +0900 Subject: [PATCH 34/88] fix(chat): apply the Fast capability gate to the native passthrough Native /v1/chat/completions decided service_tier from chatServiceTier alone, so a provider declaring supportsServiceTier: false - or an exact-model false - still had the field forwarded. That is fail-open onto upstreams that reject it or bill differently for it. Route the native passthrough through the same resolved Fast policy the rest of the chat path uses, so a fail-closed or per-model declaration is honored on every surface rather than only the translated ones. Carries @olddonkey's #2075, rebased onto current dev. The only manual resolution was an import list in openai-chat.ts where dev had since added AdapterTierMetadata alongside this PR's decideTier and ResolvedFastPolicy; both sides are kept. Closes #1886 --- src/adapters/openai-chat.ts | 46 ++- src/server/chat-native.ts | 13 +- tests/fastwire-characterization-wire.test.ts | 26 +- tests/openai-chat-native-policy.test.ts | 341 +++++++++++++++++++ tests/openrouter-provider-routing.test.ts | 3 +- 5 files changed, 407 insertions(+), 22 deletions(-) create mode 100644 tests/openai-chat-native-policy.test.ts diff --git a/src/adapters/openai-chat.ts b/src/adapters/openai-chat.ts index c5338d5eaa..f6fce1a82c 100644 --- a/src/adapters/openai-chat.ts +++ b/src/adapters/openai-chat.ts @@ -14,12 +14,15 @@ import { buildNonOpenAIToolCatalogNudgeForTools, shouldInjectNonOpenAIToolCatalo import { openRouterProviderPayload, resolveOpenRouterRouting } from "../providers/openrouter-routing"; import { canForwardForeignServiceTierForChatModel, + fastPolicyForModel, supportsServiceTierForModel, } from "../providers/service-tier"; import { canonicalFastTierMarker, createAdapterTierMetadata, + decideTier, type AdapterTierMetadata, + type ResolvedFastPolicy, } from "../providers/fastwire"; import { openaiChatCompletionsUrl } from "./openai-chat-url"; import { stripResponsesOnlyEncryptedMarker } from "./responses-tool-schema"; @@ -96,6 +99,8 @@ export function buildOpenAIChatPassthroughRequest( rawBody: Record, modelId: string, stream: boolean, + fastPolicy: ResolvedFastPolicy = fastPolicyForModel(provider, modelId, undefined, "chat"), + fastMode?: boolean, ): AdapterRequest { const { url, headers, hasCredential } = openAIChatTransport(provider); @@ -123,7 +128,16 @@ export function buildOpenAIChatPassthroughRequest( // `:` siblings the operator never opted out, silently returning prose. if (provider.noStructuredOutputModels?.includes(modelId)) delete body.response_format; - if (provider.chatServiceTier && rawBody.service_tier !== undefined) { + // Run the same complete Fast policy as the translated Chat path, including explicit + // fastMode and foreign-tier handling. On inherited canonical Fast, the passthrough still + // retains the caller's exact spelling; forced Fast uses the policy-owned wire value. + const callerTier = typeof rawBody.service_tier === "string" ? rawBody.service_tier : undefined; + const tierDecision = decideTier(fastPolicy, fastMode, callerTier); + if (tierDecision.kind === "set") { + body.service_tier = fastMode === undefined && canonicalFastTierMarker(callerTier) !== undefined + ? callerTier + : tierDecision.value; + } else if (tierDecision.kind === "forward-caller" && rawBody.service_tier !== undefined) { body.service_tier = rawBody.service_tier; } if (provider.promptCacheKey && rawBody.prompt_cache_key !== undefined) { @@ -1290,6 +1304,23 @@ function thinkingBudgetForEffort(parsed: OcxParsedRequest, reasoningEffort: stri return fraction === undefined ? undefined : Math.max(1, Math.floor(maxBudget * fraction)); } +function canSerializeOpenAIChatServiceTier( + provider: OcxProviderConfig, + modelId: string, + serviceTier: unknown, + tierDecision?: OcxParsedRequest["options"]["tierDecision"], +): boolean { + if (serviceTier === undefined) return false; + if (tierDecision !== undefined) { + return tierDecision.kind === "set" || tierDecision.kind === "forward-caller"; + } + const callerTier = typeof serviceTier === "string" ? serviceTier : undefined; + const callerCanonicalFast = canonicalFastTierMarker(callerTier) !== undefined; + const capability = supportsServiceTierForModel(provider, modelId); + const callerTierForwardAllowed = canForwardForeignServiceTierForChatModel(provider, modelId); + return callerTierForwardAllowed || (callerCanonicalFast && capability === true); +} + export function createOpenAIChatAdapter(provider: OcxProviderConfig): ProviderAdapter { return { name: "openai-chat", @@ -1312,13 +1343,12 @@ export function createOpenAIChatAdapter(provider: OcxProviderConfig): ProviderAd // unclassified Chat routes remain behind the caller-forwarding opt-in. const serviceTier = parsed.options.serviceTier; const tierDecision = parsed.options.tierDecision; - const callerCanonicalFast = canonicalFastTierMarker(serviceTier) !== undefined; - const callerTierForwardAllowed = canForwardForeignServiceTierForChatModel(provider, parsed.modelId); - const canonicalFastCapability = callerCanonicalFast - && supportsServiceTierForModel(provider, parsed.modelId) === true; - const canSerializeServiceTier = tierDecision?.kind === "set" - || tierDecision?.kind === "forward-caller" - || (tierDecision === undefined && (callerTierForwardAllowed || canonicalFastCapability)); + const canSerializeServiceTier = canSerializeOpenAIChatServiceTier( + provider, + parsed.modelId, + serviceTier, + tierDecision, + ); if (canSerializeServiceTier && serviceTier !== undefined) { body.service_tier = serviceTier; } diff --git a/src/server/chat-native.ts b/src/server/chat-native.ts index cc6738b313..b27f29c962 100644 --- a/src/server/chat-native.ts +++ b/src/server/chat-native.ts @@ -27,6 +27,7 @@ import { rateLimitRetryPolicyFor, rotateProviderTransportOn429, } from "../providers/key-failover"; +import { fastPolicyForModel } from "../providers/service-tier"; import type { RouteResult } from "../router"; import type { OcxConfig, OcxProviderConfig } from "../types"; import { fetchWithHeaderTimeout, providerFetch, safeHostLabel } from "./responses/fetch-helpers"; @@ -154,8 +155,16 @@ export async function handleNativeChatCompletions(options: HandleNativeChatOptio translatorBudget.chargeRetained(bytes, { kind: "request_copies" }); retainedRequestBytes = bytes; }; + const buildActiveRequest = () => buildOpenAIChatPassthroughRequest( + activeProvider, + options.chatBody, + route.modelId, + requestedStream, + fastPolicyForModel(activeProvider, route.modelId, route.providerName, "chat"), + config.fastMode, + ); try { - activeRequest = buildOpenAIChatPassthroughRequest(activeProvider, options.chatBody, route.modelId, requestedStream); + activeRequest = buildActiveRequest(); retainRequest(activeRequest); } catch (error) { releaseRetainedRequest(); @@ -222,7 +231,7 @@ export async function handleNativeChatCompletions(options: HandleNativeChatOptio activeProvider = rotated; activeAdapter = createOpenAIChatAdapter(activeProvider); releaseRetainedRequest(); - activeRequest = buildOpenAIChatPassthroughRequest(activeProvider, options.chatBody, route.modelId, requestedStream); + activeRequest = buildActiveRequest(); retainRequest(activeRequest); response = await send(activeRequest, "key-429"); } diff --git a/tests/fastwire-characterization-wire.test.ts b/tests/fastwire-characterization-wire.test.ts index 0b4e89fbf3..4ae9e38242 100644 --- a/tests/fastwire-characterization-wire.test.ts +++ b/tests/fastwire-characterization-wire.test.ts @@ -1,6 +1,7 @@ import { afterEach, describe, expect, spyOn, test } from "bun:test"; import { buildOpenAIChatPassthroughRequest } from "../src/adapters/openai-chat"; import { chatCompletionsToResponsesBody } from "../src/chat/inbound"; +import { fastPolicyForModel } from "../src/providers/service-tier"; import * as adapterResolveModule from "../src/server/adapter-resolve"; import type { RequestLogContext } from "../src/server/request-log"; import { handleResponses } from "../src/server/responses/core"; @@ -364,17 +365,19 @@ describe("FastWire characterization: rawBody observation point", () => { }); describe("FastWire characterization: known bugs", () => { - test("characterization (known bug): native chat passthrough ignores exact-model false", () => { + test("characterization: native chat passthrough honors exact-model false", () => { + // FastWire #1886 native-chat policy fix: exact-model false now strips the caller tier. + const provider: OcxProviderConfig = { + adapter: "openai-chat", + baseUrl: "https://native-chat.example.test/v1", + authMode: "key", + apiKey: "sk-test", + supportsServiceTier: true, + chatServiceTier: true, + modelSupportsServiceTier: { model: false }, + }; const request = buildOpenAIChatPassthroughRequest( - { - adapter: "openai-chat", - baseUrl: "https://native-chat.example.test/v1", - authMode: "key", - apiKey: "sk-test", - supportsServiceTier: true, - chatServiceTier: true, - modelSupportsServiceTier: { model: false }, - }, + provider, { model: "model", messages: [{ role: "user", content: "ping" }], @@ -382,9 +385,10 @@ describe("FastWire characterization: known bugs", () => { }, "model", false, + fastPolicyForModel(provider, "model", "native-chat", "chat"), ); const body = JSON.parse(request.body) as Record; - expect(body.service_tier).toBe("flex"); + expect(body).not.toHaveProperty("service_tier"); }); test("characterization: chat-to-responses conversion preserves service_tier", () => { diff --git a/tests/openai-chat-native-policy.test.ts b/tests/openai-chat-native-policy.test.ts new file mode 100644 index 0000000000..f9657551f5 --- /dev/null +++ b/tests/openai-chat-native-policy.test.ts @@ -0,0 +1,341 @@ +import { afterEach, describe, expect, test } from "bun:test"; +import { mkdtempSync, rmSync } from "node:fs"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import { + buildOpenAIChatPassthroughRequest, + createOpenAIChatAdapter, +} from "../src/adapters/openai-chat"; +import { + decideTier, + tierValueAfterDecision, +} from "../src/providers/fastwire"; +import { clearKeyCooldowns } from "../src/providers/key-failover"; +import { fastPolicyForModel } from "../src/providers/service-tier"; +import { handleChatCompletions } from "../src/server/chat-completions"; +import type { OcxConfig, OcxParsedRequest, OcxProviderConfig } from "../src/types"; + +const PROVIDER_NAME = "native-tier-fixture"; +const MODEL_ID = "model"; +const originalFetch = globalThis.fetch; + +afterEach(() => { + globalThis.fetch = originalFetch; + clearKeyCooldowns(PROVIDER_NAME); +}); + +function provider(overrides: Partial = {}): OcxProviderConfig { + return { + adapter: "openai-chat", + baseUrl: "https://native-tier.example.test/v1", + authMode: "key", + apiKey: "sk-test", + ...overrides, + }; +} + +function nativeBody( + target: OcxProviderConfig, + callerTier: string | undefined, + modelId = MODEL_ID, + fastMode?: boolean, +): Record { + const policy = fastPolicyForModel(target, modelId, PROVIDER_NAME, "chat"); + const request = buildOpenAIChatPassthroughRequest( + target, + { + model: modelId, + messages: [{ role: "user", content: "ping" }], + ...(callerTier === undefined ? {} : { service_tier: callerTier }), + }, + modelId, + false, + policy, + fastMode, + ); + return JSON.parse(request.body) as Record; +} + +function mainPathBody( + target: OcxProviderConfig, + callerTier: string | undefined, + modelId = MODEL_ID, + fastMode?: boolean, +): Record { + const policy = fastPolicyForModel(target, modelId, PROVIDER_NAME, "chat"); + const tierDecision = decideTier(policy, fastMode, callerTier); + const serviceTier = tierValueAfterDecision(tierDecision, callerTier); + const parsed: OcxParsedRequest = { + modelId, + stream: false, + context: { messages: [{ role: "user", content: "ping" }], tools: [] }, + options: { + ...(serviceTier === undefined ? {} : { serviceTier }), + tierDecision, + }, + }; + const request = createOpenAIChatAdapter(target).buildRequest(parsed); + return JSON.parse(request.body) as Record; +} + +function forwardsTier(body: Record): boolean { + return Object.hasOwn(body, "service_tier"); +} + +describe("native Chat passthrough service-tier policy", () => { + test.each([ + { + name: "provider false stays fail-closed even with CallerTierForward", + config: { supportsServiceTier: false, chatServiceTier: true }, + callerTier: "priority", + expectedTier: undefined, + }, + { + name: "exact-model false narrows provider support", + config: { + supportsServiceTier: true, + chatServiceTier: true, + modelSupportsServiceTier: { [MODEL_ID]: false }, + }, + callerTier: "priority", + expectedTier: undefined, + }, + { + name: "exact-model true authorizes canonical Fast without CallerTierForward", + config: { modelSupportsServiceTier: { [MODEL_ID]: true } }, + callerTier: "FAST", + expectedTier: "FAST", + }, + { + name: "exact-model true does not authorize a foreign tier", + config: { modelSupportsServiceTier: { [MODEL_ID]: true } }, + callerTier: "flex", + expectedTier: undefined, + }, + { + name: "unclassified support drops a caller tier without CallerTierForward", + config: {}, + callerTier: "flex", + expectedTier: undefined, + }, + { + name: "unclassified support forwards a caller tier with CallerTierForward", + config: { chatServiceTier: true }, + callerTier: "flex", + expectedTier: "flex", + }, + { + name: "classified foreign-tier drop overrides CallerTierForward", + config: { + supportsServiceTier: true, + chatServiceTier: true, + fastWire: { + kind: "service-tier", + canonicalToWire: { priority: "priority" }, + foreignCallerTiers: "drop", + }, + }, + callerTier: "flex", + expectedTier: undefined, + }, + ] as const)("$name", ({ config, callerTier, expectedTier }) => { + const body = nativeBody(provider(config), callerTier); + if (expectedTier === undefined) expect(body).not.toHaveProperty("service_tier"); + else expect(body.service_tier).toBe(expectedTier); + }); + + test("the native handler passes its resolved fail-closed policy to the builder", async () => { + const captured: Record[] = []; + globalThis.fetch = (async (_input: RequestInfo | URL, init?: RequestInit) => { + captured.push(JSON.parse(String(init?.body ?? "{}")) as Record); + return Response.json({ + id: "chatcmpl_native_tier", + object: "chat.completion", + choices: [{ index: 0, message: { role: "assistant", content: "ok" }, finish_reason: "stop" }], + }); + }) as typeof fetch; + const target = provider({ supportsServiceTier: false, chatServiceTier: true }); + const config = { + port: 0, + defaultProvider: PROVIDER_NAME, + providers: { [PROVIDER_NAME]: target }, + } as OcxConfig; + + const response = await handleChatCompletions( + new Request("http://localhost/v1/chat/completions", { + method: "POST", + headers: { "content-type": "application/json" }, + body: JSON.stringify({ + model: `${PROVIDER_NAME}/${MODEL_ID}`, + messages: [{ role: "user", content: "ping" }], + service_tier: "priority", + }), + }), + config, + { model: "", provider: "" }, + ); + + expect(response.status).toBe(200); + expect(captured).toHaveLength(1); + expect(captured[0]).not.toHaveProperty("service_tier"); + }); + + test("forced Fast injects the policy wire value and forced default drops the caller tier", () => { + const target = provider({ supportsServiceTier: true, chatServiceTier: true }); + + expect(nativeBody(target, "flex", MODEL_ID, true).service_tier).toBe("priority"); + expect(nativeBody(target, undefined, MODEL_ID, true).service_tier).toBe("priority"); + expect(nativeBody(target, "priority", MODEL_ID, false)).not.toHaveProperty("service_tier"); + }); + + test("key failover rebuilds the request without reintroducing a dropped foreign tier", async () => { + const previousHome = process.env.OPENCODEX_HOME; + const home = mkdtempSync(join(tmpdir(), "ocx-native-tier-failover-")); + process.env.OPENCODEX_HOME = home; + const captured: Array<{ authorization: string | null; body: Record }> = []; + globalThis.fetch = (async (_input: RequestInfo | URL, init?: RequestInit) => { + captured.push({ + authorization: new Headers(init?.headers).get("authorization"), + body: JSON.parse(String(init?.body ?? "{}")) as Record, + }); + if (captured.length === 1) { + return Response.json({ error: { message: "rate limited" } }, { + status: 429, + headers: { "retry-after": "0" }, + }); + } + return Response.json({ + id: "chatcmpl_native_tier_failover", + object: "chat.completion", + choices: [{ index: 0, message: { role: "assistant", content: "ok" }, finish_reason: "stop" }], + }); + }) as typeof fetch; + const target = provider({ + supportsServiceTier: true, + chatServiceTier: true, + fastWire: { + kind: "service-tier", + canonicalToWire: { priority: "priority" }, + foreignCallerTiers: "drop", + }, + apiKey: "key-one", + apiKeyPool: [{ id: "one", key: "key-one" }, { id: "two", key: "key-two" }], + }); + const config = { + port: 0, + defaultProvider: PROVIDER_NAME, + providers: { [PROVIDER_NAME]: target }, + } as OcxConfig; + + try { + const response = await handleChatCompletions( + new Request("http://localhost/v1/chat/completions", { + method: "POST", + headers: { "content-type": "application/json" }, + body: JSON.stringify({ + model: `${PROVIDER_NAME}/${MODEL_ID}`, + messages: [{ role: "user", content: "ping" }], + service_tier: "flex", + }), + }), + config, + { model: "", provider: "" }, + ); + + expect(response.status).toBe(200); + expect(captured.map(entry => entry.authorization)).toEqual(["Bearer key-one", "Bearer key-two"]); + expect(captured).toHaveLength(2); + for (const entry of captured) expect(entry.body).not.toHaveProperty("service_tier"); + } finally { + if (previousHome === undefined) delete process.env.OPENCODEX_HOME; + else process.env.OPENCODEX_HOME = previousHome; + rmSync(home, { recursive: true, force: true }); + } + }); +}); + +describe("main and native Chat tier authorization parity", () => { + test.each([ + { + name: "provider fail-closed", + config: { supportsServiceTier: false, chatServiceTier: true }, + callerTier: "priority", + forwarded: false, + }, + { + name: "exact-model fail-closed", + config: { + supportsServiceTier: true, + chatServiceTier: true, + modelSupportsServiceTier: { [MODEL_ID]: false }, + }, + callerTier: "priority", + forwarded: false, + }, + { + name: "exact-model canonical Fast", + config: { modelSupportsServiceTier: { [MODEL_ID]: true } }, + callerTier: "fast", + forwarded: true, + mainTier: "priority", + nativeTier: "fast", + }, + { + name: "exact-model foreign tier", + config: { modelSupportsServiceTier: { [MODEL_ID]: true } }, + callerTier: "flex", + forwarded: false, + }, + { + name: "unclassified without CallerTierForward", + config: {}, + callerTier: "priority", + forwarded: false, + }, + { + name: "unclassified with CallerTierForward", + config: { chatServiceTier: true }, + callerTier: "flex", + forwarded: true, + mainTier: "flex", + nativeTier: "flex", + }, + { + name: "classified foreign-tier drop with CallerTierForward", + config: { + supportsServiceTier: true, + chatServiceTier: true, + fastWire: { + kind: "service-tier", + canonicalToWire: { priority: "priority" }, + foreignCallerTiers: "drop", + }, + }, + callerTier: "flex", + forwarded: false, + }, + ] as const)("$name makes the same forward/drop decision", row => { + const target = provider(row.config); + const main = mainPathBody(target, row.callerTier); + const native = nativeBody(target, row.callerTier); + + expect(forwardsTier(main)).toBe(row.forwarded); + expect(forwardsTier(native)).toBe(row.forwarded); + expect(forwardsTier(native)).toBe(forwardsTier(main)); + if (row.forwarded) { + expect(main.service_tier).toBe(row.mainTier); + expect(native.service_tier).toBe(row.nativeTier); + } + }); + + test("forced Fast and forced default make the same decision on both Chat paths", () => { + const target = provider({ supportsServiceTier: true, chatServiceTier: true }); + + for (const fastMode of [true, false] as const) { + const main = mainPathBody(target, "flex", MODEL_ID, fastMode); + const native = nativeBody(target, "flex", MODEL_ID, fastMode); + expect(forwardsTier(native)).toBe(forwardsTier(main)); + expect(native.service_tier).toBe(main.service_tier); + } + }); +}); diff --git a/tests/openrouter-provider-routing.test.ts b/tests/openrouter-provider-routing.test.ts index b6ee368f3f..7a833a5b7a 100644 --- a/tests/openrouter-provider-routing.test.ts +++ b/tests/openrouter-provider-routing.test.ts @@ -7,6 +7,7 @@ import { openRouterRoutingConfigError, openRouterProviderPayload, } from "../src/providers/openrouter-routing"; +import { fastPolicyForModel } from "../src/providers/service-tier"; import { clearKeyCooldowns, rotateProviderTransportOn429 } from "../src/providers/key-failover"; import { routeModel } from "../src/router"; import { providerManagementConfigError, safeConfigDTO } from "../src/server/auth-cors"; @@ -39,7 +40,7 @@ function passthroughBody( const request = buildOpenAIChatPassthroughRequest(providerConfig, { messages: [{ role: "user", content: "hello" }], ...rawBody, - }, modelId, false); + }, modelId, false, fastPolicyForModel(providerConfig, modelId, undefined, "chat")); return JSON.parse(request.body as string) as Record; } From ef7efac6f01029b3890161a8550a1d4ffb225502 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 11:21:38 +0900 Subject: [PATCH 35/88] fix(chat): let decideTier own the absent-decision fallback too canSerializeOpenAIChatServiceTier re-derived its own answer when the router supplied no tierDecision, returning true whenever foreign caller tiers could be forwarded at all. decideTier consults the resolved policy for the specific tier, so the two disagreed: a provider whose fastWire sets foreignCallerTiers: "drop" would still serialize a caller's flex. The fallback now calls decideTier and serializes only set/forward-caller, which makes the state machine the single authority on both paths. Found by CodeRabbit on #2151. --- src/adapters/openai-chat.ts | 11 +++-- tests/openai-chat-native-policy.test.ts | 56 +++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 4 deletions(-) diff --git a/src/adapters/openai-chat.ts b/src/adapters/openai-chat.ts index f6fce1a82c..61557b1407 100644 --- a/src/adapters/openai-chat.ts +++ b/src/adapters/openai-chat.ts @@ -1314,11 +1314,14 @@ function canSerializeOpenAIChatServiceTier( if (tierDecision !== undefined) { return tierDecision.kind === "set" || tierDecision.kind === "forward-caller"; } + // No decision from the router means this call did not go through the tier state machine, so + // ask that machine rather than re-deriving a looser answer beside it. The previous fallback + // returned true whenever foreign forwarding was allowed at all, which let a caller tier + // reach the wire in cases `decideTier` would have dropped — the two paths disagreeing is + // precisely the bug, so there is now only one authority. const callerTier = typeof serviceTier === "string" ? serviceTier : undefined; - const callerCanonicalFast = canonicalFastTierMarker(callerTier) !== undefined; - const capability = supportsServiceTierForModel(provider, modelId); - const callerTierForwardAllowed = canForwardForeignServiceTierForChatModel(provider, modelId); - return callerTierForwardAllowed || (callerCanonicalFast && capability === true); + const decision = decideTier(fastPolicyForModel(provider, modelId, undefined, "chat"), undefined, callerTier); + return decision.kind === "set" || decision.kind === "forward-caller"; } export function createOpenAIChatAdapter(provider: OcxProviderConfig): ProviderAdapter { diff --git a/tests/openai-chat-native-policy.test.ts b/tests/openai-chat-native-policy.test.ts index f9657551f5..01a15d7497 100644 --- a/tests/openai-chat-native-policy.test.ts +++ b/tests/openai-chat-native-policy.test.ts @@ -82,6 +82,29 @@ function forwardsTier(body: Record): boolean { return Object.hasOwn(body, "service_tier"); } +/** + * The translated path WITHOUT a router-supplied `tierDecision`. + * + * `mainPathBody` always computes and passes a decision, so it never exercises the adapter's + * absent-decision fallback. That fallback used to re-derive its own looser answer beside + * `decideTier` instead of asking it, which let a foreign caller tier reach the wire on a + * provider whose policy drops foreign tiers. + */ +function undecidedPathBody( + target: OcxProviderConfig, + callerTier: string | undefined, + modelId = MODEL_ID, +): Record { + const parsed: OcxParsedRequest = { + modelId, + stream: false, + context: { messages: [{ role: "user", content: "ping" }], tools: [] }, + options: { ...(callerTier === undefined ? {} : { serviceTier: callerTier }) }, + }; + const request = createOpenAIChatAdapter(target).buildRequest(parsed); + return JSON.parse(request.body) as Record; +} + describe("native Chat passthrough service-tier policy", () => { test.each([ { @@ -144,6 +167,39 @@ describe("native Chat passthrough service-tier policy", () => { else expect(body.service_tier).toBe(expectedTier); }); + describe("the translated path with no router tier decision defers to decideTier", () => { + const dropsForeign = { + supportsServiceTier: true, + chatServiceTier: true, + fastWire: { + kind: "service-tier" as const, + canonicalToWire: { priority: "priority" }, + foreignCallerTiers: "drop" as const, + }, + }; + + test("a foreign caller tier is dropped when the policy drops foreign tiers", () => { + // Before the fix this serialized `flex` because the fallback only asked whether foreign + // forwarding was allowed anywhere, not what the policy decided for this tier. + expect(undecidedPathBody(provider(dropsForeign), "flex")).not.toHaveProperty("service_tier"); + }); + + test("a canonical Fast tier still serializes through the same path", () => { + expect(undecidedPathBody(provider(dropsForeign), "priority").service_tier).toBe("priority"); + }); + + test("the fallback and decideTier cannot disagree", () => { + // The invariant, stated directly: whatever the state machine decides for this caller + // tier is what the wire carries, with or without a router-supplied decision. + for (const callerTier of ["flex", "priority", "auto", "default"]) { + const target = provider(dropsForeign); + const decision = decideTier(fastPolicyForModel(target, MODEL_ID, undefined, "chat"), undefined, callerTier); + const serializes = decision.kind === "set" || decision.kind === "forward-caller"; + expect(forwardsTier(undecidedPathBody(target, callerTier))).toBe(serializes); + } + }); + }); + test("the native handler passes its resolved fail-closed policy to the builder", async () => { const captured: Record[] = []; globalThis.fetch = (async (_input: RequestInfo | URL, init?: RequestInit) => { From a0635eaa2ec16344e25f77f41916637f9cddc4c3 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 04:02:12 +0900 Subject: [PATCH 36/88] fix(claude): gate the shell hook on an installed Claude Code CLI The .zshrc hook was appended whenever system-env injection succeeded, so a user who never installed Claude Code still got an OpenCodex-owned block sourcing a file for a CLI they do not have, and a stale block survived uninstalling it. Write the hook only when an executable claude is discoverable on PATH, and reconcile rather than append: when Claude Code or system-env integration is gone, remove the OpenCodex-owned block and leave every user line untouched. Empty PATH segments are ignored so a workspace-local file is never mistaken for a durable installation, and a failed removal is reported as failed instead of reported as absent. Carries @lilinxiong's #2105 implementation and tests. Added a note on the intended failure direction: "installed" is answered from the PATH of the calling process, so a service context with a stripped PATH can remove a hook an interactive shell would have kept. That is reversible on the next foreground ocx start, whereas a hook pointing at an uninstalled CLI is the stale state this reconciliation exists to clear. Closes #2105 --- .../src/content/docs/fr/guides/claude-code.md | 5 +- .../src/content/docs/guides/claude-code.md | 5 +- .../src/content/docs/ja/guides/claude-code.md | 4 +- .../src/content/docs/ko/guides/claude-code.md | 4 +- .../src/content/docs/ru/guides/claude-code.md | 5 +- .../src/content/docs/tr/guides/claude-code.md | 8 +- .../content/docs/zh-cn/guides/claude-code.md | 4 +- .../content/docs/zh-tw/guides/claude-code.md | 4 +- src/cli/index.ts | 13 +- src/server/system-env.ts | 67 ++++++++- tests/claude-shell-hook.test.ts | 135 ++++++++++++++++++ 11 files changed, 235 insertions(+), 19 deletions(-) create mode 100644 tests/claude-shell-hook.test.ts diff --git a/docs-site/src/content/docs/fr/guides/claude-code.md b/docs-site/src/content/docs/fr/guides/claude-code.md index 9579f84a9a..8a5ccf79b2 100644 --- a/docs-site/src/content/docs/fr/guides/claude-code.md +++ b/docs-site/src/content/docs/fr/guides/claude-code.md @@ -142,7 +142,10 @@ par le proxy sans nécessiter le wrapper `ocx claude`. Les shells déjà ouverts `ocx stop` et l'arrêt du proxy **suppriment les variables injectées** (ils ne restaurent pas les valeurs précédentes — seules les clés injectées par opencodex sont supprimées). Le proxy écrit également `~/.opencodex/claude-env.sh` ; -`ocx start` installe un hook source `.zshrc` qui le charge automatiquement. +`ocx start` installe le hook source `.zshrc` uniquement lorsqu’un exécutable Claude Code CLI est +présent dans le `PATH`. Au démarrage et avec `ocx ensure`, le hook appartenant à OpenCodex est supprimé +si aucun exécutable du CLI Claude Code n’est trouvé dans le `PATH` ou si l’intégration de l’environnement +système est inactive. Claude Desktop utilise son propre profil et ne déclenche pas l’installation du hook shell. Désactivez cette intégration avec `claudeCode.systemEnv: false` dans la configuration ou avec le commutateur de l'interface. La fonctionnalité est réservée à macOS ; sur les autres plateformes, utilisez `ocx claude`. diff --git a/docs-site/src/content/docs/guides/claude-code.md b/docs-site/src/content/docs/guides/claude-code.md index 8f5a305a44..7c3a86dea3 100644 --- a/docs-site/src/content/docs/guides/claude-code.md +++ b/docs-site/src/content/docs/guides/claude-code.md @@ -142,7 +142,10 @@ requiring the `ocx claude` wrapper. Already-open shells are unaffected and must `ocx stop` and proxy shutdown **unset the injected keys** (it does not restore previous values — only the keys opencodex injected are removed). The proxy also writes `~/.opencodex/claude-env.sh`; -`ocx start` installs a `.zshrc` source hook that loads it automatically. +`ocx start` installs a `.zshrc` source hook that loads it automatically only when an executable +Claude Code CLI is present on `PATH`. Startup and `ocx ensure` remove the OpenCodex-owned hook when +Claude Code is absent or system environment integration is inactive. Claude Desktop uses its +separate profile and does not cause shell-hook installation. Disable with `claudeCode.systemEnv: false` in the configuration or with the GUI toggle. This feature is macOS-only; on other platforms, use `ocx claude`. diff --git a/docs-site/src/content/docs/ja/guides/claude-code.md b/docs-site/src/content/docs/ja/guides/claude-code.md index 4254e9a906..532419e23f 100644 --- a/docs-site/src/content/docs/ja/guides/claude-code.md +++ b/docs-site/src/content/docs/ja/guides/claude-code.md @@ -37,7 +37,9 @@ ocx claude `ocx stop` とプロキシ終了は**注入されたキーを解除します**。以前の値を復元せず、opencodex が 注入したキーのみ削除します。プロキシは `~/.opencodex/claude-env.sh` も書き出し、`ocx start` はこのファイルを -自動で読み込む `.zshrc` source hook をインストールします。 +自動で読み込む `.zshrc` source hook を、実行可能な Claude Code CLI が `PATH` にある場合にのみインストールします。 +Claude Code が存在しない場合、またはシステム環境連携が無効な場合、起動処理と `ocx ensure` は OpenCodex が追加した +hook を削除します。Claude Desktop は独立した profile を使用し、shell hook のインストールを引き起こしません。 設定で `claudeCode.systemEnv: false` に指定するか GUI トグルでオフにできます。この機能は macOS 専用で、他のプラットフォームでは `ocx claude` を使ってください。 diff --git a/docs-site/src/content/docs/ko/guides/claude-code.md b/docs-site/src/content/docs/ko/guides/claude-code.md index a3bab95851..c5aae96d36 100644 --- a/docs-site/src/content/docs/ko/guides/claude-code.md +++ b/docs-site/src/content/docs/ko/guides/claude-code.md @@ -62,7 +62,9 @@ macOS의 자동 연결(`claudeCode.systemEnv`)도 같은 방식으로 판단하 `ocx stop`과 프록시 종료는 **주입된 키를 해제해요**. 이전 값을 복원하지는 않고 opencodex가 주입한 키만 제거해요. 프록시는 `~/.opencodex/claude-env.sh`도 작성하고, `ocx start`는 이 파일을 -자동으로 불러오는 `.zshrc` source hook을 설치해요. +자동으로 불러오는 `.zshrc` source hook을 실행 가능한 Claude Code CLI가 `PATH`에 있을 때만 설치해요. +Claude Code가 없거나 시스템 환경 연동이 비활성화되어 있으면 시작 과정과 `ocx ensure`가 OpenCodex가 추가한 +hook을 제거해요. Claude Desktop은 별도 profile을 사용하며 shell hook 설치를 유발하지 않아요. 설정에서 `claudeCode.systemEnv: false`로 지정하거나 GUI 토글로 끌 수 있어요. 이 기능은 macOS 전용이며, 다른 플랫폼에서는 `ocx claude`를 사용하세요. diff --git a/docs-site/src/content/docs/ru/guides/claude-code.md b/docs-site/src/content/docs/ru/guides/claude-code.md index c8e88c1947..46bc060c40 100644 --- a/docs-site/src/content/docs/ru/guides/claude-code.md +++ b/docs-site/src/content/docs/ru/guides/claude-code.md @@ -39,7 +39,10 @@ ocx claude `ocx stop` и остановка прокси **снимают внедрённые ключи** (прежние значения не восстанавливаются — удаляются только ключи, внедрённые opencodex). Прокси также записывает `~/.opencodex/claude-env.sh`; -`ocx start` устанавливает source-хук в `.zshrc`, который загружает этот файл автоматически. +`ocx start` устанавливает source-хук в `.zshrc` только когда исполняемый Claude Code CLI найден в +`PATH`. При запуске и выполнении `ocx ensure` хук, принадлежащий OpenCodex, удаляется, если файл Claude +Code CLI не найден в `PATH`, не имеет права на выполнение или системная интеграция окружения выключена. +Claude Desktop использует отдельный профиль и не вызывает установку shell-хука. Отключить можно параметром `claudeCode.systemEnv: false` в конфигурации или переключателем в GUI. Функция доступна только на macOS; на других платформах используйте `ocx claude`. diff --git a/docs-site/src/content/docs/tr/guides/claude-code.md b/docs-site/src/content/docs/tr/guides/claude-code.md index 918ccaba62..e335bea33e 100644 --- a/docs-site/src/content/docs/tr/guides/claude-code.md +++ b/docs-site/src/content/docs/tr/guides/claude-code.md @@ -172,8 +172,11 @@ olan kabuklar etkilenmez ve yeniden açılmalıdır. `ocx stop` ve proxy'nin kapatılması **enjekte edilen anahtarları kaldırır** (önceki değerleri geri yüklemez — yalnızca opencodex'in enjekte ettiği anahtarlar kaldırılır). Proxy ayrıca `~/.opencodex/claude-env.sh` dosyasını -yazar; `ocx start`, bunu otomatik olarak yükleyen bir `.zshrc` kaynak kancası -kurar. +yazar; `ocx start`, bunu otomatik olarak yükleyen `.zshrc` kaynak kancasını +yalnızca çalıştırılabilir Claude Code CLI `PATH` içinde bulunduğunda kurar. +Claude Code yoksa veya sistem ortamı entegrasyonu etkin değilse başlangıç işlemi +ve `ocx ensure`, OpenCodex tarafından eklenen kancayı kaldırır. Claude Desktop ayrı +bir profil kullanır ve shell kancasının kurulmasını tetiklemez. Yapılandırmada `claudeCode.systemEnv: false` ile veya GUI anahtarıyla devre dışı bırakın. Bu özellik yalnızca macOS içindir; diğer platformlarda `ocx claude` @@ -605,4 +608,3 @@ aracının `model` argümanını değil, `` yönergelerin kullanır. Yönergenin hedeflenen rotayla eşleştiğinden emin olun. Model yer tutucusu olarak `"haiku"` iletin. - diff --git a/docs-site/src/content/docs/zh-cn/guides/claude-code.md b/docs-site/src/content/docs/zh-cn/guides/claude-code.md index 1bb5ef6acf..08fb965f27 100644 --- a/docs-site/src/content/docs/zh-cn/guides/claude-code.md +++ b/docs-site/src/content/docs/zh-cn/guides/claude-code.md @@ -37,7 +37,9 @@ shell 不受影响,必须重新打开。 `ocx stop` 和代理关闭操作会**取消设置已注入的键**(不会恢复之前的值——只会移除 opencodex 注入的键)。代理还会写入 `~/.opencodex/claude-env.sh`;`ocx start` 会安装一个 `.zshrc` -source hook,以自动加载该文件。 +source hook,以自动加载该文件,但仅限 `PATH` 中存在可执行的 Claude Code CLI。Claude Code +不存在或系统环境集成未启用时,启动过程和 `ocx ensure` 会移除 OpenCodex 自己写入的 hook。 +Claude Desktop 使用独立 profile,不会触发 shell hook 安装。 可以在配置中设置 `claudeCode.systemEnv: false`,或使用 GUI 开关来禁用。此功能仅适用于 macOS;在其他平台上,请使用 `ocx claude`。 diff --git a/docs-site/src/content/docs/zh-tw/guides/claude-code.md b/docs-site/src/content/docs/zh-tw/guides/claude-code.md index bc21c430f1..be06746fba 100644 --- a/docs-site/src/content/docs/zh-tw/guides/claude-code.md +++ b/docs-site/src/content/docs/zh-tw/guides/claude-code.md @@ -113,7 +113,9 @@ shell 不受影響,必須重新開啟。 `ocx stop` 和代理關閉操作會**取消設定已注入的鍵**(不會恢復之前的值——只會移除 opencodex 注入的鍵)。代理還會寫入 `~/.opencodex/claude-env.sh`;`ocx start` 會安裝一個 `.zshrc` -source hook,以自動載入該檔案。 +source hook,以自動載入該檔案,但僅限 `PATH` 中存在可執行的 Claude Code CLI。Claude Code +不存在或系統環境整合未啟用時,啟動程序和 `ocx ensure` 會移除 OpenCodex 自己寫入的 hook。 +Claude Desktop 使用獨立 profile,不會觸發 shell hook 安裝。 可以在設定中設定 `claudeCode.systemEnv: false`,或使用 GUI 開關來停用。此功能僅適用於 macOS;在其他平臺上,請使用 `ocx claude`。 diff --git a/src/cli/index.ts b/src/cli/index.ts index bbb265d2b5..eda778b16b 100755 --- a/src/cli/index.ts +++ b/src/cli/index.ts @@ -46,9 +46,8 @@ import { loadServiceTokenFromFile } from "../lib/service-secrets"; import { diagnoseService, isServiceOwnershipError, serviceCommand, serviceEnvironmentOwnedHere, serviceStartableFromTray, serviceStatusSummary, stopServiceIfInstalled, uninstallServiceIfInstalled } from "../service"; import { startupHealthSummary } from "../codex/autostart-health"; import { drainAndShutdown, isRecyclingForExit, startServer } from "../server"; -import { injectSystemEnv, revertSystemEnv } from "../server/system-env"; +import { injectSystemEnv, reconcileShellHook, revertSystemEnv, uninstallShellHook } from "../server/system-env"; import { buildDesktop3pRegistry } from "../claude/desktop-3p"; -import { installShellHook, uninstallShellHook } from "../server/system-env"; import { startTokenGuardian } from "../oauth/token-guardian"; import { startHistoryMigrationGuardian } from "../codex/history-migration-guardian"; import { maybeShowStarPrompt } from "./star-prompt"; @@ -366,9 +365,10 @@ async function handleStart(options: { block?: boolean } = {}) { // System-wide env injection AFTER signal handlers are registered (crash safety: // syncCleanup reverts even if injection itself or subsequent startup steps fail). - await injectSystemEnv(port, config).catch(() => {}); - // Auto-install .zshrc hook (idempotent — skips if already present). - installShellHook(); + const systemEnv = await injectSystemEnv(port, config).catch(() => ({ injected: false })); + // The hook is useful only for an installed Claude Code CLI. Reconcile instead of + // appending unconditionally so stale OpenCodex-owned hooks are removed as well. + reconcileShellHook(systemEnv.injected); await maybeShowStarPrompt(); // once-only Yes/No GitHub-star prompt on first interactive start // Post-startup sync drives the readiness gate AND the #1046 stale app-server @@ -455,7 +455,8 @@ async function handleEnsure(options: { existingIsSuccess?: boolean } = {}): Prom }); if (synced?.status === "skipped") console.log(" Codex integration OFF; startup left Codex native."); // Ensure env file exists for already-running proxy (may have been deleted or pre-dates this feature). - await injectSystemEnv(live.port, config).catch(() => {}); + const systemEnv = await injectSystemEnv(live.port, config).catch(() => ({ injected: false })); + reconcileShellHook(systemEnv.injected); // Refresh the Grok Build fence too (same contract as start). live.hostname is the // hostname the running proxy actually bound — config.hostname may have drifted. try { diff --git a/src/server/system-env.ts b/src/server/system-env.ts index 0ae251605c..927fc48682 100644 --- a/src/server/system-env.ts +++ b/src/server/system-env.ts @@ -1,6 +1,6 @@ import { execFileSync } from "node:child_process"; -import { readFileSync, writeFileSync, unlinkSync, mkdirSync } from "node:fs"; -import { join } from "node:path"; +import { accessSync, constants, readFileSync, writeFileSync, unlinkSync, mkdirSync, statSync } from "node:fs"; +import { delimiter, join } from "node:path"; import { getConfigDir } from "../config"; import { resolveAutoContext, type AutoContextMode } from "../claude/context-windows"; import { PROXY_MARKER, defaultAuthDetectDeps, detectClaudeAuth, ownAdmissionTokens } from "../claude/auth-detect"; @@ -122,11 +122,72 @@ export function uninstallShellHook(): { removed: boolean; reason?: string } { const cleaned = content.replace(/\n?# opencodex claude-env hook\n\[.*claude-env\.sh.*\n?/g, "\n"); writeFileSync(zshrcPath, cleaned, { encoding: "utf8", mode: 0o644 }); return { removed: true }; - } catch { + } catch (error) { + if (error && typeof error === "object" && (error as { code?: unknown }).code === "ENOENT") { + return { removed: false, reason: "not installed" }; + } return { removed: false, reason: "read/write failed" }; } } +/** Whether a real `claude` executable is discoverable from this process's PATH. */ +export function claudeCodeCliInstalled(pathValue = process.env.PATH): boolean { + if (!pathValue) return false; + for (const directory of pathValue.split(delimiter)) { + // An empty PATH segment means the current directory. Do not let the proxy treat a + // workspace-local file as a durable user installation. + if (!directory) continue; + const candidate = join(directory, "claude"); + try { + if (!statSync(candidate).isFile()) continue; + accessSync(candidate, constants.X_OK); + return true; + } catch { + // Keep scanning PATH after missing, non-file, and non-executable entries. + } + } + return false; +} + +/** + * Keep the shell hook aligned with the integration that can actually consume it. + * Claude Desktop uses its own profile and does not source `.zshrc`; this hook exists + * only for plain Claude Code CLI launches. + * + * Reconciliation is PATH-sensitive by construction: "Claude Code is installed" is answered + * from the PATH of whichever process calls this. A launchd/service context with a stripped + * PATH can therefore fail to see a `claude` the user's interactive shell finds, and this will + * remove the hook. That is the intended failure direction — removing an OpenCodex-owned block + * is reversible on the next foreground `ocx start`, whereas leaving a hook pointing at an + * uninstalled CLI is the stale state this reconciliation exists to clear. Only the block + * carrying our own marker is ever touched; user lines are preserved. + */ +export function reconcileShellHook(systemEnvInjected: boolean): { + changed: boolean; + state: "installed" | "absent" | "failed"; + reason?: string; +} { + if (process.platform !== "darwin") return { changed: false, state: "absent", reason: "not macOS" }; + if (systemEnvInjected && claudeCodeCliInstalled()) { + const result = installShellHook(); + if (result.installed) return { changed: true, state: "installed" }; + if (result.reason === "already installed") { + return { changed: false, state: "installed", reason: result.reason }; + } + return { changed: false, state: "failed", reason: result.reason ?? "install failed" }; + } + + const result = uninstallShellHook(); + if (!result.removed && result.reason !== "not installed") { + return { changed: false, state: "failed", reason: result.reason ?? "remove failed" }; + } + return { + changed: result.removed, + state: "absent", + reason: systemEnvInjected ? "Claude Code not installed" : "system environment inactive", + }; +} + const SYSTEM_ENV_NAMES = [ "ANTHROPIC_BASE_URL", "CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY", diff --git a/tests/claude-shell-hook.test.ts b/tests/claude-shell-hook.test.ts new file mode 100644 index 0000000000..2b02b84d26 --- /dev/null +++ b/tests/claude-shell-hook.test.ts @@ -0,0 +1,135 @@ +import { afterEach, beforeEach, describe, expect, test } from "bun:test"; +import { chmodSync, existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs"; +import { tmpdir } from "node:os"; +import { delimiter, join } from "node:path"; +import { claudeCodeCliInstalled, reconcileShellHook } from "../src/server/system-env"; + +const originalPlatform = process.platform; +let originalHome: string | undefined; +let originalPath: string | undefined; +let root = ""; +let binDir = ""; +let zshrcPath = ""; + +function setPlatform(platform: NodeJS.Platform): void { + Object.defineProperty(process, "platform", { configurable: true, value: platform }); +} + +/** Create the smallest executable that represents a Claude Code CLI on PATH. */ +function installClaudeCli(): void { + const executable = join(binDir, "claude"); + writeFileSync(executable, "#!/bin/sh\nexit 0\n", { mode: 0o755 }); + chmodSync(executable, 0o755); +} + +beforeEach(() => { + root = mkdtempSync(join(tmpdir(), "ocx-claude-hook-")); + binDir = join(root, "bin"); + zshrcPath = join(root, ".zshrc"); + mkdirSync(binDir); + originalHome = process.env.HOME; + originalPath = process.env.PATH; + process.env.HOME = root; + process.env.PATH = binDir; + setPlatform("darwin"); +}); + +afterEach(() => { + if (originalHome === undefined) delete process.env.HOME; + else process.env.HOME = originalHome; + if (originalPath === undefined) delete process.env.PATH; + else process.env.PATH = originalPath; + setPlatform(originalPlatform); + rmSync(root, { recursive: true, force: true }); +}); + +describe("Claude Code shell-hook reconciliation", () => { + test("does not create .zshrc when Claude Code is absent", () => { + expect(claudeCodeCliInstalled()).toBe(false); + expect(reconcileShellHook(true)).toMatchObject({ changed: false, state: "absent" }); + expect(existsSync(zshrcPath)).toBe(false); + }); + + test("removes only the stale OpenCodex hook when Claude Code is absent", () => { + writeFileSync(zshrcPath, [ + "export USER_SETTING=1", + "# opencodex claude-env hook", + "[ -f ~/.opencodex/claude-env.sh ] && source ~/.opencodex/claude-env.sh", + "alias keep-me='yes'", + "", + ].join("\n")); + + expect(reconcileShellHook(true)).toEqual({ + changed: true, + state: "absent", + reason: "Claude Code not installed", + }); + const content = readFileSync(zshrcPath, "utf8"); + expect(content).toContain("export USER_SETTING=1"); + expect(content).toContain("alias keep-me='yes'"); + expect(content).not.toContain("opencodex claude-env hook"); + expect(content).not.toContain("claude-env.sh"); + }); + + test("installs the hook only for an executable Claude Code CLI and stays idempotent", () => { + installClaudeCli(); + expect(claudeCodeCliInstalled()).toBe(true); + expect(reconcileShellHook(true)).toEqual({ changed: true, state: "installed" }); + expect(reconcileShellHook(true)).toEqual({ + changed: false, + state: "installed", + reason: "already installed", + }); + expect(readFileSync(zshrcPath, "utf8").match(/opencodex claude-env hook/g)).toHaveLength(1); + }); + + test("does not treat a non-executable claude file as an installed CLI", () => { + writeFileSync(join(binDir, "claude"), "#!/bin/sh\nexit 0\n", { mode: 0o644 }); + + expect(claudeCodeCliInstalled()).toBe(false); + expect(reconcileShellHook(true)).toMatchObject({ changed: false, state: "absent" }); + expect(existsSync(zshrcPath)).toBe(false); + }); + + test("removes the hook when system environment integration is inactive", () => { + installClaudeCli(); + reconcileShellHook(true); + + expect(reconcileShellHook(false)).toEqual({ + changed: true, + state: "absent", + reason: "system environment inactive", + }); + expect(readFileSync(zshrcPath, "utf8")).not.toContain("opencodex claude-env hook"); + }); + + test("ignores empty PATH segments instead of trusting a workspace-local claude file", () => { + writeFileSync(join(root, "claude"), "#!/bin/sh\nexit 0\n", { mode: 0o755 }); + const previousCwd = process.cwd(); + process.chdir(root); + process.env.PATH = `${delimiter}${binDir}`; + + try { + expect(claudeCodeCliInstalled()).toBe(false); + } finally { + process.chdir(previousCwd); + } + }); + + test("reports hook-removal failures instead of claiming the hook is absent", () => { + mkdirSync(zshrcPath); + + expect(reconcileShellHook(false)).toEqual({ + changed: false, + state: "failed", + reason: "read/write failed", + }); + }); + + test("start and ensure reconcile the hook from the actual injection result", async () => { + const source = await Bun.file(new URL("../src/cli/index.ts", import.meta.url)).text(); + + expect(source).not.toMatch(/\n\s*installShellHook\(\);/); + expect(source.match(/reconcileShellHook\(systemEnv\.injected\)/g)).toHaveLength(2); + }); +}); From b394b035bfac14b0aac2b9ca439cd7f51b75dea2 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 11:25:53 +0900 Subject: [PATCH 37/88] fix(claude): remove a CRLF hook block instead of reporting a false success Two defects CodeRabbit found on #2144. uninstallShellHook matched the owned block with LF-only newlines. A .zshrc with CRLF endings -- ordinary on a home directory an editor or another OS has touched -- did not match, so the file was rewritten unchanged while the caller was told the hook was removed. The hook kept sourcing on every new interactive shell and the reported state said it did not. The pattern now accepts CR?LF and verifies the marker is gone before claiming removal; a block shaped differently is reported failed. Both cli/index.ts call sites discarded the result, so state: "failed" -- the one outcome the user has to act on -- was never surfaced. They now print the reason and where to look. --- src/cli/index.ts | 16 +++++++++++-- src/server/system-env.ts | 12 ++++++++-- tests/claude-shell-hook.test.ts | 42 +++++++++++++++++++++++++++++++++ 3 files changed, 66 insertions(+), 4 deletions(-) diff --git a/src/cli/index.ts b/src/cli/index.ts index eda778b16b..e723db0e56 100755 --- a/src/cli/index.ts +++ b/src/cli/index.ts @@ -56,6 +56,18 @@ import { maybeShowUpdatePrompt } from "../update/notify"; import { syncModelsToCodex } from "../codex/sync"; import { setIntegrationEnabled, shouldSyncCodexOnStart, shouldSyncGrokOnStart, syncCodexOnStartIfEnabled } from "../codex/desired-state"; +/** + * A failed shell-hook reconcile is not cosmetic: a stale hook keeps sourcing + * `claude-env.sh` from every new interactive shell, pointing at a proxy or a CLI that may no + * longer exist. `reconcileShellHook` already reports `state: "failed"`, but both call sites + * discarded it, so the one outcome the user has to act on was the one they never saw. + */ +function reportShellHookFailure(result: { state: "installed" | "absent" | "failed"; reason?: string }): void { + if (result.state !== "failed") return; + console.warn(` Claude shell hook not reconciled${result.reason ? `: ${result.reason}` : ""}`); + console.warn(" Check ~/.zshrc for the '# opencodex claude-env hook' block."); +} + import { removeOwnedConfigState } from "../lib/config-ownership"; import { withProcessRuntimeProvenance } from "../lib/bun-runtime"; @@ -368,7 +380,7 @@ async function handleStart(options: { block?: boolean } = {}) { const systemEnv = await injectSystemEnv(port, config).catch(() => ({ injected: false })); // The hook is useful only for an installed Claude Code CLI. Reconcile instead of // appending unconditionally so stale OpenCodex-owned hooks are removed as well. - reconcileShellHook(systemEnv.injected); + reportShellHookFailure(reconcileShellHook(systemEnv.injected)); await maybeShowStarPrompt(); // once-only Yes/No GitHub-star prompt on first interactive start // Post-startup sync drives the readiness gate AND the #1046 stale app-server @@ -456,7 +468,7 @@ async function handleEnsure(options: { existingIsSuccess?: boolean } = {}): Prom if (synced?.status === "skipped") console.log(" Codex integration OFF; startup left Codex native."); // Ensure env file exists for already-running proxy (may have been deleted or pre-dates this feature). const systemEnv = await injectSystemEnv(live.port, config).catch(() => ({ injected: false })); - reconcileShellHook(systemEnv.injected); + reportShellHookFailure(reconcileShellHook(systemEnv.injected)); // Refresh the Grok Build fence too (same contract as start). live.hostname is the // hostname the running proxy actually bound — config.hostname may have drifted. try { diff --git a/src/server/system-env.ts b/src/server/system-env.ts index 927fc48682..f23a33531c 100644 --- a/src/server/system-env.ts +++ b/src/server/system-env.ts @@ -118,8 +118,16 @@ export function uninstallShellHook(): { removed: boolean; reason?: string } { try { const content = readFileSync(zshrcPath, "utf8"); if (!content.includes(SHELL_HOOK_MARKER)) return { removed: false, reason: "not installed" }; - // Remove the hook block (marker line + source line + surrounding newlines) - const cleaned = content.replace(/\n?# opencodex claude-env hook\n\[.*claude-env\.sh.*\n?/g, "\n"); + // Match CR?LF, not LF alone. A .zshrc with CRLF line endings — ordinary on a home + // directory an editor or another OS has touched — did not match, so the file was + // rewritten unchanged and the caller was told the hook was removed. Reporting success + // while the hook still sources on every new shell is the worse of the two failures. + const cleaned = content.replace(/\r?\n?# opencodex claude-env hook\r?\n\[.*claude-env\.sh.*(?:\r?\n)?/g, "\n"); + // Verify instead of assuming: if the marker survives, the block is shaped in a way this + // pattern does not own, and the honest answer is failure rather than a silent no-op. + if (cleaned.includes(SHELL_HOOK_MARKER)) { + return { removed: false, reason: "hook block present but not in the expected shape; remove it manually" }; + } writeFileSync(zshrcPath, cleaned, { encoding: "utf8", mode: 0o644 }); return { removed: true }; } catch (error) { diff --git a/tests/claude-shell-hook.test.ts b/tests/claude-shell-hook.test.ts index 2b02b84d26..9a2b4cbd36 100644 --- a/tests/claude-shell-hook.test.ts +++ b/tests/claude-shell-hook.test.ts @@ -103,6 +103,48 @@ describe("Claude Code shell-hook reconciliation", () => { expect(readFileSync(zshrcPath, "utf8")).not.toContain("opencodex claude-env hook"); }); + // A .zshrc with CRLF endings is ordinary on a home directory an editor or another OS has + // touched. The removal pattern matched LF only, so the file was rewritten unchanged while + // the caller was told the hook was gone — the worse outcome, because the hook keeps + // sourcing on every new shell and the reported state says it does not. + test("removes a CRLF-terminated hook block instead of reporting a false success", () => { + installClaudeCli(); + reconcileShellHook(true); + const installed = readFileSync(zshrcPath, "utf8"); + writeFileSync(zshrcPath, installed.replace(/\n/g, "\r\n"), "utf8"); + + const result = reconcileShellHook(false); + + expect(readFileSync(zshrcPath, "utf8")).not.toContain("opencodex claude-env hook"); + expect(result.state).toBe("absent"); + }); + + test("unrelated CRLF lines survive the removal", () => { + installClaudeCli(); + writeFileSync(zshrcPath, "export FOO=1\n", "utf8"); + reconcileShellHook(true); + const installed = readFileSync(zshrcPath, "utf8"); + writeFileSync(zshrcPath, installed.replace(/\n/g, "\r\n"), "utf8"); + + reconcileShellHook(false); + const after = readFileSync(zshrcPath, "utf8"); + + expect(after).toContain("export FOO=1"); + expect(after).not.toContain("claude-env.sh"); + }); + + test("a marker block this pattern does not own is reported failed, not removed", () => { + installClaudeCli(); + // The marker is there but the next line is not the block we wrote, so it is not ours to + // delete. Answering "removed" here would be a claim the user acts on and it would be false. + writeFileSync(zshrcPath, "# opencodex claude-env hook\n# hand-edited by the user\n", "utf8"); + + const result = reconcileShellHook(false); + + expect(result.state).toBe("failed"); + expect(readFileSync(zshrcPath, "utf8")).toContain("hand-edited by the user"); + }); + test("ignores empty PATH segments instead of trusting a workspace-local claude file", () => { writeFileSync(join(root, "claude"), "#!/bin/sh\nexit 0\n", { mode: 0o755 }); const previousCwd = process.cwd(); From d2493a147d5286f54be34735a13f5d13f8f19597 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 05:23:05 +0900 Subject: [PATCH 38/88] fix(providers): allow a baseUrl override for Anthropic and Antigravity Both providers were pinned to their registry endpoint, so a user behind a corporate gateway or self-hosted relay could not point them anywhere else. Opt both into allowBaseUrlOverride, and require https for the destination because these are the two OAuth entries in that set: the override receives a subscription bearer. Carries @drakonkat's #2109 and #2110, combined because they share one destination-policy change and a single registry parity list. Merging them separately conflicts on that list; neither depends on the other's runtime. Also closes the gap review raised on both PRs. providerSecureTransportConfigError returned before classifying the URL whenever allowPrivateNetwork was set, so http://attacker.example with that opt-in passed the gate and adapters attached the bearer in cleartext to a public host. allowPrivateNetwork states that a destination is intentionally local; it is not a waiver of transport security. The address is now classified first, and the opt-in only excuses http for a destination that really is loopback or private. Closes #2109 Closes #2110 --- .../000_research_inventory.md | 289 ++++++++++++++++++ .../010_layer1_bearer_admission_2132.md | 70 +++++ .../020_layer2_responses_id_backfill_2131.md | 43 +++ .../030_sibling_prompt_cache_retention.md | 38 +++ .../040_sibling_routing_capability.md | 31 ++ .../050_sibling_k12_short_window.md | 25 ++ .../060_supersede_and_close_operations.md | 37 +++ .../070_execution_log.md | 180 +++++++++++ src/lib/destination-policy.ts | 47 +++ src/providers/registry.ts | 3 +- tests/anthropic-baseurl-override.test.ts | 144 +++++++++ tests/antigravity-baseurl-override.test.ts | 117 +++++++ .../provider-model-discovery-contract.test.ts | 13 +- tests/provider-registry-parity.test.ts | 5 +- .../router-discarded-baseurl-warning.test.ts | 15 +- tests/router-template-baseurl.test.ts | 3 +- 16 files changed, 1044 insertions(+), 16 deletions(-) create mode 100644 devlog/_plan/260820_bug_pr_backlog_consolidation/000_research_inventory.md create mode 100644 devlog/_plan/260820_bug_pr_backlog_consolidation/010_layer1_bearer_admission_2132.md create mode 100644 devlog/_plan/260820_bug_pr_backlog_consolidation/020_layer2_responses_id_backfill_2131.md create mode 100644 devlog/_plan/260820_bug_pr_backlog_consolidation/030_sibling_prompt_cache_retention.md create mode 100644 devlog/_plan/260820_bug_pr_backlog_consolidation/040_sibling_routing_capability.md create mode 100644 devlog/_plan/260820_bug_pr_backlog_consolidation/050_sibling_k12_short_window.md create mode 100644 devlog/_plan/260820_bug_pr_backlog_consolidation/060_supersede_and_close_operations.md create mode 100644 devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md create mode 100644 tests/anthropic-baseurl-override.test.ts create mode 100644 tests/antigravity-baseurl-override.test.ts diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/000_research_inventory.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/000_research_inventory.md new file mode 100644 index 0000000000..1b68a3fe29 --- /dev/null +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/000_research_inventory.md @@ -0,0 +1,289 @@ +# 000 — Research: open bug-PR backlog inventory, rubric, and disposition + +Unit: 260820_bug_pr_backlog_consolidation +Work-phase: wp1 (docs-only roadmap cycle, LOOP-DOCS-FIRST-01) +Baseline: origin/dev = ceac592d7. Worktree branch codex/fix-subagent-roster-truncation (PR #2134). + +Evidence for every claim below came from six read-only xai/grok-4.6 investigation lanes that +read the actual PR diffs with `gh pr diff` and cross-read the runtime in this worktree. Code +edits stay in the main agent. + +## 1. Inventory + +27 open bug-labeled PRs; 25 authored by someone other than lidge-jun. 17 open bug issues. + +| PR | Author | Draft | Subsystem | Files | +|---|---|---|---|---| +| 2131 | bet4it | no | responses id backfill | server/responses | +| 2127 | agentHits | yes | antigravity thought_signature | adapters/google | +| 2115 | louis-tepe | no | adapter prompt nudge | adapters/* | +| 2110 | drakonkat | no | antigravity baseUrl override | providers/registry, lib/destination-policy | +| 2109 | drakonkat | no | anthropic baseUrl override | providers/registry, lib/destination-policy | +| 2105 | lilinxiong | no | claude shell hook | cli/index, server/system-env | +| 2104 | olddonkey | no | xai OAuth responses streaming | adapters/xai | +| 2102 | lilinxiong | no | gpt-5.6 prompt_cache_retention | adapters/openai-responses | +| 2101 | Ingwannu | no | account entitlement gating | codex/catalog | +| 2100 | ntdatt812 | no | routing capability evidence | routing/capability | +| 2099 | yzxcj797 | yes | gpt-5.6 prompt_cache_retention | adapters/openai-responses | +| 2091 | luvs01 | no | prompt_cache_retention (all forward) | adapters/openai-responses | +| 2082 | yzxcj797 | yes | AgentRouter language preamble | adapters | +| 2077 | ntdatt812 | no | lab behavior overrides | routing/compatibility/behavior | +| 2075 | olddonkey | no | Fast gate native chat (CONFLICTING) | adapters/openai-chat | +| 2067 | waw4303 | yes | opencode-free headers | providers/registry | +| 2063 | yzxcj797 | yes | K12 detail.code denials (CONFLICTING) | codex/quota-rejection | +| 2062 | yzxcj797 | yes | K12 short-window quota | codex/quota, codex/routing | +| 2056 | Ingwannu | no | K12 short-window quota | codex/quota, codex/routing | +| 2054 | keepitmello | yes | cursor checkpoints (CONFLICTING) | adapters/cursor | +| 2053 | Ingwannu | no | superseded OAuth commits | oauth/* | +| 2040 | Ingwannu | no | routed tool_search passthrough | server/responses | +| 2032 | yzxcj797 | yes | claude root bypass | cli/claude | +| 2029 | yzxcj797 | yes | probe session bus absent | service-manager-probe | +| 2027 | yzxcj797 | yes | opencode-go quota gating | providers/quota | + +## 2. Scoring rubric + +Score = severity (0-35) + blast radius (0-25) + evidence quality (0-20) + fix tractability (0-20). +Threshold for this campaign: **>= 60**. + +- severity: does it break a core path (routing, auth, streaming, config persistence) for a + default configuration, or is it peripheral/cosmetic? +- blast radius: how many users/configurations does the defect reach? +- evidence quality: deterministic reproduction with logs/curl, or assertion? +- fix tractability: is a correct, testable fix small and self-contained? + +## 3. Scores and disposition + +| Item | Score | Disposition | +|---|---|---| +| Issue #2132 bearer admission forces ChatGPT credential | 96 | ABSORB — no PR exists; highest-value gap in the backlog | +| Issue #2092 / PRs #2102,#2099,#2091 prompt_cache_retention | 86 | ABSORB #2102 as base; supersede #2099, #2091 | +| Issue #2114/#1939 / PR #2029 probe bus | 80 | SUPERSEDED by maintainer PR #2130 (already open) | +| PR #2131 responses output id backfill | 80 | ABSORB | +| PR #2100 routing capability evidence | 80 | ABSORB | +| PR #2047 / #2056 + #2062 K12 short-window quota | 72 | ABSORB #2056; supersede #2062 | +| PR #2053 superseded OAuth credential commits | 72 | KEEP — C4 auth, needs human security review (MAINTAINERS.md) | +| PRs #2109 + #2110 baseUrl override | 68 | HOLD — unresolved security gap, see §6 | +| PR #2101 account entitlement gating | 64 | KEEP — large (20 files), needs its own cycle | +| PR #2077 lab behavior overrides | 62 | ABSORB | +| PR #2040 routed tool_search passthrough | 62 | KEEP — 14 files, own cycle | +| PR #2105 claude shell hook | 60 | ABSORB | +| PR #2063 K12 detail.code | — | SUPERSEDED by already-merged #2055 | +| PR #2115 code mode nudge | 54 | BELOW THRESHOLD — contracts native-OpenAI detection; needs human adapter pass | +| PR #2082 AgentRouter language | 54 | BELOW THRESHOLD | +| PR #2027 opencode-go quota | 56 | BELOW THRESHOLD | +| PR #2067 opencode-free headers | 50 | BELOW THRESHOLD | +| PR #2054 cursor checkpoints | 46 | BELOW THRESHOLD — hypothesis pending wire trace | +| PR #2032 claude root bypass | 46 | BELOW THRESHOLD — maintainer already rejected the default | +| PR #2104, #2075, #2127 | n/a | Deferred: #2075 and #2054 are CONFLICTING; #2127 is an active draft by its author | + +## 4. Duplicate clusters (evidence-backed) + +**prompt_cache_retention (issue #2092).** #2102 gates on `forward && isCanonicalOpenAiForwardProvider` +and matches `gpt-5.6` / `gpt-5.6-*`. #2099 uses a looser `startsWith("gpt-5.6")` on ANY forward +provider and carries a stray package.json 2.24.2 -> 2.25.0 bump. #2091 strips the field for every +forward request and every model, which inverts the existing gpt-5.5 preserve pin at +tests/openai-responses-passthrough.test.ts:807 — the issue reporter explicitly withdrew the +global claim. #2102 is the correct contract. + +**K12 short-window quota (issue #2047).** #2056 is a strict superset of #2062: it adds +`snapshotHasShort`, partial-snapshot preservation, `updateAccountQuota` carry, and the +parse -> cache -> DTO path the issue requires. Both rewrite the same two functions and WOULD +conflict. #2062 also carries the same stray version bump. + +**Probe bus (issues #2114/#1939).** #2130's `busUnreachable()` is a superset of #2029's two +strings and adds the on-disk unit check that #2029's reviewer demanded. Landing #2029 on top of +#2130 would REGRESS the disk check back to unconditional `absent`. + +## 5. Structural finding: this backlog is not one stack + +DEV-STACK-01 permits stacking only when later parts consume earlier parts' output. Measured file +overlap across the absorb set: + +| Cluster | Files | +|---|---| +| PCR consolidation | src/adapters/openai-responses.ts | +| #2132 + #2131 | src/server/responses/core.ts (**shared**) | +| #2100 | src/routing/capability.ts | +| #2077 | src/routing/compatibility/behavior.ts | +| K12 | src/codex/quota.ts, src/codex/routing.ts | +| #2105 | src/cli/index.ts, src/server/system-env.ts | + +Exactly one real dependency edge exists: **#2132 and #2131 both modify +`src/server/responses/core.ts`**, so they must be ordered. Everything else is disjoint. + +Forcing 12 disjoint fixes into one 12-layer chain would violate DEV-STACK-01's independence +clause and the 2-4 depth guidance, and would impose a false merge order in which an unrelated +layer blocks every layer above it. The honest shape is therefore **one bounded stack rooted on +#2134 for the genuinely dependent Responses work, plus sibling PRs off dev for the disjoint +fixes**. That is recorded here rather than silently reshaped. + +## 6. Security holds (detail deliberately not recorded here) + +The baseUrl-override pair (#2109/#2110) has an unresolved gap already raised publicly in the +CodeRabbit thread on those PRs. Per AGENTS.md, pre-disclosure security reasoning does not go in +this public directory: the analysis lives in scratch only, and these PRs are HOLD, not absorb, +until a human security pass. #2053 is C4 OAuth and requires the security review MAINTAINERS.md +mandates; it is KEEP, not absorb. + +## 7. Attribution contract + +Every superseded PR gets (a) its author credited by @login in the superseding PR body, +(b) a courteous closing comment naming the replacement PR and what was carried over, +(c) no force-push and no edit to the contributor's own branch. + + +--- + +# P-phase amendment (A-gate self-audit, 2026-08-20): the stack premise in §5 was WRONG + +The A-phase auditor lane produced nothing across three wait cycles, so it was retired +(DISPATCH-RETIRE-01) and the load-bearing claims were verified directly. Two of them failed. + +## Correction 1 — #2131 does NOT touch `src/server/responses/core.ts` + +`gh pr diff 2131 --name-only` returns `src/server/responses/responses-field-backfill.ts`, +its test, and eight docs locales. `core.ts` already imports that module on `dev` +(`src/server/responses/core.ts:6-7`, called at :3098-3099); #2131 only changes the module's +internals and signature. It never edits `core.ts`. + +#2132's fix lives in `resolveResponsesCodexAuth` (`core.ts:1082-1114`), a different region of +a file #2131 does not modify at all. + +**Therefore the single dependency edge claimed in §5 does not exist.** The corrected file map: + +| Item | Files | Overlap | +|---|---|---| +| #2132 | src/server/responses/core.ts (auth resolution) | none | +| #2131 | src/server/responses/responses-field-backfill.ts | none | +| #2102 | src/adapters/openai-responses.ts | none | +| #2100 | src/routing/capability.ts | none | +| #2077 | src/routing/compatibility/behavior.ts | none | +| #2056 | src/codex/quota.ts, src/codex/routing.ts | none | +| #2105 | src/cli/index.ts, src/server/system-env.ts | none | + +Every absorbed item is disjoint. **There is no dependency-ordered chain in this backlog at all.** + +## Consequence: this work must NOT be stacked + +DEV-STACK-01 forbids stacking independent parts: "the parts are independent — open parallel PRs +off trunk instead, since a stack imposes a false merge order." Building the requested chain +would mean any layer's review blocking every layer above it, for zero dependency benefit, and +would violate the same rule the request asked to follow. + +Docs 010 and 020 are therefore **superseded**: both become siblings based on `dev`, not layers. +PR #2134 remains its own independent PR. The stack rooted on #2134 is cancelled and the reason +is recorded here rather than the plan being quietly reshaped. + +**One exception preserved:** if two absorbed items ever do touch one file, they stack. None do. + +## Correction 2 — issue #2132 is confirmed present, with a sharper mechanism than 010 assumed + +Verified in this worktree: +- `core.ts:1088`: `const substituteMainCredential = options.admission?.source === "bearer";` + keys on HOW the caller authenticated, never on WHERE the request routes. +- `auth-context.ts:542-548`: with `ctx.kind === "main"` and that flag, a missing/dead stored + main token throws `CodexMainSubstitutionUnavailableError`. +- `core.ts:1148-1153`: that becomes the reported 401. +- The `authCtx = { kind: "main" }` fallback at `core.ts:1105` is taken whenever + `route.codexAccountMode` is unset — which is every non-`openai` provider. + +So a key-auth routed provider reaches `kind: "main"` + `substituteMainCredential: true` and +fails, exactly as reported. The defect is real and 010's fix direction stands; only its stack +position changes. + +## Correction 3 — supersede claims re-verified + +`gh pr view 2055`: `MERGED` at 2026-08-19T00:11:27Z, merge commit `2648ffa879edf93e`. #2063's +supersede stands. + +## Revised work-phase map + +| WP | Doc | Branch | Base | Content | +|---|---|---|---|---| +| wp2 | 010 | codex/fix-bearer-admission-2132 | dev | issue #2132 (score 96) | +| wp3 | 030 | codex/consolidate-prompt-cache-retention | dev | absorb #2102; supersede #2099, #2091 | +| wp4 | 040 | codex/absorb-capability-evidence | dev | absorb #2100, #2077 | +| wp5 | 050 | codex/absorb-k12-short-window | dev | absorb #2056; supersede #2062, #2063 | +| wp6 | 020 | codex/absorb-responses-id-backfill | dev | absorb #2131 + unique-id correction | +| wp7 | 060 | — | — | close-outs with attribution | + +Ordered by score, not by dependency, because no dependency exists. Each is independently +reviewable and independently mergeable, which is what DEV-STACK-01 actually asks for. + + +## Correction 4 — #2130 merged mid-cycle; #2029 is now superseded in fact, not in prospect + +`gh pr view 2130`: `MERGED` at 2026-08-19T17:25:26Z. The probe lane's verdict was conditional +("SUPERSEDED, once #2130 merges"); that condition is now satisfied. + +Consequence for `060`: **#2029 (@yzxcj797)** moves from a prospective close to an immediate one. +`dev` now carries `busUnreachable()` — a superset of #2029's two stderr strings — plus the +on-disk unit check that #2029's own reviewer demanded. Landing #2029 on top would REGRESS that +disk check back to an unconditional `absent`. Nothing from #2029 needs to be carried over; its +one unique behavior (keeping `DBUS_SESSION_BUS_ADDRESS not set` as `unknown`) is precisely what +the merged disk check replaces. + +This also removes #2130 from the open-bug-PR set: the fresh count at wp1 close is 26 open bug +PRs, of which exactly one (#2134) is lidge-jun's and 25 are not. + +## wp1 close-out evidence + +`gh pr list --repo lidge-jun/opencodex --state open --label bug --limit 100` at close: +26 total, mine = [2134], non-mine = 25. Every one of those 25 numbers appears in §1/§3 of this +document (verified by a grep loop over the list, exit 0). No open bug PR is left without a +disposition. + + +--- + +# A-gate amendment 2 — retired auditor returned late with VERDICT: FAIL; findings adjudicated + +The adversarial lane retired under DISPATCH-RETIRE-01 (three empty wait cycles) delivered after +retirement. Its verdict is FAIL. It is adjudicated here rather than discarded, because a late +reviewer is still a reviewer. + +**Findings 1 and 2 — CONFIRMED, and already corrected.** It independently measured the same +`gh pr diff --name-only` evidence and reached the same conclusion as amendment 1: #2131 does not +touch `core.ts`, no dependency edge exists, and rooting a stack on #2134 (which only touches +`agent-settings-routes.ts`) is a second DEV-STACK-01 violation. Two independent measurements now +agree. Recorded as settled. + +**Finding 5 — CONFIRMED, and it is the sharpest catch.** Doc 010 said to gate substitution on +"the native ChatGPT **pool**". That would exclude `codexAccountMode: "direct"` and re-break +#1686, whose whole point is that Direct bearer admission is only safe *because* substitution +still runs. The implemented fix uses `route.codexAccountMode !== undefined`, which covers both +`pool` and `direct` and matches the issue reporter's own suggested gate. 010's prose is +superseded by this line; the code is correct. + +**Finding 3 — CONFIRMED and material.** Overlap was measured only inside the absorb set. Three +OTHER open PRs edit `src/server/responses/core.ts`: + +| PR | Overlap with the #2132 fix | +|---|---| +| #2104 (@olddonkey) | `src/server/responses/core.ts` — review-ready, MERGEABLE | +| #2101 (@Ingwannu) | `core.ts` + `compact.ts` + `auth-context.ts` — all three files this fix touches | +| #2040 (@Ingwannu) | `core.ts` | + +Verified by `gh pr diff --name-only`. The #2132 change is 5 lines across two files and does not +restructure either function, so a textual conflict is possible but small. This is a merge-order +hazard to state on the PR, not a reason to withhold the fix. #2104 is reclassified from `n/a` +to KEEP (review-ready, not a conflicting draft — the auditor is right that grouping it with +CONFLICTING #2075 and draft #2127 was an error, and its inventory row's "adapters/xai" file +attribution was wrong). + +**Finding 4 — CONFIRMED. #2105 would have been lost.** It is scored 60 ABSORB in §3, has no +decade doc, and appears in no row of 060. An above-threshold item with no execution path is +exactly how a contributor's work disappears without a close comment. Disposition corrected to +**KEEP — remains open**, because no replacement exists. It is not closed. + +**Nits accepted:** "strict superset" overstates #2056 vs #2062 (#2062 uniquely adds +`tests/rate-limit-reset-credits.test.ts`); #2130 has empty `closingIssuesReferences` so +#1939/#2114/#2108 will not auto-close; the rubric is recorded as a single integer, so the +component arithmetic is not independently auditable. + +## Net effect on the plan + +No absorbed item is dropped and no new one is added. Two dispositions change (#2104 n/a -> KEEP, +#2105 ABSORB -> KEEP), one prose invariant in 010 is superseded by the implemented predicate, +and one merge hazard is now stated. The sibling shape from amendment 1 stands, reinforced. + diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/010_layer1_bearer_admission_2132.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/010_layer1_bearer_admission_2132.md new file mode 100644 index 0000000000..991c3bb62a --- /dev/null +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/010_layer1_bearer_admission_2132.md @@ -0,0 +1,70 @@ +> **SUPERSEDED IN PART — read `000_research_inventory.md` amendments 1 and 2 first.** +> +> Two things in this document are wrong and were corrected after it was written: +> +> 1. **It is NOT a stack layer and does NOT root on #2134.** No dependency edge exists; +> the shipped PR (#2137) is based on `dev` as a sibling. +> 2. **The substitution predicate is NOT "native ChatGPT pool".** Pool-only would exclude +> `codexAccountMode: "direct"` and re-break #1686, whose Direct admission is only safe +> BECAUSE substitution still runs. The shipped predicate is +> `route.codexAccountMode !== undefined`, covering pool AND direct. Do not "correct" it back. + + +# 010 — Layer 1 (stack bottom): fix issue #2132, bearer admission must not force a ChatGPT credential + +Work-phase: wp2. Branch: `codex/fix-bearer-admission-2132`. Base: `codex/fix-subagent-roster-truncation` (PR #2134). +Absorbs: nothing (no PR exists). Closes: #2132. + +## Why this is the stack bottom + +It is the highest-scoring item in the backlog (96) and it shares `src/server/responses/core.ts` +with layer 2 (#2131). Layer 2 must be based on this, or the two edits to that file collide. + +## Defect + +Reported in #2132: after v2.23.0, a key-auth provider (Cloudflare/etc.) returns 401 +`No usable Codex main credential` when `~/.codex/auth.json` holds no ChatGPT token. Bearer +admission sets `substituteMainCredential` unconditionally, so a route that needs no ChatGPT +identity is still gated on one. + +## P-phase re-verification required (stale check) + +Before editing, confirm against the CURRENT tree — the lane read `dev`, not this branch: +1. `rg -n "substituteMainCredential" src/` — enumerate every producer and consumer. +2. Read `src/server/responses/core.ts`, `src/server/responses/compact.ts`, + `src/codex/auth-context.ts` and establish where the flag is set and where it is read. +3. Reproduce the admission decision in a unit context with a key-auth provider and an + auth.json containing no ChatGPT token. If the current code does NOT reproduce, stop and + amend this doc rather than writing a fix for a defect that is not there. + +## Intended change + +Make the substitution conditional on the resolved route actually requiring a native/ChatGPT +credential. A key-auth routed provider carries its own credential and must be admitted +without one. Exact call sites are fixed during the stale check above; the invariant is: +`substituteMainCredential` is set only when the route's credential source is the native +ChatGPT pool. + +Out of scope: changing what happens once a native route legitimately lacks a credential, +and any change to the pool/account selection itself. + +## Test plan (must fail RED first) + +New `tests/bearer-admission-key-auth.test.ts`: +1. key-auth routed provider + auth.json with NO ChatGPT token -> request is admitted (no 401). +2. native gpt route + no ChatGPT token -> still fails closed with the existing error. +3. key-auth provider + ChatGPT token present -> unchanged behavior (no regression). + +Drive the file against the unpatched tree first and record the failure output; a test that +passes before the fix does not prove anything. + +## Verification + +`bun run typecheck`; `bun test --isolate` on the new file plus the existing responses/auth +suites; full `bun test --isolate tests` before marking review-ready; `bun run privacy:scan`. + +## Standalone thesis (DEV-STACK-03) + +"A provider that carries its own key must not be gated on a ChatGPT credential." Builds and +passes its own tests at its own tip, independent of layer 2. + diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/020_layer2_responses_id_backfill_2131.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/020_layer2_responses_id_backfill_2131.md new file mode 100644 index 0000000000..bb5c088378 --- /dev/null +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/020_layer2_responses_id_backfill_2131.md @@ -0,0 +1,43 @@ +# 020 — Layer 2: absorb PR #2131, backfill missing Responses output ids + +Work-phase: wp3. Branch: `codex/absorb-responses-id-backfill`. Base: `codex/fix-bearer-admission-2132` (layer 1). +Absorbs: **PR #2131 by @bet4it**. Closes: PR #2131 as superseded, with attribution. + +## Dependency edge (the only real one in this backlog) + +#2131 adds `src/server/responses/responses-field-backfill.ts` and calls it from +`src/server/responses/core.ts` — the same file layer 1 edits. This is why it stacks rather +than sitting beside layer 1. + +## Defect + +Strict decoders (grok-build) reject Responses output items that omit `id` on +`message` / `reasoning` / `function_call`. #1941 landed earlier but some relays still omit it. + +## Change to carry over + +@bet4it's implementation, preserved in substance: synthesize stable `msg_ocx_N` / `rs_ocx_N` / +`fc_ocx_N` ids keyed on `output_index`, never overwriting an id that is already present. + +## Correction to apply on top (audit finding, lane: quality) + +An invalid or missing `output_index` collapses to `0`, so two unindexed items can both become +`msg_ocx_0` — duplicate ids, which is the exact class of bug this fixes. Replace the +collapse-to-zero fallback with a monotonic per-response counter so synthesized ids are unique +even when `output_index` is absent or malformed. Add the regression test that pins it. + +Docs: the locale files in #2131 are uneven (EN/FR rewritten, JA/KO/ZH/TR only first sentence). +Carry only the EN change in this layer; locale parity is not this layer's thesis. + +## Test plan (must fail RED first) + +Carry @bet4it's tests (SSE `response.completed`, `output_item.done` via `output_index`, JSON +passthrough, preserve-existing-id, inherited `toString` type) and ADD: +- two items with missing `output_index` receive DISTINCT ids (fails on #2131 as written). + +## Verification + +Same gate as layer 1, plus explicit confirmation that layer 2's branch contains layer 1's +commit (`git log --oneline ..` shows only layer-2 commits) and that the PR +base ref names layer 1's branch. + diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/030_sibling_prompt_cache_retention.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/030_sibling_prompt_cache_retention.md new file mode 100644 index 0000000000..fc66d105c9 --- /dev/null +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/030_sibling_prompt_cache_retention.md @@ -0,0 +1,38 @@ +# 030 — Sibling A: consolidate prompt_cache_retention (issue #2092) + +Work-phase: wp4. Branch: `codex/consolidate-prompt-cache-retention`. Base: **dev** (sibling, not a stack layer). +Absorbs: **PR #2102 by @lilinxiong** (base implementation). Supersedes: **#2099 by @yzxcj797**, **#2091 by @luvs01**. Closes #2092. + +## Why a sibling and not a layer + +It touches only `src/adapters/openai-responses.ts`, which no other absorbed item touches. It has +no dependency on layers 1-2, so stacking it would impose a false merge order (DEV-STACK-01). + +## Chosen contract + +@lilinxiong's #2102: strip `prompt_cache_retention` only when +`forward && isCanonicalOpenAiForwardProvider(provider)` AND the model is `gpt-5.6` or +`gpt-5.6-*`. This matches the issue's own correction — the reporter withdrew the "strip +everywhere" claim, and some non-5.6 deployments still honor the field. + +Rejected: #2091's blanket strip for every forward provider and every model (it inverts the +existing gpt-5.5 preserve pin at tests/openai-responses-passthrough.test.ts:807). +Rejected: #2099's `startsWith("gpt-5.6")`, which also matches `gpt-5.60`, and its stray +package.json 2.24.2 -> 2.25.0 bump. + +## Carried from the superseded PRs + +From @yzxcj797's #2099: the `Fixes #2092` issue link and the repro-shaped fixture +(`store:false`, streamed input array). From @luvs01's #2091: nothing — its key-auth preserve +case is already covered by #2102. + +## Tightening to apply + +Replace the string-prefix family match with the catalog/native-slug predicate if one exists +in the current tree (`rg -n "isGpt56NativeSlug|NATIVE_OPENAI_MODELS" src/`); otherwise keep +the exact `gpt-5.6` / `gpt-5.6-*` match and pin `gpt-5.60` as a NON-match in tests. + +## Test plan (must fail RED first) + +Carry #2102's tests; add `gpt-5.60` non-match; keep the gpt-5.5 preserve pin intact. + diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/040_sibling_routing_capability.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/040_sibling_routing_capability.md new file mode 100644 index 0000000000..62f0016582 --- /dev/null +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/040_sibling_routing_capability.md @@ -0,0 +1,31 @@ +# 040 — Sibling B: routing capability + lab behavior evidence + +Work-phase: wp5. Branch: `codex/absorb-capability-evidence`. Base: **dev**. +Absorbs: **PR #2100 and PR #2077, both by @ntdatt812**. Closes both as superseded. + +## Why these two together, and why a sibling + +#2100 touches `src/routing/capability.ts`; #2077 touches +`src/routing/compatibility/behavior.ts`. Disjoint files, one author, one thesis: *model-keyed +lookups must use the same resolution rules the runtime uses*. Neither depends on layers 1-2. + +Note: #2077 is Lab-adjacent. Verify `tests/core-lab-boundary.test.ts` stays green — the file +already imports Lab types, so this must not newly puncture the boundary. + +## Defects + +#2100: bare map lookups made `gpt-oss:120b` inherit the provider-wide 8k window instead of the +`gpt-oss` family's 131072, and `noVisionModels` was ignored. +#2077: `map[modelId]` missed family/case overrides, and `constructor` resolved to +`Object.prototype.constructor`, making `jcsStringify` throw and silently dropping Lab subjects. + +## Change + +Route both through `modelRecordValue` / `isModelTextOnly` as @ntdatt812 wrote them. Prototype-id +safety (`constructor`, `toString`) is the load-bearing part; keep those tests verbatim. + +## Test plan + +Carry both test files. Confirm the exact-own maps (`modelPreferHostedTools`, +`modelOpenRouterRouting`) still do NOT family-spread. + diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/050_sibling_k12_short_window.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/050_sibling_k12_short_window.md new file mode 100644 index 0000000000..524d543b5c --- /dev/null +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/050_sibling_k12_short_window.md @@ -0,0 +1,25 @@ +# 050 — Sibling C: K12 short-window quota (issue #2047) + +Work-phase: wp6. Branch: `codex/absorb-k12-short-window`. Base: **dev**. +Absorbs: **PR #2056 by @Ingwannu**. Supersedes: **#2062 by @yzxcj797**. Closes #2047. + +## Chosen base + +#2056 is a strict superset of #2062: `snapshotHasShort`, partial-snapshot preservation, +`updateAccountQuota` carry, and the parse -> cache -> DTO path #2047 actually requires. #2062 +drops short on a later weekly/monthly partial snapshot and carries a stray version bump. + +## Blocker to fix before this can land (raised by the maintainer on both PRs) + +A short-only snapshot with `shortPercent: 0` scores `0` instead of `CODEX_UNKNOWN_USAGE_SCORE`, +so `pickLowestUsageAmong` prefers an account whose long windows are unverified. Fix: +include `shortPercent` in `computeCodexUsageScore` only when the plan's governing long window +is finite; otherwise return `CODEX_UNKNOWN_USAGE_SCORE`. Add the short-only regression. + +This blocker is why #2056 is absorbed-and-corrected rather than simply approved. + +## Also close + +**#2063 by @yzxcj797** — superseded by ALREADY-MERGED #2055 (`2648ffa87`), which classifies +`detail.code` with a stricter own-property lookup. Close with attribution; fold nothing. + diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/060_supersede_and_close_operations.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/060_supersede_and_close_operations.md new file mode 100644 index 0000000000..ec55998dfc --- /dev/null +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/060_supersede_and_close_operations.md @@ -0,0 +1,37 @@ +# 060 — Close-out: supersede operations and attribution + +Work-phase: wp7. No code. GitHub state only. + +## Ordering rule + +A PR is closed ONLY after its replacement exists and is pushed. Never close first. + +## Operations + +| Close | Author | Replaced by | Carried over | +|---|---|---|---| +| #2131 | @bet4it | layer 2 (020) | full implementation + tests, plus unique-id correction | +| #2099 | @yzxcj797 | sibling A (030) | issue link, repro fixture | +| #2091 | @luvs01 | sibling A (030) | nothing; contract deliberately narrower | +| #2100 | @ntdatt812 | sibling B (040) | full implementation + tests | +| #2077 | @ntdatt812 | sibling B (040) | full implementation + tests | +| #2102 | @lilinxiong | sibling A (030) | full implementation + tests (base) | +| #2062 | @yzxcj797 | sibling C (050) | nothing; #2056 supersedes | +| #2063 | @yzxcj797 | merged #2055 | nothing | +| #2056 | @Ingwannu | sibling C (050) | full implementation + scorer correction | +| #2029 | @yzxcj797 | maintainer PR #2130 | nothing; #2130 is a superset | + +## Comment template + +> Thanks for this, @ — closing as superseded by #, which carries from your +> patch. Your work is credited in that PR's description. + +## NOT closed, with reasons stated publicly + +- **#2109 / #2110** (@drakonkat): unresolved security gap in the override gate; needs a human + security pass (AGENTS.md security boundary). +- **#2053** (@Ingwannu): C4 OAuth surface; MAINTAINERS.md mandates security review. +- **#2101, #2040**: large (20 and 14 files); each needs its own PABCD cycle. +- **#2115, #2082, #2027, #2067, #2054, #2032**: below the 60 threshold. +- **#2104, #2075, #2127**: #2075/#2054 CONFLICTING; #2127 is an active draft by its author. + diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md new file mode 100644 index 0000000000..3d8506c5fd --- /dev/null +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md @@ -0,0 +1,180 @@ +# 070 — Execution log: what actually shipped + +Appended as work-phases close. This is the record of landed state, distinct from the plan. + +## wp2 — issue #2132 (score 96) + +**PR #2137**, branch `codex/fix-bearer-admission-2132`, base `dev`. + +`substituteMainCredential` was computed from how the caller authenticated and never from where +the request routes, so a key-authenticated provider was gated on a ChatGPT credential it cannot +use. The predicate is now +`options.admission?.source === "bearer" && route.codexAccountMode !== undefined` +at both `core.ts:1088` and `compact.ts:325`. + +It covers `pool` AND `direct`. Doc 010's "native ChatGPT pool" wording would have excluded +`direct` and re-broken #1686, whose Direct admission is only safe because substitution still +runs. 010 now carries a banner saying so. + +Evidence: `tests/bearer-admission-routed-provider.test.ts` driven RED (it reproduced the exact +reported 401), full suite 13516 pass / 0 fail, typecheck and privacy scan clean. Re-audit round 2 +by the same adversarial reviewer returned **VERDICT: PASS**. + +## wp3 — issue #2092 (score 86) + +**PR #2138**, branch `codex/consolidate-prompt-cache-retention`, base `dev`. + +Absorbs @lilinxiong's #2102 contract: strip `prompt_cache_retention` on canonical ChatGPT +forward for the `gpt-5.6` family only, with an exact-or-dashed-prefix match so a future +`gpt-5.60` is not swept up. The retired value is not translated into `prompt_cache_options`. + +Evidence: 5 of the new tests fail when only the adapter change is reverted; the two narrowness +guards stay green in both directions, which is what makes them guards rather than restatements. +Full suite 13537 pass / 0 fail. + +### Closed with attribution + +| PR | Author | Superseded by | Carried | +|---|---|---|---| +| #2102 | @lilinxiong | #2138 | the implementation itself | +| #2099 | @yzxcj797 | #2138 | issue link + repro fixture | +| #2091 | @luvs01 | #2138 | nothing; contract deliberately narrower | +| #2029 | @yzxcj797 | merged #2130 | nothing; #2130 adds the disk check review demanded | +| #2063 | @yzxcj797 | merged #2055 | nothing; #2055 is the stricter own-property lookup | + +Each carries a comment naming the replacement and the specific reason, so no contributor has to +guess why their work closed. + +## Still open by decision, not omission + +- #2109 / #2110 (@drakonkat) — unresolved security gap in the override gate; needs a human pass. +- #2053 (@Ingwannu) — C4 OAuth; MAINTAINERS.md mandates security review. +- #2105 (@lilinxiong) — above threshold but no replacement exists yet; closing it now would lose work. +- #2101, #2040 — 20 and 14 files; each needs its own cycle. +- #2104 (@olddonkey) — review-ready and MERGEABLE; reclassified out of the deferred bucket, it is a + KEEP that deserves review rather than supersession. + +## Remaining work-phases + +wp4 (#2100 + #2077 capability evidence), wp5 (#2056 K12 with the scorer correction), wp6 (#2131 +responses id backfill with the duplicate-id fix). Each is a sibling off `dev`; none depends on +another. + + +## wp6 — PR #2131 (@bet4it) + +**PR #2142**, branch `codex/absorb-responses-id-backfill`, base `dev`. + +Carries @bet4it's implementation and tests, plus one correction: an absent or malformed +`output_index` collapsed to 0, so two such items both synthesized `msg_ocx_0` — duplicate ids, +the exact defect the backfill prevents. Unusable indices now take a monotonic ordinal based far +above any plausible real index. + +Evidence worth naming: applying ONLY @bet4it's original source and running the new suite gives +15 pass / 1 fail, and the single failure is the duplicate-id guard. That is what makes it a guard +rather than a restatement of behavior. + +The inherited assertion `expect(parsed.item.id).toBe("msg_ocx_0")` was replaced, not deleted +quietly, and the replacement is disclosed in the PR body. + +# Campaign state at wp6 close + +Superseded and closed with attribution: #2102, #2099, #2091, #2029, #2063, #2100, #2077, #2056, +#2062, #2131 — ten PRs, each with a comment naming its replacement and the specific reason. + +Opened: #2137 (#2132), #2138 (#2092), #2140 (#2100+#2077), #2141 (#2047), #2142 (#2131), plus +the pre-existing #2134. + +Deliberately still open: #2109/#2110 (security gap), #2053 (C4 OAuth review), #2105 (no +replacement written yet), #2101/#2040 (each needs its own cycle), #2104 (review-ready, deserves +review not supersession), and the below-threshold set (#2115, #2082, #2027, #2067, #2054, #2032, +#2075, #2127). + + +## wp7 — PR #2105 (@lilinxiong) + +**PR #2144**, branch `codex/absorb-claude-shell-hook-gate`, base `dev`. + +Implementation and tests carried unchanged. The one addition is a comment on +`reconcileShellHook` recording that "installed" is answered from the calling process's PATH, so +a service context with a stripped PATH can remove a hook an interactive shell would keep — the +reversible direction, and the one this reconcile wants. + +This closes the finding the auditor raised at #2105: it was scored ABSORB with no execution path +and would have been lost. It now has one. + + +# Campaign close — CI state and honest end state + +All six shipped PRs are green on exact head and MERGEABLE: + +| PR | Fixes | Checks | +|---|---|---| +| #2137 | issue #2132 | 25 pass / 0 fail | +| #2138 | issue #2092 (absorbs #2102) | 25 pass / 0 fail | +| #2140 | absorbs #2100 + #2077 | 25 pass / 0 fail | +| #2141 | issue #2047 (absorbs #2056) | 25 pass / 0 fail | +| #2142 | absorbs #2131 | 23 pass / 0 fail | +| #2144 | absorbs #2105 | 29 pass / 0 fail | + +#2140 first showed `npm-global-smoke` failing on windows-latest with +`EBUSY: resource busy or locked, unlink ...bun.exe` during dependency install — a Windows file +lock during Bun installation, not a defect in the routing change. Rerunning the failed jobs +turned it green, which is the evidence that it was infrastructure rather than the patch. + +## Eleven PRs closed with attribution + +#2102, #2099, #2091, #2029, #2063, #2100, #2077, #2056, #2062, #2131, #2105. + +Each carries a comment naming its replacement, what was carried over, and what was deliberately +not. Where a contributor's own assertion had to be replaced (#2056's `shortPercent: 0` scorer +case, #2131's `msg_ocx_0` collapse case), the replacement is disclosed in both the closing +comment and the superseding PR body rather than done silently. + +## Fourteen PRs deliberately still open + +- **Security holds:** #2109, #2110 (override gate), #2053 (C4 OAuth, MAINTAINERS.md review). +- **Own-cycle scale:** #2101 (20 files), #2040 (14 files). +- **Deserves review, not supersession:** #2104 — review-ready, MERGEABLE, and touching + `core.ts` alongside #2137. +- **Below the 60 threshold:** #2115, #2082, #2027, #2067, #2054, #2032, #2075, #2127. + +Nothing here is an omission. Every one is a recorded decision with a reason. + +## Merging + +Not done. DEV-STACK-04 and DEV-GIT-PUSH-01 both put merge authorization with the user, and +nothing in this campaign changes that. + + +## wp9 — PR #2101 (@Ingwannu): the ONE real stack layer + +**PR #2146**, branch `codex/absorb-account-entitlement-stacked`, base **`codex/fix-bearer-admission-2132`** (the #2137 branch), not `dev`. + +This is the single genuine dependency edge in the entire backlog. #2101 passes +`substituteMainCredentialForDirect: substituteMainCredential` into `resolveCodexAuthContext` — +the exact value #2137 corrects. Landing it on `dev` alone would silently reintroduce #2132 for +every routed provider. Everything else absorbed in this campaign was disjoint and shipped as a +sibling; this one is stacked because the code says so, not because a plan said so. + +Three corrections on top of @Ingwannu's work: + +1. **Selector compact bypassed the wire rewrite** — `accountGatedCompactWireModel` came from + `raw.model`, which never matches the gated map for `side/gpt-daybreak-blue-latest`, so a + selector-form compact still hit the native endpoint. Now derived from `route.modelId`. +2. **Direct callers evicted catalog evidence** — one 64-entry LRU shared between per-credential + Direct keys and the main/Pool keys the catalog projects from. Split into two eviction classes; + pinned by a test verified to fail against the shared LRU. +3. **Comment rot** — `native-models.ts` claimed routing never collapses Daybreak into + `gpt-5.6-sol`, which the wire normalization does. + +Evidence: full suite 13554 pass / 0 fail at the stacked tip; the composition check +(`codex-model-entitlements` + `bearer-admission-routed-provider` + `codex-auth-context` + +`server-auth`) is 146 pass / 0 fail, which is what proves the two layers agree. +Stack integrity: `git log parent..layer` shows exactly 1 commit, and a stack map was added to +#2137 so a reviewer arriving at the parent sees the chain. + +Two gaps named in the PR rather than carried silently: Direct `/v1/models` can still advertise a +Pool-only grant (advertisement only; dispatch still checks the caller credential), and +same-account gated-400 retry stays Pool-only. + diff --git a/src/lib/destination-policy.ts b/src/lib/destination-policy.ts index 75818af311..46b2aa91ba 100644 --- a/src/lib/destination-policy.ts +++ b/src/lib/destination-policy.ts @@ -130,6 +130,50 @@ function registryAllowsPrivateNetwork(name: string): boolean { return getProviderRegistryEntry(name)?.allowPrivateNetworkByDefault === true; } +/** + * OAuth registry entries that opt into `allowBaseUrlOverride` send bearer credentials to a + * user-configured endpoint (review findings, PR #2109 / PR #2110): a cleartext `http:` + * override would expose the OAuth token on the wire. `https:` is therefore required for + * every non-local destination. Loopback/localhost/private relays keep working over + * `http:` because they already sit behind the explicit `allowPrivateNetwork` opt-in + * enforced by {@link providerDestinationConfigError}. Keyed/local providers (Ollama, + * vLLM, LM Studio, LiteLLM, Moonshot, Qwen, Alibaba) are untouched: they are not + * `authKind: "oauth"`, so this check never fires for them. + */ +function registrySendsOAuthToOverriddenBaseUrl(name: string): boolean { + const entry = getProviderRegistryEntry(name); + return entry?.authKind === "oauth" && entry.allowBaseUrlOverride === true; +} + +export function providerSecureTransportConfigError( + name: string, + provider: Pick, +): string | null { + if (!registrySendsOAuthToOverriddenBaseUrl(name)) return null; + let parsed: URL; + try { + parsed = new URL(provider.baseUrl.trim()); + } catch { + return null; // invalid URLs are providerBaseUrlConfigError's concern + } + if (parsed.protocol !== "http:") return null; + const assessment = assessDestination(provider.baseUrl); + // Classify FIRST, then consult the opt-in. `allowPrivateNetwork` says "this destination is + // intentionally local", which is a statement about the address, not a waiver of transport + // security — reading it before classification let `http://attacker.example` with the opt-in + // set carry an OAuth bearer in cleartext to a public host. + if (!assessment) return null; + const local = assessment.kind === "localhost" + || assessment.kind === "loopback" + || assessment.kind === "private"; + if (local && providerAllowsPrivateNetwork(name, provider)) { + // A genuinely local relay over http stays reachable through the explicit opt-in; the + // private-network gate still governs whether it may be reached at all. + return null; + } + return "baseUrl must use https: this provider sends OAuth credentials to its endpoint, and http is allowed only for loopback/private relays"; +} + /** * Whether a provider may reach loopback/private addresses. * @@ -150,6 +194,8 @@ export function providerAllowsPrivateNetwork( } export function providerDestinationConfigError(name: string, provider: Pick): string | null { + const secureTransportError = providerSecureTransportConfigError(name, provider); + if (secureTransportError) return secureTransportError; const assessment = assessDestination(provider.baseUrl); if (!assessment) return null; if (assessment.kind === "public" || assessment.kind === "hostname") return null; @@ -331,3 +377,4 @@ export async function resolvePublicAddresses( export async function assertUrlResolvesPublic(url: string): Promise { await resolvePublicAddresses(url); } + diff --git a/src/providers/registry.ts b/src/providers/registry.ts index 53922e75ad..562f8e0c7d 100644 --- a/src/providers/registry.ts +++ b/src/providers/registry.ts @@ -1083,6 +1083,7 @@ export const PROVIDER_REGISTRY: readonly ProviderRegistryEntry[] = [ adapter: "anthropic", baseUrl: "https://api.anthropic.com", authKind: "oauth", + allowBaseUrlOverride: true, featured: true, oauthId: "anthropic", jawcodeBundle: "anthropic", @@ -1496,7 +1497,7 @@ export const PROVIDER_REGISTRY: readonly ProviderRegistryEntry[] = [ // 2026-07-10: defaultModel is frozen pending Vertex-specific Tier-2 evidence; Gemini API // evidence from ai.google.dev does not establish Vertex publisher availability. { id: "google-vertex", label: "Google Vertex AI", adapter: "google", baseUrl: "https://aiplatform.googleapis.com", authKind: "key", dashboardUrl: "https://console.cloud.google.com/vertex-ai", defaultModel: "gemini-3-pro", googleMode: "vertex", jawcodeBundle: "google", extraMetadataAliases: ["gemini-vertex"] }, - { id: "google-antigravity", label: "Google Antigravity", adapter: "google", baseUrl: "https://daily-cloudcode-pa.googleapis.com", authKind: "oauth", dashboardUrl: "https://antigravity.google", models: ANTIGRAVITY_MODELS, liveModels: true, defaultModel: "gemini-3.7-flash", modelContextWindows: ANTIGRAVITY_MODEL_CONTEXT_WINDOWS, modelInputModalities: ANTIGRAVITY_MODEL_INPUT_MODALITIES, modelReasoningEfforts: ANTIGRAVITY_MODEL_EFFORTS, googleMode: "cloud-code-assist", jawcodeBundle: "google", extraMetadataAliases: ["antigravity", "gemini-antigravity"] }, + { id: "google-antigravity", label: "Google Antigravity", adapter: "google", baseUrl: "https://daily-cloudcode-pa.googleapis.com", authKind: "oauth", allowBaseUrlOverride: true, dashboardUrl: "https://antigravity.google", models: ANTIGRAVITY_MODELS, liveModels: true, defaultModel: "gemini-3.7-flash", modelContextWindows: ANTIGRAVITY_MODEL_CONTEXT_WINDOWS, modelInputModalities: ANTIGRAVITY_MODEL_INPUT_MODALITIES, modelReasoningEfforts: ANTIGRAVITY_MODEL_EFFORTS, googleMode: "cloud-code-assist", jawcodeBundle: "google", extraMetadataAliases: ["antigravity", "gemini-antigravity"] }, { id: "azure-openai", label: "Azure OpenAI", adapter: "azure-openai", baseUrl: "https://{resource}.openai.azure.com/openai", authKind: "key", featured: true, dashboardUrl: "https://portal.azure.com" }, { id: "ollama", label: "Ollama (local)", adapter: "openai-chat", baseUrl: "http://localhost:11434/v1", authKind: "local", allowPrivateNetworkByDefault: true, allowBaseUrlOverride: true, featured: true, note: "Local — key usually blank" }, { id: "vllm", label: "vLLM (local)", adapter: "openai-chat", baseUrl: "http://localhost:8000/v1", authKind: "local", allowPrivateNetworkByDefault: true, allowBaseUrlOverride: true, featured: true, note: "Local — key usually blank" }, diff --git a/tests/anthropic-baseurl-override.test.ts b/tests/anthropic-baseurl-override.test.ts new file mode 100644 index 0000000000..b64e0feaab --- /dev/null +++ b/tests/anthropic-baseurl-override.test.ts @@ -0,0 +1,144 @@ +import { expect, test } from "bun:test"; +import { routeModel } from "../src/router"; +import { providerDestinationConfigError } from "../src/lib/destination-policy"; +import type { OcxConfig, OcxProviderConfig } from "../src/types"; + +/** + * Regression coverage for the allowBaseUrlOverride opt-in on the anthropic + * registry entry. + * + * Before the opt-in, the pinned registry endpoint silently outranked a saved + * baseUrl and the router emitted the discarded-baseUrl diagnostic (see + * tests/router-discarded-baseurl-warning.test.ts, which now pins google as + * its fixture). Users routing Claude traffic through a local relay or an + * enterprise gateway therefore could not redirect the provider at all. These + * tests pin the new contract: a resolved user baseUrl wins, no warning fires, + * and the registry endpoint remains the default seeded value. + */ +const PROVIDER = "anthropic"; +const REGISTRY_BASE_URL = "https://api.anthropic.com"; +const MODEL = PROVIDER + "/claude-sonnet-5"; + +function configFor(provider: OcxProviderConfig): OcxConfig { + return { + port: 10100, + defaultProvider: PROVIDER, + providers: { [PROVIDER]: provider }, + }; +} + +function routeCapturingWarnings(config: OcxConfig): { baseUrl: string; warnings: string[] } { + const warnings: string[] = []; + const originalWarn = console.warn; + console.warn = (...args: unknown[]) => { warnings.push(args.map(String).join(" ")); }; + try { + const route = routeModel(config, MODEL); + return { baseUrl: route.provider.baseUrl, warnings }; + } finally { + console.warn = originalWarn; + } +} + +test("anthropic honors a configured baseUrl override", () => { + const { baseUrl, warnings } = routeCapturingWarnings(configFor({ + adapter: "anthropic", + baseUrl: "https://claude-relay.example.test", + } as OcxProviderConfig)); + + expect(baseUrl).toBe("https://claude-relay.example.test"); + // The override is applied, so the discarded-baseUrl diagnostic must not fire. + expect(warnings).toHaveLength(0); +}); + +test("anthropic keeps the registry endpoint when the seeded baseUrl is unchanged", () => { + // providerConfigSeed copies the registry baseUrl into every saved config, so the + // no-override case reaches the router as a config whose baseUrl equals the registry URL. + const { baseUrl, warnings } = routeCapturingWarnings(configFor({ + adapter: "anthropic", + baseUrl: REGISTRY_BASE_URL, + } as OcxProviderConfig)); + + expect(baseUrl).toBe(REGISTRY_BASE_URL); + expect(warnings).toHaveLength(0); +}); + +test("anthropic requires a resolved baseUrl once override is enabled", () => { + // allowBaseUrlOverride providers fail closed on a missing baseUrl instead of silently + // re-pinning the registry endpoint; the seed guarantees real configs always carry one. + expect(() => routeModel(configFor({ + adapter: "anthropic", + } as OcxProviderConfig), MODEL)).toThrow(/Invalid baseUrl/); +}); + +test("anthropic rejects an unresolved template baseUrl override", () => { + expect(() => routeModel(configFor({ + adapter: "anthropic", + baseUrl: "https://{region}.example.test", + } as OcxProviderConfig), MODEL)).toThrow(/Invalid baseUrl/); +}); + +/** + * Security regression (CodeRabbit, PR #2109): anthropic is an OAuth provider, so an + * allowBaseUrlOverride endpoint receives bearer credentials. A cleartext http override to a + * non-local destination must be rejected on BOTH enforcement paths: routing (normal requests, + * via assertProviderDestinationAllowed) and providerDestinationConfigError, the shared gate + * that config validation and the model-discovery outbound layer (providerGet/providerPost in + * src/lib/provider-outbound.ts) consult before any fetch. + */ +test("anthropic rejects a cleartext http override on the routing path", () => { + expect(() => routeModel(configFor({ + adapter: "anthropic", + baseUrl: "http://claude-relay.example.test", + } as OcxProviderConfig), MODEL)).toThrow(/https/); +}); + +test("anthropic rejects a cleartext http override on the discovery/config gate", () => { + expect(providerDestinationConfigError(PROVIDER, { + baseUrl: "http://claude-relay.example.test", + } as OcxProviderConfig)).toMatch(/https/); + // The https form of the same destination stays accepted. + expect(providerDestinationConfigError(PROVIDER, { + baseUrl: "https://claude-relay.example.test", + } as OcxProviderConfig)).toBeNull(); +}); + +test("anthropic keeps http for an explicitly local relay", () => { + // Loopback and allowPrivateNetwork opt-ins are the documented local-transport escape + // hatch; the https requirement must not break a localhost proxy. + const { baseUrl, warnings } = routeCapturingWarnings(configFor({ + adapter: "anthropic", + baseUrl: "http://127.0.0.1:8787", + allowPrivateNetwork: true, + } as OcxProviderConfig)); + + expect(baseUrl).toBe("http://127.0.0.1:8787"); + expect(warnings).toHaveLength(0); +}); + + +test("a public http override cannot buy transport security with allowPrivateNetwork", () => { + // allowPrivateNetwork states that a destination is intentionally LOCAL. It is not a waiver of + // transport security. Reading it before classifying the address let http://attacker.example + // carry this provider's OAuth bearer in cleartext to a public host. + // + // Routing REFUSES rather than downgrading: a request must not reach an endpoint that would + // receive the token in the clear, so this fails closed at the route boundary. + expect(() => routeCapturingWarnings(configFor({ + adapter: "anthropic", + baseUrl: "http://attacker.example/v1", + allowPrivateNetwork: true, + } as OcxProviderConfig))).toThrow(/must use https/); +}); + +test("the seeded https endpoint is still reachable with the opt-in set", () => { + // Guard against over-correcting: the fix must refuse cleartext to a public host without + // refusing an ordinary https override that happens to carry the flag. + const { baseUrl, warnings } = routeCapturingWarnings(configFor({ + adapter: "anthropic", + baseUrl: "https://gateway.example/v1", + allowPrivateNetwork: true, + } as OcxProviderConfig)); + + expect(baseUrl).toBe("https://gateway.example/v1"); + expect(warnings).toHaveLength(0); +}); diff --git a/tests/antigravity-baseurl-override.test.ts b/tests/antigravity-baseurl-override.test.ts new file mode 100644 index 0000000000..5bc190c715 --- /dev/null +++ b/tests/antigravity-baseurl-override.test.ts @@ -0,0 +1,117 @@ +import { expect, test } from "bun:test"; +import { routeModel } from "../src/router"; +import { providerDestinationConfigError } from "../src/lib/destination-policy"; +import type { OcxConfig, OcxProviderConfig } from "../src/types"; + +/** + * Regression coverage for the allowBaseUrlOverride opt-in on the + * google-antigravity registry entry. + * + * Before the opt-in, the pinned registry endpoint silently outranked a saved + * baseUrl and the router emitted the discarded-baseUrl diagnostic (see + * tests/router-discarded-baseurl-warning.test.ts). Users routing Antigravity + * traffic through a local relay or region-specific proxy therefore could not + * redirect the provider at all. These tests pin the new contract: a resolved + * user baseUrl wins, no warning fires, and the registry endpoint remains the + * default when nothing is configured. + */ +const PROVIDER = "google-antigravity"; +const REGISTRY_BASE_URL = "https://daily-cloudcode-pa.googleapis.com"; +const MODEL = PROVIDER + "/gemini-3.7-flash"; + +function configFor(provider: OcxProviderConfig): OcxConfig { + return { + port: 10100, + defaultProvider: PROVIDER, + providers: { [PROVIDER]: provider }, + }; +} + +function routeCapturingWarnings(config: OcxConfig): { baseUrl: string; warnings: string[] } { + const warnings: string[] = []; + const originalWarn = console.warn; + console.warn = (...args: unknown[]) => { warnings.push(args.map(String).join(" ")); }; + try { + const route = routeModel(config, MODEL); + return { baseUrl: route.provider.baseUrl, warnings }; + } finally { + console.warn = originalWarn; + } +} + +test("google-antigravity honors a configured baseUrl override", () => { + const { baseUrl, warnings } = routeCapturingWarnings(configFor({ + adapter: "google", + baseUrl: "https://antigravity-relay.example.test", + } as OcxProviderConfig)); + + expect(baseUrl).toBe("https://antigravity-relay.example.test"); + // The override is applied, so the discarded-baseUrl diagnostic must not fire. + expect(warnings).toHaveLength(0); +}); + +test("google-antigravity keeps the registry endpoint when the seeded baseUrl is unchanged", () => { + // providerConfigSeed copies the registry baseUrl into every saved config, so the + // no-override case reaches the router as a config whose baseUrl equals the registry URL. + const { baseUrl, warnings } = routeCapturingWarnings(configFor({ + adapter: "google", + baseUrl: REGISTRY_BASE_URL, + } as OcxProviderConfig)); + + expect(baseUrl).toBe(REGISTRY_BASE_URL); + expect(warnings).toHaveLength(0); +}); + +test("google-antigravity requires a resolved baseUrl once override is enabled", () => { + // allowBaseUrlOverride providers fail closed on a missing baseUrl instead of silently + // re-pinning the registry endpoint; the seed guarantees real configs always carry one. + expect(() => routeModel(configFor({ + adapter: "google", + } as OcxProviderConfig), MODEL)).toThrow(/Invalid baseUrl/); +}); + +test("google-antigravity rejects an unresolved template baseUrl override", () => { + expect(() => routeModel(configFor({ + adapter: "google", + baseUrl: "https://{region}.example.test", + } as OcxProviderConfig), MODEL)).toThrow(/Invalid baseUrl/); +}); + +/** + * Security regression (CodeRabbit, PR #2110): google-antigravity is an OAuth provider, so an + * allowBaseUrlOverride endpoint receives bearer credentials. A cleartext http override to a + * non-local destination must be rejected on BOTH enforcement paths: routing (normal requests, + * via assertProviderDestinationAllowed) and providerDestinationConfigError, the shared gate + * that config validation and the outbound layer (providerGet/providerPost in + * src/lib/provider-outbound.ts) consult before any fetch. + */ +test("google-antigravity rejects a cleartext http override on the routing path", () => { + expect(() => routeModel(configFor({ + adapter: "google", + baseUrl: "http://antigravity-relay.example.test", + } as OcxProviderConfig), MODEL)).toThrow(/https/); +}); + +test("google-antigravity rejects a cleartext http override on the discovery/config gate", () => { + expect(providerDestinationConfigError(PROVIDER, { + baseUrl: "http://antigravity-relay.example.test", + } as OcxProviderConfig)).toMatch(/https/); + // The https form of the same destination stays accepted. + expect(providerDestinationConfigError(PROVIDER, { + baseUrl: "https://antigravity-relay.example.test", + } as OcxProviderConfig)).toBeNull(); +}); + +test("google-antigravity keeps http for an explicitly local relay", () => { + // The local proxy (127.0.0.1) is the motivating use case for this override; the https + // requirement must not break it. allowPrivateNetwork is the documented local opt-in. + const { baseUrl, warnings } = routeCapturingWarnings(configFor({ + adapter: "google", + baseUrl: "http://127.0.0.1:47821", + allowPrivateNetwork: true, + } as OcxProviderConfig)); + + expect(baseUrl).toBe("http://127.0.0.1:47821"); + expect(warnings).toHaveLength(0); +}); + diff --git a/tests/provider-model-discovery-contract.test.ts b/tests/provider-model-discovery-contract.test.ts index 07c8c0e6ac..c49d4062dd 100644 --- a/tests/provider-model-discovery-contract.test.ts +++ b/tests/provider-model-discovery-contract.test.ts @@ -172,15 +172,15 @@ describe("registry-owned provider model discovery", () => { authMode: "oauth", }; - await withRegistryDiscovery("anthropic", { path: "catalog" }, () => { - const relative = buildModelsRequest(staleConfig, "oauth-token", "anthropic"); - expect(relative.url).toBe("https://api.anthropic.com/catalog"); + await withRegistryDiscovery("kimi", { path: "catalog" }, () => { + const relative = buildModelsRequest(staleConfig, "oauth-token", "kimi"); + expect(relative.url).toBe("https://api.kimi.com/coding/v1/catalog"); expect(relative.headers.Authorization).toBe("Bearer oauth-token"); }); - await withRegistryDiscovery("anthropic", { maxModels: 25 }, () => { - const defaultEndpoint = buildModelsRequest(staleConfig, "oauth-token", "anthropic"); - expect(defaultEndpoint.url).toBe("https://api.anthropic.com/v1/models?limit=1000"); + await withRegistryDiscovery("kimi", { maxModels: 25 }, () => { + const defaultEndpoint = buildModelsRequest(staleConfig, "oauth-token", "kimi"); + expect(defaultEndpoint.url).toBe("https://api.kimi.com/coding/v1/models"); }); }); @@ -604,3 +604,4 @@ describe("same-named custom provider preservation", () => { }); }); }); + diff --git a/tests/provider-registry-parity.test.ts b/tests/provider-registry-parity.test.ts index f06a8953c3..d2858f6f44 100644 --- a/tests/provider-registry-parity.test.ts +++ b/tests/provider-registry-parity.test.ts @@ -563,7 +563,10 @@ describe("provider registry parity", () => { test("base URL override permission is registry-only and limited to opted-in providers", () => { const optedIn = PROVIDER_REGISTRY.filter(entry => entry.allowBaseUrlOverride); - expect(optedIn.map(entry => entry.id)).toEqual(["ollama", "vllm", "lm-studio", "moonshot", "qwen-cloud", "alibaba", "alibaba-token-plan-intl", "litellm"]); + // Registry order. Both OAuth entries (anthropic, google-antigravity) are gated by + // providerSecureTransportConfigError; the rest are key/local providers that never send a + // subscription bearer to the override. + expect(optedIn.map(entry => entry.id)).toEqual(["anthropic", "google-antigravity", "ollama", "vllm", "lm-studio", "moonshot", "qwen-cloud", "alibaba", "alibaba-token-plan-intl", "litellm"]); for (const entry of optedIn) { expect(providerConfigSeed(entry)).not.toHaveProperty("allowBaseUrlOverride"); } diff --git a/tests/router-discarded-baseurl-warning.test.ts b/tests/router-discarded-baseurl-warning.test.ts index 05ea18e250..dc31220a3a 100644 --- a/tests/router-discarded-baseurl-warning.test.ts +++ b/tests/router-discarded-baseurl-warning.test.ts @@ -7,12 +7,12 @@ import type { OcxConfig, OcxProviderConfig } from "../src/types"; * asserted in tests/router-template-baseurl.test.ts; these tests cover the diagnostic that * tells the user it happened, so a wrong-region URL stops surfacing as a bare 401. * - * `anthropic` is the pinned fixture: a fixed remote registry endpoint, no `allowBaseUrlOverride`. + * `google` is the pinned fixture: a fixed remote registry endpoint, no `allowBaseUrlOverride`. * Warnings dedupe per (provider, discarded URL, effective URL), so each test uses a distinct * discarded URL and the suite stays order-independent. */ -const PINNED_PROVIDER = "anthropic"; -const PINNED_REGISTRY_BASE_URL = "https://api.anthropic.com"; +const PINNED_PROVIDER = "google"; +const PINNED_REGISTRY_BASE_URL = "https://generativelanguage.googleapis.com"; function configFor(providerName: string, provider: OcxProviderConfig): OcxConfig { return { @@ -37,8 +37,8 @@ function routeCapturingWarnings(config: OcxConfig, model: string, times = 1): st function routePinned(baseUrl: unknown, times = 1): string[] { return routeCapturingWarnings( - configFor(PINNED_PROVIDER, { adapter: "anthropic", baseUrl } as OcxProviderConfig), - `${PINNED_PROVIDER}/claude-sonnet-5`, + configFor(PINNED_PROVIDER, { adapter: "google", baseUrl } as OcxProviderConfig), + `${PINNED_PROVIDER}/gemini-3-pro`, times, ); } @@ -57,13 +57,13 @@ test("warns when a pinned provider discards a configured baseUrl", () => { test("routing is unchanged by the warning", () => { const config = configFor(PINNED_PROVIDER, { - adapter: "anthropic", + adapter: "google", baseUrl: "https://routing-unchanged.example.test/v1", }); const originalWarn = console.warn; console.warn = () => {}; try { - expect(routeModel(config, `${PINNED_PROVIDER}/claude-sonnet-5`).provider.baseUrl) + expect(routeModel(config, `${PINNED_PROVIDER}/gemini-3-pro`).provider.baseUrl) .toBe(PINNED_REGISTRY_BASE_URL); } finally { console.warn = originalWarn; @@ -221,3 +221,4 @@ for (const { label, id, adapter, baseUrl } of [ expect(routeModel(config, `${id}/model`).provider.baseUrl).toBe(baseUrl); }); } + diff --git a/tests/router-template-baseurl.test.ts b/tests/router-template-baseurl.test.ts index e3880a45d4..053f2ff7b7 100644 --- a/tests/router-template-baseurl.test.ts +++ b/tests/router-template-baseurl.test.ts @@ -56,7 +56,7 @@ for (const { id, registryBaseUrl } of OVERRIDE_PROVIDERS) { for (const { id, registryBaseUrl, adapter } of [ { id: "ollama-cloud", registryBaseUrl: "https://ollama.com/v1", adapter: "openai-chat" }, - { id: "anthropic", registryBaseUrl: "https://api.anthropic.com", adapter: "anthropic" }, + { id: "google", registryBaseUrl: "https://generativelanguage.googleapis.com", adapter: "google" }, ] as const) { test(`${id} keeps its fixed remote registry endpoint authoritative`, () => { const config = configFor(id, { @@ -100,3 +100,4 @@ for (const { id, adapter, registryTemplate, resolvedBaseUrl } of [ expect(routeModel(config, `${id}/model`).provider.baseUrl).toBe(registryTemplate); }); } + From f4ad1392271370e1c7c08b0b11ddea346d065138 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 05:33:54 +0900 Subject: [PATCH 39/88] fix(oauth): reject superseded login credential commits A cancelled login could still persist its credential after a newer flow had taken ownership of the provider, so the newer login's token was silently replaced by the one the user had already abandoned. Check ownership at the synchronous persist boundary rather than before the work: mutateStore takes an assertBeforePersist hook that runs inside the file lock, after fn(store) and before persist(). An in-memory mutation from a superseded flow is therefore discarded rather than written, which is the only placement that cannot lose a race. Ownership is identity-checked against the flow's own AbortController, so a newer login replacing the entry is what invalidates the older one - not a timestamp or a flag either side could observe stale. Kiro replacements additionally wait for a cancelled CLI flow to finish rolling back before a new login may start. Carries @Ingwannu's #2053 unchanged. Closes #2053 --- src/oauth/index.ts | 25 ++++++- src/oauth/store.ts | 16 +++-- tests/oauth-public-surface.test.ts | 107 +++++++++++++++++++++++++++++ 3 files changed, 140 insertions(+), 8 deletions(-) diff --git a/src/oauth/index.ts b/src/oauth/index.ts index 0162492f9a..8a18a0b007 100644 --- a/src/oauth/index.ts +++ b/src/oauth/index.ts @@ -322,6 +322,13 @@ export class OAuthReauthIdentityUnverifiedError extends Error { } } +class OAuthLoginSupersededError extends Error { + constructor() { + super("OAuth login was superseded before credential persistence"); + this.name = "OAuthLoginSupersededError"; + } +} + /** Project arbitrary OAuth failures onto the small, stable public error vocabulary. */ export function publicOAuthAuthenticationErrorMessage(error: unknown): string { if (error instanceof OAuthMutationBusyError) { @@ -1096,6 +1103,7 @@ interface RunLoginDeps { settleKiroLoginTransaction?: typeof settleKiroLoginTransaction; removeAccount?: typeof removeAccount; setActiveAccount?: typeof setActiveAccount; + assertCurrentOwner?: () => void; } /** Roll back only accounts created by this forced login, preserving concurrent refreshes of others. */ @@ -1145,6 +1153,7 @@ export async function runLogin( const cred: OAuthCredentials = rawCred.source ? rawCred : { ...rawCred, source: "oauth" }; const settleKiroTransaction = deps.settleKiroLoginTransaction ?? settleKiroLoginTransaction; try { + deps.assertCurrentOwner?.(); // Validate the provider row before credential persistence. A namespace claimed during the // credential write is handled again below before the latest row is re-upserted. if (provider !== "chatgpt") { @@ -1165,10 +1174,13 @@ export async function runLogin( if (!identityMatches) { throw new OAuthReauthIdentityMismatchError(); } - await (deps.saveAccountCredential ?? saveAccountCredential)(provider, opts.reauthAccountId, cred); + await (deps.saveAccountCredential ?? saveAccountCredential)(provider, opts.reauthAccountId, cred, { + assertBeforePersist: deps.assertCurrentOwner, + }); } else { await (deps.saveCredential ?? saveCredential)(provider, cred, { preserveIdentityless: opts?.forceLogin === true, + assertBeforePersist: deps.assertCurrentOwner, }); } if (provider !== "chatgpt") { @@ -1235,6 +1247,7 @@ export async function runLogin( */ const loginState = new Map(); const loginAbort = new Map(); +const kiroLoginSettling = new Set(); /** Pending paste for a login in progress: either a waiter or a stashed early submission. */ interface ManualCodeSlot { @@ -1403,13 +1416,14 @@ export async function startLoginFlow( const def = OAUTH_PROVIDERS[provider]; if (!def) throw new UnsupportedOAuthProviderError(provider); const existing = loginState.get(provider); - if (existing && !existing.done) { + if ((existing && !existing.done) || (provider === "kiro" && kiroLoginSettling.has(provider))) { throw new Error(`A login for ${provider} is already in progress`); } clearManualCodeSlot(provider); loginState.set(provider, { done: false }); const abort = new AbortController(); loginAbort.set(provider, abort); + if (provider === "kiro") kiroLoginSettling.add(provider); return new Promise((resolve, reject) => { let urlResolved = false; const ctrl: OAuthController = { @@ -1460,7 +1474,10 @@ export async function startLoginFlow( }; // Background: runLogin persists the credential + provider entry to disk. The lifecycle hook // lets a long-lived server config adopt that settled state before clients observe done=true. - void runLogin(provider, ctrl, opts).then( + const assertCurrentOwner = (): void => { + if (loginAbort.get(provider) !== abort) throw new OAuthLoginSupersededError(); + }; + void runLogin(provider, ctrl, opts, { assertCurrentOwner }).then( () => settle(), (e: unknown) => settle(e), ).catch((e: unknown) => { @@ -1471,6 +1488,8 @@ export async function startLoginFlow( const msg = publicOAuthAuthenticationErrorMessage(e); loginState.set(provider, { done: true, error: msg }); if (!urlResolved) reject(e); + }).finally(() => { + if (provider === "kiro") kiroLoginSettling.delete(provider); }); }); } diff --git a/src/oauth/store.ts b/src/oauth/store.ts index 31924afc33..ed2d3bf87f 100644 --- a/src/oauth/store.ts +++ b/src/oauth/store.ts @@ -465,10 +465,11 @@ function serializeMutation(work: () => Promise, retainedValues: readonly u drainOAuthMutations(); return result; } -export function mutateStore(fn:(store:AuthStore)=>T|Promise, retainedValues: readonly unknown[] = [], options?: { waitMs?: number }):Promise{return serializeMutation(async()=>{const guard=await createOAuthFileLock({path:getAuthStoreLockPath(),staleAfterMs:30000}).acquire();try{ +export function mutateStore(fn:(store:AuthStore)=>T|Promise, retainedValues: readonly unknown[] = [], options?: { waitMs?: number; assertBeforePersist?: () => void }):Promise{return serializeMutation(async()=>{const guard=await createOAuthFileLock({path:getAuthStoreLockPath(),staleAfterMs:30000}).acquire();try{ const { store, hadLegacy } = loadAuthStoreInternal(); if (hadLegacy) backupLegacyOnce(); const result = await fn(store); + options?.assertBeforePersist?.(); persist(store); return result; }finally{guard.release();}}, retainedValues, options?.waitMs); @@ -491,7 +492,7 @@ export function getCredential(provider: string): OAuthCredentials | null { export async function saveCredential( provider: string, cred: OAuthCredentials, - opts: { preserveIdentityless?: boolean } = {}, + opts: { preserveIdentityless?: boolean; assertBeforePersist?: () => void } = {}, ): Promise { const safe = normalizeCredential(cred); if (!safe) return; @@ -542,7 +543,7 @@ export async function saveCredential( set.accounts.push({ id, credential: safe, addedAt: Date.now() }); set.activeAccountId = id; } - }, [provider, safe]); + }, [provider, safe], { assertBeforePersist: opts.assertBeforePersist }); } /** @@ -632,7 +633,12 @@ export function getAccountCredential(provider: string, accountId: string): OAuth } /** Persist a refreshed credential for a SPECIFIC account without touching activeAccountId. */ -export async function saveAccountCredential(provider: string, accountId: string, cred: OAuthCredentials): Promise { +export async function saveAccountCredential( + provider: string, + accountId: string, + cred: OAuthCredentials, + opts: { assertBeforePersist?: () => void } = {}, +): Promise { const safe = normalizeCredential(cred); if (!safe) return; await mutateStore(store => { @@ -640,7 +646,7 @@ export async function saveAccountCredential(provider: string, accountId: string, if (!account) return; account.credential = safe; delete account.needsReauth; - }, [provider, accountId, safe]); + }, [provider, accountId, safe], { assertBeforePersist: opts.assertBeforePersist }); } export async function setActiveAccount(provider: string, accountId: string): Promise { diff --git a/tests/oauth-public-surface.test.ts b/tests/oauth-public-surface.test.ts index 788e5e4d56..a0ae4617f9 100644 --- a/tests/oauth-public-surface.test.ts +++ b/tests/oauth-public-surface.test.ts @@ -448,6 +448,113 @@ describe("legacy ChatGPT OAuth public-surface exclusion", () => { } }); + test("a superseded OAuth flow cannot commit after its replacement owns the provider", async () => { + saveConfig(config()); + const originalLogin = OAUTH_PROVIDERS.xai.login; + let loginCalls = 0; + OAUTH_PROVIDERS.xai.login = async (ctrl) => { + loginCalls += 1; + const call = loginCalls; + ctrl.onAuth({ url: `https://auth.example.test/${call}`, deviceCode: `flow-${call}` }); + return { + access: `access-${call}`, + refresh: `refresh-${call}`, + accountId: `account-${call}`, + email: `account-${call}@example.test`, + expires: Date.now() + 60_000, + }; + }; + + let releaseHead!: () => void; + let signalHeadStarted!: () => void; + const headStarted = new Promise(resolve => { signalHeadStarted = resolve; }); + const headGate = new Promise(resolve => { releaseHead = resolve; }); + const blockingMutation = oauthStore.mutateStore(async () => { + signalHeadStarted(); + await headGate; + }); + + const waitForMutationCount = async (minimum: number): Promise => { + for (let attempt = 0; attempt < 200; attempt += 1) { + if (oauthStore.oauthMutationTailSnapshot().active >= minimum) return; + await Bun.sleep(5); + } + throw new Error(`OAuth mutation queue did not reach ${minimum} active rows`); + }; + + try { + await headStarted; + await startLoginFlow("xai"); + await waitForMutationCount(2); + expect(cancelLoginFlow("xai")).toBe(true); + + await startLoginFlow("xai"); + await waitForMutationCount(3); + releaseHead(); + await blockingMutation; + + const status = await waitForOAuthDone("xai"); + expect(status).toMatchObject({ done: true, loggedIn: true }); + expect(getCredential("xai")).toMatchObject({ + access: "access-2", + accountId: "account-2", + }); + expect(oauthStore.getAccountSet("xai")?.accounts.map(account => account.credential.accountId)) + .toEqual(["account-2"]); + } finally { + releaseHead(); + await blockingMutation.catch(() => {}); + OAUTH_PROVIDERS.xai.login = originalLogin; + clearLoginState("xai"); + } + }); + + test("Kiro does not start a replacement until the canceled external CLI flow settles", async () => { + saveConfig(config()); + const originalLogin = OAUTH_PROVIDERS.kiro.login; + let loginCalls = 0; + OAUTH_PROVIDERS.kiro.login = async (ctrl) => { + loginCalls += 1; + const call = loginCalls; + ctrl.onAuth({ url: "", deviceCode: `kiro-flow-${call}` }); + if (call === 1) { + await new Promise((_, reject) => { + ctrl.signal.addEventListener("abort", () => reject(new Error("Kiro login cancelled")), { once: true }); + }); + } + return { + access: "kiro-replacement-access", + refresh: "kiro-replacement-refresh", + accountId: "kiro-replacement-account", + email: "kiro-replacement@example.test", + expires: Date.now() + 60_000, + }; + }; + + try { + await startLoginFlow("kiro"); + expect(cancelLoginFlow("kiro")).toBe(true); + await expect(startLoginFlow("kiro")).rejects.toThrow("A login for kiro is already in progress"); + + let replacement: Awaited> | undefined; + for (let attempt = 0; attempt < 200; attempt += 1) { + try { + replacement = await startLoginFlow("kiro"); + break; + } catch (error) { + if (!(error instanceof Error) || !error.message.includes("already in progress")) throw error; + await Bun.sleep(5); + } + } + expect(replacement).toMatchObject({ deviceCode: "kiro-flow-2" }); + expect(await waitForOAuthDone("kiro")).toMatchObject({ done: true, loggedIn: true }); + expect(loginCalls).toBe(2); + } finally { + OAUTH_PROVIDERS.kiro.login = originalLogin; + clearLoginState("kiro"); + } + }); + test("management OAuth safely reconciles live config after a late namespace claim", async () => { const liveConfig = config(); liveConfig.hostname = "0.0.0.0"; From d8e98d4fe16ac550a0e83469fffe9aa3644b2202 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 02:04:03 +0900 Subject: [PATCH 40/88] fix(subagents): keep a saved roster slot listed when its model is disabled GET /api/subagent-models built `available` purely from currently-pickable models, so a featured model disabled elsewhere vanished from it. The dashboard filters `chosen` against `available` and then PUTs exactly the rows it holds, which turned a hide into a delete: the next Save wrote the truncated roster to config.json, and the user read it as "ocx service lost my subagent models". Retain a chosen id in `available` when it is not otherwise selectable, appended after the selectable set and deduplicated. Models that are disabled and NOT in the roster stay excluded, so the picker behavior is unchanged for every model the user has not deliberately featured. The combo test asserted the old truncating behavior; it now asserts retention while a roster slot is held, and full exclusion once the slot is released. Closes #2133 --- .../management/agent-settings-routes.ts | 18 ++++- tests/combo-management-api.test.ts | 16 +++- tests/subagent-roster-retention.test.ts | 74 +++++++++++++++++++ 3 files changed, 104 insertions(+), 4 deletions(-) create mode 100644 tests/subagent-roster-retention.test.ts diff --git a/src/server/management/agent-settings-routes.ts b/src/server/management/agent-settings-routes.ts index 4b3e7a1715..9703ca90ef 100644 --- a/src/server/management/agent-settings-routes.ts +++ b/src/server/management/agent-settings-routes.ts @@ -613,15 +613,29 @@ export async function handleAgentSettingsRoutes(ctx: ManagementContext): Promise stored === catalogModelSlug(m) || slugEquals(stored, m.provider, m.id) )) .map(catalogModelSlug))]; - const available = [ + const chosen = config.subagentModels ?? []; + const selectable = [ ...listCatalogNativeSlugs().filter(ns => !disabled.has(ns)), ...visibleRouted, ]; + // A saved roster slot must stay representable even after its model is disabled + // elsewhere (Models page, provider allowlist, a provider row going away). The + // dashboard treats `available` as the set of rows it can render, so a chosen id + // missing from it disappears from the roster UI and the next Save — which PUTs + // exactly what the UI holds — silently truncates the persisted list. Losing a + // deliberate 5-model roster to an unrelated visibility toggle is data loss, not a + // filter. Same reasoning as `fetchGrokCandidateModels`, which deliberately lists a + // model the user already excluded so its switch remains reachable. + const selectableSet = new Set(selectable); + const available = [ + ...selectable, + ...[...new Set(chosen)].filter(model => !selectableSet.has(model)), + ]; // #857: let CLI/GUI show when a running Codex app-server keeps an older // in-memory catalog than the one on disk. const { collectCodexAppServerCatalogState } = await import("../../codex/app-server-processes"); const catalogState = collectCodexAppServerCatalogState(); - return jsonResponse({ chosen: config.subagentModels ?? [], available, catalogState }); + return jsonResponse({ chosen, available, catalogState }); } if (url.pathname === "/api/subagent-models" && req.method === "PUT") { let body: { models?: unknown }; diff --git a/tests/combo-management-api.test.ts b/tests/combo-management-api.test.ts index 75c19f8916..49ec7b53b6 100644 --- a/tests/combo-management-api.test.ts +++ b/tests/combo-management-api.test.ts @@ -655,10 +655,22 @@ describe("combo management API", () => { expect(body.available.filter(model => model === "deepseek-v4-flash")).toHaveLength(1); expect(body.available).not.toContain("combo/free"); + // Disabling an alias hides it from the pickable set, but NOT while it still holds a + // saved roster slot: the dashboard PUTs exactly the rows it can render, so dropping a + // chosen id here silently truncates the persisted roster on the next Save. Covered by + // tests/subagent-roster-retention.test.ts. config.disabledModels = ["deepseek-v4-flash"]; const disabledResponse = await comboApi(config, "GET", "/api/subagent-models"); - const disabledBody = await disabledResponse!.json() as { available: string[] }; - expect(disabledBody.available).not.toContain("deepseek-v4-flash"); + const disabledBody = await disabledResponse!.json() as { chosen: string[]; available: string[] }; + expect(disabledBody.chosen).toEqual(["deepseek-v4-flash"]); + expect(disabledBody.available).toContain("deepseek-v4-flash"); + expect(disabledBody.available.filter(model => model === "deepseek-v4-flash")).toHaveLength(1); + + // Once it no longer occupies a roster slot, the disable takes full effect. + config.subagentModels = []; + const unfeaturedResponse = await comboApi(config, "GET", "/api/subagent-models"); + const unfeaturedBody = await unfeaturedResponse!.json() as { available: string[] }; + expect(unfeaturedBody.available).not.toContain("deepseek-v4-flash"); }, 15_000); test("GET models round-trips a disabled combo alias for the Models GUI", async () => { diff --git a/tests/subagent-roster-retention.test.ts b/tests/subagent-roster-retention.test.ts new file mode 100644 index 0000000000..ad2245fc56 --- /dev/null +++ b/tests/subagent-roster-retention.test.ts @@ -0,0 +1,74 @@ +/** + * A saved subagent roster must survive an unrelated model-visibility change. + * + * The dashboard renders the roster from the reported available list and PUTs exactly what it + * holds, so a + * chosen id that GET omits is not merely hidden: the next Save writes the truncated list + * back to config.json. Disabling a model on the Models page, narrowing a provider + * allowlist, or removing a provider therefore used to silently shrink a deliberate + * 5-model roster. + */ +import { describe, expect, test } from "bun:test"; +import { handleManagementAPI } from "../src/server/management-api"; +import { ManagementRequest as Request } from "./helpers/management-auth"; +import type { OcxConfig } from "../src/types"; + +function makeConfig(overrides: Partial = {}): OcxConfig { + return { port: 10100, providers: {}, defaultProvider: "openai", ...overrides } as OcxConfig; +} + +async function getRoster(config: OcxConfig): Promise<{ chosen: string[]; available: string[] }> { + const res = await handleManagementAPI( + new Request("http://localhost/api/subagent-models"), + new URL("http://localhost/api/subagent-models"), + config, + ); + expect(res).not.toBeNull(); + return await res!.json() as { chosen: string[]; available: string[] }; +} + +describe("/api/subagent-models roster retention", () => { + test("a chosen model disabled elsewhere stays listed in available", async () => { + const chosen = ["gpt-5.5", "gpt-5.6-sol", "gpt-5.6-terra", "gpt-5.6-luna", "gpt-5.4-mini"]; + const config = makeConfig({ + subagentModels: [...chosen], + disabledModels: ["gpt-5.5", "gpt-5.4-mini"], + }); + + const roster = await getRoster(config); + + // The saved list itself is untouched. + expect(roster.chosen).toEqual(chosen); + // And every slot the user saved can still be rendered, so a Save round-trip + // cannot truncate the roster to the models that happen to be enabled today. + for (const model of chosen) expect(roster.available).toContain(model); + }); + + test("retained roster entries are appended once, after the selectable models", async () => { + const config = makeConfig({ + subagentModels: ["gpt-5.5", "gpt-5.5", "gpt-5.6-terra"], + disabledModels: ["gpt-5.5"], + }); + + const { available } = await getRoster(config); + + // A duplicate saved id must not produce a duplicate row. + expect(available.filter(model => model === "gpt-5.5").length).toBe(1); + // An enabled chosen model is already selectable and must not be re-appended. + expect(available.filter(model => model === "gpt-5.6-terra").length).toBe(1); + // Retained-but-disabled entries sort after everything still selectable. + expect(available.indexOf("gpt-5.5")).toBeGreaterThan(available.indexOf("gpt-5.6-terra")); + }); + + test("a disabled model that is NOT in the roster stays out of available", async () => { + const config = makeConfig({ + subagentModels: ["gpt-5.6-terra"], + disabledModels: ["gpt-5.6-sol"], + }); + + const { available } = await getRoster(config); + + expect(available).not.toContain("gpt-5.6-sol"); + expect(available).toContain("gpt-5.6-terra"); + }); +}); From 75ad3787b3bdc0cc3e997c5d8e3092f265556cb1 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 02:23:00 +0900 Subject: [PATCH 41/88] docs(devlog): plan the bug-PR backlog consolidation as one stack plus siblings --- .../000_research_inventory.md | 133 ++++++++++++++++++ .../010_layer1_bearer_admission_2132.md | 58 ++++++++ .../020_layer2_responses_id_backfill_2131.md | 43 ++++++ .../030_sibling_prompt_cache_retention.md | 38 +++++ .../040_sibling_routing_capability.md | 31 ++++ .../050_sibling_k12_short_window.md | 25 ++++ .../060_supersede_and_close_operations.md | 37 +++++ 7 files changed, 365 insertions(+) create mode 100644 devlog/_plan/260820_bug_pr_backlog_consolidation/000_research_inventory.md create mode 100644 devlog/_plan/260820_bug_pr_backlog_consolidation/010_layer1_bearer_admission_2132.md create mode 100644 devlog/_plan/260820_bug_pr_backlog_consolidation/020_layer2_responses_id_backfill_2131.md create mode 100644 devlog/_plan/260820_bug_pr_backlog_consolidation/030_sibling_prompt_cache_retention.md create mode 100644 devlog/_plan/260820_bug_pr_backlog_consolidation/040_sibling_routing_capability.md create mode 100644 devlog/_plan/260820_bug_pr_backlog_consolidation/050_sibling_k12_short_window.md create mode 100644 devlog/_plan/260820_bug_pr_backlog_consolidation/060_supersede_and_close_operations.md diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/000_research_inventory.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/000_research_inventory.md new file mode 100644 index 0000000000..2959c3b9ea --- /dev/null +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/000_research_inventory.md @@ -0,0 +1,133 @@ +# 000 — Research: open bug-PR backlog inventory, rubric, and disposition + +Unit: 260820_bug_pr_backlog_consolidation +Work-phase: wp1 (docs-only roadmap cycle, LOOP-DOCS-FIRST-01) +Baseline: origin/dev = ceac592d7. Worktree branch codex/fix-subagent-roster-truncation (PR #2134). + +Evidence for every claim below came from six read-only xai/grok-4.6 investigation lanes that +read the actual PR diffs with `gh pr diff` and cross-read the runtime in this worktree. Code +edits stay in the main agent. + +## 1. Inventory + +27 open bug-labeled PRs; 25 authored by someone other than lidge-jun. 17 open bug issues. + +| PR | Author | Draft | Subsystem | Files | +|---|---|---|---|---| +| 2131 | bet4it | no | responses id backfill | server/responses | +| 2127 | agentHits | yes | antigravity thought_signature | adapters/google | +| 2115 | louis-tepe | no | adapter prompt nudge | adapters/* | +| 2110 | drakonkat | no | antigravity baseUrl override | providers/registry, lib/destination-policy | +| 2109 | drakonkat | no | anthropic baseUrl override | providers/registry, lib/destination-policy | +| 2105 | lilinxiong | no | claude shell hook | cli/index, server/system-env | +| 2104 | olddonkey | no | xai OAuth responses streaming | adapters/xai | +| 2102 | lilinxiong | no | gpt-5.6 prompt_cache_retention | adapters/openai-responses | +| 2101 | Ingwannu | no | account entitlement gating | codex/catalog | +| 2100 | ntdatt812 | no | routing capability evidence | routing/capability | +| 2099 | yzxcj797 | yes | gpt-5.6 prompt_cache_retention | adapters/openai-responses | +| 2091 | luvs01 | no | prompt_cache_retention (all forward) | adapters/openai-responses | +| 2082 | yzxcj797 | yes | AgentRouter language preamble | adapters | +| 2077 | ntdatt812 | no | lab behavior overrides | routing/compatibility/behavior | +| 2075 | olddonkey | no | Fast gate native chat (CONFLICTING) | adapters/openai-chat | +| 2067 | waw4303 | yes | opencode-free headers | providers/registry | +| 2063 | yzxcj797 | yes | K12 detail.code denials (CONFLICTING) | codex/quota-rejection | +| 2062 | yzxcj797 | yes | K12 short-window quota | codex/quota, codex/routing | +| 2056 | Ingwannu | no | K12 short-window quota | codex/quota, codex/routing | +| 2054 | keepitmello | yes | cursor checkpoints (CONFLICTING) | adapters/cursor | +| 2053 | Ingwannu | no | superseded OAuth commits | oauth/* | +| 2040 | Ingwannu | no | routed tool_search passthrough | server/responses | +| 2032 | yzxcj797 | yes | claude root bypass | cli/claude | +| 2029 | yzxcj797 | yes | probe session bus absent | service-manager-probe | +| 2027 | yzxcj797 | yes | opencode-go quota gating | providers/quota | + +## 2. Scoring rubric + +Score = severity (0-35) + blast radius (0-25) + evidence quality (0-20) + fix tractability (0-20). +Threshold for this campaign: **>= 60**. + +- severity: does it break a core path (routing, auth, streaming, config persistence) for a + default configuration, or is it peripheral/cosmetic? +- blast radius: how many users/configurations does the defect reach? +- evidence quality: deterministic reproduction with logs/curl, or assertion? +- fix tractability: is a correct, testable fix small and self-contained? + +## 3. Scores and disposition + +| Item | Score | Disposition | +|---|---|---| +| Issue #2132 bearer admission forces ChatGPT credential | 96 | ABSORB — no PR exists; highest-value gap in the backlog | +| Issue #2092 / PRs #2102,#2099,#2091 prompt_cache_retention | 86 | ABSORB #2102 as base; supersede #2099, #2091 | +| Issue #2114/#1939 / PR #2029 probe bus | 80 | SUPERSEDED by maintainer PR #2130 (already open) | +| PR #2131 responses output id backfill | 80 | ABSORB | +| PR #2100 routing capability evidence | 80 | ABSORB | +| PR #2047 / #2056 + #2062 K12 short-window quota | 72 | ABSORB #2056; supersede #2062 | +| PR #2053 superseded OAuth credential commits | 72 | KEEP — C4 auth, needs human security review (MAINTAINERS.md) | +| PRs #2109 + #2110 baseUrl override | 68 | HOLD — unresolved security gap, see §6 | +| PR #2101 account entitlement gating | 64 | KEEP — large (20 files), needs its own cycle | +| PR #2077 lab behavior overrides | 62 | ABSORB | +| PR #2040 routed tool_search passthrough | 62 | KEEP — 14 files, own cycle | +| PR #2105 claude shell hook | 60 | ABSORB | +| PR #2063 K12 detail.code | — | SUPERSEDED by already-merged #2055 | +| PR #2115 code mode nudge | 54 | BELOW THRESHOLD — contracts native-OpenAI detection; needs human adapter pass | +| PR #2082 AgentRouter language | 54 | BELOW THRESHOLD | +| PR #2027 opencode-go quota | 56 | BELOW THRESHOLD | +| PR #2067 opencode-free headers | 50 | BELOW THRESHOLD | +| PR #2054 cursor checkpoints | 46 | BELOW THRESHOLD — hypothesis pending wire trace | +| PR #2032 claude root bypass | 46 | BELOW THRESHOLD — maintainer already rejected the default | +| PR #2104, #2075, #2127 | n/a | Deferred: #2075 and #2054 are CONFLICTING; #2127 is an active draft by its author | + +## 4. Duplicate clusters (evidence-backed) + +**prompt_cache_retention (issue #2092).** #2102 gates on `forward && isCanonicalOpenAiForwardProvider` +and matches `gpt-5.6` / `gpt-5.6-*`. #2099 uses a looser `startsWith("gpt-5.6")` on ANY forward +provider and carries a stray package.json 2.24.2 -> 2.25.0 bump. #2091 strips the field for every +forward request and every model, which inverts the existing gpt-5.5 preserve pin at +tests/openai-responses-passthrough.test.ts:807 — the issue reporter explicitly withdrew the +global claim. #2102 is the correct contract. + +**K12 short-window quota (issue #2047).** #2056 is a strict superset of #2062: it adds +`snapshotHasShort`, partial-snapshot preservation, `updateAccountQuota` carry, and the +parse -> cache -> DTO path the issue requires. Both rewrite the same two functions and WOULD +conflict. #2062 also carries the same stray version bump. + +**Probe bus (issues #2114/#1939).** #2130's `busUnreachable()` is a superset of #2029's two +strings and adds the on-disk unit check that #2029's reviewer demanded. Landing #2029 on top of +#2130 would REGRESS the disk check back to unconditional `absent`. + +## 5. Structural finding: this backlog is not one stack + +DEV-STACK-01 permits stacking only when later parts consume earlier parts' output. Measured file +overlap across the absorb set: + +| Cluster | Files | +|---|---| +| PCR consolidation | src/adapters/openai-responses.ts | +| #2132 + #2131 | src/server/responses/core.ts (**shared**) | +| #2100 | src/routing/capability.ts | +| #2077 | src/routing/compatibility/behavior.ts | +| K12 | src/codex/quota.ts, src/codex/routing.ts | +| #2105 | src/cli/index.ts, src/server/system-env.ts | + +Exactly one real dependency edge exists: **#2132 and #2131 both modify +`src/server/responses/core.ts`**, so they must be ordered. Everything else is disjoint. + +Forcing 12 disjoint fixes into one 12-layer chain would violate DEV-STACK-01's independence +clause and the 2-4 depth guidance, and would impose a false merge order in which an unrelated +layer blocks every layer above it. The honest shape is therefore **one bounded stack rooted on +#2134 for the genuinely dependent Responses work, plus sibling PRs off dev for the disjoint +fixes**. That is recorded here rather than silently reshaped. + +## 6. Security holds (detail deliberately not recorded here) + +The baseUrl-override pair (#2109/#2110) has an unresolved gap already raised publicly in the +CodeRabbit thread on those PRs. Per AGENTS.md, pre-disclosure security reasoning does not go in +this public directory: the analysis lives in scratch only, and these PRs are HOLD, not absorb, +until a human security pass. #2053 is C4 OAuth and requires the security review MAINTAINERS.md +mandates; it is KEEP, not absorb. + +## 7. Attribution contract + +Every superseded PR gets (a) its author credited by @login in the superseding PR body, +(b) a courteous closing comment naming the replacement PR and what was carried over, +(c) no force-push and no edit to the contributor's own branch. + diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/010_layer1_bearer_admission_2132.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/010_layer1_bearer_admission_2132.md new file mode 100644 index 0000000000..dd5da1b8af --- /dev/null +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/010_layer1_bearer_admission_2132.md @@ -0,0 +1,58 @@ +# 010 — Layer 1 (stack bottom): fix issue #2132, bearer admission must not force a ChatGPT credential + +Work-phase: wp2. Branch: `codex/fix-bearer-admission-2132`. Base: `codex/fix-subagent-roster-truncation` (PR #2134). +Absorbs: nothing (no PR exists). Closes: #2132. + +## Why this is the stack bottom + +It is the highest-scoring item in the backlog (96) and it shares `src/server/responses/core.ts` +with layer 2 (#2131). Layer 2 must be based on this, or the two edits to that file collide. + +## Defect + +Reported in #2132: after v2.23.0, a key-auth provider (Cloudflare/etc.) returns 401 +`No usable Codex main credential` when `~/.codex/auth.json` holds no ChatGPT token. Bearer +admission sets `substituteMainCredential` unconditionally, so a route that needs no ChatGPT +identity is still gated on one. + +## P-phase re-verification required (stale check) + +Before editing, confirm against the CURRENT tree — the lane read `dev`, not this branch: +1. `rg -n "substituteMainCredential" src/` — enumerate every producer and consumer. +2. Read `src/server/responses/core.ts`, `src/server/responses/compact.ts`, + `src/codex/auth-context.ts` and establish where the flag is set and where it is read. +3. Reproduce the admission decision in a unit context with a key-auth provider and an + auth.json containing no ChatGPT token. If the current code does NOT reproduce, stop and + amend this doc rather than writing a fix for a defect that is not there. + +## Intended change + +Make the substitution conditional on the resolved route actually requiring a native/ChatGPT +credential. A key-auth routed provider carries its own credential and must be admitted +without one. Exact call sites are fixed during the stale check above; the invariant is: +`substituteMainCredential` is set only when the route's credential source is the native +ChatGPT pool. + +Out of scope: changing what happens once a native route legitimately lacks a credential, +and any change to the pool/account selection itself. + +## Test plan (must fail RED first) + +New `tests/bearer-admission-key-auth.test.ts`: +1. key-auth routed provider + auth.json with NO ChatGPT token -> request is admitted (no 401). +2. native gpt route + no ChatGPT token -> still fails closed with the existing error. +3. key-auth provider + ChatGPT token present -> unchanged behavior (no regression). + +Drive the file against the unpatched tree first and record the failure output; a test that +passes before the fix does not prove anything. + +## Verification + +`bun run typecheck`; `bun test --isolate` on the new file plus the existing responses/auth +suites; full `bun test --isolate tests` before marking review-ready; `bun run privacy:scan`. + +## Standalone thesis (DEV-STACK-03) + +"A provider that carries its own key must not be gated on a ChatGPT credential." Builds and +passes its own tests at its own tip, independent of layer 2. + diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/020_layer2_responses_id_backfill_2131.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/020_layer2_responses_id_backfill_2131.md new file mode 100644 index 0000000000..bb5c088378 --- /dev/null +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/020_layer2_responses_id_backfill_2131.md @@ -0,0 +1,43 @@ +# 020 — Layer 2: absorb PR #2131, backfill missing Responses output ids + +Work-phase: wp3. Branch: `codex/absorb-responses-id-backfill`. Base: `codex/fix-bearer-admission-2132` (layer 1). +Absorbs: **PR #2131 by @bet4it**. Closes: PR #2131 as superseded, with attribution. + +## Dependency edge (the only real one in this backlog) + +#2131 adds `src/server/responses/responses-field-backfill.ts` and calls it from +`src/server/responses/core.ts` — the same file layer 1 edits. This is why it stacks rather +than sitting beside layer 1. + +## Defect + +Strict decoders (grok-build) reject Responses output items that omit `id` on +`message` / `reasoning` / `function_call`. #1941 landed earlier but some relays still omit it. + +## Change to carry over + +@bet4it's implementation, preserved in substance: synthesize stable `msg_ocx_N` / `rs_ocx_N` / +`fc_ocx_N` ids keyed on `output_index`, never overwriting an id that is already present. + +## Correction to apply on top (audit finding, lane: quality) + +An invalid or missing `output_index` collapses to `0`, so two unindexed items can both become +`msg_ocx_0` — duplicate ids, which is the exact class of bug this fixes. Replace the +collapse-to-zero fallback with a monotonic per-response counter so synthesized ids are unique +even when `output_index` is absent or malformed. Add the regression test that pins it. + +Docs: the locale files in #2131 are uneven (EN/FR rewritten, JA/KO/ZH/TR only first sentence). +Carry only the EN change in this layer; locale parity is not this layer's thesis. + +## Test plan (must fail RED first) + +Carry @bet4it's tests (SSE `response.completed`, `output_item.done` via `output_index`, JSON +passthrough, preserve-existing-id, inherited `toString` type) and ADD: +- two items with missing `output_index` receive DISTINCT ids (fails on #2131 as written). + +## Verification + +Same gate as layer 1, plus explicit confirmation that layer 2's branch contains layer 1's +commit (`git log --oneline ..` shows only layer-2 commits) and that the PR +base ref names layer 1's branch. + diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/030_sibling_prompt_cache_retention.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/030_sibling_prompt_cache_retention.md new file mode 100644 index 0000000000..fc66d105c9 --- /dev/null +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/030_sibling_prompt_cache_retention.md @@ -0,0 +1,38 @@ +# 030 — Sibling A: consolidate prompt_cache_retention (issue #2092) + +Work-phase: wp4. Branch: `codex/consolidate-prompt-cache-retention`. Base: **dev** (sibling, not a stack layer). +Absorbs: **PR #2102 by @lilinxiong** (base implementation). Supersedes: **#2099 by @yzxcj797**, **#2091 by @luvs01**. Closes #2092. + +## Why a sibling and not a layer + +It touches only `src/adapters/openai-responses.ts`, which no other absorbed item touches. It has +no dependency on layers 1-2, so stacking it would impose a false merge order (DEV-STACK-01). + +## Chosen contract + +@lilinxiong's #2102: strip `prompt_cache_retention` only when +`forward && isCanonicalOpenAiForwardProvider(provider)` AND the model is `gpt-5.6` or +`gpt-5.6-*`. This matches the issue's own correction — the reporter withdrew the "strip +everywhere" claim, and some non-5.6 deployments still honor the field. + +Rejected: #2091's blanket strip for every forward provider and every model (it inverts the +existing gpt-5.5 preserve pin at tests/openai-responses-passthrough.test.ts:807). +Rejected: #2099's `startsWith("gpt-5.6")`, which also matches `gpt-5.60`, and its stray +package.json 2.24.2 -> 2.25.0 bump. + +## Carried from the superseded PRs + +From @yzxcj797's #2099: the `Fixes #2092` issue link and the repro-shaped fixture +(`store:false`, streamed input array). From @luvs01's #2091: nothing — its key-auth preserve +case is already covered by #2102. + +## Tightening to apply + +Replace the string-prefix family match with the catalog/native-slug predicate if one exists +in the current tree (`rg -n "isGpt56NativeSlug|NATIVE_OPENAI_MODELS" src/`); otherwise keep +the exact `gpt-5.6` / `gpt-5.6-*` match and pin `gpt-5.60` as a NON-match in tests. + +## Test plan (must fail RED first) + +Carry #2102's tests; add `gpt-5.60` non-match; keep the gpt-5.5 preserve pin intact. + diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/040_sibling_routing_capability.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/040_sibling_routing_capability.md new file mode 100644 index 0000000000..62f0016582 --- /dev/null +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/040_sibling_routing_capability.md @@ -0,0 +1,31 @@ +# 040 — Sibling B: routing capability + lab behavior evidence + +Work-phase: wp5. Branch: `codex/absorb-capability-evidence`. Base: **dev**. +Absorbs: **PR #2100 and PR #2077, both by @ntdatt812**. Closes both as superseded. + +## Why these two together, and why a sibling + +#2100 touches `src/routing/capability.ts`; #2077 touches +`src/routing/compatibility/behavior.ts`. Disjoint files, one author, one thesis: *model-keyed +lookups must use the same resolution rules the runtime uses*. Neither depends on layers 1-2. + +Note: #2077 is Lab-adjacent. Verify `tests/core-lab-boundary.test.ts` stays green — the file +already imports Lab types, so this must not newly puncture the boundary. + +## Defects + +#2100: bare map lookups made `gpt-oss:120b` inherit the provider-wide 8k window instead of the +`gpt-oss` family's 131072, and `noVisionModels` was ignored. +#2077: `map[modelId]` missed family/case overrides, and `constructor` resolved to +`Object.prototype.constructor`, making `jcsStringify` throw and silently dropping Lab subjects. + +## Change + +Route both through `modelRecordValue` / `isModelTextOnly` as @ntdatt812 wrote them. Prototype-id +safety (`constructor`, `toString`) is the load-bearing part; keep those tests verbatim. + +## Test plan + +Carry both test files. Confirm the exact-own maps (`modelPreferHostedTools`, +`modelOpenRouterRouting`) still do NOT family-spread. + diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/050_sibling_k12_short_window.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/050_sibling_k12_short_window.md new file mode 100644 index 0000000000..524d543b5c --- /dev/null +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/050_sibling_k12_short_window.md @@ -0,0 +1,25 @@ +# 050 — Sibling C: K12 short-window quota (issue #2047) + +Work-phase: wp6. Branch: `codex/absorb-k12-short-window`. Base: **dev**. +Absorbs: **PR #2056 by @Ingwannu**. Supersedes: **#2062 by @yzxcj797**. Closes #2047. + +## Chosen base + +#2056 is a strict superset of #2062: `snapshotHasShort`, partial-snapshot preservation, +`updateAccountQuota` carry, and the parse -> cache -> DTO path #2047 actually requires. #2062 +drops short on a later weekly/monthly partial snapshot and carries a stray version bump. + +## Blocker to fix before this can land (raised by the maintainer on both PRs) + +A short-only snapshot with `shortPercent: 0` scores `0` instead of `CODEX_UNKNOWN_USAGE_SCORE`, +so `pickLowestUsageAmong` prefers an account whose long windows are unverified. Fix: +include `shortPercent` in `computeCodexUsageScore` only when the plan's governing long window +is finite; otherwise return `CODEX_UNKNOWN_USAGE_SCORE`. Add the short-only regression. + +This blocker is why #2056 is absorbed-and-corrected rather than simply approved. + +## Also close + +**#2063 by @yzxcj797** — superseded by ALREADY-MERGED #2055 (`2648ffa87`), which classifies +`detail.code` with a stricter own-property lookup. Close with attribution; fold nothing. + diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/060_supersede_and_close_operations.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/060_supersede_and_close_operations.md new file mode 100644 index 0000000000..ec55998dfc --- /dev/null +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/060_supersede_and_close_operations.md @@ -0,0 +1,37 @@ +# 060 — Close-out: supersede operations and attribution + +Work-phase: wp7. No code. GitHub state only. + +## Ordering rule + +A PR is closed ONLY after its replacement exists and is pushed. Never close first. + +## Operations + +| Close | Author | Replaced by | Carried over | +|---|---|---|---| +| #2131 | @bet4it | layer 2 (020) | full implementation + tests, plus unique-id correction | +| #2099 | @yzxcj797 | sibling A (030) | issue link, repro fixture | +| #2091 | @luvs01 | sibling A (030) | nothing; contract deliberately narrower | +| #2100 | @ntdatt812 | sibling B (040) | full implementation + tests | +| #2077 | @ntdatt812 | sibling B (040) | full implementation + tests | +| #2102 | @lilinxiong | sibling A (030) | full implementation + tests (base) | +| #2062 | @yzxcj797 | sibling C (050) | nothing; #2056 supersedes | +| #2063 | @yzxcj797 | merged #2055 | nothing | +| #2056 | @Ingwannu | sibling C (050) | full implementation + scorer correction | +| #2029 | @yzxcj797 | maintainer PR #2130 | nothing; #2130 is a superset | + +## Comment template + +> Thanks for this, @ — closing as superseded by #, which carries from your +> patch. Your work is credited in that PR's description. + +## NOT closed, with reasons stated publicly + +- **#2109 / #2110** (@drakonkat): unresolved security gap in the override gate; needs a human + security pass (AGENTS.md security boundary). +- **#2053** (@Ingwannu): C4 OAuth surface; MAINTAINERS.md mandates security review. +- **#2101, #2040**: large (20 and 14 files); each needs its own PABCD cycle. +- **#2115, #2082, #2027, #2067, #2054, #2032**: below the 60 threshold. +- **#2104, #2075, #2127**: #2075/#2054 CONFLICTING; #2127 is an active draft by its author. + From 255890290b121f51ef1bd46adf49a789adac65a1 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 02:37:11 +0900 Subject: [PATCH 42/88] =?UTF-8?q?docs(devlog):=20correct=20the=20stack=20p?= =?UTF-8?q?remise=20=E2=80=94=20the=20absorbed=20bug=20PRs=20are=20disjoin?= =?UTF-8?q?t?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../000_research_inventory.md | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/000_research_inventory.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/000_research_inventory.md index 2959c3b9ea..5aec5c3a20 100644 --- a/devlog/_plan/260820_bug_pr_backlog_consolidation/000_research_inventory.md +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/000_research_inventory.md @@ -131,3 +131,82 @@ Every superseded PR gets (a) its author credited by @login in the superseding PR (b) a courteous closing comment naming the replacement PR and what was carried over, (c) no force-push and no edit to the contributor's own branch. + +--- + +# P-phase amendment (A-gate self-audit, 2026-08-20): the stack premise in §5 was WRONG + +The A-phase auditor lane produced nothing across three wait cycles, so it was retired +(DISPATCH-RETIRE-01) and the load-bearing claims were verified directly. Two of them failed. + +## Correction 1 — #2131 does NOT touch `src/server/responses/core.ts` + +`gh pr diff 2131 --name-only` returns `src/server/responses/responses-field-backfill.ts`, +its test, and eight docs locales. `core.ts` already imports that module on `dev` +(`src/server/responses/core.ts:6-7`, called at :3098-3099); #2131 only changes the module's +internals and signature. It never edits `core.ts`. + +#2132's fix lives in `resolveResponsesCodexAuth` (`core.ts:1082-1114`), a different region of +a file #2131 does not modify at all. + +**Therefore the single dependency edge claimed in §5 does not exist.** The corrected file map: + +| Item | Files | Overlap | +|---|---|---| +| #2132 | src/server/responses/core.ts (auth resolution) | none | +| #2131 | src/server/responses/responses-field-backfill.ts | none | +| #2102 | src/adapters/openai-responses.ts | none | +| #2100 | src/routing/capability.ts | none | +| #2077 | src/routing/compatibility/behavior.ts | none | +| #2056 | src/codex/quota.ts, src/codex/routing.ts | none | +| #2105 | src/cli/index.ts, src/server/system-env.ts | none | + +Every absorbed item is disjoint. **There is no dependency-ordered chain in this backlog at all.** + +## Consequence: this work must NOT be stacked + +DEV-STACK-01 forbids stacking independent parts: "the parts are independent — open parallel PRs +off trunk instead, since a stack imposes a false merge order." Building the requested chain +would mean any layer's review blocking every layer above it, for zero dependency benefit, and +would violate the same rule the request asked to follow. + +Docs 010 and 020 are therefore **superseded**: both become siblings based on `dev`, not layers. +PR #2134 remains its own independent PR. The stack rooted on #2134 is cancelled and the reason +is recorded here rather than the plan being quietly reshaped. + +**One exception preserved:** if two absorbed items ever do touch one file, they stack. None do. + +## Correction 2 — issue #2132 is confirmed present, with a sharper mechanism than 010 assumed + +Verified in this worktree: +- `core.ts:1088`: `const substituteMainCredential = options.admission?.source === "bearer";` + keys on HOW the caller authenticated, never on WHERE the request routes. +- `auth-context.ts:542-548`: with `ctx.kind === "main"` and that flag, a missing/dead stored + main token throws `CodexMainSubstitutionUnavailableError`. +- `core.ts:1148-1153`: that becomes the reported 401. +- The `authCtx = { kind: "main" }` fallback at `core.ts:1105` is taken whenever + `route.codexAccountMode` is unset — which is every non-`openai` provider. + +So a key-auth routed provider reaches `kind: "main"` + `substituteMainCredential: true` and +fails, exactly as reported. The defect is real and 010's fix direction stands; only its stack +position changes. + +## Correction 3 — supersede claims re-verified + +`gh pr view 2055`: `MERGED` at 2026-08-19T00:11:27Z, merge commit `2648ffa879edf93e`. #2063's +supersede stands. + +## Revised work-phase map + +| WP | Doc | Branch | Base | Content | +|---|---|---|---|---| +| wp2 | 010 | codex/fix-bearer-admission-2132 | dev | issue #2132 (score 96) | +| wp3 | 030 | codex/consolidate-prompt-cache-retention | dev | absorb #2102; supersede #2099, #2091 | +| wp4 | 040 | codex/absorb-capability-evidence | dev | absorb #2100, #2077 | +| wp5 | 050 | codex/absorb-k12-short-window | dev | absorb #2056; supersede #2062, #2063 | +| wp6 | 020 | codex/absorb-responses-id-backfill | dev | absorb #2131 + unique-id correction | +| wp7 | 060 | — | — | close-outs with attribution | + +Ordered by score, not by dependency, because no dependency exists. Each is independently +reviewable and independently mergeable, which is what DEV-STACK-01 actually asks for. + From d1db92cbf22e7546605439f87639742a7eca1b27 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 02:39:21 +0900 Subject: [PATCH 43/88] docs(devlog): record #2130 merged, so #2029 is superseded in fact --- .../000_research_inventory.md | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/000_research_inventory.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/000_research_inventory.md index 5aec5c3a20..6867621ef2 100644 --- a/devlog/_plan/260820_bug_pr_backlog_consolidation/000_research_inventory.md +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/000_research_inventory.md @@ -210,3 +210,26 @@ supersede stands. Ordered by score, not by dependency, because no dependency exists. Each is independently reviewable and independently mergeable, which is what DEV-STACK-01 actually asks for. + +## Correction 4 — #2130 merged mid-cycle; #2029 is now superseded in fact, not in prospect + +`gh pr view 2130`: `MERGED` at 2026-08-19T17:25:26Z. The probe lane's verdict was conditional +("SUPERSEDED, once #2130 merges"); that condition is now satisfied. + +Consequence for `060`: **#2029 (@yzxcj797)** moves from a prospective close to an immediate one. +`dev` now carries `busUnreachable()` — a superset of #2029's two stderr strings — plus the +on-disk unit check that #2029's own reviewer demanded. Landing #2029 on top would REGRESS that +disk check back to an unconditional `absent`. Nothing from #2029 needs to be carried over; its +one unique behavior (keeping `DBUS_SESSION_BUS_ADDRESS not set` as `unknown`) is precisely what +the merged disk check replaces. + +This also removes #2130 from the open-bug-PR set: the fresh count at wp1 close is 26 open bug +PRs, of which exactly one (#2134) is lidge-jun's and 25 are not. + +## wp1 close-out evidence + +`gh pr list --repo lidge-jun/opencodex --state open --label bug --limit 100` at close: +26 total, mine = [2134], non-mine = 25. Every one of those 25 numbers appears in §1/§3 of this +document (verified by a grep loop over the list, exit 0). No open bug PR is left without a +disposition. + From 899c03d00865630417ab90fa46cf2d6859d44902 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 02:52:59 +0900 Subject: [PATCH 44/88] docs(devlog): adjudicate the late auditor FAIL verdict --- .../000_research_inventory.md | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/000_research_inventory.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/000_research_inventory.md index 6867621ef2..1b68a3fe29 100644 --- a/devlog/_plan/260820_bug_pr_backlog_consolidation/000_research_inventory.md +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/000_research_inventory.md @@ -233,3 +233,57 @@ PRs, of which exactly one (#2134) is lidge-jun's and 25 are not. document (verified by a grep loop over the list, exit 0). No open bug PR is left without a disposition. + +--- + +# A-gate amendment 2 — retired auditor returned late with VERDICT: FAIL; findings adjudicated + +The adversarial lane retired under DISPATCH-RETIRE-01 (three empty wait cycles) delivered after +retirement. Its verdict is FAIL. It is adjudicated here rather than discarded, because a late +reviewer is still a reviewer. + +**Findings 1 and 2 — CONFIRMED, and already corrected.** It independently measured the same +`gh pr diff --name-only` evidence and reached the same conclusion as amendment 1: #2131 does not +touch `core.ts`, no dependency edge exists, and rooting a stack on #2134 (which only touches +`agent-settings-routes.ts`) is a second DEV-STACK-01 violation. Two independent measurements now +agree. Recorded as settled. + +**Finding 5 — CONFIRMED, and it is the sharpest catch.** Doc 010 said to gate substitution on +"the native ChatGPT **pool**". That would exclude `codexAccountMode: "direct"` and re-break +#1686, whose whole point is that Direct bearer admission is only safe *because* substitution +still runs. The implemented fix uses `route.codexAccountMode !== undefined`, which covers both +`pool` and `direct` and matches the issue reporter's own suggested gate. 010's prose is +superseded by this line; the code is correct. + +**Finding 3 — CONFIRMED and material.** Overlap was measured only inside the absorb set. Three +OTHER open PRs edit `src/server/responses/core.ts`: + +| PR | Overlap with the #2132 fix | +|---|---| +| #2104 (@olddonkey) | `src/server/responses/core.ts` — review-ready, MERGEABLE | +| #2101 (@Ingwannu) | `core.ts` + `compact.ts` + `auth-context.ts` — all three files this fix touches | +| #2040 (@Ingwannu) | `core.ts` | + +Verified by `gh pr diff --name-only`. The #2132 change is 5 lines across two files and does not +restructure either function, so a textual conflict is possible but small. This is a merge-order +hazard to state on the PR, not a reason to withhold the fix. #2104 is reclassified from `n/a` +to KEEP (review-ready, not a conflicting draft — the auditor is right that grouping it with +CONFLICTING #2075 and draft #2127 was an error, and its inventory row's "adapters/xai" file +attribution was wrong). + +**Finding 4 — CONFIRMED. #2105 would have been lost.** It is scored 60 ABSORB in §3, has no +decade doc, and appears in no row of 060. An above-threshold item with no execution path is +exactly how a contributor's work disappears without a close comment. Disposition corrected to +**KEEP — remains open**, because no replacement exists. It is not closed. + +**Nits accepted:** "strict superset" overstates #2056 vs #2062 (#2062 uniquely adds +`tests/rate-limit-reset-credits.test.ts`); #2130 has empty `closingIssuesReferences` so +#1939/#2114/#2108 will not auto-close; the rubric is recorded as a single integer, so the +component arithmetic is not independently auditable. + +## Net effect on the plan + +No absorbed item is dropped and no new one is added. Two dispositions change (#2104 n/a -> KEEP, +#2105 ABSORB -> KEEP), one prose invariant in 010 is superseded by the implemented predicate, +and one merge hazard is now stated. The sibling shape from amendment 1 stands, reinforced. + From a155fc9383f2945772de7516a51337274b9da677 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 03:05:44 +0900 Subject: [PATCH 45/88] docs(devlog): banner 010 so the shipped predicate cannot be reverted --- .../010_layer1_bearer_admission_2132.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/010_layer1_bearer_admission_2132.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/010_layer1_bearer_admission_2132.md index dd5da1b8af..991c3bb62a 100644 --- a/devlog/_plan/260820_bug_pr_backlog_consolidation/010_layer1_bearer_admission_2132.md +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/010_layer1_bearer_admission_2132.md @@ -1,3 +1,15 @@ +> **SUPERSEDED IN PART — read `000_research_inventory.md` amendments 1 and 2 first.** +> +> Two things in this document are wrong and were corrected after it was written: +> +> 1. **It is NOT a stack layer and does NOT root on #2134.** No dependency edge exists; +> the shipped PR (#2137) is based on `dev` as a sibling. +> 2. **The substitution predicate is NOT "native ChatGPT pool".** Pool-only would exclude +> `codexAccountMode: "direct"` and re-break #1686, whose Direct admission is only safe +> BECAUSE substitution still runs. The shipped predicate is +> `route.codexAccountMode !== undefined`, covering pool AND direct. Do not "correct" it back. + + # 010 — Layer 1 (stack bottom): fix issue #2132, bearer admission must not force a ChatGPT credential Work-phase: wp2. Branch: `codex/fix-bearer-admission-2132`. Base: `codex/fix-subagent-roster-truncation` (PR #2134). From 831cd1c3496ca54e65950d27797d9b0cd7c98cb0 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 03:19:12 +0900 Subject: [PATCH 46/88] docs(devlog): log wp2 and wp3 shipped state --- .../070_execution_log.md | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md new file mode 100644 index 0000000000..134053e2ea --- /dev/null +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md @@ -0,0 +1,62 @@ +# 070 — Execution log: what actually shipped + +Appended as work-phases close. This is the record of landed state, distinct from the plan. + +## wp2 — issue #2132 (score 96) + +**PR #2137**, branch `codex/fix-bearer-admission-2132`, base `dev`. + +`substituteMainCredential` was computed from how the caller authenticated and never from where +the request routes, so a key-authenticated provider was gated on a ChatGPT credential it cannot +use. The predicate is now +`options.admission?.source === "bearer" && route.codexAccountMode !== undefined` +at both `core.ts:1088` and `compact.ts:325`. + +It covers `pool` AND `direct`. Doc 010's "native ChatGPT pool" wording would have excluded +`direct` and re-broken #1686, whose Direct admission is only safe because substitution still +runs. 010 now carries a banner saying so. + +Evidence: `tests/bearer-admission-routed-provider.test.ts` driven RED (it reproduced the exact +reported 401), full suite 13516 pass / 0 fail, typecheck and privacy scan clean. Re-audit round 2 +by the same adversarial reviewer returned **VERDICT: PASS**. + +## wp3 — issue #2092 (score 86) + +**PR #2138**, branch `codex/consolidate-prompt-cache-retention`, base `dev`. + +Absorbs @lilinxiong's #2102 contract: strip `prompt_cache_retention` on canonical ChatGPT +forward for the `gpt-5.6` family only, with an exact-or-dashed-prefix match so a future +`gpt-5.60` is not swept up. The retired value is not translated into `prompt_cache_options`. + +Evidence: 5 of the new tests fail when only the adapter change is reverted; the two narrowness +guards stay green in both directions, which is what makes them guards rather than restatements. +Full suite 13537 pass / 0 fail. + +### Closed with attribution + +| PR | Author | Superseded by | Carried | +|---|---|---|---| +| #2102 | @lilinxiong | #2138 | the implementation itself | +| #2099 | @yzxcj797 | #2138 | issue link + repro fixture | +| #2091 | @luvs01 | #2138 | nothing; contract deliberately narrower | +| #2029 | @yzxcj797 | merged #2130 | nothing; #2130 adds the disk check review demanded | +| #2063 | @yzxcj797 | merged #2055 | nothing; #2055 is the stricter own-property lookup | + +Each carries a comment naming the replacement and the specific reason, so no contributor has to +guess why their work closed. + +## Still open by decision, not omission + +- #2109 / #2110 (@drakonkat) — unresolved security gap in the override gate; needs a human pass. +- #2053 (@Ingwannu) — C4 OAuth; MAINTAINERS.md mandates security review. +- #2105 (@lilinxiong) — above threshold but no replacement exists yet; closing it now would lose work. +- #2101, #2040 — 20 and 14 files; each needs its own cycle. +- #2104 (@olddonkey) — review-ready and MERGEABLE; reclassified out of the deferred bucket, it is a + KEEP that deserves review rather than supersession. + +## Remaining work-phases + +wp4 (#2100 + #2077 capability evidence), wp5 (#2056 K12 with the scorer correction), wp6 (#2131 +responses id backfill with the duplicate-id fix). Each is a sibling off `dev`; none depends on +another. + From 8b4f1a6a7978fe9ad93dd7bb0cf7762d3bdf9128 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 03:52:13 +0900 Subject: [PATCH 47/88] docs(devlog): log wp4 through wp6 and the campaign state --- .../070_execution_log.md | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md index 134053e2ea..185711e293 100644 --- a/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md @@ -60,3 +60,33 @@ wp4 (#2100 + #2077 capability evidence), wp5 (#2056 K12 with the scorer correcti responses id backfill with the duplicate-id fix). Each is a sibling off `dev`; none depends on another. + +## wp6 — PR #2131 (@bet4it) + +**PR #2142**, branch `codex/absorb-responses-id-backfill`, base `dev`. + +Carries @bet4it's implementation and tests, plus one correction: an absent or malformed +`output_index` collapsed to 0, so two such items both synthesized `msg_ocx_0` — duplicate ids, +the exact defect the backfill prevents. Unusable indices now take a monotonic ordinal based far +above any plausible real index. + +Evidence worth naming: applying ONLY @bet4it's original source and running the new suite gives +15 pass / 1 fail, and the single failure is the duplicate-id guard. That is what makes it a guard +rather than a restatement of behavior. + +The inherited assertion `expect(parsed.item.id).toBe("msg_ocx_0")` was replaced, not deleted +quietly, and the replacement is disclosed in the PR body. + +# Campaign state at wp6 close + +Superseded and closed with attribution: #2102, #2099, #2091, #2029, #2063, #2100, #2077, #2056, +#2062, #2131 — ten PRs, each with a comment naming its replacement and the specific reason. + +Opened: #2137 (#2132), #2138 (#2092), #2140 (#2100+#2077), #2141 (#2047), #2142 (#2131), plus +the pre-existing #2134. + +Deliberately still open: #2109/#2110 (security gap), #2053 (C4 OAuth review), #2105 (no +replacement written yet), #2101/#2040 (each needs its own cycle), #2104 (review-ready, deserves +review not supersession), and the below-threshold set (#2115, #2082, #2027, #2067, #2054, #2032, +#2075, #2127). + From 3c77c10a5fe669893942f0a933b92c4b83ad38d6 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 04:03:40 +0900 Subject: [PATCH 48/88] docs(devlog): log wp7 and close the absorb campaign --- .../070_execution_log.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md index 185711e293..9e939cc158 100644 --- a/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md @@ -90,3 +90,16 @@ replacement written yet), #2101/#2040 (each needs its own cycle), #2104 (review- review not supersession), and the below-threshold set (#2115, #2082, #2027, #2067, #2054, #2032, #2075, #2127). + +## wp7 — PR #2105 (@lilinxiong) + +**PR #2144**, branch `codex/absorb-claude-shell-hook-gate`, base `dev`. + +Implementation and tests carried unchanged. The one addition is a comment on +`reconcileShellHook` recording that "installed" is answered from the calling process's PATH, so +a service context with a stripped PATH can remove a hook an interactive shell would keep — the +reversible direction, and the one this reconcile wants. + +This closes the finding the auditor raised at #2105: it was scored ABSORB with no execution path +and would have been lost. It now has one. + From bb38c4d5b10dddaf2c24a96efa903a8c773c32a7 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 04:08:15 +0900 Subject: [PATCH 49/88] docs(devlog): record CI state and the campaign end state --- .../070_execution_log.md | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md index 9e939cc158..e43c15d894 100644 --- a/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md @@ -103,3 +103,46 @@ reversible direction, and the one this reconcile wants. This closes the finding the auditor raised at #2105: it was scored ABSORB with no execution path and would have been lost. It now has one. + +# Campaign close — CI state and honest end state + +All six shipped PRs are green on exact head and MERGEABLE: + +| PR | Fixes | Checks | +|---|---|---| +| #2137 | issue #2132 | 25 pass / 0 fail | +| #2138 | issue #2092 (absorbs #2102) | 25 pass / 0 fail | +| #2140 | absorbs #2100 + #2077 | 25 pass / 0 fail | +| #2141 | issue #2047 (absorbs #2056) | 25 pass / 0 fail | +| #2142 | absorbs #2131 | 23 pass / 0 fail | +| #2144 | absorbs #2105 | 29 pass / 0 fail | + +#2140 first showed `npm-global-smoke` failing on windows-latest with +`EBUSY: resource busy or locked, unlink ...bun.exe` during dependency install — a Windows file +lock during Bun installation, not a defect in the routing change. Rerunning the failed jobs +turned it green, which is the evidence that it was infrastructure rather than the patch. + +## Eleven PRs closed with attribution + +#2102, #2099, #2091, #2029, #2063, #2100, #2077, #2056, #2062, #2131, #2105. + +Each carries a comment naming its replacement, what was carried over, and what was deliberately +not. Where a contributor's own assertion had to be replaced (#2056's `shortPercent: 0` scorer +case, #2131's `msg_ocx_0` collapse case), the replacement is disclosed in both the closing +comment and the superseding PR body rather than done silently. + +## Fourteen PRs deliberately still open + +- **Security holds:** #2109, #2110 (override gate), #2053 (C4 OAuth, MAINTAINERS.md review). +- **Own-cycle scale:** #2101 (20 files), #2040 (14 files). +- **Deserves review, not supersession:** #2104 — review-ready, MERGEABLE, and touching + `core.ts` alongside #2137. +- **Below the 60 threshold:** #2115, #2082, #2027, #2067, #2054, #2032, #2075, #2127. + +Nothing here is an omission. Every one is a recorded decision with a reason. + +## Merging + +Not done. DEV-STACK-04 and DEV-GIT-PUSH-01 both put merge authorization with the user, and +nothing in this campaign changes that. + From 5a77d63b3c108464cb1b1ec9f2dd6014e0194576 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 04:53:56 +0900 Subject: [PATCH 50/88] docs(devlog): log wp8 and wp9, including the one real stack layer --- .../070_execution_log.md | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md index e43c15d894..3d8506c5fd 100644 --- a/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md @@ -146,3 +146,35 @@ Nothing here is an omission. Every one is a recorded decision with a reason. Not done. DEV-STACK-04 and DEV-GIT-PUSH-01 both put merge authorization with the user, and nothing in this campaign changes that. + +## wp9 — PR #2101 (@Ingwannu): the ONE real stack layer + +**PR #2146**, branch `codex/absorb-account-entitlement-stacked`, base **`codex/fix-bearer-admission-2132`** (the #2137 branch), not `dev`. + +This is the single genuine dependency edge in the entire backlog. #2101 passes +`substituteMainCredentialForDirect: substituteMainCredential` into `resolveCodexAuthContext` — +the exact value #2137 corrects. Landing it on `dev` alone would silently reintroduce #2132 for +every routed provider. Everything else absorbed in this campaign was disjoint and shipped as a +sibling; this one is stacked because the code says so, not because a plan said so. + +Three corrections on top of @Ingwannu's work: + +1. **Selector compact bypassed the wire rewrite** — `accountGatedCompactWireModel` came from + `raw.model`, which never matches the gated map for `side/gpt-daybreak-blue-latest`, so a + selector-form compact still hit the native endpoint. Now derived from `route.modelId`. +2. **Direct callers evicted catalog evidence** — one 64-entry LRU shared between per-credential + Direct keys and the main/Pool keys the catalog projects from. Split into two eviction classes; + pinned by a test verified to fail against the shared LRU. +3. **Comment rot** — `native-models.ts` claimed routing never collapses Daybreak into + `gpt-5.6-sol`, which the wire normalization does. + +Evidence: full suite 13554 pass / 0 fail at the stacked tip; the composition check +(`codex-model-entitlements` + `bearer-admission-routed-provider` + `codex-auth-context` + +`server-auth`) is 146 pass / 0 fail, which is what proves the two layers agree. +Stack integrity: `git log parent..layer` shows exactly 1 commit, and a stack map was added to +#2137 so a reviewer arriving at the parent sees the chain. + +Two gaps named in the PR rather than carried silently: Direct `/v1/models` can still advertise a +Pool-only grant (advertisement only; dispatch still checks the caller credential), and +same-account gated-400 retry stays Pool-only. + From ef91d14a70e6d6e029db34b72a99adf000fc9659 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 05:35:42 +0900 Subject: [PATCH 51/88] docs(devlog): log wp10 through wp12, including both security holds resolved --- .../070_execution_log.md | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md index 3d8506c5fd..b3ce89d97d 100644 --- a/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md @@ -178,3 +178,24 @@ Two gaps named in the PR rather than carried silently: Direct `/v1/models` can s Pool-only grant (advertisement only; dispatch still checks the caller credential), and same-account gated-400 retry stays Pool-only. + +## wp12 — PR #2053 (@Ingwannu), the C4 OAuth hold + +**PR #2149**, branch `codex/absorb-oauth-superseded-commit`, base `dev`. + +Applied unchanged, rebased from 145 commits behind. The persist-boundary placement is the whole +design: `assertBeforePersist` runs inside the file lock, after `fn(store)` and before +`persist()`, so a superseded flow's in-memory mutation is discarded rather than written. +Ownership is identity-checked against the flow's own `AbortController`, not a timestamp. + +**This was a wp1 HOLD and it is resolved by shipping, not by absorbing quietly.** The PR states +plainly that MAINTAINERS.md mandates security review and asks that it not be merged on my +verification alone, and it names three residuals rather than letting the original claim stand: + +1. the description claimed reauth coverage; the diff wires the hook but adds no reauth test +2. `OAuthLoginSupersededError` is not in the public allowlist, so it projects to the generic string +3. a never-finishing Kiro rollback blocks all replacements, by design + +Evidence: reverting `src/oauth/` fails 2 tests including the cancel-then-replace round trip; +full suite 13536 pass / 0 fail. + From 2700b0e8ab52fe323528766ef4f255e67155abfe Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 06:02:54 +0900 Subject: [PATCH 52/88] docs(devlog): close the campaign with the final PR state and both scoring corrections --- .../070_execution_log.md | 92 +++++++++++++++++++ 1 file changed, 92 insertions(+) diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md index b3ce89d97d..cd146a2c99 100644 --- a/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/070_execution_log.md @@ -199,3 +199,95 @@ verification alone, and it names three residuals rather than letting the origina Evidence: reverting `src/oauth/` fails 2 tests including the cancel-then-replace round trip; full suite 13536 pass / 0 fail. + +## wp14 — PR #2075 (@olddonkey): the second false negative + +**PR #2151**, branch `codex/absorb-fastwire-native-chat`, base `dev`. Closes #1886. + +Same class of error as wp13, different cause. I saw `CONFLICTING` and treated it as a reason not +to read the diff. The rescore put it at **67**: native `/v1/chat/completions` decided +`service_tier` from `chatServiceTier` alone, so a `supportsServiceTier: false` declaration was +fail-open. The conflict was why it could not MERGE, not why it should score LOW — and resolving +it took one import line. + +Rebase, stated exactly: `src/adapters/openai-chat.ts` conflicted because `dev` added +`AdapterTierMetadata` while the PR adds `decideTier` and `ResolvedFastPolicy`. Both kept. +Everything else clean. Typecheck is what confirms the resolution. + +Evidence: reverting `src/` fails the characterization test the author had flipped from +documented-known-bug to passing assertion. Full suite 13552 pass / 0 fail. + +## Two scoring lessons, recorded together + +wp13 and wp14 were both my errors, from two different shortcuts: + +1. **Scoring from titles** — "preserve and replay thought signatures" reads like bookkeeping and + was a core provider 400. +2. **Reading merge state as value** — `CONFLICTING` says a patch cannot land today; it says + nothing about whether the defect matters. + +Both produce false negatives that are indistinguishable from correct low scores without opening +the diff. The rubric was fine; the inputs I fed it were not. + + +# Campaign close (final) + +## 13 PRs open, all green, all MERGEABLE + +| PR | Fixes | Credit | Base | +|---|---|---|---| +| #2137 | issue #2132 | new work | dev | +| #2138 | issue #2092 | @lilinxiong | dev | +| #2140 | #2100 + #2077 | @ntdatt812 | dev | +| #2141 | issue #2047 | @Ingwannu | dev | +| #2142 | #2131 | @bet4it | dev | +| #2144 | #2105 | @lilinxiong | dev | +| #2145 | issue #1950 | @Ingwannu | dev | +| #2146 | issue #2097 | @Ingwannu | **#2137 branch (stacked)** | +| #2147 | issue #1886 | @olddonkey | dev | +| #2148 | #2109 + #2110 | @drakonkat | dev | +| #2149 | #2053 | @Ingwannu | dev | +| #2150 | issue #2125 | @agentHits | dev | +| #2151 | issue #1886 | @olddonkey | dev | + +Plus #2134, which opened this session. + +## 16 PRs closed with attribution + +#2102, #2099, #2091, #2029, #2063, #2100, #2077, #2056, #2062, #2131, #2105, #2040, #2101, +#2104, #2109, #2110, #2053, #2127, #2075. + +Every one carries a comment naming its replacement, what was carried over, and what was +deliberately not. Where a contributor's own assertion had to be replaced — #2141's scorer case, +#2142's `msg_ocx_0` case — the replacement is disclosed in both the comment and the PR body. + +## 6 remain, independently verified below threshold + +#2115 (58), #2082 (46), #2067 (38), #2054 (58), #2032 (37), #2027 (51). + +These are not omissions. A rescore lane read every diff and scored them against the same rubric; +it found exactly two false negatives in my original triage (#2127 at 83, #2075 at 67) and both +were absorbed as wp13 and wp14. The remaining six are genuinely below the line, and four of them +are additionally blocked (draft, CONFLICTING, or CHANGES_REQUESTED). + +Two of them carry real bugs attached to unabsorbable patches: #2054's Cursor context collapse +(#1527) and #2027's Go quota gating (#1924). The right move for both is a clean reimplementation +on `dev`, not absorbing a 19-file conflicting draft. That is stated rather than silently skipped. + +## Corrections made on top of contributor work + +Eight PRs shipped with fixes the originals were missing, each pinned by a test verified to fail +against the contributor's own source: + +- #2141 short-only scorer returning 0 instead of UNKNOWN +- #2142 duplicate `msg_ocx_0` from a collapsed index +- #2145 history-only arming and non-atomic SSE overflow +- #2146 selector compact bypassing the wire rewrite, Direct callers evicting catalog cache +- #2148 `allowPrivateNetwork` bypassing the HTTPS gate for public hosts +- #2138 `gpt-5.60` near-miss match + +## Not merged + +DEV-STACK-04 and DEV-GIT-PUSH-01 both put merge authorization with the user. #2137 must land +before #2146. + From 4e806326709a012147aea6700adbbadf9e9ab93a Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 08:14:07 +0900 Subject: [PATCH 53/88] docs(devlog): record the residual bug-PR dispositions and the wp15 outcome --- .../080_residual_dispositions.md | 166 ++++++++++++++++++ 1 file changed, 166 insertions(+) create mode 100644 devlog/_plan/260820_bug_pr_backlog_consolidation/080_residual_dispositions.md diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/080_residual_dispositions.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/080_residual_dispositions.md new file mode 100644 index 0000000000..e47d8aa35b --- /dev/null +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/080_residual_dispositions.md @@ -0,0 +1,166 @@ +# 080 — Residual dispositions: #2115, #2054, #2032, #2067, #2082, #2027, #2155 + +Unit: 260820_bug_pr_backlog_consolidation +Work-phases: wp15 (this doc's first three), wp16-wp19 (one PR each), wp20 (closeout). +Baseline: origin/dev; worktree branch `codex/fix-subagent-roster-truncation`. + +The wp1 rubric put six PRs below the 60 threshold and left them open. The user reviewed +that reasoning and issued explicit per-PR dispositions, plus one new arrival (#2155). This +doc records the dispositions and the evidence each one rests on. Evidence came from five +read-only gpt-5.6-sol investigation lanes that read every diff and the surrounding runtime. + +## wp15 — the three that need no new code + +### #2115 @louis-tepe — CLOSE + +The PR is titled as Code Mode edit guidance, but `src/adapters/openai-chat.ts:548` swaps the +local "hostname is exactly api.openai.com" test for a new `isCanonicalNativeOpenAIRoute` +predicate in `src/adapters/tool-catalog-nudge.ts:118-132`. That predicate is not +prompt-only. Through `messagesToChatFormat` (`openai-chat.ts:629`) it decides whether +developer messages stay as ordered `role: "developer"` entries or fold into the leading +system message; through `toolChoiceToChatFormat` (`:1232-1246`) it decides whether a single +required tool becomes a forced named function; and through `buildRequest` (`:1333`) it +decides native `reasoning_effort` versus gateway-style `reasoning`. One predicate change +therefore moves three wire semantics that have nothing to do with edit guidance. + +Second defect, independent of the first: `codeModeExecName` is withheld when a bare shell +bridge is present (`tool-catalog-nudge.ts:203-207`), but the new suffix injection checks +only `codeModeExecTool` (`:214-218`). A freeform `exec` sitting beside a top-level +`exec_command` still receives "targeted code edits" guidance even though the repository's +own predicate classifies that catalog as not Code Mode — a contract pinned at +`tests/tool-catalog-nudge.test.ts:114-123`. + +Blast radius if the guidance predicate is wrong: every routed Code Mode request on +Anthropic, Google/Vertex/Antigravity, Command Code, and every OpenAI-compatible host +without a literal `openai`/`chatgpt` DNS label — gateways, DeepSeek, Groq, Ollama, vLLM, +LM Studio, custom routes. Kiro (`src/adapters/kiro.ts:466-469`) picks up the reworded +generic sentence without being able to receive the suffix at all. + +The underlying request is legitimate. The implementation is not absorbable as-is because +the correct version is a narrower Code Mode seam that does not redefine native route +identity. + +### #2054 @keepitmello — STAY OPEN, probe requested + +The PR stores Cursor's returned `ConversationStateStructure` and replays it as the next +`AgentRunRequest.conversation_state` instead of rebuilding history every turn +(`src/adapters/cursor/protobuf-request.ts:823` on dev is the full-replay path). The +hypothesis is that full replay defeats Cursor's own checkpoint cache and produces the +large-context collapse in #1527. + +The PR proves the request construction changed — smaller `rootBytes` — and states plainly +that it did not reproduce the `kimi-k3` collapse or the 429. So the causal link is exactly +the thing still missing, and it is cheap for the author to capture: a matched three-turn +baseline-vs-head run at the issue's 75k-95k token shape, recording per turn the request +`conversation_id`, a digest and byte length of `conversation_state`, its +`root_prompt_messages_json` count, `turns` count, and `token_details.used_tokens`, against +the same fields on the response's `conversation_checkpoint_update`. The decisive comparison +is whether turn N+1's request state equals turn N's returned checkpoint while +`conversation_id` holds. `ocx debug provider on` / `ocx debug provider logs -f` +(`docs-site/src/content/docs/reference/cli/agents.md:102`, `src/lib/debug.ts:15`) already +carries the construction mode; exact state equality needs payload-free digests added +locally. + +Checkpoint reuse WITHOUT the collapse disappearing would refute the causal claim, which is +why the request is worth making rather than guessing. + +### #2032 @yzxcj797 — CLOSE + +This is a decision that was already made by a human, not a scoring call. The maintainer's +CHANGES_REQUESTED review says it directly: "Passing --dangerously-skip-permissions does not +create an OS sandbox" and "A viable revision needs a real sandboxed launch path, or it must +leave the vendor root guard intact." + +The diff injects `IS_SANDBOX=1` whenever the flag appears in argv (PR head +`src/cli/claude.ts:126-131`, `:329-331`) with no UID check and no sandbox establishment, +so it suppresses Claude Code's root guard while the child keeps ordinary root filesystem and +process access. The added tests (`tests/claude-cli.test.ts:271-295`) assert environment +assembly, not an isolation boundary. It also carries an unrelated `package.json` version +bump to 2.25.0. + +On dev, opencodex does not drop, refuse, or warn about the flag: `src/cli/dispatch.ts:500` +forwards trailing args and `src/cli/claude.ts:338` passes them through unchanged. The +refusal comes from Claude Code itself. A user who has genuinely isolated their environment +can already export `IS_SANDBOX=1`, because `buildClaudeEnv` starts from the caller's +environment (`src/cli/claude.ts:76`) and the docs promise exported variables win +(`docs-site/src/content/docs/guides/claude-code.md:56`). + +## wp15 outcome (executed) + +| PR | Action | Receipt | +|---|---|---| +| #2115 | CLOSED with reason | `issuecomment-5349122248`, state CLOSED | +| #2054 | comment only, left OPEN | `issuecomment-5349122708`, state OPEN | +| #2032 | CLOSED with reason | `issuecomment-5349122937`, state CLOSED | + +Verified by `gh pr view --json state` after the fact, not from the write's own exit code. + +## wp16 — #2067 @waw4303: ABSORB, and the reason is external corroboration + +The user's instruction was to check how **omniroute** — a separate open-source project +brokering free quota against the same upstream — builds these headers, then decide. That +turned out to be the decisive evidence, and it moved the answer. + +The PR head changed while the lane was reading it. The original commit `a5183abb` sent +`opencode-cli/1.0.0` / `cli` / `default`; the current head `6a79c42e` sends only +`User-Agent: opencode` alongside the existing `x-opencode-client: desktop`. + +omniroute (`diegosouzapw/OmniRoute`, commit `3d7ed7aa`, 2026-08-19) resolves the same +headers in `open-sse/executors/opencode.ts:408-448`: + +```ts +userAgent: process.env[envUAKey]?.trim() || process.env.OPENCODE_USER_AGENT?.trim() || "opencode", +client: process.env.OPENCODE_CLIENT?.trim() || "desktop", +project: process.env.OPENCODE_PROJECT?.trim() || "global", +``` + +It does not fetch or derive an installed CLI version at runtime. It falls back to a bare +unversioned `opencode`, preserves a real incoming `opencode-cli/` when one exists, +and lets an operator override via env. + +Three-way comparison: + +| Header | ours today | #2067 head | omniroute | +|---|---|---|---| +| `User-Agent` | absent (uncontrolled runtime default) | `opencode` | `opencode`, configurable, preserves real `opencode-cli/` | +| `x-opencode-client` | `desktop` | `desktop` | `desktop`, configurable | +| `x-opencode-project` | absent | absent | `global`, configurable | +| `x-opencode-request` | absent | absent | fresh UUID | +| `x-opencode-session` | absent | absent | conversation-derived or UUID | + +The important finding is the one that reverses a wp1 assumption. wp1 scored this 38 partly +because a pinned CLI version marker has a short shelf life — and that criticism was correct +against `a5183abb`. omniroute made the same mistake and then deliberately backed it out: +its July implementation (`234956dd`) used exactly `opencode-cli/1.0.0` / `cli` / `default`, +and PR #10571 replaced them with `opencode` / `desktop` / `global`. So the version pin is +not corroborated by an independent implementation; the *revised* values are, and by one that +arrived at them by retreating from the pin. + +That removes the "value with a short lifetime" objection entirely. What remains is a real +defect: we send no `User-Agent` at all today (`src/providers/registry.ts:2427`), so the +runtime default goes out uncontrolled, which is what the reporter's 429 is attributed to. + +Precedent for pinning a client fingerprint already exists here — Anthropic +(`src/adapters/anthropic.ts:936`, asserted at `tests/client-fingerprint.test.ts:120`), xAI +(`src/providers/xai-transport.ts:7`, `tests/xai-transport.test.ts:55`), Command Code with a +configurable fallback (`src/adapters/command-code.ts:482`). And the value stays +operator-overridable through the existing case-insensitive provider header override at +`src/server/management/provider-routes.ts:288`. + +Decision: **ABSORB the revised shape**, not the original. + +```ts +staticHeaders: { + "User-Agent": "opencode", + "x-opencode-client": "desktop", +} +``` + +Deliberately NOT copied from omniroute: `x-opencode-project`, `x-opencode-request`, +`x-opencode-session`. None is needed to fix the demonstrated failure, and adding a +conversation-derived session identifier is a privacy-relevant change that needs its own +evidence rather than a sibling project's precedent. + +## wp17-wp19 — the three that need new code + +Recorded here as each is decided; each is its own PABCD cycle. From 5e4ec149807963e6777330b2c355e64eddac8ab2 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 08:37:48 +0900 Subject: [PATCH 54/88] fix(providers): identify opencode-free with the client User-Agent it claims opencode-free sent no User-Agent, so Zen saw the bare runtime default (Bun/x.y.z) and rate-limited it harder than a client that identifies itself. Adds "User-Agent: opencode" alongside the existing x-opencode-client: desktop marker. The value is deliberately unversioned. OmniRoute, an independent open-source broker against the same Zen upstream, defaults to exactly this pair and reached it by retreating from its own earlier opencode-cli/1.0.0 pin: a pinned version is a claim about an install we do not have, and it goes stale on the vendor's schedule. The registry edit alone would have shipped to nobody. staticHeaders is documented as merged into every upstream request, but it was only ever copied at seed time, so any config written before a header existed -- or carrying any header of its own -- never received it. routedProviderConfig and buildModelsRequest now fill registry static headers beneath user headers, matched case-insensitively so an override replaces rather than duplicates: spreading "User-Agent" over a user's "user-agent" leaves both keys, which Headers serializes as one comma-joined value. Model discovery gets the same treatment because a provider identified as opencode when it completes but anonymous when it lists its own models reads as two different clients to a rate limiter. --- src/oauth/index.ts | 13 +++- src/providers/registry.ts | 40 ++++++++++++ src/router.ts | 7 ++ tests/management-provider-validation.test.ts | 13 +++- tests/opencode-free-provider.test.ts | 67 +++++++++++++++++++- 5 files changed, 134 insertions(+), 6 deletions(-) diff --git a/src/oauth/index.ts b/src/oauth/index.ts index 0162492f9a..fda4a3ec67 100644 --- a/src/oauth/index.ts +++ b/src/oauth/index.ts @@ -17,7 +17,7 @@ import { loginCommandCode, refreshCommandCodeToken } from "./command-code"; import { ANTIGRAVITY_REQUEST_UA } from "../adapters/google-antigravity-wire"; import { deriveOAuthDefaultModel, deriveOAuthProviderConfig } from "../providers/derive"; import { apiKeyPoolEntryId, sanitizeApiKeyValue } from "../providers/api-keys"; -import { effectiveGoogleMode, getProviderRegistryEntry, providerMatchesRegistryTransport } from "../providers/registry"; +import { effectiveGoogleMode, getProviderRegistryEntry, mergeRegistryStaticHeaders, providerMatchesRegistryTransport } from "../providers/registry"; import { resolveProviderModelDiscoveryUrl } from "../providers/model-discovery"; import { resolveProviderTransport } from "../providers/xai-transport"; import { detectClaudeCodeToken, detectGrokCliToken, hasComparableGrokIdentity, isSameGrokIdentity, shouldAdoptGrokGeneration } from "./local-token-detect"; @@ -828,7 +828,16 @@ export function buildModelsRequest( undefined, copilotApiBaseUrl, ); - const headers: Record = { ...(effectiveProvider.headers ?? {}) }; + // Model discovery is an upstream request like any other, so it carries the same registry + // static headers the inference path does. Without this a provider is identified correctly + // when it answers a completion but anonymously when it lists its own models, which is the + // kind of split fingerprint an upstream rate limiter reads as two different clients. + const registryStaticHeaders = providerMatchesRegistryTransport(providerName, effectiveProvider) + ? getProviderRegistryEntry(providerName)?.staticHeaders + : undefined; + const headers: Record = { + ...(mergeRegistryStaticHeaders(registryStaticHeaders, effectiveProvider.headers) ?? {}), + }; const discoveryUrl = (defaultUrl: string): string => resolveProviderModelDiscoveryUrl( providerName, prov, diff --git a/src/providers/registry.ts b/src/providers/registry.ts index 53922e75ad..de20cfa969 100644 --- a/src/providers/registry.ts +++ b/src/providers/registry.ts @@ -2435,6 +2435,16 @@ export const PROVIDER_REGISTRY: readonly ProviderRegistryEntry[] = [ note: "No key needed — public desktop tier. OpenCode currently advertises about 200 Big Pickle/free-model requests per 5 hours. The same Zen gateway can also short-window rate-limit free models at roughly 15-20 requests/minute, and may return generic 429s without Retry-After (opencodex synthesizes backoff only when that header is omitted). Free models are discovered live from Zen. Data use: per OpenCode's Zen docs (https://opencode.ai/docs/zen/), prompts sent to free models may be retained and used for training/improvement — do not send confidential material through this provider.", dashboardUrl: "https://opencode.ai", staticHeaders: { + // Zen answers a bare runtime User-Agent (Bun/x.y.z) more aggressively than a client + // that identifies itself, which is what the 429 in #2067 traced to. The value is + // deliberately unversioned: a pinned "opencode-cli/" is a claim about an + // install we do not have and goes stale on the vendor's schedule, not ours. + // Corroboration, not authority: OmniRoute — an independent open-source broker against + // the same Zen upstream — defaults to exactly this pair (userAgent "opencode", client + // "desktop") in open-sse/executors/opencode.ts, and got there by RETREATING from its + // own earlier "opencode-cli/1.0.0" pin. An operator can still override either value + // through the provider headers API; user headers win case-insensitively at route time. + "User-Agent": "opencode", "x-opencode-client": "desktop", }, modelReasoningEfforts: Object.fromEntries(OPENCODE_FREE_DEEPSEEK_MODELS.map(id => [id, deepseekThinkingEffortsFor(id)])), @@ -2591,6 +2601,36 @@ export function getProviderRegistryEntry(id: string): ProviderRegistryEntry | un return PROVIDER_REGISTRY.find(entry => entry.id === id); } +/** + * Merge a registry row's `staticHeaders` beneath a provider's own headers. + * + * The field is documented as "merged into every upstream request for this provider", but that + * was only ever true for a freshly seeded config: `providerConfigSeed` copies the block once + * (`derive.ts`), `enrichProviderFromCatalog` fills it only when the whole block is absent, and + * nothing merged it at request time. So an install that predates a header — or that saved any + * header of its own — never received the new one, which is exactly what #2067 would have + * shipped for every existing opencode-free user. + * + * The comparison is case-insensitive on purpose. HTTP header names are case-insensitive, but a + * plain object spread is not: merging a registry `User-Agent` over a user's `user-agent` + * produces two entries that `Headers` serializes as one comma-joined value + * ("opencode, custom-agent"), which is a corrupted request rather than an override. The user's + * spelling and value both win; the registry only fills names the user has not spoken for. + */ +export function mergeRegistryStaticHeaders( + staticHeaders: Record | undefined, + userHeaders: Record | undefined, +): Record | undefined { + if (!staticHeaders) return userHeaders; + if (!userHeaders) return { ...staticHeaders }; + const claimed = new Set(Object.keys(userHeaders).map(name => name.toLowerCase())); + const merged: Record = { ...userHeaders }; + for (const [name, value] of Object.entries(staticHeaders)) { + if (!claimed.has(name.toLowerCase())) merged[name] = value; + } + return merged; +} + /** Whether this registry row's per-model service-tier evidence applies to one configured target. */ export function registryModelServiceTierCapabilityApplies( entry: Pick, diff --git a/src/router.ts b/src/router.ts index 297795180e..d4839e24e0 100644 --- a/src/router.ts +++ b/src/router.ts @@ -14,6 +14,7 @@ import { assertProviderDestinationAllowed } from "./lib/destination-policy"; import { redactSecretString, redactUrlForLog } from "./lib/redact"; import { PROVIDER_REGISTRY, + mergeRegistryStaticHeaders, providerCodexAccountMode, registryModelServiceTierCapabilityApplies, } from "./providers/registry"; @@ -296,6 +297,11 @@ export function routedProviderConfig(providerName: string, provider: OcxProvider ? mergePositiveNumberCaps(registryEntry.modelContextWindows, provider.modelContextWindows) : mergeRecordFill(registryEntry.modelContextWindows, provider.modelContextWindows); const modelInputModalities = mergeRecordFill(registryEntry.modelInputModalities, provider.modelInputModalities); + // Registry static headers are documented as applying to every upstream request, so they are + // filled at resolve time rather than only at seed time: a config written before a header + // existed, or one carrying any header of its own, would otherwise never receive it. User + // headers win, matched case-insensitively so an override replaces rather than duplicates. + const headers = mergeRegistryStaticHeaders(registryEntry.staticHeaders, provider.headers); const modelMaxInputTokens = providerName === OPENAI_API_PROVIDER_ID ? mergePositiveNumberCaps(registryEntry.modelMaxInputTokens, provider.modelMaxInputTokens) : mergeRecordFill(registryEntry.modelMaxInputTokens, provider.modelMaxInputTokens); @@ -372,6 +378,7 @@ export function routedProviderConfig(providerName: string, provider: OcxProvider authMode: canonicalAuthMode, apiKey: resolvedApiKey, ...(staticModelCatalog ? { liveModels: false } : {}), + ...(headers ? { headers } : {}), // Backfill the Google wire mode + Vertex project/location from the registry when the user // config omits them, so a minimal `google-vertex`/`google-antigravity` entry still routes // through the correct branch (CCA/Vertex) instead of falling back to AI Studio. diff --git a/tests/management-provider-validation.test.ts b/tests/management-provider-validation.test.ts index fd79c750e9..600c040f41 100644 --- a/tests/management-provider-validation.test.ts +++ b/tests/management-provider-validation.test.ts @@ -2888,11 +2888,18 @@ describe("provider management validation", () => { }; // Clearing user-managed headers must not delete the registry-owned static - // metadata (opencode-free's x-opencode-client marker) the transport relies on. + // metadata (opencode-free's User-Agent and x-opencode-client markers) the transport + // relies on. expect((await patch("opencode-free", { headers: null }))?.status).toBe(200); - expect(liveConfig.providers["opencode-free"].headers).toEqual({ "x-opencode-client": "desktop" }); + expect(liveConfig.providers["opencode-free"].headers).toEqual({ + "User-Agent": "opencode", + "x-opencode-client": "desktop", + }); const saved = JSON.parse(readFileSync(join(TEST_DIR, "config.json"), "utf8")) as OcxConfig; - expect(saved.providers["opencode-free"]?.headers).toEqual({ "x-opencode-client": "desktop" }); + expect(saved.providers["opencode-free"]?.headers).toEqual({ + "User-Agent": "opencode", + "x-opencode-client": "desktop", + }); }); test("concurrent provider PATCHes merge different headers", async () => { if (existsSync(TEST_DIR)) rmSync(TEST_DIR, { recursive: true }); diff --git a/tests/opencode-free-provider.test.ts b/tests/opencode-free-provider.test.ts index 097fd98ef9..0db4aafb3e 100644 --- a/tests/opencode-free-provider.test.ts +++ b/tests/opencode-free-provider.test.ts @@ -2,6 +2,8 @@ import { describe, expect, test } from "bun:test"; import { PROVIDER_REGISTRY } from "../src/providers/registry"; import { providerConfigSeed, deriveKeyLoginMap, deriveFeaturedProviderIds } from "../src/providers/derive"; import { createOpenAIChatAdapter } from "../src/adapters/openai-chat"; +import { routedProviderConfig } from "../src/router"; +import { buildModelsRequest } from "../src/oauth"; import type { OcxParsedRequest, OcxProviderConfig } from "../src/types"; function minimalRequest(model = "kimi-k2.7-code"): OcxParsedRequest { @@ -27,14 +29,16 @@ describe("opencode-free provider", () => { expect(entry?.models).toBeUndefined(); }); - test("static headers include only the public client marker", () => { + test("static headers include only the public client markers", () => { expect(entry?.staticHeaders?.["Authorization"]).toBeUndefined(); + expect(entry?.staticHeaders?.["User-Agent"]).toBe("opencode"); expect(entry?.staticHeaders?.["x-opencode-client"]).toBe("desktop"); }); test("providerConfigSeed propagates static headers", () => { const seed = providerConfigSeed(entry!); expect(seed.headers?.["Authorization"]).toBeUndefined(); + expect(seed.headers?.["User-Agent"]).toBe("opencode"); expect(seed.headers?.["x-opencode-client"]).toBe("desktop"); expect(seed.keyOptional).toBe(true); expect(seed.liveModels).toBe(true); @@ -55,6 +59,7 @@ describe("opencode-free provider", () => { const req = adapter.buildRequest(minimalRequest()); const headers = req.headers as Record; expect(headers["Authorization"]).toBeUndefined(); + expect(headers["User-Agent"]).toBe("opencode"); expect(headers["x-opencode-client"]).toBe("desktop"); expect(req.url).toBe("https://opencode.ai/zen/v1/chat/completions"); }); @@ -84,6 +89,66 @@ describe("opencode-free provider", () => { expect(Object.keys(headers)).toContain("Authorization"); }); + // A seeded config is the easy case. The one that actually reaches users is a config written + // BEFORE a static header existed: it is on disk with the old header set (or with none at all, + // because the management API strips a block that exactly matches the registry), and nothing + // rewrites it. If the header only arrives at seed time, every existing install stays on the + // old fingerprint forever — which is what the original #2067 patch would have shipped. + describe("existing installs receive newly added static headers", () => { + const persisted = (headers?: Record): OcxProviderConfig => ({ + adapter: "openai-chat", + baseUrl: "https://opencode.ai/zen/v1", + keyOptional: true, + ...(headers ? { headers } : {}), + }); + + test("a config saved with no header block gains the full registry set", () => { + const routed = routedProviderConfig("opencode-free", persisted()); + expect(routed.headers?.["User-Agent"]).toBe("opencode"); + expect(routed.headers?.["x-opencode-client"]).toBe("desktop"); + }); + + test("a config saved with only the older marker gains the new one", () => { + const routed = routedProviderConfig("opencode-free", persisted({ "x-opencode-client": "desktop" })); + expect(routed.headers?.["User-Agent"]).toBe("opencode"); + expect(routed.headers?.["x-opencode-client"]).toBe("desktop"); + }); + + test("the merged headers reach the wire, not just the resolved config", () => { + const routed = routedProviderConfig("opencode-free", persisted({ "x-opencode-client": "desktop" })); + const req = createOpenAIChatAdapter(routed).buildRequest(minimalRequest()); + expect((req.headers as Record)["User-Agent"]).toBe("opencode"); + }); + + test("a user override wins and does not become a second comma-joined value", () => { + // HTTP header names are case-insensitive but object keys are not: a naive spread would + // leave both "user-agent" and "User-Agent", which `Headers` serializes as + // "custom-agent, opencode" — a corrupted request rather than an override. + const routed = routedProviderConfig("opencode-free", persisted({ "user-agent": "custom-agent" })); + const uaKeys = Object.keys(routed.headers ?? {}).filter(k => k.toLowerCase() === "user-agent"); + expect(uaKeys).toEqual(["user-agent"]); + expect(routed.headers?.["user-agent"]).toBe("custom-agent"); + expect(new Headers(routed.headers as Record).get("user-agent")).toBe("custom-agent"); + // Names the user did not claim are still filled. + expect(routed.headers?.["x-opencode-client"]).toBe("desktop"); + }); + + test("model discovery carries the same fingerprint as inference", () => { + // A provider identified as `opencode` when it completes but anonymous when it lists its + // own models reads as two different clients to an upstream rate limiter. + const req = buildModelsRequest(persisted({ "x-opencode-client": "desktop" }), undefined, "opencode-free"); + expect(req.headers["User-Agent"]).toBe("opencode"); + expect(req.headers["x-opencode-client"]).toBe("desktop"); + }); + + test("model discovery honors a user User-Agent override", () => { + const req = buildModelsRequest(persisted({ "user-agent": "custom-agent" }), undefined, "opencode-free"); + const uaKeys = Object.keys(req.headers).filter(k => k.toLowerCase() === "user-agent"); + expect(uaKeys).toEqual(["user-agent"]); + expect(req.headers["user-agent"]).toBe("custom-agent"); + }); + }); + test("provider note mentions no key needed", () => { expect(entry?.note?.toLowerCase()).toContain("no key needed"); expect(entry?.note?.toLowerCase()).toContain("200"); From 6ef9c0883d6e791807ca0ceb1afb63346e345d9e Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 09:04:51 +0900 Subject: [PATCH 55/88] docs(devlog): record wp16 and the staticHeaders delivery bug it uncovered --- .../080_residual_dispositions.md | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/080_residual_dispositions.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/080_residual_dispositions.md index e47d8aa35b..460885e19f 100644 --- a/devlog/_plan/260820_bug_pr_backlog_consolidation/080_residual_dispositions.md +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/080_residual_dispositions.md @@ -161,6 +161,56 @@ Deliberately NOT copied from omniroute: `x-opencode-project`, `x-opencode-reques conversation-derived session identifier is a privacy-relevant change that needs its own evidence rather than a sibling project's precedent. +### wp16 outcome — and the bug the absorb uncovered + +**PR #2160**, branch `codex/absorb-opencode-free-static-headers`, base `dev`. #2067 closed +with attribution (`issuecomment-5349492578`). + +The audit is the interesting part. The plan as written — add the header to the registry row — +passed my own reading and FAILED the reviewer, correctly. `staticHeaders` is documented at +`registry.ts:149` as "merged into every upstream request for this provider", and that was +false. It was copied at seed time only: `providerConfigSeed` writes the block once, +`enrichProviderFromCatalog` fills it only when the whole block is absent, and nothing merged +it at request time. `rg -n 'headers' src/router.ts` returned zero hits. + +Reproduced directly before accepting the finding: + +| persisted config | `routedProviderConfig("opencode-free", ...).headers` | +|---|---| +| no headers block | `undefined` | +| `{x-opencode-client: desktop}` | unchanged — no UA | +| `{user-agent: custom-agent}` | unchanged — no client marker | + +So the contributor's one-line registry patch would have shipped a header that **no existing +install ever receives**. The management API strips a persisted block that exactly matches the +registry set, which means the most common on-disk state is "no headers at all" — and that +state gained nothing. + +Implementation, three parts: + +1. `mergeRegistryStaticHeaders(staticHeaders, userHeaders)` in `registry.ts` — registry values + fill only names the user has not claimed, compared **case-insensitively**. That last word is + load-bearing: HTTP header names are case-insensitive but object keys are not, so spreading a + registry `User-Agent` over a user's `user-agent` leaves both keys and `Headers` serializes + them as `"custom-agent, opencode"` — a corrupted request wearing the costume of an override. +2. `routedProviderConfig` (`router.ts`) merges at resolve time. +3. `buildModelsRequest` (`oauth/index.ts`) does the same, because a provider identified as + `opencode` when it completes but anonymous when it lists its own models reads as two + different clients to a rate limiter. + +Residual, stated rather than skipped: `validateApiKey` (`key-providers.ts:102`) still sends +only `Authorization`. It is an auth probe by design; widening an auth-path request shape is a +separate change with its own review burden. + +Evidence: 6 new regressions; reverting only `router.ts` + `oauth/index.ts` while keeping the +registry header fails exactly 5 of them (13 pass / 5 fail), which is what makes them delivery +tests rather than restatements of the registry constant. Full suite 13519 pass / 10 skip / +0 fail across 856 files; typecheck and privacy scan clean. + +One existing expectation moved: `tests/management-provider-validation.test.ts` "provider PATCH +clear keeps registry static headers" now asserts the two-header set. That is the same edit +#2067 made, and it is the correct one — the test pins the registry-owned set, which grew. + ## wp17-wp19 — the three that need new code Recorded here as each is decided; each is its own PABCD cycle. From 06cdbc109a631203618a2d1bcf2f395f121af8fa Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 09:24:46 +0900 Subject: [PATCH 56/88] fix(anthropic): frame the opening turn so AgentRouter stops blocking non-English AgentRouter answers 400 content-blocked when the first user message is not in English (#2074) while the identical English request returns 200. The gateway inspects the opening user content, so an Anthropic system string never reaches the filter -- the framing has to sit in that turn. Two corrections on top of @yzxcj797's #2082. The host test was hostname.includes("agentrouter"), which also matches notagentrouter.example and agentrouter.org.attacker.example. A prompt mutation keyed on a provider's identity has to be keyed on that identity exactly, so this matches agentrouter.org or a real subdomain of it. The original spliced the marker into the user's own string. That edits what the user wrote: logs, retries, and any upstream echo then show a sentence the user never typed as if they had. The framing is now its own leading text block, so the original text survives byte-for-byte. Idempotence is keyed on the leading block being exactly the marker rather than a substring test, so a user who quotes the marker later in their prompt does not suppress their own framing. --- src/adapters/anthropic.ts | 59 ++++++++ ...ropic-agentrouter-language-framing.test.ts | 126 ++++++++++++++++++ 2 files changed, 185 insertions(+) create mode 100644 tests/anthropic-agentrouter-language-framing.test.ts diff --git a/src/adapters/anthropic.ts b/src/adapters/anthropic.ts index e012a78198..626a45f286 100644 --- a/src/adapters/anthropic.ts +++ b/src/adapters/anthropic.ts @@ -594,6 +594,63 @@ function orphanToolResultText(msg: OcxToolResultMessage): string { return `[tool_result without adjacent tool_use: ${label}]\n${content}`; } +/** + * AgentRouter answers 400 `content-blocked` when the first user message is not in English + * (#2074), while the same request in English returns 200. The gateway is inspecting the opening + * user content, so an Anthropic `system` string cannot reach it — the framing has to sit in the + * first user turn. + */ +const AGENTROUTER_LANGUAGE_PREAMBLE = + "[Instruction: Process the user request below and respond in the appropriate language.]"; + +/** + * Exact host match, not a substring. + * + * A `hostname.includes("agentrouter")` test also matches `notagentrouter.example` and + * `agentrouter.org.attacker.example`, which would let an unrelated destination silently + * receive an injected instruction block. A prompt mutation keyed on a provider's identity + * must be keyed on that identity exactly. + */ +function isAgentRouterEndpoint(baseUrl: string): boolean { + try { + const { hostname } = new URL(baseUrl); + return hostname === "agentrouter.org" || hostname.endsWith(".agentrouter.org"); + } catch { + return false; + } +} + +/** + * Prepend the framing as its OWN text block instead of splicing it into the user's string. + * + * The distinction matters: rewriting `content` to `${marker}\n\n${original}` edits what the + * user wrote, and every downstream consumer — logs, retries, an upstream that echoes the turn — + * then sees a sentence the user never typed as if they had. A separate leading block carries the + * same signal to the filter while the original text survives byte-for-byte. + * + * Only the first user turn is framed, because only the first is what the gateway rejects. + */ +function applyAgentRouterLanguageFraming(messages: unknown[]): void { + const firstUser = messages.find( + (m): m is { role: string; content: unknown } => + typeof m === "object" && m !== null && (m as { role?: unknown }).role === "user", + ); + if (!firstUser) return; + const preamble = { type: "text", text: AGENTROUTER_LANGUAGE_PREAMBLE }; + if (typeof firstUser.content === "string") { + firstUser.content = firstUser.content === "" + ? [preamble] + : [preamble, { type: "text", text: firstUser.content }]; + return; + } + if (!Array.isArray(firstUser.content)) return; + // Idempotence is keyed on the LEADING block being exactly the marker. A substring test would + // let a user who quotes the marker later in their own prompt suppress the framing entirely. + const [head] = firstUser.content as { type?: unknown; text?: unknown }[]; + if (head?.type === "text" && head.text === AGENTROUTER_LANGUAGE_PREAMBLE) return; + (firstUser.content as unknown[]).unshift(preamble); +} + function messagesToAnthropicFormat( parsed: OcxParsedRequest, toolNames: { toWire: (name: string) => string }, @@ -833,6 +890,8 @@ export function createAnthropicAdapter(provider: OcxProviderConfig, cacheRetenti } const { system, messages } = messagesToAnthropicFormat(parsed, toolNames); + // Before image normalization, so the framing block is present for every downstream pass. + if (isAgentRouterEndpoint(provider.baseUrl)) applyAgentRouterLanguageFraming(messages); // Primary image layer: resize/re-encode to fit Anthropic limits without dropping // (anthropic-image-normalize.ts); the guard below remains the deterministic backstop. // imageTierBias > 0 = upstream-413 tightened retry (030): start every image one tier lower. diff --git a/tests/anthropic-agentrouter-language-framing.test.ts b/tests/anthropic-agentrouter-language-framing.test.ts new file mode 100644 index 0000000000..09782a6835 --- /dev/null +++ b/tests/anthropic-agentrouter-language-framing.test.ts @@ -0,0 +1,126 @@ +import { describe, expect, test } from "bun:test"; +import { createAnthropicAdapter as createAnthropicAdapterProduction } from "../src/adapters/anthropic"; +import { withTestTranslatorBudget } from "./helpers/translator-budget"; +import type { OcxMessage, OcxParsedRequest, OcxProviderConfig } from "../src/types"; + +const createAnthropicAdapter = (...args: Parameters) => + withTestTranslatorBudget(createAnthropicAdapterProduction(...args)); + +const PREAMBLE = "[Instruction: Process the user request below and respond in the appropriate language.]"; +const PORTUGUESE = "responda apenas: OK"; + +interface TextBlock { type: string; text?: string } +interface WireMessage { role: string; content: string | TextBlock[] } +interface WireBody { messages: WireMessage[] } + +function providerAt(baseUrl: string): OcxProviderConfig { + return { adapter: "anthropic", baseUrl, apiKey: "key", authMode: "key" }; +} + +function requestWith(messages: OcxMessage[]): OcxParsedRequest { + return { + modelId: "claude-opus-4-6", + stream: false, + context: { messages, tools: [] }, + options: {}, + }; +} + +async function bodyFor(baseUrl: string, messages: OcxMessage[]): Promise { + const req = await createAnthropicAdapter(providerAt(baseUrl)).buildRequest(requestWith(messages)); + return JSON.parse(req.body as string) as WireBody; +} + +/** + * The adapter also stamps `cache_control` onto the trailing block, which is orthogonal to this + * fix. Comparing the text sequence keeps these assertions about the framing and stops them from + * going red the next time the cache policy is tuned. + */ +function texts(message: WireMessage | undefined): (string | undefined)[] { + if (!message) throw new Error("expected a message at that index"); + if (typeof message.content === "string") return [message.content]; + return message.content.map(block => block.text); +} + +// AgentRouter answers 400 content-blocked when the first user message is not in English +// (#2074) while the identical English request returns 200. The gateway reads the opening user +// content, so the framing has to live in that turn -- an Anthropic `system` string never +// reaches the filter. Absorbed from #2082 by @yzxcj797. +describe("AgentRouter language framing", () => { + test("frames the first user turn without touching the user's own text", async () => { + const body = await bodyFor("https://agentrouter.org/v1", [{ role: "user", content: PORTUGUESE }]); + // The framing is its OWN block. Splicing it into the user's string would make every + // downstream reader -- logs, retries, an upstream that echoes the turn -- attribute a + // sentence to the user that they never typed. + expect(texts(body.messages[0])).toEqual([PREAMBLE, PORTUGUESE]); + }); + + test("an existing block array keeps every original block, in order, after the preamble", async () => { + const body = await bodyFor("https://agentrouter.org/v1", [ + { role: "user", content: [{ type: "text", text: "primeiro" }, { type: "text", text: "segundo" }] }, + ]); + expect(texts(body.messages[0])).toEqual([PREAMBLE, "primeiro", "segundo"]); + }); + + test("only the first user turn is framed", async () => { + const body = await bodyFor("https://agentrouter.org/v1", [ + { role: "user", content: PORTUGUESE }, + { role: "assistant", content: "OK" }, + { role: "user", content: "e agora?" }, + ]); + expect(texts(body.messages[0])).toEqual([PREAMBLE, PORTUGUESE]); + // Index-free on purpose: the adapter may coalesce adjacent turns, so the invariant is + // "exactly one preamble, on the opening turn", not "the preamble is absent at index 2". + const userTurns = body.messages.filter(m => m.role === "user"); + expect(texts(userTurns.at(-1))).toEqual(["e agora?"]); + expect(JSON.stringify(body.messages).split(PREAMBLE)).toHaveLength(2); + }); + + test("direct Anthropic is untouched", async () => { + const body = await bodyFor("https://api.anthropic.com/v1", [{ role: "user", content: PORTUGUESE }]); + expect(texts(body.messages[0])).toEqual([PORTUGUESE]); + expect(JSON.stringify(body)).not.toContain(PREAMBLE); + }); + + // A hostname.includes("agentrouter") test would match both of these, quietly injecting an + // instruction block into a destination that never asked for one. + test.each([ + "https://notagentrouter.example/v1", + "https://agentrouter.org.attacker.example/v1", + ])("a lookalike host is not treated as AgentRouter: %s", async baseUrl => { + const body = await bodyFor(baseUrl, [{ role: "user", content: PORTUGUESE }]); + expect(texts(body.messages[0])).toEqual([PORTUGUESE]); + expect(JSON.stringify(body)).not.toContain(PREAMBLE); + }); + + test("a real AgentRouter subdomain is still AgentRouter", async () => { + const body = await bodyFor("https://api.agentrouter.org/v1", [{ role: "user", content: PORTUGUESE }]); + expect(texts(body.messages[0])).toEqual([PREAMBLE, PORTUGUESE]); + }); + + test("building twice yields exactly one preamble each time", async () => { + const adapter = createAnthropicAdapter(providerAt("https://agentrouter.org/v1")); + for (const attempt of [0, 1]) { + const req = await adapter.buildRequest(requestWith([{ role: "user", content: PORTUGUESE }])); + const body = JSON.parse(req.body as string) as WireBody; + expect(texts(body.messages[0]).filter(t => t === PREAMBLE)).toHaveLength(1); + expect(attempt).toBeLessThan(2); + } + }); + + // Idempotence keyed on a substring would let a user who quotes the marker mid-prompt + // suppress their own framing, which is the failure the workaround exists to prevent. + test("a user quoting the marker later still gets the leading preamble", async () => { + const quoted = `o servidor respondeu ${PREAMBLE} e falhou`; + const body = await bodyFor("https://agentrouter.org/v1", [{ role: "user", content: quoted }]); + expect(texts(body.messages[0])).toEqual([PREAMBLE, quoted]); + }); + + // An assistant-only request is synthesized into a "(continue)" user turn upstream of this + // code, so the framing lands on that synthetic turn rather than on nothing. Pinned because it + // is the one case where the preamble is attached to text the user did not send. + test("an assistant-only request frames the synthesized continue turn", async () => { + const body = await bodyFor("https://agentrouter.org/v1", [{ role: "assistant", content: "só isso" }]); + expect(texts(body.messages[0])).toEqual([PREAMBLE, "(continue)"]); + }); +}); From 7e7954a803aea10094a52cd61ed5e22c8c4d3350 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 09:34:36 +0900 Subject: [PATCH 57/88] docs(devlog): record wp17 and plan wp18 --- .../080_residual_dispositions.md | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/080_residual_dispositions.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/080_residual_dispositions.md index 460885e19f..3aa59cc031 100644 --- a/devlog/_plan/260820_bug_pr_backlog_consolidation/080_residual_dispositions.md +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/080_residual_dispositions.md @@ -214,3 +214,61 @@ clear keeps registry static headers" now asserts the two-header set. That is the ## wp17-wp19 — the three that need new code Recorded here as each is decided; each is its own PABCD cycle. + +### wp17 — #2082 @yzxcj797: AgentRouter language framing + +**PR #2162**, branch `codex/absorb-agentrouter-language-framing`, base `dev`. #2082 closed +(`issuecomment-5349709140`). Fixes #2074. + +The diagnosis was the contributor's and it was correct: AgentRouter answers 400 +`content-blocked` on a non-English first user message while the same request in English +returns 200, and the filter reads that turn, so an Anthropic `system` string cannot reach it. + +Two corrections. + +**Host predicate.** `hostname.includes("agentrouter")` also matches `notagentrouter.example` +and `agentrouter.org.attacker.example`. This is a prompt mutation keyed on a provider's +identity, so the key has to be that identity exactly — otherwise an unrelated destination +quietly receives an injected instruction block. Now `agentrouter.org` or a real subdomain. + +**Where the marker goes.** The original spliced it into the user's string: +`firstUser.content = \`\${MARKER}\\n\\n\${firstUser.content}\``. That edits what the user +wrote, and every downstream reader then attributes a sentence to them that they never typed — +the hidden user-turn mutation named in #1804. The framing is now its own leading text block. +It still adds content to the user turn, which is unavoidable against a filter that reads the +first user message, but additive-and-visible is a different risk class than a silent rewrite. + +Idempotence is keyed on the LEADING block being exactly the marker, not a substring test: a +user who quotes the marker mid-prompt must not suppress their own framing. + +Evidence: 10 regressions; reverting only the adapter fails 7. The 3 that stay green are the +lookalike-host and direct-Anthropic cases — green on unpatched `dev` precisely because `dev` +frames nobody, which is what makes them guards against the substring predicate rather than +restatements of it. Full suite 13529 pass / 10 skip / 0 fail; typecheck and privacy clean. + +`CONFLICTING` was an inherited `package.json` bump alone; the Anthropic hunks merge cleanly. +No version change in the replacement. + +### wp18 — #2027 @yzxcj797: OpenCode Go quota, planned + +The investigation moved the answer here too. The real issue is #1924: sibling rows +(`opencode-go-2` … `-5`) show no quota in the dashboard and no rows in +`ocx provider quota --refresh --json`, because dispatch gates on the literal provider NAME at +`src/providers/quota.ts:2087`. + +The contributor's fix swaps that for a base-URL comparison. Closer, but it does not check the +adapter, so a row pointed at the canonical URL with a different adapter would be probed. + +The repository already has the exact predicate: `registryEntryForProviderDestination` +(`registry.ts:2678`) identifies a renamed fixed key provider by normalized endpoint + adapter ++ auth mode, and is already the convention for renamed rows +(`opencode-zen-rate-limit.ts:28-43`, `derive.ts:398-425`). + +Rejected alternative, recorded: `providerMatchesRegistryTransport("opencode-go", provider)` +would need `preserveCustomDestination: true` on the registry entry, which also changes ROUTING +for a same-named custom row (`router.ts:269-274` vs `:320-336`). That may be worth doing, but +not as a side effect of a quota fix. + +The defensive canonical-URL check inside `fetchOpenCodeGoQuota` (`quota.ts:485-494`) stays: it +is what stops an API key being sent to a non-canonical host, and it should not depend on the +dispatch predicate being correct. From 6a4efb8c1d685dded2a41508aec6e6c5ffa473f3 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 11:26:14 +0900 Subject: [PATCH 58/88] test(anthropic): pin the AgentRouter framing across every user-content shape Review on #2162 asked for the three branches that are the actual safety boundary here: this code writes into the outbound first user turn, so "does it ever duplicate, drop, or reorder what the caller sent" has to be pinned per content shape rather than only for a plain string. Adds: an already-framed turn stays single and ordered; image-only content keeps its image block behind the preamble rather than losing or reordering it; assistant-only block content keeps its tail and is followed by the synthesized [PREAMBLE, "(continue)"] user turn. All three pass against the existing implementation, which is the point -- they are guards on a prompt mutation, not a fix. --- ...ropic-agentrouter-language-framing.test.ts | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/tests/anthropic-agentrouter-language-framing.test.ts b/tests/anthropic-agentrouter-language-framing.test.ts index 09782a6835..fbf2962e8c 100644 --- a/tests/anthropic-agentrouter-language-framing.test.ts +++ b/tests/anthropic-agentrouter-language-framing.test.ts @@ -123,4 +123,39 @@ describe("AgentRouter language framing", () => { const body = await bodyFor("https://agentrouter.org/v1", [{ role: "assistant", content: "só isso" }]); expect(texts(body.messages[0])).toEqual([PREAMBLE, "(continue)"]); }); + + // The three branches below are the safety boundary for a provider-specific prompt mutation: + // this code writes into the outbound user turn, so "does it ever duplicate, drop, or reorder + // what the caller sent" has to be pinned per content shape, not just for the plain string. + test("an already-framed first turn stays single and in order", async () => { + const body = await bodyFor("https://agentrouter.org/v1", [ + { role: "user", content: [{ type: "text", text: PREAMBLE }, { type: "text", text: PORTUGUESE }] }, + ]); + expect(texts(body.messages[0])).toEqual([PREAMBLE, PORTUGUESE]); + }); + + test("image-only user content keeps its image block, after the preamble", async () => { + // A real 1x1 PNG: the normalizer replaces undecodable data with a text placeholder, which + // would make this assert the wrong thing. + const onePixelPng = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="; + const body = await bodyFor("https://agentrouter.org/v1", [ + { role: "user", content: [{ type: "image", imageUrl: onePixelPng }] }, + ]); + const blocks = body.messages[0]?.content; + if (typeof blocks === "string") throw new Error("expected content blocks"); + expect(blocks).toHaveLength(2); + expect(blocks[0]).toMatchObject({ type: "text", text: PREAMBLE }); + // The image must survive as an image — not dropped, and not reordered ahead of the preamble. + expect(blocks[1]).toMatchObject({ type: "image" }); + }); + + test("assistant-only block content keeps its tail, then the synthesized user turn", async () => { + const body = await bodyFor("https://agentrouter.org/v1", [ + { role: "assistant", content: [{ type: "text", text: "primeira" }, { type: "text", text: "segunda" }] }, + ]); + const assistant = body.messages.filter(m => m.role === "assistant"); + expect(texts(assistant.at(-1))).toEqual(["primeira", "segunda"]); + const user = body.messages.filter(m => m.role === "user"); + expect(texts(user.at(-1))).toEqual([PREAMBLE, "(continue)"]); + }); }); From 5445ce3e626849855521e5ff54571a1c3babc7e2 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 09:44:17 +0900 Subject: [PATCH 59/88] fix(quota): identify OpenCode Go by where it routes, not what it is named A multi-account setup points several provider rows at the same OpenCode Go endpoint under names the registry has never heard of -- opencode-go-2 through -5. Quota dispatch gated on the literal name "opencode-go", so those rows had no dashboard quota panel and no report in `ocx provider quota --refresh --json` even though each one holds a working key for the same upstream (#1924). Identity is now answered by registryEntryForProviderDestination, the predicate this repository already uses for renamed fixed-key rows: it matches on normalized endpoint plus adapter plus key auth. A bare URL comparison would have been enough for the reported symptom but would also probe a row that points at that host through a different adapter, which speaks a different protocol and is not the provider whose quota shape we parse. The defensive canonical-URL check inside fetchOpenCodeGoQuota stays. Whether an API key may be sent to a host must not depend on the dispatch gate above it being correct. Absorbed from #2027 by @yzxcj797. --- src/providers/quota.ts | 11 +++++-- tests/opencode-go-quota.test.ts | 57 +++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 2 deletions(-) diff --git a/src/providers/quota.ts b/src/providers/quota.ts index bb3bab2837..24b06ef7a9 100644 --- a/src/providers/quota.ts +++ b/src/providers/quota.ts @@ -13,7 +13,7 @@ import { getAccountCredential, getAccountSet, getCredential } from "../oauth/sto import { antigravityUserAgent } from "../adapters/client-fingerprint"; import { apiKeyPoolEntryId } from "./api-keys"; import { XAI_GROK_CLIENT_VERSION, XAI_GROK_COMPATIBILITY } from "./xai-transport"; -import { getProviderRegistryEntry, providerCodexAccountMode } from "./registry"; +import { getProviderRegistryEntry, providerCodexAccountMode, registryEntryForProviderDestination } from "./registry"; import type { OcxConfig, OcxProviderConfig } from "../types"; import { isCanonicalOpenAiForwardProvider, OPENAI_CODEX_PROVIDER_ID } from "./openai-tiers"; import { @@ -2084,7 +2084,14 @@ async function maybeFetchProviderQuota( && isCanonicalCommandCodeBaseUrl(provider.baseUrl)) { return fetchCommandCodeQuota(name, provider); } - if ((provider.authMode ?? "key") === "key" && name === "opencode-go") { + // Identify OpenCode Go by where it routes, not by what the row is called. Multi-account + // setups keep the same destination under names like `opencode-go-2` (#1924), and those rows + // silently had no quota panel and no `ocx provider quota --json` report while the literal + // name was the gate. `registryEntryForProviderDestination` is the existing predicate for + // exactly this question: normalized endpoint + adapter + key auth, so a canonical URL behind + // a different adapter is still not OpenCode Go. The defensive URL check inside + // `fetchOpenCodeGoQuota` stays — sending a key anywhere must not depend on this gate. + if ((provider.authMode ?? "key") === "key" && registryEntryForProviderDestination(provider)?.id === "opencode-go") { return fetchOpenCodeGoQuota(name, provider); } if ((provider.authMode ?? "key") === "key" && isCanonicalA6apiBaseUrl(provider.baseUrl)) { diff --git a/tests/opencode-go-quota.test.ts b/tests/opencode-go-quota.test.ts index ece8d22b53..df2bb52525 100644 --- a/tests/opencode-go-quota.test.ts +++ b/tests/opencode-go-quota.test.ts @@ -87,4 +87,61 @@ describe("OpenCode Go provider quota", () => { expect(fetchCalls).toBe(0); expect(result.reports).toEqual([]); }); + + // #1924: a multi-account setup points several rows at the same OpenCode Go endpoint under + // names the registry has never heard of. Gating dispatch on the literal name `opencode-go` + // meant those rows had no dashboard quota panel and no `ocx provider quota --json` report, + // even though each one holds a working key for the same upstream. + test("a canonical sibling row under any name is probed and reported", async () => { + const bearers: string[] = []; + globalThis.fetch = (async (_input: RequestInfo | URL, init?: RequestInit) => { + const headers = init?.headers as Record | undefined; + if (headers?.Authorization) bearers.push(headers.Authorization); + return new Response(JSON.stringify({ + usage: { rolling: { status: "ok", percent: 12, resetsAt: "2026-08-12T20:00:00.000Z" } }, + }), { status: 200, headers: { "content-type": "application/json" } }); + }) as typeof fetch; + + const config = openCodeGoConfig(); + config.providers["opencode-go-2"] = { + adapter: "openai-chat", + authMode: "key", + baseUrl: "https://opencode.ai/zen/go/v1", + // Kept under the privacy scanner's bearer-token length floor: a longer fixture reads as + // a real credential to `privacy:scan` even inside a test. + apiKey: "sibling-secret", + }; + + const result = await fetchProviderQuotaReports(config, true); + + expect(result.reports.map(report => report.provider).sort()).toEqual(["opencode-go", "opencode-go-2"]); + expect(bearers.sort()).toEqual(["Bearer opencode-go-secret", "Bearer sibling-secret"]); + expect(JSON.stringify(result)).not.toContain("sibling-secret"); + }); + + // The distinction between "routes to the OpenCode Go endpoint" and "is the OpenCode Go + // provider": a bare URL match would probe this row, but a different adapter speaks a + // different protocol to that host and is not the provider whose quota shape we parse. + test("a canonical URL behind a different adapter is not OpenCode Go", async () => { + let fetchCalls = 0; + globalThis.fetch = (async () => { + fetchCalls += 1; + return new Response("{}", { status: 200, headers: { "content-type": "application/json" } }); + }) as typeof fetch; + + const result = await fetchProviderQuotaReports({ + defaultProvider: "not-really-go", + providers: { + "not-really-go": { + adapter: "anthropic", + authMode: "key", + baseUrl: "https://opencode.ai/zen/go/v1", + apiKey: "unrelated-secret", + }, + }, + } as OcxConfig, true); + + expect(fetchCalls).toBe(0); + expect(result.reports).toEqual([]); + }); }); From 64ba54edbe5ac90b1127f51d5890e33da183c3f0 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 09:57:10 +0900 Subject: [PATCH 60/88] fix(openai-chat): treat a non-string repeat as padding once that field is known Some OpenAI-compatible streamers repeat an already-sent id, name, or arguments as a non-string placeholder on a continuation delta rather than as null. Validation ran before the pending-call lookup, so the whole turn died with a 502 and the tool never ran -- even though the value being repeated was already held in canonical form. The lookup now happens first and tolerance is per field, keyed on that field's own provenance. Two corrections on top of @waw4303's #2155. It gated arguments acceptance on the call having a canonical NAME. A name says nothing about whether arguments was ever sent as a string, so a real argument payload could be silently dropped. PendingToolCall now carries sawArgumentsString; an empty string counts, because it proves the upstream sent the field with the right wire type. It also left a non-string repeated id unconditionally terminal even after a canonical id was stored. Ids now follow the same rule as the other two. Diagnostics are passed from the rejection site instead of rescanned. A stateless rescan stops at the first structurally odd value, so a stream carrying accepted padding on call 0 and a real defect on call 1 blamed call 0. --- src/adapters/openai-chat.ts | 141 +++++++++++++++++++--------- tests/openai-chat-hardening.test.ts | 96 +++++++++++++++++++ 2 files changed, 191 insertions(+), 46 deletions(-) diff --git a/src/adapters/openai-chat.ts b/src/adapters/openai-chat.ts index c5338d5eaa..8e59559094 100644 --- a/src/adapters/openai-chat.ts +++ b/src/adapters/openai-chat.ts @@ -308,8 +308,13 @@ function invalidToolCallsEvent( rawToolCalls: unknown, mode: "stream" | "response", usage?: OcxUsage, + diagnosticOverride?: InvalidToolCallDiagnostic, ): Extract { - const diagnostic = diagnoseInvalidToolCalls(rawToolCalls, mode); + // The streamed accumulator knows things a rescan cannot: which field on which pending call + // was actually rejected. Without the override, a stream carrying accepted padding on call 0 + // and a real defect on call 1 blames call 0, because the stateless scan stops at the first + // structurally odd value it sees. + const diagnostic = diagnosticOverride ?? diagnoseInvalidToolCalls(rawToolCalls, mode); const detail = diagnostic ? ` (${diagnostic.reason}${diagnostic.callIndex !== undefined ? `; callIndex=${diagnostic.callIndex}` : ""}; valueType=${diagnostic.valueType})` : ""; @@ -527,9 +532,13 @@ function diagnoseInvalidToolCalls( return undefined; } -function logInvalidToolCalls(mode: "stream" | "response", rawToolCalls: unknown): void { +function logInvalidToolCalls( + mode: "stream" | "response", + rawToolCalls: unknown, + diagnosticOverride?: InvalidToolCallDiagnostic, +): void { if (!isDebugEnabled()) return; - const diagnostic = diagnoseInvalidToolCalls(rawToolCalls, mode); + const diagnostic = diagnosticOverride ?? diagnoseInvalidToolCalls(rawToolCalls, mode); if (!diagnostic) return; const fieldShape = fingerprintInvalidField(invalidToolCallField(rawToolCalls, diagnostic)); debugProviderDiagnostic("openai-chat", "invalid-tool-calls", { @@ -1499,7 +1508,20 @@ export function createOpenAIChatAdapter(provider: OcxProviderConfig): ProviderAd const budgetEncoder = new TextEncoder(); let buffer = ""; let bufferBytes = 0; - interface PendingToolCall { key: string; id: string; name: string; args: string; argsBytes: number } + interface PendingToolCall { + key: string; + id: string; + name: string; + args: string; + argsBytes: number; + /** + * Whether this call has ever received `arguments` as an actual string, empty included. + * An empty string still counts: it proves the upstream sent the field with the right + * wire type, which is what a later malformed repeat of that field would be padding for. + * A canonical NAME is not evidence about the ARGUMENTS field and must not stand in. + */ + sawArgumentsString: boolean; + } const pendingToolCalls: PendingToolCall[] = []; let toolCallSeq = 0; const closeToolCalls = (): PendingToolCall[] => { @@ -1613,61 +1635,88 @@ export function createOpenAIChatAdapter(provider: OcxProviderConfig): ProviderAd logInvalidToolCalls("stream", rawToolCalls); return yield* terminateWithError(invalidToolCallsEvent(rawToolCalls, "stream", pendingUsage)); } - for (const rawToolCall of rawToolCalls) { + for (let callIndex = 0; callIndex < rawToolCalls.length; callIndex++) { + const rawToolCall: unknown = rawToolCalls[callIndex]; if (!isRecord(rawToolCall)) { - logInvalidToolCalls("stream", rawToolCalls); - return yield* terminateWithError(invalidToolCallsEvent(rawToolCalls, "stream", pendingUsage)); + const diagnostic: InvalidToolCallDiagnostic = { + reason: "tool_call_not_object", + callIndex, + valueType: rawToolCall === null ? "null" : Array.isArray(rawToolCall) ? "array" : typeof rawToolCall, + }; + logInvalidToolCalls("stream", rawToolCalls, diagnostic); + return yield* terminateWithError(invalidToolCallsEvent(rawToolCalls, "stream", pendingUsage, diagnostic)); } - const tc = rawToolCall as { - index?: number; - id?: string; - function?: { name?: string; arguments?: string }; - }; - // That cast is a TypeScript convenience, not a runtime guarantee: this is - // upstream JSON. Validate the fields before they are stored, so a non-string - // name or arguments value fails closed through the #1325 channel here rather - // than escaping later as a TypeError from string handling at flush time. - const rawFunction = (rawToolCall as { function?: unknown }).function; - if (rawFunction !== undefined && rawFunction !== null) { - if (!isRecord(rawFunction)) { - logInvalidToolCalls("stream", rawToolCalls); - return yield* terminateWithError(invalidToolCallsEvent(rawToolCalls, "stream", pendingUsage)); - } - const rawName = rawFunction.name; - const rawArguments = rawFunction.arguments; - // Some OpenAI-compatible streamers repeat already-sent fields as null on - // continuation deltas. Treat only null/undefined as absent; every other - // non-string value still fails closed before entering the accumulator. - if (isInvalidStreamStringField(rawName) || isInvalidStreamStringField(rawArguments)) { - logInvalidToolCalls("stream", rawToolCalls); - return yield* terminateWithError(invalidToolCallsEvent(rawToolCalls, "stream", pendingUsage)); - } + // This is upstream JSON, so every field is validated before it is stored: a + // malformed value must fail closed through the #1325 channel here rather than + // escaping later as a TypeError from string handling at flush time. + const rawFunction = rawToolCall.function; + if (rawFunction !== undefined && rawFunction !== null && !isRecord(rawFunction)) { + const diagnostic: InvalidToolCallDiagnostic = { + reason: "tool_call_function_not_object", + callIndex, + valueType: Array.isArray(rawFunction) ? "array" : typeof rawFunction, + }; + logInvalidToolCalls("stream", rawToolCalls, diagnostic); + return yield* terminateWithError(invalidToolCallsEvent(rawToolCalls, "stream", pendingUsage, diagnostic)); } - if (isInvalidStreamStringField(tc.id)) { - logInvalidToolCalls("stream", rawToolCalls); - return yield* terminateWithError(invalidToolCallsEvent(rawToolCalls, "stream", pendingUsage)); - } - const key = typeof tc.index === "number" - ? `i:${tc.index}` - : tc.id - ? `id:${tc.id}` + const fnRecord = isRecord(rawFunction) ? rawFunction : undefined; + const rawName = fnRecord?.name; + const rawArguments = fnRecord?.arguments; + const rawId = rawToolCall.id; + const idDelta = typeof rawId === "string" ? rawId : ""; + const rawIndex = rawToolCall.index; + + // Resolve the pending call BEFORE judging the fields. Some OpenAI-compatible + // streamers repeat an already-sent field as a non-string placeholder on a + // continuation delta; judging first meant the whole stream died with a 502 even + // though the value being repeated was already held in canonical form. + const key = typeof rawIndex === "number" + ? `i:${rawIndex}` + : idDelta + ? `id:${idDelta}` : pendingToolCalls[pendingToolCalls.length - 1]?.key; let call = key !== undefined ? pendingToolCalls.find(c => c.key === key) : undefined; - if (!call && tc.id) call = pendingToolCalls.find(c => c.id === tc.id); + if (!call && idDelta) call = pendingToolCalls.find(c => c.id === idDelta); if (!call) { - call = { key: key ?? `seq:${pendingToolCalls.length}`, id: "", name: "", args: "", argsBytes: 0 }; + call = { + key: key ?? `seq:${pendingToolCalls.length}`, + id: "", + name: "", + args: "", + argsBytes: 0, + sawArgumentsString: false, + }; pendingToolCalls.push(call); budget.openCall(call.key); } - if (tc.id && !call.id) call.id = tc.id; - if (tc.function?.name && !call.name) call.name = tc.function.name; - if (tc.function?.arguments) { + + // Tolerance is per FIELD, keyed on that field's own provenance. A canonical name + // says nothing about whether `arguments` was ever sent as a string, so it cannot + // authorize a malformed arguments value — that would silently drop a real + // argument payload the model intended to send. + const rejection: InvalidToolCallDiagnostic | undefined = + isInvalidStreamStringField(rawName) && call.name.trim() === "" + ? { reason: "tool_call_function_name_invalid", callIndex, valueType: typeof rawName } + : isInvalidStreamStringField(rawArguments) && !call.sawArgumentsString + ? { reason: "tool_call_function_arguments_invalid", callIndex, valueType: typeof rawArguments } + : isInvalidStreamStringField(rawId) && call.id === "" + ? { reason: "tool_call_id_invalid", callIndex, valueType: typeof rawId } + : undefined; + if (rejection) { + logInvalidToolCalls("stream", rawToolCalls, rejection); + return yield* terminateWithError(invalidToolCallsEvent(rawToolCalls, "stream", pendingUsage, rejection)); + } + + if (idDelta && !call.id) call.id = idDelta; + if (typeof rawName === "string" && rawName && !call.name) call.name = rawName; + if (typeof rawArguments === "string") call.sawArgumentsString = true; + if (typeof rawArguments === "string" && rawArguments) { const previousBytes = call.argsBytes; - const nextBytes = previousBytes + budgetEncoder.encode(tc.function.arguments).byteLength; + const nextBytes = previousBytes + budgetEncoder.encode(rawArguments).byteLength; const scope = { kind: "tool_args" as const, callId: call.key }; const reservation = budget.reserveTransient(nextBytes, scope); try { - call.args += tc.function.arguments; + call.args += rawArguments; reservation.commitRetained(); budget.releaseRetained(previousBytes, scope); call.argsBytes = nextBytes; diff --git a/tests/openai-chat-hardening.test.ts b/tests/openai-chat-hardening.test.ts index f7435e0a28..81671b0968 100644 --- a/tests/openai-chat-hardening.test.ts +++ b/tests/openai-chat-hardening.test.ts @@ -476,6 +476,102 @@ describe("openai-chat stream response hardening", () => { expect(lines).toContain('"callIndex":1'); expect(lines).not.toContain('"tool_call_function_name_invalid"'); }); + + // Some OpenAI-compatible streamers repeat an already-sent field as a non-string placeholder + // instead of null. Before #2155 that killed the whole turn with a 502 even though the value + // being repeated was already held in canonical form, so the tool never ran. + test("a non-string repeat is padding once that field has string provenance (#2155)", async () => { + const adapter = createOpenAIChatAdapter(provider()); + const response = new Response([ + `data: ${JSON.stringify({ choices: [{ delta: { tool_calls: [ + { index: 0, id: "call_a", function: { name: "shell", arguments: "" } }, + ] } }] })}\n\n`, + `data: ${JSON.stringify({ choices: [{ delta: { tool_calls: [ + { index: 0, id: { padding: true }, function: { name: { padding: true }, arguments: { padding: true } } }, + ] } }] })}\n\n`, + `data: ${JSON.stringify({ choices: [{ delta: { tool_calls: [ + { index: 0, function: { arguments: "{}" } }, + ] } }] })}\n\n`, + 'data: {"choices":[{"delta":{},"finish_reason":"tool_calls"}]}\n\n', + "data: [DONE]\n\n", + ].join("")); + + const events = await collect(adapter.parseStream(response)); + expect(events.some(event => event.type === "error")).toBe(false); + expect(events).toContainEqual({ type: "tool_call_start", id: "call_a", name: "shell" }); + expect(events).toContainEqual({ type: "tool_call_delta", arguments: "{}" }); + }); + + // Tolerance is per field. A canonical NAME is not evidence that `arguments` was ever sent + // as a string, and accepting a malformed object here would silently discard an argument + // payload the model meant to send. + test("a canonical name does not authorize a malformed arguments value (#2155)", async () => { + const adapter = createOpenAIChatAdapter(provider()); + const response = new Response([ + `data: ${JSON.stringify({ choices: [{ delta: { tool_calls: [ + { index: 0, id: "call_a", function: { name: "shell" } }, + ] } }] })}\n\n`, + `data: ${JSON.stringify({ choices: [{ delta: { tool_calls: [ + { index: 0, function: { arguments: { bad: true } } }, + ] } }] })}\n\n`, + "data: [DONE]\n\n", + ].join("")); + + expect(await collect(adapter.parseStream(response))).toEqual([{ + type: "error", + status: 502, + errorType: "upstream_error", + message: "upstream response contained invalid tool calls (tool_call_function_arguments_invalid; callIndex=0; valueType=object)", + }]); + }); + + test("a malformed id stays terminal until that call has a canonical id (#2155)", async () => { + const adapter = createOpenAIChatAdapter(provider()); + const response = new Response([ + `data: ${JSON.stringify({ choices: [{ delta: { tool_calls: [ + { index: 0, function: { name: "shell", arguments: "{}" } }, + ] } }] })}\n\n`, + `data: ${JSON.stringify({ choices: [{ delta: { tool_calls: [ + { index: 0, id: { bad: true } }, + ] } }] })}\n\n`, + "data: [DONE]\n\n", + ].join("")); + + expect(await collect(adapter.parseStream(response))).toEqual([{ + type: "error", + status: 502, + errorType: "upstream_error", + message: "upstream response contained invalid tool calls (tool_call_id_invalid; callIndex=0; valueType=object)", + }]); + }); + + // The reason the diagnostic is passed from the rejection site rather than rescanned: a + // stateless rescan stops at the first structurally odd value, which here is the ACCEPTED + // padding on call 0, and would blame the wrong call for the real defect on call 1. + test("parallel calls blame the unresolved call, not the accepted padding (#2155)", async () => { + process.env.OCX_DEBUG = "1"; + const adapter = createOpenAIChatAdapter(provider()); + const response = new Response([ + `data: ${JSON.stringify({ choices: [{ delta: { tool_calls: [ + { index: 0, id: "call_a", function: { name: "alpha", arguments: "" } }, + { index: 1, id: "call_b", function: { name: "beta" } }, + ] } }] })}\n\n`, + `data: ${JSON.stringify({ choices: [{ delta: { tool_calls: [ + { index: 0, function: { arguments: { padding: true } } }, + { index: 1, function: { arguments: { bad: true } } }, + ] } }] })}\n\n`, + "data: [DONE]\n\n", + ].join("")); + + expect(await collect(adapter.parseStream(response))).toEqual([{ + type: "error", + status: 502, + errorType: "upstream_error", + message: "upstream response contained invalid tool calls (tool_call_function_arguments_invalid; callIndex=1; valueType=object)", + }]); + const lines = getDebugLogEntries().map(entry => entry.line).join("\n"); + expect(lines).toContain('"callIndex":1'); + }); }); describe("openai-chat credential hardening", () => { From 02a564892af2fca911f422ba85b554b913fd444f Mon Sep 17 00:00:00 2001 From: Ingwannu Date: Thu, 20 Aug 2026 00:51:00 +0000 Subject: [PATCH 61/88] fix(logs): persist shadow helper attribution --- src/server/request-log.ts | 13 ++++++++++ src/server/responses/core.ts | 2 +- src/usage/log.ts | 4 ++++ structure/05_gui-and-management-api.md | 3 +++ tests/request-log.test.ts | 30 ++++++++++++++++++++++++ tests/responses-shadow-intercept.test.ts | 14 ++++++++--- 6 files changed, 62 insertions(+), 4 deletions(-) diff --git a/src/server/request-log.ts b/src/server/request-log.ts index 9658cbd2fa..5567b31d21 100644 --- a/src/server/request-log.ts +++ b/src/server/request-log.ts @@ -65,6 +65,8 @@ export interface RequestLogContext { /** Stable non-PII Codex Pool account identity for durable usage attribution. */ accountLogLabel?: string; requestedModel?: string; + /** Original bare helper model when the opt-in shadow-call route rewrote this request. */ + shadowCallRewrittenFrom?: string; /** Internal structural combo identity; omitted from RequestLogEntry/JSONL. */ comboId?: string; requestedEffort?: string; @@ -142,6 +144,8 @@ export interface RequestLogEntry { /** Best-effort chat/session correlation for Logs grouping (#330). */ conversationId?: string; requestedModel?: string; + /** Original bare helper model when the opt-in shadow-call route rewrote this request. */ + shadowCallRewrittenFrom?: string; requestedEffort?: string; effectiveEffort?: string; reasoningWireField?: string; @@ -255,6 +259,9 @@ export function requestLogEntryFromPersistedUsage(entry: PersistedUsageEntry): R ? { accountLogLabel: entry.accountLogLabel } : {}), ...(entry.requestedModel ? { requestedModel: entry.requestedModel } : {}), + ...(entry.shadowCallRewrittenFrom + ? { shadowCallRewrittenFrom: entry.shadowCallRewrittenFrom } + : {}), ...(entry.requestedEffort ? { requestedEffort: entry.requestedEffort } : {}), ...(entry.effectiveEffort ? { effectiveEffort: entry.effectiveEffort } : {}), ...(entry.reasoningWireField ? { reasoningWireField: entry.reasoningWireField } : {}), @@ -358,6 +365,9 @@ export function addRequestLog(entry: RequestLogEntry) { ...(entry.conversationId ? { conversationId: entry.conversationId } : {}), ...(entry.resolvedModel ? { resolvedModel: entry.resolvedModel } : {}), ...(entry.requestedModel ? { requestedModel: entry.requestedModel } : {}), + ...(entry.shadowCallRewrittenFrom + ? { shadowCallRewrittenFrom: entry.shadowCallRewrittenFrom } + : {}), ...(entry.requestedEffort ? { requestedEffort: entry.requestedEffort } : {}), ...(entry.effectiveEffort ? { effectiveEffort: entry.effectiveEffort } : {}), ...(entry.reasoningWireField ? { reasoningWireField: entry.reasoningWireField } : {}), @@ -919,6 +929,9 @@ export function addFinalRequestLog( : {}), ...(logCtx.conversationId ? { conversationId: logCtx.conversationId } : {}), ...(logCtx.requestedModel ? { requestedModel: logCtx.requestedModel } : {}), + ...(logCtx.shadowCallRewrittenFrom + ? { shadowCallRewrittenFrom: logCtx.shadowCallRewrittenFrom } + : {}), ...(logCtx.requestedEffort ? { requestedEffort: logCtx.requestedEffort } : {}), ...(logCtx.effectiveEffort ? { effectiveEffort: logCtx.effectiveEffort } : {}), ...(logCtx.reasoningWireField ? { reasoningWireField: logCtx.reasoningWireField } : {}), diff --git a/src/server/responses/core.ts b/src/server/responses/core.ts index 9e2813d0b5..f693bc6699 100644 --- a/src/server/responses/core.ts +++ b/src/server/responses/core.ts @@ -1838,7 +1838,7 @@ async function handleResponsesInner( if (parsed._rawBody && typeof parsed._rawBody === "object") { (parsed._rawBody as Record).reasoning = { effort: "low" }; } - (logCtx as unknown as Record).shadowCallRewrittenFrom = _sciOriginal; + logCtx.shadowCallRewrittenFrom = sanitizeLogMetadataString(_sciOriginal); // Helpers must not resume/append into the parent thread's Cursor conversation. parsed._cursorIsolateConversation = true; } diff --git a/src/usage/log.ts b/src/usage/log.ts index a526d8ddf5..fd93059e68 100644 --- a/src/usage/log.ts +++ b/src/usage/log.ts @@ -84,6 +84,8 @@ export interface PersistedUsageEntry { conversationId?: string; resolvedModel?: string; requestedModel?: string; + /** Original bare helper model when the opt-in shadow-call route rewrote this request. */ + shadowCallRewrittenFrom?: string; /** Reasoning effort / service-tier metadata for GUI Logs after restart. */ requestedEffort?: string; /** Adapter-normalized tier and exact upstream parameter emitted for this request. */ @@ -427,6 +429,7 @@ function normalizeUsageEntry(entry: PersistedUsageEntry): PersistedUsageEntry { const tierOutcome = entry.tierOutcome ? normalizeAttemptTierOutcome(entry.tierOutcome) : undefined; const callerServiceTier = sanitizeLogMetadataString(entry.callerServiceTier); const responseServiceTier = sanitizeLogMetadataString(entry.responseServiceTier); + const shadowCallRewrittenFrom = sanitizeLogMetadataString(entry.shadowCallRewrittenFrom); const routeDecision = entry.routeDecision ? normalizeRouteDecisionTrace(entry.routeDecision) : undefined; @@ -453,6 +456,7 @@ function normalizeUsageEntry(entry: PersistedUsageEntry): PersistedUsageEntry { : {}), ...(entry.resolvedModel ? { resolvedModel: entry.resolvedModel } : {}), ...(entry.requestedModel ? { requestedModel: entry.requestedModel } : {}), + ...(shadowCallRewrittenFrom ? { shadowCallRewrittenFrom } : {}), ...(typeof entry.requestedEffort === "string" && entry.requestedEffort ? { requestedEffort: capMetadataString(entry.requestedEffort) } : {}), diff --git a/structure/05_gui-and-management-api.md b/structure/05_gui-and-management-api.md index a4bbcbe6db..688f112020 100644 --- a/structure/05_gui-and-management-api.md +++ b/structure/05_gui-and-management-api.md @@ -320,6 +320,9 @@ keeps the saved state and renders fixed `ocx sync` guidance without server/accou ## Usage accounting `src/usage/log.ts` writes append-only JSONL to `~/.opencodex/usage.jsonl` with file mode `0o600`. +An opt-in shadow-call rewrite persists the bounded, redacted original helper model as +`shadowCallRewrittenFrom`, so helper traffic remains identifiable after restart without storing +request content or inferring a helper subtype from timing. `src/usage/summary.ts` turns that file into the `/api/usage` shape — totals, daily zero-filled grid, model and provider breakdowns, and `measured / reported / unreported / unsupported / estimated` counts. A Codex-surface response also includes an `accounts` breakdown keyed by the stable non-PII diff --git a/tests/request-log.test.ts b/tests/request-log.test.ts index e1f6eefab7..040badbd77 100644 --- a/tests/request-log.test.ts +++ b/tests/request-log.test.ts @@ -258,6 +258,32 @@ describe("request log metadata", () => { expect(captured2[0]).not.toHaveProperty("firstOutputMs"); }); + test("persists the shadow helper source marker to usage.jsonl", () => { + const home = mkdtempSync(join(tmpdir(), "ocx-shadow-usage-")); + const previousHome = process.env.OPENCODEX_HOME; + process.env.OPENCODEX_HOME = home; + try { + clearRequestLogsForTests(); + resetUsageReadCacheForTests(); + addFinalRequestLog("ocx-shadow-marker", 1, { + model: "grok-4.5", + provider: "xai", + requestedModel: "gpt-5.6-luna", + shadowCallRewrittenFrom: "gpt-5.6-luna", + }, 200); + + const [persisted] = readUsageEntries(); + expect(persisted?.shadowCallRewrittenFrom).toBe("gpt-5.6-luna"); + expect(getRequestLogEntries()[0]?.shadowCallRewrittenFrom).toBe("gpt-5.6-luna"); + } finally { + clearRequestLogsForTests(); + if (previousHome === undefined) delete process.env.OPENCODEX_HOME; + else process.env.OPENCODEX_HOME = previousHome; + resetUsageReadCacheForTests(); + rmSync(home, { recursive: true, force: true }); + } + }); + test("records ordered attempts with sealed identity, fresh estimates, and deduplicated recoveries", () => { const a = beginRequestAttempt(1, "provisional-a", "model-a", "openai-chat"); noteAttemptSend(a, 100); @@ -1312,6 +1338,7 @@ describe("request log restart hydrate", () => { provider: "chatgpt-pabcdef", model: "gpt-5.6-sol", requestedModel: "gpt-5.6-sol", + shadowCallRewrittenFrom: "gpt-5.6-luna", requestedEffort: "high", effectiveEffort: "high", reasoningWireField: "reasoning_effort", @@ -1334,6 +1361,7 @@ describe("request log restart hydrate", () => { provider: "chatgpt-pabcdef", model: "gpt-5.6-sol", requestedModel: "gpt-5.6-sol", + shadowCallRewrittenFrom: "gpt-5.6-luna", requestedEffort: "high", effectiveEffort: "high", reasoningWireField: "reasoning_effort", @@ -1381,6 +1409,7 @@ describe("request log restart hydrate", () => { terminalStatus: "failed", closeReason: "terminal", upstreamError: "Provider unreachable", + shadowCallRewrittenFrom: "gpt-5.6-luna", }, ]; @@ -1392,6 +1421,7 @@ describe("request log restart hydrate", () => { errorCode: "upstream_server_error", upstreamError: "Provider unreachable", requestedEffort: "xhigh", + shadowCallRewrittenFrom: "gpt-5.6-luna", }); // Idempotent: a second start in the same process must not duplicate. diff --git a/tests/responses-shadow-intercept.test.ts b/tests/responses-shadow-intercept.test.ts index 7950f86c60..18ee9eb059 100644 --- a/tests/responses-shadow-intercept.test.ts +++ b/tests/responses-shadow-intercept.test.ts @@ -10,6 +10,7 @@ import { join } from "node:path"; import { handleResponses, isShadowSourceModel } from "../src/server/responses"; import { shouldInterceptShadowCall } from "../src/lib/shadow-call"; import { handleManagementAPI } from "../src/server/management-api"; +import type { RequestLogContext } from "../src/server/request-log"; import type { OcxConfig } from "../src/types"; import { catalogConvergenceFactory } from "./helpers/catalog-convergence"; @@ -90,7 +91,12 @@ function interceptConfig(): OcxConfig { } as OcxConfig; } -async function post(config: OcxConfig, model: string, requestKind?: string): Promise { +async function post( + config: OcxConfig, + model: string, + requestKind?: string, + logCtx: RequestLogContext = { model: "", provider: "" }, +): Promise { const headers: Record = { "content-type": "application/json" }; if (requestKind) { headers["x-codex-turn-metadata"] = JSON.stringify({ request_kind: requestKind }); @@ -104,7 +110,7 @@ async function post(config: OcxConfig, model: string, requestKind?: string): Pro stream: false, reasoning: { effort: "high" }, }), - }), config, { model: "", provider: "" }); + }), config, logCtx); } describe("shadow call intercept request path (issue #311)", () => { @@ -130,6 +136,7 @@ describe("shadow call intercept request path (issue #311)", () => { test("rewrites a gpt-5.6-luna turn request too (#1684)", async () => { const bodies: Array> = []; + const logCtx: RequestLogContext = { model: "", provider: "" }; globalThis.fetch = (async (_url: unknown, init?: RequestInit) => { bodies.push(JSON.parse(String(init?.body ?? "{}")) as Record); return new Response(JSON.stringify({ @@ -138,10 +145,11 @@ describe("shadow call intercept request path (issue #311)", () => { }), { status: 200, headers: { "content-type": "application/json" } }); }) as typeof fetch; - await post(interceptConfig(), "gpt-5.6-luna", "turn"); + await post(interceptConfig(), "gpt-5.6-luna", "turn", logCtx); expect(bodies.length).toBe(1); expect(String(bodies[0]?.model ?? "")).toContain("grok-4.5"); + expect(logCtx.shadowCallRewrittenFrom).toBe("gpt-5.6-luna"); }); test("leaves gpt-5.6-terra requests unrewritten", async () => { From e4f0eec94820fde6cc1f6a1032ba6f2ee1e8d4ee Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 10:32:17 +0900 Subject: [PATCH 62/88] fix(logs): sanitize the shadow helper marker at the logging layer Builds on @Ingwannu's #2163, which types and persists shadowCallRewrittenFrom so an intercepted helper request keeps its original model in usage.jsonl and across restart hydration. The original sanitized the value at the single call site that populates it today, which left the in-memory /api/logs row carrying whatever the caller sent. The marker originates in an upstream-supplied model id, so an unsanitized newline lets one field forge a record boundary in any line-oriented log viewer, and nothing bounded its length on that path. addFinalRequestLog now runs it through sanitizeLogMetadataString itself. A future caller cannot reintroduce the hole by forgetting to sanitize first, and the in-memory row matches what usage.jsonl already stored. The added regression writes an unsafe overlong marker and asserts the newline is gone and the 64-character bound holds on both paths. The original test used a safe short slug, so it passed identically whether the sanitizer ran or not. --- src/server/request-log.ts | 10 +++++++--- tests/request-log.test.ts | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/src/server/request-log.ts b/src/server/request-log.ts index 5567b31d21..00da48567e 100644 --- a/src/server/request-log.ts +++ b/src/server/request-log.ts @@ -915,6 +915,12 @@ export function addFinalRequestLog( const loggedUsage = aggregate?.usage ?? existing.usage; const usageStatus = aggregate?.status ?? existing.status; const totalTokens = aggregate?.totalTokens ?? existing.totalTokens; + // Sanitize at the logging layer, not only at the one call site that populates this today. + // The value originates in an upstream-supplied model id, so an unsanitized newline would + // let a single field forge a record boundary in any line-oriented log viewer. Doing it here + // means a future caller cannot reintroduce the hole by forgetting to sanitize first, and + // the in-memory /api/logs row matches what usage.jsonl already stores. + const shadowCallRewrittenFrom = sanitizeLogMetadataString(logCtx.shadowCallRewrittenFrom); addLog({ requestId, timestamp: start, @@ -929,9 +935,7 @@ export function addFinalRequestLog( : {}), ...(logCtx.conversationId ? { conversationId: logCtx.conversationId } : {}), ...(logCtx.requestedModel ? { requestedModel: logCtx.requestedModel } : {}), - ...(logCtx.shadowCallRewrittenFrom - ? { shadowCallRewrittenFrom: logCtx.shadowCallRewrittenFrom } - : {}), + ...(shadowCallRewrittenFrom ? { shadowCallRewrittenFrom } : {}), ...(logCtx.requestedEffort ? { requestedEffort: logCtx.requestedEffort } : {}), ...(logCtx.effectiveEffort ? { effectiveEffort: logCtx.effectiveEffort } : {}), ...(logCtx.reasoningWireField ? { reasoningWireField: logCtx.reasoningWireField } : {}), diff --git a/tests/request-log.test.ts b/tests/request-log.test.ts index 040badbd77..f80e8ccd88 100644 --- a/tests/request-log.test.ts +++ b/tests/request-log.test.ts @@ -284,6 +284,40 @@ describe("request log metadata", () => { } }); + // The value is caller-controlled, so proving it lands is only half the contract: the + // persistence path must also be the SANITIZED one. A test that only ever writes a safe + // short slug passes identically whether `sanitizeLogMetadataString` is applied or not. + test("the shadow marker reaches usage.jsonl through the sanitizer, not raw", () => { + const home = mkdtempSync(join(tmpdir(), "ocx-shadow-unsafe-")); + const previousHome = process.env.OPENCODEX_HOME; + process.env.OPENCODEX_HOME = home; + try { + clearRequestLogsForTests(); + resetUsageReadCacheForTests(); + addFinalRequestLog("ocx-shadow-unsafe", 1, { + model: "grok-4.5", + provider: "xai", + // A newline would let one field forge a record boundary in a line-oriented log + // viewer, and the trailing run is long enough to be over the 64-character bound. + shadowCallRewrittenFrom: `gpt-5.6-luna\nInjected: yes ${"x".repeat(80)}`, + }, 200); + + const [persisted] = readUsageEntries(); + const marker = persisted?.shadowCallRewrittenFrom; + expect(marker).toBeDefined(); + expect(marker).not.toContain("\n"); + expect(marker!.length).toBeLessThanOrEqual(64); + expect(marker!.startsWith("gpt-5.6-luna")).toBe(true); + expect(getRequestLogEntries()[0]?.shadowCallRewrittenFrom).not.toContain("\n"); + } finally { + clearRequestLogsForTests(); + if (previousHome === undefined) delete process.env.OPENCODEX_HOME; + else process.env.OPENCODEX_HOME = previousHome; + resetUsageReadCacheForTests(); + rmSync(home, { recursive: true, force: true }); + } + }); + test("records ordered attempts with sealed identity, fresh estimates, and deduplicated recoveries", () => { const a = beginRequestAttempt(1, "provisional-a", "model-a", "openai-chat"); noteAttemptSend(a, 100); From 6499919a61297e6aebcb9ec1c005fce8c26fa5d7 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 10:33:22 +0900 Subject: [PATCH 63/88] docs(devlog): record wp18-wp20 and the six-layer stack end state --- .../080_residual_dispositions.md | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/080_residual_dispositions.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/080_residual_dispositions.md index 3aa59cc031..a35be68067 100644 --- a/devlog/_plan/260820_bug_pr_backlog_consolidation/080_residual_dispositions.md +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/080_residual_dispositions.md @@ -272,3 +272,44 @@ not as a side effect of a quota fix. The defensive canonical-URL check inside `fetchOpenCodeGoQuota` (`quota.ts:485-494`) stays: it is what stops an API key being sent to a non-canonical host, and it should not depend on the dispatch predicate being correct. + +### wp18-wp20 — the rest of the chain + +**#2027 @yzxcj797 -> PR #2164.** Dispatch gated on the literal name `opencode-go`, so the +multi-account sibling rows in #1924 had no quota panel and no CLI report. The contributor's +base-URL swap is closer but does not check the adapter; `registryEntryForProviderDestination` +already answers exactly this question (endpoint + adapter + key auth) and is the existing +convention for renamed rows. Rejected: `providerMatchesRegistryTransport` would need +`preserveCustomDestination`, which also changes routing for same-named custom rows. + +**#2155 @waw4303 -> PR #2165.** Field validation ran before the pending-call lookup, so a +non-string repeat of an already-canonical field killed the turn with a 502. Two corrections: +`arguments` was gated on a canonical NAME (a name is not evidence about the arguments field, +so a real payload could be dropped) — now keyed on `sawArgumentsString`; and `id` stayed +unconditionally terminal. Diagnostics now come from the rejection site, because a stateless +rescan blamed call 0's accepted padding for call 1's real defect. + +**#2163 @Ingwannu -> PR #2166.** Scored 65. Backend attribution was correct; sanitization sat +at the one call site rather than in the logging layer, so `/api/logs` carried the raw +caller-supplied value. Moved into `addFinalRequestLog`. #2157 stays open: the GUI half is not +built, and closing it would claim an affordance that does not exist. + +### The stack + +Six layers, each rebased onto the current `dev` tip, base refs verified: + +#2134 -> #2160 -> #2162 -> #2164 -> #2165 -> #2166 + +Only one true dependency edge exists in the whole set (none of the six share files). They are +chained rather than opened as siblings because the user asked for one reviewable stack; that is +a review-workflow choice, stated rather than dressed up as a code constraint. + +A privacy-scan failure caught in CI and not locally: a test fixture API key over 24 characters +reads as a real bearer token to `scripts/privacy-scan.ts`. Fixed at the L4 commit. + +### End state + +`gh pr list --label bug --state open` returns only lidge-jun PRs plus #2054, which stays open +by explicit instruction and carries the wire-probe request. Nine contributor PRs closed with +attribution across this unit; none was closed without a named reason. + From 70cebd4de16e4d50916bcb1d6b35b52bf086dd4d Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 11:20:21 +0900 Subject: [PATCH 64/88] fix(logs): sanitize at the addRequestLog ingress so both surfaces agree --- src/server/request-log.ts | 14 ++++++++++++++ tests/request-log.test.ts | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/src/server/request-log.ts b/src/server/request-log.ts index 00da48567e..26a69a14ab 100644 --- a/src/server/request-log.ts +++ b/src/server/request-log.ts @@ -334,6 +334,20 @@ export function hydrateRequestLogsFromDisk( } export function addRequestLog(entry: RequestLogEntry) { + // Sanitize ONCE, at the ingress, and use that one value for both destinations. + // + // `addFinalRequestLog` is not the only way in: `addRequestLog` is exported and callable + // directly, and it retained the caller's entry verbatim in the in-memory ring while only the + // field-by-field disk projection below saw a sanitized value. That split let `/api/logs` + // serve a raw upstream-supplied marker — a newline in it can forge a record boundary in a + // line-oriented viewer — while `usage.jsonl` looked clean, which is the worst shape for a + // sanitization bug because the safe surface is the one you check. + const shadowCallRewrittenFrom = sanitizeLogMetadataString(entry.shadowCallRewrittenFrom); + const retained: RequestLogEntry = shadowCallRewrittenFrom === entry.shadowCallRewrittenFrom + ? entry + : { ...entry, ...(shadowCallRewrittenFrom ? { shadowCallRewrittenFrom } : {}) }; + if (!shadowCallRewrittenFrom && retained !== entry) delete retained.shadowCallRewrittenFrom; + entry = retained; retainRequestLogEntry(entry); try { // Failure diagnostics survive the 200-entry ring buffer by riding the persisted diff --git a/tests/request-log.test.ts b/tests/request-log.test.ts index f80e8ccd88..09512c50e1 100644 --- a/tests/request-log.test.ts +++ b/tests/request-log.test.ts @@ -11,6 +11,7 @@ import { } from "../src/server"; import { aggregateAttemptUsage, + addRequestLog, beginRequestAttempt, clearRequestLogsForTests, finishRequestAttempt, @@ -318,6 +319,42 @@ describe("request log metadata", () => { } }); + // `addFinalRequestLog` is not the only ingress: `addRequestLog` is exported and callable + // directly. Sanitizing only on the disk projection left the in-memory ring — and therefore + // /api/logs — serving the raw value, which is the worst shape for a sanitization bug + // because the surface you would check is the clean one. + test("the direct addRequestLog ingress sanitizes memory and disk identically", () => { + const home = mkdtempSync(join(tmpdir(), "ocx-shadow-ingress-")); + const previousHome = process.env.OPENCODEX_HOME; + process.env.OPENCODEX_HOME = home; + try { + clearRequestLogsForTests(); + resetUsageReadCacheForTests(); + addRequestLog({ + requestId: "ocx-shadow-direct", + timestamp: Date.now(), + provider: "xai", + model: "grok-4.5", + status: 200, + shadowCallRewrittenFrom: `gpt-5.6-luna\nInjected: yes ${"x".repeat(80)}`, + } as RequestLogEntry); + + const inMemory = getRequestLogEntries()[0]?.shadowCallRewrittenFrom; + const [persisted] = readUsageEntries(); + expect(inMemory).toBeDefined(); + expect(inMemory).not.toContain("\n"); + expect(inMemory!.length).toBeLessThanOrEqual(64); + // The two surfaces must agree: a divergence here is exactly the bug. + expect(inMemory).toBe(persisted?.shadowCallRewrittenFrom); + } finally { + clearRequestLogsForTests(); + if (previousHome === undefined) delete process.env.OPENCODEX_HOME; + else process.env.OPENCODEX_HOME = previousHome; + resetUsageReadCacheForTests(); + rmSync(home, { recursive: true, force: true }); + } + }); + test("records ordered attempts with sealed identity, fresh estimates, and deduplicated recoveries", () => { const a = beginRequestAttempt(1, "provisional-a", "model-a", "openai-chat"); noteAttemptSend(a, 100); From 26a15eec4baba18cbcc53a9a7d2752ffcf495537 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 11:37:32 +0900 Subject: [PATCH 65/88] fix(responses): leave the compact wire format out of the id backfill The compact endpoint returns `{ type: "compaction", encrypted_content }`, which is its own wire contract and carries no id. The Responses id backfill treated it as an output item and synthesized one, changing a body that clients compare exactly. This only surfaced once the backfill and the compact endpoint were on the same tree, which is why the integration branch is built and tested before anything merges rather than trusting per-branch CI. The backfill exists to satisfy strict Responses decoders; a shape those decoders never see is outside its remit. --- .../responses/responses-field-backfill.ts | 11 +++++++++++ tests/responses-field-backfill.test.ts | 18 ++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/src/server/responses/responses-field-backfill.ts b/src/server/responses/responses-field-backfill.ts index 285ad3d956..4d67531020 100644 --- a/src/server/responses/responses-field-backfill.ts +++ b/src/server/responses/responses-field-backfill.ts @@ -111,6 +111,16 @@ function backfillContentArray(content: unknown): unknown { return changed ? repaired : content; } +/** + * Item types that are NOT Responses output items and must be returned byte-for-byte. + * + * `compaction` is the `/v1/responses/compact` wire format, not a Responses output item. It has + * no `id` in that contract, so synthesizing one changes a response body the client compares + * exactly. The backfill exists to satisfy strict Responses decoders; a shape those decoders + * never see is outside its remit. + */ +const NON_RESPONSES_ITEM_TYPES: ReadonlySet = new Set(["compaction"]); + /** * Walk an output item and backfill output_text parts in its content. * Also backfills a missing required id on the item itself. @@ -118,6 +128,7 @@ function backfillContentArray(content: unknown): unknown { */ function backfillOutputItem(item: unknown, slot: ItemIdSlot): unknown { if (!isPlainObject(item)) return item; + if (typeof item.type === "string" && NON_RESPONSES_ITEM_TYPES.has(item.type)) return item; const content = item.content; const repaired = backfillContentArray(content); const withId = backfillItemId(item, slot); diff --git a/tests/responses-field-backfill.test.ts b/tests/responses-field-backfill.test.ts index 8575b0727c..f6fb63bae3 100644 --- a/tests/responses-field-backfill.test.ts +++ b/tests/responses-field-backfill.test.ts @@ -402,4 +402,22 @@ describe("responses-field-backfill", () => { }); expect(new Set(ids).size).toBe(2); }); + + // `compaction` is the /v1/responses/compact wire format, not a Responses output item: it + // carries no id in that contract, and clients compare the body exactly. Synthesizing an id + // here changed a response that had nothing to do with strict Responses decoding — a defect + // that only appeared once this backfill and the compact endpoint were on the same tree. + test("a compaction item is returned byte-for-byte", () => { + const response = { + id: "resp_1", + object: "response", + status: "completed", + output: [{ type: "compaction", encrypted_content: "gAAAAAB-test-opaque" }], + }; + const result = JSON.parse(backfillResponsesFieldsJson(JSON.stringify(response))) as { + output: Record[]; + }; + expect(result.output[0]).toEqual({ type: "compaction", encrypted_content: "gAAAAAB-test-opaque" }); + expect(result.output[0]).not.toHaveProperty("id"); + }); }); From e9213462a27ce5648d734ee824cd64ae2c1c4439 Mon Sep 17 00:00:00 2001 From: Nguyen Thanh Dat Date: Thu, 20 Aug 2026 09:44:37 +0700 Subject: [PATCH 66/88] fix(codex): stop the background main refresh from retracting a reauth quarantine MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `fetchMainAccountInfoWhileOwned` cleared `needsReauth` for `__main__` on every successful `/wham/usage` response, including the periodic background refresh. A 200 from `/wham/usage` only proves the token authenticates to the usage endpoint. It does not prove the account can serve Responses traffic, which is a different backend path and still answers 403 when the token's workspace can no longer be selected — the exact condition reported in #327. So when real traffic 401/403'd and `recordCodexUpstreamOutcome` quarantined the account (routing.ts, `outcomeClass === "credential"`), the next background refresh silently retracted that quarantine. The account went straight back into rotation, the following request failed identically and re-marked it, and `needsReauth` never settled — which is why the dashboard showed nothing, the symptom #327 was filed about. Gate the clear on `forceRefresh`. An explicit refresh is an operator asking to re-evaluate, normally right after signing in again, so it stays authoritative and #327's recovery path is unchanged. Sign-in and account-add still clear unconditionally through `account-lifecycle`. Verified on win32: - bun run typecheck exit 0 - bun test tests/server-auth.test.ts 79 pass / 0 fail (was 78/1) - bun test tests/codex-auth-api.test.ts 191 pass / 0 fail - 10 adjacent auth/routing/oauth suites 325 pass / 0 fail Mutation-checked: restoring the unconditional clear fails the new regression test and re-fails `server-auth`'s OpenAI option auth matrix. --- src/codex/auth-api.ts | 11 ++++++++++- tests/codex-auth-api.test.ts | 36 +++++++++++++++++++++++++++++++++++- 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/src/codex/auth-api.ts b/src/codex/auth-api.ts index 2f20d25f8d..65e30957dd 100644 --- a/src/codex/auth-api.ts +++ b/src/codex/auth-api.ts @@ -745,7 +745,16 @@ async function fetchMainAccountInfoWhileOwned( ts: Date.now(), }; setMainAccountInfoCache(result); - clearAccountNeedsReauth(MAIN_CODEX_ACCOUNT_ID); + // Only an explicit refresh may retract a reauth quarantine. A 200 from + // /wham/usage proves the token authenticates to the usage endpoint; it does not + // prove the account can serve Responses traffic, which is a different backend path + // and still answers 403 for a workspace the token may no longer select (#327). + // Letting the background poll clear the flag put such an account straight back into + // rotation: the next request failed the same way and re-marked it, so needsReauth + // never settled and the dashboard kept showing nothing — the symptom #327 reported. + // An explicit refresh is an operator asking to re-evaluate, normally right after + // signing in again, so it stays authoritative. + if (forceRefresh) clearAccountNeedsReauth(MAIN_CODEX_ACCOUNT_ID); // Mirror main quota + plan into the shared stores so the rotation engine can // score and auto-switch the main account exactly like a pool account (Option A). setMainAccountPlan(result.plan); diff --git a/tests/codex-auth-api.test.ts b/tests/codex-auth-api.test.ts index d14cedf6be..37c49a4ff8 100644 --- a/tests/codex-auth-api.test.ts +++ b/tests/codex-auth-api.test.ts @@ -13,7 +13,7 @@ import { handleCodexAuthAPI, updateAccountQuota, getAccountQuota, checkAccountIdCollision, getMainChatgptAccountId, markAccountNeedsReauth, isAccountNeedsReauth, clearAccountNeedsReauth, clearAccountQuota, - clearMainAccountInfoCache, maskEmail, + clearMainAccountInfoCache, maskEmail, fetchMainAccountInfo, clearCodexQuotaPrimeState, primeCodexPoolQuotas, seedCodexAuthAdmissionForTests, type CodexAuthAccountDto, listCodexAuthAccounts, @@ -858,6 +858,40 @@ describe("codex-auth API", () => { expect(isAccountNeedsReauth(MAIN_CODEX_ACCOUNT_ID)).toBe(false); }); + test("a background main account refresh does not retract a reauth quarantine (#327)", async () => { + // #327's own repro: the token is valid, but its workspace can no longer be + // selected, so Responses traffic answers 403 and quarantines the account. + // /wham/usage is a different backend path and keeps answering 200 for that same + // token, so the periodic refresh must not read its own 200 as proof the account + // can serve traffic again — doing so returned the account to rotation, the next + // request failed identically and re-marked it, and needsReauth never settled. + writeFileSync(join(TEST_CODEX_HOME, "auth.json"), JSON.stringify({ + tokens: { access_token: "live-main", account_id: "acct-main" }, + })); + markAccountNeedsReauth(MAIN_CODEX_ACCOUNT_ID); + clearMainAccountInfoCache(); + let usageCalls = 0; + globalThis.fetch = (async () => { + usageCalls += 1; + return Response.json({ + email: "main@example.test", + plan_type: "pro", + rate_limit: { primary_window: { used_percent: 10, reset_at: 1783000000 } }, + }); + }) as typeof fetch; + + expect((await fetchMainAccountInfo(false)).email).toBe("main@example.test"); + // The probe really ran and really succeeded — the quarantine survives it anyway. + expect(usageCalls).toBe(1); + expect(isAccountNeedsReauth(MAIN_CODEX_ACCOUNT_ID)).toBe(true); + + // An explicit refresh is an operator asking to re-evaluate, so it stays + // authoritative and still clears the flag (the test above pins that direction). + clearMainAccountInfoCache(); + expect((await fetchMainAccountInfo(true)).email).toBe("main@example.test"); + expect(isAccountNeedsReauth(MAIN_CODEX_ACCOUNT_ID)).toBe(false); + }); + test("BUG-R327: main account exposes and updates needsReauth from WHAM auth responses", async () => { writeFileSync(join(TEST_CODEX_HOME, "auth.json"), JSON.stringify({ tokens: { From bbf2aadecae3a0f9a6b6d3f60660375dfec90bbc Mon Sep 17 00:00:00 2001 From: Nguyen Thanh Dat Date: Thu, 20 Aug 2026 10:04:28 +0700 Subject: [PATCH 67/88] fix(codex): keep the identity-change retry from upgrading a background refresh MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CodeRabbit caught a hole in the previous commit. `forceRefresh` carries two meanings: "bypass the cache" and "the caller asked for this". Gating the reauth clear on it left `retryMainAccountInfoIfIdentityChanged` able to launder a background poll into operator intent, because that retry re-enters `fetchMainAccountInfoWhileOwned(true, ...)` purely to re-read past a stale cache. So a background refresh that crossed an identity change came back with the authority to retract a quarantine raised — by real traffic 401/403 — against the new identity while the retry probe was in flight. Split the two meanings: `explicitRefresh` defaults to `forceRefresh` and the retry propagates the caller's original value. The reauth clear now keys off `explicitRefresh`; cache bypass is unchanged. Note the purge on a genuine identity change is a separate and correct path — `reconcileMainCodexAccountRuntimeState` drops the previous identity's quarantine, quota, health, and thread map because it is a different account. The new test marks the quarantine after that purge so it pins the retry, not the purge. Verified on win32: - bun run typecheck exit 0 - 12 auth/routing/oauth suites 596 pass / 0 fail Mutation-checked: - clear gated on `forceRefresh` (this hole) → 1 fail, the new retry test - clear unconditional (the original bug) → 2 fail, both regression tests --- src/codex/auth-api.ts | 18 +++++++++++++----- tests/codex-auth-api.test.ts | 37 ++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 5 deletions(-) diff --git a/src/codex/auth-api.ts b/src/codex/auth-api.ts index 65e30957dd..8ac2411323 100644 --- a/src/codex/auth-api.ts +++ b/src/codex/auth-api.ts @@ -644,12 +644,13 @@ async function retryMainAccountInfoIfIdentityChanged( requestAccountId: string | null, retriesRemaining: number, nativeMainLease: AdmissionLease, + explicitRefresh: boolean, ): Promise { const currentAccountId = getMainChatgptAccountId(); if (currentAccountId === null || currentAccountId === requestAccountId) return null; reconcileMainCodexAccountRuntimeState(); return retriesRemaining > 0 - ? fetchMainAccountInfoWhileOwned(true, retriesRemaining - 1, nativeMainLease) + ? fetchMainAccountInfoWhileOwned(true, retriesRemaining - 1, nativeMainLease, explicitRefresh) : { info: EMPTY_MAIN_ACCOUNT_INFO, credentialChecked: true, hasCredential: true }; } @@ -696,6 +697,13 @@ async function fetchMainAccountInfoWhileOwned( forceRefresh: boolean, retriesRemaining: number, nativeMainLease: AdmissionLease, + /** + * Whether the *caller* asked for this refresh. `forceRefresh` also means "bypass the + * cache", and `retryMainAccountInfoIfIdentityChanged` re-enters with it set purely to + * re-read after the identity changed. Keeping the two apart stops that retry from + * promoting a background poll into operator intent below. + */ + explicitRefresh: boolean = forceRefresh, ): Promise { const writerGeneration = captureConfigGeneration(); reconcileMainCodexAccountRuntimeState(); @@ -724,7 +732,7 @@ async function fetchMainAccountInfoWhileOwned( }); if (!resp.ok) { const terminalAuthFailure = await isTerminalMainAuthResponse(resp, isMainAccountTokenVerifiablyLive()); - const retried = await retryMainAccountInfoIfIdentityChanged(requestAccountId, retriesRemaining, nativeMainLease); + const retried = await retryMainAccountInfoIfIdentityChanged(requestAccountId, retriesRemaining, nativeMainLease, explicitRefresh); if (retried) return retried; if (terminalAuthFailure) { clearMainAccountInfoCache(); @@ -733,7 +741,7 @@ async function fetchMainAccountInfoWhileOwned( return { info: EMPTY_MAIN_ACCOUNT_INFO, credentialChecked: true, hasCredential: true }; } const data = (await resp.json()) as WhamUsageResponse; - const retried = await retryMainAccountInfoIfIdentityChanged(requestAccountId, retriesRemaining, nativeMainLease); + const retried = await retryMainAccountInfoIfIdentityChanged(requestAccountId, retriesRemaining, nativeMainLease, explicitRefresh); if (retried) return retried; const plan = nonEmptyPlan(data.plan_type) ?? nonEmptyPlan(cached?.plan) ?? nonEmptyPlan(getMainAccountPlan()); const quota = parseUsageQuota({ ...data, ...(plan ? { plan_type: plan } : {}) }); @@ -754,7 +762,7 @@ async function fetchMainAccountInfoWhileOwned( // never settled and the dashboard kept showing nothing — the symptom #327 reported. // An explicit refresh is an operator asking to re-evaluate, normally right after // signing in again, so it stays authoritative. - if (forceRefresh) clearAccountNeedsReauth(MAIN_CODEX_ACCOUNT_ID); + if (explicitRefresh) clearAccountNeedsReauth(MAIN_CODEX_ACCOUNT_ID); // Mirror main quota + plan into the shared stores so the rotation engine can // score and auto-switch the main account exactly like a pool account (Option A). setMainAccountPlan(result.plan); @@ -769,7 +777,7 @@ async function fetchMainAccountInfoWhileOwned( ...(freshResetCredits !== undefined ? { freshResetCredits } : {}), }; } catch { - const retried = await retryMainAccountInfoIfIdentityChanged(requestAccountId, retriesRemaining, nativeMainLease); + const retried = await retryMainAccountInfoIfIdentityChanged(requestAccountId, retriesRemaining, nativeMainLease, explicitRefresh); return retried ?? { info: EMPTY_MAIN_ACCOUNT_INFO, credentialChecked: true, hasCredential: true }; } } diff --git a/tests/codex-auth-api.test.ts b/tests/codex-auth-api.test.ts index 37c49a4ff8..4bf7876312 100644 --- a/tests/codex-auth-api.test.ts +++ b/tests/codex-auth-api.test.ts @@ -892,6 +892,43 @@ describe("codex-auth API", () => { expect(isAccountNeedsReauth(MAIN_CODEX_ACCOUNT_ID)).toBe(false); }); + test("an identity-change retry does not upgrade a background refresh into an explicit one (#327)", async () => { + // `retryMainAccountInfoIfIdentityChanged` re-enters with forceRefresh=true so it can + // re-read past a now-stale cache. That argument must not double as operator intent: + // a background poll that crosses an identity change would otherwise come back with + // the authority to retract a quarantine it was never allowed to touch. + writeFileSync(join(TEST_CODEX_HOME, "auth.json"), JSON.stringify({ + tokens: { access_token: "live-main", account_id: "acct-before" }, + })); + clearMainAccountInfoCache(); + let usageCalls = 0; + globalThis.fetch = (async () => { + usageCalls += 1; + if (usageCalls === 1) { + // Identity changes on disk mid-probe. The retry's purge legitimately drops the + // *previous* identity's runtime state — that is not what this test is about. + writeFileSync(join(TEST_CODEX_HOME, "auth.json"), JSON.stringify({ + tokens: { access_token: "live-main", account_id: "acct-after" }, + })); + } else { + // Real traffic quarantines the *new* identity while the retry probe is in + // flight, exactly as recordCodexUpstreamOutcome does on a 401/403. + markAccountNeedsReauth(MAIN_CODEX_ACCOUNT_ID); + } + return Response.json({ + email: "main@example.test", + plan_type: "pro", + rate_limit: { primary_window: { used_percent: 10, reset_at: 1783000000 } }, + }); + }) as typeof fetch; + + await fetchMainAccountInfo(false); + + // The retry really fired — otherwise this proves nothing about the retry path. + expect(usageCalls).toBeGreaterThan(1); + expect(isAccountNeedsReauth(MAIN_CODEX_ACCOUNT_ID)).toBe(true); + }); + test("BUG-R327: main account exposes and updates needsReauth from WHAM auth responses", async () => { writeFileSync(join(TEST_CODEX_HOME, "auth.json"), JSON.stringify({ tokens: { From e928ed75b71e2ae7acfc45c7c98f1c949d1a0de7 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 12:51:49 +0900 Subject: [PATCH 68/88] fix(logs): record the configured shadow prefix, not the caller's model string The release audit of origin/main..origin/dev found this: the shadow-call intercept matches by prefix, so a caller can send "gpt-5.6-luna" followed by arbitrary text and still be intercepted -- and the whole raw string was recorded as shadowCallRewrittenFrom, which is persisted to usage.jsonl and served from /api/logs. The sanitizer on that path strips control characters BEFORE redacting, so "gpt-5.6-luna\nBearer sk-..." became "gpt-5.6-lunaBearer sk-...", losing the word boundary the Bearer rule needs. Worse, the runtime redactor is a deny-list: an AIza-shaped Google key has no rule at all and survived verbatim into the log file. Verified against the shipped sanitizer. Recording the operator-configured prefix that matched removes the class instead of adding another pattern to the deny-list. No caller-controlled string reaches the field, so the value is always one the operator chose. --- src/lib/shadow-call.ts | 15 ++++++++++ src/server/responses/core.ts | 11 ++++++-- tests/responses-shadow-intercept.test.ts | 35 ++++++++++++++++++++++++ 3 files changed, 59 insertions(+), 2 deletions(-) diff --git a/src/lib/shadow-call.ts b/src/lib/shadow-call.ts index 829ea69119..7eec991ee3 100644 --- a/src/lib/shadow-call.ts +++ b/src/lib/shadow-call.ts @@ -29,6 +29,21 @@ export function isShadowSourceModel(modelId: string, configured?: unknown): bool return shadowSourceModels(configured).some(prefix => modelId.startsWith(prefix)); } +/** + * The configured source prefix this model matched, or undefined. + * + * Callers that RECORD the intercepted model must record this rather than the caller's raw + * `modelId`. Matching is by prefix, so `gpt-5.6-luna` plus arbitrary trailing text still + * intercepts — and the raw string is caller-controlled, reaches `usage.jsonl` and `/api/logs`, + * and only passes a pattern-based redactor on the way. A credential family that redactor does + * not recognize survives verbatim. Returning the operator-configured prefix keeps the log + * field inside a set the operator chose, so no caller string is ever persisted. + */ +export function shadowSourceModelPrefix(modelId: string, configured?: unknown): string | undefined { + if (modelId.includes("/")) return undefined; + return shadowSourceModels(configured).find(prefix => modelId.startsWith(prefix)); +} + /** * Decide whether a matching source model should use the opt-in intercept. * diff --git a/src/server/responses/core.ts b/src/server/responses/core.ts index 121fa93fe3..8344db309f 100644 --- a/src/server/responses/core.ts +++ b/src/server/responses/core.ts @@ -315,7 +315,7 @@ export function sidecarOutcomeRecorder( -import { isShadowSourceModel, shouldInterceptShadowCall } from "../../lib/shadow-call"; +import { isShadowSourceModel, shadowSourceModelPrefix, shouldInterceptShadowCall } from "../../lib/shadow-call"; export { DEFAULT_SHADOW_SOURCE_MODELS, isShadowSourceModel, shadowSourceModels } from "../../lib/shadow-call"; @@ -1921,7 +1921,14 @@ async function handleResponsesInner( if (parsed._rawBody && typeof parsed._rawBody === "object") { (parsed._rawBody as Record).reasoning = { effort: "low" }; } - logCtx.shadowCallRewrittenFrom = sanitizeLogMetadataString(_sciOriginal); + // Record the operator-configured prefix that matched, NOT the caller's raw model string. + // Matching is by prefix, so a caller can append arbitrary text and still intercept; that + // raw value would then land in usage.jsonl and /api/logs behind a pattern-based redactor + // that does not recognize every credential family. The prefix is a value the operator + // configured, so no caller-controlled string is persisted. + logCtx.shadowCallRewrittenFrom = sanitizeLogMetadataString( + shadowSourceModelPrefix(_sciOriginal, _sci.sourceModels), + ); // Helpers must not resume/append into the parent thread's Cursor conversation. parsed._cursorIsolateConversation = true; } diff --git a/tests/responses-shadow-intercept.test.ts b/tests/responses-shadow-intercept.test.ts index 18ee9eb059..ce1b720b1e 100644 --- a/tests/responses-shadow-intercept.test.ts +++ b/tests/responses-shadow-intercept.test.ts @@ -152,6 +152,41 @@ describe("shadow call intercept request path (issue #311)", () => { expect(logCtx.shadowCallRewrittenFrom).toBe("gpt-5.6-luna"); }); + // The intercept matches by PREFIX, so a caller can append anything and still be intercepted. + // The recorded marker is persisted to usage.jsonl and served from /api/logs, and the runtime + // redactor is pattern-based: a credential family it does not recognize would survive verbatim. + // Recording the operator-configured prefix instead of the caller's raw string removes the + // class, rather than adding one more pattern to a deny-list. + test("the recorded marker is the configured prefix, never the caller's raw model string", async () => { + const logCtx: RequestLogContext = { model: "", provider: "" }; + globalThis.fetch = (async () => new Response(JSON.stringify({ + choices: [{ message: { role: "assistant", content: "ok" }, finish_reason: "stop" }], + usage: { prompt_tokens: 1, completion_tokens: 1 }, + }), { status: 200, headers: { "content-type": "application/json" } })) as typeof fetch; + + // A Google-shaped key: the runtime redactor has no rule for this family, and the newline + // is stripped before redaction runs, so the old code persisted this string intact. + const smuggled = "gpt-5.6-luna\nAIzaSyA1B2C3D4E5F6G7H8I9J0K1L2M3N4O5P6"; + await post(interceptConfig(), smuggled, "turn", logCtx); + + expect(logCtx.shadowCallRewrittenFrom).toBe("gpt-5.6-luna"); + expect(logCtx.shadowCallRewrittenFrom ?? "").not.toContain("AIza"); + }); + + test("a configured non-default prefix is recorded as itself", async () => { + const logCtx: RequestLogContext = { model: "", provider: "" }; + globalThis.fetch = (async () => new Response(JSON.stringify({ + choices: [{ message: { role: "assistant", content: "ok" }, finish_reason: "stop" }], + usage: { prompt_tokens: 1, completion_tokens: 1 }, + }), { status: 200, headers: { "content-type": "application/json" } })) as typeof fetch; + + const config = interceptConfig(); + config.shadowCallIntercept = { enabled: true, model: "grok-4.5", sourceModels: ["gpt-5.4-mini"] }; + await post(config, "gpt-5.4-mini-2024-07-18", "turn", logCtx); + + expect(logCtx.shadowCallRewrittenFrom).toBe("gpt-5.4-mini"); + }); + test("leaves gpt-5.6-terra requests unrewritten", async () => { let sawFetch = false; globalThis.fetch = (async () => { From b8710a72c1776372889280c599a3f89cf7675383 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 12:53:51 +0900 Subject: [PATCH 69/88] fix(auth): key admission-bearer substitution on transport, not provider name An admission bearer is one of OUR secrets. The contract in src/codex/auth-context.ts is that it is either replaced with the stored main credential or the request fails before any I/O -- it must never reach an upstream. #2132 correctly stopped requiring a ChatGPT credential for routed providers, but it asked the question by provider NAME: codexAccountMode comes from providerCodexAccountMode, which special-cases the id "openai". The passthrough adapter asks the same question by TRANSPORT: isCanonicalOpenAiForwardProvider reads adapter, auth mode, and base URL, and when it says yes it copies the caller's Authorization header upstream. A provider row named anything else, pointed at the canonical ChatGPT backend with authMode "forward", satisfies the adapter and fails the name check. Substitution was skipped and the admission secret was forwarded to ChatGPT. Reproduced through the real adapter: URL: https://chatgpt.com/backend-api/codex/responses AUTH: Bearer ocx_data_this_is_our_proxy_key Substitution now consults the same authority the adapter does, so the transport that actually carries the header is what decides. A key-authenticated routed provider is still not canonical-forward, so the install #2132 was filed for keeps working without a ChatGPT login. The two new tests assert the invariant rather than the implementation: an admission bearer never reaches the wire for a canonical transport, whatever the row is called. --- src/server/responses/core.ts | 14 +++- .../bearer-admission-routed-provider.test.ts | 70 +++++++++++++++++++ 2 files changed, 82 insertions(+), 2 deletions(-) diff --git a/src/server/responses/core.ts b/src/server/responses/core.ts index 121fa93fe3..def443de65 100644 --- a/src/server/responses/core.ts +++ b/src/server/responses/core.ts @@ -1165,9 +1165,19 @@ async function resolveResponsesCodexAuth( // and can consume that credential; a key-authenticated routed provider carries its own and // never touches it. Keying on the caller alone made an install that deliberately never // logged into ChatGPT fail every routed request with "No usable Codex main credential". - // `codexAccountMode` is set only for the native openai row, which is exactly that test. + // + // But ask that question the way the ADAPTER asks it. `codexAccountMode` is derived from the + // provider NAME (`providerCodexAccountMode`), while the passthrough adapter decides whether + // to forward caller credentials from the TRANSPORT — adapter, auth mode, and base URL + // (`isCanonicalOpenAiForwardProvider`). A row the operator named anything other than + // `openai`, pointed at the canonical ChatGPT backend with `authMode: "forward"`, satisfies + // the adapter's test and fails this one, so substitution was skipped and the adapter then + // forwarded our own admission secret upstream. Two predicates answering one question is the + // bug; the transport is the authority, because the transport is what actually carries the + // header. A key-authenticated routed provider is still not canonical-forward, so #2132's + // no-ChatGPT-login install keeps working. const substituteMainCredential = options.admission?.source === "bearer" - && route.codexAccountMode !== undefined; + && (route.codexAccountMode !== undefined || isCanonicalOpenAiForwardProvider(route.provider)); if (route.codexAccountMode === "direct" && !substituteMainCredential) { validateForwardAdmissionCredential(req.headers, config); } diff --git a/tests/bearer-admission-routed-provider.test.ts b/tests/bearer-admission-routed-provider.test.ts index 2baa300393..be4449c144 100644 --- a/tests/bearer-admission-routed-provider.test.ts +++ b/tests/bearer-admission-routed-provider.test.ts @@ -186,3 +186,73 @@ describe("#2132 bearer admission does not require a ChatGPT credential for route }); }); +/** + * The predicate above must be keyed on TRANSPORT, not on the provider's name. + * + * `codexAccountMode` comes from `providerCodexAccountMode`, which special-cases the id + * `openai`. The passthrough adapter decides whether it may forward caller credentials from + * `isCanonicalOpenAiForwardProvider` — adapter, auth mode, and base URL. A row the operator + * named anything else, pointed at the canonical ChatGPT backend, satisfies the adapter's test + * and fails the name-based one. Substitution was therefore skipped and the adapter forwarded + * our own admission secret to ChatGPT. + * + * These assert the invariant rather than the implementation: an admission bearer must never + * reach the wire, whatever the row is called. + */ +describe("an admission bearer never reaches a canonical ChatGPT transport, whatever the row is named", () => { + function customNamedCanonicalConfig(): OcxConfig { + const base = mixedConfig(); + return { + ...base, + defaultProvider: "mirror", + providers: { + ...base.providers, + // Same adapter, same authMode, same canonical base URL as the `openai` row above. + // Only the name differs — and the name is not what carries the header upstream. + mirror: { + adapter: "openai-responses", + baseUrl: "https://chatgpt.com/backend-api/codex", + authMode: "forward", + defaultModel: "gpt-5.6-luna", + }, + }, + } as OcxConfig; + } + + test("with no stored credential it fails closed instead of forwarding our secret", async () => { + saveConfig(customNamedCanonicalConfig()); + writeFileSync(join(codexHome, "auth.json"), JSON.stringify({ tokens: {} })); + + const server = startServer(0); + try { + const response = await postResponses(server.url, "mirror/gpt-5.6-luna"); + + // Fail-before-I/O is the contract (src/codex/auth-context.ts): the only two acceptable + // outcomes for an admission bearer are replaced-with-stored-main, or refused. Reaching + // upstream at all with our secret in hand is the failure this pins. + expect(nativeAuth.join("|")).not.toContain(ADMISSION_SECRET); + expect(response.status).not.toBe(200); + } finally { + await server.stop(true); + } + }); + + test("with a stored credential the stored one is what goes upstream", async () => { + saveConfig(customNamedCanonicalConfig()); + const stored = liveJwt(); + writeFileSync( + join(codexHome, "auth.json"), + JSON.stringify({ tokens: { access_token: stored, account_id: "stored_main_acc" } }), + ); + + const server = startServer(0); + try { + await postResponses(server.url, "mirror/gpt-5.6-luna"); + + expect(nativeAuth.join("|")).not.toContain(ADMISSION_SECRET); + for (const sent of nativeAuth) expect(sent).toBe(`Bearer ${stored}`); + } finally { + await server.stop(true); + } + }); +}); From 8cde9970b6d7fe39ccf564719d8cac71b9bedef4 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 13:05:39 +0900 Subject: [PATCH 70/88] fix(guards): close the core/Lab directory bypass and the release dry-run dead end Two false-confidence defects found while auditing main..dev. Neither came from that range; both are mechanisms the range is relying on. The core/Lab guard matched only specifiers containing "/lab/". Since src/lab/index.ts exists, `import("../lab")` resolves to the Lab entrypoint while matching none of its three patterns: source : void import("../lab"); Guard 1 detects : false The self-test that claims to protect the guard re-declared its own copy of the regex, so it proved a local literal behaved rather than that the guard did -- a copy cannot fail when the original drifts. The predicate is now a single shared function that both the guard and its self-test call, and it matches the bare directory specifier. The release helper's documented "re-run with --publish" path could never complete. A dry run bumps, commits, and pushes the version deliberately, so the second invocation hits `npm version ` and exits "Version not changed" before dispatching anything. The bump and the push are now treated as a desired end state rather than as actions that must happen every time, so the second run reuses the release commit the first one made. --- scripts/release.ts | 35 +++++++++++++++++++++------ tests/core-lab-boundary.test.ts | 42 ++++++++++++++++++++++++--------- 2 files changed, 59 insertions(+), 18 deletions(-) diff --git a/scripts/release.ts b/scripts/release.ts index c4048b8167..e61bc22a8e 100644 --- a/scripts/release.ts +++ b/scripts/release.ts @@ -380,15 +380,36 @@ console.log("→ privacy scan"); await runLoud(["bun", "run", "privacy:scan"]); // 2. Bump package.json only; the workflow creates the version tag after npm publish. -console.log(`→ bump package.json → ${version}`); -await runLoud(["npm", "version", version, "--no-git-tag-version"]); +// +// A dry run bumps and pushes exactly like a real one, because the point of the dry run is to +// exercise the workflow against the REAL release commit. That makes the second invocation +// re-enter with package.json already at `version`, where `npm version ` exits +// "Version not changed" — so the documented "re-run with --publish" path could never +// complete. Treat an already-correct version as satisfied rather than as an error: the +// bump is a desired end state, not an action that must happen every time. +const currentVersion = JSON.parse(await Bun.file("package.json").text()).version as string; +if (currentVersion === version) { + console.log(`→ package.json already at ${version}; leaving it alone`); +} else { + console.log(`→ bump package.json → ${version}`); + await runLoud(["npm", "version", version, "--no-git-tag-version"]); +} -// 3. Commit + push the version bump. -await runLoud(["git", "add", "package.json"]); -await runLoud(["git", "commit", "-m", `release: v${version}`]); +// 3. Commit + push the version bump — only if it is not already committed and pushed. On the +// --publish re-run of a dry run there is nothing to commit, and `git commit` with an empty +// index fails, which would strand the release just as surely as the bump did. +const pendingBump = (await capture(["git", "status", "--porcelain", "package.json"])).trim() !== ""; +if (pendingBump) { + await runLoud(["git", "add", "package.json"]); + await runLoud(["git", "commit", "-m", `release: v${version}`]); +} const releaseSha = await capture(["git", "rev-parse", "HEAD"]); -console.log(`→ push origin ${branch}`); -await runLoud(["git", "push", "origin", branch]); +if (pendingBump) { + console.log(`→ push origin ${branch}`); + await runLoud(["git", "push", "origin", branch]); +} else { + console.log(`→ release commit ${releaseSha.slice(0, 9)} already pushed; reusing it`); +} // 4. Wait for the pushed release commit to pass CI, then dispatch the Release workflow. console.log(`→ wait for Cross-platform CI (${releaseSha})`); diff --git a/tests/core-lab-boundary.test.ts b/tests/core-lab-boundary.test.ts index 333ce8fb0b..fd9db180ac 100644 --- a/tests/core-lab-boundary.test.ts +++ b/tests/core-lab-boundary.test.ts @@ -100,16 +100,29 @@ function firstLabPath(entry: string): string[] | null { return null; } +/** + * Guard 1's predicate, defined ONCE so the test that claims to protect it actually calls it. + * + * It previously lived inline in the assertion while the self-test below re-declared its own + * copy of the regex — so the self-test proved a local literal behaved, not that the guard did. + * A copy cannot fail when the original drifts, which is the specific way a guard rots. + * + * The trailing-slash forms are not sufficient either: `src/lab/index.ts` exists, so + * `import("../lab")` resolves to the Lab entrypoint while matching none of them. The + * directory specifier is matched explicitly. + */ +export function namesLabDirectly(source: string): boolean { + return /^\s*(?:import|export)\s+(?!type\b)[^;]*?["'][^"']*\/lab(?:\/|["'])/m.test(source) + || /^\s*import\s+["'][^"']*\/lab(?:\/|["'])/m.test(source) + // A protected file may lazily reach Lab through a handler it imports, but must not + // name Lab itself -- not even dynamically, and not as a bare directory. + || /\bimport\s*\(\s*["'][^"']*\/lab(?:\/|["'])/.test(source); +} + describe("core / Compatibility Lab boundary", () => { // Guard 1: the obvious case, a direct import. test.each(PROTECTED)("%s has no direct src/lab import", file => { - const source = readFileSync(resolve(repoRoot, file), "utf8"); - const direct = /^\s*(?:import|export)\s+(?!type\b)[^;]*?["'][^"']*\/lab\//m.test(source) - || /^\s*import\s+["'][^"']*\/lab\//m.test(source) - // A protected file may lazily reach Lab through a handler it imports, but must not - // name Lab itself -- not even dynamically. - || /\bimport\s*\(\s*["'][^"']*\/lab\//.test(source); - expect(direct).toBe(false); + expect(namesLabDirectly(readFileSync(resolve(repoRoot, file), "utf8"))).toBe(false); }); // Guard 2: the case that actually caused this work. The original defect reached Lab @@ -156,11 +169,18 @@ describe("boundary guard cannot be defeated", () => { // -- lazy loading is the remedy, not the defect. Guard 1 is what stops a protected file // from naming Lab dynamically, so the coverage moves there rather than disappearing. test("guard 1 forbids a direct dynamic Lab import in a protected file", () => { - const direct = (source: string) => /\bimport\s*\(\s*["'][^"']*\/lab\//.test(source); - expect(direct('void import("../lab/paths");')).toBe(true); - expect(direct('const m = await import("./management/lab-routes");')).toBe(false); + // Calls the SAME predicate the guard uses, so a drift in one cannot pass in the other. + expect(namesLabDirectly('void import("../lab/paths");')).toBe(true); + // A bare directory specifier resolves to src/lab/index.ts and must be caught too -- + // matching only `/lab/` left this shape as a silent way through. + expect(namesLabDirectly('void import("../lab");')).toBe(true); + expect(namesLabDirectly('import "../lab";')).toBe(true); + expect(namesLabDirectly('import { x } from "../lab";')).toBe(true); + // A module whose NAME merely contains "lab" is not Lab. + expect(namesLabDirectly('const m = await import("./management/lab-routes");')).toBe(false); + expect(namesLabDirectly('import { x } from "./collaboration";')).toBe(false); for (const file of PROTECTED) { - expect(direct(readFileSync(resolve(repoRoot, file), "utf8"))).toBe(false); + expect(namesLabDirectly(readFileSync(resolve(repoRoot, file), "utf8"))).toBe(false); } }); From 0637a35487f968aeddd8c2c2e032789fa5cc15fc Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 13:07:08 +0900 Subject: [PATCH 71/88] docs(devlog): record the main..dev release-safety audit and its three fixes --- .../100_release_safety_audit.md | 123 ++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 devlog/_plan/260820_bug_pr_backlog_consolidation/100_release_safety_audit.md diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/100_release_safety_audit.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/100_release_safety_audit.md new file mode 100644 index 0000000000..2152c743d2 --- /dev/null +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/100_release_safety_audit.md @@ -0,0 +1,123 @@ +# 100 — Release-safety audit of `main..dev` + +Unit: 260820_bug_pr_backlog_consolidation +Range audited: `origin/main` `8e01dd4e8` → `origin/dev`, 92 commits / 22 merges / 109 files. + +Most of this range landed in one admin-override merge run hours earlier. It had never been +read as a single body of work, which is the only reason this audit is worth its cost: a merge +run answers "does each PR pass" and this answers "is the result shippable". + +Four passes, four read-only lanes plus direct verification in the main agent. Every finding +below was reproduced before it was fixed; nothing was patched on a lane's word alone. + +## 1. Security boundary — ONE REAL LEAK, FIXED + +**An admission bearer reached ChatGPT.** `#2169`. + +Two predicates were answering one security question with different inputs: + +| Question | Predicate | Keyed on | +|---|---|---| +| "must we substitute the stored credential?" | `route.codexAccountMode !== undefined` | provider **name** | +| "may we forward the caller's Authorization?" | `isCanonicalOpenAiForwardProvider` | adapter + authMode + **base URL** | + +A provider row named anything other than `openai`, pointed at the canonical ChatGPT backend +with `authMode: "forward"`, satisfies the second and fails the first. Substitution was skipped +and the adapter forwarded our own proxy secret. Reproduced through the real adapter: + +``` +URL: https://chatgpt.com/backend-api/codex/responses +AUTH: Bearer ocx_data_this_is_our_proxy_key +LEAKED: true +``` + +This violates the contract stated in `src/codex/auth-context.ts`: an admission bearer is +replaced with the stored main credential or the request fails before any I/O. Substitution now +consults the same authority the adapter does. + +Worth recording how nearly this was missed: **two of three lanes classified #2137 SOUND.** One +of them read `openai-responses.ts:1451` and concluded "only the canonical ChatGPT destination +may relay caller credentials" — true, and exactly the problem, because canonical-ness is +decided by URL while substitution was decided by name. A correct observation, a wrong verdict. +The majority was wrong and the minority had a reproduction; the reproduction won. + +**Recorded, deliberately not patched:** #2148 lets an OAuth bearer reach any operator-configured +HTTPS host, with no vendor allowlist. Both lanes agree this is operator authorization by +definition and it is the stated point of the PR. It is a WEAKENED-by-design boundary, not a +defect, and narrowing it is a product decision rather than an audit fix. + +## 2. Cross-PR interaction — PASS + +The merge run already proved this defect class exists here (the id backfill mutated the compact +endpoint's wire format; neither branch failed alone). A dedicated hunt over 21 same-file overlap +pairs plus cross-file wire/predicate overlaps found no second instance. 366 pass / 0 fail across +13 composed files. + +## 3. Default-install behavior — PASS + +Every ungated change traces to the fix that intended it. Specifically checked, because these +were the plausible accidents: + +- AgentRouter framing fires only for `agentrouter.org` and its real subdomains. +- `opencode-free` is the only registry row with `staticHeaders`, so no other provider's headers moved. +- The shell hook now installs **less** often than before, not more — it is gated on an installed CLI. +- The tool-catalog nudge is byte-identical in this range. + +One documented side effect: #2146's cold entitlement lookup adds an authenticated `/models` +fetch during catalog sync. Bounded, fail-closed, and no credentials means no fetch. + +## 4. Repository invariants — PASS, with TWO GUARD DEFECTS FIXED + +The invariants themselves hold: core reaches no Lab path from any of the three protected roots +(192 / 101 / 344 modules walked, dynamic edges followed), zero gitlinks, zero vendored clones, +privacy signature scan clean. + +But two of the mechanisms we rely on were quietly broken. `#2171`. + +**The core/Lab guard had a directory bypass.** It matched only `/lab/`, and `src/lab/index.ts` +exists — so `import("../lab")` resolves to the Lab entrypoint and matched nothing: + +``` +source : void import("../lab"); +Guard 1 detects : false +``` + +The self-test that claims to protect the guard re-declared its own copy of the regex. A copy +cannot fail when the original drifts, which is precisely how a guard rots while looking green. +Both now call one shared predicate. + +**The release helper's documented path could never complete.** A dry run bumps, commits, and +pushes deliberately, so the `--publish` re-run it instructs you to do hits +`npm version ` and exits `Version not changed` before dispatching. The bump and +push are now a desired end state rather than mandatory actions. + +Neither defect came from this range. Both would have been trusted by the next release. + +## Contributor PR merged during the audit + +`#2167` (@ntdatt812) — a background `/wham/usage` 200 was retracting a reauth quarantine that +Responses traffic had set. A 200 from the usage endpoint proves the token authenticates *there*; +it does not prove the account can serve Responses, which still answers 403 for a workspace the +token can no longer select. The account went straight back into rotation, failed identically, +and re-quarantined — so `needsReauth` never settled. Correct diagnosis, correct fix, and it +pins both directions. + +## Coverage limits, stated rather than implied + +`privacy:scan` is a **signature** scan. It detects `/Users//` paths, email shapes, long +`Bearer` literals, and selected `sk-`/`ghp_`/JWT forms in tracked text files. It does not see +`/home/...` paths, arbitrary key prefixes, short secrets, runtime dataflow, `usage.jsonl` +contents, or whether a new log field carries PII at runtime. A green scan is evidence about +literals in the tree, not about behavior. + +## Verdict + +The range is shippable **after** #2169. Before it, a specific configuration leaked a proxy +credential to a third party, and no test would have caught it. + +Version line on `dev` is `2.27.0`, equal to the published `latest` and the `v2.27.0` tag on +`main` — the release helper takes the next version as an argument, so this is the expected +pre-release state, not a half-finished bump. + +This remains a readiness record. No release was executed. + From 8e2d42bcd1e57217082b60e86f8897d9548b9842 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 13:15:26 +0900 Subject: [PATCH 72/88] fix(responses): give tool_search_call and custom_tool_call their own id prefixes The release audit found this by composing two changes that are each correct alone. A routed tool_search lowering is restored as a tool_search_call with no id (#2145), and the universal output-item id backfill then names it (#2142) -- but the backfill's prefix table had no entry for the type, so it fell through to the generic "item_". That is not cosmetic. stripInvalidItemIds in the Responses adapter deletes any id whose prefix does not match its type, and it lists tsc_ as the only valid prefix for tool_search_call. So the synthesized id survived the turn it was created in and was silently dropped on the next one, leaving the client an item it could not correlate. Neither PR's focused suite caught it because neither composes missing-id restoration with the backfill. custom_tool_call had the same gap and is fixed with it: the serializer enforces ctc_, the backfill did not know the type. --- .../responses/responses-field-backfill.ts | 8 +++++ tests/responses-field-backfill.test.ts | 30 +++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/src/server/responses/responses-field-backfill.ts b/src/server/responses/responses-field-backfill.ts index 4d67531020..32cf727891 100644 --- a/src/server/responses/responses-field-backfill.ts +++ b/src/server/responses/responses-field-backfill.ts @@ -34,6 +34,14 @@ const ITEM_ID_PREFIXES: Readonly> = { message: "msg_", reasoning: "rs_", function_call: "fc_", + custom_tool_call: "ctc_", + // A routed tool_search lowering is restored to `tool_search_call` without an id, so this + // backfill is what names it. The generic `item_` fallback is not merely cosmetic here: + // `stripInvalidItemIds` in the Responses adapter deletes any id whose prefix does not match + // the type, so an `item_`-named tool_search_call silently loses its id on the NEXT turn and + // the client sees an item it cannot correlate. The prefixes here must stay a superset of the + // ones that serializer enforces. + tool_search_call: "tsc_", web_search_call: "ws_", file_search_call: "fs_", code_interpreter_call: "ci_", diff --git a/tests/responses-field-backfill.test.ts b/tests/responses-field-backfill.test.ts index f6fb63bae3..f4ac338b69 100644 --- a/tests/responses-field-backfill.test.ts +++ b/tests/responses-field-backfill.test.ts @@ -365,6 +365,36 @@ describe("responses-field-backfill", () => { expect(result.output[0]!.id).toBe("ig_ocx_0"); }); + // A routed tool_search lowering is restored as `tool_search_call` with no id, so this + // backfill names it. The generic `item_` fallback was not cosmetic: `stripInvalidItemIds` + // in the Responses adapter deletes an id whose prefix does not match its type, so the item + // silently lost its id on the NEXT turn and the client could no longer correlate it. + test("tool_search_call gets the prefix the request serializer accepts", () => { + const response = { + id: "resp_1", + object: "response", + status: "completed", + output: [{ type: "tool_search_call", call_id: "call_x", execution: "client" }], + }; + const result = JSON.parse(backfillResponsesFieldsJson(JSON.stringify(response))) as { + output: { id: string }[]; + }; + expect(result.output[0]!.id).toBe("tsc_ocx_0"); + }); + + test("custom_tool_call gets its own prefix too", () => { + const response = { + id: "resp_1", + object: "response", + status: "completed", + output: [{ type: "custom_tool_call", call_id: "call_y" }], + }; + const result = JSON.parse(backfillResponsesFieldsJson(JSON.stringify(response))) as { + output: { id: string }[]; + }; + expect(result.output[0]!.id).toBe("ctc_ocx_0"); + }); + // A malformed `output_index` falls back to a counter. While that counter lived in the same // numeric namespace as real indexes, a response whose real index reached the counter's base // produced the SAME id as a fallback — a duplicate, which is the one thing this backfill From bf5b35c84d46114bc3de9b78ddad82672ad6f1ed Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 13:24:58 +0900 Subject: [PATCH 73/88] docs(devlog): record the release-safety audit of the main..dev range --- .../100_release_audit.md | 163 ++++++++++++++++++ 1 file changed, 163 insertions(+) create mode 100644 devlog/_plan/260820_bug_pr_backlog_consolidation/100_release_audit.md diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/100_release_audit.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/100_release_audit.md new file mode 100644 index 0000000000..a744a2e854 --- /dev/null +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/100_release_audit.md @@ -0,0 +1,163 @@ +# 100 — Release-safety audit of origin/main..origin/dev + +Unit: 260820_bug_pr_backlog_consolidation +Range: `8e01dd4e8..a584890f8` — 87 commits, 22 merges, 108 changed files. +Verification host: `ssh lidge:~/ci-wp3/opencodex`. Nothing heavy ran on the workstation. + +Most of this range landed hours earlier through an admin-override merge run, so it had never +been read as one body of work. Five passes, each with its own evidence. A pass that says "looks +fine" without its own artifact is not a pass. + +## Verdict + +**Ship-able after two fixes**, both of which are in this record with a RED-proven regression. +Neither was found by per-PR CI, and one of them could not have been: it only exists when two +independently-correct changes compose. + +## Pass 1 — security boundary (7 credential-touching PRs) + +| PR | Verdict | +|---|---| +| #2137 bearer admission | SAFE — narrows substitution. `admission.source === "bearer"` requires an exact match against `OPENCODEX_API_AUTH_TOKEN` or a configured key, so it is not caller-selectable by an unauthenticated party. | +| #2147 xAI OAuth 401 replay | SAFE — refresh is pinned to the rejected snapshot's account, one replay (an `if`, not a loop), refreshed token never logged. | +| #2149 OAuth commit ownership | SAFE — assertion runs under the lock with no `await` before persistence, fails closed, atomic 0600 rename. | +| #2164 OpenCode Go quota | SAFE — the widened predicate still requires exact URL + adapter + key auth, and the fetch ignores the configured URL entirely in favor of a compile-time constant with `redirect: "error"`. | +| #2166 shadow marker | **FINDING, FIXED** — see below. | +| #2146 entitlement discovery | FINDING, recorded not fixed — see "Deliberately left". | +| #2148 baseUrl override | FINDING, recorded not fixed — see "Deliberately left". | + +### FIXED — #2166: caller-controlled text reached a durable log + +The shadow-call intercept matches by **prefix**, so a caller can send `gpt-5.6-luna` plus +arbitrary trailing text and still be intercepted. The whole raw string was recorded as +`shadowCallRewrittenFrom`, which is persisted to `usage.jsonl` and served from `/api/logs`. + +The sanitizer on that path is not sufficient, for two independent reasons — both run against +the shipped code, not reasoned about: + +``` +"gpt-5.6-luna\nBearer sk-abc123def456ghi789jkl" -> "gpt-5.6-lunaBearer [REDACTED]" +"gpt-5.6-luna\nAIzaSyA1B2C3D4E5F6G7H8I9J0K1L2M3N4O5P6" -> unchanged, key intact +``` + +1. Control characters are stripped **before** redaction, so the newline that separated marker + from credential is gone by the time the `Bearer` rule looks for a word boundary. +2. The runtime redactor is a deny-list. An `AIza`-shaped Google key has no rule and survives. + +Fix (PR #2170): record the operator-configured prefix that matched, via +`shadowSourceModelPrefix()`. The field can then only hold a value the operator configured. +That removes the class instead of adding one more pattern to a deny-list — which matters, +because the next unrecognized credential family would reopen a pattern-based fix. + +RED proof: reverting the two source files fails exactly the two new tests, 15 pass / 2 fail. + +## Pass 2 — cross-PR interaction + +The shared-contract map found six files touched by 2+ PRs. Three interactions were reproduced; +two were already closed by the time of this audit, one was not. + +**Closed already, recorded for the history:** an admission bearer could escape through a +custom-named canonical transport, because #2137 decided substitution from the provider NAME +while the adapter recognized the same row by TRANSPORT. Two predicates answering one question. +Fixed by #2169, verified present at the current `dev` tip. + +**FIXED here — `tool_search_call` got the wrong id namespace.** #2145 restores a lowered +tool_search as `tool_search_call` with no id; #2142's universal backfill then names it. The +backfill's prefix table had no entry for the type, so it produced `item_ocx_0`: + +``` +{"type":"tool_search_call",...} -> id: "item_ocx_0" +{"type":"function_call",...} -> id: "fc_ocx_0" +``` + +Not cosmetic: `stripInvalidItemIds` deletes any id whose prefix does not match its type, and +it lists `tsc_` as the only valid prefix for that type. The id survived the turn that created +it and was silently dropped on the next one, leaving the client an item it could not correlate. +`custom_tool_call` had the identical gap. Fix: PR #2173, with the superset invariant between +the two tables written at the table. + +Both PRs' focused suites pass in isolation — neither composes restoration with backfill. This +is the whole argument for a cross-PR pass existing. + +**No interaction found**, each with its reason: #2160 static headers × #2148 overrides (neither +overridden provider has static headers); #2160 × #2164 (opencode-go owns no static headers); +#2166 log field × #2147 tier writers (independent fields, no last-writer overwrite); #2151 × +#2165 (request construction vs request-local parseStream state, no shared lifecycle); #2138 × +#2145 (canonical-forward vs noncanonical, activation sets do not intersect); #2149 × #2147 +(both account- and generation-guarded). + +## Pass 3 — default-install wire/behavior regression + +**PASS.** Byte-identical on both revisions for: OpenAI-compatible key provider, direct Anthropic +key provider, Google AI Studio, plain native Chat, unsupported caller `service_tier`, caller +reasoning `high`. Verified by SHA-256 over the built request. + +Six differences found, every one attributed to an intending PR: AgentRouter framing (#2162, +exact-host gated — a non-AgentRouter Anthropic request is byte-identical), `opencode-free` +static headers (#2160, the only registry row with them), `service_tier: priority` on an exact +Fast-capable model (#2151), `prompt_cache_retention` removal on canonical GPT-5.6 (#2138), +tool_search lowering on noncanonical upstreams (#2145), xAI OAuth Responses routing (#2147). + +`shadowCallRewrittenFrom` appears in `usage.jsonl` only when the explicitly-enabled shadow gate +matches; an ordinary request writes the same key set as before. + +## Pass 4 — repository invariants + +All green on `ssh lidge`: `tests/core-lab-boundary.test.ts` + `tests/repo-hygiene.test.ts` +24 pass / 0 fail; `bun run privacy:scan` passed; `bun x tsc --noEmit` exit 0; no `160000` +gitlink in the tree; no `src/lab/` file changed in the range and every protected core path +stayed transitively Lab-free. + +## Pass 5 — release mechanics + +Version line `2.27.0` on both `main` and `dev` — coherent, and this campaign did not move it. +No half-finished migration found. No behavior observed that depends on a particular branch +being checked out. + +## Deliberately left — not fixed, recorded with the reason + +**#2146 — entitlement discovery uses more accounts than the request needs.** An authenticated +`/v1/models`, or any account-gated request, enumerates main plus every pool row with a +syntactically valid id and queries each one's credential concurrently. A request bound to +account B can therefore cause account A's token to be refreshed, persisted, and sent to ChatGPT +discovery. Paused and needs-reauth accounts are not excluded. + +Each token stays paired with its own `chatgptAccountId`, so this is not credential +misbinding, and no token reaches a log or the cache (only model sets and SHA-256 fingerprints). +It is excessive credential use with a cross-account side effect. Narrowing the candidate set to +the accounts a request actually needs is a product decision about what `/v1/models` is meant +to enumerate — that is a NEEDS_HUMAN call, not something to infer from the code. + +**#2148 — an old config silently activates on upgrade.** `allowBaseUrlOverride` is registry-only +and never persisted, and the router honors any already-saved resolved `baseUrl` the moment the +flag appears. Reproduced: + +``` +routedProviderConfig("anthropic", {baseUrl:"https://relay.example.com/v1"}) -> honored +routedProviderConfig("google-antigravity", {baseUrl:"https://relay.example.com/v1"}) -> honored +``` + +So a custom URL that older releases accepted and ignored starts receiving the OAuth bearer +after upgrade, with no consent step. The transport gate does hold: public cleartext HTTP is +refused for these providers, and URL userinfo is rejected at config validation. + +Scope, measured rather than assumed: this range newly opts in exactly **two** providers +(`anthropic`, `google-antigravity`). Thirteen others already had the flag on `main`, so the +upgrade-activation shape is pre-existing behavior, not introduced here. Whether it needs a +persisted consent marker or a release note is a product decision. + +**link-local / unspecified addresses under `allowPrivateNetwork`.** `https://169.254.1.1` and +`https://0.0.0.0` are permitted when the flag is set, which reads oddly against the policy +comment. Confirmed **pre-existing**: the classification and the waiver are both unchanged in +this range. Recorded so it is not rediscovered as new, but it is not this release's regression. + +## Fixes pushed + +| Finding | PR | RED proof | +|---|---|---| +| #2166 caller-controlled marker reaches usage.jsonl and /api/logs | #2170 | 15 pass / 2 fail with the fix reverted | +| tool_search_call / custom_tool_call id namespace | #2173 | 20 pass / 2 fail with the fix reverted | + +Full suite at the tip carrying both: **13717 pass / 15 skip / 0 fail** across 866 files; +typecheck exit 0; privacy scan passed. All on `ssh lidge`. + From 35ab42b627d4e1d0eb7bc769d688f5bcb9a38827 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 13:29:55 +0900 Subject: [PATCH 74/88] fix(devlog): unbreak privacy:scan on dev The audit record committed in 0637a3548 pasted a reproduction transcript containing a literal "Bearer " line. scripts/privacy-scan.ts matches that shape regardless of whether the value is a real credential, so dev's own release gate has been failing since that commit -- and it fails for every PR branched from dev, not just for the file that introduced it. The value was a placeholder from a local reproduction, not a real secret, but the scanner cannot know that and should not have to. Describing the header instead of pasting it keeps the finding legible and the gate green. --- .../100_release_safety_audit.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/100_release_safety_audit.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/100_release_safety_audit.md index 2152c743d2..8ee286d849 100644 --- a/devlog/_plan/260820_bug_pr_backlog_consolidation/100_release_safety_audit.md +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/100_release_safety_audit.md @@ -27,7 +27,7 @@ and the adapter forwarded our own proxy secret. Reproduced through the real adap ``` URL: https://chatgpt.com/backend-api/codex/responses -AUTH: Bearer ocx_data_this_is_our_proxy_key +AUTH: Bearer LEAKED: true ``` @@ -120,4 +120,3 @@ Version line on `dev` is `2.27.0`, equal to the published `latest` and the `v2.2 pre-release state, not a half-finished bump. This remains a readiness record. No release was executed. - From 025dfcb9d9b50c080b8d4d513d7973913caed904 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 14:32:01 +0900 Subject: [PATCH 75/88] docs(devlog): close the release audit with the merged fixes and the verified dev state --- .../100_release_audit.md | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/100_release_audit.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/100_release_audit.md index a744a2e854..12a5f9fcaf 100644 --- a/devlog/_plan/260820_bug_pr_backlog_consolidation/100_release_audit.md +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/100_release_audit.md @@ -161,3 +161,34 @@ this range. Recorded so it is not rediscovered as new, but it is not this releas Full suite at the tip carrying both: **13717 pass / 15 skip / 0 fail** across 866 files; typecheck exit 0; privacy scan passed. All on `ssh lidge`. + +## Closeout — the fixes are on dev + +All four landed in dependency order. The order was forced, not chosen: `privacy:scan` runs in +the `gates` job, so while `dev` itself was failing it, every branch cut from `dev` inherited +the failure. #2173 was red for exactly that reason and went green once #2175 landed. + +| PR | dev merge commit | What it fixes | +|---|---|---| +| #2175 | `5bcc91d0e` | the broken `privacy:scan` gate on `dev` itself | +| #2170 | `9eb6647d5` | caller-controlled marker reaching `usage.jsonl` and `/api/logs` | +| #2173 | `b2878f8e8` | `tool_search_call` / `custom_tool_call` id namespace | +| #2174 | `12c14d5c3` | this audit record | + +Verified at the `dev` tip on `ssh lidge`: + +- `bun run test` — **13719 pass / 15 skip / 0 fail** across 866 files. +- `bun x tsc --noEmit` — exit 0. +- `bun run privacy:scan` — passed. It **failed** on `dev` before #2175, which is the whole + reason that PR exists. +- GitHub CI run `32334852749` — completed **success** at `b2878f8e8`, the commit carrying both + code fixes. `12c14d5c3` above it is docs-only. +- Fixes present in `dev` source, not just in a merge commit: `shadowSourceModelPrefix` ×1, + `tool_search_call` ×3. + +The three findings under "Deliberately left" are unchanged and still open questions. Nothing in +this closeout resolves them; they need a product decision, not a patch. + +Release execution remains unauthorized: no `scripts/release.ts`, no publish, no tag, no change +to `main` or `preview`. + From fabc448f6643f2b962b59e6235a92ff5c6130488 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 14:36:23 +0900 Subject: [PATCH 76/88] fix(devlog): stop the audit record from breaking its own privacy gate The record documenting the shadow-marker leak pasted the reproduction transcript verbatim, including an sk-shaped value after a Bearer label. scripts/privacy-scan.ts matches those patterns wherever they appear, so dev's gates job went red again -- the same failure #2175 had just undone, reintroduced by the write-up describing it. The scanner cannot tell a fake credential from a real one, and it should not have to. Writing the two cases as shapes keeps the finding legible: the point was never the literal bytes, it was that controls are stripped before redaction and that the deny-list has no rule for one of the families. Both survive the rewrite. --- .../100_release_audit.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/100_release_audit.md b/devlog/_plan/260820_bug_pr_backlog_consolidation/100_release_audit.md index 12a5f9fcaf..f90fbc99a8 100644 --- a/devlog/_plan/260820_bug_pr_backlog_consolidation/100_release_audit.md +++ b/devlog/_plan/260820_bug_pr_backlog_consolidation/100_release_audit.md @@ -36,10 +36,15 @@ The sanitizer on that path is not sufficient, for two independent reasons — bo the shipped code, not reasoned about: ``` -"gpt-5.6-luna\nBearer sk-abc123def456ghi789jkl" -> "gpt-5.6-lunaBearer [REDACTED]" -"gpt-5.6-luna\nAIzaSyA1B2C3D4E5F6G7H8I9J0K1L2M3N4O5P6" -> unchanged, key intact +"\n" -> control stripped, value redacted +"\n" -> control stripped, value INTACT ``` +(Written as shapes rather than literals on purpose: `scripts/privacy-scan.ts` matches those +patterns wherever they appear, so pasting a real-looking transcript breaks the `gates` job for +every branch cut from `dev`. That is precisely what #2175 had to undo, and this record +reintroduced it — the scanner does not care that a credential is fake.) + 1. Control characters are stripped **before** redaction, so the newline that separated marker from credential is gone by the time the `Bearer` rule looks for a word boundary. 2. The runtime redactor is a deny-list. An `AIza`-shaped Google key has no rule and survives. @@ -191,4 +196,3 @@ this closeout resolves them; they need a product decision, not a patch. Release execution remains unauthorized: no `scripts/release.ts`, no publish, no tag, no change to `main` or `preview`. - From 2e1c211e96bcf7fd7edfcd2c96799a37ef5dbb88 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 14:52:39 +0900 Subject: [PATCH 77/88] fix(ci): give the Windows leg the budgets and the crash retry it never had Six shard failures in three groups (#2152). None came from main..dev; all three needed a different answer, and none of them was skipping a test that can actually run. Group 1, budgets. watchdogMs is a FLOOR, not a multiplier, so a case calling watchdogMs(30_000) still got exactly 30s -- 'Restore truth' failed at 30,147ms. Windows CI now floors at 45s, under the lane's own 60s per-test timeout so a hung test stays bounded. 'A-reduced' was misread in the issue: its 79,978ms was elapsed time against a 150s ceiling, so the outer budget was never the constraint. The real failure was Fixture.request's unscaled 10s AbortSignal, which aborted the case from inside. It is scaled now like every neighbouring budget. 'E' does not start ocx at all. Its lock holder released after a fixed 3s busy wait, and on a Windows shard the contender's process spawn can outlast that -- the parent then sees 'acquired' where it demands 'busy', which reads as a broken exclusion invariant rather than a hold that expired early. The release-marker handshake still ends the hold early everywhere else; only the ceiling moved. Group 2, skip guard. The issue says an unprivileged Windows user cannot create symlinks, but the GitHub runner can -- so canSymlink was true, the cases ran, and they failed on how the preflight reads mode and access through a Windows symlink. Two neighbouring cases in the same file already skip on process.platform === "win32"; these three now use that same guard, and keep the capability check for unprivileged POSIX. Group 3, crash retry. A Bun panic is a crash in the interpreter, not a test result. The macOS leg has carried a crash-signature retry for this; the Windows shards, a separate matrix job with their own one-shot command, had none. They now use the same wrapper, extended with panic(thread since that is the signature this leg actually printed. An assertion failure returns its status immediately and is never retried. What this cannot prove locally: whether 45s is sufficient under real Windows shard contention, the actual skip result on the runner, and PIPESTATUS behavior in Git Bash. Those need a Windows CI dispatch, which is the evidence to look for on this PR. --- .github/workflows/ci.yml | 26 +++++++++++++++++++++++- tests/codex-composed-acceptance.test.ts | 19 +++++++++++++++-- tests/helpers/ci-watchdog.ts | 9 +++++++- tests/helpers/codex-write-lock-child.ts | 8 +++++++- tests/update-npm-cache-preflight.test.ts | 20 +++++++++++++++--- 5 files changed, 74 insertions(+), 8 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 02344a0aa2..5872136ecf 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -611,7 +611,31 @@ jobs: # the only one left on Bun's 5s default, and it is the slowest hardware on the board. # Three of its failures were the default firing on tests that had not hung — the # composed-acceptance cases spawn a real `ocx start` and were still working at 41s. - run: bun test --isolate --timeout 60000 tests --shard=${{ matrix.shard }}/4 + # + # The retry is the same one the macOS leg already carries, for the same reason: a Bun + # runtime panic is a crash in the interpreter, not a test result, and failing the shard + # on it reports a defect this repository does not have (#2152). An ordinary assertion + # failure returns its status immediately — only the crash signatures below are retried, + # and only once, so a genuinely broken build cannot be retried into green. + shell: bash + run: | + set +e + set -uo pipefail + suite_log="$(mktemp -t ocx-windows-suite.XXXXXX)" + for attempt in 1 2; do + bun test --isolate --timeout 60000 tests --shard=${{ matrix.shard }}/4 2>&1 | tee "$suite_log" + suite_status="${PIPESTATUS[0]}" + if [ "$suite_status" -eq 0 ]; then + exit 0 + fi + if ! grep -Eqi 'oh no: Bun has crashed|Segmentation fault at address|Illegal instruction|Bus error|panic\(thread' "$suite_log"; then + echo "::error::Windows shard ${{ matrix.shard }}/4 failed on attempt ${attempt} (exit ${suite_status}); assertion failures are not retried." + exit "$suite_status" + fi + echo "::warning::Bun runtime crash in Windows shard ${{ matrix.shard }}/4 (exit ${suite_status}, attempt ${attempt})." + done + echo "::error::Bun runtime crash repeated on Windows shard ${{ matrix.shard }}/4; failing after one retry." + exit 1 - name: CLI help smoke run: bun run src/cli/index.ts help diff --git a/tests/codex-composed-acceptance.test.ts b/tests/codex-composed-acceptance.test.ts index ded130e17e..29950f68b1 100644 --- a/tests/codex-composed-acceptance.test.ts +++ b/tests/codex-composed-acceptance.test.ts @@ -266,7 +266,11 @@ class Fixture { runtime: RuntimeRecord, path: string, init: RequestInit = {}, - timeoutMs = 10_000, + // Scaled like every other budget in this file. This one was left unscaled, and it is what + // actually failed `A-reduced` on Windows: the case has a 150 s ceiling and reported ~80 s + // elapsed, so the outer budget was never the constraint — a single request hit this fixed + // 10 s AbortSignal and aborted the case from inside (#2152). + timeoutMs = watchdogMs(10_000), ): Promise<{ status: number; body: Record }> { const response = await fetch(`http://127.0.0.1:${runtime.port}${path}`, { ...init, @@ -619,7 +623,18 @@ describe("WP13 composed toggle acceptance", () => { const release = join(fx.root, "release"); const holder = Bun.spawn([process.execPath, lockChildPath], { cwd: repoRoot, - env: { ...fx.env(fx.homeA, fx.userprofileA), OCX_LOCK_CHILD_PAYLOAD: JSON.stringify({ timeoutMs: 5_000, holdMarker: held, releaseMarker: release }) }, + // The hold has to outlast the contender's process spawn, which is the slow part on a + // Windows shard. The release marker below still ends it early everywhere else, so this + // is a ceiling rather than a sleep the test pays for. + env: { + ...fx.env(fx.homeA, fx.userprofileA), + OCX_LOCK_CHILD_PAYLOAD: JSON.stringify({ + timeoutMs: 5_000, + holdMarker: held, + releaseMarker: release, + holdMs: watchdogMs(3_000), + }), + }, stdout: "pipe", stderr: "pipe", }); fx.children.push(holder); diff --git a/tests/helpers/ci-watchdog.ts b/tests/helpers/ci-watchdog.ts index f09713dc98..a794d7fe3e 100644 --- a/tests/helpers/ci-watchdog.ts +++ b/tests/helpers/ci-watchdog.ts @@ -11,7 +11,14 @@ * hung test, not to assert latency. Local behaviour is unchanged. Bun's own * per-test timeout (`--timeout`, 60 s on CI) would pre-empt a 30 s watchdog, * so the lane timeout and this floor move together. + * + * Windows needs a higher floor still. Its shards run four Bun pools on one runner, and process + * spawn there is slower than on the POSIX lanes to begin with — a `ocx restore --json` child + * that finishes comfortably elsewhere was observed failing the 30 s floor at 30,147 ms (#2152). + * 45 s keeps the watchdog meaningful while staying under the lane's own 60 s per-test timeout, + * so a genuinely hung test is still bounded by something rather than running to the ceiling. */ export function watchdogMs(base: number): number { - return process.env.CI === "true" ? Math.max(base, 30_000) : base; + if (process.env.CI !== "true") return base; + return Math.max(base, process.platform === "win32" ? 45_000 : 30_000); } diff --git a/tests/helpers/codex-write-lock-child.ts b/tests/helpers/codex-write-lock-child.ts index be61dc84be..0ab0549f99 100644 --- a/tests/helpers/codex-write-lock-child.ts +++ b/tests/helpers/codex-write-lock-child.ts @@ -17,6 +17,7 @@ const payload = JSON.parse(process.env.OCX_LOCK_CHILD_PAYLOAD ?? "{}") as { timeoutMs?: number; holdMarker?: string; releaseMarker?: string; + holdMs?: number; }; const admitted = { authoritySnapshotId: "authority-child" } as AdmissionSnapshot; @@ -40,7 +41,12 @@ const result = await withCodexWriteLock( // an unheld lock and saw `acquired` where the test demands `busy`, which // reads exactly like a broken exclusion invariant rather than a late marker. writeFileSync(payload.holdMarker, "held"); - const until = Date.now() + 3_000; + // The release marker is the real signal; this is only the ceiling for how long we wait + // to see it. Three seconds was enough where the contender starts quickly, but on a + // Windows shard the contender's process spawn can outlast the hold — the holder then + // releases first and the parent sees `acquired` where it demands `busy`, which reads as + // a broken exclusion invariant rather than as a hold that expired too early (#2152). + const until = Date.now() + (payload.holdMs ?? 3_000); while (Date.now() < until) { if (payload.releaseMarker && Bun.file(payload.releaseMarker).size > 0) break; } diff --git a/tests/update-npm-cache-preflight.test.ts b/tests/update-npm-cache-preflight.test.ts index 520c0d6b6a..e22d72cfee 100644 --- a/tests/update-npm-cache-preflight.test.ts +++ b/tests/update-npm-cache-preflight.test.ts @@ -27,6 +27,20 @@ const canSymlink = (() => { } })(); +/** + * Windows needs its own guard, separate from `canSymlink`. + * + * The capability probe answers "may this user create a symlink", and on a GitHub-hosted + * Windows runner the answer is YES — so these cases ran and then failed in the fixture with + * `cache_entry_inaccessible`, because what actually differs there is how the preflight reads + * mode and access through a Windows symlink, not whether the link can be made (#2152). + * + * Two neighbouring cases in this file already skip on `process.platform === "win32"` for the + * same reason, so this reuses that guard rather than inventing a second mechanism. The + * capability check stays: an unprivileged POSIX-like environment still skips honestly. + */ +const WINDOWS = process.platform === "win32"; + function tempRoot(name: string): string { const root = join(tmpdir(), `ocx-cache-preflight-${name}-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}`); mkdirSync(root, { recursive: true }); @@ -67,7 +81,7 @@ describe("npm cache access pre-flight", () => { } }); - test.skipIf(!canSymlink)("lstats normal nested symlinks but never traverses their targets", () => { + test.skipIf(WINDOWS || !canSymlink)("lstats normal nested symlinks but never traverses their targets", () => { const cache = tempRoot("symlink-cache"); const missingTarget = join(tempRoot("symlink-target"), "does-not-exist"); const npx = join(cache, "_npx"); @@ -79,7 +93,7 @@ describe("npm cache access pre-flight", () => { expect(inspectNpmCacheDirectory(cache)).toEqual({ ok: true, reason: "cache_accessible" }); }); - test.skipIf(!canSymlink)("a foreign-owned nested symlink does not block the update", () => { + test.skipIf(WINDOWS || !canSymlink)("a foreign-owned nested symlink does not block the update", () => { // The distinction that decides whether this feature is usable. A real npm cache is full of // symlinks below _npx/node_modules/.bin, and their owner is irrelevant because we never // follow them. Rejecting on ownership before skipping the link would abort updates for @@ -164,7 +178,7 @@ describe("npm cache access pre-flight", () => { })).toEqual({ ok: false, reason: "worker_output_malformed" }); }); - test.skipIf(!canSymlink)("a cache root symlinked to another volume is inspected, not rejected", () => { + test.skipIf(WINDOWS || !canSymlink)("a cache root symlinked to another volume is inspected, not rejected", () => { // Pointing ~/.npm at another volume is ordinary npm configuration. Rejecting it outright was // the same class of false positive as failing on a large cache: it blocks updates for users // whose setup is fine. The root is resolved once; nested links are still never followed. From 491e106bdf851d2ab90c38ba6911848612e473d8 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 14:57:05 +0900 Subject: [PATCH 78/88] feat(gui): show and filter intercepted helper requests in Logs The Codex App now sends gpt-5.6-luna helper requests on every message and every turn completion, not only for title generation (#2157). That traffic originates in the App, so stopping it is not ours to do; what is ours is letting the operator tell it apart from their own work. #2166 landed the backend half. shadowCallRewrittenFrom already reaches /api/logs -- requestLogDto spreads the whole entry -- but the GUI's LogEntry type omitted it, so TypeScript and the UI ignored a field that was sitting right there in the payload. Adds the type field, a row badge naming the original helper model, and an "Intercepted helpers only" filter following the same local-state plus predicate-conjunct shape the surface filter already uses. The label is deliberately narrow. The marker is written only when Shadow Call Intercept actually rewrote the request, so a helper request that was not intercepted -- interception off, no replacement model, or a slug the matcher does not recognize -- carries no marker and is indistinguishable from ordinary traffic here. "Helper traffic" or "hide agent traffic" would promise a classification this data cannot support. --- gui/src/i18n/de.ts | 2 ++ gui/src/i18n/en.ts | 2 ++ gui/src/i18n/fr.ts | 2 ++ gui/src/i18n/ja.ts | 2 ++ gui/src/i18n/ko.ts | 2 ++ gui/src/i18n/ru.ts | 2 ++ gui/src/i18n/tr.ts | 2 ++ gui/src/i18n/zh-TW.ts | 2 ++ gui/src/i18n/zh.ts | 2 ++ gui/src/pages/Logs.tsx | 35 ++++++++++++++++-- gui/tests/logs-auto-refresh.test.tsx | 53 ++++++++++++++++++++++++++++ 11 files changed, 104 insertions(+), 2 deletions(-) diff --git a/gui/src/i18n/de.ts b/gui/src/i18n/de.ts index 113fc419d2..3fa2de1c65 100644 --- a/gui/src/i18n/de.ts +++ b/gui/src/i18n/de.ts @@ -638,6 +638,8 @@ export const de: Record = { "logs.filter.surface.claude": "Claude", "logs.filter.surface.codex": "Codex", "logs.filter.surface.grok": "Grok", + "logs.filter.interceptedHelpersOnly": "Nur abgefangene Helfer", + "logs.badge.interceptedHelper": "Abgefangener Helfer · {model}", "logs.filter.conversation.label": "Konversation", "logs.filter.conversation.placeholder": "Konversations-ID einfügen", "logs.filter.conversation.clear": "Löschen", diff --git a/gui/src/i18n/en.ts b/gui/src/i18n/en.ts index 997fcdc806..46a0e6fcc6 100644 --- a/gui/src/i18n/en.ts +++ b/gui/src/i18n/en.ts @@ -671,6 +671,8 @@ export const en = { "logs.filter.surface.claude": "Claude", "logs.filter.surface.codex": "Codex", "logs.filter.surface.grok": "Grok", + "logs.filter.interceptedHelpersOnly": "Intercepted helpers only", + "logs.badge.interceptedHelper": "Intercepted helper · {model}", "logs.filter.conversation.label": "Conversation", "logs.filter.conversation.placeholder": "Paste conversation id", "logs.filter.conversation.clear": "Clear", diff --git a/gui/src/i18n/fr.ts b/gui/src/i18n/fr.ts index 112fd7ad2a..dea8476cc2 100644 --- a/gui/src/i18n/fr.ts +++ b/gui/src/i18n/fr.ts @@ -652,6 +652,8 @@ export const fr: Record = { "logs.filter.surface.claude": "Claude", "logs.filter.surface.codex": "Codex", "logs.filter.surface.grok": "Grok", + "logs.filter.interceptedHelpersOnly": "Assistants interceptés uniquement", + "logs.badge.interceptedHelper": "Assistant intercepté · {model}", "logs.filter.conversation.label": "Conversation", "logs.filter.conversation.placeholder": "Coller l’ID de conversation", "logs.filter.conversation.clear": "Effacer", diff --git a/gui/src/i18n/ja.ts b/gui/src/i18n/ja.ts index 69fdac1c93..8c1c22fa7a 100644 --- a/gui/src/i18n/ja.ts +++ b/gui/src/i18n/ja.ts @@ -614,6 +614,8 @@ export const ja: Record = { "logs.filter.surface.claude": "Claude", "logs.filter.surface.codex": "Codex", "logs.filter.surface.grok": "Grok", + "logs.filter.interceptedHelpersOnly": "インターセプトされたヘルパーのみ", + "logs.badge.interceptedHelper": "インターセプト済みヘルパー · {model}", "logs.filter.conversation.label": "会話", "logs.filter.conversation.placeholder": "会話 ID を貼り付け", "logs.filter.conversation.clear": "クリア", diff --git a/gui/src/i18n/ko.ts b/gui/src/i18n/ko.ts index 9f491a1efc..0547ca5524 100644 --- a/gui/src/i18n/ko.ts +++ b/gui/src/i18n/ko.ts @@ -657,6 +657,8 @@ export const ko: Record = { "logs.filter.surface.claude": "Claude", "logs.filter.surface.codex": "Codex", "logs.filter.surface.grok": "Grok", + "logs.filter.interceptedHelpersOnly": "가로챈 헬퍼만", + "logs.badge.interceptedHelper": "가로챈 헬퍼 · {model}", "logs.filter.conversation.label": "대화", "logs.filter.conversation.placeholder": "대화 ID 붙여넣기", "logs.filter.conversation.clear": "지우기", diff --git a/gui/src/i18n/ru.ts b/gui/src/i18n/ru.ts index 00aa9cb06b..e765961261 100644 --- a/gui/src/i18n/ru.ts +++ b/gui/src/i18n/ru.ts @@ -655,6 +655,8 @@ export const ru: Record = { "logs.filter.surface.claude": "Claude", "logs.filter.surface.codex": "Codex", "logs.filter.surface.grok": "Grok", + "logs.filter.interceptedHelpersOnly": "Только перехваченные помощники", + "logs.badge.interceptedHelper": "Перехваченный помощник · {model}", "logs.filter.conversation.label": "Диалог", "logs.filter.conversation.placeholder": "Вставьте ID диалога", "logs.filter.conversation.clear": "Сбросить", diff --git a/gui/src/i18n/tr.ts b/gui/src/i18n/tr.ts index 743be2af77..52a4f194d1 100644 --- a/gui/src/i18n/tr.ts +++ b/gui/src/i18n/tr.ts @@ -662,6 +662,8 @@ export const tr: Record = { "logs.filter.surface.claude": "Claude", "logs.filter.surface.codex": "Codex", "logs.filter.surface.grok": "Grok", + "logs.filter.interceptedHelpersOnly": "Yalnizca yakalanan yardimcilar", + "logs.badge.interceptedHelper": "Yakalanan yardimci · {model}", "logs.filter.conversation.label": "Sohbet", "logs.filter.conversation.placeholder": "Sohbet ID'sini yapıştırın", "logs.filter.conversation.clear": "Temizle", diff --git a/gui/src/i18n/zh-TW.ts b/gui/src/i18n/zh-TW.ts index c195aead79..9d3eccb28b 100644 --- a/gui/src/i18n/zh-TW.ts +++ b/gui/src/i18n/zh-TW.ts @@ -509,6 +509,8 @@ export const zhTW: Record = { "logs.filter.surface.claude": "Claude", "logs.filter.surface.codex": "Codex", "logs.filter.surface.grok": "Grok", + "logs.filter.interceptedHelpersOnly": "僅已攔截的輔助請求", + "logs.badge.interceptedHelper": "已攔截輔助請求 · {model}", "logs.filter.conversation.label": "對話", "logs.filter.conversation.placeholder": "貼上對話 ID", "logs.filter.conversation.clear": "清除", diff --git a/gui/src/i18n/zh.ts b/gui/src/i18n/zh.ts index 7dd4beb860..d404893e21 100644 --- a/gui/src/i18n/zh.ts +++ b/gui/src/i18n/zh.ts @@ -650,6 +650,8 @@ export const zh: Record = { "logs.filter.surface.claude": "Claude", "logs.filter.surface.codex": "Codex", "logs.filter.surface.grok": "Grok", + "logs.filter.interceptedHelpersOnly": "仅已拦截的辅助请求", + "logs.badge.interceptedHelper": "已拦截辅助请求 · {model}", "logs.filter.conversation.label": "会话", "logs.filter.conversation.placeholder": "粘贴会话 ID", "logs.filter.conversation.clear": "清除", diff --git a/gui/src/pages/Logs.tsx b/gui/src/pages/Logs.tsx index 55a7ef634d..129ce95301 100644 --- a/gui/src/pages/Logs.tsx +++ b/gui/src/pages/Logs.tsx @@ -133,6 +133,15 @@ export interface LogEntry { provider: string; surface?: LogSurface; conversationId?: string; + /** + * The original helper model, when Shadow Call Intercept rewrote this request. + * + * Present ONLY for an intercepted request. A helper request that was not intercepted -- + * interception off, no replacement model, or a slug the matcher does not recognize -- is + * indistinguishable here from ordinary traffic, which is why the filter below says + * "intercepted" rather than "helper". + */ + shadowCallRewrittenFrom?: string; requestedEffort?: string; effectiveEffort?: string; reasoningWireField?: string; @@ -174,6 +183,7 @@ function validCachedLogs(cached: LogEntry[] | null): LogEntry[] | null { || typeof entry.provider !== "string" || typeof entry.status !== "number" || typeof entry.durationMs !== "number" + || (entry.shadowCallRewrittenFrom !== undefined && typeof entry.shadowCallRewrittenFrom !== "string") || !validCachedRouteDecision(entry.routeDecision) ) { return null; @@ -355,6 +365,7 @@ export default function Logs({ apiBase }: { apiBase: string }) { const [autoRefresh, setAutoRefresh] = useState(true); const [detail, setDetail] = useState(null); const [surfaceFilter, setSurfaceFilter] = useState("all"); + const [interceptedHelpersOnly, setInterceptedHelpersOnly] = useState(false); const [conversationFilter, setConversationFilter] = useState(""); const [conversationQueryHash, setConversationQueryHash] = useState(); const scrollContainerRef = useRef(null); @@ -472,6 +483,7 @@ export default function Logs({ apiBase }: { apiBase: string }) { const filteredLogs = logs.filter(log => ( logMatchesSurface(log, surfaceFilter) + && (!interceptedHelpersOnly || Boolean(log.shadowCallRewrittenFrom)) && (!conversationQuery || matchesLogConversationId(log.conversationId, conversationQuery, conversationQueryHash)) )); const conversationTotals = conversationQuery ? summarizeFilteredLogs(filteredLogs) : null; @@ -566,6 +578,20 @@ export default function Logs({ apiBase }: { apiBase: string }) { ))} + {/* + "Intercepted", not "helper". The marker only exists when Shadow Call Intercept + rewrote the request, so a helper request that was not intercepted looks exactly like + ordinary traffic here. A broader label would promise a classification this data + cannot support. + */} +

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 z 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¬3!cx-?s4IUXTTPKBel{KzTaIuqUGZ_IXUIN|?l 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⁢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%0A@=@zq?bDbdtpI4o+(SO}wRVc+Pm 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Ò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 literal 0 HcmV?d00001 From 3723b3cf3b20eb95dd162944cd43c4ec8a5e7149 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 15:03:02 +0900 Subject: [PATCH 81/88] fix(gui): keep the intercepted-helper badge on one line --- .../assets/2157-logs-intercepted-badge.png | Bin 435410 -> 424371 bytes .../assets/2157-logs-intercepted-filtered.png | Bin 411568 -> 406884 bytes gui/src/i18n/de.ts | 3 ++- gui/src/i18n/en.ts | 3 ++- gui/src/i18n/fr.ts | 3 ++- gui/src/i18n/ja.ts | 3 ++- gui/src/i18n/ko.ts | 3 ++- gui/src/i18n/ru.ts | 3 ++- gui/src/i18n/tr.ts | 3 ++- gui/src/i18n/zh-TW.ts | 3 ++- gui/src/i18n/zh.ts | 3 ++- gui/src/pages/Logs.tsx | 6 +++++- gui/tests/logs-auto-refresh.test.tsx | 4 ++-- 13 files changed, 25 insertions(+), 12 deletions(-) diff --git a/devlog/_plan/260820_bug_pr_backlog_consolidation/assets/2157-logs-intercepted-badge.png b/devlog/_plan/260820_bug_pr_backlog_consolidation/assets/2157-logs-intercepted-badge.png index 0a05a8d5ae434894b34bd1e2a3e0e63185f3d151..d2810138f70343336254710d7a4ec2b3d4575300 100644 GIT binary patch delta 224082 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%0D1p)hw_$pA&6=w7IM2R3)MJ9pTxJhSjJQ! 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�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�ZH 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%0DEhEpc9kOQjpb++hHvO6tBIdeYy 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

taq(E?=H$|x~73&awmg_I@?YN3E#9 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

q!v`4u0`O(*x zAIDF0FnC?#(ecEpLX*k}Do%Mw=c-Z7>dO8Ot8jhQQ}g?pop(om|F#+qR2O~f0RUkC z_5Mf&cruSwnDa{dkR(@Yp=D*r=-Qx(WTO5Lw=j*}*0_HtdoefnRx7yBpUT>}JM*Nx ztSZVEuEE#x%@Y5qo`&qBZCs1BcExH(%RA3F(YcOVls7ZBuA?hWhq$9XpoO6O?Tkdn z;70IUUvpx3+&HFR?t!UuIsgy#ZPE;99{GAz7kcG>GWX8=L)af8%h(O=7xY)P;q22- ztQe3A^Z3#uv0WpQ=8R{{K8*S$U2OLqL^B}ec}LqNB$(k4FtW`>^82JL|*$$ ztr%iEhm(kHe>Fq@?E{^Kv~Di(ar8H-ALJBkDJg@SQfgl`+2We2_ts@E5fHI{nWY|f zJigg#|A%CukEc22&EotD2u#MtrqAzcPrBMSWS%=mYOHok+5%}={=T~W)+H#V^U-?J z(XivG{S^+5gx?vku(M;#9)@J7(^H4rOAti%z#Ae&vSJKTpqxM4csy;LWY)mnZ|76I znJ!Y$;;{2X&Hsmk#RvH&Z01~rw_30n`k!@$S31lN8n~B0iy?uv>y2FW;{vx@0(^;J zFWhp|g2}84O~;qW%yPDCE%2M?gHM%4Q{^dCIjDdHkSfQk=YivmJZMI&!r6>iqJp_z zyKCKiYWy2R4}G4Z6f`vu8Fnj#bN7TOW3zN`mrr$9^%<^0@*C%q{q7*d;KeuPQ`&jG z5Ji2fg08Lk{jXuuyB~{;->mj}(ZW6^ABzU10tUCl*Q{GGgjqbQ>I8@mOS>U~Hhzru z@=`NEart$BH=z?hs-`(>T+*AZmI%*k^iW+VqINPh!vAJ72m_)C(gM!p zclk}t>N(8ZwCa4lucn&l>I7*RA&}w+;Ol&+s=;5gPnv|ZlM;|+sjGKScjtlYkt(9k zU!LcEQI_Ll-&Qk}ag|v>5DG|j`WGg9L~Q_@B`TZbsy;GE?8H2=?<|2r?K;UPH{DW; zec||Tlf>b9I|hrz;JbG?j~Of4VK)tlk+iVHeUGyA@C76BI!bd?Q>rrt0kF{)Q{RpZ z+jFO|%mT9-7}aZ~KL}yG@uTqdj-7{$RadZ|T(Qgw_M_~(oTY6r68f3E*{yKxH10W1 zB3aHS5IYG}OIU=wnboMQzBUq8QVl@|>X&aPZzt4fbFtNQ1|(8-#Qp@Q&Gkq&R@8i= z(Jo}>uCbCaC_l7cDxCj?0lXzx|BPK;nk1UPdQV6+f7ts+9t|TgE4yMwW%rb7>Z~v| z+!8Mbu?9??^~3*tQ{oW0d@aHUBD^xY+!qwOwGCWLQ8rwtqrYl9^YioPH~5(%&lBz) zR}ElqQo51-PmYdcB0@>Ng(HO{v=k;M$H%Jn{SX0=t!L~JQ%{7EjZC@-#(}>YUA{YX1-@5@{5_M1~Wa_L_tRF z-vxGWlQ-mpD%d^-l>wkM-S(04Fnzuei@9-CaIz^q@1};${TyQ;XA0dG`ypyA3&s6q z_=moVky(JTN+Zy?UE;SDM`RckD<(jixa*)mD;>1Mj4W#xNJ7^BNVH@3Fy@q2u64Yn zz+hOJRbAVA)t`Gta06IdR`l1fDcpN7NSWf#{n2;3Nr5ir_p7t_-`duJbnJ*@)7n+x zmTAd7deoSUd52(yT@bM;He>d}c6*n)PCMq!BM?+nt@&B0&Z9CYVHyLxUeowE! z!+9ES8xKM=Oj%*tkfu9TBPy#*k&F&=baY@VB_Gjmxlm1;s~rEp&eK)I5yRN0w6ho8`nXq=*sQqmxPC z2*N`zVm!~Z&}vC%fFg`MQIHUgEs26->)F;(!!AdlfqJ!ME{JMatvF38`9Dm(WmJ^i z`~EFTNOyN5AT1zDgCNp1^w8ZQIgGS`2$CX=K{IrRw15cG-H3E|J$vr^{yx9|TCBxd z^YXf`z4y6~^Ef{T8oYn*>ht!By}4U3bh__Jc^!CHUzbw6OmocmaX7c=g)wm*E?#O) zrI}o;ISAjBLnuG`Q1!R(GLMquaQ6&O@MFk} znf0=tS)*HmDPb3eVsQ9&JBK>`iwWc5#(V>U{>yzm#Z4Vk7V@E_O~p3CBOQ5rl3$$F?qNy>iHo)8V{eQfzKAkpg-@1Z)?D7!`Z z$%h^us-in_6^})6ui>vK#PBh=lA~^ApO#*_!HUGUY=);g{iGk?&WtUdHs(ZHi6*yi zR+U9fRSh-mKB9%un8nJsj>01?b@9lug}C39j#aMxTu%8C9yVL|>$mmEgMLjtl`0zC zSBqFsjl_eG$#0&lBB{~vE0?=})(J8W;(D3f#mNZ<7FSSy)8pif)4wm#WY zyE|5^RWm74x<%ZbwEjbq{h2C=@af`mZn^j)JPHmI=Gf<&H~UELU}q%p&X(8D%?Od! zivgWEdVo9^ne!Zpy_t+X5kNwQjM3n0T+jpM{Kx!nUsfO& z-T}P3aj&2cQXSuKRgHYtVW`~kIg``cgja<;uXkskW^1u(eI@ZV{rAxCOCO5B@BTgq z;gaU53D|uuhpt!;3v-#gxYAv0vwZa`e^K2LN;&I~hDX`gvMFR0G}h9miO@A0R$K6Z zvrI#PW1cgiO$9~fFx2p7=Us53AKXfPE#icE4>x{&E;8fsE8JI_h))Uk_Uu|bKg}%8 zJKjlUo$Tv>x^Bs02@)DXUub7CuMdtrGtAmG$!#E?aexm42EWbAWi) z)$v2Y&<2GjT{#HvuYWY-?U43j)N`=fmS2329Xac(W1xp%Jg8@R)!bG{{opZ zn|oF7sFJxJ=*zwC?IHBz9Fl1A3O5_jSGW z0uI2b18}t&lJJ(xrS>pvB>NeOM`KNG*1w1+3Y)egDw zmDnsUjp4l(rjRDuBpvbKyJ|}@^N8@Xzu)0`+wpvK4m>@3R!*avQNZRS}-961Lf`)9I|;|rAW7#$&cVd+)W{94{)(_XGA95=9Q7Q%#gNGwBjhxB!b+5mQV$3 z?fT-V^{TPee^C7FAG-A9WIkl-VwGL;A_?%;kg#X~zg3%c?|&=_h^U27upV7*0d{<| z^%8PdC~SwsPyRt-K~q|<*J=Tr^+ZM&yy~+eb6&V8>=HmjF}OoZh}l&G0Kc^ehN$Vv z%kZ73u=rszjD4NfNf*7y3pYBdav1cl3j5Q!B7rHs!)!|NTYK(u1rV}th{|I-SJ zl(6(V?%NDzqM_;tlwuY9)3Fw?*e>1+d3S*^CKxULB0%Fs83GIK8wED}s?hb6F}{g0 zDbM`+_uo?;zPbZ4n@R+jA%43+bH-)$?sQD5`TmP5PFIV}!Ir~oMu{w#RZ~Yq`Fh0f z$!`Q{0|qRXGNZ4kPjSlVh&SW97-d{eE3CGB->(v?=q<6aJUT5Uv!G_Noj4_^ivGfs zw!iT{hW{(q{A8K3$-4Ow{NS-k*Lc=0rMz4>QK0qT3PLvGqKN##nT6tHeSHc%YH+1T zDe(;vD(7B{3>~WPlitzty)qo^H2+=pNyqUSd9QGRSx!%h{)@_A3+WVZ>0)uG+k)GY zmF)GZY*g^vm3iLEPgg|mt$Z^yMjA;W%EsR>mjIS}!u1MZaPqduY-kmNuuSfzW-59*p z#cw1{>M5W0y2Y^U%^P!Q_1ab*8B@U_rZKH<$HxXD_u&?q?_PX){`IN@20Zj{ z`dgOO5e&j=_Dz)=%7ZjQ@cHtNntf7*L0O@?M|4X|(qxkr&)4r|zP#DDL3oR#X4)vx zwMie9elkW!Z7%ZLOD1}U+RQ5Zv3@}2H7?(>bQ)FTOA~fzDy80&bn)2_<#I-}Zj`Tn zbO!TVaYt2sAZ|6zNuYdE{vx;4RI{&hGf8cD#v>hurIQ)j*l}p9XACFKzj#CuV2dZu z*RS3$N=w{N-}0j^I5Aw_tL#m_8L8O6R!?Tzz}}DA5$$|vn#PtA_9G(Amd12&4 z^R5>H2H$a*yFWw$dE)Qy4{(m>IkFM+=PyP*mJ@GKHY~5VEuba0%?G>wZ)9#(rJF)X z>&Mxx{K2{SV|n(z@=I_l`S(7ylG_h0;kr%tu#pAc1!2zTPq5;(aEy8t{7ine2=HHF z`Iwf~IWC%1<|N`1Mp>l5Tt2MHPD%|@!@q?gnl$V^dJ~$=fMsopd>S$=PH*c~FQ#7a zM@o@=D}k59KCIeD5~g(g{KxTgt-~wgv;}_Qrv7~#LxATENG?fS?Jzb z^lbRd(f4H2vB@wSd*&M{_(+zlVByNGT*uPd=}QNmaf_aD*akpW*sjIjEE$MZz>WLQ z(0YFJ&J{IHbbqT)evur@hcldBc>_vh(;fNBj z`Br^@97zDb)DQX(_V(J_yC};Aa8X;2yl>wdZiCu$Tjx5u^*nkLI`O&CcdFk+moyNR zK&2+l)0{@g*aVPH0uNjpxm&n{RJ$*CMrPeiWqB1f0jxgqXf;AK>F6L#E|7r%&Q4Cv zfb0Jhb}7Vxfj(^au_{gn^IggnWsxBa;B8B9Z$KP_)qjXBiXlTzl;b~wQa+UIvK;h` ztM@+iX&J75iX~E!u#}DKQ`l!AZf+I(N~sUsgjXFBu0ER=+>qg-!TxU&`F9ta~OR(Q4o;K+J`~3@c9X>zedUM{KI5j^s zPFX;JHqz0e{s63n7x#ouKfsb^)58EJ>lcD#8iLIwHPjL{!Bd6!2>746?8!YHyF+!v zf*&765nc6-s$p0twUT#_M|cy@R&;Su>$Sa1*FLl=Pl1@f5b)_1Bheieb|B|?km|rB z`&=n*<&_^~cx&jPLttex-KpTOviO6TpJj{^a#s$+s1y=f}{KG-X- z@rH(XFEVbjn6B}?P31Vk`?H1!R{=Yzd@9-qQQ0jh)F(Q|O89_p%-O|dZ)b;AY!sfq z{Ogyh@po9c&dbce%Z=94iCY6iA2P0FYB2EB0eUt40RK4#njCb3*ox-X)13Keb`!UL+SYS5*|i{pN zpMh{uGfxX%3`|=?i2Pism@Z}~W4ya);ZLb%7LVthUSuYQnOc>WCld!n$MQ0HovhP5 zO>Ol=%aG1frW(N!p<4N7VqrsXs?R$hQwy3#87)ALlb zD%%T`g8|D=d0B>e&(+^s9}H}s1~gpX^C|;KH2%jZTxkG>&zizx><6}>%?R`wZH%GK zE}*~RHJ^9!Izt0iKPY4ZR4+iZT7kC+Rzf2XKLJx;wRRk=FC_38S(Je+p@#ACl`YQ99KIe-IG+*=-1}>=qEj(=Lvn& zQ%U+c6#lPnp;21d1n&^ml4CD0Eu|P=&9jD*suGk;v~UKTXD7nKKAvTLfrVXnPMs#H zJW1k@PscFKW@E10DXQ{ATg7KcYclMoc#V-SQr`K{E09UH*PB&J!Z}Uq zfPsyqxuo6a1m3p`sMb_ZcLP`D5}PvH2+MFMi9B>9PX+rHDd9>#e;|IdzV$k5!+a-1 zl)Le3Q>j&$<$E~~niY3k-7fKma$SYn_Y4yFl>K^B=b1%%SFq`zH_`v#lKG3si0M=A zUTX$=4%_imb7*IRD$;Fo#el{Em~yJ5_q z!?k`8qLc@Awqs<};B>V^>nZs2Z$0w|OG5nh_D9156;MuTsfnLVTEqgPvPbqH{qs1W zEm82AX83kc7s0c9k3Rr8%Kk<$+z+jodJo?HzLYbIlWWg#EUt83UQ7+2_ir;Y`h%AT zf?Fi_o&EE_<+C)Z4XnE^g-N6_=QIhQ*$(POrV2*7uL?__XIz9v9ON z7cf$z;St>O2p=vk)aSgPG3xzIrSyXHqDD!n`F@2xhbVI+4wp5w{zD2WC0w%2o)#@M zIQ4hMY&-iR9g#-w$ciBQ0#vM2RwH0O_LqM#y^*v~N6aHT7c~Ik5VMJ~RXPypUc05q zvk7x2Yq53@FpB)!ZISL?Gg>^q;#Bo;eIqnCgV`;N&Yh)RBD`!Psm1!+iUHI1fia_# zdv9K8E##F%eb4XOXJE4<41lT1)Nmq^O9b?~p_jucbU*<-?K)Z?gd-8wf#4j$ zm?oD5;X2TkfD2?8h)exiGBPs<98r5<37w@527Duj?|UKq=fEBKbF9SW0El1#ddH8R z(nnX39TE6oFJ0=Nz}8>N;+&j@_?Q*-v9p*uIXVK}5!bbjb8HIz9n5RtzSJA*d|n4oNn*0|zS?w-XfSswry)E!Px+&>M)=`eY}Z8+_p zMVAH)cL%f`uC~>!DNU)JoF6!j9TjAI4=_Buv7$3J@}CHej8_CGoL({tXZWzejPhtq z9c>tx-ih7!Qd5u5>seQxr;X@N;1=^Axq~KfbbK$1spu5=@pCbuRC8cT??%lz{ca3V zMLmF}N1kySm9Td+*xN+w9ex1E`wqWtUGgcvY+VerWEF0+->Sf)-YcWo^=^TQJJjYs z`+gX%JLcjIJW|3T6SwR}@s<3WP4I$36f30v+#k0RYd$p)0`=!@!lWjzc+i# zoB!~@m3fGBD1`2dHgDPbFiN6~!jfuWw{R@6KZv_QOT$lE;33Rse_Ggv90F&)NM@T5aI{ZK|vc;k_$7 zyG}p~!h*39he>zvt-GeP2?-M3YjEgUKQ?83)u6pT7x$*RzP`S>8P~J$hIK>R7xFX8 zV`sYBp8Y=)YkkhC&b{8Mb$^fEeOAfs#p)RdYw=u5`^tu|qU_%bX;1`5&N;H4xErbP zZ5*QO6Jox+SCJgw)aIPO{h-zKuwNtfeU?ab+mF{CxSr}M2qM^cqfGgo7PPm&i@ zUR!QS?1hR-i)@1vdjrl>LC0&JuK6*}_*TVV7-mguRl9cOKCgVYm|yVL7{dd~M~F)$ z1)iz+VQK9uVd?hbzkb0QWGCzoYp~dD$Yg6%bz$ty)X;3jdCPa3qH+hD_u_(0y@(1e z3xXKJG5WL9I+iydHPgRY!Olv%Hf0vtGi_%vv7y}gMy(~*V!FSDUs8HS?e<=-B&h1$ zctD#2{z%={rW~HCD?2bFd@A$yFsn<2Jz8q8(m1}v5bA&5E&et@<3TNaYB$AR`|yow zpho+ppM(Z}+I0n=sH7>6XOH6lv;u!P9pImEU9D4^A%mBYH(sPh0lI)!K;&YvxwW$zTgC-%y!fVOXN$XW zHlqESAC4p6G6sBS7rgPpTIG{V2v9aFYY>}p`=xYuzmf`kZ^ctn@ef#>0Lol z*kbmR5C{yrw`>YRiKns}-OB4LeZ^_*huiBuEL&TsDO=#B-^20ze z`NNJWyz!%F7L|Fe_b6Ag?5_O>LfK#M2wEouFM9LF8{L=F6fxmHTl5w8!d0`Eok%WG zm%i5jTm-r^tXboSsZ*Yh*y;iK^jmI*c;4K!XA>>nru=0_=JxdOB7Ozo{noZ;KWzTl zxM#Wh{iZPU-u#M*v`6z|W;AQ*;*d%v-N+ZQ9=K-d37=Ej+XMMvk^9G+1`K%i`)9fx zGFe<2Y5uN4H(N$BY?T5kcn_5qsKT^sDYCcG`ms6l1ZITMD0mk7YgD#u z`n{iwT|&aS6WG;cP>|tir$w!oMc}Z!`HmrRuPb#QjK)7F*$f)~s@}hs*^57xac|gnfNsAlXvA$GYi~wGP^}_ra-7()#J?>uUUV zR8jctH2?_zXW)T946lXwIQx0-{_17?;(YA#(;xcFvZW?6H4;YJU?GZq)wdUeVtq@) z=d(^CV1MC}J;8chpE~`ExB{VE?3!!ZO;MPoCS5|&P`=yWo1I4=F3CEQZ+MTWqIZS* z$wzTw>YC2wC`E0yPo_CAE5Dzd7T@&8Wiek zii61mA!5kbhRSGP`LX$5n=U6_IuyRW%c@^OV6FX^$$--;dr zCE`e0&LGyn({HG9Jj2jw`4tazXpH5|l}onM>JKQ7w^GsjxuK5!RyN0_NrxB4lFEF= zJM08Km!(?pb}y%O$w$iG1!aMWmR%&#kEymV2>wdC<(xD<{Ss}&(PuOjai5GF8Gb_# zbPHrO3;ZZ;0SCOi&ES=u*asg@F+)s{cQi=zdRE+aQ4|-Xl*W*N(-k;*nw!OchTIvT zY=H=!uu&#G@aCI=_`4aeSW{aoA}oxB3s>a%&)bd`>3taPvgrt&gnZ{T#Z-Is&^**- z9g%q>hnR_7DFFq`m{*<)ly&#UdQ7EzsT@Ie=D1V!nhpVzPefP$qbm@Dlk>oT75dH| z_~Hc{FsfM+6l(QEMI0{Z0#|8`do?t2O}yAt!1UBUn{ebO3b8h{Q7&qDhT7Mj9zV#v zk0Wuc5_Jg#a(^&G`pKeg3Or5^xH;y&d;GPwG+MErV&nL{{H$RYn?8CNZ=myjIZxjv zHIh5HFi+H@#t{p(HD?WF;*b}*rReoWFFU!NbV^z_4O^BA2FxdQf&J~nUjG*F>$Qjy zg$~17-B;NSC)Xrvel+lC)%lXJ?5W)H%vc>|()P0^V1XBaYJcCXtgiL~vjWHj38b=z zY`}oL-Vh+XW??+x)Xwz%lL{2u)tI2^HhY!g>Bho9Ko27YVo1@8KOpyo;!$O7Epksq zIw#|n0UKY!dw14<;cEUgX>-D_ylA|$kX~I8u7j`#1uin>lc17p;^BY8d`d*6N%-w2 z^6T2G&g)mhe~8LL*%?v!J<1S{j(<=qw%CAJ6g*Gy^LtBQ8fER@nsrm??=ciWcJE`f zSMJJ_;`HmHk`L4z{~qIX!y zyVqw7ANkvh@Twz*byl!d88Vp@9KTOHNV$m7id;J9c!$;5bBI@3!u(`tHCB|gYlGzu z+nu=V+My4^6vF?a8D~6iK&yyEi@%ZGrU3uDpnob_39?sg{(7Ewe{Jn1H~#zui;o55 zf4*^6_u}FuQ^jiCi;I>u&J69eh7>eZQ~D?cFN4_{D9}4;fvYRDHcBoJ${3S zQ%ArV*cYIIQZ$GRaFo3KELj*hIXim|+L>9ctE{{zYxlt0(%E7D;FZ_C1dQfmZ=Sm? z%Qa0R#~1|9z!-xm3?vq4dy^r3zavurH7u9QxP#yXB~7v0T&6^2EbG+PQl8bs)rer1 zBzF2IA;XEvH7vqnxn?2U&pE}fIA1YvR3N5N`*w=nHlr2@hOysg%K7!X>Sv3&s>HM| zuY_;H@4Lk3v?G)TUv!4@PsjK~f%gSUo_GAIoj6^mS;-F)C;7`Q{zD{2qz)QR$uA$= z5guW<5y@(N(8WRJ;G+xtI5}nCT_7bq*Z+P@@i?y_5MOGI)qxh1OTTWP41fhB-fEb~ zGm^Fc#PDVTSrSg>=T_7f*GXbFPsh8-+eT`Q!JPo$jTWPYXosSxl-He;qy@he12=s zfxbdKM_gwvy!Ecv)@Wy8tvLQ6yU4*GYR!hzhPNuAwJf)ud8XGVcqg~kQ9NTA(GinM z&n4*Z{}$QUifRA#GVk8}Y63h3s|EjE7kaSIij8Bl$zkHdkJkJfJu5weeec24qSMQg z?$yPSV*x#rWYccfMlna96upbJUkie!BDmU#2s^Np`*{ytJgU3OWJ|BF{;0`6E>a+X zDYsK}9+z1MW6fyFhlP3M2aviAk5}z*{S1$tflO_ZuHrRLR)}>-GUb)VzkL=gGryjq zDxq0R-86Kxs0l|1oIKkOO_UT(0iFnAoDbrCvIp_JLn{%omIaVdCH+lOv6h1#p&*&A z5Hus@rF7$O!+EJB1%2F~aGzOix^~Tb+S60vk-&!>1Q=r(Lr?O<$w|U}ikQgS z(23shPrg40`0SNX^4WhL3fng+UiSiPHuW*`X|Ny*QZRl9W)H_JDztCpB%5x%4p)1D z59M@!sbhtAs=BroV&xA~mHyR(Q~8F~gb6bV<1=9(6OdMrow%K(S={&v%e4EH6dqm< z2-35+5>*JY6UNWKb)2lPqHNtM+KUKA>FTz*l2>I(G1^8FqRp{Gznimg-~JF61W@fL zg_^(^yl8!SzKu$mZUs4>!u6{dBFT(^*REBsk_Y~lxE*B{N1Nn zd4G}qBqjpgn&C3WG!gxq+}{o*6F6g+<2|A}y;P|i znFmQuN2(^T)R)hqQ?-9KWmayGF%7WIkl^yrf`@s>8~LvF(FAulv~Qd>ft|`*g}eRx zen~IMLbSyK?sl19-uhLmr^Q#YL;>r1rVNqSyuO3Nd+nwe?zJJ|#!BvU{V=s9MHd2Ip}2HX}y-3l~IK9v&P z`*$CBDd2Lld08SIC+A1h^Kf29AfZ)Uhw0!;kKA?3I>lRtkTtjY#*kms44e zkSnIr`DSvG*Z)w3F_;+Nt(dDB&7DwkbNW{R@06g_liz_@w=vd#8mp2fj_*mV8keg+ z5EI$zpt>Dctb10RK?fUl;Y?b+_cu(&GBdHfVM*nNJ`avoGrtkmo=%D>K0?Bd`K-Sc&@>(A(-&ZFb-fUBJ?j&$jfRXA4F*!Q(}mtU>MYFd+H} zu9e}5FljcZ_CM!yk`xDC0pP>bIRlysADNDa!h0J1iO=}|-h-BZnl#`4J;Pf!BoDLw z!V|$$hfTq9JFuy6qTd; zeuD1^9_u(m`Pn3klk^@i>j3B!ygBiFA<-fvvHr~m_Mt9*ZJjWImKhD{j|h-tQKj|@ zNA=4y9KB|)S@r?i@XU$O11_W|Rh2(Kf1zF&qY)3S{&QW_$uFA_ ze_-7rLbTE~?J8csn#=uWmfh~Foq+C$%)-U;CPkyB#19NLOtXm5l%Ulaa(H9wdR$6N z+#`7`0KhB1${viyelqRms9c<(+i`yu&zx*6j*3jE>mjx|t|ddepXx5Pur^Gm;3$E& zwJfR%3^IN-3!~wddUsFlP<4G(&*)&h%irX`Vb5%&I~!PAlei%7=_MuF^~=O2be(98 z?|C}cEro+g14kFQORR;Q4z3PN^9k0!t&9=bogxnA*##gO{Vd+$(yFnVaDaZ@E9fy) zBmEALb-FOWQ&N+x!^ej5&cDbRkK)FlOdMk0!);=YZ8sI(lI6@mf_w2D2+3QBG!fGm zv4;v|c+gGTrRM5FfDAbINR2WW$nV6RYL!L{8%}8V9z0pDp(f|Hd z^bMNrXjGn5nw&~N-olvF*BEM&P$cC2yD-9%4&%e(1iA)47s+S%_9YK2*)2is;`a}C zS}fI(QvN?KL|KaAk!U2)D0_3lkh6G^Ifk_bl(>x^*5vlZ;RDRJlp-ws?YP<^owuJF z`3rd8*A&zR@ZVBAlb!kHB@ud4&Gn$`Osn;w6-4C$YL;T%^`mLYpsuRz>;kj%no?Gl z1*e9r=YR>Oc#_Er_x+9B9juYN1FAi)xua|jotlCeHlPY54V`~KErehO@iuR zq{VMPs`7QT6SooR;!w@L#JeRc5zUYDAGJqggLg`&ZP$IQF<%`xe-#;un&49O@VP6& zTMzV`RsFG|cRjlCqeUhGQ5hpwE<(from8j#;I`qVd$5*NJ|t9{u7K*Txh;x+5^({k zNhoV`(eo91N*cG!q{g>$dlIRSlwXt|3jFH2V3{@<(ZM_Al3T{iv+Cf`oVj1%@Uu)< zE&+}&@e5~$ABOd7?snC}reksIDfoV2k2=@sx`DW#MS*R}i)((~Ckw_{bb2twBmr zVya=}2z|*EMIB7X{K?Ft1%h!Z5x7>sv0}hZ4EzE{V0;Tad9dT6=)Qja8Z@c>E|2Y! zt%~fQYy#(d3NO@Jq}yJjcoPM7nEg*lMhprs4(4fyyT*i&SBET%Z}=mpky}|rv}xa| z&L`Ky{7i+!gKmBCVeFB<)orfpUB^a|xJC-)5~+>Zm6v*aheF7YL6SD+>OaiBm{p{W#wiyK|95b5keC8?CoA zg@CKBG-7#PXX&)EAmQ^+HSvym-|jim*^#JsI=eqitlMt;)tr4M?1 zYp;>pwnIkEwP&lRf#E>GZf;)E_nEwN6H`3@X6!?dx|-tg-Ll=>quTReC!#sY{CO8# zb1L1-P&yE;sNTMHrPr{9{iL}4pCSXPPN|cG{Q%#07&aWtnXe<~%sanvE`pZn4Y%ZJ zbu~~YkW)!t`%XmLIZcyxz+~{3EEm0Bps(%Hu)+3EUAM;2W(!4gE-#z2Ipb5g;=Iu= z`99Oc`EsiGyHDpc8{<>b{u;d$SeT>GQ|<|Cs98zm#uNlKed;qKn+dCd(3$Pqdc#&u zIQ7ft#RKQ0{@ zdofiR3rz^ay&3$j)E1lHee|-rE9N98vtjuno6y%q;I$#WstqK z%Jo6oK0Oqw45#;uMOcGgEM6H_-trHQZ(DX6(d<6#v2h#vGlzp*S#x{#dm)Q z6(w5N2fEpSM?(!cuO0wy8t$On7#J7;S#&gFo)0VPUhhnUCtb}B%x#BoaM5Fs9aBoO z9~=6B7T5nPm{TUn=~RJ^_+PNxT6WvBXUl2X5S)}=MITkRh367~G%~)+)C;$q z$vxG1nGfW5DcW9Vyte|knHVHjvn_{B@3au6>G~EG-&g$!ebp@$o?l4Ix-k*s9IP`* z^PK3J`*IqLdiGuz!J7$M=rst{vmPIDL~Ye7KI%T|=d^@tpyB{1fUl{HyaN}ta=N3; z=MR%)?Erp@Ri9{_oad36M+zH;7iN0*YVFZvDHmaVXdey zR3%u9F6>dTM#;T1S1~bHPyVL|X(loiRvspyfvq`$d=WAY4{QS;@B!M3yl9FsOm=nhmgidR^Q(^xy>EXkd?4ZRHZa43p7 z5v<}=r)jryhwJ;S++g9_IICp1oy;@YdKl?EiEpJrsDV&WFU8@5--=mpk{bgK=X5of z2n#X3n#bESl>aQeFK3xDN`n2(<9;x9jYR@)gnN~*0*?_PPkHxou4edg_INgJf;}C% z4MBp)a?>A@%I{@){j!@QD*W?i zH$7nE-QK4*{3l`u!wabPZcg!w^@QK(o=e`IXrw5$HH1BL(X;IG#G5~)iM___RjC^L z!u=Qnn@oK|E8p;W$C=!d;;m{?zd+KGt7p~!Y7R(%!aj2R<+3dxEe)PFhUo(UGDE>* ztcleVWMGh1M-tL#a-;m+qUU{Eoi?WSlx~4;FLFLWJw#tUZ`#`M0C-&?dtfNOphA*P zgX+HzRf>_zw0H0V=ac0ZZk}s)=$(aD^n7 zzRQ04dGFUUKaEhKVzCMrg+KM_r>Ro;t?O-~dMz~EhaA7Pzj&>*r^~X(4&)eWD0VQN z0<{=C*q@}}X@mjStY1r;@W=2D-0D0u2jFLL@s>W3-7$FV;zOy$r4PR0G;Hg2?D77Q1WlaR7eevYqZ zn$LjEO(5qm&IOJ-!q>^E&cJ7uCVd;}QS{=SIaK4lSg0Mb!DIN?6TTso@<(fvkRr~y zofojQ0G1pQMm9BUyr=Bk(Gr!bQ$g^h$);a&trnD@@te8$HCF!Y3 zbm73R8X(k2uf=fW?G~{4&bvZ~Uc(`EZ+SYL(w+jBu>z5;6UT6w=Hz(5g9B#Ob3I);qg3*r%^FK`>Ud zl}hc{_3pIt7q8+8C)__E{H6E(nk1b}^g7-gU5jTcKR$M^`a(wZy82K9Rdv$j4u}3c zU*CJa@@A9q(k{&JPaltw*xJI=DE~m-cG^-es(B33Zl-%d+X>a=XRD4W2N5piof!53 z#X-Yn6cSuG!Y#J0x98PbR&H&OlusW|)5bD%{mnh=Z4WUVk`>`)Zx>Z!tVk8hm8_TU zL`j{RlAq)cE}|M~3)uN$r#`^(bJzL(EgplU+1bcBxcamSM4SFUaU_3YfbMiHavsel zg|np3>_XfGdcCe!oKyRWJ4HUOyd&iZ0fY5g#3dGrGWyG_s5q%-d(s6_uDSv6djqym zFEIa<{T1kJhs6dUoWnUPmt5C&Am?4dtoC4?B$alO-n&Wv9c!yf#N|9`E*2&{fa)U# zUNX)vz9ME7jqk6O@Xt5wv9_z`lQNdtwSVn@gdQ>onvDMr4>=YQQGPZxgYB!-N9{N# z_*$6^MQpNyr0> z!-1suqSEeoZ%4ZCrl!^S-1yj!aHFm1#o&SJHsdWp1w=Me{VJ*yln?hzpQdtiNpICm zS(1hZ8Kih~$|!X(d9}>MM6Z&kQH_ryuSz8UZd3orCGCoLQ_tS2`niUx!e^Js`!jFG z%L#@7wNZip%b}d!Hdm+R)50c6#p7o8tG@2`kv@OsxU*v48HnR2MQHQ=<<}~h${}rb zc3e2D!y6#j?iEzbx6m)CG#-xtnN^SN9xrzOqgZi2Uzxke*7{=xP~Wkf)vYD!%C>{Dg_0;r?2EDdk6Nd-b8l_|xP+kBoyB(N1k~7e6I8)tQON zla+U>Y7Wtsjti_W^v}9?pLV)H(eWBA!bds}yY^Z&>3mtEJ>zRXa*~99BiW;4qk^*d z`0q^6erP*?m4H6y-c0%oE(m~h`B{b49%8);Pk5U!Q6J=SK6)?)feZdPn&+FY5JPRe zw`YoS3@lIK@|ywdzIlG0(%k>tjo$y)69L!rzIPweFXHktqq6whrv@+46TwIc7`E=6 zfe_r4apOL$cyVP9z9RtlqfUKynxxQtA5iOgEJDboxgx55oVj4^ZILAZC;oLP~HB*F;sEf)DahVemq$$%h&j6X{huO2M8JF zl6VM1w{x+p875VP8mR3%^l%7}RpN{S#0O^-}J4ua8F$#5v88a;OuaD&}l_W-6ZcgC}30H zEAlYt$em@U5YqwR+f7px;|?ZF*XGQ34tm4l2#&s{|0f%b_091iH{a_k~BJ zJ=~`{UvxH{xJ2rIRI7FQwM@43*`}a-1t{CwlxZYAfM(9}BznUY6|r6g!JmWAuIc6I zXSoFYM`$^bsHMP<>{j=!eC9%!@uZJBS);jdjNZ{#^E^xsmCQI(iBBRX&d*A5t$=%d zN1&PO<&OPYC6+H_2j`Gxewq#Me_BB^*M`IElhPMbeF;=w!&-dWq8y-l&W448HIE$b zEIVzyu|Kt#yvDkMd$Y{Dnk?kmP_y;kc&G@CT257Dcw)1nJMBCv$@H)?v%xDNWeVNmqaFi?1tkGhmds$TaTvKL zHW{3eS&W$ai&u!7+4bH}#1uVn_xM{0wOzx1&BEA=}B;ur(@_P!Tc zG3?V4*kTKyr59dynNh@t==2<*23faO=N~f4h})%k17mq{<+}8L64*cPHE^&4+b;t@n|oG`~n6t`wdA@j8b0 z6KgWQAdSV&W4NU+!=Lt)MqXc8uB?ZW=Zyi&mG_x(WV?#UGkvkwh+%vcORky9>miUOU9E7Jx5iKdTsNeZk9Bq^qy3)_X|pmO}H^3f%ezc z4s6NKLpX+J^6J*^nl%E@2B(=gy}_CIMZ%Io-`}Un4(4+|bx&>E&YRt(%pg9r#cUO7 z9rx4DMBAksqwmjcGp{wv@p#6lq33>*x`&F(r8)n~Qr$s7#Nh*oxzQCUmQ- zIG2Oz|8^4$$|Xa%OQn31R_TIT@P=#!La)pbpBp=L-8{}pM&ffllgZw|P+x-jRUb8{ zeuj+{SVte9E$0a|FQT8LThafqAkonU*U~i!ymy3W<}fwN}>?zbj(nZorkfSKz0e-8UZypv9npAC!<_5duc;DXlN1uds4FO({oO+DEIkgT~UfXm+?>^Q*XPR*SGD zOv{xb@w?!r<1RT+jo{lPm1=>76~I68J8i5E`u5Rrx1t{W>ILMW^+uelzSN2?T}CE% z&)i>xrCmsF-t3&ZYQue9SvLx!x4%$%MVQ~ygF^l0aTr=*bq1;7X>>=ScsIr#R+?VN z2#>?FZ-A z1zsiLJn9unwSi2mBO1}%D(Fh7;+d?edR7c0N4XTV-20x*ZR}aQ-MeLG-euV{dz+vo zE&V^N8;ShWvcG5k_!g6p3UA$W=VkUln{USXvYgMERg?QMSC*)Q4&AuDF7jp0`maQT z+HH9rxdoN+;&kZ2%`Zep3nD^np=OQfww6CViB9vSalfH#pmr2O-l#PBYfJCsQ1+nM zl+bGHtU5ZYskIeAq^8qW$p{(6FYtz76?8cC$qiK5QleWivty-(Nu|rWs+m5Gz4&3(eByAf#Cyf}sR9n)I`837Yx_og z(HeVpT^RBe@VChR|H^31G0#>=SzPXf9-zy4?5Z3@1>>q z>EOG!1UWb4q+q)+aH5CEEr~~bGTTqhhrrV@_w6;B54Z^6#m%vE3eJ)XVFm6mG)PB@UcALVj9pa{rkWz^C=*ueTrm7tB57&b@DCtZEeqtkhK4*iFCn z@vL<4yJ|#~UL!2b2K6dRRPqHUtEd5~G;;6W#>Jd7pR5KP!H{~(NA+3q19`f@k_xBGb4mGOifswUj&i3UsqPOcI4_?t zB+=t8FRD;Xb{zzfKs_gj(ctP`d~I$z!TV1Fi@RV$vBj@AdU*`jO7&Uo%~A9^Zf?4g zQvD>Q8rCtIhe@C%?U$`vks1HEqZqX6WmQNgkbt*Ic5Wgb`_SWtw8bcv_Bp|CD~9HNu<6_6K

N6*cGL3G^>Ki$M+dRPa|myGTDvbURTP9?STe?)MQDoun#-qjDVmUrluZ&gX1dNeRzX`G?}x%=N1SD&6D^Bn6D=-R;6?lMp@8g7MPGX2 z$~NwLCOb%99j&v>0NyqeLvenR1@w19-XtA5TwQ4zB15KlzLL#E3^{f0|D0#j?jo<6 z0t(a0>yTQxi;LX9Kf?7w2IAm-vFOp>q!*&fHix-4OuTgj=g}NEBMGI4l8O6k&mT17 z^fv_FP``iGO*PVKZ-Ode(AGbqZfBbniS|@{p*lDBpiI&t|W`TJ57#tT9Y>x8c+|1hK3NuYL<(d0)G>_1hry zN$M=E;PU-=BHP@Ph!=%CZEb}KRRlD`nL|<*zn@MjjmMK;Q=h7d5--g}MCCsG-!x`a zE)B==s{nf78d`GIfYdg>>E_~#|eKV9rb=8@}p|(3gDSFjk2V9qHHZ7hHCX zPH>+PYKjj#9$Nbb(Q57acOeys!_)#;m!4I_=@?Dy@Q-wC8(FJ{_ccV+A+R;bC$Lnl zv4SL4Lp|mOsrX?i~U6B-Jc2=gjJfFC2}=dr5JSRy4aEj2R6Lg;fM0szbCbYaIx!2l0n}6 zPfIGxtXXZRIC<1h;iM_~vkWmIXx|ZLsd1?!`7Q2c_YwlOOr;$sJ+VI92`Ye0WjwM( zlYY?cF#gZR3fiKuK^A8rwV2CrthY?hs+kj-s)x12FuGc>fNN$01@(#(L*r^wtm{;V zMM@f8dBe~ILLQ&#(<`X9s-E~mD9Oki1VhP z=0tR-S!D$#a#{C8rnf8>-W9z2>(g&RGC%Fm#ao0)LTZu=EqBuX92=nqiyHdQUp}Rw z2#ABf0RU|UHbljdJ56WH`dq$gGg4phwn)yQ(Rb_HU#J#aMbBuW$u568`)*zCjfY)? zoqv`?v4_y|rAwqI2)=G?2WTBj$O$;swg1oiiHR+n>PZ%uKZ-g@43pUlo_PIp?}cIE zk$Q9s*Oyza!RCl>JfOWiKOsczUVEf|bXTGY6oMOKf1Jm2iO++L=i+|PJ^LM|oyc>( z6e+ULAJ``UgMR>+emy&R#QtZBStjYq{2oQ&t={5YT&)0-m3*mYE#$FiW_tH9h4O9En;+4b)?uSlQqb}8&VQ4Vfz zaXtN_G%fYuL*r<)t29gBq^$KYjUpSTpX0;mX!Gpl0DZ>YuQ!{N={pG(@+-v`e$JH1 z_R>;)U~I?6LyFdh4O{k&jfd&>Sn5+MPENfKv$gRZ{MYUQ@Q^Mor z)fV%SDAU}qByK@f*0EZ1nwA)q@fWd>$d?H0uoFvhpetuITFa*;WPPrssq zzP#Q}R4Vj{0@mR}s5SQ1H^vACV02uB>~&RT^Ei9>&Gk=~Cx^K*=U-3BC}J|9q4}!v?5+I|B}-lw7*vA%qJ?cm)h<5Um}9 z%=6>f@Lzuvx|(S2RYnrYQ;CJt9ojRc7*a4% zH&gXre#Qm5uVM(YUzW1zC0W>)`1$G*bnL&{5o&pUk&gdzWc#57d?lkuWH<1R`o+1_ zC-{}A8~FG=5>G%{PRr-#eCx;*g5Kc#$FB^5F-`jasn=|XOIpisUj@kGSMtfO$`Hx| z!QMdGtlYISu#s16(*lMh+mGU1hcq`>$v8z8UjX+rxR_G6h-sxO?VtIeG^Q2zLlux> zehlQ0f4ZfLd@zD)P^51eS=^~h%pWa~w;rJkQLVi~#R0kFNwVGD*k4JLP4+13_Es0w zvMf8~IvlK7aQ)y73g|6jXlU?2_t_X?C4;*@5 zS@TUQQIN-wtpYEbNT`3#xlh;>M4To4Strg5N6 zGzHHy1eR2(+GZ7L$0jU1$O0Kz{R5wHcF~B(=09sD+Wk2{EJ>6c#rwz%lB<`ax%4{G z^p%{(x~-Ge%_jpFMFA()JJ*!lgG1>{TK(=Myc7*B%;`3eYu3)bsJHI5-f>n9A(r@6 zW5N1L?t`pncfGwv5>4RbL>^_ZO|1=gYK-?DLoae#QB3Rp`NHl{-j?T=ummF@v*_3`38)g?jpee%$?^*LQ>Tb%J3$Jt!WFzjYxgI`^rgkzz_Qp=fi3t&_KW`(+-$ ztG(TzU`02Q(1V@0^n^j?^akH^&%}!FvGBd6nHFu?99pqh{^I2ctxpO}{c-0%X5A6Q z3GmIw{hxk7`VQXnip(E(njI!f1k4|kJkQUTxmM78rPZCtn3)a1;yoS}jpQTmD^L>pE0xHC^lM%M zDF<$v;{PDpBRxKOY92rSr%GZFebc~a3C%}r+m~u;xGxSY2zz`hN6uSO9!)d>=Cm4~ zW9=iG^`^bNARPd+BXA3p)mHJ*9Jo9~(*Gbz`c6{v4=LLftDL6i#9>bNyme0qL<$B- z?xJ);hft4LQgiOdRaQm@^2ZSPo*qOpL<-dz4YCV@M4ytO;3t3qI487z{hB|S+JGwV%W|{~xBAgaY zEl9ODC^I1K?e@14^&?j^mZxR|CF4g|XYui~;OojILq(Ra==Z!X2qcN7-G~3e6$f|%6#;z;DaE1cHke0`07_Mq*CIU8?g%v!S;#E>!07V2J;Y+$&v~s|3j^@ zU;e+SH3FyiMO$wWB0kSP@n2C#^c88kJ3{YV6EpD5J}qYov$pE)Wqk@~Au8Zl#ZP8; zVKWZ&@U5~F07~gB-FlkMyfVE&K|}Y>9d|XQTi2cBGfYfAxi3#tW_hbEf1FVkW=KK+ z&nM85Vbr9$vwFZ4>5Kf{glb6KS``{ulXewjQ2qOdiQ{%eR?Q5du4ClxFh||u4XA=r zhgj)O6UnEQc9B&A>U#vP5(X*lvR6xDU+?wjuY2j~wCZRT5T@Vx`G>bSe&n&kL#fj> zj`Ay}-6iVQQIDtztqcyMB2{*j1aBNE3itF!@+ZGC3q$y?&}isTSQt3)=9>!Fl9IIj zyqALi{#R_aH(qkb$yYyeWn+e`=#o�-n7{Y{tyCVg{!e*-y=Un6GcdVDqUYT%)Oe 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

O%oX<(w!0(SP}4; z!+xC4r|?~{??6G~vv7Bep-7vaLw9}O7BF%)a?vvKg~<}jjNnNlh$4Z2hzMUlzwtL^S>A{0 zcUSH#GIoXr8@P8h^jFxS>$_jQhF~eb+a04)Q~y7jzB?Z4zI|UqgGwdsjO<;cBC8=Y zD?2NtLX->HK1vIfO=P6Vo>`aKl2v49mt0w)jI8iGKKJweJ^wtf=Xu?C_kCU0`+dHT z^Ei(4I6W%^$n6U-RUyIr`L|313ZRUUlQw%e!`%lD29X$G_fSjCuVB(J&=i^4AlCh8 z!!!iFkq1&pVd>fQo^y;Ke%jqq!B8Wz2_49#A%4@VAbs=Nrao@84eeAlV(Z70$$$9| z^L*z4?^-jE>D^aKp)rVCqrRhbJPrt0fg=T!ImyiMFx&4JwO)DHp?|r%$R4zV4PGPw zkYz;tlOt02kLLY&V}94*9HE*I!SOqroqH3c1v40~bF!sfYpUsgyL#Z#D(`Lo_f5~; z^>!@OOd`||47;IycKcLUcWkl~w1%RB0_5m2P#H}#_wPqMuRbW#TS1r^hlGVW%}-hy zZP>JFhdy=z`D=K(;AY^pN3j!MV38IjVbydd%98{|ZK|rObs!~A6&JLf$4`A^ z*~nf^#RQzrbaL0gb0)X->mL9*2s{t-b{ecdU@atZ?aMc$xZwzP;x^<(F~ABNarDr1 z|K|)cIBKQ9~Y`zAi@Q_V42A0^ZDWvjI zJF;jOPnd{9>*itlfj7pmMWXNn@c}$--N$6CqT=_bT}o1Nk6S9Lnp*XElaWT;WXoBLg~_sH z`g~7f@fQ4*cve}F+=?uc6@=r34VU-X$X~x^u9_=GFCw{SjbL^Vnlv z@nZgHqq5cx&dcvSt4V{xty{P%7oY$j!C&9a7GKDsBlO>@gdB)d_ZH9vNxuk%d4!pOx2$!h=<@-5<)xgJ{y? zqZ~*5cge_Rbw5_YBbZ*Y{(N#`|BoMu^a z`{|P6`s&0c-h6A4H!t76W5*GPpK3kr3yX_pWp298Mjy#SIt~BjMO@r+%b!>Jl+~5g zH4;zIiX~(`Wkz)D#crL542j#d$NjvC!ET+bptRTiLfn8)^8UT9+drMl;y=t(^JNF~ z&%+s8-k%UXEf%g!i`3oGU@LZMWz+Ke+9@Umx}%K$``R}skaIu9Xqe!Q?ds~#;uVsS zd z<@SqID0uQE?WE=Y&i@hza3$ehv9UGjUd2$tD&-QWt^ftWbwiuWYH|T97hH7pnu^k!0JpHzXVdE%T@vxi$oMMXdWt^ub@Ws@%U#} zm!)J`#5}c0m$TGYgamgDHNr*P+S>ZX2EvoHWo;ML`avYY+8T>XP(ix{BIq&Mww(Rz+*45NBF?aL}-*10=@ihGuYkP7^#pTq? zi)Wdy39*){#A>Cbr}gB;6du}Bw?j|Qma9-Xwp)nPX?HKhmz(an_DMn$ZRqpuNE|_H zyCcr7;ca81di7hsM~?>9=naQOMY)Z4OQJ`zIvTbO^c{i-pS#CnzF&!#u77Iw&&hbC zRVZCl$Ft?fDR$9-KgU}nH3RdrxIQR&f>u9-I629srg?`DIXvvbWI@YY<0xJLJMRhi zMNIw?ekGT$jj9#7Ucl~GmJN`{l(O4?4*kLWAHcO6hTzTyu%5H;Kqf&F`g$^kCCULUFT>I|SY#tNyHsEU}n+WYKS6fF^PxcZ{vB zTv&70g}AV1;x;v<@3#$pnB05rqEZX3eP!;3%9SX~|E|Wq9)ZcY;AF0+HAfWW{0>oX zHQzFQ*}ZIiIm5(~F2w)in}FEubebvuF=Eei`Gg1|Vxr|v_}(?sT5-QIc+Y3gjG4Jb2n&4ClIV?O4Fetq@CIQnAOMiR;q&JM zm=BFR7#Lo;+Ni0i2^P{zSFg_EA&)3>Vt7Ta!!&KeGX?wnh+PaZLC5A{gSDdQ9d{Pm zUA`&W*@YE8E^cn>*qSoRZ<>MK=2#c}p-YmDEsh*LT0JI7stKwRcHMLEgeTmp1nrW{ ze=5Tt2fT58rmv61h=M4YUU^{uezG0SxJPc+1h)8v?-zOv=u!Y#%O9di0bbU`2$o^n zea*gz6^iK|&tLW64bb4VMt@62TC7PpTSul8rohPiMfnn0sPfbMTqqNRvTP?V)i%H1 z+xCYhh)YsF^1;q3M|g0H*~9XW5$^O(Lw&{mWj!z5N0RS8)vXd1BAwUkBBOmPxi-pw zx=iC@_Kz%{+Di=~UOj3R*=6}U_i1lBDWvLH|3}O`&&Bd7DoARO()>HB*2m-)f_o|V zG&Su-90Sm*N?p_8G$n99WZ{TCg9*_r#1)VL-SpHwrw4WY&C~yz_8bPSwnJ*>ziH3L zr0Mz}4$#*@tYb@4ORBCvu_sY4jr_7Oybd%;u8|s*RY{k|mMlzsla#o4aqjEan{8u$ zb>@$vb-)8l8ZO4S8t2`AQjCZdBj)3ir;({@LEegcOtN!mz}5jA03Va1Nkc!}5qR&h zw>(u>IQpd38}C&Rv0cGXoL-xUweo}=I3~c818lpRiy#~le><*{G2!6U$}qft1j906 zYx3j(z~}q@MG^k-t{qlb8g5tOx=m{k{+aIi{%1qM@J_rBMOQ2WZu?ZYoj5Vu7!mQ# z&MfBZrNFtCzh7Q@e5ZahW!v)X6r+=kn}|$l*v?zgaVJ%-Cs^TmfxlM6SU3uo~RKCH7N0mlz98%>}aK!_EAsetNId?b{gk@$>AFP$1^_9 zMUcok8SqiRe+g>A;}Lo2nW=||bmj3x4WynP5fu$s{dh-{xT!0Cu6Oq;!02gmQNTME z)4SX!La=rkt_bK+4>s+2*WUbie_8mj>h0Q^8U#%qXTHKHR_>H~8Dq3)W-$zl^fjlO zU+lhXO1DDAeqxC?Wm@T^UQS7*2ItVvpRXFoa(R*sBsg-)n=Rz69RmnF} z?A`?n?u`vk)x37>cDseffrqsv?GDTW7=l@tpVtb}C{#fIPdhj9+&n`_k$c@6m zcgjZU9xi6a1SiLRuer(WCjk|jp;;o|7;CKfIgW9jkg&U`r%dv1hy0&vUb4sxnpSomZH37SxN*`fL)QJG4*g2R?&}vn5 z!-e%ly_j}>x^Z4(2QxXVbn27^4lhg*Y0f+PfX?yYr!X?|Kb*s`rSCq>1dG@{BqJ>H zOeq8iGRU~kpFc+%v$yXy97EXS0}AdcMpf?fFehBa{Fc=ySjTueVKYNS`M{mOoUS(y zXrF0T(OXkvh3*DFjN9mdp<(ewEiWDz1A<5#&(3)GqyRTJ4ZKs!*9{vsn794ep6yqu z@diIaICo;=?|bWjKR<*Wo@JiD<5PC}(u86JMv$Eo9Cmz^Rr>Y8=&9~@d|07Nc2F{o z#SPc2OW?Mwzal2XR`=_&(CIEddsWMcnw0i^KjrmERyzJZu#o^G4DdXk-X`TEOe9wH z8aD^PG0fSokzr!=-olFPrLph{?s0STZ(zKMYu660ffo3DXMmdvzj5b_%8<-n>>lUY zWTAxtLaX^ZckTecG@tT)&1TnIIuD=%o)aumOANPW3r4iuFd6KIOIsO+QDgvG_((9n zAGWg`*WZst5EOx#=S(Y@ti7qP0ePog7XRA9x?rNwn)`xz3;Fx+yg;RJd)E3_{2Ung z6f5&gwuIb#(MrK*Pu^|E^})E*!AErVTCckC3i}TZvzu8)J&nEbnlI-mQx@(g+%*cL zjOekP2!FYej=+-DvHREjyoA2`DR&7JtUC9HEi%#|f6s{4GBDvL z(B1GK6fB+CEVxuif2CDCK!?%2hG@x<@bI4#6B-ixQXKG7=Eb3A;v0i!?wGdN@#9Z# zq2CM`bUOU~YkN9jc$yLa(C{bEuqcNNX#KLe8Q<|U37abk_1@le8X66#>+qxa3L^e< z{*$jXjbu@U$dw3??NJ|*d=-x>VAJ@b689JZICJD?E*u4&2zd?a|`_AGDH(l5BL~jO1PO_CVqX6aNj(WM$6EB^WPNO^9Xw7qdTu|O;P*c=QW)! zmcPAuw)W0tA=g8fZPbj_%pL|CA5`^5xC9?fQ$}79)?xoyVi& z;>Sx&CS8yOzZA_{4sPo3o}?`4BaU`y*6aMI5IwBlQZ4l znF1Q1KD5n`2oD?T;L0 zW5HB`s=NlW!_Cdj#l_{;ty^HfAxx05M{gM5U3tMo1GWS*I4&tEfv3qx2pwbj|H90Y z4HzV%G}@Ql#1Dsu_ZX*niuLObp97BJF-z_rhz<>(9PORiEIq0|B6<8@y;HfY@QJCF z4x)riCMt@zq6-}INZQ5B_ zeytWTU&YA&@XmCvyDIzE4a!Q9D-Du254^IxB6ju4_@}|8cP=;_F(rQ@sIgi3B2bdD_|nO`rHR>+Mq7!Ryw%v)Ut#KUdZxv? zGEq@x=LW({8K{os_LN$Vx&{Bsi|NOG*psu*Ig zv`copZ1m-P+~>*JA@GdoF~h^cXop2Eu9a}q+NO(4Hc$lo?DaZ2Iz!_fwRLrfpKiwo z4cId1fh6s~7R~Bl+4b|CfcN+;@DjmaV;O@eNzLQx4F52Hx@xBq=&kDNFU>IJC}97C z>@Fn4gg1Ct2R_*^nF~aTdiW|SsqO*hwQUv#0QMhVxKSS^=Ji)6QYkC;Z-dQ5n=3z) zo^@(^X}al{RAHPuby=d2-Av=i@z@duFJ*SUUdU7=qrX=|fR|S>lFVa4&saUyDqPt8 z!h3+7Wi>oOTOPb$yg}HVHqi*y6EX-opg0$_mvDV`e1duO>voR&IsKA%c9@Eqy`5C* zIN;77Y#^V@Notnr?1cyQjqUGI5<_)_j@Y#Q!cuZFEmQa1db$sgEQI@B0YqGI04$h- zKDqS5UxeXzI-Xy$Q4~9D@!{cYuY1E%Ja3%GWSBl-+EM0SxcKSzn)S;QE6X?HWIcC; zLh!)OprzG9>@&;SkKBy>W(&IPrl?=R*)<&hv5BP^!@gwTBl3>y18%_+`=?QnO=d9K zVF#Fl3K$rH-Or7;Bdq9~!)?-C2HcKEe0I;P+3ZS%D1CV7x}gB<{QPW|7;ol%TJ5DY z%|lXjCDJ#TiG`nuS+Y7(o=%^8JiDA`s81Ik-Ywixa)ybsNL+4K{^IS}4zUvDWYyI< zxd`Zi_PlH7PJ#CW)tsUjC71rYz*E(WP{l>UClar!>r^V)&CUbXy5 zaR)#%*$BgI^V=k7M+(G;*~5`Df^Q(>iF$$KPYE)onO^<(Lc9_2<}|N9f4!ng3KZT2iRYDG-8Ex z8`^QP5W01OGN2UKAO$BsmcotRh{4u&eDlr(WVg=38=_+l2naAme}M?SdYReoJ>pl8 zPjQ;N40oTLEF3&tJkoq3HVis%Ow5?f`Fk{|IV(_0p&r5O*^Q0ok_qJh##d5?pN0fI zX#9n*gmRfG+%j=*|Yu$=8LK4`vw6@Me~mm@V2ZhhJ|`cCEUS(LUaN zuvxVry(D{rJ#ucYDr@HDvMl7Bk#2|b>(Js{ry%no60cXogX z(WsA-P^CXpc_(QDcTQ;5Ce2^L2Dc;rzFq2h5M;)%yhm$;hywQ`h3$+=+G|M?*n91C zM8!Xa&OvplVXhRjkiU|VQy-W$pxQ5BI~o;-dx<`K`EOwbj6#^lAY)>C1IYiq6o+3K zBB+4_7W3FQpF5^}uG^LkwmHP2WoJT!6 z`QVvOLt?h1ugAXXK--rLH7aboNU zOE}KG+-&!2yy8Lr55ya!U&HM|iO)qv0LPnY2K^JvK&YT{@$tuZl3tzr^4TkqMw@*^ z)c$C^A8E+8GORq>u2t4BS171AGyh^@ifNZlmfqN6tN+YtPPdrY{kF-A__1GO4&b8K-cOuuF2l}WncZOgbQ*0sM|8kIei)2q15fuCl-Y3%NqM?yiTt zHWf=7ykkDc$(ebLbce-mX@F{1?miof1G|JI2-%6!DcJWqk*5O(Y<1$dJy)YSY*q39 zKB;=sd?@~%VLWeiyOk2A*=(=@)-R%Xg={B{+CH%YN74Z@Zp^ zLLGotdj(2l`1>rU_gi$dyu6li+?`Q)jGbC_m&3_L9h?Euxkxtz&m$*4c81u^!Z_I@ zBqCDa6_%xIXc#%EQC=^l$@*ab$(zMu65AfNMrYsB-%|aZ!9sG=p^`suHNUT%Z)5MYXq)o z6IU}{;~QfzP0+IkQA>!~f0k(Hd#|nS@$d0D5W_Gd^5*A&tk%YFYgaAN1z43hUqRZs z-_xs%{=~sf99D?ZO4D7;U)B@(iV%n4|UBX60Xjm9YM58IrG{`ySW$M_d(DuA0cMsrS2R6#3 zXMmR+KUc7-I;;kNA8qVQt6rd3YLbjoPu#L|lTBZS!Ogs15d-J)Tdb34(bK;Z3)@t( zw)F;Q`@<=uj{TM8W^fymDr)J?@9%K=@GIuQhsAmJkt5p{Q=&W@uUJR+#iiadD#e+7 zcJ&&Q(sozuJE3ZHfL8%C32NT6&G0I|TE*BdJX_fhc89!ti$9c#r7(s`l+BGIUC48p z5U)S}esGd96iBn&H*ib4w~jmFQI4IFgrsSWz4n$96wTmEuhKPpwba$?0k6tls-pBS z5J;XF_{zr&f0HEkP|39YRNrEQW-at(;C>_8*H&N{bjd{^9v8Iu*Gq2SvhQd*48+TA zzY#KBt7l?g$#Rl)`iQIV16H?(-7E*k5!BaESNH6=eLv8XhX{M$fqA=iQ~DQA>IqfT zKiYo`@c}nGEF+dGR%TZQE{GBln?>Z+t_ZZ@-2p05Qk@W8u;TN|>b4pyJ{GN(0i!u}>fzcBKHtO_um5~}y7^KHvm#T1ssP=|AFoK_LP;JE%N%SH!V>k`V@`jF z%3Z3DpQ@>PMz?U1;i`X!>Wucjx%|`cY7DokUh&V|T(OiT@;qLl0+J~`rs|BZEYDWx z|Neoaq_bR7u>k89O}wdDo6T*W79qDV^m2UjMqS>=MU$`b7&(ff0V<^qz3@*+p&%KV z%#mzMkNnh;bLqi9BiKU-*Xm0bWqv-FjjwCKR^zij?{0e&T%bYoQ=Y%@Jm0@c&FUDr z%R*g}7K-wx+MF`JtRg}``1u*{e?x;-5ShR}GRghR_L!d}4Rj!1(kcSqf^{@=ACqu( z1i#42Y0SC1Rr`F&ksJFuxGyq7OmP{EaVAL#Gs0sjLL5J~S)pBwm(F-guiL1w;m^Eg z^^$>LRmZQV$|oSjG@*I|VWQ1iG)jw-cFh&S?79Q&5_Ro{QJL8NdEBN=NSB^e`El+* z29XT<1+4(s07MOQKMYQy0Mk(OFwi8@Oz|O^bi0mR1-*mLxkQ^7UW*8y_)^ZaE>^?I z$H#if+->+NyB`>Zn9=e(3vAu7OnKyL2jPm5`3TPSR+x`qO z2r?`C^Y~be$8LYFo!;h&-~zzw4MJx^SUZ$8Qx|+6PQy(K0&OdERdVpA5pVCT3g4*l z|G5Hs?W(bIB0)#3+jTHzatdDCO;@;=-mB<@t51{Sp$8^RfMp9A|ByG2uLXtysO|g zKpnL>kU4DBLnY`EWY!TIYr)83aPP{MSFBp9nfoyWRSIxQH%~_l7z#|AULgO)QE$kG zqA6A2aSEP!EM^(SHF_ErHuFI4-^t9Y_>sDx7I)c|WT5|;+>Qrqn#$_B3(GiD^Fpws zS1E>5kKTf+Py9?39hu@$wj5(*O#p^3h3rU zEVWAceSH(BuzIE%^g}Pps<<}$rt5jdqQs9M7;DKg>+3wl1h$}QSdc?ex-5pZDi81Q z>DX~E>Cj~N95 zc#vV^VQJpaTer7&r8pSLUzhpwff+=M3&O@Y7n6*~SL+B>H=ZV{ z8lRTjw*C9f$N0F8S-nJ~YJNyn<-Kci#w6XZ zQ6y9f2?=c~RRc%q`9$}@!=d)9J|M$(r2k@h0QE!g(H1POabenDYW{Y$)f~*Mg-#sp zNg90^mR`o4=q=NwXBWjLJ<;|D`1f#%BOq}Cm=dl+=_g8>nwyMA4s-RxL}VEPf67R2 zzhGS)Rv18v{fE;HX{tZxl&ddxTr2R{mCfkgVU$l!knB(qat*m4KHmW$2snIpS#ID7 zmLX$@pC_PP9B!qV=Z9V{&T`i{C@wOyfRGyY`FVzq5a4yuYt*)LueaNX^R zJ7Mk?1OIW5SU09bjW^Z(t&4XeQ_KqOKG)P}W!Ae7_)_$_6BCSkuBH4~CB$!VK$el6 zlan*ylEhZ7`HwQh(sVOe&Of`a9J#YvU#QwyQAFVKDK^t|)zwQjNGQ%v@ERfk;EyLK zrq2hz6|L(3p~c=c^C{t&=>fKxFT;6;KdWyR8tAR7i@&}{XN@_-Dj}31_Ej>!->iY` zoUW6i`a1eZm~!HK=&*^kzk(E5gMP~NjC130n)z~?iGb~E08cn0<#W?o!7-0oU006$ zDPrzDn+RssfkggbWJv3H(2>htIP|p*b3WP?6Nj(jE~1#1V`nWU3(s4fN_L}P!if@$ z(?a7%s@wMxc+IAO#n!$az?HsyLx(QdC+{|-MycOosN>jEmVDpVhZ(WO79yPFIcE!F%jWW0O)(ylnh z>UQH5qV=4YS2<!VIzIxC3_1WF-Z#t36kMBEvHGH3A06rPs4})*qHLkAl z)h)mOQ%aD*ILAC@Xy$IKTzKqp5S{r6I**h#*8sQyYI}i;h(k@h8f||TK?ypg_NfmC ztsFJ0JRixi*jKe#acy#xzBWCoes*`=V|9xIW^xyW*oU{hSxwGAY=7LMi6S#q+gcJf z<6I_o7ptqtbTDtgN6};LZOESQ)y!uRlNpQejFU*42lXyi3SjeX zqBDa49aTDz1&K#TL6Svb0)5G$Ub1SzX<>S}DShAZ_I$i$EulN&cy}3IFg1-8`sO7w z1^A)DnPYq!Sq6dxT|DEVGtWIT95a*2zUq`wTaLo4m}RA)FslO`ZdW!p?efMH0?Jq) zNF=h0@t7rU!a^LhPeZa`u9R)#E5>N3Fs3W#RIxP`P)c;YjH@Ko1npNi#pXT1c28u;}5bF{S$*0~w5g}Ih=_8w2Kyya-#!IV|`7_rT;0;T5+(Z4T_uu?Ux6--7 zBX%%xzPY4x54L9LpxBXPWSui}8pSa%jwI^XmVd9eIV_X@9(`}e3k3+^({CbZCdQDm zL`J#1X(vaR!vxRMddtq319dc2qo21kX=E!PdvCUtxd%rcsz)91jTdW(3(sRL2y*cq)Ck3J` zd9qdKL8J`E-o(^v%PJv%Q`f`^C8|R1KshIQYTuVhSI3&ZEcb$?cvNvHW)>J}6$VGj6wcn_-Zj z^lgTBSF~)0+Cr@uMh!5*bb)NgkIVkO+rVJARP_avTw50F4_SkREvHhS`K0)MA z+<0;^NNNG=X|(3|5MS6*1X|hRoN2G})+?P)jLkGHTY%eT>;|{?(gGG*8X9dOk#=Cz zC3H4wWMUr>pDoZ63N1N72PGS{_NbQ3d8$;^>;ik6TgViz;LbkVb+Gp6im2l-xJ&w&T7J|;ve-Xv`#7DV+&?TOfse6Ekuiv4s~M; zD|A8>Pch1W9oW~7iV3J(#56|>7+0=yuTko0mY@vxRa9JWAlWV~Jq3AGlO=ElWKz&e zV?0eV3lWfvrVO+zI48ymi(lsw)ml2dtyuE;?Jz_9CoQ|v%m}TAs;$#|3hzR9cMJ#& zbee%L!_`Qcp^$FpRzb?hY-ZD+As>P3KLvJ56&XWUf%1Of$hANZjU=^53NTdi+}0x2 zPr^ra60bjY-=s=)*0(&K!~ExKNL(xZ)X`I3X>LExg#`x9bQ0+|4$*Df7O*N^vsu5k zmAByEk)XFm=zwq#6Kdr}rW0%BM^0jL%&;;Iq66IykbguMS=CY*nb)3CKqWP zBf{vv#BHmT+1Xuhg8k}XNyO;*65bzjEjj}09^PmQTtRQ5WYdR%BZ1ATcm`S?uzB%C zI5hpu+J)5qR&Zq4IyT-T9zF+>fM#+1`@4IxY%?inD^NLl(6^F)L%@1hX(MDGE_P6u zZqK(sTuZ5pA;4h(*Y^yPdd<-yME#%Ru`b6V^|%K{l5ium!1@9yGdY`j^uMt-{$ zUPsiZfv4XZx8)Wh4}edfaHl*N>NU(Nf9=mMc{Be;pBLH*Hr)ZHK?pKPzTX40#-JFh-6j@BUl6`G&Q%HQ@E- z!)3~Av$r~|jP@U%!bYe$5EjoOBeCB|k0oj4Nx;C+fsf66l`^i(_Qt$xL5TI zPaiF!Mz*k9;rUGup#!xaAFxiO)`qP5rf)_j2dBd79I2_GHws!95rNOl`tmmR);O2@lPM(q-a199{w4|vmH2k`O-=1S z6Tfn*67*E9AHSdbamk8nv8!+SRmtgWG%**VKEvmLIXdqAD-2a(p`l6=iIaUxAPr(Y z_BZ_=CS=c#A0MX&$$1-^QFxO@vl88o%Kiwb);r+VwaEc-9-Z_rbS?1*5v!1;>e5`n4Vs6)k(GPiIpdNN`L};WXc@IIsvi(XdTF>wO$}jIEE_8;iAvJV zSe}lB0QN9Vkg?9N=%T7&w()bHI>hJy84JKUt(1WPOwS}&p`L&&Pg@v03>uW~LsZLo zl6E2%n&UnOuvLKN2FIa%I-*5X)F4})b*av5xe2lW%L`amt{Nw7DMs6cofd(eBLKF9 zVP-U~5yVmFrJ+bJ-kD`YH$*&p2DPp?pyAUo(gkaEWkNBF`ZEemBJ@V@q8z|%0407za{39zpo>Fwj1j-8jz=~zbqYKX zi7I|3%GyQJITKA+BE!QA5Ui1sht=ls3{Q-2cRMzp1NiI(#lW`@Va_pOVcbsf#TAjz zSnDiLCvK(yJ>egomp%ZxDDWKl`rtgbgw{IMW8QM4CnhNoCIKvF{XveO0J=d-&`vdF z@fHZ-tU-%0AUF?^rvBNnEL)!6bbk%0J5pfxra`D&$50YDUQ7 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%0D<+HiM6=B)d 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≪i|gR_33DBU}4p*;c`axH|uzn<09g! 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

!E~M!aQ@=%uDq+Cb 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

RDdSkP@nbtu$FL8 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

b4@uG$Jw;+;>cjA0YA{ zAe2|r_G^AOvt>$p!{sLqkiYqy)_ahp>F-1Kw&hJ9X^R29{cFM5T@j+a{m_pdF5`z( z*xP2VqL%XoDHL!sO-Zx7l50w@F^bK-qGsb6?Gq8ITydsjeN20SCjq$a-y7pY6U=^2 z>wksY^H-N#n27uu#b!%@SS}iKu^h0UD*q5KDOueOBn^)B{Q-cD1j*? zroFcyhhV6SN642rJgv(6eQ68j*4K_k54I6@atVpxE#N=6jv1al7_tw>x^`_2-*_;! zm@{tD?&nUNDs$D=V$hd`p4uM(GvL$rSC#dkk8cdhQ-Rcvg6H2Vr2On$@vUF#H@gAY zYTVDTCj@S_M`aeZvXf+L#OIJP`5ar76R@^06=R%FE4hX(O`LPt|3Q*dA8-fP`oq46 zgf1dKNw+c>`Buu6f7TO-X30)%e8ZGxA4~Ujp%q!s`Qw(Z)cXF`JYZd2&$ZYF+q>=M zy#?K9QX2zCBRY;?x3BE+<&zITI^3O4)|}zTGJI*m_74*5!Po~H9JMxA`=s6m6m&DH zvg(UMD_;JoL2KK7ihob>3(=p|N-DX#?<;%UxcA|>VfxTJh>@2b_ca7hp?Min26970 zrk~_TSmRY0@dvf}~L1~D+wzH((Y;Mi=VI{okv z0E221-cvSB0~=uWlgV|#;MVw^arJP;mfeSUl;&Vuu<_{an|t_j)}&7h2O@6If7sss z_Wv;Tm2pwF&D(^4NGV8{l2XzjQU;*3AEL1jeoc9qL}An4 z%mr)K1c!}0O+@qH)hP!F`x@^@jZvLR=c-f@ZeGs|CManf2Q~paE9Z&M6TnN)pI}u><`F0?X$}SN%0B}tP966Jo3w)q5Z@rYuMwlwj~l(XIOCHX zZpgkhr%^k&-Ss$PbkKFLRB%TrNrzG889n1;`c}C36tx^z-j)&o5rG++#`_X!DZk>eUh24BYyvRQ*Ht7{v|Y?k>@pemE)mNu)fYazTV8kFb=RM zTNz;=<)34&iontcIX&9goL5aY%vDj#39KEVv{*IU%?F+3>yY@p=(F!_3SRbj)pV{Z zy#E1ytPTAA%*n~=*BJOZ)&EHIw;S&6BsL8$( zfVMtdjnut28**z0m=_2dCDfSZ+qN;UOK&JBt$?Ag$h_HMd=Yad$-4`6Fs(Y68(1Iz zsC4v7MTLx2Xgnl+lN&6*;|y;gw22_cAM+JfSIexNTk|ofwDe1?CGYh;8)EH^;=H(Z zt@s`5o@oR68Rf}BCRYfIl%XcS0U%-iQh29F-_#%{U3xCJEZk?5l&fa+Y}V&jb^0cI zE9*%Y9+Ap1A(#E~%lscHrh@QalEM9?2Dz^1 zuC>M5mN9vf-$U03`@zh3MR&Q2nb^Nx z@IU3*m?MzyBALa=qC`XT+2kW@-{C}6?K}eMAjY?>|^-iPD*QfIBSZE3NvSEu{(_XMw|t~!@?m60`Ix@iu4pq^M6IA#QT z2WN;tL*$i~iOkH+A~S90Re01IAo%yAn?rD}jNkYIDC8qDipSKdD%raV7iR$Q?P z`P~7OG4o1DZLEN)E%}GM1Wnq;c<}?>+u}O4Pj7CC2a#Mm5LO5su)6Pg>{%f44_HTg zHLZb*Mwg5e`+8@GDBlabz5^@nRxHxL=%HDseH0>Jh!~B3dOBY7o3swHjylidJ#1p9 z`p{{#e6QnRzdavvNLLd(|4H0ASju+$=caL1!+h#c5os!8MLp+JOC^zX2?C^axH;zW&gpDz(-l&jJQ+)aO7n7@SG$4CU&DDJ?cg9;f2fQk_Pw1aUdYTx? z8vWYsC^i^#b&chC)_n24se7|arg0*1ZG!4J)#%b7?WR8&(fRnfs`GBf>Ma1yLoV_9 z1l@l00mPtw_5*IrbLm<^Zm5EKg@ek6Q`M>0j2BXm2~u-AITLaa&P5a7608mnaZbsW%-7RZvDz;@?l6i;zvY`Y$&1__? z0v{I@f&NbUmKBDp0gh{5b@UGSu zJ!mzFY^+cN@))>Yg;Yu)Mh;6)o*eXcW@O{tDR#ZSnB6bm_9q2Bkk{n%ooHTl)4q_@ zH6s{^aQN? zm+}X9e@-Nb9-r1&NZI*U|Klc!9iuk?cqpTC5s3)ndNNr-afL7QthD_A#8i18 z%*-wsch%8Z_z<2uU$D#YNUHUG;?gu+Yiquf_Dod)E<|||@X3sq(d9h;-YJm76(sFK8ToK_$(s$o#ZNB1n zv0)nROg@A>kj&x3qoNO+CVc1<)y)h{(jay?Z+6sbC+Yi_KXJQolt z@2W5SB_UhIq<++=f|S9X8F3XJa#!9|nT2h2bxooG;}Lr&((QZDN1YS*g3KAWQEXH{ z$Y-DB0hcW#f(M@z;iUp_n84;2H;@wnkH1@Acd;C2((>r929GFTzIijW-=rVFxY|D$ zq&C0Go4i@v8E+T*v_xwiRRkvgd$be9f?4H9MKg4e0XIek)l4=cQ1Q}i;1mbX-)+9(&7FcZjPH!AHv*>?+m^6oy++1#+=odGY zF1JMSA9O0f?+L(Bcab_BQHrcZ-Ae`P2SNXKsu$N z574-NthUW%*7eKWZYEW7KE3>U4HGN~nuw6A-^ttRlAg8xfy-8rLMTpqL$|#OvzxOC zhc0c+IW*9TkCD*(?7O?Vb62u^czQ5bZ<+ok++2PAlB3nD9{U0NA6Vb4BP;EqX5{$H z)>msSP1ET6?WdnSOI%<2P~lhXE6{v!hUbgDiw|HTBo)JYfyoxlW|e zQM=r=r(jUW>ZrL9R+XO%QN8bK=f%c`L&No`Q5;oL6P}UB@@5=Vx<2W8=X^iY z2=JV=?QCIuCzofyI@*b6bY3x`VMX@x|2>riNU~*>X!!#Y#8nUAD60;%Jo|h8qb$`;GlIy6-!Ne%^Y#6y11g( z-fuEqT8gKEQ4_OWuHMZ>c)b|e-s#Es+CYbX&ncjJbhqb4g1Q7l$bm>9hs1#_-rM#0 zuAC5ACN`~XLR?*3M%~<-I$uoLXU_wrH_0tW z?(e<&N_MJCj%g817L%_+a9;i+=8*GHVsJiz{Y7T~CX9q+H|JtD)z>IsF4ZoUijKm2 zue!yG)WEkcuq&#(X&^1{34eUY?mbblQ_~r(ww6TdJ={UmxB7F-lg16(hnk;s8*vC! zdlJjz==euhzpakt$G(jRXp`atdCLRY?AkPT9r?T_T=wv0FMNTD-z}6486xpeJd*1^ z288&P@p3Ac-&PdAb`YV>(<2_Ym*K9b-*g@i`KSH0#QZE|Hu!FrH+7xgdR{d0(AR6& z+m&v62*#A7!Q6N!{n;w2f^OJyaTxYnwHK^YopY>ydK%>}4$NKWH(b}lR}ubjdfS-SB~Ht_)n{P7{U%@#C{ix zxIsd>s-Qci{RXBp4WTGgHwl*zVPN}ae!ofjbf7HSed%Iw)QH|E`Vg%gLOw_%xeW<+ zT^kUewF`DdUv^3-HxPIIog)1nYlG|QHzZ(Pw+*C>Kn8b}Y)KuHnT%Ric7U5}T};=< zAzw#UM7{KY-^a;&3nAX>-Y2&8myZ|2N~eggw+esSV|Ogg-N+DoP}hRu%Q+YC3xAdC zV=XME3s$?*OT)rCL56suNYj+wJ+ZH0T=(pvdu$fDrgU!Xmp(N*n$OjED_tZLAijnL z-dqJmsl%s;^V;ce`6_6h?bUwtWxkqy*Jk-HXkdkjdbF`#87GqP7uR1C0*7w7y!J)8 zOx=ti5T<`n1_g=G(N)q*OVk}C!|Ja;HBUS0QSE|!r-!AQ97FHiU}v6}QFO2Sb{`l> zN=zO8xY#VNJKH#&88OHMGG_H~%fHZ}q~`A2f6=Z8x0)0Y(+;WQSeyr<7Eu-I(Sq~( zsVBL14s&z8R=L-ijQ~mAa>4G!zUpq-B+5WHt6rpehpC(PVR9IYS?_IgruJz^HGU4V ztxyBU2U^7ni<;MmMn;gLG$+;-&X=UASY+zPcTxpdnOSo71iKP|2=gy@MN5b7Fg;|^ z<~D`YPoli40n3534keJPQoQ#Wlc&M+Y@tp6)6_=!?&2z zLhMPu(p+aPwiNhZ_V=1pxz=@;2k+8r?JOsrcw;9)r!zF!uW^S6XgnagHsNW-p;|ic!lF+@QlYFh*2tAd zC902gfaL5D*}Nb5wUMnc+6U7DZ^R8gEO)=oxN5Fa;<#ScOFXq0;FDyzFVHK-TJ_FY zD?BZjwdV1|Kl;D-|LH$Z>5_M;Ws>R1^wZ|okGHt+u*V@W8tPg&&l;URQ9=-HQa?<| z?@^0e-bNQCOFb*T9rHqYw4N!LLu|CUp7i3D#!2xi8hh7zX()Zs0y`B-Unk70)E#Ra54QMalQ2A7Qg9ssyx7R2qoKgq#QD!w){W1(zO)p+ zN)WOzHWK?atc5733cI!RveAhjM$HO0Ojf*p|0%P|i&eroJSL%|t$~YE3z4^JAgpk& zfs0_T*gri(0E-Mp{BCe0Nr#e5(dt72Gp8VRpIqCx4x4n_#z!n=XDh71`}bgpDnNPK zx8TZfUd%rN!2t#G&#xpB{06=k=AR66@!U*|zCS{GIIvL}jaX30SR@sAu{H?A(PURA z7kCLbr$Jc8oD^cl$aXq&HI8BPi+Y%{2$#y?+?3-dUh%mnXU_HlfLm#nEl%hLh~X^u{SP?-NCwOF}*QR+c0 z*8*a@>(-Dx7XmVLaYgA5V1B#-rt$f)e~rI%g9xwX3$vcs_5!*fJ^crti^ksRO}{kJ zg=@RmaZmm<5YwvB{mA?_n6I<~dhjv{8tdFe5&LD(w1;!&G+lSWep~CPoidADaMQsf z$~ImIoPLG@$GiJ~`v)*&0zWDI`NY_e;+JaiFPI3w8b&Jt5DautAI6~p&z+b|bZGT0 z4IcHyr}$06Y?P^NzYQv*^7f{cmKwi=%0pPxzXzgKNGk>$gvCg3mFO-=Jy{i9&OK=-e0Q3xW*IplopBTlldWDiA-7FW z%nW~K*&>&8LGG~#bLEjpCTT~dwA*Xry80tZ}!s}!}RIVrpWgq8~YpE~9rQDJtF zdS=6-@ze8rDgsV(NMak5`o`o5`a)1~0MohUqhW*eFHd4cSNJhCiUvzw|7a7qDzHk1 z7U`tB#IPm&X5_}iV8i;?AfS{br}O9h+tN8{alWkZR~5ZXZ*jpc~2zoVZ^Tw zRL>e02@}5?%G%Zt7WesPOTAEGJc%`| zVl4jUX;+?>l3x6xFxXpowp2}Un?ajYs*Ho2goprxPx8MAcl!gLTr2iPkGy00DLNo} zilbE#(wm*!Lop;?bcDNK_mMcjH!U!~a1N0*I`hd@k zcXo^5Z(X`E^<@8#EbzwS>&{7{oBC--PU(~pnhwIT>*Wa89m~{KqC=YDbWYS!#OrB? zw{q{D;2Ul~YYOGz$=4l|O*m!;YHSIgt_{7KmvfZ3Nj{`Rsk!Mx9UQ55k>^=YSt;ms zEG}v-6ohy01KB~WsN%;e02#~%JAqESj9zE7b>mw8cC8V6Uy?@^ZZqzGhM~kb=%^v_ zkcMF#qC&dKf*zrY2m71Hibxb~mNyFF-AdjHJS`!EAE%;M>7A;6dbJN9=^s9QttcMD z9%r7(31ka=To;DA2*!!8^=z8uxImLEF z&bZ$%?oX~nmN3%>lY|UQ8gTUdzglW;``}yowi)R}s>aTm-`cYcQ=^8kt$Z&nNxcKG zm1J#m#qV)4hH0Try*TmFJr0!eM8t)o(r2&xQPpLxxWgnx#LA3J{-K@|{Hc=)#sw%i zpUP-wO_9Glj_xfbxW*V-edS&Jp6cL8aY;ZAeya3VH_2PmXqkgpfl~9G9tuI4==S)< zCuKeR3!X}aMGCrt+oc`Vl#^mc9ASX)NJ(6oZL47c>Ov@*q-;mHSm4TXamlGoLr&d%&K`taVAyHGMT;5qR*8dv4{f?GVmFr}SKW zBttUAGaRGgdm2fEw^iE{ESv1>w6Ghv?mnZWe}ph*D{CnTEnR&oh0{dX?i+;EIq+sBly=xC9#ztMoGZy;^q2d>Kd;KAtyepl^HXd6fLjrNUPGQn@sRP zG!_rx1(2Ij@{?c{HV@#pRjf_#<)DifiIas)b~!CntvsxSACvC-sS(a;YyFhlfnX+? ziICWN*3K1sD;u0=1n*DwJ;1HC>5!`ZD(LyD?^Rq{RcftdeTZ!7Nd;l|VJcLH$Fb-{ zok9Rc_E?hxlEd+|%#SFnN4c;L!~NJ|ztw`40-$20UvM2Qp~-Gnz-Y$B{5KdV-Q^aq z@%tIM4!WYd7YYRvBxXj+re!eV2_gYuY7dBtHZv9rF>r8S?bkH!QSmrWjq5?N*QXMe z4_S>|VJr1NYHP4^$>}HNshGN%Cb`36ERQ%^g7b!*TsA8M3V$m^P~4<6grb41^+bm0 z;fwvnm}->It%>gPWN4gps*2x1T5xRc>JqUn)l9l|7?+;iwefw?n-pJjGby)d4wS-d zyzleNg2h7CfOdujqAU}&NGLuARPnz{|E;+VVuQcM#eQfVZF3C5S+bPf9u~xNwv|}j zwhnEC_B+{djYc4JaW)*K_3Kma0>Zwk@&>C3wB#N=HOkmB%be64fhi$;h6!jt8^keK= zrcDuQ)ibh1;PZsJ0;zqf(l%tXEL55M#hm8GuZ+kx(R#G7MgTI^i z#hnx{7_~a*zV@r@-zr;vViTSA96ExYLan}a2Aqz3;qJNO>rr_|_w>V*gpIyI`>+yi z9UXy9g5Yn={%qr!j?WX{rzddTE!Rx<*|&VpuFCDP%D&v-+mlYmbr*G@n=WD5IbQo6 z)i(ZwnyvG|Q~mpU&sU?ANb-hRsdZ+Loa%DK&7*f1WCS$YByg46&B3?+y-VQ?1rV;6 zhK-~alZsj@RR@)M>!T4ML<`}u1X>FqLxFb-W7@_?VBao>IW^D$uac~yr_?$);_F@t zN@C-G)zlCp&Cjm*R-`K(VewVLDG)VJTx|Q3pLM+ zJ*04t66 zjbm19pA%e7f;tXvZlwa_h^n4b(Ss6uZX(!ZlE(8}7~wSkCI@_`Uk$&9hrl2#6CT0u zM26uv?K#jG*#djqH;6~M`|x_NT=<+5>zg;;3f-&aUTB3%X7&^-SqH%#ZpQ$s&R|Ea z=Za!&;r6^suy6pu)%nv-Go=03(~FvNN*C4T^<%|Y@rno7T1M02cmPwAQiw{NY=RX` z$gGc0us1O#xj;_DvllC%K}s7!wScmS^UY(!-Gbp+J3P+fd5SY~(XRDc{nVU{i|6b* zI$jK}Mze^UN))zXA(jPZ&#V7s&!t!w))oL57Qp!3bMRcOTOdZ~-2u&bM-@VI*=AzJ zNi*el8zg&!+!NP9Qw{1Jmn7=(quNATc=DC3ip2a4?HHgqAXQi3lpM=(!iNQbX=(ae0p1DE24db?O#)p)?Z(CfObW~1zqsoR=6W_VYuHcDYuk?Mdf=2huiWpycz$(caY&5mCin&@=J| z+G+r2yr3;A%bT|LRQde``CL;u@y==kM7LpK7gIZ?!9s=mth@BwoXsJbOtF1C<%{}U z#yWWq_R=!+xUio)TQ`G~oL#Zqorbz45gffVHxQ;(?mSv{HWd7;Bo1|^_wfNn^U;5J z*9_|z)#LBG@-}b^!e9AR_aYQvEgib&%Sz>w`)+FfIgwuK-5Ap4)rA65hS!ax`^6NF zxtxz)C}%rO;~BHgYUyU}EH4+!Q;FCe_)DMG3#39>xXqIJ&y=}0y7+2oC~}hkDD^^)68v&G z@Kx1m39bd)b*$vR=UB@v3?!dUpOheFBq_;} zmFm8&agq{Tg%9~<+aJ4M05vpDpai#QHi^yr7@}n&&%l-t_$4H_DB=-q6So$N0**5L z$M4o8XnJ-EqstAtdw#5B-Wana??0b&4+Hc$pvx)mI3|Zgd~ZVnq`Yx3C-Cvl^>z^i zwf~lAfLZqmAD;MTbkVZ93p#PzFz%bX?2ArK9i&aE5)$sR(6b*`c-Zr~ri^gjpwC%V z1^60fx>~BizuRl{443q}<37#FIPI5k>gxk{qTpp>eY^_&m5JX}6k#zH4qTfQkAoGF zkGri*sr80#zsuJG*ms3W6ZF*WpEHp4jwfwX6&iL^qj!W$37H?!&P0xe&doA$d0Xz8 z5{2Okm!4awP(%ge;1T${{ukZg;w1=e&;vgJFSV}id>Fl?ZOBh9JtFZfAujuK0-Dt< zsEFg;C3W*Cn+}|TY5th(huIQQuWJZmMvaPq(+>hpsUIucwIGp(CZvxSiS@Oe4!BN~ zwCWT-N77pTYMEnMd`i7@m?zBoke_)&P%YNStm=1jF!5GBQJjyjuM5Qjub1peY2QZ! z)XfYe9Gu}dyzKhm#jKiMmmE$$%(AHbbGq649(7ktiwW;QGI@{_HV}Ptf9&1|aBJ5j zfcY=l(2l4`#7O%r^*g|q-2B;vf+DfA{MS$1VU13>6$nnWb=h%zKfPIaGo`;}A2J}4 zsTH{xFX7YrLc%i5H4>kV+j9KDEDH4QLgm zQNO-BR;<}VC^|^}I<4U4sS;p9)>{i>9A-*Tka}l2aS}cS)%PGuf$kWz(psp@Anxz<}fm+)JX46bG*VYy|3{S3nLu+ zU&}2~&y%p}ZA$TR5@C8iS4X|A|#aDF%Y00=Uz74y2*7NX1Tbr4-$0mLty(>yXW^+bn zHos$QXWLy55dqA9g(rxeSg-}};m(}W4Mu?AL-QoGf4`b~+cZy-JYoGcQI1JV3zl)j zf4LFtr7nH*5kw`p3|PL4)@`HycAcAt$E9kU|=Ko&r2zTDXD<5(HRh3jkvY>$$T(Y z3-S6?^TDjZo%tR0q)d;L#k?zT?k>CCAUx>il*`F$C!=RzsMTd%mm-l|0yis zYaUC>^Kg@(a)ZOB-2hR)F(G7lDIxtR+}trpE!B)Q~V7!Rr-pq(r4E1e-*&< zp8~i{%ZOW!l0Ev&R-QAKASCuzP>J zSj}e-gI^<&PRdM<^L&!IHZ+kG;$A<^ zucODpP)fnS4ULk%K0Rr=x$0!_-kPw?oT+tQ3p2W0q!)M7cNvuZ-zrIrW&kIzNtgPE zFzW&%&jo0`M8u~-%8wloWfx0k6*N?L4vo>(shVw$(?1^pue59_FC!ErHEwl zej`^7rakwrLY=bZq;2$|Jn6JXAeFfiH_e-lnBT2&`v5*YMB)sS;z4Yd9R|K~ky*!@ zOS$gwcYRL@90m4)j$NL*r&~{Z9QZlKEAn z5U8Z2`f3ZT#N|aJxkv`Ot^@G2DSN6CTD0qvR?e)ueR!bneHiUOb z^cNa$mVBJ=b29WtsfA@iwyXoQuw}l>!6^^-W8~Km)^EAAYzZ{2Mlt5^@1qgGmFo4fs!E20&Q*=oaNeqS?DkZ3)3%+1cRQEibERp| zwe*ZTo=dcIK#kp$$l_}K+||z3;m&le^FW4VIpc2aTE>(^(^X!oy;rZ^EGhNE^~El* zQJ8OEvw*8ai2Ll*)y0XC*Lv>Xqw~GUlZ+btmJH8lzM3|wnrKFr4Z;N;&;UiBC)I{X zD)HVRWRjvH%Cr?oiPQOrvlLusc|I_zXfdPVWdkSEeQ8ww_G)< zw5@)Kaxb3L)P&$}DV;xtLWj~o5#&xq93fN#7FJRsj?z@~wIv_{)k;6=#FRxnIqtJr zV;UEQJL1Csd^my8=?nA~k?8dMgXQjv-KM$e`OKR`;QHoz?&e}uw8?Y6`9qY?GP48V z37&5+SoAL5$+UBn*n;+_RQo#l7tLOaA?!s1dic;Nsq^3aOP!2KG^R0rkrK~8kwRIGcpcLnDNa!%{HwD)u0cEK(%vz95{ITbdJonj&>F`fkv;zKiUF4wqdt=9U}cRf1AfyYgk2REmT zH)iP3i@BR?5}$c&A*0WGzPsLYqD^Ogs=)a$9x+|b)$x?5-K5K5pC}pGuHQ-hfYim- z^`>QpCtLSnzdO?TcmkXWYyH1H*#3lj)0P%WZVb#5g?xEdMnvFC!_SF3XwJJ$FS0+c z7eaz*+I1d=l~Q}l14x6Iy9UAXo_>oaUbCpOAFMnNAMW-fIB9cCr&paG1SIT^|C))9 zmywX>cwbJaEt|jXc!C+&4Q<=xr|Knp+{2^-;-cG4QM`rU=&eyiiYuB#a^EUPSYIbY z(MH5Vii`)i2y17berem_A6bJ3FWa#!*kTov&>gV49uo=&|&-uDfJ9ciRLXZdX zyPgBy?~rW9=+W=hvvoFO#S>%oJ9V4UuNbnSNQvVs(Vw!XR*;(d|Czdf>;{10`x$|Dtls)s`XT2|Y6pZ@R!}@u|$EfB7 zJU#xvE5J6$YlXo6hha|}7$RY6KR4nPT%^=-?hj_Igm^=U`hO})#q2!|To^eeeWS)J zE0`w3TH>s85NZ-e`f=A2U4bYvM#~VjQlh0Q>c$W4?)2ZYTp2;Y0_HO$KZ%qo1i&ff zX81%>gL+vwS9q1VM|)Min}j4ml^;DMgGEQk04fDf)y+(`aPCsd9j_9EmttZV%V3QT z=DdsB3_28y=0VtbCq8@*2q+-GE+am>ex4c0Qe!BsC8v(l%5(obA||JtseyWYLI zYRZ3Jvx~d{y^iNnglNVS$HhPY#GO2>B5s#(97!*JPRl6fWIl)V1uxo3wf)S~UQeK^ zPeWA_J#H3d;Mh(+x(##Zt=}q3Y*=RP3oBnlUTr%_UmXpX>(m?I5WMG^^Q|qFSqVn2O~cRy2ZWC zBjXWzJL&tOXTC?nTrDR>J7&QrR^uMMo|0ZC-_<*ol?(}rNVTy__R8*DTSOplTyzl* zi(UGlFxxZ+RDfiQ){`Wr%99j1N$j`xZSww>yDbb)K&Ur21jQ2-;E}3q40wqo2==@a zk`Nw#2Q^QDULD7#`U*azz#sp#>Z2aOHk$2Lqs-0ht;0)(QSy*F+TV4|z&#y|JI8(E zv-`w{vMH*7)>RF7PiN}grNJ;&J~nrPJn1u>K>A+j%^oB~0hddv68mjeCv!I`V-3N} zXFn~a4u6!Ic^_|`1xf>_f!KJ&LWrB`fvaiWt0CTGJ-@@$xwI9x<*w+}cv0kjgk`4h zalZ7``jmZrAE$Aj)Xdh5Xu|?ggg<&YR@H9{+-!8do}X%0Wj}KcdV<6AO@yd>ngNT{ z`CydP>3m=xSE9aCchmLQjaN{)=Z8vjH!1D42Oy&SqpH_{tbSe#HZ$drSEv#=&)tZK z4H^FA^2-K!X+{xPL(y`{+e4wZh6P&TMm%nF?m9Rgt+9@5j6?CyTQ8imrll`w}f2 ztf6f)v@R5^%e&TIl`q?>pDsv*8XsWzNA!HY1;5y-cQ{4|)7sZu9`wQ>48BK$8>ygH zL{qg6UI}BWw%ZsUrg-nvuI+a+g7Y9!9Mw0auYo0LRV}{7wsZwZSeojx^YT(F~<`qeN=T#7NaUc8-LPx+$bkkE)O;}gv2xYUCV9OWel(SR%cmf*sHBP z39J_8o}E8@r1fSge^ulKwUZFv z>15XX=DOFY_!e9T?<#q~=k0Ny-rV`l)p-I&A+spSw|Afek|)!^x$2G8=IHnGU8D1%#D31T6TjUPB>KAp zy@bae7+@Y^ocagi{L#;szyh8RmM^7bKEX_k(A2rUtiGW#3<3!n@r|BII?8?uJd{f= zMs;RzC*Rr~_*`_5ch{qb4g;iS84o#lSRyI`Hssw9>CvjOkbY^iX(tISj~`t4yP?nP zvVT$8P%OrN(m|T#q)Rl}aC)bAMu@y0w4&WQd6!%2Ygav-6E}hDn`~tzbkC-JFNB`> zFh9C0L4EjkJ;tkpMK%i8x3ddO@n`j*cF_s0Ab=cXglT;VD;r z<9;U?)GUpFgV@ZU=jVAjz)V_y0s`>ew&A)cGQBw7=Jo7WWbj;$20;xj7KJe$F_`0F zU_7Jwhh1TyZ9&q6*rT#8H7%@Yi-ktD8<`?;ThzrK;=B$%z}`%M_du&rA!2umA6NDL zU?7d3U}(GtBreet@&elOG;mZVd*0S8N1i+Q_p);d>wpeMI2WHBi!Z?4J$~rF?JS}u zzSpaiznW|tFH1;hVXC7kOmi>tPsP$ZsqfaF<%6S;kd{cJ=~pR;eK1N8>L|hcvp@9C z!}Bz61p3J4q9rrsMkV2)yvT;&$|NOwhBrEMI2dqDP=;UvR=SZ&;~tZT~&MT^0X6>&NBrQou|X*MIP&lMw6Z^pmz`gz(ineYcuQRry@q+w3TsansBPZ zO2e`f#J!ya(DIT$F=1F$`U*tTz|BPF)r6$?@lU@Bd(S~xN>@X%-G;-TaTxRME+uc3 z8>fB$W(iQ$HVYcUyR~2Zyl^gx1~#@}jx-Q9ASmBj9*bYL71=|m(k@Fd>a(CmWNGx) zsPOY*`F5=F+aPrDojDS|h_hn2IJ~P~K_z2u!|b3qSftno!M3E5k&i(IG4`^RVdQ!w zSm{@0m-5pe44Mtc^~~#1bloHtrl>h{A=(vdtm3G+V6$Q)2BXe&z1onKp_0$4B2ETC z4fW#K1TWSBZszW^7#S^Vu>`UrI5&<s>^&8fnE&^c)5MF{g$NEpf0ikN2!LSY|p_Y!8CKYg(HTd)Qt$b>1GyxU7 zu)ZA9df8pbDLFOz6b8{8RXDI_L$*a1LDU$(K5Go!tJ@Oqc<{Y}BSASWe6s$)LDXqC zlvz^vrm3pYcJ2x3U{Tm0o#JiQ0lwPL55TmlRq$(6JG~U}60UZvAGa$!MT~zt33^{? z)@iJA(P)Uio5aQxB`qhCDwna}sJ!xhGU1&`IsP|8TT@RVZcf!%a9J$mGS7`JU&Ul^ zM-w_CMYk2-T3{kvo4St*ttZC7pfyu-bK99d>tc>dbL^lNopI4PTm(T0XXDbSo`bMx zae~BDqc`9#ygm|6#;!8$dook*P+YTkhXxN-1iXr*TW>;N9u8>S5qH}<9k@A@-Ua>g z!Y9TIRQFPpv=rh|8^Gck4;>hkV! zynZ?LFC?km1?j7Y7q-gEY=vKiPl`FqrT_)&6&7+9?uq4K%ah^)Nz;3jb4Z6Cza8^O znKe<8P;bQu1{mV4kH3}&#ClwbZq>=fv_iMN$RiWJ>b%+KTVlp+fgh#{GdAUY3g;5pMuf}+Es``$hy3rna?5K2vI0~D0F zn}TJ7y2t9lj3t=d!Xa9=g~zV{QHjts1`P$O_GJf_u^m;IKYEd}DQUHCh^Kmb=qI=9 zTDrS7)~H?e%v*bXF~;gyFB`%2{y);iv;ke25OEO>=669SNic@Rb>%6i7N-bafFmU{ z&PVd4{($Wn$4>fPFvr6O{I!fHA>i8PKQjADzy@;nLxCnG2sojsk#c{1QJ1)0?14Ow z>B|C0+>~hyCwt{*{vya=woIN^{6o_=8=~lz@=eKeL6TqN0@+jTS_#E2&|QVfUV5ds z>McB8wel^_m@cnO6f%^zmL4VGLA9Hs@`L!o)4j3Y3n>lm4FbZ$A_Cb2k*XP}Hl{Gi zn2d(qNaf?POXPW(09mgBV&c?1EH2;-r3?AX;(wgmc2O)G`D zi-}GAW$_Dr%YH7lf=p$dZMI{HS!d)%ssnH_)fZOpzPsaa_B$u)*vRK};ghA2sKe}Z zn~qqbf!hQCa#NDM#~>sVHM&_K0Zu`)7L@7-bCODjIpoVv#KH&=y|TtfAGb2Hh3R9I zU|jqaRr9B#Hi*ZaB^j45O3D++7$rk}uh{Pw*0TU9(~_-n4}0ayyH_QPEFqL)8fPpW zs+=#vGB~L5wA+E;qs{(8%)pPQ-N#x!dq9Ji>T9Wd@1gAN=e#L_#Zl9Xr-g9+`WBnl z!4`GjTn^<4KjW{QBCe3W5a!Yar=^hB-#?zk7*RB5HdN9jW8JdGwS8x<7q_?m!0WMl z(YG^)g@pT*s|tqm4fd2jT(T-J*C%!FBZkcn=q-5I#P;~u{9`Uv ziFuMwC7d^Nd=hTjaz*7S)_XO5JMan6Js|}&tn`5XhL&zr!c=(9Qnflhu`vs4rrK`E zjIW{MU1=h%?q~Udm;5Em0STsL`_WFaBn`ajR7+~9?Hlr@4c&s9zQ7e$Tany&IA(K% z$5gC@qj^2tYc#7vPG|a?;9!pqL5TA992S(fwQBB%$2#4RS~3(_HTpC@X6J<&0YVub z;N43lpaeg4>tF@1WK{jbUTKphA?_Z9*&>sBj2;Jg%`|)othX(vJ(ePXvqa!5!Xd*H zq}YTYaJSvrt1f0BY8uSwK(ghcs4oSLmr4&N&^v!{JhFBnnD%p^^m&f-WP_*k4ch1| z-l!H#6&|Hbuup>U-3a^>aFoNCdnORTuA0%XQ3M0st!F2_yA1AGa^_ib)6GQ_a5VS| zxH$oUs-+Mz_T%lTlcQl(hl#S41U>tQ7}_mcK%3AQ#$P0fQT7%)0}1CjIF7OHW#KRS z71Q0@-d~Uqj@RSV(kZKcAf}~i_3e&mfDFU<&taju2&;7A7e!l+i&aDqyxuIG{Q7Cu zSuDhYMzTFQx$7tSl`W}((;-g#j=FZj?vufUpww}N7*#{}oN^WN5$~WT<-iCWhg}p9 z!REc$QJ;qrNZ7gT_1C%QIw_!qNNm4LdzB$qF!TE8dB=zJ#MX;vrnOH^HZzmrex#C!e|WaQh$Y1QXXr}W>Ykc zERQN}?A+VO$KW%NV=^0o1ZdC^k@GA1_t++1lql63(06V zQ{5<<6@@Q^lFu)!G0>sLMmp5b8WnhC-A1`c2=ns}lm&lrD5^B}Ts+8*=xB-+JIek1 z|EPNFxG045URQq@+_?K@>zndRcm5=@JBy=2B5)>Fy4R1(uRdDM_V4y1TpI z+57uE&;5J-Tm8T_Gv}Oh&UqYD6Qn-g%Sge?$gI9N$yPhJhN=*H6FDw-#uKq+d6!%d z6_gUXDYeM@{OmiW(|q#Jzr;r;-4_|5M?ZDMglcCIO#?= zXV2wDZly9uK9XO4n=;?^YT$B@L+UpT{=TV=p!@!W`7;$64JL9M+ugu>vJWEp%c%qq z0U@cfen~r{b*#^%t@PX97rfSNoQcrAfj86- z7MzeFY{5~T`@>+a$H6I>u}{h{*unt~s1t#->T+7*>>G$WKHux9oyNA0e?u2}wjQgi zh|80s8dKU`5WEvS92#&btj8-OaBzs$ChIPH<++)#n;Fg{o^7&UlKrSc2?h!_DUOZw zHMD{fBYV)%TSKs$_4+F6YrRB6@LUotDGL^N-&+W~P@5+oB)<)Z264R)KF;q|A;JV$ z*P`e1&r)ICuRgd|v~}vJRfZ(^_;LzcGv3~4xWdqxfGElSDH$T0tR?sk*%5%@L(=nJ zmUcTcnpE-VY)+8xfvzl4u`SDB&$qezGy}}V^6DQ%iZ8Vl@wd@;RLKjWJbI>T#k={Z zr>?JU+RjIYnIJeee}M4^VF_ z<|A)$l|yvmQ<0oH-HE%Y6anTFd^oSVLl|UC&F=gYg$uk;nCEwU6>qPh?^VB~vdq%L zkTWq$XeH9A5H=R06ZudaR>J#oWc{BLv{v~RZxkp7h3KUcD7nLS-bqotF_T!0CSNTq zpcz$hhPR(5*@TJK7B~&Otx$Ye%#{&!A3BhRg#47rvcG6fB)~)5RrWgP_=!W62>e2BTD zLt7(_^K|7%nd`zReL?xkr*SpQ%sLyEqoV0oo~XDm(&xnMXWeT z(B=eN5F2y&?Qu3sTL*%`MVrL&;{oC?5gr1w;H+PFT2<#ZRevScN)}ri&aYT_@PM+o zDe$345g36HJeR|&NssBT6y5snAhExgroAvcc-Q@GF@9u`{-1e>Q&0NI1K0ke2N{Xe z*a2+1m0RRV!&}3y8gy??CglEEx?|AY!62jMPb97gg#xROtxMki&~&&`x)bbU&Mo4s zn5@_6?R;X1D34uOmlKodsw$~;g|yW4-$%Rztyf@ewsw!SJ|-SCQ_M9!sY1=}U*{hz z3tAdzb{YMHiOC&3JDQ{ROTcA&EE3c-F#E6vnMcS^K3^Orz#wM=f7i~O{QBD3Jjt1x>DsKZul^DrU_hYJn?5YkaiD$mNzc@HbHT&60&ev`bF#!=Rg`Gqg`yss#%&+DfVk_ zu5XZ_fBFrdobk=S*9pguA}(5HEafXt=vDbUUX&Q0Ee)e;B#U*d4=B&wz3T?Jh~@8H z<$=9oGk}drm~BqfBn*KZ)4fYzXw0th4jkbj5D*6vQjg;f#Kj=^E^EcVvE^}ayn&#R z4*d^(Z-f$D7GkdB1mpc*(_-}hX3WC_veQ-$36_aAee<91Ll-fwY$gJ}x4Q^)r<$L$ zN^bhPufSZkrc`a3vjV2{OoFafOx*9SA|{KIBhC9P=ff6Rr!*xiPA}@uUa);XASj~G z6>q<={8nFLkvo+=sRpEIT|A=6tnt-_j6~?W&6e&H9?*$$2~5WxmOMy=iW>%XmF|e#ledeJCbs%=iXwA^ znOcrdr>}?TdtYzsdIi~){(Abbh9l^9I5|_ziEyUhe~Sf;Wr9?-lcKt@ z6iWE*+jzuHpP=PNpP`}|2XjsJg)Ec9xxa$4ar_Vd85F;p{}*a->Mj2>b6!;Wk+BBu z7vHu^rI!$*}Hd>CzWF~sC2KdLU$y1nYkxlX8G`qL=S}9hqv#v zrPrX@YJ;sF_Z>RC*SsVyrs`5vunCP=ivrda^e$< z6bUJHPwkz&XTxq3#dW@xg3E1GyI(_a+AreJmJ|tIih1!X(+A~q}JK~okssas0X$-SNrQ$9sDQUBE`YuscLWf;Tjf-wsf!_1+ z^YEirAXec0uhISHC!z9iSNX@!fz=_p63dDyd42Iy+jOXkm|gmyB+vUWyfYWPJyknkWLG_J*WXlxpjfMF>ON_% zLw-~0X_98=Fe$$>9dqXw*~?uPvF@#=k8TYdiIi*MW&Mv7a*1_4J`>jrkO~xLX&|x~ zj}3~Um~UnmFcm_eF}6%pXi@E)i_o92BnEF7yT z^*|@I7M0P=_N^TAj-13#wz2p8XfF3Oz5AyqCZf(>?)y(HDx6Dwui!uYHI9Kamh$w9 zE%L}PrUgRC9Jo4KrFT0;U+do6$Q|rG&yizCNZh`hYz{m$B5h$J)IWR>={o`I8&T-4 zN>wdui|%;yv1p9`r#!RL%wcVBCVe&gpER+9-+rv032t}ZLcQ{frbc^L-R`><8;z1S z=E`MJ!+FyKHKpnohis|bcv5(sx^*SKH#H&+*XuX*{e`H&SpGxmv56onefA)4*pdMe z7LmRA?+U?5;AmzArsjWrU=2rG5NgxHJP9GkxU)vS z^g2svc6-1H4`#~>ou|v{r(_r&V@`MqrL*%88)r7BmU^-Z%}(O*ksr#AIzQhhyn5RJ z8KP?|=#Ofiv`eo-j1Nqe&xX;-kCSiYbxi z^eo~34_L*GzG%PF@e&=8^3~?*vW4rMFpOVKJhwjZDBkFLZYRY4%6gC`?}l)0pLpqu z5v8Lqu|dRd1YBq~<-9*tvtLo)l`aA&nH7A3kf_3R(A)I9#WJtIg|>!O`hy~0OwMv7 zU&7Vczlp||tbi+$C-UL;pjAzIt_O)62KHoq-h5Rxrli7zWVqIH*_ADp1^1nx& zwe01WY}F7{v*U=~#Hg^CBSXsHmXu@+v&(Rj+vM8X4zoj?3LKm&yF7)u9E0P19h)OD z67nHdp#!Q(FKQ&Gtu<*f+ZDu3-Q=&YufEEGn3TH?HYRCs3W)yw!R~G~84JgT;1fIh zbMCtrQzd##(e1sUap(xpw0owx8SwD2xZ-|hW;RQCVG@I<;Vt#hhPW5%QgdUCxwD4YpDTqyES zlel_GU4aMF`5fFOl!Lp{SS~br=_?5$+hD8bFFcQE^6I|t!z5ne1ceci8sbggxvww0 z>F;-oDj~Xtk~HNhE1V+Y5-hvQ?+K_GC{l9W{|!a?CkAKWkiV~B>#Dkj^Gr04WxF5N zkZ_bo*Z751UYu0#V=_uw8n-Oe40D`}f~m`iiJpec3l@q}HZ<8g;d1cxWiwqeg1+XK zO^wc{k$gz>n&4ePsVd+7Uyg#qF6la^*IP^MepDKGFo2WuGT7km*A12Izw?Ap{&g=B zm&djA-W35qo1>(D#~rcdC>y<2`Vz`8L@hn5fq5Sv6bKe1Y{w&^PfxEApojaG7Ry+f) z&a(v*G(*jDU7}FZ9DI?SqG>_RkTJ3%u=j>gVf8E1l+L-H^mZ@#)-ssFt~TZkvydJ3 z(wz8zOdHO9K%i%Zz0x_HjwpX&RpR&nyN>nO1#oAa>TK)yk6=rzhP9nUk4 zeYR3z{_-Y^7?0sph3uwcz2mfs!`FE+j)(ca?d=o%3&9coWKeVSW0CtxMi6VX}c)rQuDSz*d@s>UijM-sl1l!2- z|1Bf1|K0Xq+VUALE?^yn&pXmsAp*u=g+ORXm-z5$NOWf9aRYv3a8p*TX2LJl3Tt?H26o zCWY#EO-JQVNfn=v0v~?ru|?2{HXG<}9B)9%o;xDFFP=^>HR3!4Qpu95Bf{Kh^+0r&L%<*QRx8JB>7++&$FMlf{`FuIAKpSFflce0 z?TkE|PK&QY#?P;%Mmams67M2O5^8{3%~qX+{Y7Icl0?2e-1nwFY2DwN{m&aM-A@XE zbp>bU-yG5ahZ(J(@Iw9@MQ)NB;dQ^FA$@6C)Q|!_ihq|h5aH&PX~wM`H!eYER)z@` zw+(qfM)I`qk-vNmL8s6kkq^r&5sEwvp^u{}+pAQ^AiVb5G_nhH`H{S8eBMwfF(uH6 zh-P)Dmi*AX#kRd~&DR|jpYpoLDAPpAMYfqLl`N~Ul<)f>Z+P^8Z_7aGwKhz5Q>rc{ zx~XZ0@lQ4Ra^rlPCKGey<4`vngh-N%Z8{8Ky@7p@QGL5(>T_9E?r#ePe6qdd&H5qGPX0%T$se|31st zii(ae`KkMrEVUP##~+NfJ&!YvR(?;#!@M!QHYD1x&}K(7 z(n7mhTTkUl7yi6h$T)3y7=J-Iu#?eJjtL*yx8=n*vr=m8?H>M)ibyjwgxJ7p#QR@T zhw~-4Eb2NXqf1KR^MRAcaS_9Czt$*w5;aa=)CAvS=TPbh{pS~J(ih{>tGpHA(SWaWmM*GjZnGq0w^F~S1Q$&}h3G?RW zd;{mtZI9`&H`(+0xea6)N*Sj8Zwg{>2eGL&eg^$JSsy<_|9AHS`b@4iyu*kTVBEo5 z$_UP+oz}-mQ7y06(A9FJg&1!Y3^9Sd#dVI|ArO7$@?+Ojca+nb$^Kg_=x2v*#yMv_ z%!#niZ2AsovMPl_W75DRMQyl|*&?9Xr8{VFvz&ptA5k5gCP5Y{44mM>5zfpn5VwB8M zn;YT`*VRf_x8D(oi?!mSH{vDUS0JO$)~^} zCw9<1*I^~z*p$jh*`fFRIAoobd#$}kG)6PG=FQ^J6-0BUmFD>oSLpYja(5E%*B!?f zGDoWL@;a(3nURe~IR1l~Slj)(VH!w%a8@|7SW|A3zfI59;Y4{IPgpCFNmPa#8Okk7 zr@0MDHyB-%)Fyv4a3?FSGT(PmPWdDHp>Jub@ zC4Rn>8bE+L!#yw%@&b7`iC4v ztKNybHGe~R$jEW19{#(i%K>uv=up-~&U*PI4L)87(yZOTk z!nRdxk(IAW;r2y`c(@Z}2;13xwyb**dwdkBEimLp8!cJO!0SR?3f4fD0p>xEHhPIe z;j3*ju;=*4xYwJ%S(Bil2{i4WAF}p44Q=Qmn@CT0H&zqeqk%_dJH$`TLvmwK1IHnw zO)I1s4gwrXXBt}g-^0zf0_DhTk=Z_06>l;Kp4k4gmg`&o1@dsn4G=CYZbdW{Rn@-E za2kaNns@x8!fD+(AB@?`kWnNvT<}fq=9p3*{9=ZtCc_65!~c?1y(F05MIC?seK&?c z+p)9;snQj7AfNs2Dem>as{5ZgBU#0p6UugfYI0L15+(0^zHyMB-ddzRJO3#}mF%d3 zhvYZME%iWx+WKGS%;oJP_>}`+woe&qsei_Kk4N!^Iw&>7xWB-iQ&InjaA$c^n43{@ zi%o8V8!{q`)f`mS#(hUR6*^GeeoH>=Giu&Roa1>f0i7SEByWLZ0d#7eU|0$wBpd3;+uZ3 zKP@uz(gptV0sLL_ww{Mgc{j!PqVRp453ekAn>Pq%Ep24&V(rI#9%cSQ+NO2S$ygvm z;4L84J;5C?iD2FgDJ)mW^_280(!8Y{IAeeu(M&FB@H)IN9QqsmSjyL*Y=AV)p1U4-GXQkQ zl=(MXA@@5{)%>FO{oXV(8DSd%iz1u1$&y`}q!k`WY5l+>=^z_5LcV+Ww&$q1fkJ4w zdrOgoo$qjuGVlAa_!XRte^U$|Q|9v~xhW{SA~RgK#RRcUV`sw}%3aP`X@0h6LKh~8 z$bu_)zuF{gDXuq-%uR45o5!2afx|`(L>b#Z6tsf723p?yxrAP-5Ov%)<5f9w_t+jQ zR_>5-MMRf4{kZ6beWJa#Ob}hpL38)4<9EewffT_81D6pfTiHv8@D%=S&aP}qorCf| z`+PwSu)bBH-~8L^NU5$jy$mfL{fe=qiSRI8USd(59S%*R+(Q=l$U-Ly1r_LWK9ek*536GORAW;btCC=aP2n)%sh zf!8}}WtgW%S&bub;vgdQEkqq3;TesyQOaG>d zQI(g4VMyyZdwjX_kR0;FpPspNe8e!L_S~*M+-xGNNRtb(@VTqK{6V(SKS+A0j<3$J zR#fYu7fWiN`35ARN=zY+Gpl)cFRftqQ`Ix$v9B36@sW1#qXt(EXWC^ICJyp&=AA~* ztsE?OWGTX0n&<~(yknoJ&)jkUYiLt}VEh=&Dqts(YaHv5X;1$w_1EyT7?eumN-M?9 ziC8&K#YSI_T7C=})@(;SorKmNgl+nj3bXwk9`Nqn8GNq`u z@#gf~vUhuGljPXHY|f0o?0sb;qxVhghtvzCMqXiZf<(bRkw1wp9zkOqhYDKEn{`1@ za_1H)$+KHs&un0uwz#RGztJukq?;wMgeUZAW<#;tZm2J|j2`3U%?kRxO`-zSB!|aL zmU50W#fdlr>XxoVRYcSt4>WqGmpiSr|q5vl{$sMi@P1JgA zedIx;_r!CWe{9N76*UUA{ycg7_h8D8Ncd4>vMQ!!OweO7xoC;{Y-NCMA|kz=F6YMG zX*~-{`3y=?;!uMdTVQtPy)^A&AubV_S664?NoSW)e+@TEcf_CDjPHoNdz&tATRSvr zc{A=R3iYAOE>^SVNKR;;$Iym9H&yA)SfKgt?(->eWek8gdOXPgVLrT!es zkUC$U%u}Pou2UQDQOD(n8Vj?QD@NKYq9FK@)T)UfzmwvRIoh`hp_5IJE&{o0*##>{ z13HDH*KhxQGEG~A(?)+hZ2$o+eQ zg;KL+%wwU6fBYmHd-H}(ZCj=cLh|5F7Ml6%S8%BA{hLmy#_S!1+3lnzUhSKGy6*f? z76=E|KAwfIv$V|R$;dIiP12Z2AIMkpzoe`<|KeCi`KrUPXl4M%!jJ3`&l|stV0>42 zhw5wZLRUB=RMVY2XBb!X-X!tMR{o&hLL@xd!&lKy`X`@;&PYh;hn!TOxRyMfi>8N& z_NLUg@V2DttoDA;$4a=C`wb<~aMW9eYj#qpPL^8icX*$iF}EtFI;B zUw;0j=)q)y0N1!@ovjs&>r4Pxmi2@TPA#Kj(!Srcid&8^XeiEBc2W)ecam9+=&q_)LA>l&3kA--4G~$Q$PUL#4YqN@SNC#NTb^ykK-IoUPEUmqs305fe7v2fj8w^DlMG63;FDlitrum!<wv4(^TO!Zj%$?;rl z5DQdSND+xx^`HzDiX`mhnVhk$iS(9PspZ8t-aEt>^ErG@EEJRqLTVGm9WH7}geo!~ z1(R0vwe>Vr+9STh9`8+5cyb?>avf**{=doPJ+G!H5SEKJ;6C#E*_H$_c3MYy0h!YNB9{wIg;W2SKi^@8NXqU_{DKWbZ z7R!vz1QnL4c2V3d$=g?Ku8KYQ`}OwujTS_+a?2P)Z(aGHehuO$E8a(8wlZcJ5+Ss< zJFh0&CWZFjuok25l2P!>YYK@!CKe6Gd^|$FZxdHQye2cBnJCt_O^qogHI&%s z`<1xa-xGL551og5>`w@*FCqdJPH+`|R{b^TCA*;kS4>M=TJU303oUe=)(oTV2Md2L zj@ak)n&zAAKOwMB!6`@9w{4KPvRRadYQ93X=38&w`>c@nC`V&S-^FRVJkSXDg4w41 z6^peMaq^EL@XN&`XC}w7>IR_VHyYO^&~U7Oz-^=hm0FMduo?n=N%sE$nIIFb_s_MI zBIZc447oX5f}w{p7YZ=(y!K(X0m;s#MlK4hmNG7E%7Vvxdbw_LO1GYned%WpEL{|l zefHS20%w|_d)3imRL)*qu>}=Io^*ZIs%Pnm=VtrR0&YuwWSaLfEID_Q+>D-h+>7{i zA`~Z?fzGNBtiNf&(QJCa7-|ZXRZr;=J1>Dfu(R#=A;yLf*=Qn{L969<$Cihr!xy~{ z3aI|u(q3V28tJ)6&=^A^G%91o@!Bkdj#Zy;{>*#si%*JlgAMdUpT44S>s?a=X(bdH zri^G$hv9W6Ft!B>&uNN@z3)Qcaga`E1hi6TMCr@@(|3`46HM46#@AQIaXK9M=0u^2>!E#X$$;)-|Xr6c;V8*U`F=x7vLE| zD!5~Do%7cG8M_=(?8^nU_?X{INzU(Yfpk*10GJ-bI!vQ#=#$i$M zzXPr8yO#`oN%vqn6n6f406R`Ljq!jXWt#neMK%!@zYz0H4?Ems$=&wg;2{J3q3eJ@{5etJo+ChAce**5)4bb3@;&%$^| ze>K`MIRBx*rU7x(6N8LrVv4o|ERUqXjeGoY81ZMw(uk?`^W3PwZ(l1#4kY?mW2ZW= zh2IP|WB6le%R7mrgCCc8=!;JGNQl2pkyl@E8}}MR7mrPZ{pADI`|cro*&{g|YBm)} z*PLETDV+IyRCO}co%UK7QEC~c(u1|D{oNLBL!90Ow z;tswyHvx@MovP%Olsh{eY#UOJ5R2!CF+S7VcLp6ZP2rk*bfG`Af8FbiC|jU5c=A4> zV1(_Qfdg2!S&atX{V=4SW41-RFh6A`-|nwwa>>`270OV(i}n}|ut6U0Q}s+eshFbz zhD{UJO@x;*9zs-8>cxY>?3)vLt5?GV*+oUjc3& zH@hI~Bi3+|bUL;O8u?6XkKoWg+}5=Z3#T#9m`1K&BYbN2*CG>m0383LJi#%Nv{Qa# zcVua^#*UKg(miF%5e=9Ndu41C1UpzFEyD|Ys4H4)e-S+BI}Flm!~5d*ap^uC3_jrS zACcTKHr~sJeBd?O6;3eX$O)1hw zZjN`&xxDoX-yb~=8taY73cTS>KjS}jnDKs$@HWq5i6J&!Tjs=jX9Bcqi@rlLyB5ZJ zL-D;gV^!PBFlIW`lyyETahj>$!!fd3&9q#{f#d2(2ze}!TRqjWQjoANd53+lA=R## z$`S6-sfOr%!ZEYCbp;1)LV9)3`KTQ%Dhg9>M42VZ8*9IuyLmD6lfyys0 zu(AxZ1jj+8%RMC$_TLhhXOG3VQ260ahs$$sj--`&Ty?~>{HWrZ@T^S;OZ zdL>Z!nVBRcmsOfXuD0wCqM-yvM0iKli`|~x=)083XvpV%b8THBv1sPO8NzF`RxHeq zaO%OqabTufY%|{D{0CTdQFUkY1MCqGemE?4V|@f57711TpM)CQe`JJ=B|-G;fxb)L z>i4H?7Md@WYf{r&BL%?c=mno6G2T(@En?pAmG-o==WULw!N&4p0tWZ$9L2;p$0S_V z8_5uadb{B-&&;}gFd2A^xW%?g{lB0QRV_2Qxk%lCJlwZ8i~g!8Uh;;F3x<9GAv!w#u6lqw#654S%{kC_pp z%tn#1R{O-NK0(dtL9CJBLeE@Nwt=(#K4%{%BBa3NT{G;gh+C6u;K6eHW9wTu_xbM? zL_QRKzXU>w2=L2Lo#sr#Fs=iD!5;?zE@%NpLRgd^Xc9oveSYOi4zTn%l~#j3{)=te z%WdGc5IJ2dM#DV;=kp9JcfeqIbTYWE;SB)yT%I<5Bm7DfIh0h8a^P?Z8J$ho4-#+r=}Xb zu(BJhjsviUM}Ms_>78;XQoJlh%4<4Ny zd-RS_MT~8qCy&jA{FH59SypMjQGQV^C?`h6={g^)ryUQ&_I0HeS_Gl?Zn#1(o}#!+ zY~qLc2?%BnG;hx0Fz?Q0HpexDamwhgR4v=cUMdysMgE*b;Sn9VHu3W?0zr`ieJNIf z5^c(kA9~KKu3-ahn#}8=?9yJ0mWjFi&c77 zX(Gc=B@#uJZP<*rnP>|d`DJWJA!-dul8)ERo1qb~e%4_sr5xMv z@K=_0%SUYu0TwZ#v!`Yoiu%uav>Q`{rKAUamn<|J#@qBF#>e~E^r=`g%t3>SMbWX7 z=c1GOz!{b)3<8Sp>czGSBR$>H$Su>i{iw z1CD+C$GnzVf&lv}0E%jk7vj2x>cGDMi*Xa^JdQFi_ma9js{t=2aXRul5xO|OTuVAH zE~}pBEY7`4D}DyhQt{nR{sC2QZs@qfOh+6`+kCuSm^_Oc2?X?M{#Y&+lB7LflEF%p zR)JaQ!>A3=bgbt>W)MJ9foREg0w99L>Sm))L7;$6%OEkg^9DTHYC!5u9JL4m<4y(O z?f0;Y8faH8uy9$P16R#nuU1a+g9(ttq7mnoR}C260dI?`sOUe5%O9^xNf)Y~Z?C)< zxdp~sSJu&it`UZaHm)<$OJ!&452Sfq(DA2rcD>Tmt@r95L+*RJ*wDS5VUKY9(E6B^ z5@9w_&39?}l!olK)@4-BwbmhKx5J6?#{Kfu z2Q!`~u0*p2&fOw;)SwirvP-|pDVgwhT8LSFtdMR}=$9I$&v-GQ`NP@y)=X(U{I5(@q;SoQt;#Y-Q2fyvC&b(Qt zOdpNmfr2^hfWJ~;_&-w?XrJwHU+&-m&jTR$E;cqVHX`8q$JjLn*K-^IwzHuT>()SO z3WWPM815PX?j(pg31TFUpeZlFt|B0h{aKLS@SL8o*X^)#do0VFP3nFaF{%2nelja@ z0jR2@R^V2fEHdd>+XoY>ckJ91fE$BNF*R;r_5T(;%9}jN13sd3*LMK##0rwI8W*vR z^4Ww38E|axV+0*?7%Z62A-i}OzUAfm#&g3&=g({Sw{vA z%^oN!F_fU4GtmU0W}Ov%{Nw*E7JRgSV?H&F!*} zet45fn8Db~A+}s^P^E#24Ye#EnXu(5K3suinK<=mT*HZ`yH}vC3&L96`DmR7Al)aR z%k#;Ym%CptJr~S87h0%n$4V?L;%XNJFvlHrXB~Jn&dEdtiOw@9td`DwyBRG1EPWBz zy`{BPY`!4}WIF&oIvcb-*Wd}jGIZFj?``ezLJL%zQ@%f_Q+L$N?Rh#nDTs(~&Rs+M z!fRGw1D4*!wy_kyMHb_4aaS&3C)cNIcm)KH{%>HYXx<%uyH3gGg6feP*}hqvT;LG_ z1>eVuUw3=87VGg|Y92d0UL){C`xaY-$?XqC7?EGDdtxt1nPljg^ZJiOGZrGOpvn8{ zQ;Tf$^D55z1*B2XGi{H97yNny4MsX9--pPy<=Q9o$hES6b*a6e;0uh&pZk^XqQNsG zdY|ZUGBNE@U#|?OQ3aCIXk~?#fRXz&PRSc3jW0l}SergDY@EII&hKf_stJ!xpb(BH_b6CKFgB3WaWB(YuWDqmBamsez4V+f9U16JRE{xi)M_xga@^=Hw?ZDS= z9EM-Kc=Z;6%7Ld&kbNCM7rMaxe!T+>zgSChyhQXgOWe<})av9^8jI!;H@93QEkxI! zPvFP0`g<&D$}{0{B&m3oF1*mkWq;W1TyZDd0h!Avl`zv~dYf$6v(ddJ#)%fZSFmOc2<=!Ati6EN zbtwfV7fz98NHqrtt(g`xcNuVh@>>jCf zTm>=ErSXms*a}+_Cl}|ZW(dINeHgj{JS9P~ZH0`3ck%wy|DVeWETVJb)k>%u?bDp$ zK<%b?bz1i)sb2O6vPmqVOq`Ll4OmWXMa9Go|H3oC{CMvoP;h)4Vx*V)zEye6YQbt0gdnJ>Lrp1vvPfNi|@ z-GDm2MOWuk&cBV2J=@5z=Vo5OA8DWn6;iE4p-G*25sEmV5Cts#bTZY7s zp6v&ZXJ&FWy_5j=%$r*NG*~q%L%n3s=U;|`_XfMCtl&tfOnG=U7V?Hs-gp zW1eDNHXf6}&jrFY23kt_2FPW2SEj(MBgSof%~2_Z+qEZqcE>^D&;e+nJ~?`UP#^Yx z6BdW=&L@?8@&e4&Lby31B;BLgVXER`+O$`nROoMjIQ|S8glgNVH2iaWVMp$_`G;Ze zsy8ED^(JEB7t}_|j7xed+sn$Nb=4muOl)Z!K4iT5`rVNuK#7UtaBytM*?X5s`J*qZ zAGPPQoQo%tnaRaJR`GMM+upPW@mkY@aKMe=!j-86d)dl`jyD`ul8#y#ZKpLU_9W=K zm&K#8v6@YLr%bkKEM6W;aP71BO7d z3k_9G>~hY*v5*ec7!lf@z(X_h^1;8?ea!C;`k#=GCqWW z2ldN@ic9f?`H$+2ce5MzH7zH|;;(!4#X7@@ckfrU{4Q@tZs(WOXF%g4#1$B=-tmGq z?~r`+VOLy#o-qvJV>n{FS&55F&G`B$GFDPkQX>`_HsQmvynn3E6tCTOm%1qH3%U&M#;${`f;PP58U5An)z0?M4#+XZrEroVH&(^m5Tz zBO8Vn2dSO6-mCV_6vMQQz+?GcbYgWIGN4%pT%`ic0-i>G#Y$yxA(2`}apSZIJx8(r zk6EF|SA$&V?O3$BO>9=@ke^po`k#(Ot@k|CD?=05hr$CdIj|$;UB4h>du2PtvXkP6 zDLcBLYe=9<*t6-I0B;N7+d+;+vavg6JH{6Kz8Jh!5;^^h_#gxAt%q_82b14Np{erG zWb+;B9QLy_iGf62HWK*G8%h6Y>B3Ic6;b~QKSfi7v2`Zu)OYanY9ynG=qz>qDl?o# zIN*`X9oumP!FK~z9SWwbo*LXRoXPv6K6`7cs@gmuQvkKtT8LO zKVZH4ENIgUogz^g`SfLmghIm8me*H^CJ`#;oAJC~qltd(X1Gg*ZSr$VIr?_D#6CTZ z*F2x`k(@3ls|&Y4Bl-TU=Q+05F8}g&l7=fd$qXLloRfntzLz@J%{{##mhZ{Q!NC#Oj)>NT`ZtKmweR2Byt!Q<6`V%0}Y z=JWSv!E;~N(1tYmKccqj^j#0gcCR@wxR~zyeyO<=dN2_k8dQWSidF7~QhJxGZoiz{ zlh3YdVtC+AgV;D*pNk!&*Ffy9(~gK)nz^I;49eF=R0b*U0UBGiRxn^ca|7?UoQ_r< zSv}Ox2-gq$Shnz$a@z5|wfSn9Nde65REko!Wu-Ri6^qLSyR@3zu}MR0^|6i*com5_ zZYGPg!|)A%A-&OJwS*jW;`sYitit^4QD{=a-4@n|ftZ=W`PDepd3NH1S#Ch$X}Z&F z>hmVpOghCUAa}{|#kd!H8Ali!-M}-Wvqqpa>VH_h_zYCF&|qU+TnVfLi6FJG-Bbox zW7s?f?4iIW_n3^QV;T%w6{v>N0?A(M;ve^~O+&TN!4Dv>S_L_F--zcRZr#ZM1_*Gf z%0PGoPSfrxAX$qmvl%@A>G}4mgDIxdGrk$5IXazP6Z`p2J?;$+Bdrpvxy3mYnDQCl z$&2;Li(QG!U7%b!0)Tq1e)Y);dJ^3A=mEjYf2$-aKC2Rpzv$X9-#nP0QqP$kEw*>X z4>hJWFy=QgCdpGw+l>bicAP}3IHY0?zr}`g;d~?ng?T=GX@4~SunJ)4olvc!p>00z z-A9(LnM@)KgEd3ql+Z`k_U?Ay(Nn<_5ul*-#n=$zV#pjkW6tBS)?{()3W zQEk*${S%2dJ071t-I+i@PSyf-3W+rX_l15ckgSw2@W*K0ZE>ff{T}x0lzTCC8`mpN zTm6*u&x9UQsXh?(!~PDs*pIfDL1!cDc%{w=Sy%?%%`#WUioaR68i1M(n2IaFi3W|I znvSguCIYVjh+Wo`wdX)LaJbivy$CXsIMq@@f(oQN1nhQ%)S~Y<9>TLmJ_&>R6Np$N z93GmytN$NUXBie{+pS@2Y3Y!Vh5>1i?(Q0f?gl}+83m;U=?3W-U}&TTh8jv@Xb>ss zlt$PO@3;5&ZVwLs@IzKXZ1aNnSTppkW|9`Z~`_ECEs}x5Mxbf-N z1uaZ2%y(H8Ka^|bTdlBmUgVjidjwQ2Ke#Sad5uBU5I+$2^!uIpGs7k=04LVY5QHJW z;^8q2>o<E9zhhz5$ZEq@bMszT;`yN(H&OQ!f5@< zXQ{M!F2RI=z&Io4;pO^i(A<+JqGwl*jDzXQ0g31Nv{6&R#2s z2mmYR4K)Amt3>1Zp`}H!K57R5MFZq^l6R;2jX^+6|L=aK=h+f30vNd4XGvDKw6$8V zSO5L|Vn7mxhR_q*r^LY?(}TP$A)5A{!zfOxDC;tt=uABGYd*Ny63 zSR(>7y0*TZ%TB?_79=%#{d&~s06tb;v+yLL4l`_Yl<|+6U zSar>^T8cFc^l$)*Q@fr>Kjra>Rf%S|ho=slh%4-&=yf^eAqs7t4vH@nC&)OEgnNcw z%!P$Y%T9bdNqX?(>#3<&YYd0VHZ1iv2jUM7oPXqH6WvR|K-1tdc>o-k#z7qp=lhGW z^jn8s;I%h!t1t!N1^>Q3gImdnLI3$sX3{iQoCWQX_4LLM%1BzU)i9%fn!a9uv&fdhBQtw_DgU)PjGz z+*KPMM>_sAy98LM91p%Zl0DL5B*q5jm!fZ#nK-O1z?vCa^r+{r7okW5br%AVc=HIO z#q-hWoHYPh-p$I?J5IKdSXRe=6M8WH!BC|hb^Vej`_bzl*!$nQXey~k?2-WC zV%-c~>i#1*=@bb&KfZPVD^$k5+jiwq22YtK>)jWyZaK*?MLA3KIp=(wov|^c$mwfyw9DA@vuk z@~l{@)BKpdQ@`TOe&q4P+3V{Y=`rO>_$Vl&i5u(b>O1Q&epg zC=ijpwLz;X81gFDgl{#r?6Ql8c-gk*CI9hweE%*v5%N0UN)s!5x^)x$PU(b)Y%%*1mpUXBid~}`SG$oR zc*P4HK3|C2mIXnJ_!H&}U%*DK*o0WLPX1cc2nJ8bsQu+}Kd!%?7|as(sVK&yQ(aU@ z)%%QHCz8(MFE0S5^xT>Z&Qba8K%if`k%^pLY*Q>=e0Td7_g-51=)co;dQ6PlWS#8> zM7vU+KOHlvtjtIwd?iEi>NkNF6rS9Kkfl0VfMgCnB=6IbYSRKqUMo<; zwwyT1md&3NKf1gEc*kXqJ2 zIpfkA%ZniTH-%8^$j?p#FPmR z7E}6$({`K>SL$XzcXi3(P3ulocl$%M7yo{8x&rD|%-GE553Z3BGhako0vYyCJ)7`M3$Qtix%PaK>De=)Du$+BgInF)ET0@ zh*8~>U(5E@;N{;B>jb&1)Qr||awANk$_u>i6IDON;Fs5Co%we8h9}3=&)GJ0vD^oz zxzEOF4LSraO$~==mBiG%A#4wH(#IVXJ@3`@<$0a2 zzD}VvNFDDX?+zy3GwD$ezDy5>XL7;XTP2i33PXZcd4AB5R~Wzh>@g*Gn>bR`bjw@> z4Mm;ydwnF266n%1GCI6LZslk$Uf5R~CK2FdLuCxRX@TiCf*im-u#sGLh%uS( z+!wrg(I!&&iOIc)AJjKlm8`G%HJ@vklLP#k&4LV8w|a$%*8jhxD&R$xCudv6&q4t?c_Z z7r`1vVxs<^aVh{1d;>Z0`N#JN+5E9UvO(EIpCKJ0W9+DYu}`>=VUlMD9WdY@hWGY1 zo=xItg9Lrvc)bz0*Uel+GwQ+t(1RnY0;J|v27L2j^LDeh-rES7>t)y;a zd^?(H=r8Ls06Agclb%iDS@_|PC$$Y0#Tkq3`D$_+OV#Mt11*>9c`_O;E_i@E zp@FO!YX;ysktC~OLa++4H;h>xL?}*zwMM8f#zM|+2%3b`NLLuAXoXU~TXi=VWKm$b zKN;h;N2#T-di%!OihFc7eWXFJ$X^YZvpT@?xz{w!kOia|=h2@==tHMF0<~-Hq zwVbYLdb-$AEUl*`(DVl3!U}&)qftv#)dqZ0&PI~NY)0p;zxr#Ysz~L57yu`(v9$nH z08@|u`^h;y%}lW=gOCUv)d3!3P;YM2J9~Tw^3@Dhyl6Gi$s!qA?;k8Luj%Y}N+fDh zlE0{Br!-*DPqJDv-~be#q@8c5`IJV|J5AQ;Q7E-heO?N`Ae;modAFLRu9(E`*|SUD zCi_@uPpjvs^U{x|=U3P%nL@Jx>uQ+=#yP{zcL_#fEWYh$>AZP& z0+llNfmHmFDZF*buWtLS+${t)-M2|2oz2^~_il;E#E5!2UX@rlv(JzA9{t}L(4we6 z?qsh=d0cA zq#`rpbr>W&q_@E2Ni0M$;1;?Zy#(%$0?}S{V*GAFCN<|he69o;*;Jv<%)isL@Z|aE z!Qi_$1>0RJey3fN?K6pkhvBjpjJ0aX#Vpw{50cyZo;L<~9hxd<7HL)?oSVeP0q4dN z-@Cs~MggYliAb#_anHk?%GRURVx{eU_zqrdm-i814_o|FuH^yyyi11^yBJBU3>#5A+mQU|Ddl2f7az*PJw65t4>g>zN z&kYD*H{`^xhI=4;Zxzb7!8$?}>rQfu6^CVzbPEuOKgh+5+s0p$FA`%V>hYVm@wiuUQtF?7hmYpnRA*d;)Ropf~$Vl*gdn7+Sc`q{V_+d(FodX_s7C70R&jqpIJH zccr*159J697nJ@xcU}~}sqNonD*+e+$ZGRFeD>yNd!)M&GB9FH9JL09Ghak}UXHR| zNeqWRyZ`3#y@xd{)}x#DILjan8iCxO8&m0YVG!R-_(F?PjJVqY=(u|mTCOen#>Yvd z(p{IyC`rIQe4IOSM7`&W#DgiETo#?Y!!eIl*2>Fj9hvdJ(zKmISi}1S{Sw^X`oU8% zCg5TDR1z;$mKf3m#yWb(u~M=2>1s-Aww`Io}cs6XU|RI^gPVTD`@tR;LDUd)Tq7hmaq8F~=%HBj)~LEf@+49b!FGqw4eQGs9CU8u&wdP=)7Wf9 zGNTj*6LVI2NY(?gnk@AS3h>3$djgv&^ssB#4GKqQzyY*KH4so12SP5lxv;rVurk1|We!6)O zs7#SAuHnrpdS{v&+T#a(jt$t7qW#~bBU&`|mi(Utz>?4j&ytjijKexDYV^(j^$Kbp z!UGGV=&-_}AN^!2)ps@E;e+ktEHCB1oRi#4Ep~6c^R*ArC^30LNwR*)Li;UG=M+@^ z@iDRm_x56zgy7Ccf7{C737BAsPt?cZ*!t~~X%g>?xlBRs%1NCq#q2@#5Avtx|VlX57CPm^e)iwM4 z-8FGam&ys{D&#*4BjEb0FFRR`GD?-zv?C)>pQ)<@3nG$=&FlGtmI zqA=1MPu+}hsA{Uh!PQ3|Lk~x_7t!f zxvvKA-(RE2N+48uRJOz)o|%fRI5Pd^KqQbCvBz+-F$Bl`&h=VDJjwiLPd%hLja&gS zb=W+WY}B0~jq(G>zM*F*z-OdYq8R+ODXjZaTragudZ(u&&Gq5)YiIOdfF)?@MZn7j z`+5`W0BctDQ=~4Q^ z{pi#Ok7B`fE)Ao{jv7}j|EOC#qaxq8@2HpUHkTJ)uRfT80h=`@dl_17ueW5nNeCsw z9>yQ8HpnXq57DSJuU1dOKucx*_oS&)5cdF@FV?b_R0QS}XG!-_k=iC=z>w2%Hr-16 zyh>W>=Hn+^NP`IcyUPsuYu0>8T@pQLy*>|9i zxW`y9pzTG+TA@W$3>2%_V(_?%drRrtG}Tl+cjqf-^cu$Gh>|3Rwufd|_Kmi^r}Opp zUi)wDds}J7D>s3?Q(TS{mmdDMkI`+HU6Jpg(r5U^LNrmOHkeR6Tr0Y>n(M#skt_5%`&s-FbEd zj{01hIt?1Z>!_)!hecz@A%6(9)dGF)k;f*sM3#F3K2_l^SQF!GNBY!;}&m z6L8@9e;5f){sQ^uGSpA8lSOu6U`@v5#CeDYe2$GSbT@DRERH_Qz3D7T=AS#a;_@Do z;uRP?HiKfF&r^<;(@+cpN6I*(wen=iJixJPUIJ~J=rRWP&j8q zf=|YdKNXX0YvAw?=e5Bgf*i24ZLu&T`(_8mQAD2IdOz_`CY93=|CM?5d$V%cl$o`P zqn4MR;sF2V9Tj%eic@JK&OkXrj{vq*?2qO&W0PaBPdHhnV+9&}+g|($;09Thf*V6U zw}-2~CW~c(0dNkWALkeNcc17eh^K@F5?NT&(ItF070#Uk+nK7K{J^3i?J0#MzBT1S za=xX_o)h-Qa!$|@1av)sXvZL6=?BzDoQOZSr(r)rVz;H|v%2y*N%tT5NGFC0uXb3M zd+tmW(muIb*w#sp$N-T1Kaa8(L}U&%tw*ZAD>Nv4p2WZ3If|MD-YOZ`KCD?bwHp%W zAvyGb{N&0xlIq(=?I*exO>2(Dz;6TY-<)U#3N1VAaSSA%5D^qo$g0Q{)k0T=rRzXq zwKmKHi0zA(5k|b{BSq$#kr7EH=CZx~eC1~7ZKg;A)M{zyx1Sqxc{(x~E{=M?{FPfU zON4WqUzUbT83H#s}g3SgAC=a&{-q%Tvt4RnAgT;+(`#9r%rI_g+$E$YMR z(?pUq!Nvl!e!5kzvfXm0(Me(vepaai%($*AslP+9C{)&s#d_fwoLItfG63IWe>v*V zpKKr9Q@R-1v3O;5Bi<2mm$lBRcHtdVM5v5id?fFHy6Nb0F%&^`h9AeDf3(~8<6TE# z^%QJse6+a5FQU%W?#_E|h@5tK_%c+re0xfKg?)k!1U_gfqq!RW+`RQ{z7EItk>2REV)wz-{_KsH9To>t)SNmq~^f@A>pGD7! z_)2O~;eonZv|NSPl7#`Yc4Okt=W^ezzNY8gXt<23StD$oxZWnyq_sS!I+9)J0};kF zlW6<9eqz+6EFchRmFH|P-iTs_GS2^rtROQz&VErAWNJHw^+cQPN7Yp)FuQ{>tMyB_ zcHxH&^_2yr;}K$Q|Mnzzu0Y%ClR@9@VjM#tGy{(Nc>SaElHI2oJ3X#9Yh?UHyR2yZ zjQ?&6tb2fmAp45d4IMoUVIaKwsI%=2E%m$KEa>?G#N_ogP?J1A*@zszCTFYs>1zOR z5zXhm{i~JAQXP-SY}xP1wACy#P}*{tr`7g@UyrAN%<6m}4rImH)zjbFMCT*UI(egN zccc7vILjBOaMy_{np4UkytymokANSA5gS1fJ*QxZuQ+{;(p7!JOrD6kZxVDBb>WJf1gz%H;^h?p*~MttWNC+S5#dTB zd&y-h@)tbqXcjWN4MzHXvN!Cxi)(HQv^un5vXJI&mu(x5$S?5~H8OwUeW<_zs+C|o zKsIR?c_dW@?mx?6C~AIi!LD6)yR0RucNdV7r59Bc>@)0wpfNMgEw%N32jr^4P##Jb zMV;Qfpy8Ax^S^szZ!LPzIkHzQSo@&8+d{z%>Hxl$x%&^$#`HfPZdshMpE9o50+*ZD z2Yd6e)%KUr?f6WXE6eHxyd$vP{l>#)AqVTtoXnzRG3ut#M2<1m#~8)6I#`#DHD)_^d68qrIa3 z&(gThKdTHF|IS#au9=%wMDBm}_j~Vi4RUOy1*7HN#L|Au^plOtsn>-w*E`eRuZcrK zUHxsa6uSdgj985>9n3^?^7r0T^@_ZU2zWWv&@{AUT9)n6PTWJI-&Jn@nib!7Z9hmH zBdG#P3N0)QOOJ1Kvb&EBm1sP%n%OI7pyM%Y5pO4~#)YY0CydUp%g}X;TsMtvajjP1 zD2dm_S6WJq8I!THR}?JF$E&W1jd)*8+nmq7g^KP~)i^j%VXHA=E|DFT%4pO+c3I+H z;>5I!Il##-Gp}EnvF%0{l^*q^$X%<6`iiP0rd-s%IJv|H;!A z5M_-@c~9dIw28}drHMro{y3bn-!zwgU4mufQ({X3X0Phs#61?$@u)~tdEP|0kvGRd z6^KaxP4$d}30^{ktZ0sX+D++QO15dG4FPYV)~cZj+qrrFSXBws)?(IBm9dOKEN=yD z@eI|k#Z^yrUd{rfF@6#$;K?>&+~7%3wcxAhD7@F==24BWn5v1e4SHRR3C~S3lHhzsAEs4p-wO zz?#`mGFn+$$Og7zFW$gEFuQoV>Yk>T3|&TjDC|Y7z%vV3z`F93#YhVaS9`rl-NFmM zEXMdAgxg(wmKpi$%(4xffFQGa7k{Oaoa9B>(1`VzFJIan?ueu`x|M|3?wKhB7D%RY)Ihhi;?GA?!?DCvT9g zb;s#(^1{!E0OCl@s}FB5Nup0+5TzcM9E>|O5&w74b?;VIi??aR?_)E)3%6@*x(?eH|IIu-NFka2RZHQUrf9XRPyb`_JQ z>yoU16$`(Ud~yYvA@n#niGYto+eqc)O?Y9%`c##USAs*SmJ@lh*T=?QbOHa8-d-E{~Nnn1oJSp4p-RvA%gERU5R8bx5g|H^WbsZbw=c#d;h#gS=&_ zp!jLD_TvAV1$}Wf)Oxz7O3GyrtWIe@b)Aj2rXQZn)n3jq;YWEJ(nf=tu4flIX5X0y zVx)Kc(&*B(j&<*pLAj6@FB95#h~Sr{lOyBNue|1*pHxM9d0I}1XgM1EC8dDPR2MI1W#>$i{h^K@bMQH zEk>r6s`fb@6lcVcEf6!k4n(zRPI<ceP`Dlg3*`DeQ4;g~UA3Kml!Z`hk+G zZF+=bP%~J1MO!(oH)BN%4rHQodcE6l0 zvj#JDDGNFHjuRKU{M2#%n7x`lhs-xu z90>-h_NV`*U4K&#_0rh@7r~OtRl`cjw{QOn8z}-@d_rxhQD^n=wDj-60~Y+T~fu1C1(VA4uVlqJF)yjQEv`=9v=sZXA*CYLV+sZ1WrVz z>kh3Ydb%FH6^PB)=0V?xxbTZdd3kek(7t@Iek|M1bssKeJ;jjog-w3drRW?dazU|j zRJRhz=>6&`}eNLw|uTOUTZWhnF%3``n8PS2((F;*Ckhx3wj(tczrogF3`&}8--(Ng0MyOQVqsrPzF_`#Ha$8#kajPjuLO;gFC>qUTa3V$1r_i!v6}yzGNALa+S;R3&Ys%o3 z1y+WX4XIYk!;7JvV-Mwt8K*ps9Kl(1gFHmKM7~r>7%FT;n-b|y%1MqAROv>;Dn!{% zAc=q0pJz2OTN`mCVL0ayw(Tz)&N9lL3xmso3M`z}9|n@6nSuU|37=)nQ-WPqRwcH} z9s+%`YbE`5)*hRQ@EHgu*{5&u2T0~zB#SFF+QY7{2mu(Au+m(EN=!7(hjq4z8Uw+& zI-IfFDD^#6sWUB)OXPy%5x#9b+jap_@JTvEmXQ z)PZng#5hZJ5TbN+Mw4|x@0w1kOnoX`?#3u;$6|OwI=Z)bbr?E@DQR)bV^y9WGXs?b zAQO&D;Ye0?=It`N==)d@MsS4<(ZTd>i^|h2U;i%pge|03_q<&sNoQqt`)`#44gXZJ zW8T+|;X;5olkuA+HU#_$mMCPcB0aorhU(b!;JfD^IjQ`6IaVo%rd0qC%;#d7i4w=5 z0b{pKSeCD*bW^>dDWrb*N>fl6?!c!(XYsMQ0AEWZD}AjpS(m*$%oDF>*41@(xy|jPdY+Tcf+Bg)D0(aF zoA{=b=x?vqvn)ALZl%IY2{&R`WHwSJOf%_#^L*gZm|lXik1ZZ(7Tb2sSNv!L z4271Y9mXcw_`MYX{bRs%vbNsntEHfbNDak<*TTF@y1ENmFwh=)!e5lu(8A`+XWr2X(AGNF!xavVI4PogKGHp) zZQ07}5}3`u5TDv42cP7n1KMnbo0SwmEy5Ht3JlY`skvX**pC3*g2th=KxrUL2c%)U z-vJI!4s9gIrN{@C4{X;Uw~x|u?c2qjf>I;)ra%u2VPmS_^?TYkqK%NpA->o|(`dNA z6fz9mwcGP?-3B8<%WD6wph|v4&QJ)=pHS*LzFJb#oS#%?v=|*;d)*wepx7d}Qf31@ ztowtD*3IlNK(E4joOinFwj-cfDZ%!^SVy9&V-RF?)7ggFPeMw>k&~_)17;@ zQjTlNXk(BB5=806vZ<8wQ3nJJ>xnylO_HEZT}iQ-6p)9x(ZkgyvKeHJka_G0CGoQ zVEtYWjw}Z(Lr;KFctF^1we$-dKLN;2Y%_-2vjKUDVWV@_Te)sGVANH=p%zMEGtjyz z%aP6?IM}3Ae_8vUaeg*TDB$97cM)muuhw+5`;q5Z!!`TNVFm_n%~*sPMI*2@4Kc@wX$c9*Ibka!$~L7%syw zZ`rsoRy$Lcoimg$9zzKp3=OV4P92d8DsmkZ0< zuSC7AFDt(Wj9zxp#1-V|m(oqd)DYh7<^0$yc(I>OazU{QPj^ZXqNxk7S>=eATllNr z6I1T=ns0&Q6YYVNMO0m?9>Uwo+@gZuvml|bp69WS-tY$%zUtjhXyR}LM!Fv8*NyQ4 zUIvbKbOaHY2Yj^$3)Eh1Sk%VPkuUjE%~-hM`I{Y;Oen`u24UKJxn&k7-Ay~yj)%rc zH3@_k9qr5DF8SR}=5WRvh_+!5JXd2l-V+G$#BVH4nyKA@oI;`NX6wOZ{jwu|6x)D) z87c;ldYjtQ?n3{cW99oKx;M*%l!HLG4y2(nV2h~&m@7ZS385oHc32)(b9{=ch1cQy z4Xp8GqHL)@b~1G^EcX4 z?eb(bhgZWzm}J{=HZQvT6t#$3+lYsU4D^>+0H6API<@?9Q>T2anom>RNj)+Bma%n~ zhTu|Ca@+MfHvi+L^q(`})vzWGJdq|hB}(kShII>>bS}LDj)s`jfPf!nK0GoLH|~Ni zl`>Z+9{Bw6(al)!@qVg?+D`XV%$PEYmZ8Edyzv_6KdefMY&BTxKPrP;m?)j+ji3_^ zi*L+vDA9`UoePeAZ!dr2Qj4_$u>yv&-vV>ki9G`eOfdB75s{N2K)RiU5C8-@G^q(HIC$dY2s9T{h=y{ zcB&*g>gH)>y3@=RDNq%6EaQEr_bS-yT(`9U)r~>mIR1?s`W}JNVT0J+pfs0Gf+aL4 z7Sx>@=KoN578O9QD~uBxBFl=Z!k}bRzMsBPAqM_hdj~8mK!QF}xeiz@lMj{!)V}9v zJ?z@mJ;-z)F*n^fn5ni5!=WtG6`{u|>mdeowoaAr-Tsr9eUCg6$y@hr$GAq~1w=+K zv_mmUAUY1FpIS+uUL)Ud8ck79x~UXn%?IHrMIOKXIZJEUMvHTe1kOv9M*}+W;Oi?| zA0>Fm?@0&S(spjseDR~CV;3jq_@E^j%J7G$pjO+?aq%|s5?ctI_7+VHM|oI#h=nt9 ztu{C|HGV-EPW7QCN)EbS$ZG6n9UCsL38i&tzvxzN^qMi>^nVN(1JpnwO&R+WM7}A- zGOM3ebs^H(v!&q#Okj+0^pvqOX;31M&lcb}k3EJ^J!=+kicxyPIqosR)Dgpw!d#z`*#RS_uZpCKy*w2^=s+O55n~nMo;2&h^ z{IO3yQ8 zvsIvfxA0Pc0xZMj1x%dY&yxr|+X&AFYUTSCh16IA$0()xn_Hw*>c}0g%wx05U`Lco z^B$TnekFWPAmodwj~@0nv%g@7TrprGDFlLjM9ettLM02Cs;*FsTp+(TMfi-^p?vsnk;ju&448SQuQhGf-_IFM-G)Nv}2Tf(dV=5Wov+25K?voCIP*l>Odl(nfS$Y4guL)C4#PFF%V@H znlzEHZ?#J(a^-K2&MfJkv+Fqaae^Rik;(CHldO<;i#e{Z68cr}S6)I@sUatpN@AiH z%yCDRdcDghRDJna1pn77fF~(KA{l&UKg;p2)|RuGGgB%+*w(~qV#)%BU(lrxiALJ$ zGjpOCs|$YJUCf=5Jqe zHCcglwx-}t*yZ;TK;kqe^dEaaX`WxU@MAjBD)>iezuS9@bF)VH_&8ZwAPQa2#G(0b9P6MU*0@iB}X}Y~2_7LnHUpZj696Bta-E z^ksEips=I8k^GEcEgMwWnW)96QK;k9`i0^f(_s4xTv+}FHW|Ym=eI2XLJVS!7?viM zNHl`teTZ~%w6C6JgLiLf@E?;{@nRiEZ-|KPVS$`J->-FB&%~)qcO3cklKt#9yFC)( zc@C(l?yq$F9#{k1`+S2K99!$a8>0q?^16IHYd0_ZtnZ|GZ(jNSi3D3xpeHbcq?{pF zdr_-}L0K*xhBMsG&2GJEp^GRtu<6MHcJV)2uBy(ovz#_1CJr(vvWe#f=a&*@a(H0U zTx7@q05fICu!=ZKqP;uIs!#@=y3Xc+@d5W;);(!KukAqHjR-hC3MK(Pj_X5F1`yNS zZf@%=GQTzNpkV#DBF=LVV1u;{*78nU$YNl5P3C5Y?A;AK3O66l^41gew`iKVV0k8V zna{wV_lH2P3Z*DMt2#$Mjxw_v(9>ijeqznGYj0>wT zEIrB4YLG1O#TdEMser&o1}Aly}G`R`I%qu znLl+F$Ee$grHc(KljsO7v^>Xt1SEcZ_tQ3-6aejFb1Xm4-84-HXA0QC{4PtGG@8R& zM8>{V-E7_Z5%>6_`vdNuRQV-A2}I3;8gqk=#8B)Us?}BVgyBbQubrvlw-*d&U@a-Z z1fR=Yn2&6qkXr(OQFggW+|PE5Qpg&xM(H!mQLwee>%!tvqs3*#Z4_I33^4_Go7r-u zHnxrh&b-&(E92aFf-s7g7r@`^kCa9M%Q}tX^p7ea+KN@6UO!WC8`ZM+8AII*0Z^wd`J$m z*m>(#J$WyrA+wOyk6d?dKkISxgns?m;Q=(e0&o{%yiY#5G673o0D@%;Nanu4c88I3 zKn7jD08oHjmRbda`Tzr8O2C#p`89Sw8|t3C6-i|_0*nL$1JJHCx3)WZjbHzHCXhui zxxBRoTo7(>y}LK`nJ?GOf6?ddv95E>ZmWInY1g`4^mk!u(T+F+%j83UWG|O*6ZKFR z`LWSRw_)U1lo=~|T-13Yb>_Z#?3#Zbrtw~ZHOG<|IKDnu$&DBDG#HLzqBgC|zUbkL zZljJCdq@V7X!q_>^?;NcTyrk&aes;f+;dSg4t+rcmOUIE;CSrMUsv73DKX81 z+Xxff5?*;e=%go8_Bn-0(5e{LW2nqC`dF4yTTl zd#z)YnOxGzFywgH&6^X*`w!z`pYZ*}M9+_KT~%}a+=;(H4HA5{t`bnVd)<5Ro9Vg+ z4|0+ShMuep$P)`4JC>zIQFDH z5yOHZLod1J$sNU}n(O7S}wrkcVBv;9(`{ zuxGXYSQwB$1JF41f5N&K2Zk$Lr0tpkJ!kxUz$6gFl-Ok3;TL395$$gk9T7$HXKUKgpo=UpSOyOCV&Fp=xA3 zI%kxY;XL`r5hcE73C#rA*ezkw6Fpp2id-DU-ls=0IJmg4jJN!%X%2LMP3L)MKYha2 z@xXxz_op$d>_O%`BmVGcYXYdSK`9Y9KUnJ9ryx|8&)Zr!mw-Vu?u38c$Fz9Z&aK2-PCBdROUYK_q5T@0 zb-8Yq4w%-z&zdh%jYIEiig@%wauCcOQ1y4d3z>f z5LIsD3stmF)pL~mIeA1qI|-0JE3WCYG|EogA49V)7|3;DHhhVUSEWUYCU(z316nhQD$J*UQf{v*-`w7` z$NoiM=VlE|?q*9^POg2c%cl+LX8Vw;^G^?f@jj%pk6yCehm`Qk+Ab^LHVfsOhxE4R zA=|YG^#wPKwBycDBA$aKdQE|zpkt9cool7h+*B>w*w(kTCeRFO+YH@SsU8t0CtmQ=-fyV9UUi!f@w^jc4QOc`JQW(Y3D_NgbDz zP>pch>dbR&pUG88HcQhmu>&;OP*i(Ix!PNL z?3ws*(PDv96!0MH`IK0vr`1XG&)Z?!&5y^61W&nEh1D8MYTq51Cy7Dub&ed`kic-;?Qj{hwWEng$dN)P6`}7&=cl-L=1%e?ymN{ax~c(Wqy$Q z`_EQ!^M~Xo&kMR1@jqxCJ+F~q%msO|BuillkTQM5y_9(IhT&U5<~OY*B=z@{L~+FQ zG~!hXoJC8Gll@tbUYrFK#9!h=C>5;m!AxeXPGJxBoWF6U)vqD2XWWss2402v#JcURy;i#CF3jT{v*{^Fw_7epc(t_sg2Sz{ z>j$Lm;h*B#dOumXNqhkJ^S|bddv?DxcUdT+-iiz_(|#3`^chUf`85Yk`{^jC7gb;) z`;vop?nGnZ7*e98%u|E8I7s-XIp zY;3FHRPyUj_0a?ix!+x@j>B}A+GQC~m@6W2Ri;fRZY@l<(BTyo#`$a4OQM;Mvb9|R zqeKf0Hxaw^?<9?ypH-=QMh7!DZzyN~RLJZfUHx1SSLE>f*;&Ii5@-u8Ie_$4|RPcm>P%YZ~UinzTrMN6OQFK z-xKm|xWP{J&zhr;yv_HIL5fB4^8_slR5`ONQ22A410{G7aU`PK>$*ulcGO<&9w5 zPO}A5tGM{2ORfZtnygTnrXwES^7XLOq-|o`tEhkoyB^ zs55(u0iJh|x z3k!`dY}X1&ib?7+-{%OLfRp2usz9FUsMT~}9o*-}MN$tfG8TdJt+Ve)?> zj15GXQ^lY_6NqqbVA7aZg~<`rW6o%4tD~2=l^VN4-gX9(e8Vdj9JsEX<>o)=QYfiQ zS|^EWgAJ9Ntb-A+DXeR@ZAu^~Rf#VTOL=d$i8|Ai6Awu}pX!s~1>7QNEOf26iKbaP z;U+ZhJZZ8r@g(6L7)ZCqLV|qBW8xsCfsrzLk8Fus_{ z-G(c#LtdH_ux3y1wtd&q%X)Eo-Bwto(UkE%1VzuuF{KHz?O^ogjpms?c+!`pMEz}r zq4lMAwSYdzx1+0&8Hs?BPSZWVI}*R`laHmU2%1@31h~q(07B|=#xnLV6nglK`r`XD zfNVyrk@%ogZQRh%@btZm+u0Z#y53FQdNwuhe76_dr!02l-(mRo;P>56bqeUj=!2NR z>oen4A1;rq#@br#J-&kC+bprbD}tmLd;t9L0!>jyQYYu)@ep(pb`NO;9v6lUheto> zqD*O7rIO^5qQyRG{BtOM>MC%7AFAlk-|vg2K%$livIe-%<}75gjVA5p%UM!=xWQi~ zVqxD!?JSHKN>R(FE!$w>U>Ze{ii`oLGh7L%FTL6+()$^;F&?;#;1U^4<7ZjGv!!DE zHNgeB3JsY?e~=hGJT{@HTD^vU<>lWs)JJnq1=Kb}@`%~I4{&Q@ zVG%v(LH4ZEh!q12$Fxw>sSkkp8D~j3bcUX{9D2#5YV9Jl{u@5~r_aR3Y{h;Evn5s| zN0j%)3!qS{&iK7N`EZgXP3GJ)f89=R+l&QSK$i0UeyKac+ZrxU-vUrvfEL_ycTeWI z=P0z^^Iy6XmJ?xNdwYAIKVy%tPZD&Tx1c&mi?`L>7XkpH&O~pZD7+#Z5nBi4rvf6DalQI5AS=<|9msfIAhJY*0a{S;E2Ov3cL(Vgj|&(-DTW3l7)a=sFk#9MLdl9X zafC0bPMaNWExMDg)>m}UUupHa3Rl{lxQ!@`;}1zby}{4WGF-u6t&e|lps73innA)^ zBR9HxN}jICs_5qI`B1>wgkl<&$`ypO^34#xx`~rb2r4}=a9w8zYRqU44VvG-WKCVs z!-Y?F@B_c{Lb`Wy#(sQ%=$3w>e4VE7Zp#==sk7tvTU!0$K|e(sz22Ce$9AdW6s14-8f~Bl#b%J*v2D-m`N+MYWzsfds3&m>;CuErj4vAVHce671b=?u%9-btS% z0s)ZvC5_@&D@2Ian@f;qoV#a!1pZTnxHlyrB$Eu`fyoXNk+%ErGf6`{r{tA$K8t46UJ@zM$ zh7t9&EkHRXdFp)rh{#|mH28)%%v_*!m)p&im5Y`&Y++PCy)g-?`jIw*76FsUel0|* z$r$J!3NX(>^R~%2k``6bq>h61uZN-olf5i7Hc%%_`zMK;3lZ7e$^^<<2y!;G#c`jl z=k@I^vsVFPJ1ao-^9xaRYX|vec0v`0rR2^Ac4OP8bK}0H&_HJ{ znl%_zR9HY<-7xygml^1^qi5vOSIFWvvWC_-3*9mP^o9E=CX!<1gkH|-!p?>R7a2M% z*>Ps3lS|fAf?QCns_@;!IHtckML{3UcP);KSgNa@bBzH#g522fE%vC=M{M4LT(X)4 zy)&4l+Z7%QuG4qKILqOzVm}YCDKs3S@9X(i(Qkn+PAjtY~UNZ2~u& zw|gMnY&)#rlDq!r5%R1BF;({B#fzIu#O>uu82!x+2#(A-Yc70xYzY$QK)Zu95CwT! zj|5K2z~+Gz+3g+Z_ztl3&06Q#?E%s40SIksz1e9c?4NAk7)VpZdpS7(GuefIELpFP z6EV2n-_3`~^8`XRv@JG#-&3J!B3# zcABCp`>gj!M`dyR@?OfI#wmmiV0c3oF$XPxWo;mg(~|Tsw?iYu8@m6(B*csPh(90K zeev38k{)S1fVk(x3B%v7;kBN~#Rq$J|9w1Yf8aUu^K;I}Homf3K6MX1l>)N~P9aMq z9!}`GQ<;iq=u>g`wXEkdUJ^5OdZUEH6NwLU|Gs>(*{3m%GkJc3>G+5S3;{S~nNqW>S#d_lb4bjRO=`IS3d#Dl(# z2wY2g#y%P?PmUh?7<(9I5RHS=3y=iW5_mr3)T#wm8BZoSjcX9-LccCRi5vYYa6Aj` zdF?~#jiisU!*!~B6BVoy?qz+QgEnO*MO*b!=J$|Vovr9df=J#2&Y!`|U}ekJHV9*A zjxNwGLC2g#Y@zbm7ng1tnqPf82DW0zZurdQxM+TOuU^Lpezs7Dxv4AhiDy&hBtIwK zwMjnf6y2w14)Lt1Uqup#-$Gv%0lpj#z)rdz7xk1W+5D7jm8y;2Z>RUaev}>yv0>$X zHw$vB_*DNjk(zw(O;XF_Bs|lEy4_vWH)|-AKw0yY6x_}`IREuQn7DzyzV{syy4mA& zclOR}#Cu17X|DOGW#1Q3hXC2FaXPoUh^yU^o83&%er5?|8sDA*^{v+-ygn;;&Ju76 zuuO3UZrKia{D|&Y=)1TgtG@9uRG)-1=8p z^-7-Jx90L}$iYv59ZE2Hk^Wah{L>6n_2RNPM4`k-3K}-aS5O|DRfCAPXx8Z~^8b1l z^hX8)#$)b=uNZ51?qlHB}y5XzrKl&6g{8=rR63FBm{$1R70+`D4W_WO}tuS{f@w`f~pha>`PX8{XJJ4hyqh)8w5(Dl}J$ zHRH2PmzBiEj-5|aB4(j&_k+4E?w@@m`05j`@%Z(=cN7*{&N@Mq zuiyxB6q)$vLIQp~8PGooZ>#uw=2Rq-@J_3MT_O`}DCv~Z zuZU;uL6BEdXc&C&F2vokVyCa2aJEetpO49g^^*mkjSH8LN<1IFok>U~TX!D`{16w| z<1T35v2>rZ{43LZtq;uc@%30szqg$&`Se)t(Zfqg@=e=YdW!@e@@7kbIjZ#{JY-@umr)~mFV6tFyhyN$Rh(cif9 z+W@h@P((8Xf-t&(gWO0w3ZA={^p)E#B|88m_%hCC{RIAqlJ`tNxBjw=O-%C|^&`%Y z^xp@J6zgxQ(!G`od}5=XKH`3PoL3TGjwZ+(e&x#~5zP{RIeIA4C$o=;wU(Po6E5?? zxQIPdX^aQ|Tru>^(HHZVNoR5lsUrbqwy1(A{9+%!f$sC#hF%Vvwva*1kV6JwKSI@; zPDAegEG?H;^b3Y^GJnbwl3WRV&YWfj8~vDocbp2g_Cf`_{d(xL`h{c>W{52zX8-d; z?cm{6Ip;E!GdUT}qt9QSCx^Y&0O!LvQA~>}Ux2#Xb0C%9Ze9~E! zi!c4?i4;ZTXUhn3u~72nI;EC%E8nbfHBLv+MraX`_E)Ptd)@_~h7o@i+%;u)CG~1f31emVjH( z65$eLCbwLk&@7!}aq0GGmD4FK@szim)Wrv#9JL-t>4R-40ieDG6KjN{D}qXb*?R$u zf525wjxhDixge9cGU_*Xu-b{%2@l*dffdo&z%ZHa(RlYFmF$P5Q2lb7P~1Iu1{s4D ztouF19CWbn3{EnzX5w!3GlFW6R5rrbV!JTt+1I59W;>lt5A0`GQwU0znbkNhs%DNk zpD|I1n9owDR}``H_kEJ(RKn9}7| z>s05j@bSHIZ-rssbYWu{Cdfu|tQ>4DzuB}g8< z+18~5gSQt#Lhf#EQ&WvZke_pNC3xR>UvTslYZu;3EnVtobKG$=ug{il@8b2l0O0iW z)GSWa?O?h6=ICwzVu4>c-IjOvUFrqegnWO^OXs%{gSZ|QCrZJ_J$#SjQ%Ch4CJ1DS zcs|lrxpE*O`)BQg6S9{RvOa!%VhcM|m2%H0_wDxHS*YhxvK@?nfekU{kOz&G7cyn+ zNawZF@r$oGoV440et#3g{9*M%uu#hs#G3TppZ85|7jjh{sr`&h#6kT%IgxR* z^0JzW7Cb(E|7f1$fKsfxIC zP;knJ(ed<9_DlJnEGD+`wDM1azmql1$U9Yggq&AZReJdG&P*E)QYTD^zY%FiSt++l zvLeH`SgcK5k2V%Q<+W3-%BR)wSKnrywHPL|#azs^1k~Z1lh5&woEp9aj6Q7O^meH- zj2mdY+<3jJ!`Rx}KJqtTcHk`B!K_0S?C)!{Yq2r2hUglx;m%w6E&^<8I z7xGfF1_ZkwtORMDl9?_7$){vTB$o5g7r>-WkAgFuZNSIq!8*j)Hd(y5zwMDdx7iHs zr{S(gOcNIo_$M~6yf*n?<9s@YE z?$zt*?>RH*uEHubies`?VZE~>1viat;@2ZT0egOPS_NypYJtB;44p5Gz4(cr@^=)! zH5b2)VJ`Zb1-2bszlwYkm+}%gN$oWCd~8C}JboNuG8$@C{WOx_<}}>j6^xy8gk87q z0%Y-X?AtcqYv5+&_5$3npN>E$L5$poo2v^DI_qF(w9#L$C*o46QDQJr=HcNn9-}RO1IKP$~D(M#VsoHu| zd1#7yO3GQ8jRJI^F}rYNBP|)2^sOj@*3K5ev ztd?Aj{hcwYr2Mre2sK1Zd(S)BoRax*GVXDfcwu4^65sH=I9gt6{2V)P(D#E{Nsi;9 zKuM_uy~>9DCDUsn&UdhegiSIk@pflg%;3O`A5}j)*p}%YY4(k;39v003YW`j`Ygr` zdzbDTN^*s=(rAw@=490}x(-v1Ca+qA4_rT08^PV+@)=q`|Muud%=ecYw$_ztmu{F( zfFCTmjf+M+7wdF*l)l-*tlzMy%9EB%*#!6O{NYhQ60>#*wleWd4dLC7%-`i8U4=d* zx*XXNME$KDU>hfS7>87OF;Vt9AOe*Ub(5BitsP1<_9D)MEYGYV2SURO;MRa$oo zY^@1z+%wa^|IlROVUc%WqKK%N< z;sq`D$X&5tNua%v&K(uaMs5M0oQ3nlg*;ySRpIq_9FO+NJij6CTWb<*;eA=ia$n+z zaGd7bhv7^D&vHqe0Lh#l21Fah>_}i95f@fQkLelAO{@yA)Ud8;tz3?a{JpL(oz=8S zCQBvgZH`$AipH8jZ1>IILhe|1y=Qd_hZq(Uai1)9ptgLKkc;HfU&9bHA2_1~A zZfersllk=Ti4&Ya;xc5Mx;XGqA=go~&CaNj;FNi&hlnVVHIC>KCoST2Rc6^2qgeO@ zR>MUGPR1t>B&M_yg=PqV6yIeE6+bbK@x$W+A&(aL#Wuy?bV|*F) zrVSnwWHCBq;&hTcOw@K5GNOvCe@MP>+`(*QNwrr%t1XN)KHwxOD@V~d#mbZgJddk8 z51f8n;50oM@i=Q)&34)Axyj})DL??F)!{l&`a6Zl>KAQ{H}OR&mi=wj9`9t)I$HKs zY4FL3PafTi3r~<$;n#L5!XC*FIUN@0uy5L{i}P7$y0a@#%N4u6+s!!foAb}oVK+a- zFXcf5zV{CL{QNv{^&P+$*edZ{Ha_VDjUdXm!|sd{vo~Tv8X#sVJSiq7#%3@cSu`DG zEQ;#w1WxPiMNz+}TP#YZTQ7lISgkK4Ow*5s0Z%ZQWVn>>fX8mRuT6=lDyQ^;x77$w+hrd`twe*PR4spZ}eY}-6}X{EXk zS(4(nJ%xlylU%IsD;td>`zg`a*U@D8-;bq24Z%pUhijQHj9n+tGnnUP$74m`+FMK`9YIC@D->{Z4o%dNSc8~OqM3@yvEy;z^uLXC0_hoyC z`n`Q8#HR)|$C2(wP)92^^*C!lE8Fbpv{!naaoag#I|cgRqqhu%HV5vyol?1+nwd@R z&nu%aEBnLf2T{`v!7A@8$X_w=8NMggS}^smq8Q{Y%IdeBC;imw!#n??EPp7fo`cof zNHclMw64D1#6iug}3 zvQ6ZCf9Wa{(7pz#`F;mr;1c5t8GxKrJcR(LPA1tUt+no3<1mX z)*CO4yBivil^ktt>G&|7@9M5b_{25e+iVf#%sO7HIw-RXAEoV7oPqi|;PV}C`nSI> zjMp5si=K7 zW2SFclh_y zg(_32Cml?wqgG$on@aKq3_^ahAOyV zs@@Xds`Rbg?wT#cnwM-UCb2Z#v`#iilpg(>ji)9@=zU{vNS;cHD7&%KA?T;F4VERq z6S#y*t#8Imh9@cu5Yh@`$b4kO_i6yUW=7WmfLs-VgU6`Z!%?oN4SZ(7T!WA3<~>F! z*u#{tc~}bW`=Zl#T31Ep%*@Q4ot+Q>iW|Y#{PL#vdJd<^suA0bYxRgnXMWY&tZN6L`-pd)o5Ab2X(Xf4efAHW8FHbc0is7E za)RnKG*QWy|Q>DL~9{;n)uE7KNWEpkAvGiqq?gnUZFh5lkJyZxd`x=IteOzloaEMrAOa9LLyz-IM!(>KkAbef_{)`u3Td(9)A?3s<*)Pb&PUYctvo5;y z`sV0*Du1O+AO1vR!OJhwnFWZIW!s;Us+h^E%!z}jkae6jqS_iKYD)AefIA=eTR1c#fuJ3PU2uXb9l ze|LBH&iHTI-~+*z^Q%p9;PUTQ(>}7v^Xp};(Qe7J%57{?Kx-2Ikph&mgJuZNKv5-{ z2Ac9e`7*NsCw=fv)Npa{!tmMGAr|8Y>QXqS1;()1nZXC<)2bb&FwB-`>HfYcLIUb5?f2+%8BYQhB>juS(QiR){nU7?)Q`#J+W&RL6wk* z=(pekWYOnT_-SN)8*WM?`^5{*5-m#57~Yow9bn75S z8HnL+lv5-#RuKDQg0}F<2Aad2Me4Ui6IKC4X!C0fTUDwOXZ4u}m0@?x`*k~>aAD&~ zD0DhkDgO1TFs&i3+Jv-eC2!@S>!zXhTW?2huSVeXcb$+8urPFI>?hd}+2FV$RU0QW zl}#P0oW=vWe*|Lf4^2T^J|EX#pp~L{X>3_p+4gV;I8J5!_&=pmrN^lN3vph`S-dZ% z3VQ0gPbWrrxf@uXJ19F^&wr=!F|jYTOHTf|ZF~s!S2LK!0}R{+K!omMP@tw?T<0|7C7sp_#CBR1GfmByt;j69V$PSCfsjJp!vspo;srN8ewm z@$(-tRF?RE{z2vbY!5K)l$GS6N~ae`WhLI;Q|wCKq%&CPPr{6jYj>vJIlHH0R5g`Q zkr;yKkbpQ@3!-FUr80do=;J7Vlz2YNN4-ouTd#UqN>l(fe*|r&B)Ln{qVHJu%D0 zHkYmQ#^cC?cNzAGTSZwP}AGw>JhnO3#6kS~LQ`!Rsb*d9^zV zypX{OpFlEA7SP8O%^V#xqk#|qgm~&wG(&C=t&IhjweHn!-iUhhpg7%XZ?~d=XOK3v^Mxmolkd zvPH?DmD?H(phCi~qq2D(S{kCxVD_6_2@0*Wnv{Gwol-A^15Z;9!Q=qeEV0zfLpP8r zwB<9IYD3bU0q9<;tn1H$E9fA%fgQvSkS@jB=5nx& zkt7QR4?G6A9$=m^26nHMbW=-me}_%C-VJAftr$=VLeOeHJv^+I0)ni*Oa468OgIUoy+J8?y_Bj0?%tI+d>kvL4P~M}+kCS21a%r_0dz^WFCO8Nw z4R5gNp_fPm*~L^>=ZWMdMz2obLouBVGAN=r=w>ekg}L5QwSO7GrJ{e>P?WPTq;%zS zG~51T?xCs>##=eoNAcIfeQ#9bVU2;mf zrmgn#Z!TAZ%L}c{{5J&#)s(!R~*U*sf&F5EV|zH5MzPkV5Ug(j7~!0<3457aMx0gL4`V0n1jvdtfS zstmxTX5saGfb0jWTtD*VM{>o1_1=e+sT`9fTO4TrL~F8CEaSR}@}JZgieK2AqL;au z1uo~cSstl3devbB7xN6-?7_!!!c-IhB21dEz9ADZTgSY3$F|BG{ey<1nCSzY>&lmq zR=!1s6|Fa?DLO}skxU>r{#AGpw67v$J4HY}rbzKBJ{*$YKLP*aLiPEnjN|H)Sl6%h z5_N_@Z?ScLU#04`UVlDiy10bhTd1NF zDLZ@4_4ecj+v-|OWdu}lKy<)Q7kCZ^SKw^HYvASzY}8^RyDy5>8bLK*$=pJHTwN~R zOGjgG@1_#(gJns|$dU%o;}o&|BkbQstP?B3DB$-Vg~9JUvFBQk6c5XGp0Fo)5F@4Y z{1Td32GjT8E+d7w!HgbbFWR@ghmqTAQyVh9Ck~hB+8)twwz*oi1m(k1IqDIVN&C}E zr2z>gf0$54N>>j3m6H7iZM`JFS1C(Mq^OpLiWml`lU$kS3R$q&#^};`BQVK<*F<8s z47O|ql5|Y$lRXT5y!sz*Agk#}#Xb*#C7Oss)3Vka17}Tgi9bm-W6!DH|B#x#Sly;< z(h=*$R)1g;Hjx&vo=Gv^x*4B_jDISN3o;t(P@hJk1O(@tY*k9LAuU~v}I+GfcY>@o_6bZz@ zn~}fmnzk0vp)!Z$x6pU1J%wE6cr~Bspp}BT#N>BN*viRMV5thS{>$efKhc{7mcYFG zrNERzT!DSC)x$<#mUN$1a;Fu}CnqHtx9otq$*pYjujE3bjP9<-cCUz~7xfsoCr!mP zyO8~_OFvI?mLOA$EE!u_%-p0*vM++s7m)Tmy%YI$!ER zNFW{H*L?rqR?gv*_prX(LsThQyh*yZFn`&oC82K69MrRn2nkFiJTTKVu%q*4)7;~lJ$jknYY&G&}EJ$0I*Um)H&sa=V)N1Fml65ayD z^oD<1Vj$93aT{%ax;(-8SH5PeWQ&5G25S2i?#bE};-K*Li03nOokP{IW}6}7`=r9b z`=Fw9vPexg-!!p-Z+(SVR^|=ln1$BUl*d95>dc*8=#jj#f|cRzulq9H;*a+4_5NLZ zq-+8@k_RszLqfRRdgnJdWTKj$74yadZkkRvrdQA0LhG`3d~i_j^|2!N3;iDU^JHS- zh$T4QXx9MfQP#6Y+SdoFhRO=a1s5UDel5NDZBf`!o+ttoK;FghI1_Rcpl%DSg?>XK z3DN((V2ekQfwNl|;2bOXx|8^ln~*izDv`mCJP@K1GwIzQDK2|%R(|!w(X;& zN+KJl5I;i<&KiW$Bqwn_B9QFi_=5tN2eV#Bq-4wMzV@X&GH){HxVJHF!7r_nXeq{Z zqMNCJrwQ@KN2+82*o5d#!=Exm;9e<*GfIhGlM(8bAB1mX-mMlxiKngGU_y#&j<`4{ zk$k;Oko%hW(%i;{&WyDkQ59d@Q!EXJf|!P@ohcH2FR%%O{9xBL3T=2vFFViK*x&9K zq9C$TV@oM(qtD((hes!>8gY_@Uy7;D8CO(V4f{Z~#Q z?KG(@6$zN8;>LhYU<3jI9`NJ4NnkLpuc)f6b=?~K3QlrWa_K|hns;;4VCFj;15~~x zg?mZliWJ=y3HxzCiEh9DX^O!Fnd-s;v0{#i(){z=(H%z0YTp#rERmAUhZfCFsd0Zh zYWRgwxUH|}PYKpvU}7aj#cuj= zH-FHzfK}Q?L1v-7a!H-e7N=xWA1QNvW!o}Dx6M`|d9okkLera02C5R)eJLZoFu~wK z?+8=}N_cflwtjq=6tnqIV1o0&)x&g_43Lmf&+;#AB~Q#+CI$bji3fI` z&@IN|K=>Qz=}3vQiIbcZZjHNzmMd;=i;O&d`mBK4^34ump8<595<3Wn@ARVgCLM?7 zDnx@RGy~G**>{(~Ovf^`iIEOgnIM5KaIyRP%dqbibm*&$ ze?EEvSk|9}9W~n}pp3Qd5p=cZu<2h@S+`ts9GxeqwC9TWVGdi-1+0T@_EHCb@cxwn z@87;nFca7u$z7V6nP~-X=jN!*D?ueoZ7pOkLLQ8LU49eyYSe0deJfZ4V69gP=0|G$ z153F3yI>65Ft?mdd#I`b^97Y(045g+JY9A7#X@>-)05~Ny-@RcFt=4K0xRPZw0-u3 z;rur_*reXz1X**mHo`dljagOOy7xm*4Rd*s3nOVKMiTtPO-4zc6FpN;j<*voeHRAV z#7KJ0hZ?!u$Lx_i^$JgWjtBV7-8C`rpPk@(8cWH(=b%x^vX#nDm?7@~n)t(U8%os zrCMd2y5O&L$o!}JQqD1BspR#Z+92hWEWUCwAdoLVdNq-X2cc{mATXx#1>>+@-!5;33hY{`7Z-!dvQ zdd)g1!lTB^I#O}`%RfcCWjPf7M3;%Nad1*52b37T+;5+wM3YWCOT=U&h!*wmyW-5} zNeOhtt54%h!h8%|?t>HlP#dSeSNv~L?lvQEFkKqIi-}fN#=a__1YLl2krI*vuqQSb zy}^=P+a%!T=2nsmH$?ccf`hQwCVC|pCAM%KxH;JAtgmYuEYh~CD*NVh;e2ABVwb{! zT6_3a^WPd&IfpqW*Tt(`qonBM?(UDAHJOQefJXfC=tb{&Ep zm=WVtFTa;>QhB3+v&K#DLo@1d$^TicY|@h8sz&@G!|J!oFCt|AJT$QHbs6(oW@+So zXq^Jve>3kZT57D^hv{luAc7UfAhOPE*mcIp;aBbzqL%YEm@mh>)~8*yq+JKVz`-P^ zs>zE&_o6Rtz}@1g9_mwqwk-_7t&D%-J3nKd?6op4bs6%{zvoQq603S;^nG*Q75z|| zNv0@?V!Yzh?ue2ujR>2c^V3o_(kBG)*xmUAPo6?wR^sh_Pd>s_UhF6lB`%J!MyGef zpOe1-8ZBr4V)76?qs8DtYs-R%N_OST3pfvN1>RtwFP@D$o^C&QHJ(Oqht1V~Tsq({ z(5(W+WkT;%hMR2u`#I4u7pSMEy@yu&Vk&rsxbZ$3(Ankm&$47t=|*zkv)I5Sn`!R% z#dRSA8)7A&66DWO<(;NHND1>nF{Ot-(G5TkcrcHDq@G112$&M1BAq9msAP`XT)@ly za|pv#pMFQa)or&E+MZu$dhiwJnde)_-d84X{${X@5aNIT<;vPfJ3!g8Zy2EnWkele z(DTkPcsuG}fBul%3!`~Z#~1jW)O3sYEmNaF#EHrWP3GC-QrJr$QojeEdngD9;i`1i zq^bIiAnH$u0RZ^&)-aPryXyePUWspUKVHdbAXS#fe(S7*Ydam|h9OD>zSI5Yv)GY& z2b$S0&qn;8R*0FMvwZuvTr~4ANB*JQ6p|XtT9TkAb`JUkjLM;GyletID2|_Lk|^Bi z>vQi}s54(O$8qG;>K+Tj1NGy`Eyh~f1WQ;SD-ibzPFQ3#2~1*@e%mIqzDX%Dg0xdW z(g$1qlxBT(A<%4TOl)Y^9kdePxeC-lRDHKhcVRQufAh=QAN9!QRh>X=w6#i(yI?G& zRAqTnr&g1hNOf5IW>^5fh%PTzx5%=5x8tk!OP#=%}g$SHh0izBQ-_tSA_^=KXn)f?j|mPcHS z=XpKNxL@>G1&)EN$QMQf)DxDD=))WtHO(P|XkMZXrB>Q~_aoJWhK1Ud{^{M^CFlS2 zHNi(g?kDom4b9aX5{A%&(uDd4z~Tm?9K32~55O$Y!;u%P!|}h}tVcBBqD5mVq9WrZ z1okD1BOP^pfO|t$u-XaEPhWX+e2z-relkL{kIW;{wHo>yUHnsLx$e{VcL~0p}yhI z4v#gpOGt8E@m+)Nn;k`QvOo=ESoUW`{M*}{>C@@SK~d+Bn9I%8r{Pl1``RqS&1n>` zOw1XYgEq|h5g0M^?~)(@F_w+tVlmEBf~biLd!gaPTss@RH+OlrCYX2s`;C#xK47}G z+-DHpYJVu~6b0k*KGpv&r2r~p9(Tw0lbBQ@h?6#oj&2x!ob~T<(%`9c?#D5YvxIKM*>wrj+UW8;(B)}MFiSI_7T^iHm(9J%oa{-2kVbx zWH?5~L{s<5t^1;A+_cTfm3Nsj_f~AUKip&wa$DM}U;VOJ{v`VDr79O_2+p~YkXEI@ z=^0fl_1OVXI{agjcPJYuH0`(dkSbbS$a<7}TEFr{=)MU-)MYXC>%tTto#T#7iO~-w ziToPAfumt&^4^D-$FN4T) zyZHP8Q`Yqt2Z>@|@N(*=Z1KfBBpMj=XW#^C5MJA4j&o3CLZ21P6VwY=BVH!PiO-f9 zI7X-||IL4M2~=AFP<{DlnQH zUz-XX62_>8QxOh*40K+Ew5$e=TE?HIvT_;*{QY`@)9QxLX!dMCf&heT_c+gM(E(IZ zwGKX_ol_D6TA8gKvlrRV`W`hdVJiC84R$+PfCFsxGHalY2XTMlQ#Hl);cI0}7N>kr zHH-uPx8o)Z
CJqG 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 = { "logs.filter.surface.codex": "Codex", "logs.filter.surface.grok": "Grok", "logs.filter.interceptedHelpersOnly": "Nur abgefangene Helfer", - "logs.badge.interceptedHelper": "Abgefangener Helfer · {model}", + "logs.badge.interceptedHelper": "I · {model}", + "logs.badge.interceptedHelperTitle": "Abgefangene Helfer-Anfrage", "logs.filter.conversation.label": "Konversation", "logs.filter.conversation.placeholder": "Konversations-ID einfügen", "logs.filter.conversation.clear": "Löschen", diff --git a/gui/src/i18n/en.ts b/gui/src/i18n/en.ts index 46a0e6fcc6..87892599ce 100644 --- a/gui/src/i18n/en.ts +++ b/gui/src/i18n/en.ts @@ -672,7 +672,8 @@ export const en = { "logs.filter.surface.codex": "Codex", "logs.filter.surface.grok": "Grok", "logs.filter.interceptedHelpersOnly": "Intercepted helpers only", - "logs.badge.interceptedHelper": "Intercepted helper · {model}", + "logs.badge.interceptedHelper": "I · {model}", + "logs.badge.interceptedHelperTitle": "Intercepted helper request", "logs.filter.conversation.label": "Conversation", "logs.filter.conversation.placeholder": "Paste conversation id", "logs.filter.conversation.clear": "Clear", diff --git a/gui/src/i18n/fr.ts b/gui/src/i18n/fr.ts index dea8476cc2..4da3bc33f1 100644 --- a/gui/src/i18n/fr.ts +++ b/gui/src/i18n/fr.ts @@ -653,7 +653,8 @@ export const fr: Record = { "logs.filter.surface.codex": "Codex", "logs.filter.surface.grok": "Grok", "logs.filter.interceptedHelpersOnly": "Assistants interceptés uniquement", - "logs.badge.interceptedHelper": "Assistant intercepté · {model}", + "logs.badge.interceptedHelper": "I · {model}", + "logs.badge.interceptedHelperTitle": "Requête d'assistant interceptée", "logs.filter.conversation.label": "Conversation", "logs.filter.conversation.placeholder": "Coller l’ID de conversation", "logs.filter.conversation.clear": "Effacer", diff --git a/gui/src/i18n/ja.ts b/gui/src/i18n/ja.ts index 8c1c22fa7a..a65cc76d6b 100644 --- a/gui/src/i18n/ja.ts +++ b/gui/src/i18n/ja.ts @@ -615,7 +615,8 @@ export const ja: Record = { "logs.filter.surface.codex": "Codex", "logs.filter.surface.grok": "Grok", "logs.filter.interceptedHelpersOnly": "インターセプトされたヘルパーのみ", - "logs.badge.interceptedHelper": "インターセプト済みヘルパー · {model}", + "logs.badge.interceptedHelper": "I · {model}", + "logs.badge.interceptedHelperTitle": "インターセプトされたヘルパー要求", "logs.filter.conversation.label": "会話", "logs.filter.conversation.placeholder": "会話 ID を貼り付け", "logs.filter.conversation.clear": "クリア", diff --git a/gui/src/i18n/ko.ts b/gui/src/i18n/ko.ts index 0547ca5524..ba19d179e8 100644 --- a/gui/src/i18n/ko.ts +++ b/gui/src/i18n/ko.ts @@ -658,7 +658,8 @@ export const ko: Record = { "logs.filter.surface.codex": "Codex", "logs.filter.surface.grok": "Grok", "logs.filter.interceptedHelpersOnly": "가로챈 헬퍼만", - "logs.badge.interceptedHelper": "가로챈 헬퍼 · {model}", + "logs.badge.interceptedHelper": "I · {model}", + "logs.badge.interceptedHelperTitle": "가로챈 헬퍼 요청", "logs.filter.conversation.label": "대화", "logs.filter.conversation.placeholder": "대화 ID 붙여넣기", "logs.filter.conversation.clear": "지우기", diff --git a/gui/src/i18n/ru.ts b/gui/src/i18n/ru.ts index e765961261..f41af16d00 100644 --- a/gui/src/i18n/ru.ts +++ b/gui/src/i18n/ru.ts @@ -656,7 +656,8 @@ export const ru: Record = { "logs.filter.surface.codex": "Codex", "logs.filter.surface.grok": "Grok", "logs.filter.interceptedHelpersOnly": "Только перехваченные помощники", - "logs.badge.interceptedHelper": "Перехваченный помощник · {model}", + "logs.badge.interceptedHelper": "I · {model}", + "logs.badge.interceptedHelperTitle": "Перехваченный запрос помощника", "logs.filter.conversation.label": "Диалог", "logs.filter.conversation.placeholder": "Вставьте ID диалога", "logs.filter.conversation.clear": "Сбросить", diff --git a/gui/src/i18n/tr.ts b/gui/src/i18n/tr.ts index 52a4f194d1..101dc684c4 100644 --- a/gui/src/i18n/tr.ts +++ b/gui/src/i18n/tr.ts @@ -663,7 +663,8 @@ export const tr: Record = { "logs.filter.surface.codex": "Codex", "logs.filter.surface.grok": "Grok", "logs.filter.interceptedHelpersOnly": "Yalnizca yakalanan yardimcilar", - "logs.badge.interceptedHelper": "Yakalanan yardimci · {model}", + "logs.badge.interceptedHelper": "I · {model}", + "logs.badge.interceptedHelperTitle": "Yakalanan yardimci istegi", "logs.filter.conversation.label": "Sohbet", "logs.filter.conversation.placeholder": "Sohbet ID'sini yapıştırın", "logs.filter.conversation.clear": "Temizle", diff --git a/gui/src/i18n/zh-TW.ts b/gui/src/i18n/zh-TW.ts index 9d3eccb28b..89b891d603 100644 --- a/gui/src/i18n/zh-TW.ts +++ b/gui/src/i18n/zh-TW.ts @@ -510,7 +510,8 @@ export const zhTW: Record = { "logs.filter.surface.codex": "Codex", "logs.filter.surface.grok": "Grok", "logs.filter.interceptedHelpersOnly": "僅已攔截的輔助請求", - "logs.badge.interceptedHelper": "已攔截輔助請求 · {model}", + "logs.badge.interceptedHelper": "I · {model}", + "logs.badge.interceptedHelperTitle": "已攔截的輔助請求", "logs.filter.conversation.label": "對話", "logs.filter.conversation.placeholder": "貼上對話 ID", "logs.filter.conversation.clear": "清除", diff --git a/gui/src/i18n/zh.ts b/gui/src/i18n/zh.ts index d404893e21..c5d588efa0 100644 --- a/gui/src/i18n/zh.ts +++ b/gui/src/i18n/zh.ts @@ -651,7 +651,8 @@ export const zh: Record = { "logs.filter.surface.codex": "Codex", "logs.filter.surface.grok": "Grok", "logs.filter.interceptedHelpersOnly": "仅已拦截的辅助请求", - "logs.badge.interceptedHelper": "已拦截辅助请求 · {model}", + "logs.badge.interceptedHelper": "I · {model}", + "logs.badge.interceptedHelperTitle": "已拦截的辅助请求", "logs.filter.conversation.label": "会话", "logs.filter.conversation.placeholder": "粘贴会话 ID", "logs.filter.conversation.clear": "清除", diff --git a/gui/src/pages/Logs.tsx b/gui/src/pages/Logs.tsx index 129ce95301..4ec0aede31 100644 --- a/gui/src/pages/Logs.tsx +++ b/gui/src/pages/Logs.tsx @@ -746,7 +746,11 @@ export default function Logs({ apiBase }: { apiBase: string }) { {modelLabel(log.resolvedModel ?? log.model)} {log.shadowCallRewrittenFrom && ( - + {t("logs.badge.interceptedHelper", { model: log.shadowCallRewrittenFrom })} )} diff --git a/gui/tests/logs-auto-refresh.test.tsx b/gui/tests/logs-auto-refresh.test.tsx index c59f0af4f5..b6be14db1f 100644 --- a/gui/tests/logs-auto-refresh.test.tsx +++ b/gui/tests/logs-auto-refresh.test.tsx @@ -505,7 +505,7 @@ test("Logs: an intercepted helper row is badged and filterable", async () => { await flushMicrotasks(); // The badge names the ORIGINAL helper model, which is the attribution that was being lost. - expect(container.textContent).toContain("Intercepted helper · gpt-5.6-luna"); + expect(container.textContent).toContain("I · gpt-5.6-luna"); expect(container.textContent).toContain("gpt-test"); const toggle = [...container.querySelectorAll("input[type=checkbox]")].find( @@ -520,7 +520,7 @@ test("Logs: an intercepted helper row is badged and filterable", async () => { }); // Filtered: the marked row stays, the ordinary one goes. - expect(container.textContent).toContain("Intercepted helper · gpt-5.6-luna"); + expect(container.textContent).toContain("I · gpt-5.6-luna"); expect(container.textContent).not.toContain("gpt-test"); await act(async () => { toggle!.click(); }); From 85fbf9a3c55addfd46528a2e89f5c09d6d175eb5 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 15:06:05 +0900 Subject: [PATCH 82/88] fix(openai-chat): heartbeat while buffering tool-call deltas Tool-call deltas are buffered until a terminal signal, so this adapter can consume upstream frames for a long time while yielding nothing. The Responses bridge arms its stall watchdog on ADAPTER activity, not socket activity, so a model streaming a large argument payload was indistinguishable from a hung upstream and could have its turn aborted while it was progressing normally. Found while investigating #2156. It is not the reported error -- that one is the EOF fail-closed guard, and the guard is correct: a stream that ends mid tool call with neither finish_reason nor [DONE] may have truncated the arguments, and promoting them would execute a partial call. But the silent buffering phase is our own hazard and it is worth closing on its own. A heartbeat is invisible downstream: the bridge consumes it to re-arm the watchdog and emits nothing. The Cursor, Anthropic, Google, and Kiro adapters already use exactly this for their own silent phases. The two test collectors now drop heartbeats, which keeps their assertions about the wire the client actually sees. --- src/adapters/openai-chat.ts | 10 ++++++++++ tests/openai-chat-eof.test.ts | 5 ++++- tests/openai-chat-hardening.test.ts | 30 ++++++++++++++++++++++++++++- 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/src/adapters/openai-chat.ts b/src/adapters/openai-chat.ts index a637747cef..00a2ecf760 100644 --- a/src/adapters/openai-chat.ts +++ b/src/adapters/openai-chat.ts @@ -1743,6 +1743,16 @@ export function createOpenAIChatAdapter(provider: OcxProviderConfig): ProviderAd if (idDelta && !call.id) call.id = idDelta; if (typeof rawName === "string" && rawName && !call.name) call.name = rawName; if (typeof rawArguments === "string") call.sawArgumentsString = true; + // Tool-call deltas are BUFFERED until a terminal signal, so this adapter can + // consume upstream frames for a long time while yielding nothing. The Responses + // bridge reads adapter activity, not socket activity, so a model that streams a + // large argument payload looks identical to a hung upstream and the stall + // watchdog can abort a turn that was progressing normally (#2156). + // + // A heartbeat is invisible downstream — the bridge consumes it to re-arm the + // watchdog and emits nothing — which is the same remedy the Cursor, Anthropic, + // Google, and Kiro adapters already use for their own silent phases. + yield { type: "heartbeat" }; if (typeof rawArguments === "string" && rawArguments) { const previousBytes = call.argsBytes; const nextBytes = previousBytes + budgetEncoder.encode(rawArguments).byteLength; diff --git a/tests/openai-chat-eof.test.ts b/tests/openai-chat-eof.test.ts index f87ff4c89f..66eb211b71 100644 --- a/tests/openai-chat-eof.test.ts +++ b/tests/openai-chat-eof.test.ts @@ -11,7 +11,10 @@ const provider = { adapter: "openai-chat", baseUrl: "https://example.test/v1", a async function collect(gen: AsyncGenerator): Promise { const out: AdapterEvent[] = []; - for await (const e of gen) out.push(e); + // Heartbeats are invisible downstream: the bridge consumes them to re-arm its stall + // watchdog and emits nothing. Dropping them here keeps these assertions about the wire + // the client actually sees (#2156). + for await (const e of gen) if (e.type !== "heartbeat") out.push(e); return out; } diff --git a/tests/openai-chat-hardening.test.ts b/tests/openai-chat-hardening.test.ts index 81671b0968..20adc0cc53 100644 --- a/tests/openai-chat-hardening.test.ts +++ b/tests/openai-chat-hardening.test.ts @@ -40,7 +40,10 @@ function provider(overrides: Partial = {}): OcxProviderConfig async function collect(stream: AsyncGenerator): Promise { const events: AdapterEvent[] = []; - for await (const event of stream) events.push(event); + // Heartbeats are invisible downstream: the bridge consumes them to re-arm its stall + // watchdog and emits nothing. Dropping them here keeps these assertions about the wire + // the client actually sees (#2156). + for await (const event of stream) if (event.type !== "heartbeat") events.push(event); return events; } @@ -920,4 +923,29 @@ describe("openai-chat response_format emission", () => { .toEqual({ type: "json_object" }); }); }); + +// #2156: tool-call deltas are BUFFERED until a terminal signal, so this adapter can consume +// upstream frames for a long time while yielding nothing downstream. The Responses bridge +// arms its stall watchdog on ADAPTER activity, not socket activity, so a model streaming a +// large argument payload was indistinguishable from a hung upstream. +test("tool-call deltas emit heartbeats so a long buffering phase is not read as a stall", async () => { + const adapter = createOpenAIChatAdapter(provider()); + const frames = ['data: ' + JSON.stringify({ choices: [{ delta: { tool_calls: [{ index: 0, id: "call_a", function: { name: "shell", arguments: "" } }] } }] }) + '\n\n']; + // Many argument chunks and nothing else: exactly the shape that looked like silence. + for (let i = 0; i < 12; i += 1) { + frames.push('data: ' + JSON.stringify({ choices: [{ delta: { tool_calls: [{ index: 0, function: { arguments: '"x"' } }] } }] }) + '\n\n'); + } + frames.push('data: {"choices":[{"delta":{},"finish_reason":"tool_calls"}]}\n\n', "data: [DONE]\n\n"); + + const raw: AdapterEvent[] = []; + for await (const event of adapter.parseStream(new Response(frames.join("")))) raw.push(event); + + // One per consumed tool-call delta: the watchdog sees activity for the whole phase. + expect(raw.filter(e => e.type === "heartbeat").length).toBeGreaterThanOrEqual(12); + // And the client-visible wire is unchanged -- a heartbeat is consumed by the bridge. + const visible = raw.filter(e => e.type !== "heartbeat"); + expect(visible.some(e => e.type === "error")).toBe(false); + expect(visible).toContainEqual({ type: "tool_call_start", id: "call_a", name: "shell" }); + expect(visible.at(-1)).toMatchObject({ type: "done" }); +}); }); From 9a9349739fd877b667b27ec6ca04e7ab7ba51c17 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 15:13:47 +0900 Subject: [PATCH 83/88] fix(responses): do not retain adapter heartbeats in the terminal guard A heartbeat is adapter liveness, not turn content. guardTerminalEventStream pushed every nonterminal event into `seen`, and `seen` feeds both the continuation analysis and the rebuilt request. The openai-chat adapter now emits one heartbeat per tool-call delta, so a single large argument payload could grow that array without bound on a provider with terminalContinuationGuard enabled. The empty-completion guard already passes heartbeats through unretained; this matches it. They still reach the consumer, because the bridge needs them to re-arm its stall watchdog. Also corrects the attribution on the heartbeat itself. It was described as fixing #2156, and it does not: the reporter's error is emitted after the adapter reads EOF with pending tool calls, while a stall timeout produces response.incomplete with reason upstream_stall_timeout on a path the bridge has already closed. The heartbeat fixes a real false-stall hazard; #2156 needs the reporter's raw SSE comparison before anyone can say what closed that stream. --- src/server/responses/terminal-guard.ts | 10 ++++++ tests/terminal-guard.test.ts | 48 ++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/src/server/responses/terminal-guard.ts b/src/server/responses/terminal-guard.ts index 22865c7274..347a489f19 100644 --- a/src/server/responses/terminal-guard.ts +++ b/src/server/responses/terminal-guard.ts @@ -193,6 +193,16 @@ export async function* guardTerminalEventStream(options: GuardedEventStreamOptio const seen: AdapterEvent[] = []; let terminalSeen = false; for await (const event of source) { + // A heartbeat is adapter liveness, not turn content: it exists so the bridge watchdog + // can tell a buffering adapter from a hung one. Retaining it here would put an + // unbounded number of empty markers into `seen`, which feeds both the continuation + // analysis and the rebuilt request — and the openai-chat adapter now emits one per + // tool-call delta, so a long argument payload alone could grow this array without + // limit. The empty-completion guard already passes them through unretained; match it. + if (event.type === "heartbeat") { + yield event; + continue; + } if (event.type === "done") { terminalSeen = true; const analysis = (options.adapterName === "anthropic" || options.adapterName === "openai-chat") diff --git a/tests/terminal-guard.test.ts b/tests/terminal-guard.test.ts index 9fe5b68d4d..906c726997 100644 --- a/tests/terminal-guard.test.ts +++ b/tests/terminal-guard.test.ts @@ -188,6 +188,54 @@ describe("terminal guard", () => { expect(actual.at(-1)).toMatchObject({ usage: { inputTokens: 30, outputTokens: 5, totalTokens: 35 } }); }); + + // A heartbeat is adapter liveness, not turn content. The openai-chat adapter emits one per + // tool-call delta while it buffers, so retaining them here would let a single large argument + // payload grow `seen` without bound — and `seen` is what both the continuation analysis and + // the rebuilt request read. Passing them through unretained is what the empty-completion + // guard already does. + // A heartbeat is adapter liveness, not turn content. The openai-chat adapter emits one per + // tool-call delta while it buffers, so retaining them would grow the guard's record without + // bound on a large argument payload. `analyzeTerminalTurn` and `buildContinuationRequest` + // both read that record, so pin the contract on the pure functions that consume it plus the + // observable passthrough. + test("a retained heartbeat would corrupt the continuation record", () => { + const clean: AdapterEvent[] = [ + { type: "text_delta", text: "我接下来会修改相关文件。" }, + ]; + const padded: AdapterEvent[] = [ + { type: "text_delta", text: "我接下来会修改相关文件。" }, + ...Array.from({ length: 50 }, () => ({ type: "heartbeat" }) as AdapterEvent), + ]; + const request = parsed("继续检查"); + // The guard must not let liveness markers change what the continuation decides or sends. + expect(analyzeTerminalTurn(request, padded).assistantText) + .toBe(analyzeTerminalTurn(request, clean).assistantText); + expect(JSON.stringify(buildContinuationRequest(request, padded).context.messages)) + .toBe(JSON.stringify(buildContinuationRequest(request, clean).context.messages)); + }); + + test("heartbeats reach the consumer so the bridge watchdog stays armed", async () => { + const actual: AdapterEvent[] = []; + for await (const event of guardTerminalEventStream({ + parsed: parsed("继续检查"), + firstEvents: (async function* () { + yield { type: "text_delta", text: "我接下来会修改相关文件。" } as AdapterEvent; + for (let i = 0; i < 50; i++) yield { type: "heartbeat" } as AdapterEvent; + yield { type: "tool_call_start", id: "call_1", name: "exec_command" } as AdapterEvent; + yield { type: "tool_call_end" } as AdapterEvent; + yield { type: "done", usage: { inputTokens: 10, outputTokens: 2 } } as AdapterEvent; + })(), + continuation: () => (async function* () { + yield { type: "done" } as AdapterEvent; + })(), + adapterName: "openai-chat", + })) actual.push(event); + + expect(actual.filter(event => event.type === "heartbeat")).toHaveLength(50); + expect(actual.filter(event => event.type === "done")).toHaveLength(1); + }); + test("stops after the configured continuation bound", async () => { let continuations = 0; const actual: AdapterEvent[] = []; From 2a8b81e79779e5c6879a0baf28e5e66f8b1ea1bc Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 15:14:19 +0900 Subject: [PATCH 84/88] docs(openai-chat): stop attributing the heartbeat to #2156 --- src/adapters/openai-chat.ts | 7 ++++++- tests/openai-chat-hardening.test.ts | 14 +++++++++----- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/adapters/openai-chat.ts b/src/adapters/openai-chat.ts index 00a2ecf760..80eacb0c1e 100644 --- a/src/adapters/openai-chat.ts +++ b/src/adapters/openai-chat.ts @@ -1747,7 +1747,12 @@ export function createOpenAIChatAdapter(provider: OcxProviderConfig): ProviderAd // consume upstream frames for a long time while yielding nothing. The Responses // bridge reads adapter activity, not socket activity, so a model that streams a // large argument payload looks identical to a hung upstream and the stall - // watchdog can abort a turn that was progressing normally (#2156). + // watchdog can abort a turn that was progressing normally. + // + // Found while investigating #2156, but it is NOT that bug: a stall abort emits + // `response.incomplete` with `upstream_stall_timeout` from the bridge, whereas + // that report shows the adapter's own end-of-stream error after `reader.read()` + // returned EOF with tool calls still pending. Different path, different frame. // // A heartbeat is invisible downstream — the bridge consumes it to re-arm the // watchdog and emits nothing — which is the same remedy the Cursor, Anthropic, diff --git a/tests/openai-chat-hardening.test.ts b/tests/openai-chat-hardening.test.ts index 20adc0cc53..e3ead6e28d 100644 --- a/tests/openai-chat-hardening.test.ts +++ b/tests/openai-chat-hardening.test.ts @@ -42,7 +42,7 @@ async function collect(stream: AsyncGenerator): Promise { }); }); -// #2156: tool-call deltas are BUFFERED until a terminal signal, so this adapter can consume -// upstream frames for a long time while yielding nothing downstream. The Responses bridge -// arms its stall watchdog on ADAPTER activity, not socket activity, so a model streaming a -// large argument payload was indistinguishable from a hung upstream. +// Tool-call deltas are BUFFERED until a terminal signal, so this adapter can consume upstream +// frames for a long time while yielding nothing downstream. The Responses bridge arms its +// stall watchdog on ADAPTER activity, not socket activity, so a model streaming a large +// argument payload was indistinguishable from a hung upstream. +// +// Found while investigating #2156 but deliberately NOT claimed as its fix: a stall abort +// emits `response.incomplete` with `upstream_stall_timeout`, while that report shows the +// adapter's own EOF error with tool calls still pending. This pins the mechanism only. test("tool-call deltas emit heartbeats so a long buffering phase is not read as a stall", async () => { const adapter = createOpenAIChatAdapter(provider()); const frames = ['data: ' + JSON.stringify({ choices: [{ delta: { tool_calls: [{ index: 0, id: "call_a", function: { name: "shell", arguments: "" } }] } }] }) + '\n\n']; From d28213d27bfad5b15af908360d74e6cc50a33784 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 15:20:35 +0900 Subject: [PATCH 85/88] test(i18n): allow the intercepted-helper badge to stay English MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The badge is "I · " -- a one-glyph marker plus a model id, sitting inside a narrow table column. The glyph is an icon-shaped affordance, not a word, and its meaning is carried by the tooltip (logs.badge.interceptedHelperTitle), which every locale does translate. Localizing the glyph per locale would make the same badge unrecognizable across a screenshot or a bug report while adding nothing to comprehension, so it joins models.shadowCallOriginal on both intentional-English allowlists rather than being translated. The parity tests were right to flag it; English is the intended rendering, which is exactly what those allowlists exist to record. --- gui/tests/fr-localization.test.ts | 3 +++ gui/tests/locale-parity.test.ts | 6 ++++++ 2 files changed, 9 insertions(+) diff --git a/gui/tests/fr-localization.test.ts b/gui/tests/fr-localization.test.ts index a510c5d77a..4ef424f15b 100644 --- a/gui/tests/fr-localization.test.ts +++ b/gui/tests/fr-localization.test.ts @@ -47,6 +47,9 @@ const INTENTIONAL_ENGLISH = new Set([ "dash.updateVersionTransition", "prov.accountId", "models.shadowCallOriginal", + // One-glyph marker plus a model id in a narrow column; the meaning lives in the translated + // tooltip (`logs.badge.interceptedHelperTitle`), not in the glyph. + "logs.badge.interceptedHelper", "models.v2Mode_v1", "models.v2Mode_default", "models.v2Mode_v2", diff --git a/gui/tests/locale-parity.test.ts b/gui/tests/locale-parity.test.ts index ac0da1949c..700e292096 100644 --- a/gui/tests/locale-parity.test.ts +++ b/gui/tests/locale-parity.test.ts @@ -124,6 +124,12 @@ const ZH_TW_KEEP_ENGLISH: ReadonlySet = new Set([ "routing.analyticsP99", // Format template with placeholder only; other locales (zh/ja/ko) keep it identical to en "models.shadowCallOriginal", + // A one-glyph marker plus the model id, sitting inside a narrow table column. The glyph is + // an icon-shaped affordance rather than a word, and its meaning is carried by the tooltip + // (`logs.badge.interceptedHelperTitle`), which IS translated. Localizing the glyph per + // locale would make the same badge unrecognizable across a screenshot or a bug report for + // no gain in comprehension. + "logs.badge.interceptedHelper", "models.v2Mode_default", "models.v2Mode_v1", "models.v2Mode_v2", From 8f04c9a526b3542e71141139f58419485e09946b Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 14:52:39 +0900 Subject: [PATCH 86/88] fix(ci): give the Windows leg the budgets and the crash retry it never had Six shard failures in three groups (#2152). None came from main..dev; all three needed a different answer, and none of them was skipping a test that can actually run. Group 1, budgets. watchdogMs is a FLOOR, not a multiplier, so a case calling watchdogMs(30_000) still got exactly 30s -- 'Restore truth' failed at 30,147ms. Windows CI now floors at 45s, under the lane's own 60s per-test timeout so a hung test stays bounded. 'A-reduced' was misread in the issue: its 79,978ms was elapsed time against a 150s ceiling, so the outer budget was never the constraint. The real failure was Fixture.request's unscaled 10s AbortSignal, which aborted the case from inside. It is scaled now like every neighbouring budget. 'E' does not start ocx at all. Its lock holder released after a fixed 3s busy wait, and on a Windows shard the contender's process spawn can outlast that -- the parent then sees 'acquired' where it demands 'busy', which reads as a broken exclusion invariant rather than a hold that expired early. The release-marker handshake still ends the hold early everywhere else; only the ceiling moved. Group 2, skip guard. The issue says an unprivileged Windows user cannot create symlinks, but the GitHub runner can -- so canSymlink was true, the cases ran, and they failed on how the preflight reads mode and access through a Windows symlink. Two neighbouring cases in the same file already skip on process.platform === "win32"; these three now use that same guard, and keep the capability check for unprivileged POSIX. Group 3, crash retry. A Bun panic is a crash in the interpreter, not a test result. The macOS leg has carried a crash-signature retry for this; the Windows shards, a separate matrix job with their own one-shot command, had none. They now use the same wrapper, extended with panic(thread since that is the signature this leg actually printed. An assertion failure returns its status immediately and is never retried. What this cannot prove locally: whether 45s is sufficient under real Windows shard contention, the actual skip result on the runner, and PIPESTATUS behavior in Git Bash. Those need a Windows CI dispatch, which is the evidence to look for on this PR. --- .github/workflows/ci.yml | 26 +++++++++++++++++++++++- tests/codex-composed-acceptance.test.ts | 19 +++++++++++++++-- tests/helpers/ci-watchdog.ts | 9 +++++++- tests/helpers/codex-write-lock-child.ts | 8 +++++++- tests/update-npm-cache-preflight.test.ts | 20 +++++++++++++++--- 5 files changed, 74 insertions(+), 8 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 02344a0aa2..5872136ecf 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -611,7 +611,31 @@ jobs: # the only one left on Bun's 5s default, and it is the slowest hardware on the board. # Three of its failures were the default firing on tests that had not hung — the # composed-acceptance cases spawn a real `ocx start` and were still working at 41s. - run: bun test --isolate --timeout 60000 tests --shard=${{ matrix.shard }}/4 + # + # The retry is the same one the macOS leg already carries, for the same reason: a Bun + # runtime panic is a crash in the interpreter, not a test result, and failing the shard + # on it reports a defect this repository does not have (#2152). An ordinary assertion + # failure returns its status immediately — only the crash signatures below are retried, + # and only once, so a genuinely broken build cannot be retried into green. + shell: bash + run: | + set +e + set -uo pipefail + suite_log="$(mktemp -t ocx-windows-suite.XXXXXX)" + for attempt in 1 2; do + bun test --isolate --timeout 60000 tests --shard=${{ matrix.shard }}/4 2>&1 | tee "$suite_log" + suite_status="${PIPESTATUS[0]}" + if [ "$suite_status" -eq 0 ]; then + exit 0 + fi + if ! grep -Eqi 'oh no: Bun has crashed|Segmentation fault at address|Illegal instruction|Bus error|panic\(thread' "$suite_log"; then + echo "::error::Windows shard ${{ matrix.shard }}/4 failed on attempt ${attempt} (exit ${suite_status}); assertion failures are not retried." + exit "$suite_status" + fi + echo "::warning::Bun runtime crash in Windows shard ${{ matrix.shard }}/4 (exit ${suite_status}, attempt ${attempt})." + done + echo "::error::Bun runtime crash repeated on Windows shard ${{ matrix.shard }}/4; failing after one retry." + exit 1 - name: CLI help smoke run: bun run src/cli/index.ts help diff --git a/tests/codex-composed-acceptance.test.ts b/tests/codex-composed-acceptance.test.ts index ded130e17e..29950f68b1 100644 --- a/tests/codex-composed-acceptance.test.ts +++ b/tests/codex-composed-acceptance.test.ts @@ -266,7 +266,11 @@ class Fixture { runtime: RuntimeRecord, path: string, init: RequestInit = {}, - timeoutMs = 10_000, + // Scaled like every other budget in this file. This one was left unscaled, and it is what + // actually failed `A-reduced` on Windows: the case has a 150 s ceiling and reported ~80 s + // elapsed, so the outer budget was never the constraint — a single request hit this fixed + // 10 s AbortSignal and aborted the case from inside (#2152). + timeoutMs = watchdogMs(10_000), ): Promise<{ status: number; body: Record }> { const response = await fetch(`http://127.0.0.1:${runtime.port}${path}`, { ...init, @@ -619,7 +623,18 @@ describe("WP13 composed toggle acceptance", () => { const release = join(fx.root, "release"); const holder = Bun.spawn([process.execPath, lockChildPath], { cwd: repoRoot, - env: { ...fx.env(fx.homeA, fx.userprofileA), OCX_LOCK_CHILD_PAYLOAD: JSON.stringify({ timeoutMs: 5_000, holdMarker: held, releaseMarker: release }) }, + // The hold has to outlast the contender's process spawn, which is the slow part on a + // Windows shard. The release marker below still ends it early everywhere else, so this + // is a ceiling rather than a sleep the test pays for. + env: { + ...fx.env(fx.homeA, fx.userprofileA), + OCX_LOCK_CHILD_PAYLOAD: JSON.stringify({ + timeoutMs: 5_000, + holdMarker: held, + releaseMarker: release, + holdMs: watchdogMs(3_000), + }), + }, stdout: "pipe", stderr: "pipe", }); fx.children.push(holder); diff --git a/tests/helpers/ci-watchdog.ts b/tests/helpers/ci-watchdog.ts index f09713dc98..a794d7fe3e 100644 --- a/tests/helpers/ci-watchdog.ts +++ b/tests/helpers/ci-watchdog.ts @@ -11,7 +11,14 @@ * hung test, not to assert latency. Local behaviour is unchanged. Bun's own * per-test timeout (`--timeout`, 60 s on CI) would pre-empt a 30 s watchdog, * so the lane timeout and this floor move together. + * + * Windows needs a higher floor still. Its shards run four Bun pools on one runner, and process + * spawn there is slower than on the POSIX lanes to begin with — a `ocx restore --json` child + * that finishes comfortably elsewhere was observed failing the 30 s floor at 30,147 ms (#2152). + * 45 s keeps the watchdog meaningful while staying under the lane's own 60 s per-test timeout, + * so a genuinely hung test is still bounded by something rather than running to the ceiling. */ export function watchdogMs(base: number): number { - return process.env.CI === "true" ? Math.max(base, 30_000) : base; + if (process.env.CI !== "true") return base; + return Math.max(base, process.platform === "win32" ? 45_000 : 30_000); } diff --git a/tests/helpers/codex-write-lock-child.ts b/tests/helpers/codex-write-lock-child.ts index be61dc84be..0ab0549f99 100644 --- a/tests/helpers/codex-write-lock-child.ts +++ b/tests/helpers/codex-write-lock-child.ts @@ -17,6 +17,7 @@ const payload = JSON.parse(process.env.OCX_LOCK_CHILD_PAYLOAD ?? "{}") as { timeoutMs?: number; holdMarker?: string; releaseMarker?: string; + holdMs?: number; }; const admitted = { authoritySnapshotId: "authority-child" } as AdmissionSnapshot; @@ -40,7 +41,12 @@ const result = await withCodexWriteLock( // an unheld lock and saw `acquired` where the test demands `busy`, which // reads exactly like a broken exclusion invariant rather than a late marker. writeFileSync(payload.holdMarker, "held"); - const until = Date.now() + 3_000; + // The release marker is the real signal; this is only the ceiling for how long we wait + // to see it. Three seconds was enough where the contender starts quickly, but on a + // Windows shard the contender's process spawn can outlast the hold — the holder then + // releases first and the parent sees `acquired` where it demands `busy`, which reads as + // a broken exclusion invariant rather than as a hold that expired too early (#2152). + const until = Date.now() + (payload.holdMs ?? 3_000); while (Date.now() < until) { if (payload.releaseMarker && Bun.file(payload.releaseMarker).size > 0) break; } diff --git a/tests/update-npm-cache-preflight.test.ts b/tests/update-npm-cache-preflight.test.ts index 520c0d6b6a..e22d72cfee 100644 --- a/tests/update-npm-cache-preflight.test.ts +++ b/tests/update-npm-cache-preflight.test.ts @@ -27,6 +27,20 @@ const canSymlink = (() => { } })(); +/** + * Windows needs its own guard, separate from `canSymlink`. + * + * The capability probe answers "may this user create a symlink", and on a GitHub-hosted + * Windows runner the answer is YES — so these cases ran and then failed in the fixture with + * `cache_entry_inaccessible`, because what actually differs there is how the preflight reads + * mode and access through a Windows symlink, not whether the link can be made (#2152). + * + * Two neighbouring cases in this file already skip on `process.platform === "win32"` for the + * same reason, so this reuses that guard rather than inventing a second mechanism. The + * capability check stays: an unprivileged POSIX-like environment still skips honestly. + */ +const WINDOWS = process.platform === "win32"; + function tempRoot(name: string): string { const root = join(tmpdir(), `ocx-cache-preflight-${name}-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}`); mkdirSync(root, { recursive: true }); @@ -67,7 +81,7 @@ describe("npm cache access pre-flight", () => { } }); - test.skipIf(!canSymlink)("lstats normal nested symlinks but never traverses their targets", () => { + test.skipIf(WINDOWS || !canSymlink)("lstats normal nested symlinks but never traverses their targets", () => { const cache = tempRoot("symlink-cache"); const missingTarget = join(tempRoot("symlink-target"), "does-not-exist"); const npx = join(cache, "_npx"); @@ -79,7 +93,7 @@ describe("npm cache access pre-flight", () => { expect(inspectNpmCacheDirectory(cache)).toEqual({ ok: true, reason: "cache_accessible" }); }); - test.skipIf(!canSymlink)("a foreign-owned nested symlink does not block the update", () => { + test.skipIf(WINDOWS || !canSymlink)("a foreign-owned nested symlink does not block the update", () => { // The distinction that decides whether this feature is usable. A real npm cache is full of // symlinks below _npx/node_modules/.bin, and their owner is irrelevant because we never // follow them. Rejecting on ownership before skipping the link would abort updates for @@ -164,7 +178,7 @@ describe("npm cache access pre-flight", () => { })).toEqual({ ok: false, reason: "worker_output_malformed" }); }); - test.skipIf(!canSymlink)("a cache root symlinked to another volume is inspected, not rejected", () => { + test.skipIf(WINDOWS || !canSymlink)("a cache root symlinked to another volume is inspected, not rejected", () => { // Pointing ~/.npm at another volume is ordinary npm configuration. Rejecting it outright was // the same class of false positive as failing on a large cache: it blocks updates for users // whose setup is fine. The root is resolved once; nested links are still never followed. From 077668384a49cdb194a84dc67932920e46d19ce5 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 14:57:38 +0900 Subject: [PATCH 87/88] fix(ci): key the Bun crash retry on the signature that is actually stable The Windows retry added for #2152 grepped for `panic(thread`. This repository already learned that is the wrong anchor: Bun emits BOTH `panic(thread 2852)` and `panic(main thread)` for the same class of failure, and devlog/_fin/260731_pr_issue_triage_round/050_windows_ci_flake_rca.md names `Internal assertion failure` as the stable fingerprint. Verified by literal probe -- panic(thread 3960) matched, panic(main thread) did not. The shard would have failed on exactly the crash the retry exists for. All three signature lists -- the macOS inline grep, the new Windows one, and is_bun_runtime_crash in run-bun-test-batches.sh -- now carry the same alternatives. The workflow comment already required them to stay in sync; nothing enforced it, so three copies drifted into two shapes. The contract test now pins the sync itself rather than the text, and pins that no list keys on the thread-numbered form. hasShellCommandHead is added because the existing exact-line matcher rejected the `| tee` the retry requires, while still rejecting an echoed or commented-out copy. --- .github/workflows/ci.yml | 4 +-- scripts/ci/run-bun-test-batches.sh | 2 +- tests/ci-workflows.test.ts | 54 ++++++++++++++++++++++++++++-- 3 files changed, 55 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5872136ecf..eef67dbf3b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -516,7 +516,7 @@ jobs: if [ "$suite_status" -eq 0 ]; then exit 0 fi - if ! grep -Eqi 'oh no: Bun has crashed|Segmentation fault at address|Illegal instruction|Bus error|Aborted \(core dumped\)' "$suite_log"; then + if ! grep -Eqi 'oh no: Bun has crashed|Internal assertion failure|Segmentation fault at address|Illegal instruction|Bus error|Aborted \(core dumped\)' "$suite_log"; then echo "::error::macOS suite failed on attempt ${attempt} (exit ${suite_status}); assertion failures are not retried." exit "$suite_status" fi @@ -628,7 +628,7 @@ jobs: if [ "$suite_status" -eq 0 ]; then exit 0 fi - if ! grep -Eqi 'oh no: Bun has crashed|Segmentation fault at address|Illegal instruction|Bus error|panic\(thread' "$suite_log"; then + if ! grep -Eqi 'oh no: Bun has crashed|Internal assertion failure|Segmentation fault at address|Illegal instruction|Bus error|Aborted \(core dumped\)' "$suite_log"; then echo "::error::Windows shard ${{ matrix.shard }}/4 failed on attempt ${attempt} (exit ${suite_status}); assertion failures are not retried." exit "$suite_status" fi diff --git a/scripts/ci/run-bun-test-batches.sh b/scripts/ci/run-bun-test-batches.sh index 699f99cb8d..fb61977568 100644 --- a/scripts/ci/run-bun-test-batches.sh +++ b/scripts/ci/run-bun-test-batches.sh @@ -78,7 +78,7 @@ is_bun_runtime_crash() { fi grep -Eqi \ - 'oh no: Bun has crashed|Segmentation fault at address|Illegal instruction|Bus error|Aborted \(core dumped\)' \ + 'oh no: Bun has crashed|Internal assertion failure|Segmentation fault at address|Illegal instruction|Bus error|Aborted \(core dumped\)' \ "$log_file" } diff --git a/tests/ci-workflows.test.ts b/tests/ci-workflows.test.ts index cdcf0d9119..8ba3e7d406 100644 --- a/tests/ci-workflows.test.ts +++ b/tests/ci-workflows.test.ts @@ -48,6 +48,21 @@ function hasExactShellCommand(run: string | undefined, expected: string): boolea .includes(expected); } +/** + * Same intent as {@link hasExactShellCommand}, but for a command that is the HEAD of a + * pipeline. The retry loops capture the suite with `… 2>&1 | tee "$suite_log"`, so an exact + * whole-line match would reject the very shape the retry requires. Anchoring at the start of + * the line still rejects an `echo` of the command or a commented-out copy, which is what the + * exact match was protecting against. + */ +function hasShellCommandHead(run: string | undefined, expected: string): boolean { + return (run ?? "") + .split(/\r?\n/) + .map(line => line.trim()) + .filter(line => line.length > 0 && !line.startsWith("#")) + .some(line => line === expected || line.startsWith(`${expected} `)); +} + function expectSecureLinuxKeyringBootstrap(workflow: string): void { const smokeStep = workflow .split("- name: OS keyring create/read/delete smoke")[1] @@ -224,17 +239,52 @@ describe("GitHub Actions hardening", () => { // Three composed-acceptance failures were that default firing on tests still working // at 41s. Pin the flag so the leg cannot silently drift back to the default. const windowsTestCommand = `bun test --isolate --timeout 60000 tests --shard=\${{ matrix.shard }}/${windowsShards.length}`; - expect(hasExactShellCommand(`echo ${windowsTestCommand}`, windowsTestCommand)).toBe(false); + expect(hasShellCommandHead(`echo ${windowsTestCommand}`, windowsTestCommand)).toBe(false); // Binding the assertion to an executable line is only half the guarantee: a // step carrying the exact command still runs nothing under `if: false`, and // the suite would stay green against a Windows leg that never tests. Require // the matching step to be unconditional. - const windowsTestSteps = winSteps.filter(step => hasExactShellCommand(step.run, windowsTestCommand)); + const windowsTestSteps = winSteps.filter(step => hasShellCommandHead(step.run, windowsTestCommand)); expect(windowsTestSteps.length).toBeGreaterThan(0); expect(windowsTestSteps.every(step => step.if === undefined)).toBe(true); expect(winSteps.some(step => step.if === "runner.environment == 'self-hosted'" && step.run?.includes("git clean -xffd"))).toBe(true); + // The three crash-signature lists must stay identical, and they must not key on + // `panic(thread`. + // + // Bun emits BOTH `panic(thread 2852)` and `panic(main thread)` for the same class of + // failure, so a grep anchored on the numbered form silently misses half of them and the + // shard fails on a crash it was supposed to retry. This repository already learned that + // once — `devlog/_fin/260731_pr_issue_triage_round/050_windows_ci_flake_rca.md` names + // `Internal assertion failure` as the stable fingerprint — and #2152 reintroduced it. + // Three copies of one list is the real hazard, so pin the sync rather than the text. + const crashSignatures = [ + "oh no: Bun has crashed", + "Internal assertion failure", + "Segmentation fault at address", + "Illegal instruction", + "Bus error", + ]; + const windowsTestRun = windowsTestSteps[0]?.run ?? ""; + const batchScript = await readText("scripts/ci/run-bun-test-batches.sh"); + for (const signature of crashSignatures) { + expect(`macos:${signature}:${macosTestRun.includes(signature)}`).toBe(`macos:${signature}:true`); + expect(`windows:${signature}:${windowsTestRun.includes(signature)}`).toBe(`windows:${signature}:true`); + expect(`script:${signature}:${batchScript.includes(signature)}`).toBe(`script:${signature}:true`); + } + // The thread-numbered form must not be the anchor anywhere. + expect(macosTestRun).not.toContain("panic\\(thread"); + expect(windowsTestRun).not.toContain("panic\\(thread"); + expect(batchScript).not.toContain("panic\\(thread"); + + // Windows carries the same bounded retry as macOS: one attempt, crash-only. + expect(hasExactShellCommand(windowsTestRun, "set +e")).toBe(true); + expect(windowsTestRun).toContain("for attempt in 1 2"); + expect(windowsTestRun).not.toContain("while true"); + expect(windowsTestRun).toContain("assertion failures are not retried"); + expect(windowsTestRun).toContain("failing after one retry"); + // Every job that runs the root suite must build the GUI first, unconditionally. // Tests that fetch the served dashboard read their session bootstrap out of // `gui/dist/index.html`; with no build the server has no index to serve and the From 88c4f1561a9a97856d132439000632ded869715b Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Thu, 20 Aug 2026 16:21:09 +0900 Subject: [PATCH 88/88] fix(ci): stop the Windows leg from truncating and mismeasuring its own shards Run 32340498394 dispatched the Windows leg at the release head and produced three results that were not defects in this repository: 1. shard 1/4 was CANCELLED at 15m12s while still executing tests. That is neither a pass nor a fail, and it silently removed the composed-acceptance cases from the evidence. The other shards finished at 14-15 minutes, so 15 was inside the noise band rather than above it. Raised to 25, which still kills a wedged shard and now also covers the second attempt the crash retry is allowed to make. 2. `Responses previous_response_id state > orphan cleanup obeys scan and cleanup caps` ran 100.6s against a 90s budget on shard 4/4 while doing exactly the work it claims: 521 individually fsync'd durable writes. The number was sized from a ~34s windows-latest measurement and was measuring runner contention, not a hang. BULK_DURABLE_IO_BUDGET_MS now carries a Windows-only 180s ceiling, the same shape as the watchdogMs floor. 3. `Claude Code shell-hook reconciliation > does not treat a non-executable claude file as an installed CLI` writes mode 0o644 and expects claudeCodeCliInstalled() to be false. Windows has no execute-permission bit, so accessSync(path, X_OK) succeeds for any readable file and the fixture cannot express its own precondition. It now skips on win32, as several neighbouring symlink cases already do. Refs #2152. --- .github/workflows/ci.yml | 11 ++++++++++- tests/ci-workflows.test.ts | 4 +++- tests/claude-shell-hook.test.ts | 20 ++++++++++++++------ tests/helpers/test-budget.ts | 17 ++++++++++++++++- 4 files changed, 43 insertions(+), 9 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index eef67dbf3b..1d11ebe15b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -553,7 +553,16 @@ jobs: # Sharded like the Linux legs. The single-leg run reached 30 minutes on a # green suite and was killed in cleanup; four shards put each leg inside the # same budget the Linux shards already hold. - timeout-minutes: 15 + # + # 15 was that Linux budget, and on this leg it truncated the evidence rather + # than bounding a hang: shard 1/4 of run 32340498394 was CANCELLED at exactly + # 15m12s while still executing tests, so its result was neither pass nor fail + # and the composed-acceptance cases it carries could not be read at all. The + # other shards finished in 14-15 minutes, which is the wrong side of the + # margin. 25 leaves the outer bound in place — a wedged shard still dies — + # while making a completed shard the normal outcome. The crash-retry below can + # double a shard's work, and this ceiling has to cover that second attempt too. + timeout-minutes: 25 strategy: fail-fast: false matrix: diff --git a/tests/ci-workflows.test.ts b/tests/ci-workflows.test.ts index 8ba3e7d406..becd15dbdc 100644 --- a/tests/ci-workflows.test.ts +++ b/tests/ci-workflows.test.ts @@ -101,7 +101,9 @@ describe("GitHub Actions hardening", () => { expect(ci.jobs?.test?.["timeout-minutes"]).toBe(15); expect(ci.jobs?.gates?.["timeout-minutes"]).toBe(15); expect(ci.jobs?.["platform-macos"]?.["timeout-minutes"]).toBe(30); - expect(ci.jobs?.["platform-windows"]?.["timeout-minutes"]).toBe(15); + // Higher than the Linux shards on purpose: at 15 the Windows leg cancelled a + // shard mid-suite, which reports as neither pass nor fail (#2152). + expect(ci.jobs?.["platform-windows"]?.["timeout-minutes"]).toBe(25); expect(ci.jobs?.["keyring-smoke"]?.["timeout-minutes"]).toBe(8); expect(ci.jobs?.["npm-global-smoke"]?.["timeout-minutes"]).toBe(8); expect(ci.jobs?.ci?.["timeout-minutes"]).toBe(5); diff --git a/tests/claude-shell-hook.test.ts b/tests/claude-shell-hook.test.ts index 9a2b4cbd36..676827f874 100644 --- a/tests/claude-shell-hook.test.ts +++ b/tests/claude-shell-hook.test.ts @@ -83,13 +83,21 @@ describe("Claude Code shell-hook reconciliation", () => { expect(readFileSync(zshrcPath, "utf8").match(/opencodex claude-env hook/g)).toHaveLength(1); }); - test("does not treat a non-executable claude file as an installed CLI", () => { - writeFileSync(join(binDir, "claude"), "#!/bin/sh\nexit 0\n", { mode: 0o644 }); + // Windows has no execute permission bit: `accessSync(path, X_OK)` succeeds for any + // readable file, so a 0o644 fixture cannot express "present but not executable" there. + // The case asserts a POSIX permission semantic, and skipping it on a platform that + // cannot represent the precondition is honest; asserting it anyway measured the + // fixture, not the product (#2152). + test.skipIf(originalPlatform === "win32")( + "does not treat a non-executable claude file as an installed CLI", + () => { + writeFileSync(join(binDir, "claude"), "#!/bin/sh\nexit 0\n", { mode: 0o644 }); - expect(claudeCodeCliInstalled()).toBe(false); - expect(reconcileShellHook(true)).toMatchObject({ changed: false, state: "absent" }); - expect(existsSync(zshrcPath)).toBe(false); - }); + expect(claudeCodeCliInstalled()).toBe(false); + expect(reconcileShellHook(true)).toMatchObject({ changed: false, state: "absent" }); + expect(existsSync(zshrcPath)).toBe(false); + }, + ); test("removes the hook when system environment integration is inactive", () => { installClaudeCli(); diff --git a/tests/helpers/test-budget.ts b/tests/helpers/test-budget.ts index 94914ac3ed..5b827c7dc3 100644 --- a/tests/helpers/test-budget.ts +++ b/tests/helpers/test-budget.ts @@ -44,7 +44,22 @@ export const STORE_BUDGET_MS = 30_000; * assertion (durable spill is the product contract), so the wait is intrinsic; the * orphan-cleanup cap test measured ~34s on windows-latest against Bun's 5s default. */ -export const BULK_DURABLE_IO_BUDGET_MS = 90_000; +export const BULK_DURABLE_IO_BUDGET_MS = bulkDurableIoBudgetMs(); + +/** + * Windows needs a higher ceiling than the ~34s that sized this number, for the same + * reason `watchdogMs` carries a higher floor there: the leg runs four Bun pools on one + * runner, and every one of these writes is an individual fsync against a filesystem that + * is slower under that contention to begin with. The orphan-cleanup cap case ran 100.6s + * against the 90s budget on shard 4/4 (#2152) while doing exactly the work it claims — + * 521 durable writes — so the number was measuring runner contention, not a hang. + * + * 180s stays a bound rather than an absence of one, and it is gated on Windows so no + * other lane loses the shorter signal. + */ +function bulkDurableIoBudgetMs(): number { + return process.platform === "win32" ? 180_000 : 90_000; +} /** * A deadline *inside* a test, for an await that would otherwise hang forever.