@opengeni/codex 1.3.0 → 1.4.2

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.
@@ -87,7 +87,7 @@ function parseCodexRealtimeV3Event(payload) {
87
87
  }
88
88
  };
89
89
  }
90
- if (type === "turn.done") {
90
+ if (type === "turn.done" || type === "transcript.segment") {
91
91
  const turn = record(event.turn);
92
92
  const turnIdField = boundedStringField(turn, "id", CODEX_REALTIME_V3_MAX_IDENTIFIER_BYTES);
93
93
  const transcriptField = boundedStringField(
@@ -233,4 +233,4 @@ export {
233
233
  encodeCodexRealtimeV3SessionContextAppend,
234
234
  contextAppendChunks
235
235
  };
236
- //# sourceMappingURL=chunk-MFVGCR3N.js.map
236
+ //# sourceMappingURL=chunk-PZUJ3UPK.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. `transcript.segment` is an application adapter\n * extension for providers that emit fragments without semantic turn boundaries.\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\" | \"transcript.segment\";\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\" || type === \"transcript.segment\") {\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":[]}
package/dist/index.js CHANGED
@@ -52,7 +52,7 @@ import {
52
52
  encodeCodexRealtimeV3DelegationContextAppend,
53
53
  encodeCodexRealtimeV3SessionContextAppend,
54
54
  parseCodexRealtimeV3Event
55
- } from "./chunk-MFVGCR3N.js";
55
+ } from "./chunk-PZUJ3UPK.js";
56
56
 
57
57
  // src/billing.ts
58
58
  function isCodexBilledModel(model) {
@@ -3,7 +3,8 @@
3
3
  *
4
4
  * These shapes are pinned to openai/codex@fa1d4c40. V3 delegates work with
5
5
  * `delegation.created`; it does not expose the ordinary Realtime V2
6
- * `function_call` protocol.
6
+ * `function_call` protocol. `transcript.segment` is an application adapter
7
+ * extension for providers that emit fragments without semantic turn boundaries.
7
8
  */
8
9
  export declare const CODEX_REALTIME_INITIAL_ITEMS_MAX_COUNT = 128;
9
10
  export declare const CODEX_REALTIME_INITIAL_ITEMS_MAX_TOKENS = 8192;
@@ -32,7 +33,7 @@ export type CodexRealtimeV3Event = (ProviderEventIdentity & {
32
33
  startMs: number | null;
33
34
  endMs: number | null;
34
35
  }) | (ProviderEventIdentity & {
35
- type: "turn.done";
36
+ type: "turn.done" | "transcript.segment";
36
37
  turnId: string;
37
38
  role: "user" | "assistant";
38
39
  transcript: string;
@@ -9,7 +9,7 @@ import {
9
9
  encodeCodexRealtimeV3DelegationContextAppend,
10
10
  encodeCodexRealtimeV3SessionContextAppend,
11
11
  parseCodexRealtimeV3Event
12
- } from "./chunk-MFVGCR3N.js";
12
+ } from "./chunk-PZUJ3UPK.js";
13
13
  export {
14
14
  CODEX_REALTIME_CONTEXT_APPEND_MAX_BYTES,
15
15
  CODEX_REALTIME_INITIAL_ITEMS_MAX_COUNT,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opengeni/codex",
3
- "version": "1.3.0",
3
+ "version": "1.4.2",
4
4
  "description": "ChatGPT/Codex subscription auth + transport: device-code login, token refresh, and the Responses-backend fetch. Pure HTTP + transforms; no database dependency.",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -41,8 +41,8 @@
41
41
  "prepublishOnly": "bash ../../scripts/prepublish-guard"
42
42
  },
43
43
  "dependencies": {
44
- "@opengeni/contracts": "1.3.0",
45
- "@opengeni/network": "1.3.0",
44
+ "@opengeni/contracts": "1.4.2",
45
+ "@opengeni/network": "1.4.2",
46
46
  "zod": "^4.2.1"
47
47
  },
48
48
  "engines": {
@@ -3,7 +3,8 @@
3
3
  *
4
4
  * These shapes are pinned to openai/codex@fa1d4c40. V3 delegates work with
5
5
  * `delegation.created`; it does not expose the ordinary Realtime V2
6
- * `function_call` protocol.
6
+ * `function_call` protocol. `transcript.segment` is an application adapter
7
+ * extension for providers that emit fragments without semantic turn boundaries.
7
8
  */
8
9
 
9
10
  export const CODEX_REALTIME_INITIAL_ITEMS_MAX_COUNT = 128;
@@ -40,7 +41,7 @@ export type CodexRealtimeV3Event =
40
41
  endMs: number | null;
41
42
  })
42
43
  | (ProviderEventIdentity & {
43
- type: "turn.done";
44
+ type: "turn.done" | "transcript.segment";
44
45
  turnId: string;
45
46
  role: "user" | "assistant";
46
47
  transcript: string;
@@ -173,7 +174,7 @@ export function parseCodexRealtimeV3Event(payload: string): CodexRealtimeV3Parse
173
174
  };
174
175
  }
175
176
 
176
- if (type === "turn.done") {
177
+ if (type === "turn.done" || type === "transcript.segment") {
177
178
  const turn = record(event.turn);
178
179
  const turnIdField = boundedStringField(turn, "id", CODEX_REALTIME_V3_MAX_IDENTIFIER_BYTES);
179
180
  const transcriptField = boundedStringField(
@@ -1 +0,0 @@
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":[]}