@opengeni/sdk 0.52.1 → 0.57.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.
Files changed (54) hide show
  1. package/README.md +61 -7
  2. package/dist/artifacts.js +5 -5
  3. package/dist/{chunk-V5F253OG.js → chunk-GU6JF75T.js} +6 -3
  4. package/dist/chunk-GU6JF75T.js.map +1 -0
  5. package/dist/{chunk-FRJFNDIR.js → chunk-HJ3HHUT5.js} +5 -1
  6. package/dist/chunk-HJ3HHUT5.js.map +1 -0
  7. package/dist/{chunk-KIHGPM7H.js → chunk-JDLDDRNE.js} +20 -14
  8. package/dist/chunk-JDLDDRNE.js.map +1 -0
  9. package/dist/{chunk-FHI4DFIG.js → chunk-JRPFWI6T.js} +2 -2
  10. package/dist/{chunk-ILQZR5N6.js → chunk-PKQ377ED.js} +693 -34
  11. package/dist/chunk-PKQ377ED.js.map +1 -0
  12. package/dist/{chunk-MZWTWOX6.js → chunk-ST5DDKJP.js} +327 -1
  13. package/dist/chunk-ST5DDKJP.js.map +1 -0
  14. package/dist/{chunk-DXDL7EEW.js → chunk-YKZME56C.js} +197 -113
  15. package/dist/chunk-YKZME56C.js.map +1 -0
  16. package/dist/client.d.ts +106 -16
  17. package/dist/codex-realtime-controller.d.ts +3 -0
  18. package/dist/codex-realtime-controller.js +2 -2
  19. package/dist/core.js +7 -7
  20. package/dist/desktop.d.ts +8 -0
  21. package/dist/editable-artifacts.js +4 -4
  22. package/dist/gateway-realtime-transport.d.ts +1 -0
  23. package/dist/gateway-realtime-transport.js +5 -3
  24. package/dist/index.d.ts +6 -2
  25. package/dist/index.js +68 -34
  26. package/dist/index.js.map +1 -1
  27. package/dist/interaction-revision-stream.d.ts +11 -0
  28. package/dist/interaction.d.ts +604 -5
  29. package/dist/interaction.js +27 -1
  30. package/dist/realtime.d.ts +3 -3
  31. package/dist/realtime.js +11 -7
  32. package/dist/realtime.js.map +1 -1
  33. package/dist/types.d.ts +267 -64
  34. package/dist/workspace-live-stream.d.ts +14 -0
  35. package/package.json +2 -2
  36. package/src/client.ts +861 -60
  37. package/src/codex-realtime-controller.ts +25 -7
  38. package/src/codex-realtime-lifecycle.ts +1 -0
  39. package/src/desktop.ts +11 -1
  40. package/src/errors.ts +16 -2
  41. package/src/gateway-realtime-transport.ts +252 -109
  42. package/src/index.ts +42 -13
  43. package/src/interaction-revision-stream.ts +117 -0
  44. package/src/interaction.ts +1049 -5
  45. package/src/realtime.ts +14 -4
  46. package/src/types.ts +336 -67
  47. package/src/workspace-live-stream.ts +137 -0
  48. package/dist/chunk-DXDL7EEW.js.map +0 -1
  49. package/dist/chunk-FRJFNDIR.js.map +0 -1
  50. package/dist/chunk-ILQZR5N6.js.map +0 -1
  51. package/dist/chunk-KIHGPM7H.js.map +0 -1
  52. package/dist/chunk-MZWTWOX6.js.map +0 -1
  53. package/dist/chunk-V5F253OG.js.map +0 -1
  54. /package/dist/{chunk-FHI4DFIG.js.map → chunk-JRPFWI6T.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/codex-realtime-v3-wire.ts","../src/codex-realtime-v3.ts","../src/codex-realtime.ts","../src/codex-realtime-lifecycle.ts","../src/codex-realtime-controller.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","import {\n encodeCodexRealtimeV3DelegationContextAppend,\n encodeCodexRealtimeV3SessionContextAppend,\n parseCodexRealtimeV3Event,\n} from \"./codex-realtime-v3-wire\";\nimport type { CodexRealtimeV3Event } from \"./codex-realtime-v3-wire\";\nimport type {\n SessionRealtimeInboundEntry,\n SessionRealtimeLedgerEntry,\n SyncSessionRealtimeLedgerRequest,\n SyncSessionRealtimeLedgerResponse,\n} from \"./types\";\n\nexport {\n CODEX_REALTIME_CONTEXT_APPEND_MAX_BYTES,\n CODEX_REALTIME_V3_MAX_EVENT_BYTES,\n CODEX_REALTIME_V3_MAX_IDENTIFIER_BYTES,\n CODEX_REALTIME_V3_MAX_TEXT_BYTES,\n contextAppendChunks,\n encodeCodexRealtimeV3DelegationContextAppend,\n encodeCodexRealtimeV3SessionContextAppend,\n parseCodexRealtimeV3Event,\n} from \"./codex-realtime-v3-wire\";\nexport type {\n CodexRealtimeV3ContextAppendChannel,\n CodexRealtimeV3DelegationContextAppend,\n CodexRealtimeV3Event,\n CodexRealtimeV3ParseFailure,\n CodexRealtimeV3ParseResult,\n CodexRealtimeV3SessionContextAppend,\n} from \"./codex-realtime-v3-wire\";\n\nexport const CODEX_REALTIME_V3_SYNC_MAX_ENTRIES = 64;\nexport const CODEX_REALTIME_V3_PENDING_MAX_ENTRIES = 256;\nexport const CODEX_REALTIME_V3_PENDING_MAX_BYTES = 16 * 1024 * 1024;\nconst REALTIME_DELEGATION_TRANSCRIPT_MAX_BYTES = 65_536;\nconst REALTIME_DELEGATION_INPUT_MAX_BYTES = 65_536;\n\nexport type CodexRealtimeV3BridgeFatal = {\n code: \"pending_overflow\";\n message: string;\n};\n\nexport type CodexRealtimeV3BridgeSnapshot = {\n connectionId: string;\n connectionEpoch: number;\n startupFenceSequence: number;\n modeVersion: number;\n speaking: boolean;\n activeDelegationId: string | null;\n lastError: string | null;\n ignoredEventCount: number;\n lastIgnoredEventType: string | null;\n pendingInbound: number;\n pendingInboundBytes: number;\n clientAckThroughSequence: number | null;\n /** Pinned V3 exposes no provider receipt, so this list is always empty. */\n providerAckSequences: number[];\n providerStarted: boolean;\n fatal: CodexRealtimeV3BridgeFatal | null;\n};\n\nexport type CodexRealtimeV3BridgeOptions = {\n events: RTCDataChannel;\n connectionId: string;\n connectionEpoch: number;\n startupFenceSequence: number;\n modeVersion: number;\n owner: Pick<\n SyncSessionRealtimeLedgerRequest,\n \"browserInstanceId\" | \"ownerKey\" | \"expectedVersion\"\n >;\n sync(request: SyncSessionRealtimeLedgerRequest): Promise<SyncSessionRealtimeLedgerResponse>;\n randomUUID?: (() => string) | undefined;\n /** The controller installs its activation FIFO first, then enables this listener synchronously. */\n listen?: boolean | undefined;\n onSnapshot?: ((snapshot: CodexRealtimeV3BridgeSnapshot) => void) | undefined;\n onFatal?: ((fatal: CodexRealtimeV3BridgeFatal) => void) | undefined;\n};\n\nexport type CodexRealtimeV3Bridge = {\n snapshot(): CodexRealtimeV3BridgeSnapshot;\n ingest(payload: string): Promise<void>;\n flush(): Promise<void>;\n /** Stop accepting provider events, then durably drain everything already parsed. */\n sealAndFlush(): Promise<void>;\n listen(): void;\n close(): void;\n};\n\ntype PendingInbound = {\n entry: SessionRealtimeInboundEntry;\n bytes: number;\n};\n\ntype FinalizedTranscript = {\n role: \"user\" | \"assistant\";\n text: string;\n turnId: string;\n};\n\nexport function createCodexRealtimeV3Bridge(\n options: CodexRealtimeV3BridgeOptions,\n): CodexRealtimeV3Bridge {\n let closed = false;\n let sealed = false;\n let listening = false;\n let speaking = false;\n let activeDelegationId: string | null = null;\n let lastError: string | null = null;\n let ignoredEventCount = 0;\n let lastIgnoredEventType: string | null = null;\n let fatal: CodexRealtimeV3BridgeFatal | null = null;\n let providerStarted:\n | { providerSessionId: string; providerEventId?: string | null | undefined }\n | undefined;\n let providerStartedAccepted = false;\n let clientAckThroughSequence: number | null = null;\n let pendingInbound: PendingInbound[] = [];\n let pendingInboundCount = 0;\n let pendingInboundBytes = 0;\n let flushing: Promise<void> | null = null;\n let flushRequestedWhileRunning = false;\n let forceSync = false;\n const clientReceivedSequences = new Set<number>();\n const sentSequences = new Set<number>();\n const finalizedTurnIds = new Set<string>();\n let transcriptSinceDelegation: FinalizedTranscript[] = [];\n let pendingDelegationUserTranscript: { delegationItemId: string; text: string } | null = null;\n const randomUUID = options.randomUUID ?? defaultRandomUUID;\n\n const snapshot = (): CodexRealtimeV3BridgeSnapshot => ({\n connectionId: options.connectionId,\n connectionEpoch: options.connectionEpoch,\n startupFenceSequence: options.startupFenceSequence,\n modeVersion: options.modeVersion,\n speaking,\n activeDelegationId,\n lastError,\n ignoredEventCount,\n lastIgnoredEventType,\n pendingInbound: pendingInboundCount,\n pendingInboundBytes,\n clientAckThroughSequence,\n providerAckSequences: [],\n providerStarted: providerStartedAccepted,\n fatal,\n });\n const publish = (): void => options.onSnapshot?.(snapshot());\n\n const triggerFatal = (message: string): void => {\n if (closed || fatal) return;\n fatal = { code: \"pending_overflow\", message };\n lastError = message;\n publish();\n try {\n options.onFatal?.({ ...fatal });\n } catch {\n // A consumer callback cannot turn a controlled bridge failure into an\n // unhandled provider-message exception.\n }\n };\n\n const enqueue = (entry: SessionRealtimeInboundEntry): boolean => {\n if (closed || sealed || fatal) return false;\n const bytes = utf8ByteLength(JSON.stringify(entry));\n if (\n pendingInboundCount + 1 > CODEX_REALTIME_V3_PENDING_MAX_ENTRIES ||\n pendingInboundBytes + bytes > CODEX_REALTIME_V3_PENDING_MAX_BYTES\n ) {\n triggerFatal(\"Codex realtime durable event buffer exceeded its hard limit\");\n return false;\n }\n pendingInbound.push({ entry, bytes });\n pendingInboundCount += 1;\n pendingInboundBytes += bytes;\n return true;\n };\n\n const hasWork = (): boolean =>\n pendingInbound.length > 0 ||\n (!providerStartedAccepted && providerStarted !== undefined) ||\n clientAckThroughSequence !== null ||\n forceSync;\n\n const runFlush = async (): Promise<void> => {\n while (true) {\n if (closed || fatal) break;\n const batch = pendingInbound.splice(0, CODEX_REALTIME_V3_SYNC_MAX_ENTRIES);\n const startup = providerStartedAccepted ? undefined : providerStarted;\n const acknowledgedByClient = clientAckThroughSequence;\n const poll = forceSync;\n forceSync = false;\n flushRequestedWhileRunning = false;\n if (batch.length === 0 && !startup && acknowledgedByClient === null && !poll) break;\n\n let result: SyncSessionRealtimeLedgerResponse;\n try {\n result = await options.sync({\n ...options.owner,\n connectionId: options.connectionId,\n connectionEpoch: options.connectionEpoch,\n ...(batch.length === 0 ? {} : { entries: batch.map(({ entry }) => entry) }),\n ...(startup ? { providerStarted: startup } : {}),\n ...(acknowledgedByClient === null\n ? {}\n : { clientAckThroughSequence: acknowledgedByClient }),\n });\n } catch (error) {\n // Entries that were in flight retain their accounting and return ahead\n // of every arrival accepted while the request was pending.\n pendingInbound = [...batch, ...pendingInbound];\n throw error;\n }\n\n for (const item of batch) {\n pendingInboundCount -= 1;\n pendingInboundBytes -= item.bytes;\n }\n if (startup && providerStarted === startup) providerStartedAccepted = true;\n if (\n acknowledgedByClient !== null &&\n clientAckThroughSequence !== null &&\n clientAckThroughSequence <= acknowledgedByClient\n ) {\n clientAckThroughSequence = null;\n }\n if (closed || fatal) break;\n\n for (const entry of result.outbound) {\n // This is OpenGeni's durable browser-delivery acknowledgment. The\n // provider send below remains at-least-once because pinned V3 exposes\n // no provider receipt and providerAckSequences is never populated.\n if (entry.clientAckedAt === null && !clientReceivedSequences.has(entry.sequence)) {\n clientReceivedSequences.add(entry.sequence);\n clientAckThroughSequence = Math.max(clientAckThroughSequence ?? 0, entry.sequence);\n }\n }\n for (let index = 0; index < result.outbound.length;) {\n const entry = result.outbound[index]!;\n if (sentSequences.has(entry.sequence)) {\n index += 1;\n continue;\n }\n if (entry.kind === \"delegation_progress\" && entry.delegationItemId) {\n const progress: SessionRealtimeLedgerEntry[] = [];\n while (index < result.outbound.length) {\n const candidate = result.outbound[index]!;\n if (\n candidate.kind !== \"delegation_progress\" ||\n candidate.delegationItemId !== entry.delegationItemId\n ) {\n break;\n }\n if (!sentSequences.has(candidate.sequence)) progress.push(candidate);\n index += 1;\n }\n sendDelegationProgress(options.events, entry.delegationItemId, progress);\n for (const candidate of progress) sentSequences.add(candidate.sequence);\n continue;\n }\n sendOutbound(options.events, entry);\n sentSequences.add(entry.sequence);\n if (\n entry.kind === \"session_update\" &&\n entry.payload.source === \"human_input\" &&\n entry.payload.delivery === \"steer\"\n ) {\n // The session continues under the human's new direction. The typed\n // session update above is all the provider needs; this only keeps the\n // local diagnostic from claiming the prior delegation is still live.\n activeDelegationId = null;\n }\n if (\n (entry.kind === \"delegation_result\" || entry.kind === \"error\") &&\n entry.delegationItemId === activeDelegationId\n ) {\n activeDelegationId = null;\n }\n index += 1;\n }\n publish();\n }\n };\n\n const requestFlush = (poll: boolean): Promise<void> => {\n if (closed || fatal) return Promise.resolve();\n if (poll) forceSync = true;\n if (flushing) {\n flushRequestedWhileRunning = true;\n return flushing;\n }\n const task = Promise.resolve()\n .then(runFlush)\n .catch((error: unknown) => {\n lastError = safeError(error);\n publish();\n throw error;\n });\n flushing = task;\n void task.then(\n () => {\n if (flushing !== task) return;\n flushing = null;\n if (!closed && !fatal && (flushRequestedWhileRunning || hasWork())) {\n flushRequestedWhileRunning = false;\n void requestFlush(false).catch(() => undefined);\n }\n },\n () => {\n if (flushing === task) flushing = null;\n },\n );\n return task;\n };\n\n const ingest = (payload: string): Promise<void> => {\n if (closed || sealed || fatal) return Promise.resolve();\n const parsed = parseCodexRealtimeV3Event(payload);\n if (!parsed.ok) {\n if (parsed.reason === \"unsupported_type\") {\n ignoredEventCount += 1;\n lastIgnoredEventType = parsed.eventType;\n publish();\n return Promise.resolve();\n }\n lastError = `Rejected Codex realtime V3 event: ${parsed.reason}`;\n publish();\n return Promise.resolve();\n }\n const event = parsed.event;\n let durable = false;\n if (event.type === \"session.started\") {\n if (!providerStartedAccepted && providerStarted === undefined) {\n providerStarted = {\n providerSessionId: event.sessionId,\n providerEventId: event.providerEventId,\n };\n durable = true;\n }\n } else if (\n event.type === \"input_transcript.added\" ||\n event.type === \"output_transcript.added\"\n ) {\n // These events are provider UI deltas. `turn.done` is the single\n // authoritative finalized transcript persisted below.\n } else if (event.type === \"delegation.created\") {\n activeDelegationId = event.delegationItemId;\n const transcript = delegationTranscript(transcriptSinceDelegation, event.inputTranscript);\n const coveredTurnIds = transcriptSinceDelegation.map((entry) => entry.turnId);\n durable = enqueue({\n operationId: randomUUID(),\n kind: \"delegation_call\",\n providerEventId: event.providerEventId,\n delegationItemId: event.delegationItemId,\n text: renderRealtimeDelegationInput(event.inputTranscript, transcript),\n payload: {\n offsetMs: event.offsetMs,\n inputTranscript: event.inputTranscript,\n transcriptFenceTurnIds: coveredTurnIds,\n },\n });\n if (durable) {\n const alreadyFinalized = transcriptSinceDelegation.some(\n (entry) =>\n entry.role === \"user\" &&\n normalizedTranscript(entry.text) === normalizedTranscript(event.inputTranscript),\n );\n pendingDelegationUserTranscript = alreadyFinalized\n ? null\n : { delegationItemId: event.delegationItemId, text: event.inputTranscript };\n transcriptSinceDelegation = [];\n }\n } else if (event.type === \"output_audio.delta\") {\n speaking = true;\n } else if (event.type === \"turn.done\") {\n speaking = false;\n if (event.transcript.length > 0 && !finalizedTurnIds.has(event.turnId)) {\n const coveredByDelegationItemId =\n event.role === \"user\" &&\n pendingDelegationUserTranscript !== null &&\n normalizedTranscript(event.transcript) ===\n normalizedTranscript(pendingDelegationUserTranscript.text)\n ? pendingDelegationUserTranscript.delegationItemId\n : null;\n durable = enqueue(finalTranscript(randomUUID, event, coveredByDelegationItemId));\n if (durable) {\n finalizedTurnIds.add(event.turnId);\n if (coveredByDelegationItemId) {\n pendingDelegationUserTranscript = null;\n } else {\n transcriptSinceDelegation.push({\n role: event.role,\n text: event.transcript,\n turnId: event.turnId,\n });\n }\n }\n }\n } else if (event.type === \"error\") {\n lastError = event.message;\n durable = enqueue({\n operationId: randomUUID(),\n kind: \"error\",\n providerEventId: event.providerEventId,\n text: event.message,\n });\n }\n publish();\n return durable ? requestFlush(false) : Promise.resolve();\n };\n\n const onMessage = (message: MessageEvent): void => {\n if (typeof message.data !== \"string\") return;\n void ingest(message.data).catch(() => undefined);\n };\n const listen = (): void => {\n if (closed || sealed || listening) return;\n listening = true;\n options.events.addEventListener(\"message\", onMessage);\n };\n if (options.listen !== false) listen();\n publish();\n return {\n snapshot,\n ingest,\n flush: () => requestFlush(true),\n sealAndFlush: async () => {\n if (closed) return;\n sealed = true;\n if (listening) options.events.removeEventListener(\"message\", onMessage);\n listening = false;\n await requestFlush(true);\n },\n listen,\n close: () => {\n if (closed) return;\n closed = true;\n if (listening) options.events.removeEventListener(\"message\", onMessage);\n listening = false;\n },\n };\n}\n\nfunction finalTranscript(\n randomUUID: () => string,\n event: Extract<CodexRealtimeV3Event, { type: \"turn.done\" }>,\n coveredByDelegationItemId: string | null,\n): SessionRealtimeInboundEntry {\n return {\n operationId: randomUUID(),\n kind: event.role === \"user\" ? \"user_transcript\" : \"assistant_transcript\",\n providerEventId: event.providerEventId,\n text: event.transcript,\n payload: {\n turnId: event.turnId,\n ...(coveredByDelegationItemId ? { coveredByDelegationItemId } : {}),\n },\n };\n}\n\nfunction delegationTranscript(\n entries: readonly FinalizedTranscript[],\n inputTranscript: string,\n): FinalizedTranscript[] {\n const selected = [...entries];\n const normalizedInput = normalizedTranscript(inputTranscript);\n for (let index = selected.length - 1; index >= 0; index -= 1) {\n const entry = selected[index];\n if (\n entry?.role === \"user\" &&\n normalizedInput.length > 0 &&\n normalizedTranscript(entry.text) === normalizedInput\n ) {\n selected.splice(index, 1);\n break;\n }\n }\n const bounded: FinalizedTranscript[] = [];\n let bytes = 0;\n for (let index = selected.length - 1; index >= 0; index -= 1) {\n const entry = selected[index]!;\n const line = `${entry.role}: ${entry.text}`;\n const lineBytes = utf8ByteLength(line) + (bounded.length > 0 ? 1 : 0);\n if (bytes + lineBytes > REALTIME_DELEGATION_TRANSCRIPT_MAX_BYTES) break;\n bounded.unshift(entry);\n bytes += lineBytes;\n }\n return bounded;\n}\n\nfunction renderRealtimeDelegationInput(\n inputTranscript: string,\n transcript: readonly FinalizedTranscript[],\n): string {\n const input = takeUtf8Head(inputTranscript, REALTIME_DELEGATION_INPUT_MAX_BYTES);\n const transcriptDelta = transcript.map((entry) => `${entry.role}: ${entry.text}`).join(\"\\n\");\n return [\n \"<realtime_delegation>\",\n ` <input>${escapeXmlText(input)}</input>`,\n ...(transcriptDelta\n ? [` <transcript_delta>${escapeXmlText(transcriptDelta)}</transcript_delta>`]\n : []),\n \"</realtime_delegation>\",\n ].join(\"\\n\");\n}\n\nfunction normalizedTranscript(value: string): string {\n return value.trim().replaceAll(/\\s+/g, \" \");\n}\n\nfunction takeUtf8Head(value: string, maximumBytes: number): string {\n const bytes = new TextEncoder().encode(value);\n if (bytes.length <= maximumBytes) return value;\n let end = maximumBytes;\n while (end > 0 && (bytes[end]! & 0xc0) === 0x80) end -= 1;\n return new TextDecoder().decode(bytes.subarray(0, end));\n}\n\nfunction escapeXmlText(value: string): string {\n return value.replaceAll(\"&\", \"&amp;\").replaceAll(\"<\", \"&lt;\").replaceAll(\">\", \"&gt;\");\n}\n\nfunction sendOutbound(events: RTCDataChannel, entry: SessionRealtimeLedgerEntry): void {\n if (events.readyState !== \"open\") throw new Error(\"Codex realtime data channel is not open\");\n const text = entry.text ?? JSON.stringify(entry.payload);\n const payloadChannel =\n entry.payload.channel === \"speakable\" || entry.payload.channel === \"commentary\"\n ? entry.payload.channel\n : entry.payload.channel === null\n ? undefined\n : entry.kind === \"session_update\"\n ? \"commentary\"\n : undefined;\n const messages =\n (entry.kind === \"delegation_result\" || entry.kind === \"error\") && entry.delegationItemId\n ? encodeCodexRealtimeV3DelegationContextAppend({\n delegationItemId: entry.delegationItemId,\n text,\n channel: payloadChannel ?? \"speakable\",\n })\n : encodeCodexRealtimeV3SessionContextAppend({ text, channel: payloadChannel });\n for (const message of messages) events.send(JSON.stringify(message));\n}\n\nfunction sendDelegationProgress(\n events: RTCDataChannel,\n delegationItemId: string,\n entries: SessionRealtimeLedgerEntry[],\n): void {\n if (entries.length === 0) return;\n if (events.readyState !== \"open\") throw new Error(\"Codex realtime data channel is not open\");\n const text = entries.map((entry) => entry.text ?? \"\").join(\"\");\n if (text.length === 0) return;\n for (const message of encodeCodexRealtimeV3DelegationContextAppend({\n delegationItemId,\n text,\n channel: \"commentary\",\n })) {\n events.send(JSON.stringify(message));\n }\n}\n\nfunction utf8ByteLength(value: string): number {\n return new TextEncoder().encode(value).byteLength;\n}\n\nfunction defaultRandomUUID(): string {\n if (!globalThis.crypto?.randomUUID) throw new Error(\"crypto.randomUUID is unavailable\");\n return globalThis.crypto.randomUUID();\n}\n\nfunction safeError(error: unknown): string {\n return error instanceof Error ? error.message : \"Codex realtime bridge failed\";\n}\n","import type {\n CodexRealtimeVoice,\n CodexRealtimeWebrtcRequest,\n CodexRealtimeWebrtcResponse,\n} from \"./types\";\n\nexport type CodexRealtimeNegotiator = (\n request: CodexRealtimeWebrtcRequest,\n options: { signal?: AbortSignal | undefined },\n) => Promise<CodexRealtimeWebrtcResponse>;\n\nexport type CodexRealtimeMicrophoneErrorCode =\n | \"permission_denied\"\n | \"device_not_found\"\n | \"device_unavailable\"\n | \"track_ended\"\n | \"acquisition_failed\";\n\nexport class CodexRealtimeMicrophoneError extends Error {\n constructor(\n readonly code: CodexRealtimeMicrophoneErrorCode,\n message: string,\n ) {\n super(message);\n this.name = \"CodexRealtimeMicrophoneError\";\n }\n}\n\nexport type CodexRealtimeAudibleOutputState = \"inactive\" | \"pending\" | \"audible\" | \"blocked\";\n\nexport type CodexRealtimeConnectionHealth = \"connected\" | \"disconnected\" | \"failed\" | \"closed\";\n\nexport type AcquireCodexRealtimeMicrophoneOptions = {\n signal?: AbortSignal | undefined;\n getUserMedia?: ((constraints: MediaStreamConstraints) => Promise<MediaStream>) | undefined;\n};\n\nexport type StartCodexRealtimeWebrtcOptions = {\n negotiate: CodexRealtimeNegotiator;\n realtimeId: string;\n operationId: string;\n browserInstanceId: string;\n ownerKey: string;\n expectedVersion: number;\n expectedConnectionEpoch: number;\n rotate: boolean;\n signal?: AbortSignal | undefined;\n instructions?: string | undefined;\n voice?: CodexRealtimeVoice | undefined;\n /** Injectable browser seams make complete SDP negotiation deterministic in tests. */\n createPeerConnection?: (() => RTCPeerConnection) | undefined;\n getUserMedia?: ((constraints: MediaStreamConstraints) => Promise<MediaStream>) | undefined;\n /** Called synchronously immediately after `oai-events` is created. */\n onEventsCreated?: ((events: RTCDataChannel) => void) | undefined;\n /** Reuse a caller-owned microphone across transparent connection rotations. */\n media?: MediaStream | undefined;\n /** Caller-owned audio element for the provider's remote WebRTC track. */\n remoteAudio?: HTMLAudioElement | undefined;\n /** Replacement transports defer taking over the shared audio element until promotion. */\n activateRemoteAudio?: boolean | undefined;\n onAudibleOutputState?: ((state: CodexRealtimeAudibleOutputState) => void) | undefined;\n onMicrophoneEnded?: (() => void) | undefined;\n onConnectionHealth?: ((health: CodexRealtimeConnectionHealth) => void) | undefined;\n};\n\nexport type CodexRealtimeWebrtcSession = {\n readonly peerConnection: RTCPeerConnection;\n readonly events: RTCDataChannel;\n readonly media: MediaStream;\n readonly operationId: string;\n readonly connectionId: string;\n readonly connectionEpoch: number;\n readonly startupFenceSequence: number;\n readonly modeVersion: number;\n microphoneHealthy(): boolean;\n audibleOutputState(): CodexRealtimeAudibleOutputState;\n setOutputMuted(muted: boolean): void;\n activateRemoteAudio(): void;\n retryAudibleOutput(): Promise<boolean>;\n /** Idempotently close media, data channel, and peer transport. */\n stop(): void;\n};\n\n/**\n * Complete the browser half of native connected-Codex GPT-Live V3 negotiation.\n * Provider credentials never enter this boundary: `negotiate` sends SDP,\n * public session configuration, and the active browser-owner proof only to the\n * OpenGeni API.\n */\nexport async function startCodexRealtimeWebrtc(\n options: StartCodexRealtimeWebrtcOptions,\n): Promise<CodexRealtimeWebrtcSession> {\n throwIfAborted(options.signal);\n const peerConnection = (options.createPeerConnection ?? defaultPeerConnection)();\n const events = peerConnection.createDataChannel(\"oai-events\");\n try {\n options.onEventsCreated?.(events);\n } catch (error) {\n try {\n events.close();\n } finally {\n peerConnection.close();\n }\n throw error;\n }\n let media: MediaStream | null = null;\n let ownsMedia = false;\n let stopped = false;\n let remoteStream: MediaStream | null = null;\n let remoteAudioActive = options.activateRemoteAudio ?? true;\n let outputMuted = false;\n let audibleOutput: CodexRealtimeAudibleOutputState = \"inactive\";\n let audioAttempt = 0;\n\n const publishAudibleOutput = (next: CodexRealtimeAudibleOutputState): void => {\n if (stopped && next !== \"inactive\") return;\n audibleOutput = next;\n options.onAudibleOutputState?.(next);\n };\n\n const playRemoteAudio = async (): Promise<boolean> => {\n const remoteAudio = options.remoteAudio;\n const stream = remoteStream;\n if (stopped || !remoteAudioActive || !remoteAudio || !stream) return false;\n remoteAudio.autoplay = true;\n remoteAudio.muted = outputMuted;\n remoteAudio.srcObject = stream;\n const attempt = ++audioAttempt;\n publishAudibleOutput(\"pending\");\n try {\n await remoteAudio.play();\n if (stopped || attempt !== audioAttempt || remoteAudio.srcObject !== stream) return false;\n publishAudibleOutput(\"audible\");\n return true;\n } catch {\n if (!stopped && attempt === audioAttempt && remoteAudio.srcObject === stream) {\n publishAudibleOutput(\"blocked\");\n }\n return false;\n }\n };\n\n const onRemoteTrack = (event: RTCTrackEvent): void => {\n if (stopped || event.track.kind !== \"audio\") return;\n const stream = event.streams[0];\n if (!stream) return;\n remoteStream = stream;\n if (remoteAudioActive) void playRemoteAudio();\n };\n if (options.remoteAudio) peerConnection.addEventListener(\"track\", onRemoteTrack);\n const onConnectionState = (): void => {\n if (stopped) return;\n const peerState = peerConnection.connectionState;\n const iceState = peerConnection.iceConnectionState;\n if (peerState === \"failed\" || iceState === \"failed\") {\n options.onConnectionHealth?.(\"failed\");\n } else if (peerState === \"disconnected\" || iceState === \"disconnected\") {\n options.onConnectionHealth?.(\"disconnected\");\n } else if (peerState === \"closed\" || iceState === \"closed\") {\n options.onConnectionHealth?.(\"closed\");\n } else if (peerState === \"connected\" || iceState === \"connected\" || iceState === \"completed\") {\n options.onConnectionHealth?.(\"connected\");\n }\n };\n const onChannelClose = (): void => {\n if (!stopped) options.onConnectionHealth?.(\"closed\");\n };\n const onChannelError = (): void => {\n if (!stopped) options.onConnectionHealth?.(\"failed\");\n };\n peerConnection.addEventListener(\"connectionstatechange\", onConnectionState);\n peerConnection.addEventListener(\"iceconnectionstatechange\", onConnectionState);\n events.addEventListener(\"close\", onChannelClose);\n events.addEventListener(\"error\", onChannelError);\n let audioTracks: MediaStreamTrack[] = [];\n const onMicrophoneEnded = (): void => {\n if (!stopped) options.onMicrophoneEnded?.();\n };\n const stop = (): void => {\n if (stopped) return;\n stopped = true;\n audioAttempt += 1;\n options.signal?.removeEventListener(\"abort\", stop);\n if (options.remoteAudio) peerConnection.removeEventListener(\"track\", onRemoteTrack);\n peerConnection.removeEventListener(\"connectionstatechange\", onConnectionState);\n peerConnection.removeEventListener(\"iceconnectionstatechange\", onConnectionState);\n events.removeEventListener(\"close\", onChannelClose);\n events.removeEventListener(\"error\", onChannelError);\n for (const track of audioTracks) track.removeEventListener?.(\"ended\", onMicrophoneEnded);\n try {\n events.close();\n } finally {\n try {\n if (ownsMedia) media?.getTracks().forEach((track) => track.stop());\n } finally {\n if (options.remoteAudio && options.remoteAudio.srcObject === remoteStream) {\n options.remoteAudio.pause();\n options.remoteAudio.srcObject = null;\n }\n remoteStream = null;\n publishAudibleOutput(\"inactive\");\n peerConnection.close();\n }\n }\n };\n options.signal?.addEventListener(\"abort\", stop, { once: true });\n\n try {\n const getUserMedia = options.getUserMedia ?? defaultGetUserMedia;\n if (options.media) {\n media = options.media;\n } else {\n media = await acquireCodexRealtimeMicrophone({\n getUserMedia,\n signal: options.signal,\n });\n ownsMedia = true;\n }\n throwIfAborted(options.signal);\n audioTracks = media.getAudioTracks();\n if (audioTracks.length === 0) {\n throw new CodexRealtimeMicrophoneError(\n \"device_not_found\",\n \"No microphone audio track is available\",\n );\n }\n if (!microphoneTracksHealthy(audioTracks)) {\n throw new CodexRealtimeMicrophoneError(\n \"track_ended\",\n \"The microphone audio track is no longer available\",\n );\n }\n for (const track of audioTracks) {\n track.addEventListener?.(\"ended\", onMicrophoneEnded);\n peerConnection.addTrack(track, media);\n }\n\n const offer = await peerConnection.createOffer();\n if (offer.type !== \"offer\" || !offer.sdp) {\n throw new Error(\"Browser did not create a WebRTC SDP offer\");\n }\n await peerConnection.setLocalDescription(offer);\n throwIfAborted(options.signal);\n const localSdp = peerConnection.localDescription?.sdp ?? offer.sdp;\n const answer = await options.negotiate(\n {\n realtimeId: options.realtimeId,\n operationId: options.operationId,\n browserInstanceId: options.browserInstanceId,\n ownerKey: options.ownerKey,\n expectedVersion: options.expectedVersion,\n expectedConnectionEpoch: options.expectedConnectionEpoch,\n rotate: options.rotate,\n browserActivation: \"required\",\n sdp: localSdp,\n version: \"v3\",\n ...(options.instructions === undefined ? {} : { instructions: options.instructions }),\n ...(options.voice === undefined ? {} : { voice: options.voice }),\n },\n { signal: options.signal },\n );\n throwIfAborted(options.signal);\n if (answer.version !== \"v3\" || answer.model !== \"gpt-live-1-boulder-alpha\" || !answer.sdp) {\n throw new Error(\"OpenGeni returned an incompatible Codex realtime answer\");\n }\n await peerConnection.setRemoteDescription({\n type: \"answer\",\n sdp: answer.sdp,\n });\n throwIfAborted(options.signal);\n return {\n peerConnection,\n events,\n media,\n operationId: options.operationId,\n connectionId: answer.connectionId,\n connectionEpoch: answer.connectionEpoch,\n startupFenceSequence: answer.startupFenceSequence,\n modeVersion: answer.modeVersion,\n microphoneHealthy: () => microphoneTracksHealthy(audioTracks),\n audibleOutputState: () => audibleOutput,\n setOutputMuted: (muted) => {\n outputMuted = muted;\n if (options.remoteAudio) options.remoteAudio.muted = muted;\n },\n activateRemoteAudio: () => {\n if (stopped || remoteAudioActive) return;\n remoteAudioActive = true;\n if (remoteStream) void playRemoteAudio();\n },\n retryAudibleOutput: playRemoteAudio,\n stop,\n };\n } catch (error) {\n stop();\n throw error;\n }\n}\n\nexport async function acquireCodexRealtimeMicrophone(\n options: AcquireCodexRealtimeMicrophoneOptions = {},\n): Promise<MediaStream> {\n const getUserMedia = options.getUserMedia ?? defaultGetUserMedia;\n let media: MediaStream;\n try {\n media = await abortableMedia(getUserMedia({ audio: true }), options.signal);\n } catch (error) {\n throw microphoneAcquisitionError(error, options.signal);\n }\n const tracks = media.getAudioTracks();\n if (tracks.length === 0) {\n media.getTracks().forEach((track) => track.stop());\n throw new CodexRealtimeMicrophoneError(\n \"device_not_found\",\n \"No microphone audio track is available\",\n );\n }\n if (!microphoneTracksHealthy(tracks)) {\n media.getTracks().forEach((track) => track.stop());\n throw new CodexRealtimeMicrophoneError(\n \"track_ended\",\n \"The microphone audio track is no longer available\",\n );\n }\n return media;\n}\n\nexport function codexRealtimeMicrophoneHealthy(media: MediaStream | null): boolean {\n return media !== null && microphoneTracksHealthy(media.getAudioTracks());\n}\n\nfunction microphoneTracksHealthy(tracks: readonly MediaStreamTrack[]): boolean {\n return tracks.length > 0 && tracks.every((track) => track.readyState !== \"ended\");\n}\n\nfunction microphoneAcquisitionError(error: unknown, signal: AbortSignal | undefined): Error {\n if (signal?.aborted) {\n return signal.reason instanceof Error\n ? signal.reason\n : new DOMException(\"Aborted\", \"AbortError\");\n }\n const name = error instanceof Error ? error.name : \"\";\n if (name === \"NotAllowedError\" || name === \"SecurityError\") {\n return new CodexRealtimeMicrophoneError(\n \"permission_denied\",\n \"Microphone permission was denied\",\n );\n }\n if (name === \"NotFoundError\" || name === \"DevicesNotFoundError\") {\n return new CodexRealtimeMicrophoneError(\"device_not_found\", \"No microphone device was found\");\n }\n if (name === \"NotReadableError\" || name === \"TrackStartError\" || name === \"AbortError\") {\n return new CodexRealtimeMicrophoneError(\n \"device_unavailable\",\n \"The microphone device is unavailable\",\n );\n }\n return new CodexRealtimeMicrophoneError(\n \"acquisition_failed\",\n \"Microphone capture could not be started\",\n );\n}\n\nfunction defaultPeerConnection(): RTCPeerConnection {\n if (typeof RTCPeerConnection === \"undefined\") {\n throw new Error(\"WebRTC is not available in this environment\");\n }\n return new RTCPeerConnection();\n}\n\nasync function defaultGetUserMedia(constraints: MediaStreamConstraints): Promise<MediaStream> {\n if (typeof navigator === \"undefined\" || !navigator.mediaDevices?.getUserMedia) {\n throw new Error(\"Microphone capture is not available in this environment\");\n }\n return await navigator.mediaDevices.getUserMedia(constraints);\n}\n\nfunction throwIfAborted(signal: AbortSignal | undefined): void {\n if (signal?.aborted) {\n throw signal.reason ?? new DOMException(\"Aborted\", \"AbortError\");\n }\n}\n\nasync function abortableMedia(\n pending: Promise<MediaStream>,\n signal: AbortSignal | undefined,\n): Promise<MediaStream> {\n if (!signal) return await pending;\n throwIfAborted(signal);\n let rejectAbort: ((reason?: unknown) => void) | undefined;\n const aborted = new Promise<never>((_resolve, reject) => {\n rejectAbort = reject;\n });\n const onAbort = (): void => {\n rejectAbort?.(signal.reason ?? new DOMException(\"Aborted\", \"AbortError\"));\n };\n signal.addEventListener(\"abort\", onAbort, { once: true });\n // If permission resolves after cancellation won the race, stop the newly\n // acquired tracks rather than leaking a detached microphone capture.\n void pending.then(\n (lateMedia) => {\n if (signal.aborted) lateMedia.getTracks().forEach((track) => track.stop());\n },\n () => undefined,\n );\n try {\n return await Promise.race([pending, aborted]);\n } finally {\n signal.removeEventListener(\"abort\", onAbort);\n }\n}\n","import type { SessionEvent, SessionRealtimeModel } from \"./types\";\n\nexport type SessionRealtimeLifecycleProjection =\n | {\n state: \"active\";\n realtimeId: string;\n operationId: string;\n version: number;\n connectionEpoch: number;\n leaseExpiresAt: string;\n model: SessionRealtimeModel;\n }\n | {\n state: \"ended\";\n realtimeId: string;\n operationId: string;\n version: number;\n connectionEpoch: number;\n reason: \"user_stop\" | \"browser_unload\" | \"lease_expired\";\n };\n\nexport function projectSessionRealtimeLifecycle(\n events: ReadonlyArray<Pick<SessionEvent, \"sequence\" | \"type\" | \"payload\">>,\n): SessionRealtimeLifecycleProjection | null {\n let projected: SessionRealtimeLifecycleProjection | null = null;\n for (const event of [...events].sort((left, right) => left.sequence - right.sequence)) {\n const payload = recordValue(event.payload);\n if (event.type === \"session.realtime.started\") {\n const realtimeId = stringValue(payload?.realtimeId);\n const operationId = stringValue(payload?.operationId);\n const version = positiveInteger(payload?.version);\n const connectionEpoch = positiveInteger(payload?.connectionEpoch);\n const leaseExpiresAt = stringValue(payload?.leaseExpiresAt);\n const model = realtimeModel(payload?.model);\n if (realtimeId && operationId && version && connectionEpoch && leaseExpiresAt && model) {\n projected = {\n state: \"active\",\n realtimeId,\n operationId,\n version,\n connectionEpoch,\n leaseExpiresAt,\n model,\n };\n }\n } else if (event.type === \"session.realtime.ended\") {\n const realtimeId = stringValue(payload?.realtimeId);\n const operationId = stringValue(payload?.operationId);\n const version = positiveInteger(payload?.version);\n const connectionEpoch = positiveInteger(payload?.connectionEpoch);\n const reason = endReason(payload?.reason);\n if (realtimeId && operationId && version && connectionEpoch && reason) {\n projected = {\n state: \"ended\",\n realtimeId,\n operationId,\n version,\n connectionEpoch,\n reason,\n };\n }\n }\n }\n return projected;\n}\n\nfunction realtimeModel(value: unknown): SessionRealtimeModel | null {\n return value === \"gpt-live-1-boulder-alpha\" ||\n value === \"opengeni-gateway/openai/gpt-realtime-2.1\" ||\n value === \"opengeni-gateway/openai/gpt-realtime-mini\" ||\n value === \"opengeni-gateway/xai/grok-voice-think-fast-2.0\" ||\n value === \"workspace-gateway/openai/gpt-realtime-2.1\" ||\n value === \"workspace-gateway/openai/gpt-realtime-mini\" ||\n value === \"workspace-gateway/xai/grok-voice-think-fast-2.0\"\n ? value\n : null;\n}\n\nfunction recordValue(value: unknown): Record<string, unknown> | null {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nfunction stringValue(value: unknown): string | null {\n return typeof value === \"string\" && value.length > 0 ? value : null;\n}\n\nfunction positiveInteger(value: unknown): number | null {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value > 0 ? value : null;\n}\n\nfunction endReason(value: unknown): \"user_stop\" | \"browser_unload\" | \"lease_expired\" | null {\n return value === \"user_stop\" || value === \"browser_unload\" || value === \"lease_expired\"\n ? value\n : null;\n}\n","import {\n CODEX_REALTIME_V3_MAX_EVENT_BYTES,\n CODEX_REALTIME_V3_PENDING_MAX_BYTES,\n CODEX_REALTIME_V3_PENDING_MAX_ENTRIES,\n createCodexRealtimeV3Bridge,\n parseCodexRealtimeV3Event,\n} from \"./codex-realtime-v3\";\nimport type {\n CodexRealtimeV3Bridge,\n CodexRealtimeV3BridgeFatal,\n CodexRealtimeV3BridgeSnapshot,\n} from \"./codex-realtime-v3\";\nimport type { SessionRealtimeLifecycleProjection } from \"./codex-realtime-lifecycle\";\nimport {\n acquireCodexRealtimeMicrophone,\n codexRealtimeMicrophoneHealthy,\n CodexRealtimeMicrophoneError,\n startCodexRealtimeWebrtc,\n} from \"./codex-realtime\";\nimport type {\n CodexRealtimeAudibleOutputState,\n CodexRealtimeConnectionHealth,\n CodexRealtimeMicrophoneErrorCode,\n CodexRealtimeWebrtcSession,\n} from \"./codex-realtime\";\nimport { OpenGeniApiError } from \"./errors\";\nimport type {\n ActivateCodexRealtimeConnectionRequest,\n BeginSessionRealtimeRequest,\n CodexRealtimeWebrtcRequest,\n CodexRealtimeWebrtcResponse,\n GatewayRealtimeConnectRequest,\n GatewayRealtimeConnectResponse,\n EndSessionRealtimeRequest,\n RenewSessionRealtimeRequest,\n SessionRealtimeMode,\n SessionRealtimeModel,\n SessionRealtimeMutationResponse,\n SyncSessionRealtimeLedgerRequest,\n SyncSessionRealtimeLedgerResponse,\n} from \"./types\";\n\nexport { projectSessionRealtimeLifecycle } from \"./codex-realtime-lifecycle\";\nexport type { SessionRealtimeLifecycleProjection } from \"./codex-realtime-lifecycle\";\n\nconst HEARTBEAT_INTERVAL_MS = 10_000;\nconst OUTBOUND_SYNC_INTERVAL_MS = 1_000;\nexport const CODEX_REALTIME_NEGOTIATION_TIMEOUT_MS = 20_000;\n// OpenGeni policy: rotate conservatively without asserting an upstream lifetime.\nconst DEFAULT_CONNECTION_ROTATION_INTERVAL_MS = 15 * 60_000;\nconst DEFAULT_RECONNECT_BACKOFF_MS = [250, 1_000, 2_000, 5_000] as const;\nconst OWNER_RECORD_VERSION = 1;\n\nexport type CodexRealtimeControllerStatus =\n | \"idle\"\n | \"starting\"\n | \"active\"\n | \"stopping\"\n | \"recovering\"\n | \"lost_owner\"\n | \"error\";\n\nexport type CodexRealtimeMicrophoneState =\n | \"inactive\"\n | \"acquiring\"\n | \"active\"\n | CodexRealtimeMicrophoneErrorCode;\n\nexport type CodexRealtimeDiagnosticKind =\n | \"permission_failure\"\n | \"device_failure\"\n | \"autoplay_blocked\"\n | \"negotiation_failure\"\n | \"rotation\"\n | \"reconnect\"\n | \"lost_owner\"\n | \"terminal_stop\";\n\nexport type CodexRealtimeDiagnostic = {\n kind: CodexRealtimeDiagnosticKind;\n message: string;\n recoverable: boolean;\n connectionGeneration: number;\n attempt: number;\n};\n\nexport type CodexRealtimeControllerSnapshot = {\n status: CodexRealtimeControllerStatus;\n realtimeId: string | null;\n mode: SessionRealtimeMode | null;\n bridge: CodexRealtimeV3BridgeSnapshot | null;\n microphone: CodexRealtimeMicrophoneState;\n inputMuted: boolean;\n audibleOutput: CodexRealtimeAudibleOutputState;\n outputMuted: boolean;\n connectionGeneration: number;\n reconnectAttempt: number;\n diagnostic: CodexRealtimeDiagnostic | null;\n error: string | null;\n};\n\nexport type CodexRealtimeControllerClient = {\n beginSessionRealtime(\n workspaceId: string,\n sessionId: string,\n request: BeginSessionRealtimeRequest,\n ): Promise<SessionRealtimeMutationResponse>;\n heartbeatSessionRealtime(\n workspaceId: string,\n sessionId: string,\n realtimeId: string,\n request: RenewSessionRealtimeRequest,\n ): Promise<SessionRealtimeMutationResponse>;\n negotiateCodexRealtimeWebrtc(\n workspaceId: string,\n sessionId: string,\n request: CodexRealtimeWebrtcRequest,\n options?: { signal?: AbortSignal | undefined },\n ): Promise<CodexRealtimeWebrtcResponse>;\n negotiateGatewayRealtime?(\n workspaceId: string,\n sessionId: string,\n request: GatewayRealtimeConnectRequest,\n options?: { signal?: AbortSignal | undefined },\n ): Promise<GatewayRealtimeConnectResponse>;\n activateCodexRealtimeConnection(\n workspaceId: string,\n sessionId: string,\n realtimeId: string,\n connectionId: string,\n request: ActivateCodexRealtimeConnectionRequest,\n options?: { signal?: AbortSignal | undefined },\n ): Promise<SessionRealtimeMutationResponse>;\n syncSessionRealtimeLedger(\n workspaceId: string,\n sessionId: string,\n realtimeId: string,\n request: SyncSessionRealtimeLedgerRequest,\n ): Promise<SyncSessionRealtimeLedgerResponse>;\n endSessionRealtime(\n workspaceId: string,\n sessionId: string,\n realtimeId: string,\n request: EndSessionRealtimeRequest,\n ): Promise<SessionRealtimeMutationResponse>;\n};\n\nexport type CodexRealtimeOwnerStorage = Pick<Storage, \"getItem\" | \"setItem\" | \"removeItem\">;\n\n/** Canonical browser-owner storage namespace for a public realtime model. */\nexport function sessionRealtimeOwnerStorageNamespace(model: SessionRealtimeModel): string {\n return model === \"gpt-live-1-boulder-alpha\" ? \"codex-realtime-owner\" : \"gateway-realtime-owner\";\n}\n\n/** Canonical browser-owner storage key shared by the SDK controller and React facade. */\nexport function sessionRealtimeOwnerStorageKey(\n workspaceId: string,\n sessionId: string,\n model: SessionRealtimeModel,\n): string {\n return ownerStorageKey(workspaceId, sessionId, sessionRealtimeOwnerStorageNamespace(model));\n}\n\n/**\n * Preserve the existing pre-controller owner-presence projection used by the\n * lazy React control. The controller remains the sole authority that validates\n * or removes malformed records once it is constructed.\n */\nexport function hasStoredSessionRealtimeOwnerProof(input: {\n workspaceId: string;\n sessionId: string;\n model: SessionRealtimeModel;\n storage?: CodexRealtimeOwnerStorage | undefined;\n}): boolean {\n const storage = input.storage ?? defaultStorage();\n if (!storage) return false;\n try {\n return (\n storage.getItem(\n sessionRealtimeOwnerStorageKey(input.workspaceId, input.sessionId, input.model),\n ) !== null\n );\n } catch {\n return false;\n }\n}\n\nexport type CreateCodexRealtimeControllerOptions = {\n client: CodexRealtimeControllerClient;\n workspaceId: string;\n sessionId: string;\n storage?: CodexRealtimeOwnerStorage | undefined;\n remoteAudio?: HTMLAudioElement | undefined;\n createPeerConnection?: (() => RTCPeerConnection) | undefined;\n getUserMedia?: ((constraints: MediaStreamConstraints) => Promise<MediaStream>) | undefined;\n randomUUID?: (() => string) | undefined;\n setInterval?: ((callback: () => void, delayMs: number) => unknown) | undefined;\n clearInterval?: ((handle: unknown) => void) | undefined;\n setTimeout?: ((callback: () => void, delayMs: number) => unknown) | undefined;\n clearTimeout?: ((handle: unknown) => void) | undefined;\n negotiationTimeoutMs?: number | undefined;\n connectionRotationIntervalMs?: number | undefined;\n reconnectBackoffMs?: readonly number[] | undefined;\n /** Defaults to connected Codex; alternate transports opt in explicitly. */\n model?: SessionRealtimeModel | undefined;\n ownerStorageNamespace?: string | undefined;\n startTransport?: RealtimeControllerTransportStarter | undefined;\n};\n\nexport type RealtimeControllerTransportStarter = (input: {\n client: CodexRealtimeControllerClient;\n workspaceId: string;\n sessionId: string;\n realtimeId: string;\n operationId: string;\n browserInstanceId: string;\n ownerKey: string;\n expectedVersion: number;\n expectedConnectionEpoch: number;\n rotate: boolean;\n signal: AbortSignal;\n media: MediaStream;\n onEventsCreated(events: RTCDataChannel): void;\n onAudibleOutputState(state: CodexRealtimeAudibleOutputState): void;\n onMicrophoneEnded(): void;\n onConnectionHealth(health: CodexRealtimeConnectionHealth): void;\n}) => Promise<CodexRealtimeWebrtcSession>;\n\nexport type CodexRealtimeController = {\n snapshot(): CodexRealtimeControllerSnapshot;\n subscribe(listener: (snapshot: CodexRealtimeControllerSnapshot) => void): () => void;\n start(): Promise<void>;\n observeLifecycle(lifecycle: SessionRealtimeLifecycleProjection | null): Promise<void>;\n heartbeat(): Promise<void>;\n flush(): Promise<void>;\n ingestProviderEvent(payload: string): Promise<void>;\n retry(): Promise<void>;\n retryAudibleOutput(): Promise<boolean>;\n setInputMuted(muted: boolean): void;\n setOutputMuted(muted: boolean): void;\n stop(): Promise<void>;\n /** Close browser resources but retain owner proof for truthful reload recovery. */\n close(): void;\n};\n\ntype OwnerRecord = {\n version: typeof OWNER_RECORD_VERSION;\n workspaceId: string;\n sessionId: string;\n operationId: string;\n browserInstanceId: string;\n ownerKey: string;\n};\n\ntype ConnectionRuntime = {\n generation: number;\n transport: CodexRealtimeWebrtcSession;\n bridge: CodexRealtimeV3Bridge;\n};\n\ntype RecoveryCause = \"rotation\" | \"reconnect\" | \"microphone\" | \"reload\" | \"manual\";\n\n/**\n * Compose the existing lifecycle API, WebRTC transport, and durable V3 bridge\n * into one indefinitely rotating browser owner. Provider protocol semantics stay\n * below this seam; this controller owns only browser resources and connection\n * generations.\n */\nexport function createCodexRealtimeController(\n options: CreateCodexRealtimeControllerOptions,\n): CodexRealtimeController {\n const storage = options.storage ?? defaultStorage();\n const storageKey = ownerStorageKey(\n options.workspaceId,\n options.sessionId,\n options.ownerStorageNamespace,\n );\n const model = options.model ?? \"gpt-live-1-boulder-alpha\";\n const randomUUID = options.randomUUID ?? defaultRandomUUID;\n const scheduleInterval =\n options.setInterval ?? ((callback, delay) => globalThis.setInterval(callback, delay));\n const unscheduleInterval =\n options.clearInterval ??\n ((handle) => globalThis.clearInterval(handle as ReturnType<typeof setInterval>));\n const scheduleTimeout =\n options.setTimeout ?? ((callback, delay) => globalThis.setTimeout(callback, delay));\n const unscheduleTimeout =\n options.clearTimeout ??\n ((handle) => globalThis.clearTimeout(handle as ReturnType<typeof setTimeout>));\n const rotationInterval = positiveDuration(\n options.connectionRotationIntervalMs ?? DEFAULT_CONNECTION_ROTATION_INTERVAL_MS,\n \"connection rotation interval\",\n );\n const negotiationTimeout = positiveDuration(\n options.negotiationTimeoutMs ?? CODEX_REALTIME_NEGOTIATION_TIMEOUT_MS,\n \"negotiation timeout\",\n );\n const reconnectBackoff = validateReconnectBackoff(\n options.reconnectBackoffMs ?? DEFAULT_RECONNECT_BACKOFF_MS,\n );\n const listeners = new Set<(snapshot: CodexRealtimeControllerSnapshot) => void>();\n let owner: OwnerRecord | null = readOwnerRecord(storage, storageKey, options);\n let state: CodexRealtimeControllerSnapshot = {\n status: owner ? \"recovering\" : \"idle\",\n realtimeId: null,\n mode: null,\n bridge: null,\n microphone: \"inactive\",\n inputMuted: false,\n audibleOutput: \"inactive\",\n outputMuted: false,\n connectionGeneration: 0,\n reconnectAttempt: 0,\n diagnostic: null,\n error: null,\n };\n let active: ConnectionRuntime | null = null;\n let pendingAbort: AbortController | null = null;\n let pendingGeneration: number | null = null;\n let microphone: MediaStream | null = null;\n let heartbeatTimer: unknown = null;\n let syncTimer: unknown = null;\n let rotationTimer: unknown = null;\n let reconnectTimer: unknown = null;\n let negotiationTimer: unknown = null;\n let closed = false;\n let stopping = false;\n let generation = 0;\n let reconnectAttempt = 0;\n let recoveryTerminal = false;\n let mutationTail = Promise.resolve();\n let connectionTask: Promise<void> | null = null;\n\n const publish = (patch: Partial<CodexRealtimeControllerSnapshot>): void => {\n state = { ...state, ...patch };\n for (const listener of listeners) listener({ ...state });\n };\n\n const diagnostic = (\n kind: CodexRealtimeDiagnosticKind,\n message: string,\n recoverable: boolean,\n targetGeneration = state.connectionGeneration,\n ): CodexRealtimeDiagnostic => ({\n kind,\n message,\n recoverable,\n connectionGeneration: targetGeneration,\n attempt: reconnectAttempt,\n });\n\n const exclusive = async <T>(operation: () => Promise<T>): Promise<T> => {\n const pending = mutationTail.then(operation, operation);\n mutationTail = pending.then(\n () => undefined,\n () => undefined,\n );\n return await pending;\n };\n\n const stopTimers = (): void => {\n if (heartbeatTimer !== null) unscheduleInterval(heartbeatTimer);\n if (syncTimer !== null) unscheduleInterval(syncTimer);\n if (rotationTimer !== null) unscheduleTimeout(rotationTimer);\n if (reconnectTimer !== null) unscheduleTimeout(reconnectTimer);\n if (negotiationTimer !== null) unscheduleTimeout(negotiationTimer);\n heartbeatTimer = null;\n syncTimer = null;\n rotationTimer = null;\n reconnectTimer = null;\n negotiationTimer = null;\n };\n\n const stopNegotiationTimers = (): void => {\n if (heartbeatTimer !== null) unscheduleInterval(heartbeatTimer);\n if (rotationTimer !== null) unscheduleTimeout(rotationTimer);\n if (reconnectTimer !== null) unscheduleTimeout(reconnectTimer);\n if (negotiationTimer !== null) unscheduleTimeout(negotiationTimer);\n heartbeatTimer = null;\n rotationTimer = null;\n reconnectTimer = null;\n negotiationTimer = null;\n };\n\n const clearNegotiationTimer = (): void => {\n if (negotiationTimer !== null) unscheduleTimeout(negotiationTimer);\n negotiationTimer = null;\n };\n\n const releaseMicrophone = (): void => {\n const current = microphone;\n microphone = null;\n current?.getTracks().forEach((track) => track.stop());\n publish({ microphone: \"inactive\" });\n };\n\n const closeActive = (): void => {\n const current = active;\n active = null;\n current?.bridge.close();\n current?.transport.stop();\n publish({ bridge: null, audibleOutput: \"inactive\" });\n };\n\n const closeBrowserResources = (releaseMedia = true): void => {\n stopTimers();\n pendingAbort?.abort(new DOMException(\"Codex realtime browser owner closed\", \"AbortError\"));\n pendingAbort = null;\n pendingGeneration = null;\n closeActive();\n if (releaseMedia) releaseMicrophone();\n };\n\n const clearOwner = (): void => {\n owner = null;\n storage?.removeItem(storageKey);\n };\n\n const transitionEnded = (message = \"Realtime mode ended\"): void => {\n stopping = false;\n connectionTask = null;\n closeBrowserResources();\n clearOwner();\n reconnectAttempt = 0;\n recoveryTerminal = false;\n publish({\n status: \"idle\",\n realtimeId: null,\n mode: null,\n bridge: null,\n inputMuted: false,\n outputMuted: false,\n reconnectAttempt: 0,\n diagnostic: diagnostic(\"terminal_stop\", message, false),\n error: null,\n });\n };\n\n const ensureMicrophone = async (replace: boolean, signal: AbortSignal): Promise<MediaStream> => {\n if (!replace && codexRealtimeMicrophoneHealthy(microphone)) return microphone!;\n releaseMicrophone();\n publish({ microphone: \"acquiring\" });\n try {\n const acquired = await acquireCodexRealtimeMicrophone({\n signal,\n getUserMedia: options.getUserMedia,\n });\n if (closed || stopping || signal.aborted) {\n acquired.getTracks().forEach((track) => track.stop());\n throw signal.reason ?? new DOMException(\"Aborted\", \"AbortError\");\n }\n microphone = acquired;\n for (const track of acquired.getAudioTracks()) track.enabled = !state.inputMuted;\n publish({ microphone: \"active\" });\n return acquired;\n } catch (error) {\n if (error instanceof CodexRealtimeMicrophoneError) {\n const kind = error.code === \"permission_denied\" ? \"permission_failure\" : \"device_failure\";\n publish({\n microphone: error.code,\n status: state.mode?.state === \"active\" ? \"recovering\" : \"error\",\n diagnostic: diagnostic(kind, error.message, true),\n error: error.message,\n });\n }\n throw error;\n }\n };\n\n const syncForGeneration = async (\n targetGeneration: number,\n realtimeId: string,\n request: SyncSessionRealtimeLedgerRequest,\n ): Promise<SyncSessionRealtimeLedgerResponse> =>\n await exclusive(async () => {\n const current = state.mode;\n if (\n !owner ||\n !current ||\n current.id !== realtimeId ||\n current.state !== \"active\" ||\n active?.generation !== targetGeneration\n ) {\n throw new Error(\"Codex realtime connection generation is no longer active\");\n }\n return await options.client.syncSessionRealtimeLedger(\n options.workspaceId,\n options.sessionId,\n realtimeId,\n { ...request, expectedVersion: current.version },\n );\n });\n\n const onAudibleOutput = (\n targetGeneration: number,\n next: CodexRealtimeAudibleOutputState,\n ): void => {\n if (active?.generation !== targetGeneration || closed || stopping) return;\n if (next === \"blocked\") {\n const message =\n \"Browser blocked audible realtime output. Use Resume audio to continue listening.\";\n publish({\n audibleOutput: next,\n diagnostic: diagnostic(\"autoplay_blocked\", message, true),\n error: message,\n });\n return;\n }\n publish({ audibleOutput: next, ...(next === \"audible\" ? { error: null } : {}) });\n };\n\n const startActiveIntervals = (): void => {\n if (heartbeatTimer === null) {\n heartbeatTimer = scheduleInterval(() => {\n void heartbeat().catch((error) => {\n if (!closed && !stopping) {\n publish({ error: safeError(error) });\n scheduleRecovery(\"reconnect\", false);\n }\n });\n }, HEARTBEAT_INTERVAL_MS);\n }\n if (syncTimer === null) {\n syncTimer = scheduleInterval(() => {\n void flush().catch((error) => {\n if (!closed && !stopping) publish({ error: safeError(error) });\n });\n }, OUTBOUND_SYNC_INTERVAL_MS);\n }\n };\n\n const scheduleRecovery = (\n cause: RecoveryCause,\n replaceMicrophone: boolean,\n immediate = false,\n ): void => {\n if (closed || stopping || recoveryTerminal || !owner || state.mode?.state !== \"active\") return;\n if (connectionTask || reconnectTimer !== null) return;\n if (rotationTimer !== null) unscheduleTimeout(rotationTimer);\n rotationTimer = null;\n startActiveIntervals();\n const kind =\n cause === \"rotation\" ? \"rotation\" : cause === \"microphone\" ? \"device_failure\" : \"reconnect\";\n const message =\n cause === \"rotation\"\n ? \"Rotating the finite provider connection\"\n : cause === \"microphone\"\n ? \"Recovering microphone and realtime connection\"\n : \"Recovering the realtime provider connection\";\n publish({\n status: \"recovering\",\n reconnectAttempt,\n diagnostic: diagnostic(kind, message, true),\n error: cause === \"rotation\" ? null : message,\n });\n const delay = immediate\n ? 0\n : reconnectBackoff[Math.min(reconnectAttempt, reconnectBackoff.length - 1)]!;\n reconnectTimer = scheduleTimeout(() => {\n reconnectTimer = null;\n const record = owner;\n const mode = state.mode;\n if (connectionTask || !record || !mode || closed || stopping || mode.state !== \"active\") {\n return;\n }\n connectionTask = establish(record, mode, cause, true, replaceMicrophone)\n .then(() => {\n reconnectAttempt = 0;\n publish({ reconnectAttempt: 0 });\n })\n .catch(async (error: unknown) => {\n connectionTask = null;\n await handleConnectionFailure(error, cause, replaceMicrophone);\n })\n .finally(() => {\n connectionTask = null;\n });\n }, delay);\n };\n\n const handleConnectionFailure = async (\n error: unknown,\n cause: RecoveryCause,\n replaceMicrophone: boolean,\n ): Promise<void> => {\n if (closed || stopping || isAbortError(error)) return;\n const message = safeError(error);\n if (error instanceof CodexRealtimeMicrophoneError) {\n if (error.code === \"track_ended\" && state.mode?.state === \"active\") {\n reconnectAttempt += 1;\n publish({\n status: \"recovering\",\n microphone: error.code,\n reconnectAttempt,\n diagnostic: diagnostic(\"device_failure\", error.message, true),\n error: error.message,\n });\n scheduleRecovery(\"microphone\", true);\n } else if (state.mode?.state === \"active\") {\n // Keep the owned mode alive while an explicit permission/device retry\n // waits for a user gesture; no provider connection is claimed healthy.\n startActiveIntervals();\n }\n return;\n }\n if (error instanceof OpenGeniApiError && error.status === 404) {\n transitionEnded(\"Realtime owner no longer exists\");\n return;\n }\n if (error instanceof OpenGeniApiError && error.status === 409 && error.retryable && owner) {\n try {\n const reconciled = await begin(owner, true, false);\n if (!reconciled || reconciled.state === \"ended\") return;\n } catch (reconcileError) {\n if (reconcileError instanceof OpenGeniApiError && !reconcileError.retryable) {\n stopTimers();\n if (!active) releaseMicrophone();\n recoveryTerminal = true;\n publish({\n status: \"error\",\n diagnostic: diagnostic(\"negotiation_failure\", safeError(reconcileError), false),\n error: safeError(reconcileError),\n });\n return;\n }\n }\n } else if (error instanceof OpenGeniApiError && !error.retryable) {\n stopTimers();\n if (!active) releaseMicrophone();\n recoveryTerminal = true;\n publish({\n status: \"error\",\n diagnostic: diagnostic(\"negotiation_failure\", message, false),\n error: message,\n });\n return;\n }\n reconnectAttempt += 1;\n publish({\n status: \"recovering\",\n reconnectAttempt,\n diagnostic: diagnostic(\"negotiation_failure\", message, true),\n error: message,\n });\n scheduleRecovery(cause === \"rotation\" ? \"reconnect\" : cause, replaceMicrophone);\n };\n\n const onBridgeFatal = (\n targetGeneration: number,\n failedBridge: CodexRealtimeV3Bridge,\n fatal: CodexRealtimeV3BridgeFatal,\n ): void => {\n const current = active;\n if (closed || stopping || !current || current.generation !== targetGeneration) return;\n active = null;\n failedBridge.close();\n current.transport.stop();\n publish({\n status: \"recovering\",\n bridge: failedBridge.snapshot(),\n audibleOutput: \"inactive\",\n diagnostic: diagnostic(\"negotiation_failure\", fatal.message, true, targetGeneration),\n error: fatal.message,\n });\n scheduleRecovery(\"reconnect\", false, true);\n };\n\n const onConnectionHealth = (\n targetGeneration: number,\n health: CodexRealtimeConnectionHealth,\n ): void => {\n if (closed || stopping) return;\n if (pendingGeneration === targetGeneration && health !== \"connected\") {\n pendingAbort?.abort(new Error(`Codex realtime replacement ${health} before activation`));\n return;\n }\n if (active?.generation !== targetGeneration || health === \"connected\") return;\n scheduleRecovery(\"reconnect\", false);\n };\n\n const onMicrophoneEnded = (targetGeneration: number): void => {\n if (closed || stopping) return;\n const error = new CodexRealtimeMicrophoneError(\n \"track_ended\",\n \"The microphone device was disconnected\",\n );\n publish({\n microphone: \"track_ended\",\n diagnostic: diagnostic(\"device_failure\", error.message, true),\n error: error.message,\n });\n if (pendingGeneration === targetGeneration) {\n pendingAbort?.abort(error);\n return;\n }\n if (active?.generation !== targetGeneration) return;\n scheduleRecovery(\"microphone\", true, true);\n };\n\n const startTimers = (): void => {\n stopTimers();\n startActiveIntervals();\n rotationTimer = scheduleTimeout(() => {\n rotationTimer = null;\n scheduleRecovery(\"rotation\", false, true);\n }, rotationInterval);\n };\n\n const establish = async (\n record: OwnerRecord,\n currentMode: SessionRealtimeMode,\n cause: RecoveryCause,\n rotate: boolean,\n replaceMicrophone: boolean,\n ): Promise<void> => {\n if (currentMode.state !== \"active\") {\n transitionEnded();\n return;\n }\n if (rotate) {\n // Refresh the 30-second lease immediately before freezing mode-version\n // changes for a negotiation that is itself bounded to 20 seconds.\n await heartbeat();\n const renewedMode = state.mode;\n if (!renewedMode || renewedMode.state !== \"active\") return;\n if (closed || stopping || owner !== record) {\n throw new DOMException(\"Realtime connection generation was retired\", \"AbortError\");\n }\n currentMode = renewedMode;\n }\n // Freeze lease-version changes while this exact negotiation/activation\n // proof is in flight, but keep flushing the old active bridge so durable\n // updates are not suppressed while its replacement is prepared.\n stopNegotiationTimers();\n const targetGeneration = ++generation;\n pendingGeneration = targetGeneration;\n const abort = new AbortController();\n pendingAbort = abort;\n const earlyEvents = createCodexRealtimeEarlyEventBuffer({\n onFatal: (error) => {\n if (pendingGeneration === targetGeneration && !abort.signal.aborted) abort.abort(error);\n },\n });\n negotiationTimer = scheduleTimeout(() => {\n if (pendingGeneration === targetGeneration && !abort.signal.aborted) {\n abort.abort(\n new CodexRealtimeGenerationError(\n \"Codex realtime negotiation did not open within 20 seconds\",\n ),\n );\n }\n }, negotiationTimeout);\n publish({\n status: rotate ? \"recovering\" : \"starting\",\n realtimeId: currentMode.id,\n mode: currentMode,\n connectionGeneration: targetGeneration,\n diagnostic:\n cause === \"rotation\"\n ? diagnostic(\n \"rotation\",\n \"Rotating the finite provider connection\",\n true,\n targetGeneration,\n )\n : cause === \"reload\" || cause === \"reconnect\"\n ? diagnostic(\"reconnect\", \"Reconnecting the same realtime mode\", true, targetGeneration)\n : state.diagnostic,\n error: null,\n });\n let connected: CodexRealtimeWebrtcSession;\n try {\n const media = await ensureMicrophone(replaceMicrophone, abort.signal);\n const operationId = randomUUID();\n const commonTransportInput = {\n client: options.client,\n workspaceId: options.workspaceId,\n sessionId: options.sessionId,\n realtimeId: currentMode.id,\n operationId,\n browserInstanceId: record.browserInstanceId,\n ownerKey: record.ownerKey,\n expectedVersion: currentMode.version,\n expectedConnectionEpoch: currentMode.connectionEpoch,\n rotate,\n signal: abort.signal,\n media,\n onEventsCreated: earlyEvents.attach,\n onAudibleOutputState: (next: CodexRealtimeAudibleOutputState) =>\n onAudibleOutput(targetGeneration, next),\n onMicrophoneEnded: () => onMicrophoneEnded(targetGeneration),\n onConnectionHealth: (health: CodexRealtimeConnectionHealth) =>\n onConnectionHealth(targetGeneration, health),\n };\n connected = options.startTransport\n ? await options.startTransport(commonTransportInput)\n : await startCodexRealtimeWebrtc({\n ...commonTransportInput,\n remoteAudio: options.remoteAudio,\n activateRemoteAudio: false,\n createPeerConnection: options.createPeerConnection,\n getUserMedia: options.getUserMedia,\n negotiate: async (request, requestOptions) =>\n await options.client.negotiateCodexRealtimeWebrtc(\n options.workspaceId,\n options.sessionId,\n request,\n requestOptions,\n ),\n });\n } catch (error) {\n clearNegotiationTimer();\n earlyEvents.close();\n if (pendingGeneration === targetGeneration) {\n pendingGeneration = null;\n pendingAbort = null;\n }\n throw error;\n }\n try {\n await waitForDataChannelOpen(connected.events, abort.signal);\n if (\n closed ||\n stopping ||\n abort.signal.aborted ||\n pendingGeneration !== targetGeneration ||\n !connected.microphoneHealthy()\n ) {\n if (!connected.microphoneHealthy() && !abort.signal.aborted) {\n abort.abort(\n new CodexRealtimeMicrophoneError(\n \"track_ended\",\n \"The microphone audio track ended before realtime activation\",\n ),\n );\n }\n throw abort.signal.reason ?? new DOMException(\"Aborted\", \"AbortError\");\n }\n const activated = await options.client.activateCodexRealtimeConnection(\n options.workspaceId,\n options.sessionId,\n currentMode.id,\n connected.connectionId,\n {\n operationId: connected.operationId,\n browserInstanceId: record.browserInstanceId,\n ownerKey: record.ownerKey,\n connectionEpoch: connected.connectionEpoch,\n expectedVersion: currentMode.version,\n expectedConnectionEpoch: currentMode.connectionEpoch,\n },\n { signal: abort.signal },\n );\n if (activated.mode.state !== \"active\") {\n clearNegotiationTimer();\n earlyEvents.close();\n connected.stop();\n transitionEnded();\n return;\n }\n if (\n closed ||\n stopping ||\n abort.signal.aborted ||\n pendingGeneration !== targetGeneration ||\n !connected.microphoneHealthy()\n ) {\n if (!connected.microphoneHealthy() && !abort.signal.aborted) {\n abort.abort(\n new CodexRealtimeMicrophoneError(\n \"track_ended\",\n \"The microphone audio track ended during realtime activation\",\n ),\n );\n }\n throw abort.signal.reason ?? new DOMException(\"Aborted\", \"AbortError\");\n }\n clearNegotiationTimer();\n const previous = active;\n let bridge!: CodexRealtimeV3Bridge;\n bridge = createCodexRealtimeV3Bridge({\n events: connected.events,\n connectionId: connected.connectionId,\n connectionEpoch: connected.connectionEpoch,\n startupFenceSequence: connected.startupFenceSequence,\n modeVersion: activated.mode.version,\n owner: {\n browserInstanceId: record.browserInstanceId,\n ownerKey: record.ownerKey,\n expectedVersion: activated.mode.version,\n },\n listen: false,\n sync: async (request) =>\n await syncForGeneration(targetGeneration, activated.mode.id, request),\n randomUUID,\n onSnapshot: (nextBridge) => {\n if (active?.generation === targetGeneration) publish({ bridge: nextBridge });\n },\n onFatal: (fatal) => onBridgeFatal(targetGeneration, bridge, fatal),\n });\n active = { generation: targetGeneration, transport: connected, bridge };\n connected.setOutputMuted(state.outputMuted);\n recoveryTerminal = false;\n pendingAbort = null;\n pendingGeneration = null;\n publish({\n status: \"active\",\n realtimeId: activated.mode.id,\n mode: activated.mode,\n microphone: \"active\",\n audibleOutput: connected.audibleOutputState(),\n bridge: bridge.snapshot(),\n connectionGeneration: targetGeneration,\n reconnectAttempt: 0,\n diagnostic:\n cause === \"rotation\"\n ? diagnostic(\n \"rotation\",\n \"Provider connection rotation completed\",\n true,\n targetGeneration,\n )\n : cause === \"reload\" || cause === \"reconnect\" || cause === \"microphone\"\n ? diagnostic(\"reconnect\", \"Realtime connection recovered\", true, targetGeneration)\n : null,\n error: null,\n });\n connected.activateRemoteAudio();\n previous?.bridge.close();\n previous?.transport.stop();\n earlyEvents.handoff(bridge);\n if (active?.generation !== targetGeneration) {\n throw new CodexRealtimeGenerationError(\n bridge.snapshot().fatal?.message ??\n \"Codex realtime connection generation was retired during activation\",\n );\n }\n startTimers();\n } catch (error) {\n clearNegotiationTimer();\n earlyEvents.close();\n connected.stop();\n if (pendingGeneration === targetGeneration) {\n pendingGeneration = null;\n pendingAbort = null;\n }\n throw error;\n }\n };\n\n const begin = async (\n record: OwnerRecord,\n recover: boolean,\n connectAfterBegin = true,\n ): Promise<SessionRealtimeMode | null> => {\n const response = await options.client.beginSessionRealtime(\n options.workspaceId,\n options.sessionId,\n {\n operationId: record.operationId,\n browserInstanceId: record.browserInstanceId,\n ownerKey: record.ownerKey,\n model,\n },\n );\n if (response.mode.state !== \"active\") {\n transitionEnded();\n return null;\n }\n publish({ mode: response.mode, realtimeId: response.mode.id });\n if (connectAfterBegin) {\n await establish(\n record,\n response.mode,\n recover ? \"reload\" : \"manual\",\n recover || response.replay,\n false,\n );\n }\n return response.mode;\n };\n\n const heartbeat = async (): Promise<void> => {\n await exclusive(async () => {\n const current = state.mode;\n if (!owner || !current || current.state !== \"active\") {\n throw new Error(\"Codex realtime owner is not active\");\n }\n const result = await options.client.heartbeatSessionRealtime(\n options.workspaceId,\n options.sessionId,\n current.id,\n {\n browserInstanceId: owner.browserInstanceId,\n ownerKey: owner.ownerKey,\n expectedVersion: current.version,\n },\n );\n // Publish the renewed version before releasing the mutation FIFO. A\n // queued ledger sync must never observe the pre-heartbeat version after\n // the server has already committed its successor.\n if (result.mode.state === \"ended\") {\n transitionEnded(\"Realtime lease ended\");\n return;\n }\n publish({ mode: result.mode, realtimeId: result.mode.id, error: null });\n });\n };\n\n const flush = async (): Promise<void> => {\n await active?.bridge.flush();\n };\n\n const retry = async (): Promise<void> => {\n if (!owner || state.mode?.state !== \"active\") {\n throw new Error(\"Codex realtime owner is not recoverable\");\n }\n if (recoveryTerminal || state.diagnostic?.recoverable === false) {\n throw new Error(\"Codex realtime recovery is terminal; stop the mode before retrying\");\n }\n if (reconnectTimer !== null) unscheduleTimeout(reconnectTimer);\n reconnectTimer = null;\n const replace = !codexRealtimeMicrophoneHealthy(microphone);\n scheduleRecovery(replace ? \"microphone\" : \"manual\", replace, true);\n };\n\n const retryAudibleOutput = async (): Promise<boolean> => {\n if (!active || state.audibleOutput !== \"blocked\") return false;\n const target = active;\n const resumed = await target.transport.retryAudibleOutput();\n if (active?.generation !== target.generation) return false;\n return resumed;\n };\n\n const setInputMuted = (muted: boolean): void => {\n if (state.inputMuted === muted) return;\n for (const track of microphone?.getAudioTracks() ?? []) track.enabled = !muted;\n publish({ inputMuted: muted });\n };\n\n const setOutputMuted = (muted: boolean): void => {\n if (state.outputMuted === muted) return;\n active?.transport.setOutputMuted(muted);\n publish({ outputMuted: muted });\n };\n\n const controller: CodexRealtimeController = {\n snapshot: () => ({ ...state }),\n subscribe: (listener) => {\n listeners.add(listener);\n listener({ ...state });\n return () => listeners.delete(listener);\n },\n start: async () => {\n if (state.status === \"lost_owner\") {\n throw new Error(\"Realtime mode belongs to another browser owner\");\n }\n if (![\"idle\", \"error\"].includes(state.status) || state.mode?.state === \"active\") return;\n closed = false;\n stopping = false;\n recoveryTerminal = false;\n const record: OwnerRecord = {\n version: OWNER_RECORD_VERSION,\n workspaceId: options.workspaceId,\n sessionId: options.sessionId,\n browserInstanceId: randomUUID(),\n ownerKey: `opengeni-realtime-owner:${randomUUID()}`,\n operationId: randomUUID(),\n };\n owner = record;\n storage?.setItem(storageKey, JSON.stringify(record));\n publish({ status: \"starting\", error: null, diagnostic: null });\n try {\n await begin(record, false);\n } catch (error) {\n closeBrowserResources(false);\n const failedMode = state.mode as SessionRealtimeMode | null;\n if (failedMode?.state === \"active\") {\n await handleConnectionFailure(error, \"reconnect\", false);\n } else {\n clearOwner();\n publish({ status: \"error\", realtimeId: null, mode: null, error: safeError(error) });\n }\n throw error;\n }\n },\n observeLifecycle: async (lifecycle) => {\n if (!lifecycle) {\n if (recoveryTerminal && state.mode?.state === \"active\") return;\n const record = readOwnerRecord(storage, storageKey, options);\n if (!record) {\n transitionEnded();\n return;\n }\n if (connectionTask || state.status === \"starting\" || state.status === \"active\") return;\n closed = false;\n stopping = false;\n owner = record;\n publish({ status: \"recovering\", error: null });\n connectionTask = begin(record, true)\n .then(() => undefined)\n .catch(async (error) => {\n connectionTask = null;\n await handleConnectionFailure(error, \"reload\", false);\n })\n .finally(() => {\n connectionTask = null;\n });\n await connectionTask;\n return;\n }\n if (lifecycle.state === \"ended\") {\n const record = readOwnerRecord(storage, storageKey, options);\n if (record && record.operationId !== lifecycle.operationId) {\n if (connectionTask || state.status === \"active\") return;\n closed = false;\n stopping = false;\n owner = record;\n connectionTask = begin(record, true)\n .then(() => undefined)\n .catch(async (error) => {\n connectionTask = null;\n await handleConnectionFailure(error, \"reload\", false);\n })\n .finally(() => {\n connectionTask = null;\n });\n await connectionTask;\n return;\n }\n if (state.realtimeId === null || lifecycle.realtimeId === state.realtimeId) {\n transitionEnded(`Realtime ended: ${lifecycle.reason}`);\n }\n return;\n }\n if (recoveryTerminal && state.realtimeId === lifecycle.realtimeId) return;\n if (state.status === \"active\" && state.realtimeId === lifecycle.realtimeId) return;\n const record = readOwnerRecord(storage, storageKey, options);\n if (!record || record.operationId !== lifecycle.operationId) {\n closeBrowserResources();\n owner = null;\n const message =\n \"Realtime is active in another browser owner. It can resume after that owner stops or its lease expires.\";\n publish({\n status: \"lost_owner\",\n realtimeId: lifecycle.realtimeId,\n mode: null,\n bridge: null,\n diagnostic: diagnostic(\"lost_owner\", message, false),\n error: message,\n });\n return;\n }\n if (connectionTask || state.status === \"starting\") return;\n closed = false;\n stopping = false;\n owner = record;\n publish({ status: \"recovering\", realtimeId: lifecycle.realtimeId, error: null });\n connectionTask = begin(record, true)\n .then(() => undefined)\n .catch(async (error) => {\n connectionTask = null;\n await handleConnectionFailure(error, \"reload\", false);\n })\n .finally(() => {\n connectionTask = null;\n });\n await connectionTask;\n },\n heartbeat,\n flush,\n ingestProviderEvent: async (payload) => {\n if (!active) throw new Error(\"Codex realtime provider channel is not connected\");\n await active.bridge.ingest(payload);\n },\n retry,\n retryAudibleOutput,\n setInputMuted,\n setOutputMuted,\n stop: async () => {\n const currentOwner = owner;\n if (!currentOwner || !state.mode) {\n if (state.status !== \"lost_owner\") transitionEnded();\n return;\n }\n stopping = true;\n publish({\n status: \"stopping\",\n diagnostic: diagnostic(\"terminal_stop\", \"Stopping realtime and releasing media\", false),\n error: null,\n });\n stopTimers();\n pendingAbort?.abort(new DOMException(\"Realtime stopped\", \"AbortError\"));\n pendingGeneration = null;\n const retiredTask = connectionTask;\n connectionTask = null;\n void retiredTask?.catch(() => undefined);\n try {\n await active?.bridge.sealAndFlush();\n closeBrowserResources();\n let current = state.mode;\n if (!current) throw new Error(\"Codex realtime mode disappeared while stopping\");\n let response: SessionRealtimeMutationResponse;\n try {\n response = await exclusive(\n async () =>\n await options.client.endSessionRealtime(\n options.workspaceId,\n options.sessionId,\n current.id,\n {\n browserInstanceId: currentOwner.browserInstanceId,\n ownerKey: currentOwner.ownerKey,\n expectedVersion: current.version,\n reason: \"user_stop\",\n },\n ),\n );\n } catch (error) {\n if (!(error instanceof OpenGeniApiError) || error.status !== 409) throw error;\n const reconciled = await begin(currentOwner, true, false);\n if (!reconciled || reconciled.state === \"ended\") return;\n current = reconciled;\n response = await exclusive(\n async () =>\n await options.client.endSessionRealtime(\n options.workspaceId,\n options.sessionId,\n current.id,\n {\n browserInstanceId: currentOwner.browserInstanceId,\n ownerKey: currentOwner.ownerKey,\n expectedVersion: current.version,\n reason: \"user_stop\",\n },\n ),\n );\n }\n if (response.mode.state === \"ended\") transitionEnded(\"Realtime stopped by this browser\");\n } catch (error) {\n stopping = false;\n owner = currentOwner;\n startActiveIntervals();\n publish({\n status: \"recovering\",\n diagnostic: diagnostic(\"terminal_stop\", safeError(error), true),\n error: safeError(error),\n });\n throw error;\n }\n },\n close: () => {\n closed = true;\n stopping = false;\n closeBrowserResources();\n listeners.clear();\n },\n };\n return controller;\n}\n\ntype CodexRealtimeEarlyEventBuffer = {\n attach(events: RTCDataChannel): void;\n handoff(bridge: CodexRealtimeV3Bridge): void;\n close(): void;\n};\n\nfunction createCodexRealtimeEarlyEventBuffer(input: {\n onFatal(error: Error): void;\n}): CodexRealtimeEarlyEventBuffer {\n let events: RTCDataChannel | null = null;\n let buffered: string[] = [];\n let bufferedBytes = 0;\n let fatal = false;\n\n const detach = (): void => {\n events?.removeEventListener(\"message\", onMessage);\n events = null;\n };\n const fail = (): void => {\n if (fatal) return;\n fatal = true;\n detach();\n buffered = [];\n bufferedBytes = 0;\n input.onFatal(\n new CodexRealtimeGenerationError(\n \"Codex realtime activation event buffer exceeded its hard limit\",\n ),\n );\n };\n const onMessage = (message: MessageEvent): void => {\n if (fatal || typeof message.data !== \"string\") return;\n const parsed = parseCodexRealtimeV3Event(message.data);\n // Invalid and oversized provider input is quarantined before it can occupy\n // activation memory. Audio deltas are ephemeral browser playback only.\n if (!parsed.ok || parsed.event.type === \"output_audio.delta\") return;\n const bytes = new TextEncoder().encode(message.data).byteLength;\n if (\n bytes > CODEX_REALTIME_V3_MAX_EVENT_BYTES ||\n buffered.length + 1 > CODEX_REALTIME_V3_PENDING_MAX_ENTRIES ||\n bufferedBytes + bytes > CODEX_REALTIME_V3_PENDING_MAX_BYTES\n ) {\n fail();\n return;\n }\n buffered.push(message.data);\n bufferedBytes += bytes;\n };\n\n return {\n attach: (channel) => {\n if (fatal || events === channel) return;\n if (events) throw new Error(\"Codex realtime activation buffer is already attached\");\n events = channel;\n events.addEventListener(\"message\", onMessage);\n },\n handoff: (bridge) => {\n if (fatal) {\n bridge.close();\n return;\n }\n // JavaScript event dispatch cannot interleave between these synchronous\n // operations. Reentrant arrivals append to the same array and are picked\n // up by the loop before the early listener is removed; the direct bridge\n // listener is enabled only after that removal, so there is no duplicate.\n for (let index = 0; index < buffered.length; index += 1) {\n void bridge.ingest(buffered[index]!).catch(() => undefined);\n }\n buffered = [];\n bufferedBytes = 0;\n detach();\n bridge.listen();\n },\n close: () => {\n detach();\n buffered = [];\n bufferedBytes = 0;\n },\n };\n}\n\nclass CodexRealtimeGenerationError extends Error {\n readonly name = \"CodexRealtimeGenerationError\";\n}\n\nfunction ownerStorageKey(\n workspaceId: string,\n sessionId: string,\n namespace = \"codex-realtime-owner\",\n): string {\n return `opengeni:${namespace}:${workspaceId}:${sessionId}`;\n}\n\nfunction readOwnerRecord(\n storage: CodexRealtimeOwnerStorage | undefined,\n key: string,\n scope: Pick<CreateCodexRealtimeControllerOptions, \"workspaceId\" | \"sessionId\">,\n): OwnerRecord | null {\n const raw = storage?.getItem(key);\n if (!raw) return null;\n try {\n const parsed = recordValue(JSON.parse(raw));\n if (\n parsed?.version !== OWNER_RECORD_VERSION ||\n parsed.workspaceId !== scope.workspaceId ||\n parsed.sessionId !== scope.sessionId ||\n !stringValue(parsed.operationId) ||\n !stringValue(parsed.browserInstanceId) ||\n !stringValue(parsed.ownerKey) ||\n String(parsed.ownerKey).length < 32\n ) {\n storage?.removeItem(key);\n return null;\n }\n return parsed as OwnerRecord;\n } catch {\n storage?.removeItem(key);\n return null;\n }\n}\n\nfunction defaultStorage(): CodexRealtimeOwnerStorage | undefined {\n return typeof sessionStorage === \"undefined\" ? undefined : sessionStorage;\n}\n\nfunction defaultRandomUUID(): string {\n if (!globalThis.crypto?.randomUUID) throw new Error(\"crypto.randomUUID is unavailable\");\n return globalThis.crypto.randomUUID();\n}\n\nfunction waitForDataChannelOpen(events: RTCDataChannel, signal: AbortSignal): Promise<void> {\n if (signal.aborted) {\n return Promise.reject(signal.reason ?? new DOMException(\"Aborted\", \"AbortError\"));\n }\n if (events.readyState === \"open\") return Promise.resolve();\n if (events.readyState === \"closing\" || events.readyState === \"closed\") {\n return Promise.reject(new Error(\"Codex realtime data channel closed before opening\"));\n }\n return new Promise<void>((resolve, reject) => {\n const cleanup = (): void => {\n events.removeEventListener(\"open\", onOpen);\n events.removeEventListener(\"close\", onClose);\n events.removeEventListener(\"error\", onError);\n signal.removeEventListener(\"abort\", onAbort);\n };\n const onOpen = (): void => {\n cleanup();\n resolve();\n };\n const onClose = (): void => {\n cleanup();\n reject(new Error(\"Codex realtime data channel closed before opening\"));\n };\n const onError = (): void => {\n cleanup();\n reject(new Error(\"Codex realtime data channel failed before opening\"));\n };\n const onAbort = (): void => {\n cleanup();\n reject(signal.reason ?? new DOMException(\"Aborted\", \"AbortError\"));\n };\n events.addEventListener(\"open\", onOpen, { once: true });\n events.addEventListener(\"close\", onClose, { once: true });\n events.addEventListener(\"error\", onError, { once: true });\n signal.addEventListener(\"abort\", onAbort, { once: true });\n if (signal.aborted) onAbort();\n else if (events.readyState === \"open\") onOpen();\n else if (events.readyState === \"closing\" || events.readyState === \"closed\") onClose();\n });\n}\n\nfunction positiveDuration(value: number, name: string): number {\n if (!Number.isSafeInteger(value) || value <= 0)\n throw new Error(`Codex realtime ${name} is invalid`);\n return value;\n}\n\nfunction validateReconnectBackoff(values: readonly number[]): readonly number[] {\n if (\n values.length === 0 ||\n values.some((value) => !Number.isSafeInteger(value) || value < 0 || value > 60_000)\n ) {\n throw new Error(\"Codex realtime reconnect backoff is invalid\");\n }\n return [...values];\n}\n\nfunction recordValue(value: unknown): Record<string, unknown> | null {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nfunction stringValue(value: unknown): string | null {\n return typeof value === \"string\" && value.length > 0 ? value : null;\n}\n\nfunction isAbortError(error: unknown): boolean {\n return error instanceof Error && error.name === \"AbortError\";\n}\n\nfunction safeError(error: unknown): string {\n return error instanceof Error ? error.message : \"Codex realtime browser controller failed\";\n}\n"],"mappings":"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","names":["utf8ByteLength","defaultRandomUUID","safeError","record","recordValue","stringValue"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/interaction.ts"],"sourcesContent":["import type { OpenGeniRequestOptions } from \"./client\";\nimport type { RetainedArtifactReference } from \"./types\";\n\n/** Public Browser/Computer protocol version. Driver and provider details stay private. */\nexport const INTERACTION_PROTOCOL_VERSION = 1 as const;\nexport const BROWSER_CONTROL_WEBSOCKET_PROTOCOL = \"opengeni.browser.v1\" as const;\nexport const COMPUTER_CONTROL_WEBSOCKET_PROTOCOL = \"opengeni.computer.v1\" as const;\nexport const BROWSER_CONTROL_WEBSOCKET_BEARER_PREFIX = \"opengeni.auth.\" as const;\nexport const BROWSER_CONTROL_MAX_FRAME_HEADER_BYTES = 64 * 1024;\nexport const BROWSER_FRAME_MAX_BYTES = 24 * 1024 * 1024;\nexport const BROWSER_FRAME_MAX_DIMENSION = 32_768;\nexport const BROWSER_FRAME_MAX_PIXELS = 100_000_000;\n\nexport type InteractionJsonValue =\n | null\n | string\n | number\n | boolean\n | InteractionJsonValue[]\n | { [key: string]: InteractionJsonValue };\n\nexport type InteractionPlacement =\n | { kind: \"sandbox_group\"; sandboxGroupId: string }\n | { kind: \"connected_machine\"; sandboxId: string }\n | { kind: \"attached_device\"; deviceId: string }\n | { kind: \"external_provider\"; providerId: string; placementId: string };\n\nexport type AttachedBrowserDeviceCapabilities = {\n tabInventory: boolean;\n debuggerAttachment: boolean;\n semanticObservation: boolean;\n screenshots: boolean;\n liveFrames: boolean;\n humanInput: boolean;\n diagnostics: boolean;\n rawCdp: boolean;\n linkedComputer: boolean;\n};\n\n/** One live browser-profile endpoint on an enrolled machine. Saved, reusable\n * login state is represented separately by BrowserIdentity. */\nexport type AttachedBrowserDevice = {\n id: string;\n accountId: string;\n workspaceId: string;\n enrollmentId: string;\n name: string;\n profileLabel: string | null;\n browserName: string;\n browserVersion: string;\n extensionVersion: string;\n platform: \"linux\" | \"macos\" | \"windows\";\n architecture: \"x64\" | \"arm64\";\n state: \"connected\" | \"disconnected\";\n connectionGeneration: string;\n inventoryRevision: number;\n tabCount: number;\n capabilities: AttachedBrowserDeviceCapabilities;\n lastSeenAt: string;\n disconnectedAt: string | null;\n createdAt: string;\n updatedAt: string;\n};\n\nexport type AttachedBrowserDeviceListResponse = {\n revision: number;\n devices: AttachedBrowserDevice[];\n};\n\nexport type InteractionControllerBinding = {\n controllerId: string;\n controllerGeneration: string;\n placementInstanceId: string;\n};\n\nexport type InteractionAssociation = {\n sessionId: string;\n turnId: string | null;\n attemptId: string | null;\n relationship: \"created\" | \"using\" | \"observing\" | \"related\";\n actorSubjectId: string;\n lastUsedAt: string;\n};\n\nexport type InteractionLifecycle =\n | \"starting\"\n | \"active\"\n | \"suspending\"\n | \"suspended\"\n | \"restoring\"\n | \"repair_required\"\n | \"lost\"\n | \"ending\"\n | \"ended\"\n | \"failed\";\n\nexport type BrowserSessionCapabilities = {\n semanticObservation: boolean;\n screenshots: boolean;\n liveFrames: boolean;\n humanInput: boolean;\n tabs: boolean;\n downloads: boolean;\n uploads: boolean;\n clipboard: boolean;\n diagnostics: boolean;\n rawCdp: boolean;\n linkedComputer: boolean;\n privateCheckpoint: boolean;\n identityPublication: boolean;\n parallelTargets: boolean;\n};\n\nexport type BrowserSession = {\n id: string;\n accountId: string;\n workspaceId: string;\n name: string;\n lifecycle: InteractionLifecycle;\n placement: InteractionPlacement;\n controller: InteractionControllerBinding | null;\n driverId: string;\n engine: \"chromium\" | \"chrome\" | \"firefox\" | \"webkit\" | \"lightpanda\" | \"external\";\n engineVersion: string | null;\n headless: boolean;\n identityId: string | null;\n baseRevisionId: string | null;\n networkRouteId: string | null;\n linkedComputerSessionId: string | null;\n capabilities: BrowserSessionCapabilities;\n associations: InteractionAssociation[];\n createdBySubjectId: string;\n createdAt: string;\n lastUsedAt: string;\n failureCode: string | null;\n};\n\nexport type BrowserIdentityStatus = \"active\" | \"archived\";\nexport type BrowserRevisionComponentKind =\n | \"chromium_profile\"\n | \"normalized_web_state\"\n | \"provider_snapshot\";\nexport type BrowserRevisionPortability = \"portable\" | \"provider_bound\" | \"placement_bound\";\n\nexport type BrowserRevisionMaterialization = {\n portability: BrowserRevisionPortability;\n reason: string | null;\n platform: \"linux\" | \"macos\" | \"windows\" | null;\n architecture: \"x64\" | \"arm64\" | null;\n engine: \"chromium\" | \"chrome\" | \"firefox\" | \"webkit\" | \"lightpanda\" | \"external\";\n engineVersion: string | null;\n driverId: string;\n driverSchemaVersion: number;\n profileCrypto: \"chromium_basic\" | \"chromium_mock_keychain\" | \"platform_bound\";\n providerId: string | null;\n placement: InteractionPlacement | null;\n};\n\nexport type BrowserRevisionComponent = {\n id: string;\n kind: BrowserRevisionComponentKind;\n format: string;\n artifactDigest: string;\n sizeBytes: number;\n materialization: BrowserRevisionMaterialization;\n};\n\nexport type BrowserRevision = {\n id: string;\n accountId: string;\n workspaceId: string;\n identityId: string;\n parentRevisionId: string | null;\n ordinal: number;\n sourceBrowserSessionId: string;\n manifestDigest: string;\n components: BrowserRevisionComponent[];\n createdBySubjectId: string;\n createdAt: string;\n};\n\nexport type BrowserIdentity = {\n id: string;\n accountId: string;\n workspaceId: string;\n name: string;\n status: BrowserIdentityStatus;\n defaultRevisionId: string | null;\n headGeneration: number;\n revisionCount: number;\n createdBySubjectId: string;\n createdAt: string;\n updatedAt: string;\n};\n\nexport type BrowserIdentityListResponse = {\n revision: number;\n identities: BrowserIdentity[];\n};\n\nexport type BrowserRevisionListResponse = {\n identity: BrowserIdentity;\n revisions: BrowserRevision[];\n};\n\nexport type CreateBrowserIdentityRequest = {\n operationId: string;\n name: string;\n};\n\nexport type BrowserIdentityMutationResponse = {\n identity: BrowserIdentity;\n operationId: string;\n replayed: boolean;\n};\n\nexport type PublishBrowserRevisionRequest = {\n operationId: string;\n identityId: string;\n expectedHeadGeneration: number;\n advanceDefault?: boolean | undefined;\n};\n\nexport type PublishBrowserRevisionResponse = {\n identity: BrowserIdentity;\n revision: BrowserRevision;\n outcome: \"saved_as_default\" | \"saved_not_default\";\n replayed: boolean;\n};\n\nexport type BrowserTarget = {\n id: string;\n browserSessionId: string;\n controllerGeneration: string;\n targetGeneration: string;\n documentGeneration: string | null;\n kind: \"page\" | \"popup\" | \"background_page\" | \"worker\";\n title: string;\n url: string;\n selected: boolean;\n attached: boolean;\n createdAt: string;\n};\n\nexport type InteractionRect = {\n x: number;\n y: number;\n width: number;\n height: number;\n};\n\nexport type InteractionRedactedValue = {\n redacted: true;\n reason: \"password\" | \"payment\" | \"private\" | \"policy\";\n};\n\nexport type InteractionSemanticNode = {\n ref: string;\n role: string;\n identifier?: string | undefined;\n name?: string | undefined;\n description?: string | undefined;\n value?: string | InteractionRedactedValue | undefined;\n states: string[];\n bounds?: InteractionRect | undefined;\n actions: string[];\n children?: InteractionSemanticNode[] | undefined;\n native?: { platform: \"dom\" | \"mac_ax\" | \"at_spi\" | \"uia\"; data: unknown } | undefined;\n};\n\nexport type InteractionSemanticSnapshot = {\n kind: \"snapshot\";\n roots: InteractionSemanticNode[];\n nodeCount: number;\n};\n\nexport type InteractionSemanticDiff = {\n kind: \"diff\";\n baseObservationId: string;\n removedRefs: string[];\n changed: InteractionSemanticNode[];\n};\n\nexport type InteractionDiagnosticSummary = {\n consoleErrorCount: number;\n failedRequestCount: number;\n downloadCount: number;\n pageErrorCount: number;\n};\n\nexport type BrowserDialog = {\n type: \"alert\" | \"confirm\" | \"prompt\" | \"beforeunload\";\n message: string;\n defaultPrompt: string;\n openedAt: string;\n};\n\nexport type BrowserObservation = {\n protocolVersion: typeof INTERACTION_PROTOCOL_VERSION;\n observationId: string;\n browserSessionId: string;\n target: BrowserTarget;\n frameId: string | null;\n semantic: InteractionSemanticSnapshot | InteractionSemanticDiff | null;\n screenshot: RetainedArtifactReference | null;\n focusedRef: string | null;\n changedRegions: InteractionRect[];\n diagnostics: InteractionDiagnosticSummary;\n dialog: BrowserDialog | null;\n observedAt: string;\n};\n\nexport type BrowserDiagnosticKind = \"console\" | \"page_error\" | \"failed_request\" | \"download\";\n\nexport type BrowserDiagnosticEntry = {\n sequence: number;\n kind: BrowserDiagnosticKind;\n level: \"debug\" | \"info\" | \"warning\" | \"error\" | null;\n message: string;\n url: string | null;\n method: string | null;\n status: number | null;\n filename: string | null;\n occurredAt: string;\n};\n\nexport type BrowserDiagnosticBatch = {\n browserSessionId: string;\n controllerGeneration: string;\n targetId: string;\n targetGeneration: string;\n entries: BrowserDiagnosticEntry[];\n cursor: number;\n truncated: boolean;\n};\n\nexport type BrowserLocator =\n | { kind: \"ref\"; ref: string }\n | {\n kind: \"role\";\n role: string;\n name?: string | undefined;\n exact?: boolean | undefined;\n }\n | { kind: \"label\"; text: string }\n | { kind: \"text\"; text: string }\n | { kind: \"placeholder\"; text: string }\n | { kind: \"test_id\"; value: string }\n | { kind: \"css\"; selector: string };\n\nexport type BrowserAction =\n | { type: \"navigate\"; url: string }\n | {\n type: \"click\";\n locator: BrowserLocator;\n button?: \"left\" | \"right\" | \"middle\" | undefined;\n }\n | { type: \"double_click\"; locator: BrowserLocator }\n | { type: \"hover\"; locator: BrowserLocator }\n | { type: \"fill\"; locator: BrowserLocator; value: string }\n | { type: \"type\"; locator?: BrowserLocator | undefined; text: string }\n | { type: \"press\"; locator?: BrowserLocator | undefined; key: string }\n | { type: \"select\"; locator: BrowserLocator; values: string[] }\n | { type: \"check\"; locator: BrowserLocator; checked: boolean }\n | {\n type: \"scroll\";\n locator?: BrowserLocator | undefined;\n deltaX: number;\n deltaY: number;\n }\n | { type: \"drag\"; from: BrowserLocator; to: BrowserLocator }\n | {\n type: \"pointer\";\n action: \"click\" | \"double_click\" | \"move\" | \"scroll\" | \"drag\";\n x: number;\n y: number;\n endX?: number | undefined;\n endY?: number | undefined;\n deltaX?: number | undefined;\n deltaY?: number | undefined;\n button?: \"left\" | \"right\" | \"middle\" | undefined;\n }\n | {\n type: \"handle_dialog\";\n response: \"accept\" | \"dismiss\";\n promptText?: string | undefined;\n }\n | { type: \"upload\"; locator: BrowserLocator; workspaceFileIds: string[] }\n | {\n type: \"wait\";\n condition: \"load\" | \"network_idle\" | \"visible\" | \"hidden\";\n locator?: BrowserLocator | undefined;\n timeoutMs?: number | undefined;\n };\n\nexport type BrowserActionBatch = { type: \"batch\"; actions: BrowserAction[] };\n\nexport type InteractionError = {\n code:\n | \"resource_not_found\"\n | \"resource_unavailable\"\n | \"controller_stale\"\n | \"target_not_found\"\n | \"target_stale\"\n | \"observation_stale\"\n | \"document_stale\"\n | \"frame_stale\"\n | \"locator_not_found\"\n | \"locator_ambiguous\"\n | \"unsupported\"\n | \"permission_denied\"\n | \"machine_locked\"\n | \"attempt_stale\"\n | \"operation_conflict\"\n | \"outcome_unknown\"\n | \"invalid_action\"\n | \"timeout\"\n | \"controller_lost\"\n | \"driver_failed\";\n message: string;\n retryable: boolean;\n details?: Record<string, InteractionJsonValue> | undefined;\n};\n\nexport type InteractionOperationState =\n | \"prepared\"\n | \"dispatched\"\n | \"completed\"\n | \"failed\"\n | \"outcome_unknown\";\n\nexport type InteractionLifecycleOperationReceipt = {\n operationId: string;\n resourceKind: \"browser_session\" | \"computer_session\";\n resourceId: string;\n kind: \"create\" | \"resume\" | \"suspend\" | \"end\" | \"publish\";\n state: InteractionOperationState;\n replayed: boolean;\n error: InteractionError | null;\n createdAt: string;\n dispatchedAt: string | null;\n settledAt: string | null;\n};\n\nexport type CreateBrowserSessionRequest = {\n operationId: string;\n sessionId: string;\n name?: string | undefined;\n initialUrl?: string | undefined;\n headless?: boolean | undefined;\n placement?: InteractionPlacement | undefined;\n identityId?: string | undefined;\n baseRevisionId?: string | undefined;\n linkedComputerSessionId?: string | undefined;\n};\n\nexport type BrowserSessionListResponse = {\n revision: number;\n sessions: BrowserSession[];\n};\n\nexport type BrowserSessionMutationResponse = {\n session: BrowserSession;\n operation: InteractionLifecycleOperationReceipt;\n};\n\nexport type BrowserSessionLifecycleRequest = { operationId: string };\nexport type BrowserOpenTargetRequest = { url?: string | undefined };\n\nexport type BrowserTargetListResponse = {\n browserSessionId: string;\n controllerGeneration: string;\n targets: BrowserTarget[];\n};\n\nexport type InteractionFrameStreamAttachment<RelayKind extends 3 | 4 = 3 | 4> =\n | { kind: \"direct_websocket\"; url: string; protocols: string[] }\n | {\n kind: \"relay\";\n url: string;\n token: string;\n channel: {\n channelId: string;\n workspaceId: string;\n agentId: string;\n kind: RelayKind;\n port: number;\n };\n };\n\nexport type BrowserSessionAttachment = {\n browserSessionId: string;\n controllerGeneration: string;\n targetId: string;\n stream: InteractionFrameStreamAttachment<3>;\n expiresAt: string;\n};\n\nexport type BrowserSessionAttachmentRequest = {\n targetId: string;\n expiresInSeconds?: number | undefined;\n stream?: BrowserFrameStreamOptions | undefined;\n};\n\nexport type BrowserActionRequest = {\n operationId: string;\n targetId: string;\n expectedTargetGeneration: string;\n expectedDocumentGeneration: string | null;\n expectedFrameId: string | null;\n action: BrowserAction | BrowserActionBatch;\n};\n\nexport type BrowserActionReceipt = {\n protocolVersion: typeof INTERACTION_PROTOCOL_VERSION;\n operationId: string;\n browserSessionId: string;\n controllerGeneration: string;\n targetId: string;\n state: InteractionOperationState;\n dispatchedAt: string | null;\n settledAt: string | null;\n observation: BrowserObservation | null;\n error: InteractionError | null;\n};\n\nexport type BrowserSessionHeartbeatResponse = {\n browserSessionId: string;\n controllerGeneration: string;\n alive: true;\n};\n\nexport type ComputerSessionCapabilities = {\n semanticObservation: boolean;\n appDiscovery: boolean;\n appLaunch: boolean;\n windowCapture: boolean;\n screenCapture: boolean;\n semanticActions: boolean;\n pointerInput: boolean;\n keyboardInput: boolean;\n backgroundActions: boolean;\n parallelApps: boolean;\n};\n\nexport type ComputerSession = {\n id: string;\n accountId: string;\n workspaceId: string;\n name: string;\n lifecycle: InteractionLifecycle;\n placement: InteractionPlacement;\n controller: InteractionControllerBinding | null;\n platform: \"linux\" | \"macos\" | \"windows\" | null;\n adapter: string | null;\n seatId: string | null;\n displayId: string | null;\n capabilities: ComputerSessionCapabilities | null;\n associations: InteractionAssociation[];\n createdBySubjectId: string;\n createdAt: string;\n lastUsedAt: string;\n failureCode: string | null;\n};\n\nexport type ComputerTarget = {\n id: string;\n computerSessionId: string;\n controllerGeneration: string;\n targetGeneration: string;\n kind: \"app\" | \"window\" | \"screen\";\n applicationId: string | null;\n processId: number | null;\n title: string;\n bounds: InteractionRect | null;\n focused: boolean;\n};\n\nexport type ComputerObservation = {\n protocolVersion: typeof INTERACTION_PROTOCOL_VERSION;\n observationId: string;\n computerSessionId: string;\n target: ComputerTarget;\n frameId: string | null;\n semantic: InteractionSemanticSnapshot | InteractionSemanticDiff | null;\n screenshot: RetainedArtifactReference | null;\n focusedRef: string | null;\n changedRegions: InteractionRect[];\n observedAt: string;\n};\n\nexport type ComputerLocator =\n | { kind: \"ref\"; ref: string }\n | {\n kind: \"role\";\n role: string;\n name?: string | undefined;\n exact?: boolean | undefined;\n }\n | { kind: \"label\"; text: string; exact?: boolean | undefined }\n | { kind: \"text\"; text: string; exact?: boolean | undefined }\n | { kind: \"identifier\"; value: string };\n\nexport type ComputerAction =\n | {\n type: \"semantic\";\n locator: ComputerLocator;\n action:\n | \"invoke\"\n | \"focus\"\n | \"set_value\"\n | \"increment\"\n | \"decrement\"\n | \"select\"\n | \"deselect\"\n | \"expand\"\n | \"collapse\"\n | \"show_menu\"\n | \"scroll_into_view\";\n value?: string | number | boolean | undefined;\n }\n | {\n type: \"pointer\";\n frameId: string;\n action: \"click\" | \"double_click\" | \"move\" | \"scroll\" | \"drag\";\n x: number;\n y: number;\n endX?: number | undefined;\n endY?: number | undefined;\n deltaX?: number | undefined;\n deltaY?: number | undefined;\n button?: \"left\" | \"right\" | \"middle\" | undefined;\n }\n | { type: \"keyboard\"; action: \"type\" | \"press\"; value: string }\n | { type: \"focus\"; targetId: string }\n | { type: \"launch\"; applicationId: string };\n\nexport type CreateComputerSessionRequest = {\n operationId: string;\n sessionId: string;\n name?: string | undefined;\n placement?: InteractionPlacement | undefined;\n};\n\nexport type ComputerSessionListResponse = {\n revision: number;\n sessions: ComputerSession[];\n};\n\nexport type ComputerSessionMutationResponse = {\n session: ComputerSession;\n operation: InteractionLifecycleOperationReceipt;\n};\n\nexport type ComputerSessionLifecycleRequest = { operationId: string };\n\nexport type ComputerTargetListResponse = {\n computerSessionId: string;\n controllerGeneration: string;\n targets: ComputerTarget[];\n};\n\nexport type InteractionFrameStreamOptions = {\n format?: \"jpeg\" | \"png\" | undefined;\n quality?: number | undefined;\n maxWidth?: number | undefined;\n maxHeight?: number | undefined;\n everyNthFrame?: number | undefined;\n};\n\nexport type ComputerFrameStreamOptions = InteractionFrameStreamOptions;\n\nexport type ComputerSessionAttachment = {\n computerSessionId: string;\n controllerGeneration: string;\n targetId: string;\n stream: InteractionFrameStreamAttachment<4>;\n expiresAt: string;\n};\n\nexport type ComputerSessionAttachmentRequest = {\n targetId: string;\n expiresInSeconds?: number | undefined;\n stream?: ComputerFrameStreamOptions | undefined;\n};\n\nexport type ComputerActionRequest = {\n operationId: string;\n targetId: string;\n expectedTargetGeneration: string;\n expectedObservationId: string | null;\n expectedFrameId: string | null;\n action: ComputerAction;\n};\n\nexport type ComputerActionReceipt = {\n protocolVersion: typeof INTERACTION_PROTOCOL_VERSION;\n operationId: string;\n computerSessionId: string;\n controllerGeneration: string;\n targetId: string;\n state: InteractionOperationState;\n dispatchedAt: string | null;\n settledAt: string | null;\n observation: ComputerObservation | null;\n error: InteractionError | null;\n};\n\nexport type ComputerSessionHeartbeatResponse = {\n computerSessionId: string;\n controllerGeneration: string;\n alive: true;\n};\n\nexport type BrowserDiagnosticsOptions = {\n kinds?: BrowserDiagnosticKind[] | undefined;\n after?: number | undefined;\n limit?: number | undefined;\n signal?: AbortSignal | undefined;\n};\n\n/** The exact HTTP surface needed by the framework-free interaction client. */\nexport interface InteractionTransport {\n listAttachedBrowsers(\n workspaceId: string,\n options?: AttachedBrowserDeviceListOptions,\n ): Promise<AttachedBrowserDeviceListResponse>;\n getAttachedBrowser(\n workspaceId: string,\n deviceId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<AttachedBrowserDevice>;\n listBrowserIdentities(\n workspaceId: string,\n options?: BrowserIdentityListOptions,\n ): Promise<BrowserIdentityListResponse>;\n getBrowserIdentity(\n workspaceId: string,\n identityId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserIdentity>;\n createBrowserIdentity(\n workspaceId: string,\n request: CreateBrowserIdentityRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserIdentityMutationResponse>;\n listBrowserRevisions(\n workspaceId: string,\n identityId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserRevisionListResponse>;\n listBrowserSessions(\n workspaceId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserSessionListResponse>;\n getBrowserSession(\n workspaceId: string,\n browserSessionId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserSession>;\n createBrowserSession(\n workspaceId: string,\n request: CreateBrowserSessionRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserSessionMutationResponse>;\n listBrowserTargets(\n workspaceId: string,\n browserSessionId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserTargetListResponse>;\n openBrowserTarget(\n workspaceId: string,\n browserSessionId: string,\n request?: BrowserOpenTargetRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserTarget>;\n selectBrowserTarget(\n workspaceId: string,\n browserSessionId: string,\n targetId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserTarget>;\n closeBrowserTarget(\n workspaceId: string,\n browserSessionId: string,\n targetId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserTargetListResponse>;\n observeBrowserTarget(\n workspaceId: string,\n browserSessionId: string,\n targetId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserObservation>;\n actInBrowser(\n workspaceId: string,\n browserSessionId: string,\n request: BrowserActionRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserActionReceipt>;\n getBrowserActionReceipt(\n workspaceId: string,\n browserSessionId: string,\n operationId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserActionReceipt>;\n listBrowserDiagnostics(\n workspaceId: string,\n browserSessionId: string,\n targetId: string,\n options?: BrowserDiagnosticsOptions,\n ): Promise<BrowserDiagnosticBatch>;\n attachBrowserSession(\n workspaceId: string,\n browserSessionId: string,\n request: BrowserSessionAttachmentRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserSessionAttachment>;\n heartbeatBrowserSession(\n workspaceId: string,\n browserSessionId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserSessionHeartbeatResponse>;\n publishBrowserRevision(\n workspaceId: string,\n browserSessionId: string,\n request: PublishBrowserRevisionRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<PublishBrowserRevisionResponse>;\n suspendBrowserSession(\n workspaceId: string,\n browserSessionId: string,\n request: BrowserSessionLifecycleRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserSessionMutationResponse>;\n resumeBrowserSession(\n workspaceId: string,\n browserSessionId: string,\n request: BrowserSessionLifecycleRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserSessionMutationResponse>;\n endBrowserSession(\n workspaceId: string,\n browserSessionId: string,\n request: BrowserSessionLifecycleRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<BrowserSessionMutationResponse>;\n listComputerSessions(\n workspaceId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<ComputerSessionListResponse>;\n getComputerSession(\n workspaceId: string,\n computerSessionId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<ComputerSession>;\n createComputerSession(\n workspaceId: string,\n request: CreateComputerSessionRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<ComputerSessionMutationResponse>;\n listComputerTargets(\n workspaceId: string,\n computerSessionId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<ComputerTargetListResponse>;\n observeComputerTarget(\n workspaceId: string,\n computerSessionId: string,\n targetId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<ComputerObservation>;\n actInComputer(\n workspaceId: string,\n computerSessionId: string,\n request: ComputerActionRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<ComputerActionReceipt>;\n getComputerActionReceipt(\n workspaceId: string,\n computerSessionId: string,\n operationId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<ComputerActionReceipt>;\n attachComputerSession(\n workspaceId: string,\n computerSessionId: string,\n request: ComputerSessionAttachmentRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<ComputerSessionAttachment>;\n heartbeatComputerSession(\n workspaceId: string,\n computerSessionId: string,\n options?: OpenGeniRequestOptions,\n ): Promise<ComputerSessionHeartbeatResponse>;\n endComputerSession(\n workspaceId: string,\n computerSessionId: string,\n request: ComputerSessionLifecycleRequest,\n options?: OpenGeniRequestOptions,\n ): Promise<ComputerSessionMutationResponse>;\n}\n\n/** @deprecated Use InteractionTransport. */\nexport type BrowserInteractionTransport = InteractionTransport;\n\nexport type BrowserIdentityListOptions = OpenGeniRequestOptions & {\n includeArchived?: boolean | undefined;\n};\n\nexport type AttachedBrowserDeviceListOptions = OpenGeniRequestOptions & {\n includeDisconnected?: boolean | undefined;\n};\n\nexport type CurrentOrOpenBrowserOptions = {\n workspaceId: string;\n associationSessionId: string;\n operationId?: string | undefined;\n name?: string | undefined;\n initialUrl?: string | undefined;\n headless?: boolean | undefined;\n placement?: InteractionPlacement | undefined;\n identityId?: string | undefined;\n baseRevisionId?: string | undefined;\n linkedComputerSessionId?: string | undefined;\n signal?: AbortSignal | undefined;\n};\n\nexport type CurrentOrOpenComputerOptions = {\n workspaceId: string;\n associationSessionId: string;\n operationId?: string | undefined;\n name?: string | undefined;\n placement?: InteractionPlacement | undefined;\n signal?: AbortSignal | undefined;\n};\n\n/** Framework-free resource facade over the public interaction HTTP API. */\nexport class OpenGeniInteractionClient {\n readonly attachedBrowsers: AttachedBrowserDeviceCollection;\n readonly browsers: BrowserSessionCollection;\n readonly computers: ComputerSessionCollection;\n readonly identities: BrowserIdentityCollection;\n\n constructor(transport: BrowserInteractionTransport) {\n this.attachedBrowsers = new AttachedBrowserDeviceCollection(transport);\n this.browsers = new BrowserSessionCollection(transport);\n this.computers = new ComputerSessionCollection(transport);\n this.identities = new BrowserIdentityCollection(transport);\n }\n}\n\nexport class AttachedBrowserDeviceCollection {\n constructor(private readonly transport: BrowserInteractionTransport) {}\n\n async list(\n workspaceId: string,\n options: AttachedBrowserDeviceListOptions = {},\n ): Promise<AttachedBrowserDeviceListResponse> {\n return await this.transport.listAttachedBrowsers(workspaceId, options);\n }\n\n device(workspaceId: string, deviceId: string): AttachedBrowserDeviceResource {\n return new AttachedBrowserDeviceResource(this.transport, workspaceId, deviceId);\n }\n}\n\nexport class AttachedBrowserDeviceResource {\n constructor(\n private readonly transport: BrowserInteractionTransport,\n readonly workspaceId: string,\n readonly id: string,\n ) {}\n\n async get(options: OpenGeniRequestOptions = {}): Promise<AttachedBrowserDevice> {\n return await this.transport.getAttachedBrowser(this.workspaceId, this.id, options);\n }\n}\n\nexport class BrowserIdentityCollection {\n constructor(private readonly transport: BrowserInteractionTransport) {}\n\n async list(\n workspaceId: string,\n options: BrowserIdentityListOptions = {},\n ): Promise<BrowserIdentityListResponse> {\n return await this.transport.listBrowserIdentities(workspaceId, options);\n }\n\n identity(workspaceId: string, identityId: string): BrowserIdentityResource {\n return new BrowserIdentityResource(this.transport, workspaceId, identityId);\n }\n\n async create(\n workspaceId: string,\n request: CreateBrowserIdentityRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<BrowserIdentityResource> {\n const response = await this.transport.createBrowserIdentity(workspaceId, request, options);\n return this.identity(workspaceId, response.identity.id);\n }\n}\n\nexport class BrowserIdentityResource {\n constructor(\n private readonly transport: BrowserInteractionTransport,\n readonly workspaceId: string,\n readonly id: string,\n ) {}\n\n async get(options: OpenGeniRequestOptions = {}): Promise<BrowserIdentity> {\n return await this.transport.getBrowserIdentity(this.workspaceId, this.id, options);\n }\n\n async revisions(options: OpenGeniRequestOptions = {}): Promise<BrowserRevisionListResponse> {\n return await this.transport.listBrowserRevisions(this.workspaceId, this.id, options);\n }\n}\n\nexport class BrowserSessionCollection {\n constructor(private readonly transport: BrowserInteractionTransport) {}\n\n async list(\n workspaceId: string,\n options: OpenGeniRequestOptions = {},\n ): Promise<BrowserSessionListResponse> {\n return await this.transport.listBrowserSessions(workspaceId, options);\n }\n\n session(workspaceId: string, browserSessionId: string): BrowserSessionResource {\n return new BrowserSessionResource(this.transport, workspaceId, browserSessionId);\n }\n\n async open(\n workspaceId: string,\n request: CreateBrowserSessionRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<BrowserSessionResource> {\n const response = await this.transport.createBrowserSession(workspaceId, request, options);\n return this.session(workspaceId, response.session.id);\n }\n\n async currentOrOpen(options: CurrentOrOpenBrowserOptions): Promise<BrowserSessionResource> {\n const requestOptions = options.signal ? { signal: options.signal } : {};\n const listed = await this.list(options.workspaceId, requestOptions);\n const current = newestRelevantBrowser(listed.sessions, options.associationSessionId);\n if (current) {\n const resource = this.session(options.workspaceId, current.id);\n if (current.lifecycle === \"suspended\") {\n await resource.resume(\n { operationId: options.operationId ?? crypto.randomUUID() },\n requestOptions,\n );\n }\n return resource;\n }\n return await this.open(\n options.workspaceId,\n {\n operationId: options.operationId ?? crypto.randomUUID(),\n sessionId: options.associationSessionId,\n ...(options.name !== undefined ? { name: options.name } : {}),\n ...(options.initialUrl !== undefined ? { initialUrl: options.initialUrl } : {}),\n ...(options.headless !== undefined ? { headless: options.headless } : {}),\n ...(options.placement !== undefined ? { placement: options.placement } : {}),\n ...(options.identityId !== undefined ? { identityId: options.identityId } : {}),\n ...(options.baseRevisionId !== undefined ? { baseRevisionId: options.baseRevisionId } : {}),\n ...(options.linkedComputerSessionId !== undefined\n ? { linkedComputerSessionId: options.linkedComputerSessionId }\n : {}),\n },\n requestOptions,\n );\n }\n}\n\nexport class BrowserSessionResource {\n readonly tabs: BrowserTargetCollection;\n /** Alias for hosts that prefer the protocol term. */\n readonly targets: BrowserTargetCollection;\n\n constructor(\n private readonly transport: BrowserInteractionTransport,\n readonly workspaceId: string,\n readonly id: string,\n ) {\n this.tabs = new BrowserTargetCollection(transport, workspaceId, id);\n this.targets = this.tabs;\n }\n\n async get(options: OpenGeniRequestOptions = {}): Promise<BrowserSession> {\n return await this.transport.getBrowserSession(this.workspaceId, this.id, options);\n }\n\n async observe(\n targetId: string,\n options: OpenGeniRequestOptions = {},\n ): Promise<BrowserObservation> {\n return await this.transport.observeBrowserTarget(this.workspaceId, this.id, targetId, options);\n }\n\n async act(\n request: BrowserActionRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<BrowserActionReceipt> {\n return await this.transport.actInBrowser(this.workspaceId, this.id, request, options);\n }\n\n async receipt(\n operationId: string,\n options: OpenGeniRequestOptions = {},\n ): Promise<BrowserActionReceipt> {\n return await this.transport.getBrowserActionReceipt(\n this.workspaceId,\n this.id,\n operationId,\n options,\n );\n }\n\n async diagnostics(\n targetId: string,\n options: BrowserDiagnosticsOptions = {},\n ): Promise<BrowserDiagnosticBatch> {\n return await this.transport.listBrowserDiagnostics(\n this.workspaceId,\n this.id,\n targetId,\n options,\n );\n }\n\n async attach(\n request: BrowserSessionAttachmentRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<BrowserSessionAttachment> {\n return await this.transport.attachBrowserSession(this.workspaceId, this.id, request, options);\n }\n\n async heartbeat(options: OpenGeniRequestOptions = {}): Promise<BrowserSessionHeartbeatResponse> {\n return await this.transport.heartbeatBrowserSession(this.workspaceId, this.id, options);\n }\n\n async publishRevision(\n request: PublishBrowserRevisionRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<PublishBrowserRevisionResponse> {\n return await this.transport.publishBrowserRevision(this.workspaceId, this.id, request, options);\n }\n\n async suspend(\n request: BrowserSessionLifecycleRequest = {\n operationId: crypto.randomUUID(),\n },\n options: OpenGeniRequestOptions = {},\n ): Promise<BrowserSessionMutationResponse> {\n return await this.transport.suspendBrowserSession(this.workspaceId, this.id, request, options);\n }\n\n async resume(\n request: BrowserSessionLifecycleRequest = {\n operationId: crypto.randomUUID(),\n },\n options: OpenGeniRequestOptions = {},\n ): Promise<BrowserSessionMutationResponse> {\n return await this.transport.resumeBrowserSession(this.workspaceId, this.id, request, options);\n }\n\n async end(\n request: BrowserSessionLifecycleRequest = {\n operationId: crypto.randomUUID(),\n },\n options: OpenGeniRequestOptions = {},\n ): Promise<BrowserSessionMutationResponse> {\n return await this.transport.endBrowserSession(this.workspaceId, this.id, request, options);\n }\n}\n\nexport class BrowserTargetCollection {\n constructor(\n private readonly transport: BrowserInteractionTransport,\n private readonly workspaceId: string,\n private readonly browserSessionId: string,\n ) {}\n\n async list(options: OpenGeniRequestOptions = {}): Promise<BrowserTargetListResponse> {\n return await this.transport.listBrowserTargets(\n this.workspaceId,\n this.browserSessionId,\n options,\n );\n }\n\n async open(url?: string, options: OpenGeniRequestOptions = {}): Promise<BrowserTarget> {\n return await this.transport.openBrowserTarget(\n this.workspaceId,\n this.browserSessionId,\n url === undefined ? {} : { url },\n options,\n );\n }\n\n async select(targetId: string, options: OpenGeniRequestOptions = {}): Promise<BrowserTarget> {\n return await this.transport.selectBrowserTarget(\n this.workspaceId,\n this.browserSessionId,\n targetId,\n options,\n );\n }\n\n async close(\n targetId: string,\n options: OpenGeniRequestOptions = {},\n ): Promise<BrowserTargetListResponse> {\n return await this.transport.closeBrowserTarget(\n this.workspaceId,\n this.browserSessionId,\n targetId,\n options,\n );\n }\n}\n\nexport class ComputerSessionCollection {\n constructor(private readonly transport: BrowserInteractionTransport) {}\n\n async list(\n workspaceId: string,\n options: OpenGeniRequestOptions = {},\n ): Promise<ComputerSessionListResponse> {\n return await this.transport.listComputerSessions(workspaceId, options);\n }\n\n session(workspaceId: string, computerSessionId: string): ComputerSessionResource {\n return new ComputerSessionResource(this.transport, workspaceId, computerSessionId);\n }\n\n async open(\n workspaceId: string,\n request: CreateComputerSessionRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<ComputerSessionResource> {\n const response = await this.transport.createComputerSession(workspaceId, request, options);\n return this.session(workspaceId, response.session.id);\n }\n\n async currentOrOpen(options: CurrentOrOpenComputerOptions): Promise<ComputerSessionResource> {\n const requestOptions = options.signal ? { signal: options.signal } : {};\n const listed = await this.list(options.workspaceId, requestOptions);\n const current = newestRelevantComputer(listed.sessions, options.associationSessionId);\n if (current) {\n return this.session(options.workspaceId, current.id);\n }\n return await this.open(\n options.workspaceId,\n {\n operationId: options.operationId ?? crypto.randomUUID(),\n sessionId: options.associationSessionId,\n ...(options.name !== undefined ? { name: options.name } : {}),\n ...(options.placement !== undefined ? { placement: options.placement } : {}),\n },\n requestOptions,\n );\n }\n}\n\nexport class ComputerSessionResource {\n readonly targets: ComputerTargetCollection;\n /** Native application/window targets are also the public app collection. */\n readonly apps: ComputerTargetCollection;\n\n constructor(\n private readonly transport: BrowserInteractionTransport,\n readonly workspaceId: string,\n readonly id: string,\n ) {\n this.targets = new ComputerTargetCollection(transport, workspaceId, id);\n this.apps = this.targets;\n }\n\n async get(options: OpenGeniRequestOptions = {}): Promise<ComputerSession> {\n return await this.transport.getComputerSession(this.workspaceId, this.id, options);\n }\n\n async observe(\n targetId: string,\n options: OpenGeniRequestOptions = {},\n ): Promise<ComputerObservation> {\n return await this.transport.observeComputerTarget(this.workspaceId, this.id, targetId, options);\n }\n\n async act(\n request: ComputerActionRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<ComputerActionReceipt> {\n return await this.transport.actInComputer(this.workspaceId, this.id, request, options);\n }\n\n async receipt(\n operationId: string,\n options: OpenGeniRequestOptions = {},\n ): Promise<ComputerActionReceipt> {\n return await this.transport.getComputerActionReceipt(\n this.workspaceId,\n this.id,\n operationId,\n options,\n );\n }\n\n async attach(\n request: ComputerSessionAttachmentRequest,\n options: OpenGeniRequestOptions = {},\n ): Promise<ComputerSessionAttachment> {\n return await this.transport.attachComputerSession(this.workspaceId, this.id, request, options);\n }\n\n async heartbeat(options: OpenGeniRequestOptions = {}): Promise<ComputerSessionHeartbeatResponse> {\n return await this.transport.heartbeatComputerSession(this.workspaceId, this.id, options);\n }\n\n async end(\n request: ComputerSessionLifecycleRequest = { operationId: crypto.randomUUID() },\n options: OpenGeniRequestOptions = {},\n ): Promise<ComputerSessionMutationResponse> {\n return await this.transport.endComputerSession(this.workspaceId, this.id, request, options);\n }\n}\n\nexport class ComputerTargetCollection {\n constructor(\n private readonly transport: BrowserInteractionTransport,\n private readonly workspaceId: string,\n private readonly computerSessionId: string,\n ) {}\n\n async list(options: OpenGeniRequestOptions = {}): Promise<ComputerTargetListResponse> {\n return await this.transport.listComputerTargets(\n this.workspaceId,\n this.computerSessionId,\n options,\n );\n }\n}\n\nexport type BrowserFrameMetadata = {\n frameId: string;\n browserSessionId: string;\n controllerGeneration: string;\n targetId: string;\n targetGeneration: string;\n documentGeneration: string;\n sequence: number;\n mediaType: \"image/jpeg\" | \"image/png\";\n width: number;\n height: number;\n deviceScaleFactor: number;\n scrollX: number;\n scrollY: number;\n capturedAt: string;\n};\n\nexport type BrowserFrame = BrowserFrameMetadata & { data: Uint8Array };\n\nexport type ComputerFrameMetadata = {\n frameId: string;\n computerSessionId: string;\n controllerGeneration: string;\n targetId: string;\n targetGeneration: string;\n sequence: number;\n mediaType: \"image/jpeg\" | \"image/png\";\n width: number;\n height: number;\n capturedAt: string;\n sha256: string;\n};\n\nexport type ComputerFrame = ComputerFrameMetadata & { data: Uint8Array };\n\nexport type BrowserFrameStreamOptions = InteractionFrameStreamOptions;\n\n/** Convert a short-lived HTTP attachment URL into its browser WebSocket URL. */\nexport function browserFrameSocketUrl(\n attachment: BrowserSessionAttachment,\n options: BrowserFrameStreamOptions = {},\n): string {\n if (attachment.stream.kind !== \"direct_websocket\") {\n throw new Error(\"relay browser attachments are opened through the relay protocol\");\n }\n const url = new URL(attachment.stream.url);\n if (url.protocol === \"http:\") url.protocol = \"ws:\";\n else if (url.protocol === \"https:\") url.protocol = \"wss:\";\n else if (url.protocol !== \"ws:\" && url.protocol !== \"wss:\") {\n throw new Error(\"browser frame attachment did not contain an HTTP or WebSocket URL\");\n }\n if (options.format !== undefined) url.searchParams.set(\"format\", options.format);\n setBoundedIntegerQuery(url, \"quality\", options.quality, 1, 100);\n setBoundedIntegerQuery(url, \"maxWidth\", options.maxWidth, 1, 4_096);\n setBoundedIntegerQuery(url, \"maxHeight\", options.maxHeight, 1, 4_096);\n setBoundedIntegerQuery(url, \"everyNthFrame\", options.everyNthFrame, 1, 60);\n return url.toString();\n}\n\n/** Convert a direct ComputerSession attachment into its WebSocket URL. */\nexport function computerFrameSocketUrl(\n attachment: ComputerSessionAttachment,\n options: ComputerFrameStreamOptions = {},\n): string {\n if (attachment.stream.kind !== \"direct_websocket\") {\n throw new Error(\"relay computer attachments are opened through the relay protocol\");\n }\n const url = new URL(attachment.stream.url);\n if (url.protocol === \"http:\") url.protocol = \"ws:\";\n else if (url.protocol === \"https:\") url.protocol = \"wss:\";\n else if (url.protocol !== \"ws:\" && url.protocol !== \"wss:\") {\n throw new Error(\"computer frame attachment did not contain an HTTP or WebSocket URL\");\n }\n if (options.format !== undefined) url.searchParams.set(\"format\", options.format);\n setBoundedIntegerQuery(url, \"quality\", options.quality, 1, 100);\n setBoundedIntegerQuery(url, \"maxWidth\", options.maxWidth, 1, 4_096);\n setBoundedIntegerQuery(url, \"maxHeight\", options.maxHeight, 1, 4_096);\n setBoundedIntegerQuery(url, \"everyNthFrame\", options.everyNthFrame, 1, 60);\n return url.toString();\n}\n\n/** Decode one bounded binary frame message from the placement controller. */\nexport function decodeBrowserFrameMessage(message: ArrayBuffer | Uint8Array): BrowserFrame {\n const bytes = message instanceof Uint8Array ? message : new Uint8Array(message);\n if (\n bytes.byteLength < 5 ||\n bytes.byteLength > 4 + BROWSER_CONTROL_MAX_FRAME_HEADER_BYTES + BROWSER_FRAME_MAX_BYTES\n ) {\n throw new Error(\"browser frame message is truncated or too large\");\n }\n const metadataLength = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength).getUint32(\n 0,\n false,\n );\n if (\n metadataLength < 1 ||\n metadataLength > BROWSER_CONTROL_MAX_FRAME_HEADER_BYTES ||\n metadataLength + 4 >= bytes.byteLength\n ) {\n throw new Error(\"browser frame metadata length is invalid\");\n }\n let value: unknown;\n try {\n value = JSON.parse(\n new TextDecoder(\"utf-8\", { fatal: true }).decode(bytes.subarray(4, 4 + metadataLength)),\n );\n } catch {\n throw new Error(\"browser frame metadata is invalid JSON\");\n }\n const metadata = parseBrowserFrameMetadata(value);\n const data = bytes.slice(4 + metadataLength);\n if (data.byteLength < 1 || data.byteLength > BROWSER_FRAME_MAX_BYTES) {\n throw new Error(\"browser frame image is empty or too large\");\n }\n const dimensions = imageDimensions(data, metadata.mediaType);\n if (dimensions.width !== metadata.width || dimensions.height !== metadata.height) {\n throw new Error(\"browser frame image dimensions do not match metadata\");\n }\n return { ...metadata, data };\n}\n\n/** Decode and authenticate one bounded ComputerSession frame. Computer frames\n * carry a content digest because native capture adapters may cross process and\n * relay boundaries before reaching the SDK. */\nexport async function decodeComputerFrameMessage(\n message: ArrayBuffer | Uint8Array,\n): Promise<ComputerFrame> {\n const bytes = message instanceof Uint8Array ? message : new Uint8Array(message);\n if (\n bytes.byteLength < 5 ||\n bytes.byteLength > 4 + BROWSER_CONTROL_MAX_FRAME_HEADER_BYTES + BROWSER_FRAME_MAX_BYTES\n ) {\n throw new Error(\"computer frame message is truncated or too large\");\n }\n const metadataLength = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength).getUint32(\n 0,\n false,\n );\n if (\n metadataLength < 1 ||\n metadataLength > BROWSER_CONTROL_MAX_FRAME_HEADER_BYTES ||\n metadataLength + 4 >= bytes.byteLength\n ) {\n throw new Error(\"computer frame metadata length is invalid\");\n }\n let value: unknown;\n try {\n value = JSON.parse(\n new TextDecoder(\"utf-8\", { fatal: true }).decode(bytes.subarray(4, 4 + metadataLength)),\n );\n } catch {\n throw new Error(\"computer frame metadata is invalid JSON\");\n }\n const metadata = parseComputerFrameMetadata(value);\n const data = bytes.slice(4 + metadataLength);\n if (data.byteLength < 1 || data.byteLength > BROWSER_FRAME_MAX_BYTES) {\n throw new Error(\"computer frame image is empty or too large\");\n }\n const dimensions = imageDimensions(data, metadata.mediaType);\n if (dimensions.width !== metadata.width || dimensions.height !== metadata.height) {\n throw new Error(\"computer frame image dimensions do not match metadata\");\n }\n if ((await sha256Hex(data)) !== metadata.sha256) {\n throw new Error(\"computer frame digest does not match image\");\n }\n return { ...metadata, data };\n}\n\nexport function parseBrowserFrameMetadata(value: unknown): BrowserFrameMetadata {\n if (!isRecord(value)) throw new Error(\"browser frame metadata is invalid\");\n const allowed = new Set([\n \"frameId\",\n \"browserSessionId\",\n \"controllerGeneration\",\n \"targetId\",\n \"targetGeneration\",\n \"documentGeneration\",\n \"sequence\",\n \"mediaType\",\n \"width\",\n \"height\",\n \"deviceScaleFactor\",\n \"scrollX\",\n \"scrollY\",\n \"capturedAt\",\n ]);\n if (Object.keys(value).some((key) => !allowed.has(key))) {\n throw new Error(\"browser frame metadata contains unknown fields\");\n }\n const strings = [\n \"frameId\",\n \"browserSessionId\",\n \"controllerGeneration\",\n \"targetId\",\n \"targetGeneration\",\n \"documentGeneration\",\n \"mediaType\",\n \"capturedAt\",\n ] as const;\n for (const key of strings) {\n const item = value[key];\n const max = key === \"targetId\" ? 512 : key === \"capturedAt\" ? 128 : 256;\n if (typeof item !== \"string\" || item.length < 1 || utf8Bytes(item) > max) {\n throw new Error(\"browser frame metadata is invalid\");\n }\n }\n const numbers = [\n \"sequence\",\n \"width\",\n \"height\",\n \"deviceScaleFactor\",\n \"scrollX\",\n \"scrollY\",\n ] as const;\n for (const key of numbers) {\n if (typeof value[key] !== \"number\" || !Number.isFinite(value[key])) {\n throw new Error(\"browser frame metadata is invalid\");\n }\n }\n const metadata = value as unknown as BrowserFrameMetadata;\n if (\n !Number.isSafeInteger(metadata.sequence) ||\n metadata.sequence < 0 ||\n !Number.isSafeInteger(metadata.width) ||\n !Number.isSafeInteger(metadata.height)\n ) {\n throw new Error(\"browser frame metadata integers are invalid\");\n }\n assertImageDimensions(metadata.width, metadata.height);\n if (\n metadata.deviceScaleFactor <= 0 ||\n metadata.deviceScaleFactor > 16 ||\n Math.abs(metadata.scrollX) > 1_000_000_000 ||\n Math.abs(metadata.scrollY) > 1_000_000_000\n ) {\n throw new Error(\"browser frame geometry metadata is invalid\");\n }\n if (metadata.mediaType !== \"image/jpeg\" && metadata.mediaType !== \"image/png\") {\n throw new Error(\"browser frame media type is invalid\");\n }\n if (!isUuid(metadata.browserSessionId)) throw new Error(\"browser frame session id is invalid\");\n if (!/^[A-Za-z0-9][A-Za-z0-9._:-]*$/u.test(metadata.controllerGeneration)) {\n throw new Error(\"browser frame controller generation is invalid\");\n }\n if (!Number.isFinite(new Date(metadata.capturedAt).valueOf())) {\n throw new Error(\"browser frame timestamp is invalid\");\n }\n return metadata;\n}\n\nexport function parseComputerFrameMetadata(value: unknown): ComputerFrameMetadata {\n if (!isRecord(value)) throw new Error(\"computer frame metadata is invalid\");\n const allowed = new Set([\n \"frameId\",\n \"computerSessionId\",\n \"controllerGeneration\",\n \"targetId\",\n \"targetGeneration\",\n \"sequence\",\n \"mediaType\",\n \"width\",\n \"height\",\n \"capturedAt\",\n \"sha256\",\n ]);\n if (Object.keys(value).some((key) => !allowed.has(key))) {\n throw new Error(\"computer frame metadata contains unknown fields\");\n }\n const strings = [\n \"frameId\",\n \"computerSessionId\",\n \"controllerGeneration\",\n \"targetId\",\n \"targetGeneration\",\n \"mediaType\",\n \"capturedAt\",\n \"sha256\",\n ] as const;\n for (const key of strings) {\n const item = value[key];\n const max = key === \"targetId\" ? 512 : key === \"capturedAt\" ? 128 : 256;\n if (typeof item !== \"string\" || item.length < 1 || utf8Bytes(item) > max) {\n throw new Error(\"computer frame metadata is invalid\");\n }\n }\n const metadata = value as unknown as ComputerFrameMetadata;\n if (\n !Number.isSafeInteger(metadata.sequence) ||\n metadata.sequence < 0 ||\n !Number.isSafeInteger(metadata.width) ||\n !Number.isSafeInteger(metadata.height)\n ) {\n throw new Error(\"computer frame metadata integers are invalid\");\n }\n assertImageDimensions(metadata.width, metadata.height);\n if (metadata.mediaType !== \"image/jpeg\" && metadata.mediaType !== \"image/png\") {\n throw new Error(\"computer frame media type is invalid\");\n }\n if (!isUuid(metadata.computerSessionId)) {\n throw new Error(\"computer frame session id is invalid\");\n }\n if (!/^[A-Za-z0-9][A-Za-z0-9._:-]*$/u.test(metadata.controllerGeneration)) {\n throw new Error(\"computer frame controller generation is invalid\");\n }\n if (!Number.isFinite(new Date(metadata.capturedAt).valueOf())) {\n throw new Error(\"computer frame timestamp is invalid\");\n }\n if (!/^[0-9a-f]{64}$/u.test(metadata.sha256)) {\n throw new Error(\"computer frame digest is invalid\");\n }\n return metadata;\n}\n\nfunction newestRelevantBrowser(\n sessions: readonly BrowserSession[],\n associationSessionId: string,\n): BrowserSession | null {\n const live = sessions.filter(\n (session) =>\n ![\"ending\", \"ended\", \"failed\", \"lost\"].includes(session.lifecycle) &&\n session.associations.some((association) => association.sessionId === associationSessionId),\n );\n live.sort(\n (left, right) =>\n browserRelevance(right, associationSessionId) - browserRelevance(left, associationSessionId),\n );\n return live[0] ?? null;\n}\n\nfunction newestRelevantComputer(\n sessions: readonly ComputerSession[],\n associationSessionId: string,\n): ComputerSession | null {\n const live = sessions.filter(\n (session) =>\n [\"starting\", \"active\", \"restoring\"].includes(session.lifecycle) &&\n session.associations.some((association) => association.sessionId === associationSessionId),\n );\n live.sort(\n (left, right) =>\n computerRelevance(right, associationSessionId) -\n computerRelevance(left, associationSessionId),\n );\n return live[0] ?? null;\n}\n\nfunction browserRelevance(session: BrowserSession, associationSessionId: string): number {\n const association = session.associations\n .filter((item) => item.sessionId === associationSessionId)\n .map((item) => Date.parse(item.lastUsedAt))\n .filter(Number.isFinite)\n .reduce((best, timestamp) => Math.max(best, timestamp), 0);\n const used = Date.parse(session.lastUsedAt);\n return Math.max(association, Number.isFinite(used) ? used : 0);\n}\n\nfunction computerRelevance(session: ComputerSession, associationSessionId: string): number {\n const association = session.associations\n .filter((item) => item.sessionId === associationSessionId)\n .map((item) => Date.parse(item.lastUsedAt))\n .filter(Number.isFinite)\n .reduce((best, timestamp) => Math.max(best, timestamp), 0);\n const used = Date.parse(session.lastUsedAt);\n return Math.max(association, Number.isFinite(used) ? used : 0);\n}\n\nfunction setBoundedIntegerQuery(\n url: URL,\n name: string,\n value: number | undefined,\n min: number,\n max: number,\n): void {\n if (value === undefined) return;\n if (!Number.isSafeInteger(value) || value < min || value > max) {\n throw new Error(`browser frame ${name} must be an integer between ${min} and ${max}`);\n }\n url.searchParams.set(name, String(value));\n}\n\nfunction imageDimensions(\n data: Uint8Array,\n mediaType: BrowserFrameMetadata[\"mediaType\"],\n): { width: number; height: number } {\n const dimensions = mediaType === \"image/png\" ? pngDimensions(data) : jpegDimensions(data);\n assertImageDimensions(dimensions.width, dimensions.height);\n return dimensions;\n}\n\nfunction assertImageDimensions(width: number, height: number): void {\n if (\n !Number.isSafeInteger(width) ||\n !Number.isSafeInteger(height) ||\n width < 1 ||\n height < 1 ||\n width > BROWSER_FRAME_MAX_DIMENSION ||\n height > BROWSER_FRAME_MAX_DIMENSION ||\n width * height > BROWSER_FRAME_MAX_PIXELS\n ) {\n throw new Error(\"browser image dimensions exceed their bounded envelope\");\n }\n}\n\nfunction pngDimensions(data: Uint8Array): { width: number; height: number } {\n const signature = [137, 80, 78, 71, 13, 10, 26, 10];\n if (\n data.byteLength < 24 ||\n !signature.every((byte, index) => data[index] === byte) ||\n String.fromCharCode(...data.slice(12, 16)) !== \"IHDR\"\n ) {\n throw new Error(\"browser returned an invalid PNG image\");\n }\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n return { width: view.getUint32(16), height: view.getUint32(20) };\n}\n\nfunction jpegDimensions(data: Uint8Array): { width: number; height: number } {\n if (data.byteLength < 4 || data[0] !== 0xff || data[1] !== 0xd8) {\n throw new Error(\"browser returned an invalid JPEG image\");\n }\n let offset = 2;\n while (offset + 3 < data.byteLength) {\n if (data[offset] !== 0xff) {\n offset += 1;\n continue;\n }\n let marker = data[offset + 1]!;\n while (marker === 0xff) {\n offset += 1;\n marker = data[offset + 1]!;\n }\n if (\n marker === 0xd8 ||\n marker === 0xd9 ||\n marker === 0x01 ||\n (marker >= 0xd0 && marker <= 0xd7)\n ) {\n offset += 2;\n continue;\n }\n if (offset + 3 >= data.byteLength) break;\n const length = (data[offset + 2]! << 8) | data[offset + 3]!;\n if (length < 2 || offset + 2 + length > data.byteLength) break;\n if (isJpegStartOfFrame(marker)) {\n if (length < 7 || offset + 8 >= data.byteLength) break;\n return {\n height: (data[offset + 5]! << 8) | data[offset + 6]!,\n width: (data[offset + 7]! << 8) | data[offset + 8]!,\n };\n }\n offset += 2 + length;\n }\n throw new Error(\"browser returned a JPEG without dimensions\");\n}\n\nfunction isJpegStartOfFrame(marker: number): boolean {\n return (\n (marker >= 0xc0 && marker <= 0xc3) ||\n (marker >= 0xc5 && marker <= 0xc7) ||\n (marker >= 0xc9 && marker <= 0xcb) ||\n (marker >= 0xcd && marker <= 0xcf)\n );\n}\n\nfunction utf8Bytes(value: string): number {\n return new TextEncoder().encode(value).byteLength;\n}\n\nasync function sha256Hex(value: Uint8Array): Promise<string> {\n const subtle = globalThis.crypto?.subtle;\n if (!subtle) throw new Error(\"computer frame digest verification is unavailable\");\n const copy = new Uint8Array(value.byteLength);\n copy.set(value);\n const digest = new Uint8Array(await subtle.digest(\"SHA-256\", copy));\n return [...digest].map((byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\nfunction isUuid(value: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/iu.test(value);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/errors.ts"],"sourcesContent":["/** Error for a non-2xx OpenGeni API response. */\nexport class OpenGeniApiError extends Error {\n readonly status: number;\n readonly code: string | undefined;\n readonly retryable: boolean;\n readonly correlationId: string | undefined;\n /** True only when an uncontrolled transport failed after a mutation may have been accepted. */\n readonly outcomeUnknown: boolean;\n readonly body: string;\n readonly details: Record<string, unknown> | undefined;\n\n constructor(\n status: number,\n body: string,\n options: {\n code?: string | undefined;\n retryable?: boolean | undefined;\n correlationId?: string | undefined;\n outcomeUnknown?: boolean | undefined;\n displayMessage?: string | undefined;\n mutation?: boolean | undefined;\n } = {},\n ) {\n const decoded = decodeApiErrorBody(body);\n const correlationId = decoded?.requestId ?? boundedCorrelationId(options.correlationId);\n const gatewayFailure = status >= 502 && status <= 504;\n const fromResponse = options.mutation !== undefined;\n const message = decoded?.message ?? (fromResponse ? \"Request failed.\" : body || \"(empty body)\");\n const displayMessage =\n options.displayMessage ??\n (gatewayFailure && fromResponse\n ? (decoded?.message ?? \"OpenGeni is temporarily unavailable — retry.\")\n : `OpenGeni API ${status}: ${message}`);\n super(correlationId ? `${displayMessage} Reference: ${correlationId}.` : displayMessage);\n this.name = \"OpenGeniApiError\";\n this.status = status;\n this.code =\n options.code ??\n decoded?.code ??\n (gatewayFailure && fromResponse ? \"upstream_unavailable\" : undefined);\n this.retryable = options.retryable ?? decoded?.retryable ?? retryableApiStatus(status);\n this.correlationId = correlationId;\n this.outcomeUnknown =\n options.outcomeUnknown ?? (gatewayFailure && !!options.mutation && !decoded);\n this.body = !fromResponse || decoded ? body : \"\";\n this.details = decoded?.details;\n }\n}\n\nfunction decodeApiErrorBody(body: string): {\n code: string | undefined;\n message: string | undefined;\n requestId: string | undefined;\n retryable: boolean | undefined;\n details: Record<string, unknown> | undefined;\n} | null {\n if (!body) return null;\n try {\n const decoded: unknown = JSON.parse(body);\n if (!decoded || typeof decoded !== \"object\" || Array.isArray(decoded)) return null;\n const record = decoded as Record<string, unknown>;\n const nested =\n record.error && typeof record.error === \"object\" && !Array.isArray(record.error)\n ? (record.error as Record<string, unknown>)\n : record;\n const code = boundedApiField(nested.code);\n const message = boundedApiField(nested.message);\n const requestId = boundedCorrelationId(nested.requestId);\n const retryable = typeof nested.retryable === \"boolean\" ? nested.retryable : undefined;\n const details = boundedApiDetails(nested.details);\n if (!code && !message && !requestId && retryable === undefined && !details) return null;\n return {\n code,\n message,\n requestId,\n retryable,\n details,\n };\n } catch {\n return null;\n }\n}\n\nfunction boundedApiDetails(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return;\n const entries = Object.entries(value as Record<string, unknown>).slice(0, 16);\n const details: Record<string, unknown> = {};\n for (const [key, entry] of entries) {\n if (!/^[a-zA-Z][\\w.-]{0,63}$/.test(key)) continue;\n if (typeof entry === \"string\") {\n const bounded = boundedApiField(entry);\n if (bounded !== undefined) details[key] = bounded;\n } else if (typeof entry === \"number\" || typeof entry === \"boolean\" || entry === null) {\n details[key] = entry;\n }\n }\n return Object.keys(details).length > 0 ? details : undefined;\n}\n\nfunction boundedApiField(value: unknown): string | undefined {\n if (typeof value !== \"string\") return;\n const bytes = new TextEncoder().encode(value);\n return bytes.byteLength <= 512 ? value : new TextDecoder().decode(bytes.slice(0, 512));\n}\n\nfunction retryableApiStatus(status: number): boolean {\n return status === 408 || status === 409 || status === 425 || status === 429 || status >= 500;\n}\n\nfunction boundedCorrelationId(value: unknown): string | undefined {\n if (typeof value !== \"string\" || value.length > 128 || !/^[\\w.:-]+$/.test(value)) {\n return;\n }\n return value;\n}\n\n/** A short-lived session-list snapshot cursor can no longer be continued. */\nexport class OpenGeniSessionListCursorError extends OpenGeniApiError {}\n\n/** The browser bundle and API disagree about their state-changing wire contract. */\nexport class OpenGeniApiContractMismatchError extends Error {\n readonly expected: string;\n readonly actual: string;\n\n constructor(expected: string, actual: string) {\n super(`OpenGeni API contract mismatch: client expects ${expected}, API serves ${actual}`);\n this.name = \"OpenGeniApiContractMismatchError\";\n this.expected = expected;\n this.actual = actual;\n }\n}\n\n/** Error for an unrecoverable event-stream condition (not a transient drop). */\nexport class OpenGeniStreamError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"OpenGeniStreamError\";\n }\n}\n\nexport function isAbortError(error: unknown): boolean {\n return (\n (error instanceof DOMException && error.name === \"AbortError\") ||\n (error instanceof Error && error.name === \"AbortError\")\n );\n}\n\n/**\n * Transient conditions worth a reconnect: network-level failures (`fetch`\n * rejects with `TypeError`) and HTTP statuses that signal a temporary server\n * or contention condition. Auth/validation failures (401/403/404/...) are\n * permanent and surface to the caller instead.\n */\nexport function isRetryableStreamError(error: unknown): boolean {\n if (error instanceof OpenGeniApiError) return error.retryable;\n return error instanceof TypeError;\n}\n"],"mappings":"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","names":[]}