@opengeni/codex 0.2.16 → 0.2.18-canary.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -27,6 +27,10 @@ var CODEX_REALTIME_MODEL = "gpt-live-1-boulder-alpha";
27
27
  var CODEX_REALTIME_VERSION = "v3";
28
28
  var CODEX_REALTIME_DEFAULT_VOICE = "cove";
29
29
  var CODEX_REALTIME_CALL_TIMEOUT_MS = 15e3;
30
+ var CODEX_REALTIME_CONFIG_TIMEOUT_MS = 5e3;
31
+ var CODEX_REALTIME_CONFIG_ID = "3566525122";
32
+ var CODEX_REALTIME_PROVIDER_MODEL_FALLBACK = "gpt-live-1-codex";
33
+ var CODEX_REALTIME_PROVIDER_ARCHITECTURE_FALLBACK = "avas";
30
34
  var CODEX_REFRESH_WINDOW_MS = 5 * 60 * 1e3;
31
35
  var CODEX_REFRESH_FALLBACK_MS = 8 * 24 * 60 * 60 * 1e3;
32
36
  var CODEX_RESPONSE_HEADERS_TIMEOUT_MS = 4 * 6e4;
@@ -66,6 +70,10 @@ export {
66
70
  CODEX_REALTIME_VERSION,
67
71
  CODEX_REALTIME_DEFAULT_VOICE,
68
72
  CODEX_REALTIME_CALL_TIMEOUT_MS,
73
+ CODEX_REALTIME_CONFIG_TIMEOUT_MS,
74
+ CODEX_REALTIME_CONFIG_ID,
75
+ CODEX_REALTIME_PROVIDER_MODEL_FALLBACK,
76
+ CODEX_REALTIME_PROVIDER_ARCHITECTURE_FALLBACK,
69
77
  CODEX_REFRESH_WINDOW_MS,
70
78
  CODEX_REFRESH_FALLBACK_MS,
71
79
  CODEX_RESPONSE_HEADERS_TIMEOUT_MS,
@@ -80,4 +88,4 @@ export {
80
88
  CODEX_APPS_STARTUP_TIMEOUT_MS,
81
89
  CODEX_APPS_REQUIRED_SCOPES
82
90
  };
83
- //# sourceMappingURL=chunk-HT463QWA.js.map
91
+ //# sourceMappingURL=chunk-UNB34NLA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/constants.ts"],"sourcesContent":["// Wire constants for the ChatGPT/Codex subscription backend.\n// Source: CODEX-SUBSCRIPTION-SPEC.md (verified against openai/codex codex-rs).\n\nexport const CODEX_ISSUER = \"https://auth.openai.com\";\nexport const CODEX_CLIENT_ID = \"app_EMoamEEZ73f0CkXaXp7hrann\"; // spec §1.1 (manager.rs:1444)\nexport const CODEX_AUTH_BASE = `${CODEX_ISSUER}/api/accounts`; // device endpoints (device_code_auth.rs:164)\nexport const CODEX_TOKEN_URL = `${CODEX_ISSUER}/oauth/token`; // exchange (form) + refresh (json)\nexport const CODEX_DEVICE_VERIFICATION_URL = `${CODEX_ISSUER}/codex/device`;\nexport const CODEX_DEVICE_REDIRECT_URI = `${CODEX_ISSUER}/deviceauth/callback`;\n\n// Model requests: base already includes /codex; client appends /responses, /models.\nexport const CODEX_RESPONSES_BASE = \"https://chatgpt.com/backend-api/codex\";\n// Usage lives on the WHAM base — NOT under /codex (verified, spec §1.8a).\nexport const CODEX_WHAM_BASE = \"https://chatgpt.com/backend-api\";\n\nexport const CODEX_ORIGINATOR = \"codex_cli_rs\"; // whitelisted originator (spec §1.2)\nexport const CODEX_ID_TOKEN_AUTH_CLAIM = \"https://api.openai.com/auth\";\n\n// Synthetic registry-provider identity. The provider's baseURL is the bare\n// /backend-api (NOT /codex) — codexSubscriptionFetch rewrites /responses ->\n// /codex/responses. Codex model ids are namespaced `codex/<slug>` so they never\n// collide with the built-in OpenAI provider's model ids; the fetch's resolveModel\n// strips the prefix before the slug reaches the backend.\nexport const CODEX_PROVIDER_ID = \"codex-subscription\";\nexport const CODEX_PROVIDER_BASE_URL = \"https://chatgpt.com/backend-api\";\nexport const CODEX_MODEL_ID_PREFIX = \"codex/\";\n\n// The only Codex subscription models OpenGeni exposes. The live GET /models\n// catalog must contain every exact slug; older or internal models never broaden\n// this product allowlist.\nexport const CODEX_FALLBACK_MODEL_SLUGS = [\"gpt-5.6-sol\", \"gpt-5.6-terra\", \"gpt-5.6-luna\"] as const;\n\n// Live Codex model-catalog values for every exposed gpt-5.6 subscription slug.\n// Verified 2026-07-18 against Codex CLI 0.144.6's freshly fetched\n// ~/.codex/models_cache.json and the matching openai/codex core derivations:\n// raw context window = 272,000\n// effective input window (95%) = 258,400\n// automatic compaction limit (90%) = 244,800\n// Keep all three explicit: the effective ceiling is a hard input guard while\n// the lower auto-compact limit is the proactive checkpoint trigger.\nexport const CODEX_MODEL_CONTEXT_WINDOW_TOKENS = 272_000;\nexport const CODEX_EFFECTIVE_CONTEXT_WINDOW_PERCENT = 95;\nexport const CODEX_MODEL_EFFECTIVE_CONTEXT_WINDOW_TOKENS = Math.floor(\n (CODEX_MODEL_CONTEXT_WINDOW_TOKENS * CODEX_EFFECTIVE_CONTEXT_WINDOW_PERCENT) / 100,\n);\nexport const CODEX_AUTO_COMPACTION_PERCENT = 90;\nexport const CODEX_MODEL_AUTO_COMPACT_TOKEN_LIMIT = Math.floor(\n (CODEX_MODEL_CONTEXT_WINDOW_TOKENS * CODEX_AUTO_COMPACTION_PERCENT) / 100,\n);\n\n// Sent as the `version` header and inside the User-Agent. Staging-proven on\n// 2026-07-09: 0.142.4 filtered every GPT-5.6 slug out of GET /models, while the\n// official Codex 0.144.0+ releases return all three exact slugs above. Keep\n// this pinned to the latest stable Codex release we have verified end-to-end.\nexport const CODEX_CLIENT_VERSION = \"0.145.0\";\n\n// Public OpenGeni selector for native ChatGPT/Codex subscription WebRTC. This\n// remains stable for persisted sessions; the provider's remotely configured\n// model is resolved separately before call creation.\nexport const CODEX_REALTIME_MODEL = \"gpt-live-1-boulder-alpha\";\nexport const CODEX_REALTIME_VERSION = \"v3\";\nexport const CODEX_REALTIME_DEFAULT_VOICE = \"cove\";\nexport const CODEX_REALTIME_CALL_TIMEOUT_MS = 15_000;\nexport const CODEX_REALTIME_CONFIG_TIMEOUT_MS = 5_000;\nexport const CODEX_REALTIME_CONFIG_ID = \"3566525122\";\n// Verified live on 2026-08-23. Used only when the authenticated remote config\n// is transiently unavailable or malformed; it is not the persisted model id.\nexport const CODEX_REALTIME_PROVIDER_MODEL_FALLBACK = \"gpt-live-1-codex\";\nexport const CODEX_REALTIME_PROVIDER_ARCHITECTURE_FALLBACK = \"avas\";\n\nexport const CODEX_REFRESH_WINDOW_MS = 5 * 60 * 1000; // proactive refresh when within 5 min of exp (spec §1.1)\nexport const CODEX_REFRESH_FALLBACK_MS = 8 * 24 * 60 * 60 * 1000; // 8 days when exp is unparseable\n\n// Codex Responses transport deadlines. The OpenAI SDK's own timeout only covers\n// the wait for response headers and erases the underlying timeout class into the\n// bare `Request timed out.` error. Keep the provider-specific budgets here so\n// the transport can enforce and durably report them without enabling the SDK's\n// blind request replay.\nexport const CODEX_RESPONSE_HEADERS_TIMEOUT_MS = 4 * 60_000;\nexport const CODEX_RESPONSE_STREAM_IDLE_TIMEOUT_MS = 5 * 60_000;\nexport const CODEX_RESPONSE_WHOLE_TIMEOUT_MS = 30 * 60_000;\n// Kept as a compatibility-shaped policy field, but automatic replay is disabled\n// until a provider-specific operation receipt can prove non-acceptance or resume\n// the same operation identity. An absent response does not prove that the\n// provider never accepted the request.\nexport const CODEX_RESPONSE_NO_BYTE_RETRIES = 0;\nexport const CODEX_RESPONSE_RETRY_BACKOFF_MS = 1_000;\n// Must exceed the transport-owned whole-response deadline. This SDK guard is a\n// last-resort envelope; the inner transport emits the typed/durable failure.\nexport const CODEX_RESPONSE_SDK_OUTER_TIMEOUT_MS = 35 * 60_000;\n\n// ── Apps / connectors MCP (spec §1.10, §E) ───────────────────────────────────\n// One server-side MCP exposes ALL the user's ChatGPT/Codex connectors\n// (gmail/github/linear/slack/sentry/drive/calendar/…). Streamable HTTP, always.\nexport const CODEX_APPS_MCP_SERVER_ID = \"codex_apps\"; // tools surface as mcp__codex_apps__<tool>\nexport const CODEX_APPS_MCP_SERVER_NAME = \"codex_apps\"; // MCP `name` — MUST equal the id so the SDK namespaces tools as mcp__codex_apps__*\nexport const CODEX_APPS_MCP_URL = \"https://chatgpt.com/backend-api/ps/mcp\"; // live URL (NOT /codex, NOT the legacy /wham/apps)\nexport const CODEX_APPS_STARTUP_TIMEOUT_MS = 30_000; // startup_timeout 30s (spec §1.10) — maps to timeoutMs on this server only\n// Connector scopes that the apps MCP requires. Present ONLY when granted at\n// browser-authorize time; the device-code path CANNOT be confirmed to grant\n// them, so treat connector availability as runtime-discovered (spec §1.10 / §E).\nexport const CODEX_APPS_REQUIRED_SCOPES = [\"api.connectors.read\", \"api.connectors.invoke\"] as const;\n"],"mappings":";AAGO,IAAM,eAAe;AACrB,IAAM,kBAAkB;AACxB,IAAM,kBAAkB,GAAG,YAAY;AACvC,IAAM,kBAAkB,GAAG,YAAY;AACvC,IAAM,gCAAgC,GAAG,YAAY;AACrD,IAAM,4BAA4B,GAAG,YAAY;AAGjD,IAAM,uBAAuB;AAE7B,IAAM,kBAAkB;AAExB,IAAM,mBAAmB;AACzB,IAAM,4BAA4B;AAOlC,IAAM,oBAAoB;AAC1B,IAAM,0BAA0B;AAChC,IAAM,wBAAwB;AAK9B,IAAM,6BAA6B,CAAC,eAAe,iBAAiB,cAAc;AAUlF,IAAM,oCAAoC;AAC1C,IAAM,yCAAyC;AAC/C,IAAM,8CAA8C,KAAK;AAAA,EAC7D,oCAAoC,yCAA0C;AACjF;AACO,IAAM,gCAAgC;AACtC,IAAM,uCAAuC,KAAK;AAAA,EACtD,oCAAoC,gCAAiC;AACxE;AAMO,IAAM,uBAAuB;AAK7B,IAAM,uBAAuB;AAC7B,IAAM,yBAAyB;AAC/B,IAAM,+BAA+B;AACrC,IAAM,iCAAiC;AACvC,IAAM,mCAAmC;AACzC,IAAM,2BAA2B;AAGjC,IAAM,yCAAyC;AAC/C,IAAM,gDAAgD;AAEtD,IAAM,0BAA0B,IAAI,KAAK;AACzC,IAAM,4BAA4B,IAAI,KAAK,KAAK,KAAK;AAOrD,IAAM,oCAAoC,IAAI;AAC9C,IAAM,wCAAwC,IAAI;AAClD,IAAM,kCAAkC,KAAK;AAK7C,IAAM,iCAAiC;AACvC,IAAM,kCAAkC;AAGxC,IAAM,sCAAsC,KAAK;AAKjD,IAAM,2BAA2B;AACjC,IAAM,6BAA6B;AACnC,IAAM,qBAAqB;AAC3B,IAAM,gCAAgC;AAItC,IAAM,6BAA6B,CAAC,uBAAuB,uBAAuB;","names":[]}
@@ -22,6 +22,10 @@ export declare const CODEX_REALTIME_MODEL = "gpt-live-1-boulder-alpha";
22
22
  export declare const CODEX_REALTIME_VERSION = "v3";
23
23
  export declare const CODEX_REALTIME_DEFAULT_VOICE = "cove";
24
24
  export declare const CODEX_REALTIME_CALL_TIMEOUT_MS = 15000;
25
+ export declare const CODEX_REALTIME_CONFIG_TIMEOUT_MS = 5000;
26
+ export declare const CODEX_REALTIME_CONFIG_ID = "3566525122";
27
+ export declare const CODEX_REALTIME_PROVIDER_MODEL_FALLBACK = "gpt-live-1-codex";
28
+ export declare const CODEX_REALTIME_PROVIDER_ARCHITECTURE_FALLBACK = "avas";
25
29
  export declare const CODEX_REFRESH_WINDOW_MS: number;
26
30
  export declare const CODEX_REFRESH_FALLBACK_MS: number;
27
31
  export declare const CODEX_RESPONSE_HEADERS_TIMEOUT_MS: number;
package/dist/constants.js CHANGED
@@ -22,8 +22,12 @@ import {
22
22
  CODEX_PROVIDER_BASE_URL,
23
23
  CODEX_PROVIDER_ID,
24
24
  CODEX_REALTIME_CALL_TIMEOUT_MS,
25
+ CODEX_REALTIME_CONFIG_ID,
26
+ CODEX_REALTIME_CONFIG_TIMEOUT_MS,
25
27
  CODEX_REALTIME_DEFAULT_VOICE,
26
28
  CODEX_REALTIME_MODEL,
29
+ CODEX_REALTIME_PROVIDER_ARCHITECTURE_FALLBACK,
30
+ CODEX_REALTIME_PROVIDER_MODEL_FALLBACK,
27
31
  CODEX_REALTIME_VERSION,
28
32
  CODEX_REFRESH_FALLBACK_MS,
29
33
  CODEX_REFRESH_WINDOW_MS,
@@ -36,7 +40,7 @@ import {
36
40
  CODEX_RESPONSE_WHOLE_TIMEOUT_MS,
37
41
  CODEX_TOKEN_URL,
38
42
  CODEX_WHAM_BASE
39
- } from "./chunk-HT463QWA.js";
43
+ } from "./chunk-UNB34NLA.js";
40
44
  export {
41
45
  CODEX_APPS_MCP_SERVER_ID,
42
46
  CODEX_APPS_MCP_SERVER_NAME,
@@ -61,8 +65,12 @@ export {
61
65
  CODEX_PROVIDER_BASE_URL,
62
66
  CODEX_PROVIDER_ID,
63
67
  CODEX_REALTIME_CALL_TIMEOUT_MS,
68
+ CODEX_REALTIME_CONFIG_ID,
69
+ CODEX_REALTIME_CONFIG_TIMEOUT_MS,
64
70
  CODEX_REALTIME_DEFAULT_VOICE,
65
71
  CODEX_REALTIME_MODEL,
72
+ CODEX_REALTIME_PROVIDER_ARCHITECTURE_FALLBACK,
73
+ CODEX_REALTIME_PROVIDER_MODEL_FALLBACK,
66
74
  CODEX_REALTIME_VERSION,
67
75
  CODEX_REFRESH_FALLBACK_MS,
68
76
  CODEX_REFRESH_WINDOW_MS,
package/dist/index.js CHANGED
@@ -22,8 +22,12 @@ import {
22
22
  CODEX_PROVIDER_BASE_URL,
23
23
  CODEX_PROVIDER_ID,
24
24
  CODEX_REALTIME_CALL_TIMEOUT_MS,
25
+ CODEX_REALTIME_CONFIG_ID,
26
+ CODEX_REALTIME_CONFIG_TIMEOUT_MS,
25
27
  CODEX_REALTIME_DEFAULT_VOICE,
26
28
  CODEX_REALTIME_MODEL,
29
+ CODEX_REALTIME_PROVIDER_ARCHITECTURE_FALLBACK,
30
+ CODEX_REALTIME_PROVIDER_MODEL_FALLBACK,
27
31
  CODEX_REALTIME_VERSION,
28
32
  CODEX_REFRESH_FALLBACK_MS,
29
33
  CODEX_REFRESH_WINDOW_MS,
@@ -36,7 +40,7 @@ import {
36
40
  CODEX_RESPONSE_WHOLE_TIMEOUT_MS,
37
41
  CODEX_TOKEN_URL,
38
42
  CODEX_WHAM_BASE
39
- } from "./chunk-HT463QWA.js";
43
+ } from "./chunk-UNB34NLA.js";
40
44
  import {
41
45
  CODEX_REALTIME_CONTEXT_APPEND_MAX_BYTES,
42
46
  CODEX_REALTIME_INITIAL_ITEMS_MAX_COUNT,
@@ -304,6 +308,9 @@ function normalizeCodexRequestBody(body, resolveModel) {
304
308
  if ("id" in record) {
305
309
  delete record.id;
306
310
  }
311
+ if ("status" in record) {
312
+ delete record.status;
313
+ }
307
314
  if (record.type === "tool_search_call" && typeof record.arguments === "string") {
308
315
  try {
309
316
  const parsed = JSON.parse(record.arguments);
@@ -335,7 +342,7 @@ function normalizedCodexRequestBody(body, resolveModel) {
335
342
  projected.input = body.input.map((item) => {
336
343
  if (!item || typeof item !== "object" || Array.isArray(item)) return item;
337
344
  const record = item;
338
- return "id" in record || record.type === "tool_search_call" && typeof record.arguments === "string" ? { ...record } : item;
345
+ return "id" in record || "status" in record || record.type === "tool_search_call" && typeof record.arguments === "string" ? { ...record } : item;
339
346
  });
340
347
  }
341
348
  return normalizeCodexRequestBody(projected, resolveModel);
@@ -821,6 +828,12 @@ function opaqueProviderArtifactFingerprints(input) {
821
828
  }
822
829
 
823
830
  // src/fetch.ts
831
+ function emitRequestPreparationDiagnostic(ctx, phase) {
832
+ try {
833
+ ctx.onRequestPreparationDiagnostic?.(phase);
834
+ } catch {
835
+ }
836
+ }
824
837
  var CODEX_TRANSPORT_ERROR_HEADER = "x-opengeni-codex-transport-error";
825
838
  var CODEX_REQUEST_BODY_NORMALIZED_HEADER = "x-opengeni-request-body-normalized";
826
839
  var REPLAYABLE_REQUEST_BODY_FACTORY = Symbol.for("opengeni.replayable-request-body-factory");
@@ -1230,6 +1243,7 @@ function codexSubscriptionFetch(base = globalThis.fetch) {
1230
1243
  if (!ctx) {
1231
1244
  return base(input, init);
1232
1245
  }
1246
+ emitRequestPreparationDiagnostic(ctx, "transport_entry");
1233
1247
  const rawUrl = typeof input === "string" ? input : input instanceof URL ? input.toString() : input.url;
1234
1248
  const rewritten = rawUrl.replace(/(?<!\/codex)\/responses(\b|$)/, "/codex/responses$1");
1235
1249
  const policy = resolveCodexResponseTimeoutPolicy(ctx.responseTimeoutPolicy);
@@ -1293,7 +1307,10 @@ function codexSubscriptionFetch(base = globalThis.fetch) {
1293
1307
  throw new Error("Model request could not be prepared");
1294
1308
  }
1295
1309
  if (!bodyAlreadyNormalized) {
1296
- ctx.onRequestOpaqueArtifacts?.({ requestId, fingerprints: requestOpaqueArtifacts });
1310
+ ctx.onRequestOpaqueArtifacts?.({
1311
+ requestId,
1312
+ fingerprints: requestOpaqueArtifacts
1313
+ });
1297
1314
  }
1298
1315
  headers.set(
1299
1316
  "Idempotency-Key",
@@ -1319,6 +1336,7 @@ function codexSubscriptionFetch(base = globalThis.fetch) {
1319
1336
  policy,
1320
1337
  terminalOutcome: null
1321
1338
  };
1339
+ emitRequestPreparationDiagnostic(ctx, "wire_request_ready");
1322
1340
  await emitRequestEvent(audit, {
1323
1341
  phase: "started",
1324
1342
  responseObserved: false
@@ -1394,7 +1412,9 @@ function codexSubscriptionFetch(base = globalThis.fetch) {
1394
1412
  return res;
1395
1413
  };
1396
1414
  try {
1397
- let res = await attempt(await ctx.getToken(), 0);
1415
+ const token = await ctx.getToken();
1416
+ emitRequestPreparationDiagnostic(ctx, "credential_ready");
1417
+ let res = await attempt(token, 0);
1398
1418
  if (res.status === 401) {
1399
1419
  res = await attempt(await ctx.refresh(), 1);
1400
1420
  }
@@ -2031,6 +2051,27 @@ function codexAppsSanitizingFetch(base = globalThis.fetch, namespaceSink) {
2031
2051
  var MODEL_TOOL_OUTPUT_OVERSIZED_IMAGE_CARD_DATA_URL = "data:image/png;base64,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";
2032
2052
 
2033
2053
  // src/model-output-truncation.ts
2054
+ function omitOutputOnlyHistoryItemFields(item) {
2055
+ if (!item || typeof item !== "object") {
2056
+ return item;
2057
+ }
2058
+ const providerData = item.providerData && typeof item.providerData === "object" ? item.providerData : null;
2059
+ const hasTopStatus = "status" in item;
2060
+ const hasNestedStatus = Boolean(providerData && "status" in providerData);
2061
+ if (!hasTopStatus && !hasNestedStatus) {
2062
+ return item;
2063
+ }
2064
+ const next = { ...item };
2065
+ if (hasTopStatus) delete next.status;
2066
+ if (hasNestedStatus && providerData) {
2067
+ const { status: _dropped, ...rest } = providerData;
2068
+ next.providerData = rest;
2069
+ }
2070
+ return next;
2071
+ }
2072
+ function canonicalizePersistedHistoryItem(item, policyTokens = DEFAULT_MODEL_TOOL_OUTPUT_TRUNCATION_TOKENS) {
2073
+ return boundModelToolOutputItem(omitOutputOnlyHistoryItemFields(item), policyTokens);
2074
+ }
2034
2075
  var CODEX_MODEL_TOOL_OUTPUT_TRUNCATION_TOKENS = 1e4;
2035
2076
  var CODEX_TOOL_OUTPUT_SERIALIZATION_ALLOWANCE = 1.2;
2036
2077
  var DEFAULT_MODEL_TOOL_OUTPUT_TRUNCATION_TOKENS = CODEX_MODEL_TOOL_OUTPUT_TRUNCATION_TOKENS;
@@ -2595,8 +2636,9 @@ function boundedErrorMessage(body) {
2595
2636
  }
2596
2637
 
2597
2638
  // src/realtime.ts
2598
- var CODEX_REALTIME_CALL_URL = `${CODEX_RESPONSES_BASE}/realtime/calls?intent=quicksilver&architecture=avas`;
2599
2639
  var MAX_REALTIME_SDP_BYTES = 1024 * 1024;
2640
+ var MAX_REALTIME_PROVIDER_VALUE_LENGTH = 128;
2641
+ var REALTIME_PROVIDER_VALUE = /^[a-z0-9][a-z0-9._-]*$/i;
2600
2642
  var REALTIME_CALL_ID = /^(?:rtc_.+|[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$/i;
2601
2643
  var CODEX_REALTIME_VOICES = [
2602
2644
  "juniper",
@@ -2617,15 +2659,99 @@ var CodexRealtimeError = class extends Error {
2617
2659
  this.name = "CodexRealtimeError";
2618
2660
  }
2619
2661
  };
2662
+ var FALLBACK_REALTIME_PROVIDER_CONFIG = {
2663
+ architecture: CODEX_REALTIME_PROVIDER_ARCHITECTURE_FALLBACK,
2664
+ model: CODEX_REALTIME_PROVIDER_MODEL_FALLBACK,
2665
+ version: CODEX_REALTIME_VERSION
2666
+ };
2667
+ async function fetchCodexRealtimeProviderConfig(auth, fetchImpl = fetch, options = {}) {
2668
+ if (options.signal?.aborted) {
2669
+ throw new CodexRealtimeError("cancelled", "Codex realtime request cancelled");
2670
+ }
2671
+ const controller = new AbortController();
2672
+ const timeoutMs = options.timeoutMs ?? CODEX_REALTIME_CONFIG_TIMEOUT_MS;
2673
+ const timeout = setTimeout(() => controller.abort(), timeoutMs);
2674
+ const onAbort = () => controller.abort(options.signal?.reason);
2675
+ options.signal?.addEventListener("abort", onAbort, { once: true });
2676
+ try {
2677
+ const response = await fetchImpl(`${CODEX_WHAM_BASE}/wham/statsig/bootstrap`, {
2678
+ method: "POST",
2679
+ headers: {
2680
+ ...codexSubscriptionHeaders(auth),
2681
+ "content-type": "application/json"
2682
+ },
2683
+ body: JSON.stringify({
2684
+ app_session_id: crypto.randomUUID(),
2685
+ app_version: auth.clientVersion,
2686
+ brand_name: "Codex",
2687
+ build_flavor: "stable",
2688
+ locale: "en-US",
2689
+ stable_id: auth.chatgptAccountId ?? "opengeni-server",
2690
+ system_name: "OpenGeni",
2691
+ system_version: "server",
2692
+ window_type: "local"
2693
+ }),
2694
+ signal: controller.signal
2695
+ });
2696
+ if (response.status === 401) {
2697
+ await response.body?.cancel().catch(() => void 0);
2698
+ throw new CodexRealtimeError(
2699
+ "authentication",
2700
+ "Codex subscription rejected authentication",
2701
+ response.status
2702
+ );
2703
+ }
2704
+ if (!response.ok) {
2705
+ await response.body?.cancel().catch(() => void 0);
2706
+ return FALLBACK_REALTIME_PROVIDER_CONFIG;
2707
+ }
2708
+ const outer = await response.json().catch(() => null);
2709
+ if (typeof outer?.statsigPayload !== "string") return FALLBACK_REALTIME_PROVIDER_CONFIG;
2710
+ const payload = JSON.parse(outer.statsigPayload);
2711
+ const value = payload.dynamic_configs?.[CODEX_REALTIME_CONFIG_ID]?.value;
2712
+ const version = value?.version;
2713
+ if (version !== void 0 && version !== CODEX_REALTIME_VERSION) {
2714
+ throw new CodexRealtimeError(
2715
+ "incompatible",
2716
+ `Codex realtime remote configuration requires ${String(version)}`
2717
+ );
2718
+ }
2719
+ const architecture = validProviderValue(value?.architecture) ? value.architecture : FALLBACK_REALTIME_PROVIDER_CONFIG.architecture;
2720
+ const model = validProviderValue(value?.model) ? value.model : FALLBACK_REALTIME_PROVIDER_CONFIG.model;
2721
+ return { architecture, model, version: CODEX_REALTIME_VERSION };
2722
+ } catch (error) {
2723
+ if (error instanceof CodexRealtimeError) throw error;
2724
+ if (options.signal?.aborted) {
2725
+ throw new CodexRealtimeError("cancelled", "Codex realtime request cancelled");
2726
+ }
2727
+ return FALLBACK_REALTIME_PROVIDER_CONFIG;
2728
+ } finally {
2729
+ clearTimeout(timeout);
2730
+ options.signal?.removeEventListener("abort", onAbort);
2731
+ }
2732
+ }
2620
2733
  async function createCodexRealtimeCall(auth, input, fetchImpl = fetch, options = {}) {
2621
2734
  validateRealtimeInput(input);
2622
2735
  const timeoutMs = options.timeoutMs ?? CODEX_REALTIME_CALL_TIMEOUT_MS;
2736
+ const providerConfig = options.providerConfig ?? FALLBACK_REALTIME_PROVIDER_CONFIG;
2623
2737
  if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {
2624
2738
  throw new CodexRealtimeError("invalid_request", "Codex realtime timeout must be positive");
2625
2739
  }
2626
2740
  if (options.signal?.aborted) {
2627
2741
  throw new CodexRealtimeError("cancelled", "Codex realtime request cancelled");
2628
2742
  }
2743
+ if (providerConfig.version !== CODEX_REALTIME_VERSION) {
2744
+ throw new CodexRealtimeError(
2745
+ "incompatible",
2746
+ `Codex realtime provider configuration requires ${providerConfig.version}`
2747
+ );
2748
+ }
2749
+ if (!validProviderValue(providerConfig.architecture) || !validProviderValue(providerConfig.model)) {
2750
+ throw new CodexRealtimeError(
2751
+ "invalid_request",
2752
+ "Codex realtime provider configuration is invalid"
2753
+ );
2754
+ }
2629
2755
  const controller = new AbortController();
2630
2756
  let timedOut = false;
2631
2757
  let timeout;
@@ -2646,40 +2772,43 @@ async function createCodexRealtimeCall(auth, input, fetchImpl = fetch, options =
2646
2772
  }, timeoutMs);
2647
2773
  });
2648
2774
  const request = (async () => {
2649
- const response = await fetchImpl(CODEX_REALTIME_CALL_URL, {
2650
- method: "POST",
2651
- headers: {
2652
- ...codexSubscriptionHeaders(auth),
2653
- "content-type": "application/json",
2654
- "openai-alpha": "quicksilver=v2",
2655
- "session-id": input.sessionId,
2656
- "thread-id": input.sessionId
2657
- },
2658
- body: JSON.stringify({
2659
- sdp: input.sdp,
2660
- session: {
2661
- instructions: input.instructions ?? "",
2662
- audio: {
2663
- output: { voice: input.voice ?? CODEX_REALTIME_DEFAULT_VOICE }
2664
- },
2665
- delegation: { type: "client" },
2666
- model: CODEX_REALTIME_MODEL,
2667
- ...input.initialItems?.length ? {
2668
- initial_items: input.initialItems.map((item) => ({
2669
- type: "message",
2670
- role: item.role,
2671
- content: [
2672
- {
2673
- type: item.role === "assistant" ? "output_text" : "input_text",
2674
- text: item.text
2675
- }
2676
- ]
2677
- }))
2678
- } : {}
2679
- }
2680
- }),
2681
- signal: controller.signal
2682
- });
2775
+ const response = await fetchImpl(
2776
+ `${CODEX_RESPONSES_BASE}/realtime/calls?intent=quicksilver&architecture=${encodeURIComponent(providerConfig.architecture)}`,
2777
+ {
2778
+ method: "POST",
2779
+ headers: {
2780
+ ...codexSubscriptionHeaders(auth),
2781
+ "content-type": "application/json",
2782
+ "openai-alpha": "quicksilver=v2",
2783
+ "session-id": input.sessionId,
2784
+ "thread-id": input.sessionId
2785
+ },
2786
+ body: JSON.stringify({
2787
+ sdp: input.sdp,
2788
+ session: {
2789
+ instructions: input.instructions ?? "",
2790
+ audio: {
2791
+ output: { voice: input.voice ?? CODEX_REALTIME_DEFAULT_VOICE }
2792
+ },
2793
+ delegation: { type: "client" },
2794
+ model: providerConfig.model,
2795
+ ...input.initialItems?.length ? {
2796
+ initial_items: input.initialItems.map((item) => ({
2797
+ type: "message",
2798
+ role: item.role,
2799
+ content: [
2800
+ {
2801
+ type: item.role === "assistant" ? "output_text" : "input_text",
2802
+ text: item.text
2803
+ }
2804
+ ]
2805
+ }))
2806
+ } : {}
2807
+ }
2808
+ }),
2809
+ signal: controller.signal
2810
+ }
2811
+ );
2683
2812
  if (!response.ok) {
2684
2813
  await response.body?.cancel().catch(() => void 0);
2685
2814
  throw providerHttpError(response.status);
@@ -2723,6 +2852,9 @@ async function createCodexRealtimeCall(auth, input, fetchImpl = fetch, options =
2723
2852
  options.signal?.removeEventListener("abort", onAbort);
2724
2853
  }
2725
2854
  }
2855
+ function validProviderValue(value) {
2856
+ return typeof value === "string" && value.length <= MAX_REALTIME_PROVIDER_VALUE_LENGTH && REALTIME_PROVIDER_VALUE.test(value);
2857
+ }
2726
2858
  function selectCodexCredentialId(args) {
2727
2859
  if (args.sessionPinnedCredentialId && args.connectedIds.has(args.sessionPinnedCredentialId)) {
2728
2860
  return args.sessionPinnedCredentialId;
@@ -2883,11 +3015,15 @@ export {
2883
3015
  CODEX_PROVIDER_ID,
2884
3016
  CODEX_RATE_LIMIT_RESET_OUTCOMES,
2885
3017
  CODEX_REALTIME_CALL_TIMEOUT_MS,
3018
+ CODEX_REALTIME_CONFIG_ID,
3019
+ CODEX_REALTIME_CONFIG_TIMEOUT_MS,
2886
3020
  CODEX_REALTIME_CONTEXT_APPEND_MAX_BYTES,
2887
3021
  CODEX_REALTIME_DEFAULT_VOICE,
2888
3022
  CODEX_REALTIME_INITIAL_ITEMS_MAX_COUNT,
2889
3023
  CODEX_REALTIME_INITIAL_ITEMS_MAX_TOKENS,
2890
3024
  CODEX_REALTIME_MODEL,
3025
+ CODEX_REALTIME_PROVIDER_ARCHITECTURE_FALLBACK,
3026
+ CODEX_REALTIME_PROVIDER_MODEL_FALLBACK,
2891
3027
  CODEX_REALTIME_V3_MAX_EVENT_BYTES,
2892
3028
  CODEX_REALTIME_V3_MAX_IDENTIFIER_BYTES,
2893
3029
  CODEX_REALTIME_V3_MAX_TEXT_BYTES,
@@ -2932,6 +3068,7 @@ export {
2932
3068
  boundModelToolOutputItems,
2933
3069
  buildCodexUsageWindowFromCache,
2934
3070
  buildModelResolver,
3071
+ canonicalizePersistedHistoryItem,
2935
3072
  classifyCodexEncryptedArtifactRejection,
2936
3073
  classifyCodexResponseTimeoutError,
2937
3074
  classifyCodexUsageLimitError,
@@ -2948,6 +3085,7 @@ export {
2948
3085
  exchangeDeviceCode,
2949
3086
  fetchCodexModels,
2950
3087
  fetchCodexRateLimitResetCredits,
3088
+ fetchCodexRealtimeProviderConfig,
2951
3089
  fetchCodexUsage,
2952
3090
  generateCodexSubscriptionImage,
2953
3091
  isCodexBilledModel,
@@ -2957,6 +3095,7 @@ export {
2957
3095
  normalizeCodexRequestBody,
2958
3096
  normalizeCodexUsage,
2959
3097
  normalizedCodexRequestBody,
3098
+ omitOutputOnlyHistoryItemFields,
2960
3099
  opaqueProviderArtifactFingerprint,
2961
3100
  opaqueProviderArtifactFingerprints,
2962
3101
  parseCodexRateLimitResetConsumeResponse,