@opengeni/codex 0.2.9 → 0.2.11

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.
@@ -7,6 +7,8 @@ export type CodexAuthHeaders = {
7
7
  clientVersion: string;
8
8
  };
9
9
  export type ResetCreditFetchFailureReason = "http_error" | "invalid_response" | "network_error" | "timeout";
10
+ /** Server-only headers shared by every ChatGPT/Codex subscription transport. */
11
+ export declare function codexSubscriptionHeaders(a: CodexAuthHeaders): Record<string, string>;
10
12
  /** GET /codex/models — login-check + live catalog. A 200 means the token is accepted. spec §1.4/§F */
11
13
  export declare function fetchCodexModels(a: CodexAuthHeaders, fetchImpl?: CodexFetch, timeoutMs?: number): Promise<{
12
14
  ok: boolean;
@@ -22,7 +22,11 @@ var CODEX_AUTO_COMPACTION_PERCENT = 90;
22
22
  var CODEX_MODEL_AUTO_COMPACT_TOKEN_LIMIT = Math.floor(
23
23
  CODEX_MODEL_CONTEXT_WINDOW_TOKENS * CODEX_AUTO_COMPACTION_PERCENT / 100
24
24
  );
25
- var CODEX_CLIENT_VERSION = "0.144.6";
25
+ var CODEX_CLIENT_VERSION = "0.145.0";
26
+ var CODEX_REALTIME_MODEL = "gpt-live-1-boulder-alpha";
27
+ var CODEX_REALTIME_VERSION = "v3";
28
+ var CODEX_REALTIME_DEFAULT_VOICE = "cove";
29
+ var CODEX_REALTIME_CALL_TIMEOUT_MS = 15e3;
26
30
  var CODEX_REFRESH_WINDOW_MS = 5 * 60 * 1e3;
27
31
  var CODEX_REFRESH_FALLBACK_MS = 8 * 24 * 60 * 60 * 1e3;
28
32
  var CODEX_RESPONSE_HEADERS_TIMEOUT_MS = 4 * 6e4;
@@ -58,6 +62,10 @@ export {
58
62
  CODEX_AUTO_COMPACTION_PERCENT,
59
63
  CODEX_MODEL_AUTO_COMPACT_TOKEN_LIMIT,
60
64
  CODEX_CLIENT_VERSION,
65
+ CODEX_REALTIME_MODEL,
66
+ CODEX_REALTIME_VERSION,
67
+ CODEX_REALTIME_DEFAULT_VOICE,
68
+ CODEX_REALTIME_CALL_TIMEOUT_MS,
61
69
  CODEX_REFRESH_WINDOW_MS,
62
70
  CODEX_REFRESH_FALLBACK_MS,
63
71
  CODEX_RESPONSE_HEADERS_TIMEOUT_MS,
@@ -72,4 +80,4 @@ export {
72
80
  CODEX_APPS_STARTUP_TIMEOUT_MS,
73
81
  CODEX_APPS_REQUIRED_SCOPES
74
82
  };
75
- //# sourceMappingURL=chunk-YGKQDUY7.js.map
83
+ //# sourceMappingURL=chunk-HT463QWA.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// Native ChatGPT/Codex subscription WebRTC call creation. Verified against\n// openai/codex 0.145.0 commit bd2de422aa287b97b06ca6425a10935bcf1b3731.\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;\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;AAI7B,IAAM,uBAAuB;AAC7B,IAAM,yBAAyB;AAC/B,IAAM,+BAA+B;AACrC,IAAM,iCAAiC;AAEvC,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":[]}
@@ -0,0 +1,236 @@
1
+ // src/realtime-v3.ts
2
+ var CODEX_REALTIME_INITIAL_ITEMS_MAX_COUNT = 128;
3
+ var CODEX_REALTIME_INITIAL_ITEMS_MAX_TOKENS = 8192;
4
+ var CODEX_REALTIME_CONTEXT_APPEND_MAX_BYTES = 500;
5
+ var CODEX_REALTIME_V3_MAX_EVENT_BYTES = 1048576;
6
+ var CODEX_REALTIME_V3_MAX_IDENTIFIER_BYTES = 1024;
7
+ var CODEX_REALTIME_V3_MAX_TEXT_BYTES = 131072;
8
+ function parseCodexRealtimeV3Event(payload) {
9
+ if (utf8ByteLength(payload) > CODEX_REALTIME_V3_MAX_EVENT_BYTES) {
10
+ return failure("oversized_event", null);
11
+ }
12
+ let value;
13
+ try {
14
+ value = JSON.parse(payload);
15
+ } catch {
16
+ return failure("invalid_json", null);
17
+ }
18
+ const event = record(value);
19
+ const typeField = boundedStringField(event, "type", CODEX_REALTIME_V3_MAX_IDENTIFIER_BYTES);
20
+ if (typeField.oversized) return failure("oversized_field", null);
21
+ const type = typeField.value;
22
+ if (!type) return failure("missing_type", null);
23
+ const providerEventIdField = firstBoundedStringField(
24
+ event,
25
+ ["event_id", "id"],
26
+ CODEX_REALTIME_V3_MAX_IDENTIFIER_BYTES
27
+ );
28
+ if (providerEventIdField.oversized) return failure("oversized_field", type);
29
+ const providerEventId = providerEventIdField.value ?? null;
30
+ if (type === "session.started" || type === "session.updated") {
31
+ const session = record(event.session);
32
+ const sessionIdField = boundedStringField(
33
+ session,
34
+ "id",
35
+ CODEX_REALTIME_V3_MAX_IDENTIFIER_BYTES
36
+ );
37
+ const instructionsField = boundedStringField(
38
+ session,
39
+ "instructions",
40
+ CODEX_REALTIME_V3_MAX_TEXT_BYTES
41
+ );
42
+ if (sessionIdField.oversized || instructionsField.oversized) {
43
+ return failure("oversized_field", type);
44
+ }
45
+ const sessionId = sessionIdField.value;
46
+ if (!sessionId) return failure("invalid_shape", type);
47
+ return {
48
+ ok: true,
49
+ event: {
50
+ type,
51
+ providerEventId,
52
+ sessionId,
53
+ instructions: instructionsField.value ?? null
54
+ }
55
+ };
56
+ }
57
+ if (type === "input_transcript.added" || type === "output_transcript.added") {
58
+ const item = record(event.item);
59
+ const itemIdField = boundedStringField(item, "id", CODEX_REALTIME_V3_MAX_IDENTIFIER_BYTES);
60
+ const textField = boundedStringField(item, "text", CODEX_REALTIME_V3_MAX_TEXT_BYTES);
61
+ if (itemIdField.oversized || textField.oversized) {
62
+ return failure("oversized_field", type);
63
+ }
64
+ const text = textField.value;
65
+ if (text === void 0) return failure("invalid_shape", type);
66
+ return {
67
+ ok: true,
68
+ event: {
69
+ type,
70
+ providerEventId,
71
+ itemId: itemIdField.value ?? null,
72
+ text
73
+ }
74
+ };
75
+ }
76
+ if (type === "output_audio.delta") {
77
+ const audio = stringField(event, "audio");
78
+ if (audio === void 0) return failure("invalid_shape", type);
79
+ return {
80
+ ok: true,
81
+ event: {
82
+ type,
83
+ providerEventId,
84
+ audio,
85
+ startMs: finiteNumberField(event, "start_ms"),
86
+ endMs: finiteNumberField(event, "end_ms")
87
+ }
88
+ };
89
+ }
90
+ if (type === "turn.done") {
91
+ const turn = record(event.turn);
92
+ const turnIdField = boundedStringField(turn, "id", CODEX_REALTIME_V3_MAX_IDENTIFIER_BYTES);
93
+ const transcriptField = boundedStringField(
94
+ turn,
95
+ "transcript",
96
+ CODEX_REALTIME_V3_MAX_TEXT_BYTES
97
+ );
98
+ if (turnIdField.oversized || transcriptField.oversized) {
99
+ return failure("oversized_field", type);
100
+ }
101
+ const turnId = turnIdField.value;
102
+ const role = stringField(turn, "role");
103
+ const transcript = transcriptField.value;
104
+ if (!turnId || role !== "user" && role !== "assistant" || transcript === void 0) {
105
+ return failure("invalid_shape", type);
106
+ }
107
+ return {
108
+ ok: true,
109
+ event: { type, providerEventId, turnId, role, transcript }
110
+ };
111
+ }
112
+ if (type === "delegation.created") {
113
+ const item = record(event.item);
114
+ const delegationItemIdField = boundedStringField(
115
+ item,
116
+ "id",
117
+ CODEX_REALTIME_V3_MAX_IDENTIFIER_BYTES
118
+ );
119
+ if (delegationItemIdField.oversized) return failure("oversized_field", type);
120
+ const delegationItemId = delegationItemIdField.value;
121
+ if (!delegationItemId || stringField(item, "type") !== "delegation" || stringField(item, "target") !== "client" || !Array.isArray(item.content)) {
122
+ return failure("invalid_shape", type);
123
+ }
124
+ const inputParts = [];
125
+ let inputBytes = 0;
126
+ for (const rawContent of item.content) {
127
+ const content = record(rawContent);
128
+ if (stringField(content, "type") !== "input_text") continue;
129
+ const textField = boundedStringField(content, "text", CODEX_REALTIME_V3_MAX_TEXT_BYTES);
130
+ if (textField.oversized) return failure("oversized_field", type);
131
+ const text = textField.value ?? "";
132
+ inputBytes += utf8ByteLength(text);
133
+ if (inputBytes > CODEX_REALTIME_V3_MAX_TEXT_BYTES) {
134
+ return failure("oversized_field", type);
135
+ }
136
+ inputParts.push(text);
137
+ }
138
+ const inputTranscript = inputParts.join("");
139
+ return {
140
+ ok: true,
141
+ event: {
142
+ type,
143
+ providerEventId,
144
+ delegationItemId,
145
+ inputTranscript,
146
+ offsetMs: finiteNumberField(event, "offset_ms")
147
+ }
148
+ };
149
+ }
150
+ if (type === "error") {
151
+ const nested = record(event.error);
152
+ const message = stringField(event, "message") ?? stringField(nested, "message") ?? (event.error === void 0 ? void 0 : JSON.stringify(event.error));
153
+ if (message === void 0) return failure("invalid_shape", type);
154
+ if (utf8ByteLength(message) > CODEX_REALTIME_V3_MAX_TEXT_BYTES) {
155
+ return failure("oversized_field", type);
156
+ }
157
+ return { ok: true, event: { type, providerEventId, message } };
158
+ }
159
+ return failure("unsupported_type", type);
160
+ }
161
+ function encodeCodexRealtimeV3DelegationContextAppend(input) {
162
+ return contextAppendChunks(input.text).map((text) => ({
163
+ type: "delegation.context.append",
164
+ delegation_item_id: input.delegationItemId,
165
+ ...input.channel ? { channel: input.channel } : {},
166
+ content: [{ type: "input_text", text }]
167
+ }));
168
+ }
169
+ function encodeCodexRealtimeV3SessionContextAppend(input) {
170
+ return contextAppendChunks(input.text).map((text) => ({
171
+ type: "session.context.append",
172
+ ...input.channel ? { channel: input.channel } : {},
173
+ content: [{ type: "input_text", text }]
174
+ }));
175
+ }
176
+ function contextAppendChunks(text) {
177
+ if (utf8ByteLength(text) <= CODEX_REALTIME_CONTEXT_APPEND_MAX_BYTES) return [text];
178
+ const chunks = [];
179
+ let chunk = "";
180
+ let bytes = 0;
181
+ for (const character of text) {
182
+ const characterBytes = utf8ByteLength(character);
183
+ if (bytes + characterBytes > CODEX_REALTIME_CONTEXT_APPEND_MAX_BYTES && chunk) {
184
+ chunks.push(chunk);
185
+ chunk = "";
186
+ bytes = 0;
187
+ }
188
+ chunk += character;
189
+ bytes += characterBytes;
190
+ }
191
+ if (chunk || text.length === 0) chunks.push(chunk);
192
+ return chunks;
193
+ }
194
+ function utf8ByteLength(value) {
195
+ return new TextEncoder().encode(value).byteLength;
196
+ }
197
+ function failure(reason, eventType) {
198
+ return { ok: false, reason, eventType };
199
+ }
200
+ function record(value) {
201
+ return value !== null && typeof value === "object" && !Array.isArray(value) ? value : {};
202
+ }
203
+ function stringField(value, key) {
204
+ return typeof value[key] === "string" ? value[key] : void 0;
205
+ }
206
+ function boundedStringField(value, key, maxBytes) {
207
+ const candidate = stringField(value, key);
208
+ return {
209
+ value: candidate,
210
+ oversized: candidate !== void 0 && utf8ByteLength(candidate) > maxBytes
211
+ };
212
+ }
213
+ function firstBoundedStringField(value, keys, maxBytes) {
214
+ for (const key of keys) {
215
+ if (typeof value[key] === "string") return boundedStringField(value, key, maxBytes);
216
+ }
217
+ return { value: void 0, oversized: false };
218
+ }
219
+ function finiteNumberField(value, key) {
220
+ const candidate = value[key];
221
+ return typeof candidate === "number" && Number.isFinite(candidate) ? candidate : null;
222
+ }
223
+
224
+ export {
225
+ CODEX_REALTIME_INITIAL_ITEMS_MAX_COUNT,
226
+ CODEX_REALTIME_INITIAL_ITEMS_MAX_TOKENS,
227
+ CODEX_REALTIME_CONTEXT_APPEND_MAX_BYTES,
228
+ CODEX_REALTIME_V3_MAX_EVENT_BYTES,
229
+ CODEX_REALTIME_V3_MAX_IDENTIFIER_BYTES,
230
+ CODEX_REALTIME_V3_MAX_TEXT_BYTES,
231
+ parseCodexRealtimeV3Event,
232
+ encodeCodexRealtimeV3DelegationContextAppend,
233
+ encodeCodexRealtimeV3SessionContextAppend,
234
+ contextAppendChunks
235
+ };
236
+ //# sourceMappingURL=chunk-MFVGCR3N.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/realtime-v3.ts"],"sourcesContent":["/**\n * Codex GPT-Live Frameless Bidi (V3) wire adapter.\n *\n * These shapes are pinned to openai/codex@fa1d4c40. V3 delegates work with\n * `delegation.created`; it does not expose the ordinary Realtime V2\n * `function_call` protocol.\n */\n\nexport const CODEX_REALTIME_INITIAL_ITEMS_MAX_COUNT = 128;\nexport const CODEX_REALTIME_INITIAL_ITEMS_MAX_TOKENS = 8_192;\nexport const CODEX_REALTIME_CONTEXT_APPEND_MAX_BYTES = 500;\nexport const CODEX_REALTIME_V3_MAX_EVENT_BYTES = 1_048_576;\nexport const CODEX_REALTIME_V3_MAX_IDENTIFIER_BYTES = 1_024;\nexport const CODEX_REALTIME_V3_MAX_TEXT_BYTES = 131_072;\n\nexport type CodexRealtimeInitialItem = {\n role: \"user\" | \"developer\" | \"assistant\";\n text: string;\n};\n\ntype ProviderEventIdentity = {\n providerEventId: string | null;\n};\n\nexport type CodexRealtimeV3Event =\n | (ProviderEventIdentity & {\n type: \"session.started\" | \"session.updated\";\n sessionId: string;\n instructions: string | null;\n })\n | (ProviderEventIdentity & {\n type: \"input_transcript.added\" | \"output_transcript.added\";\n itemId: string | null;\n text: string;\n })\n | (ProviderEventIdentity & {\n type: \"output_audio.delta\";\n audio: string;\n startMs: number | null;\n endMs: number | null;\n })\n | (ProviderEventIdentity & {\n type: \"turn.done\";\n turnId: string;\n role: \"user\" | \"assistant\";\n transcript: string;\n })\n | (ProviderEventIdentity & {\n type: \"delegation.created\";\n delegationItemId: string;\n inputTranscript: string;\n offsetMs: number | null;\n })\n | (ProviderEventIdentity & {\n type: \"error\";\n message: string;\n });\n\nexport type CodexRealtimeV3ParseFailure = {\n ok: false;\n reason:\n | \"invalid_json\"\n | \"missing_type\"\n | \"unsupported_type\"\n | \"invalid_shape\"\n | \"oversized_event\"\n | \"oversized_field\";\n eventType: string | null;\n};\n\nexport type CodexRealtimeV3ParseResult =\n | { ok: true; event: CodexRealtimeV3Event }\n | CodexRealtimeV3ParseFailure;\n\nexport type CodexRealtimeV3ContextAppendChannel = \"speakable\" | \"commentary\";\n\nexport type CodexRealtimeV3DelegationContextAppend = {\n type: \"delegation.context.append\";\n delegation_item_id: string;\n channel?: CodexRealtimeV3ContextAppendChannel | undefined;\n content: Array<{ type: \"input_text\"; text: string }>;\n};\n\nexport type CodexRealtimeV3SessionContextAppend = {\n type: \"session.context.append\";\n channel?: CodexRealtimeV3ContextAppendChannel | undefined;\n content: Array<{ type: \"input_text\"; text: string }>;\n};\n\nexport function parseCodexRealtimeV3Event(payload: string): CodexRealtimeV3ParseResult {\n if (utf8ByteLength(payload) > CODEX_REALTIME_V3_MAX_EVENT_BYTES) {\n return failure(\"oversized_event\", null);\n }\n let value: unknown;\n try {\n value = JSON.parse(payload);\n } catch {\n return failure(\"invalid_json\", null);\n }\n const event = record(value);\n const typeField = boundedStringField(event, \"type\", CODEX_REALTIME_V3_MAX_IDENTIFIER_BYTES);\n if (typeField.oversized) return failure(\"oversized_field\", null);\n const type = typeField.value;\n if (!type) return failure(\"missing_type\", null);\n const providerEventIdField = firstBoundedStringField(\n event,\n [\"event_id\", \"id\"],\n CODEX_REALTIME_V3_MAX_IDENTIFIER_BYTES,\n );\n if (providerEventIdField.oversized) return failure(\"oversized_field\", type);\n const providerEventId = providerEventIdField.value ?? null;\n\n if (type === \"session.started\" || type === \"session.updated\") {\n const session = record(event.session);\n const sessionIdField = boundedStringField(\n session,\n \"id\",\n CODEX_REALTIME_V3_MAX_IDENTIFIER_BYTES,\n );\n const instructionsField = boundedStringField(\n session,\n \"instructions\",\n CODEX_REALTIME_V3_MAX_TEXT_BYTES,\n );\n if (sessionIdField.oversized || instructionsField.oversized) {\n return failure(\"oversized_field\", type);\n }\n const sessionId = sessionIdField.value;\n if (!sessionId) return failure(\"invalid_shape\", type);\n return {\n ok: true,\n event: {\n type,\n providerEventId,\n sessionId,\n instructions: instructionsField.value ?? null,\n },\n };\n }\n\n if (type === \"input_transcript.added\" || type === \"output_transcript.added\") {\n const item = record(event.item);\n const itemIdField = boundedStringField(item, \"id\", CODEX_REALTIME_V3_MAX_IDENTIFIER_BYTES);\n const textField = boundedStringField(item, \"text\", CODEX_REALTIME_V3_MAX_TEXT_BYTES);\n if (itemIdField.oversized || textField.oversized) {\n return failure(\"oversized_field\", type);\n }\n const text = textField.value;\n if (text === undefined) return failure(\"invalid_shape\", type);\n return {\n ok: true,\n event: {\n type,\n providerEventId,\n itemId: itemIdField.value ?? null,\n text,\n },\n };\n }\n\n if (type === \"output_audio.delta\") {\n const audio = stringField(event, \"audio\");\n if (audio === undefined) return failure(\"invalid_shape\", type);\n return {\n ok: true,\n event: {\n type,\n providerEventId,\n audio,\n startMs: finiteNumberField(event, \"start_ms\"),\n endMs: finiteNumberField(event, \"end_ms\"),\n },\n };\n }\n\n if (type === \"turn.done\") {\n const turn = record(event.turn);\n const turnIdField = boundedStringField(turn, \"id\", CODEX_REALTIME_V3_MAX_IDENTIFIER_BYTES);\n const transcriptField = boundedStringField(\n turn,\n \"transcript\",\n CODEX_REALTIME_V3_MAX_TEXT_BYTES,\n );\n if (turnIdField.oversized || transcriptField.oversized) {\n return failure(\"oversized_field\", type);\n }\n const turnId = turnIdField.value;\n const role = stringField(turn, \"role\");\n const transcript = transcriptField.value;\n if (!turnId || (role !== \"user\" && role !== \"assistant\") || transcript === undefined) {\n return failure(\"invalid_shape\", type);\n }\n return {\n ok: true,\n event: { type, providerEventId, turnId, role, transcript },\n };\n }\n\n if (type === \"delegation.created\") {\n const item = record(event.item);\n const delegationItemIdField = boundedStringField(\n item,\n \"id\",\n CODEX_REALTIME_V3_MAX_IDENTIFIER_BYTES,\n );\n if (delegationItemIdField.oversized) return failure(\"oversized_field\", type);\n const delegationItemId = delegationItemIdField.value;\n if (\n !delegationItemId ||\n stringField(item, \"type\") !== \"delegation\" ||\n stringField(item, \"target\") !== \"client\" ||\n !Array.isArray(item.content)\n ) {\n return failure(\"invalid_shape\", type);\n }\n const inputParts: string[] = [];\n let inputBytes = 0;\n for (const rawContent of item.content) {\n const content = record(rawContent);\n if (stringField(content, \"type\") !== \"input_text\") continue;\n const textField = boundedStringField(content, \"text\", CODEX_REALTIME_V3_MAX_TEXT_BYTES);\n if (textField.oversized) return failure(\"oversized_field\", type);\n const text = textField.value ?? \"\";\n inputBytes += utf8ByteLength(text);\n if (inputBytes > CODEX_REALTIME_V3_MAX_TEXT_BYTES) {\n return failure(\"oversized_field\", type);\n }\n inputParts.push(text);\n }\n const inputTranscript = inputParts.join(\"\");\n return {\n ok: true,\n event: {\n type,\n providerEventId,\n delegationItemId,\n inputTranscript,\n offsetMs: finiteNumberField(event, \"offset_ms\"),\n },\n };\n }\n\n if (type === \"error\") {\n const nested = record(event.error);\n const message =\n stringField(event, \"message\") ??\n stringField(nested, \"message\") ??\n (event.error === undefined ? undefined : JSON.stringify(event.error));\n if (message === undefined) return failure(\"invalid_shape\", type);\n if (utf8ByteLength(message) > CODEX_REALTIME_V3_MAX_TEXT_BYTES) {\n return failure(\"oversized_field\", type);\n }\n return { ok: true, event: { type, providerEventId, message } };\n }\n\n return failure(\"unsupported_type\", type);\n}\n\nexport function encodeCodexRealtimeV3DelegationContextAppend(input: {\n delegationItemId: string;\n text: string;\n channel?: CodexRealtimeV3ContextAppendChannel | undefined;\n}): CodexRealtimeV3DelegationContextAppend[] {\n return contextAppendChunks(input.text).map((text) => ({\n type: \"delegation.context.append\",\n delegation_item_id: input.delegationItemId,\n ...(input.channel ? { channel: input.channel } : {}),\n content: [{ type: \"input_text\", text }],\n }));\n}\n\nexport function encodeCodexRealtimeV3SessionContextAppend(input: {\n text: string;\n channel?: CodexRealtimeV3ContextAppendChannel | undefined;\n}): CodexRealtimeV3SessionContextAppend[] {\n return contextAppendChunks(input.text).map((text) => ({\n type: \"session.context.append\",\n ...(input.channel ? { channel: input.channel } : {}),\n content: [{ type: \"input_text\", text }],\n }));\n}\n\nexport function contextAppendChunks(text: string): string[] {\n if (utf8ByteLength(text) <= CODEX_REALTIME_CONTEXT_APPEND_MAX_BYTES) return [text];\n const chunks: string[] = [];\n let chunk = \"\";\n let bytes = 0;\n for (const character of text) {\n const characterBytes = utf8ByteLength(character);\n if (bytes + characterBytes > CODEX_REALTIME_CONTEXT_APPEND_MAX_BYTES && chunk) {\n chunks.push(chunk);\n chunk = \"\";\n bytes = 0;\n }\n chunk += character;\n bytes += characterBytes;\n }\n if (chunk || text.length === 0) chunks.push(chunk);\n return chunks;\n}\n\nfunction utf8ByteLength(value: string): number {\n return new TextEncoder().encode(value).byteLength;\n}\n\nfunction failure(\n reason: CodexRealtimeV3ParseFailure[\"reason\"],\n eventType: string | null,\n): CodexRealtimeV3ParseFailure {\n return { ok: false, reason, eventType };\n}\n\nfunction record(value: unknown): Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {};\n}\n\nfunction stringField(value: Record<string, unknown>, key: string): string | undefined {\n return typeof value[key] === \"string\" ? value[key] : undefined;\n}\n\nfunction boundedStringField(\n value: Record<string, unknown>,\n key: string,\n maxBytes: number,\n): { value: string | undefined; oversized: boolean } {\n const candidate = stringField(value, key);\n return {\n value: candidate,\n oversized: candidate !== undefined && utf8ByteLength(candidate) > maxBytes,\n };\n}\n\nfunction firstBoundedStringField(\n value: Record<string, unknown>,\n keys: readonly string[],\n maxBytes: number,\n): { value: string | undefined; oversized: boolean } {\n for (const key of keys) {\n if (typeof value[key] === \"string\") return boundedStringField(value, key, maxBytes);\n }\n return { value: undefined, oversized: false };\n}\n\nfunction finiteNumberField(value: Record<string, unknown>, key: string): number | null {\n const candidate = value[key];\n return typeof candidate === \"number\" && Number.isFinite(candidate) ? candidate : null;\n}\n"],"mappings":"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","names":[]}
@@ -17,7 +17,11 @@ export declare const CODEX_EFFECTIVE_CONTEXT_WINDOW_PERCENT = 95;
17
17
  export declare const CODEX_MODEL_EFFECTIVE_CONTEXT_WINDOW_TOKENS: number;
18
18
  export declare const CODEX_AUTO_COMPACTION_PERCENT = 90;
19
19
  export declare const CODEX_MODEL_AUTO_COMPACT_TOKEN_LIMIT: number;
20
- export declare const CODEX_CLIENT_VERSION = "0.144.6";
20
+ export declare const CODEX_CLIENT_VERSION = "0.145.0";
21
+ export declare const CODEX_REALTIME_MODEL = "gpt-live-1-boulder-alpha";
22
+ export declare const CODEX_REALTIME_VERSION = "v3";
23
+ export declare const CODEX_REALTIME_DEFAULT_VOICE = "cove";
24
+ export declare const CODEX_REALTIME_CALL_TIMEOUT_MS = 15000;
21
25
  export declare const CODEX_REFRESH_WINDOW_MS: number;
22
26
  export declare const CODEX_REFRESH_FALLBACK_MS: number;
23
27
  export declare const CODEX_RESPONSE_HEADERS_TIMEOUT_MS: number;
package/dist/constants.js CHANGED
@@ -21,6 +21,10 @@ import {
21
21
  CODEX_ORIGINATOR,
22
22
  CODEX_PROVIDER_BASE_URL,
23
23
  CODEX_PROVIDER_ID,
24
+ CODEX_REALTIME_CALL_TIMEOUT_MS,
25
+ CODEX_REALTIME_DEFAULT_VOICE,
26
+ CODEX_REALTIME_MODEL,
27
+ CODEX_REALTIME_VERSION,
24
28
  CODEX_REFRESH_FALLBACK_MS,
25
29
  CODEX_REFRESH_WINDOW_MS,
26
30
  CODEX_RESPONSES_BASE,
@@ -32,7 +36,7 @@ import {
32
36
  CODEX_RESPONSE_WHOLE_TIMEOUT_MS,
33
37
  CODEX_TOKEN_URL,
34
38
  CODEX_WHAM_BASE
35
- } from "./chunk-YGKQDUY7.js";
39
+ } from "./chunk-HT463QWA.js";
36
40
  export {
37
41
  CODEX_APPS_MCP_SERVER_ID,
38
42
  CODEX_APPS_MCP_SERVER_NAME,
@@ -56,6 +60,10 @@ export {
56
60
  CODEX_ORIGINATOR,
57
61
  CODEX_PROVIDER_BASE_URL,
58
62
  CODEX_PROVIDER_ID,
63
+ CODEX_REALTIME_CALL_TIMEOUT_MS,
64
+ CODEX_REALTIME_DEFAULT_VOICE,
65
+ CODEX_REALTIME_MODEL,
66
+ CODEX_REALTIME_VERSION,
59
67
  CODEX_REFRESH_FALLBACK_MS,
60
68
  CODEX_REFRESH_WINDOW_MS,
61
69
  CODEX_RESPONSES_BASE,
package/dist/index.d.ts CHANGED
@@ -11,3 +11,6 @@ export * from "./response-timeout";
11
11
  export * from "./fetch";
12
12
  export * from "./mcp-sanitize";
13
13
  export * from "./model-output-truncation";
14
+ export * from "./opaque-artifact";
15
+ export * from "./realtime";
16
+ export * from "./realtime-v3";