@opengeni/sdk 3.3.2-canary.1 → 3.4.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.
- package/README.md +1007 -72
- package/dist/adapters/express.d.ts +31 -0
- package/dist/adapters/express.js +87 -0
- package/dist/adapters/express.js.map +1 -0
- package/dist/adapters/hono.d.ts +16 -0
- package/dist/adapters/hono.js +8 -0
- package/dist/adapters/hono.js.map +1 -0
- package/dist/adapters/next.d.ts +29 -0
- package/dist/adapters/next.js +22 -0
- package/dist/adapters/next.js.map +1 -0
- package/dist/allowance-refusal.d.ts +2 -0
- package/dist/allowance-refusal.js +50 -0
- package/dist/allowance-refusal.js.map +1 -0
- package/dist/app-links.d.ts +42 -0
- package/dist/app-links.js +66 -0
- package/dist/app-links.js.map +1 -0
- package/dist/artifact-catalog.d.ts +40 -0
- package/dist/artifact-client.d.ts +20 -8
- package/dist/artifacts.d.ts +1 -1
- package/dist/artifacts.js +8 -6
- package/dist/automations.js +8 -2
- package/dist/automations.js.map +1 -1
- package/dist/azure-live-transport.d.ts +32 -0
- package/dist/browser.d.ts +6 -2
- package/dist/browser.js +25 -5
- package/dist/chat/fold.d.ts +75 -0
- package/dist/chat/handler.d.ts +41 -0
- package/dist/chat/http.d.ts +67 -0
- package/dist/chat/ids.d.ts +34 -0
- package/dist/chat/index.d.ts +9 -0
- package/dist/chat/index.js +1369 -0
- package/dist/chat/index.js.map +1 -0
- package/dist/chat/openai.d.ts +30 -0
- package/dist/chat/opengeni.d.ts +129 -0
- package/dist/chat/types.d.ts +207 -0
- package/dist/chat/vercel.d.ts +49 -0
- package/dist/chats.d.ts +8 -0
- package/dist/chunk-4AHR4KGA.js +301 -0
- package/dist/chunk-4AHR4KGA.js.map +1 -0
- package/dist/chunk-6GYGMLX4.js +332 -0
- package/dist/chunk-6GYGMLX4.js.map +1 -0
- package/dist/chunk-7EWT3PV6.js +368 -0
- package/dist/chunk-7EWT3PV6.js.map +1 -0
- package/dist/chunk-FTWVVPR6.js +1665 -0
- package/dist/chunk-FTWVVPR6.js.map +1 -0
- package/dist/{chunk-VYCTL62C.js → chunk-GZQSWAKD.js} +1 -1
- package/dist/chunk-GZQSWAKD.js.map +1 -0
- package/dist/chunk-KGEABAID.js +71 -0
- package/dist/chunk-KGEABAID.js.map +1 -0
- package/dist/{chunk-YKZME56C.js → chunk-KWADQ227.js} +3 -3
- package/dist/{chunk-YKZME56C.js.map → chunk-KWADQ227.js.map} +1 -1
- package/dist/{chunk-E5BNEG2D.js → chunk-NCU5OAN7.js} +27 -2
- package/dist/chunk-NCU5OAN7.js.map +1 -0
- package/dist/{chunk-BESZFWMU.js → chunk-OI5YLASH.js} +73 -2
- package/dist/chunk-OI5YLASH.js.map +1 -0
- package/dist/chunk-OV3POE62.js +359 -0
- package/dist/chunk-OV3POE62.js.map +1 -0
- package/dist/chunk-P7UWKORG.js +561 -0
- package/dist/chunk-P7UWKORG.js.map +1 -0
- package/dist/chunk-QGEIL4TR.js +195 -0
- package/dist/chunk-QGEIL4TR.js.map +1 -0
- package/dist/{chunk-GY6RQPCG.js → chunk-S2NLS3ES.js} +3598 -1278
- package/dist/chunk-S2NLS3ES.js.map +1 -0
- package/dist/chunk-UM4ZXXJR.js +9 -0
- package/dist/chunk-UM4ZXXJR.js.map +1 -0
- package/dist/{chunk-TFCLHRZK.js → chunk-UME3X7CP.js} +28 -32
- package/dist/chunk-UME3X7CP.js.map +1 -0
- package/dist/chunk-VT4YM4XQ.js +210 -0
- package/dist/chunk-VT4YM4XQ.js.map +1 -0
- package/dist/chunk-WSYYXONG.js +1602 -0
- package/dist/chunk-WSYYXONG.js.map +1 -0
- package/dist/{chunk-6NEPJ7NC.js → chunk-WVCJRSGJ.js} +119 -14
- package/dist/chunk-WVCJRSGJ.js.map +1 -0
- package/dist/chunk-X5ITQVXE.js +15 -0
- package/dist/chunk-X5ITQVXE.js.map +1 -0
- package/dist/chunk-XA7HVIHI.js +126 -0
- package/dist/chunk-XA7HVIHI.js.map +1 -0
- package/dist/{chunk-QTBAMHEF.js → chunk-YJCHB7R3.js} +60 -12
- package/dist/chunk-YJCHB7R3.js.map +1 -0
- package/dist/chunk-YKIHNLWD.js +153 -0
- package/dist/chunk-YKIHNLWD.js.map +1 -0
- package/dist/chunk-ZDUBPV33.js +277 -0
- package/dist/chunk-ZDUBPV33.js.map +1 -0
- package/dist/client.d.ts +1056 -118
- package/dist/codex-realtime-controller.d.ts +13 -0
- package/dist/codex-realtime-controller.js +4 -2
- package/dist/codex-realtime-v3-wire.d.ts +3 -2
- package/dist/codex-realtime.d.ts +5 -1
- package/dist/company-brain.d.ts +1 -11
- package/dist/core.d.ts +6 -2
- package/dist/core.js +23 -6
- package/dist/deprecation.d.ts +47 -0
- package/dist/document-authority-client.d.ts +24 -2
- package/dist/document-authority.js +7 -5
- package/dist/editable-artifacts/index.d.ts +1 -1
- package/dist/editable-artifacts/types.d.ts +12 -2
- package/dist/editable-artifacts.js +19 -3
- package/dist/editable-artifacts.js.map +1 -1
- package/dist/embedding-client.d.ts +129 -0
- package/dist/errors.d.ts +64 -1
- package/dist/external-vault-receiver.d.ts +203 -0
- package/dist/external-vault-receiver.js +564 -0
- package/dist/external-vault-receiver.js.map +1 -0
- package/dist/feedback.d.ts +23 -0
- package/dist/gateway-realtime-transport.js +1 -1
- package/dist/github-repositories.d.ts +10 -0
- package/dist/github-repositories.js +36 -0
- package/dist/github-repositories.js.map +1 -0
- package/dist/index.d.ts +61 -11
- package/dist/index.js +555 -338
- package/dist/index.js.map +1 -1
- package/dist/insights-usage.d.ts +33 -0
- package/dist/insights-usage.js +7 -0
- package/dist/insights-usage.js.map +1 -0
- package/dist/interaction.d.ts +165 -71
- package/dist/interaction.js +2 -2
- package/dist/knowledge.d.ts +7 -0
- package/dist/knowledge.js +20 -0
- package/dist/knowledge.js.map +1 -0
- package/dist/known-tools.d.ts +4 -0
- package/dist/message-links.d.ts +68 -0
- package/dist/model-context.d.ts +68 -0
- package/dist/model-display.d.ts +2 -0
- package/dist/model-display.js +17 -0
- package/dist/model-display.js.map +1 -0
- package/dist/organization-integration-policy.d.ts +26 -0
- package/dist/organization-integration-policy.js +26 -0
- package/dist/organization-integration-policy.js.map +1 -0
- package/dist/pr-review-client.d.ts +1 -1
- package/dist/pr-review.d.ts +1 -1
- package/dist/pr-review.js.map +1 -1
- package/dist/preference-registry.d.ts +1 -1
- package/dist/prepared-mcp-setup.d.ts +5 -0
- package/dist/proxy.d.ts +13 -11
- package/dist/realtime.d.ts +1 -1
- package/dist/realtime.js +253 -7
- package/dist/realtime.js.map +1 -1
- package/dist/session-history-import.d.ts +22 -0
- package/dist/session-history-import.js +36 -0
- package/dist/session-history-import.js.map +1 -0
- package/dist/session-list-entries.d.ts +1 -0
- package/dist/session-list-entries.js +7 -0
- package/dist/session-list-entries.js.map +1 -0
- package/dist/session-message-search.d.ts +53 -0
- package/dist/session-proxy-client.d.ts +28 -0
- package/dist/session-proxy.d.ts +334 -0
- package/dist/session-proxy.js +24 -0
- package/dist/session-proxy.js.map +1 -0
- package/dist/session-titles.d.ts +2 -28
- package/dist/session-usage-limits.d.ts +10 -0
- package/dist/session-usage-limits.js +43 -0
- package/dist/session-usage-limits.js.map +1 -0
- package/dist/shared-catalog-loader.d.ts +34 -0
- package/dist/site-ai.d.ts +35 -0
- package/dist/site-bridge-host.d.ts +112 -0
- package/dist/site-bridge-host.js +286 -0
- package/dist/site-bridge-host.js.map +1 -0
- package/dist/site-browser-entry.d.ts +1 -0
- package/dist/site-browser-runtime.gen.d.ts +1 -0
- package/dist/site-data.d.ts +178 -0
- package/dist/site-document.d.ts +5 -0
- package/dist/site-document.js +20 -0
- package/dist/site-document.js.map +1 -0
- package/dist/site-document.test.d.ts +1 -0
- package/dist/site-http.d.ts +17 -0
- package/dist/site-sql.d.ts +31 -0
- package/dist/site-tool-bridge.d.ts +57 -0
- package/dist/site.d.ts +186 -0
- package/dist/site.js +63 -0
- package/dist/site.js.map +1 -0
- package/dist/skills.d.ts +75 -0
- package/dist/sse.d.ts +1 -1
- package/dist/stream.d.ts +2 -0
- package/dist/tenant-workspaces.d.ts +47 -0
- package/dist/tenant-workspaces.js +8 -0
- package/dist/tenant-workspaces.js.map +1 -0
- package/dist/tool-auth.d.ts +87 -0
- package/dist/tool-auth.js +23 -0
- package/dist/tool-auth.js.map +1 -0
- package/dist/tool-display-metadata.d.ts +3 -0
- package/dist/tools-37DCTCNZ.js +12 -0
- package/dist/tools-37DCTCNZ.js.map +1 -0
- package/dist/tools.d.ts +81 -0
- package/dist/transcription.d.ts +1 -1
- package/dist/types.d.ts +2785 -592
- package/dist/usage-allowances.d.ts +36 -0
- package/dist/usage-allowances.js +80 -0
- package/dist/usage-allowances.js.map +1 -0
- package/dist/vault-types.d.ts +324 -0
- package/dist/vaults-api.d.ts +65 -0
- package/dist/workspace-artifacts.d.ts +47 -5
- package/dist/workspace-instruction-policies.d.ts +2 -2
- package/dist/workspace-integrations.d.ts +74 -0
- package/dist/workspace-integrations.js +67 -0
- package/dist/workspace-integrations.js.map +1 -0
- package/dist/workspace-state.d.ts +8 -71
- package/package.json +99 -5
- package/src/adapters/express.ts +136 -0
- package/src/adapters/hono.ts +18 -0
- package/src/adapters/next.ts +42 -0
- package/src/allowance-refusal.ts +5 -0
- package/src/app-links.ts +117 -0
- package/src/artifact-catalog.ts +51 -0
- package/src/artifact-client.ts +40 -49
- package/src/artifacts.ts +1 -0
- package/src/automations-client.ts +8 -2
- package/src/azure-live-transport.ts +286 -0
- package/src/browser.ts +35 -0
- package/src/chat/fold.ts +431 -0
- package/src/chat/handler.ts +240 -0
- package/src/chat/http.ts +257 -0
- package/src/chat/ids.ts +85 -0
- package/src/chat/index.ts +88 -0
- package/src/chat/openai.ts +439 -0
- package/src/chat/opengeni.ts +737 -0
- package/src/chat/types.ts +219 -0
- package/src/chat/vercel.ts +204 -0
- package/src/chats.ts +16 -0
- package/src/client.ts +5595 -1847
- package/src/codex-realtime-controller.ts +163 -8
- package/src/codex-realtime-v3-wire.ts +4 -3
- package/src/codex-realtime-v3.ts +12 -3
- package/src/codex-realtime.ts +11 -3
- package/src/company-brain.ts +0 -40
- package/src/core.ts +18 -0
- package/src/deprecation.ts +149 -0
- package/src/document-authority-client.ts +104 -1
- package/src/editable-artifacts/controller.ts +36 -2
- package/src/editable-artifacts/index.ts +1 -0
- package/src/editable-artifacts/types.ts +29 -16
- package/src/embedding-client.ts +519 -0
- package/src/errors.ts +281 -5
- package/src/external-vault-receiver.ts +914 -0
- package/src/feedback.ts +20 -0
- package/src/gateway-realtime-transport.ts +3 -3
- package/src/github-repositories.ts +60 -0
- package/src/index.ts +592 -65
- package/src/insights-usage.ts +64 -0
- package/src/interaction.ts +315 -93
- package/src/knowledge.ts +72 -0
- package/src/known-tools.ts +279 -0
- package/src/message-links.ts +178 -0
- package/src/model-context.ts +113 -0
- package/src/model-display.ts +11 -0
- package/src/organization-integration-policy.ts +54 -0
- package/src/pr-review-client.ts +1 -1
- package/src/pr-review.ts +1 -1
- package/src/preference-registry.ts +2 -0
- package/src/prepared-mcp-setup.ts +123 -0
- package/src/proxy.ts +23 -12
- package/src/realtime.ts +15 -6
- package/src/session-history-import.ts +84 -0
- package/src/session-list-entries.ts +1 -0
- package/src/session-message-search.ts +47 -0
- package/src/session-proxy-client.ts +68 -0
- package/src/session-proxy.ts +2098 -0
- package/src/session-titles.ts +8 -82
- package/src/session-usage-limits.ts +71 -0
- package/src/shared-catalog-loader.ts +169 -0
- package/src/site-ai.ts +284 -0
- package/src/site-bridge-host.ts +422 -0
- package/src/site-browser-entry.ts +6 -0
- package/src/site-browser-runtime.gen.ts +2 -0
- package/src/site-data.ts +372 -0
- package/src/site-document.test.ts +64 -0
- package/src/site-document.ts +18 -0
- package/src/site-http.ts +171 -0
- package/src/site-sql.ts +153 -0
- package/src/site-tool-bridge.ts +401 -0
- package/src/site.ts +878 -0
- package/src/skills.ts +69 -0
- package/src/sse.ts +9 -3
- package/src/stream.ts +33 -10
- package/src/tenant-workspaces.ts +148 -0
- package/src/tool-auth.ts +301 -0
- package/src/tool-display-metadata.ts +27 -0
- package/src/tools.ts +452 -0
- package/src/transcription.ts +3 -0
- package/src/types.ts +3142 -594
- package/src/usage-allowances.ts +189 -0
- package/src/vault-types.ts +379 -0
- package/src/vaults-api.ts +339 -0
- package/src/workspace-artifacts.ts +55 -6
- package/src/workspace-instruction-policies.ts +2 -1
- package/src/workspace-integrations.ts +402 -0
- package/src/workspace-state.ts +8 -82
- package/dist/chunk-6NEPJ7NC.js.map +0 -1
- package/dist/chunk-BESZFWMU.js.map +0 -1
- package/dist/chunk-E5BNEG2D.js.map +0 -1
- package/dist/chunk-GY6RQPCG.js.map +0 -1
- package/dist/chunk-OO5LPTO7.js +0 -132
- package/dist/chunk-OO5LPTO7.js.map +0 -1
- package/dist/chunk-QTBAMHEF.js.map +0 -1
- package/dist/chunk-TFCLHRZK.js.map +0 -1
- package/dist/chunk-VYCTL62C.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/gateway-realtime-transport.ts"],"sourcesContent":["import type { CodexRealtimeAudibleOutputState, CodexRealtimeWebrtcSession } from \"./codex-realtime\";\nimport type {\n CodexRealtimeControllerClient,\n RealtimeControllerTransportStarter,\n} from \"./codex-realtime-controller\";\n\ntype GatewayClientEvent = Record<string, unknown> & { type: string };\ntype GatewayServerEvent = Record<string, unknown> & { type: string };\n\nconst AUDIO_SAMPLE_RATE = 24_000;\nconst DELEGATION_TOOL = \"delegate_to_session\";\ntype RealtimeDialect = \"gateway\" | \"xai\";\n\nexport function createGatewayRealtimeTransportStarter(): RealtimeControllerTransportStarter {\n return createWebsocketRealtimeTransportStarter(\"gateway\");\n}\n\nexport function createXaiSubscriptionRealtimeTransportStarter(): RealtimeControllerTransportStarter {\n return createWebsocketRealtimeTransportStarter(\"xai\");\n}\n\nfunction createWebsocketRealtimeTransportStarter(\n dialect: RealtimeDialect,\n): RealtimeControllerTransportStarter {\n return async (input) => {\n const client = input.client as CodexRealtimeControllerClient;\n const negotiate =\n dialect === \"xai\"\n ? client.negotiateXaiSubscriptionRealtime?.bind(client)\n : client.negotiateGatewayRealtime?.bind(client);\n if (!negotiate) {\n throw new Error(\n dialect === \"xai\"\n ? \"The OpenGeni client does not support connected SuperGrok realtime\"\n : \"The OpenGeni client does not support AI Gateway realtime\",\n );\n }\n const answer = await negotiate(\n input.workspaceId,\n input.sessionId,\n {\n realtimeId: input.realtimeId,\n operationId: input.operationId,\n browserInstanceId: input.browserInstanceId,\n ownerKey: input.ownerKey,\n expectedVersion: input.expectedVersion,\n expectedConnectionEpoch: input.expectedConnectionEpoch,\n rotate: input.rotate,\n },\n { signal: input.signal },\n );\n throwIfAborted(input.signal);\n\n const websocket = new WebSocket(\n answer.url,\n dialect === \"xai\"\n ? [`xai-client-secret.${answer.token}`]\n : [\"ai-gateway-realtime.v1\", `ai-gateway-auth.${answer.token}`],\n );\n const channel = new GatewayRealtimeDataChannel((payload) =>\n handleBridgeOutbound(websocket, payload, dialect),\n );\n input.onEventsCreated(channel.asRtcDataChannel());\n const audio = new GatewayRealtimeAudio({\n onAudio: (encoded) =>\n send(websocket, {\n type: dialect === \"xai\" ? \"input_audio_buffer.append\" : \"input-audio-append\",\n audio: encoded,\n }),\n onAudibleOutputState: input.onAudibleOutputState,\n });\n let stopped = false;\n let currentOutputItemId: string | null = null;\n const finalizedAssistantItems = new Set<string>();\n const microphoneTracks = input.media.getAudioTracks();\n const onMicrophoneEnded = (): void => {\n if (!stopped) input.onMicrophoneEnded();\n };\n for (const track of microphoneTracks) track.addEventListener?.(\"ended\", onMicrophoneEnded);\n\n const onMessage = (event: MessageEvent): void => {\n if (typeof event.data !== \"string\") return;\n let parsed: unknown;\n try {\n parsed = JSON.parse(event.data);\n } catch {\n return;\n }\n if (!isRecord(parsed) || typeof parsed.type !== \"string\") return;\n handleRealtimeEvent({\n event: parsed as GatewayServerEvent,\n dialect,\n channel,\n websocket,\n audio,\n finalizedAssistantItems,\n getCurrentOutputItemId: () => currentOutputItemId,\n setCurrentOutputItemId: (value) => {\n currentOutputItemId = value;\n },\n });\n };\n const onClose = (): void => {\n if (!stopped) input.onConnectionHealth(\"closed\");\n };\n const onError = (): void => {\n if (!stopped) input.onConnectionHealth(\"failed\");\n };\n websocket.addEventListener(\"message\", onMessage);\n websocket.addEventListener(\"close\", onClose);\n websocket.addEventListener(\"error\", onError);\n\n const stop = (): void => {\n if (stopped) return;\n stopped = true;\n input.signal.removeEventListener(\"abort\", stop);\n websocket.removeEventListener(\"message\", onMessage);\n websocket.removeEventListener(\"close\", onClose);\n websocket.removeEventListener(\"error\", onError);\n for (const track of microphoneTracks) track.removeEventListener?.(\"ended\", onMicrophoneEnded);\n channel.close();\n audio.dispose();\n if (\n websocket.readyState === WebSocket.OPEN ||\n websocket.readyState === WebSocket.CONNECTING\n ) {\n websocket.close(1000, \"OpenGeni realtime connection retired\");\n }\n };\n input.signal.addEventListener(\"abort\", stop, { once: true });\n\n try {\n await waitForWebSocketOpen(websocket, input.signal);\n channel.open();\n send(\n websocket,\n dialect === \"xai\"\n ? xaiSessionUpdate(answer.instructions)\n : gatewaySessionUpdate(answer.instructions),\n );\n for (const item of answer.initialItems) {\n const text = `<session_initial_item role=\"${item.role}\">\\n${item.text}\\n</session_initial_item>`;\n send(\n websocket,\n dialect === \"xai\"\n ? {\n type: \"conversation.item.create\",\n item: {\n type: \"message\",\n role: \"user\",\n content: [{ type: \"input_text\", text }],\n },\n }\n : {\n type: \"conversation-item-create\",\n item: { type: \"text-message\", role: \"user\", text },\n },\n );\n }\n await audio.startCapture(input.media);\n input.onConnectionHealth(\"connected\");\n } catch (error) {\n stop();\n throw error;\n }\n\n return {\n peerConnection: null as unknown as RTCPeerConnection,\n events: channel.asRtcDataChannel(),\n media: input.media,\n operationId: input.operationId,\n connectionId: answer.connectionId,\n connectionEpoch: answer.connectionEpoch,\n startupFenceSequence: answer.startupFenceSequence,\n modeVersion: answer.modeVersion,\n microphoneHealthy: () =>\n microphoneTracks.length > 0 &&\n microphoneTracks.every((track) => track.readyState !== \"ended\"),\n audibleOutputState: () => audio.audibleOutputState(),\n setOutputMuted: (muted) => audio.setMuted(muted),\n activateRemoteAudio: () => void audio.resume(),\n retryAudibleOutput: () => audio.resume(),\n stop,\n } satisfies CodexRealtimeWebrtcSession;\n };\n}\n\nfunction delegationTool(): Record<string, unknown> {\n return {\n type: \"function\",\n name: DELEGATION_TOOL,\n description:\n \"Pass execution work, actions, and session tasks to the underlying session agent. Include the complete standalone request and relevant conversational context.\",\n parameters: {\n type: \"object\",\n properties: {\n request: {\n type: \"string\",\n description: \"Complete standalone task for the session agent\",\n },\n },\n required: [\"request\"],\n additionalProperties: false,\n },\n };\n}\n\nfunction gatewaySessionUpdate(instructions: string): GatewayClientEvent {\n return {\n type: \"session-update\",\n config: {\n instructions,\n outputModalities: [\"audio\"],\n inputAudioFormat: { type: \"audio/pcm\", rate: AUDIO_SAMPLE_RATE },\n outputAudioFormat: { type: \"audio/pcm\", rate: AUDIO_SAMPLE_RATE },\n inputAudioTranscription: {},\n outputAudioTranscription: {},\n turnDetection: {\n type: \"server-vad\",\n prefixPaddingMs: 300,\n silenceDurationMs: 500,\n },\n tools: [delegationTool()],\n },\n };\n}\n\nfunction xaiSessionUpdate(instructions: string): GatewayClientEvent {\n return {\n type: \"session.update\",\n session: {\n instructions,\n voice: \"eve\",\n reasoning: { effort: \"high\" },\n turn_detection: {\n type: \"server_vad\",\n prefix_padding_ms: 300,\n silence_duration_ms: 500,\n },\n audio: {\n input: {\n format: { type: \"audio/pcm\", rate: AUDIO_SAMPLE_RATE },\n transcription: { model: \"grok-transcribe\" },\n },\n output: { format: { type: \"audio/pcm\", rate: AUDIO_SAMPLE_RATE } },\n },\n tools: [delegationTool()],\n },\n };\n}\n\nfunction handleRealtimeEvent(input: {\n event: GatewayServerEvent;\n dialect: RealtimeDialect;\n channel: GatewayRealtimeDataChannel;\n websocket: WebSocket;\n audio: GatewayRealtimeAudio;\n finalizedAssistantItems: Set<string>;\n getCurrentOutputItemId(): string | null;\n setCurrentOutputItemId(value: string | null): void;\n}): void {\n const event = input.event;\n const eventId = providerEventId(event);\n if (event.type === \"session-created\" || event.type === \"session.created\") {\n const session = isRecord(event.session) ? event.session : null;\n const sessionId =\n stringValue(event.sessionId) ?? stringValue(session?.id) ?? `realtime-${crypto.randomUUID()}`;\n input.channel.providerEvent({\n type: \"session.started\",\n event_id: eventId,\n session: { id: sessionId },\n });\n return;\n }\n if (event.type === \"speech-started\" || event.type === \"input_audio_buffer.speech_started\") {\n const itemId = input.getCurrentOutputItemId();\n if (itemId && input.audio.isPlaying()) {\n const audioEndMs = input.audio.playbackOffsetMs();\n input.audio.stopPlayback();\n send(\n input.websocket,\n input.dialect === \"xai\"\n ? {\n type: \"conversation.item.truncate\",\n item_id: itemId,\n content_index: 0,\n audio_end_ms: Math.max(0, Math.round(audioEndMs)),\n }\n : {\n type: \"conversation-item-truncate\",\n itemId,\n contentIndex: 0,\n audioEndMs: Math.max(0, Math.round(audioEndMs)),\n },\n );\n }\n return;\n }\n if (\n event.type === \"input-transcription-completed\" ||\n event.type === \"conversation.item.input_audio_transcription.completed\"\n ) {\n const transcript = stringValue(event.transcript) ?? \"\";\n const itemId = stringValue(event.itemId) ?? stringValue(event.item_id) ?? crypto.randomUUID();\n if (transcript.trim()) {\n input.channel.providerEvent({\n type: \"turn.done\",\n event_id: eventId,\n turn: { id: itemId, role: \"user\", transcript },\n });\n }\n return;\n }\n if (\n event.type === \"audio-delta\" ||\n event.type === \"response.output_audio.delta\" ||\n event.type === \"response.audio.delta\"\n ) {\n const delta = stringValue(event.delta);\n if (!delta) return;\n const itemId = stringValue(event.itemId) ?? stringValue(event.item_id);\n if (itemId) input.setCurrentOutputItemId(itemId);\n input.audio.play(delta);\n input.channel.providerEvent({ type: \"output_audio.delta\", event_id: eventId, audio: delta });\n return;\n }\n if (\n event.type === \"audio-transcript-done\" ||\n event.type === \"text-done\" ||\n event.type === \"response.output_audio_transcript.done\" ||\n event.type === \"response.audio_transcript.done\" ||\n event.type === \"response.output_text.done\"\n ) {\n const itemId = stringValue(event.itemId) ?? stringValue(event.item_id) ?? crypto.randomUUID();\n const transcript = stringValue(event.transcript) ?? stringValue(event.text) ?? \"\";\n if (transcript.trim() && !input.finalizedAssistantItems.has(itemId)) {\n input.finalizedAssistantItems.add(itemId);\n input.channel.providerEvent({\n type: \"turn.done\",\n event_id: eventId,\n turn: { id: itemId, role: \"assistant\", transcript },\n });\n }\n return;\n }\n if (event.type === \"audio-done\" || event.type === \"response.output_audio.done\") return;\n if (\n event.type === \"function-call-arguments-done\" ||\n event.type === \"response.function_call_arguments.done\"\n ) {\n const callId =\n stringValue(event.callId) ??\n stringValue(event.call_id) ??\n stringValue(event.itemId) ??\n stringValue(event.item_id) ??\n crypto.randomUUID();\n const name = stringValue(event.name);\n if (name !== DELEGATION_TOOL) {\n sendFunctionOutput(\n input.websocket,\n input.dialect,\n callId,\n name,\n JSON.stringify({ error: \"Unsupported realtime tool\" }),\n );\n sendResponseCreate(input.websocket, input.dialect);\n return;\n }\n const request = delegationRequest(stringValue(event.arguments) ?? \"\");\n input.channel.providerEvent({\n type: \"delegation.created\",\n event_id: eventId,\n item: {\n id: callId,\n type: \"delegation\",\n target: \"client\",\n content: [{ type: \"input_text\", text: request }],\n },\n });\n return;\n }\n if (event.type === \"error\") {\n const nested = isRecord(event.error) ? event.error : null;\n input.channel.providerEvent({\n type: \"error\",\n event_id: eventId,\n message:\n stringValue(event.message) ?? stringValue(nested?.message) ?? \"Realtime provider error\",\n });\n }\n}\n\nclass GatewayRealtimeDataChannel extends EventTarget {\n readyState: RTCDataChannelState = \"connecting\";\n private pendingOutbound: Array<Record<string, unknown>> = [];\n private outboundScheduled = false;\n\n constructor(private readonly outbound: (messages: Array<Record<string, unknown>>) => void) {\n super();\n }\n\n asRtcDataChannel(): RTCDataChannel {\n return this as unknown as RTCDataChannel;\n }\n\n open(): void {\n this.readyState = \"open\";\n this.dispatchEvent(new Event(\"open\"));\n }\n\n send(payload: string): void {\n if (this.readyState !== \"open\") throw new Error(\"Gateway realtime channel is not open\");\n let parsed: unknown;\n try {\n parsed = JSON.parse(payload);\n } catch {\n return;\n }\n if (!isRecord(parsed)) return;\n this.pendingOutbound.push(parsed);\n if (this.outboundScheduled) return;\n this.outboundScheduled = true;\n queueMicrotask(() => {\n this.outboundScheduled = false;\n const messages = this.pendingOutbound;\n this.pendingOutbound = [];\n if (messages.length > 0 && this.readyState === \"open\") this.outbound(messages);\n });\n }\n\n providerEvent(event: Record<string, unknown>): void {\n if (this.readyState === \"closed\") return;\n this.dispatchEvent(new MessageEvent(\"message\", { data: JSON.stringify(event) }));\n }\n\n close(): void {\n if (this.readyState === \"closed\") return;\n this.readyState = \"closed\";\n this.pendingOutbound = [];\n this.dispatchEvent(new Event(\"close\"));\n }\n}\n\nfunction handleBridgeOutbound(\n websocket: WebSocket,\n messages: Array<Record<string, unknown>>,\n dialect: RealtimeDialect,\n): void {\n const groups = new Map<\n string,\n { type: string; id: string | null; channel: string; text: string }\n >();\n for (const message of messages) {\n const type = stringValue(message.type);\n if (type !== \"session.context.append\" && type !== \"delegation.context.append\") continue;\n const id = stringValue(message.delegation_item_id) ?? null;\n const channel = stringValue(message.channel) ?? \"commentary\";\n const key = `${type}:${id ?? \"session\"}:${channel}`;\n const content = Array.isArray(message.content) ? message.content : [];\n const text = content\n .filter(isRecord)\n .map((part) => stringValue(part.text) ?? \"\")\n .join(\"\");\n const existing = groups.get(key);\n groups.set(key, {\n type,\n id,\n channel,\n text: `${existing?.text ?? \"\"}${text}`,\n });\n }\n for (const group of groups.values()) {\n if (group.type === \"delegation.context.append\" && group.id && group.channel === \"speakable\") {\n sendFunctionOutput(\n websocket,\n dialect,\n group.id,\n DELEGATION_TOOL,\n JSON.stringify({ result: group.text }),\n );\n sendResponseCreate(websocket, dialect);\n continue;\n }\n const wrapper =\n group.type === \"delegation.context.append\"\n ? group.channel === \"commentary\"\n ? \"execution_progress\"\n : \"execution_result\"\n : \"session_update\";\n const text = `<${wrapper}>\\n${group.text}\\n</${wrapper}>`;\n send(\n websocket,\n dialect === \"xai\"\n ? {\n type: \"conversation.item.create\",\n item: {\n type: \"message\",\n role: \"user\",\n content: [{ type: \"input_text\", text }],\n },\n }\n : {\n type: \"conversation-item-create\",\n item: { type: \"text-message\", role: \"user\", text },\n },\n );\n if (group.channel === \"speakable\") sendResponseCreate(websocket, dialect);\n }\n}\n\nfunction sendFunctionOutput(\n websocket: WebSocket,\n dialect: RealtimeDialect,\n callId: string,\n name: string | null,\n output: string,\n): void {\n send(\n websocket,\n dialect === \"xai\"\n ? {\n type: \"conversation.item.create\",\n item: { type: \"function_call_output\", call_id: callId, output },\n }\n : {\n type: \"conversation-item-create\",\n item: { type: \"function-call-output\", callId, name, output },\n },\n );\n}\n\nfunction sendResponseCreate(websocket: WebSocket, dialect: RealtimeDialect): void {\n send(websocket, { type: dialect === \"xai\" ? \"response.create\" : \"response-create\" });\n}\n\nclass GatewayRealtimeAudio {\n private captureContext: AudioContext | null = null;\n private captureSource: MediaStreamAudioSourceNode | null = null;\n private captureProcessor: ScriptProcessorNode | null = null;\n private playbackContext: AudioContext | null = null;\n private playbackGain: GainNode | null = null;\n private playbackTime = 0;\n private playbackStartedAt = 0;\n private activeSources = new Set<AudioBufferSourceNode>();\n private outputState: CodexRealtimeAudibleOutputState = \"inactive\";\n private muted = false;\n\n constructor(\n private readonly options: {\n onAudio(audio: string): void;\n onAudibleOutputState(state: CodexRealtimeAudibleOutputState): void;\n },\n ) {}\n\n async startCapture(media: MediaStream): Promise<void> {\n const context = new AudioContext({ sampleRate: AUDIO_SAMPLE_RATE });\n this.captureContext = context;\n const source = context.createMediaStreamSource(media);\n const processor = context.createScriptProcessor(4096, 1, 1);\n this.captureSource = source;\n this.captureProcessor = processor;\n processor.onaudioprocess = (event) => {\n const samples = resample(\n new Float32Array(event.inputBuffer.getChannelData(0)),\n context.sampleRate,\n AUDIO_SAMPLE_RATE,\n );\n this.options.onAudio(encodePcm16(samples));\n };\n source.connect(processor);\n processor.connect(context.destination);\n await context.resume();\n }\n\n play(encoded: string): void {\n const context = (this.playbackContext ??= new AudioContext({ sampleRate: AUDIO_SAMPLE_RATE }));\n if (context.state !== \"running\") {\n void this.resume().then((resumed) => {\n if (resumed) this.schedule(encoded);\n });\n return;\n }\n this.schedule(encoded);\n }\n\n private schedule(encoded: string): void {\n const context = this.playbackContext;\n if (!context) return;\n const samples = decodePcm16(encoded);\n const buffer = context.createBuffer(1, samples.length, AUDIO_SAMPLE_RATE);\n buffer.getChannelData(0).set(samples);\n const source = context.createBufferSource();\n source.buffer = buffer;\n source.connect(this.outputNode(context));\n const startAt = Math.max(context.currentTime, this.playbackTime);\n if (this.activeSources.size === 0) this.playbackStartedAt = startAt;\n source.start(startAt);\n this.playbackTime = startAt + buffer.duration;\n this.activeSources.add(source);\n this.publish(\"audible\");\n source.onended = () => {\n this.activeSources.delete(source);\n if (this.activeSources.size === 0) this.publish(\"inactive\");\n };\n }\n\n stopPlayback(): void {\n for (const source of this.activeSources) {\n try {\n source.stop();\n } catch {\n // Already stopped.\n }\n }\n this.activeSources.clear();\n if (this.playbackContext) this.playbackTime = this.playbackContext.currentTime;\n this.publish(\"inactive\");\n }\n\n playbackOffsetMs(): number {\n return this.playbackContext\n ? Math.max(0, (this.playbackContext.currentTime - this.playbackStartedAt) * 1000)\n : 0;\n }\n\n audibleOutputState(): CodexRealtimeAudibleOutputState {\n return this.outputState;\n }\n\n setMuted(muted: boolean): void {\n this.muted = muted;\n const context = this.playbackContext;\n const gain = this.playbackGain;\n if (context && gain) gain.gain.setValueAtTime(muted ? 0 : 1, context.currentTime);\n }\n\n isPlaying(): boolean {\n return this.activeSources.size > 0;\n }\n\n async resume(): Promise<boolean> {\n const context = (this.playbackContext ??= new AudioContext({ sampleRate: AUDIO_SAMPLE_RATE }));\n this.publish(\"pending\");\n try {\n await context.resume();\n this.publish(this.activeSources.size > 0 ? \"audible\" : \"inactive\");\n return true;\n } catch {\n this.publish(\"blocked\");\n return false;\n }\n }\n\n dispose(): void {\n this.captureProcessor?.disconnect();\n this.captureSource?.disconnect();\n void this.captureContext?.close();\n this.captureProcessor = null;\n this.captureSource = null;\n this.captureContext = null;\n this.stopPlayback();\n this.playbackGain?.disconnect();\n void this.playbackContext?.close();\n this.playbackGain = null;\n this.playbackContext = null;\n }\n\n private outputNode(context: AudioContext): GainNode {\n if (!this.playbackGain) {\n this.playbackGain = context.createGain();\n this.playbackGain.gain.value = this.muted ? 0 : 1;\n this.playbackGain.connect(context.destination);\n }\n return this.playbackGain;\n }\n\n private publish(state: CodexRealtimeAudibleOutputState): void {\n if (state === this.outputState) return;\n this.outputState = state;\n this.options.onAudibleOutputState(state);\n }\n}\n\nfunction send(websocket: WebSocket, event: GatewayClientEvent): void {\n if (websocket.readyState !== WebSocket.OPEN) return;\n websocket.send(JSON.stringify(event));\n}\n\nfunction delegationRequest(argumentsJson: string): string {\n try {\n const parsed = JSON.parse(argumentsJson) as unknown;\n if (isRecord(parsed) && typeof parsed.request === \"string\" && parsed.request.trim()) {\n return parsed.request.trim();\n }\n } catch {\n // Fall through to the provider's raw argument string.\n }\n return argumentsJson.trim() || \"Continue the user's current request.\";\n}\n\nfunction providerEventId(event: Record<string, unknown>): string {\n const raw = isRecord(event.raw) ? event.raw : null;\n return (\n stringValue(event.eventId) ??\n stringValue(event.event_id) ??\n stringValue(raw?.event_id) ??\n stringValue(raw?.id) ??\n crypto.randomUUID()\n );\n}\n\nfunction encodePcm16(samples: Float32Array): string {\n const bytes = new Uint8Array(samples.length * 2);\n const view = new DataView(bytes.buffer);\n for (let index = 0; index < samples.length; index += 1) {\n const sample = Math.max(-1, Math.min(1, samples[index] ?? 0));\n view.setInt16(index * 2, sample < 0 ? sample * 0x8000 : sample * 0x7fff, true);\n }\n let binary = \"\";\n for (let start = 0; start < bytes.length; start += 0x8000) {\n binary += String.fromCharCode(...bytes.subarray(start, start + 0x8000));\n }\n return btoa(binary);\n}\n\nfunction decodePcm16(encoded: string): Float32Array {\n const binary = atob(encoded);\n const bytes = Uint8Array.from(binary, (character) => character.charCodeAt(0));\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const samples = new Float32Array(Math.floor(bytes.byteLength / 2));\n for (let index = 0; index < samples.length; index += 1) {\n samples[index] = view.getInt16(index * 2, true) / 32768;\n }\n return samples;\n}\n\nfunction resample(input: Float32Array, inputRate: number, outputRate: number): Float32Array {\n if (inputRate === outputRate) return input;\n const ratio = inputRate / outputRate;\n const output = new Float32Array(Math.round(input.length / ratio));\n for (let index = 0; index < output.length; index += 1) {\n const source = index * ratio;\n const floor = Math.floor(source);\n const ceil = Math.min(floor + 1, input.length - 1);\n const fraction = source - floor;\n output[index] = (input[floor] ?? 0) * (1 - fraction) + (input[ceil] ?? 0) * fraction;\n }\n return output;\n}\n\nasync function waitForWebSocketOpen(websocket: WebSocket, signal: AbortSignal): Promise<void> {\n if (websocket.readyState === WebSocket.OPEN) return;\n await new Promise<void>((resolve, reject) => {\n const cleanup = (): void => {\n websocket.removeEventListener(\"open\", onOpen);\n websocket.removeEventListener(\"error\", onError);\n websocket.removeEventListener(\"close\", onClose);\n signal.removeEventListener(\"abort\", onAbort);\n };\n const onOpen = (): void => {\n cleanup();\n resolve();\n };\n const onError = (): void => {\n cleanup();\n reject(new Error(\"AI Gateway realtime WebSocket failed to open\"));\n };\n const onClose = (): void => {\n cleanup();\n reject(new Error(\"AI Gateway realtime WebSocket closed before opening\"));\n };\n const onAbort = (): void => {\n cleanup();\n reject(signal.reason ?? new DOMException(\"Aborted\", \"AbortError\"));\n };\n websocket.addEventListener(\"open\", onOpen, { once: true });\n websocket.addEventListener(\"error\", onError, { once: true });\n websocket.addEventListener(\"close\", onClose, { once: true });\n signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction stringValue(value: unknown): string | null {\n return typeof value === \"string\" ? value : null;\n}\n\nfunction throwIfAborted(signal: AbortSignal): void {\n if (signal.aborted) throw signal.reason ?? new DOMException(\"Aborted\", \"AbortError\");\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/gateway-realtime-transport.ts"],"sourcesContent":["import type { CodexRealtimeAudibleOutputState, CodexRealtimeWebrtcSession } from \"./codex-realtime\";\nimport type {\n CodexRealtimeControllerClient,\n RealtimeControllerTransportStarter,\n} from \"./codex-realtime-controller\";\n\ntype GatewayClientEvent = Record<string, unknown> & { type: string };\ntype GatewayServerEvent = Record<string, unknown> & { type: string };\n\nconst AUDIO_SAMPLE_RATE = 24_000;\nconst DELEGATION_TOOL = \"delegate_to_session\";\ntype RealtimeDialect = \"gateway\" | \"xai\";\n\nexport function createGatewayRealtimeTransportStarter(): RealtimeControllerTransportStarter {\n return createWebsocketRealtimeTransportStarter(\"gateway\");\n}\n\nexport function createXaiSubscriptionRealtimeTransportStarter(): RealtimeControllerTransportStarter {\n return createWebsocketRealtimeTransportStarter(\"xai\");\n}\n\nfunction createWebsocketRealtimeTransportStarter(\n dialect: RealtimeDialect,\n): RealtimeControllerTransportStarter {\n return async (input) => {\n const client = input.client as CodexRealtimeControllerClient;\n const negotiate =\n dialect === \"xai\"\n ? client.negotiateXaiSubscriptionRealtime?.bind(client)\n : client.negotiateGatewayRealtime?.bind(client);\n if (!negotiate) {\n throw new Error(\n dialect === \"xai\"\n ? \"The Opengeni client does not support connected SuperGrok realtime\"\n : \"The Opengeni client does not support AI Gateway realtime\",\n );\n }\n const answer = await negotiate(\n input.workspaceId,\n input.sessionId,\n {\n realtimeId: input.realtimeId,\n operationId: input.operationId,\n browserInstanceId: input.browserInstanceId,\n ownerKey: input.ownerKey,\n expectedVersion: input.expectedVersion,\n expectedConnectionEpoch: input.expectedConnectionEpoch,\n rotate: input.rotate,\n },\n { signal: input.signal },\n );\n throwIfAborted(input.signal);\n\n const websocket = new WebSocket(\n answer.url,\n dialect === \"xai\"\n ? [`xai-client-secret.${answer.token}`]\n : [\"ai-gateway-realtime.v1\", `ai-gateway-auth.${answer.token}`],\n );\n const channel = new GatewayRealtimeDataChannel((payload) =>\n handleBridgeOutbound(websocket, payload, dialect),\n );\n input.onEventsCreated(channel.asRtcDataChannel());\n const audio = new GatewayRealtimeAudio({\n onAudio: (encoded) =>\n send(websocket, {\n type: dialect === \"xai\" ? \"input_audio_buffer.append\" : \"input-audio-append\",\n audio: encoded,\n }),\n onAudibleOutputState: input.onAudibleOutputState,\n });\n let stopped = false;\n let currentOutputItemId: string | null = null;\n const finalizedAssistantItems = new Set<string>();\n const microphoneTracks = input.media.getAudioTracks();\n const onMicrophoneEnded = (): void => {\n if (!stopped) input.onMicrophoneEnded();\n };\n for (const track of microphoneTracks) track.addEventListener?.(\"ended\", onMicrophoneEnded);\n\n const onMessage = (event: MessageEvent): void => {\n if (typeof event.data !== \"string\") return;\n let parsed: unknown;\n try {\n parsed = JSON.parse(event.data);\n } catch {\n return;\n }\n if (!isRecord(parsed) || typeof parsed.type !== \"string\") return;\n handleRealtimeEvent({\n event: parsed as GatewayServerEvent,\n dialect,\n channel,\n websocket,\n audio,\n finalizedAssistantItems,\n getCurrentOutputItemId: () => currentOutputItemId,\n setCurrentOutputItemId: (value) => {\n currentOutputItemId = value;\n },\n });\n };\n const onClose = (): void => {\n if (!stopped) input.onConnectionHealth(\"closed\");\n };\n const onError = (): void => {\n if (!stopped) input.onConnectionHealth(\"failed\");\n };\n websocket.addEventListener(\"message\", onMessage);\n websocket.addEventListener(\"close\", onClose);\n websocket.addEventListener(\"error\", onError);\n\n const stop = (): void => {\n if (stopped) return;\n stopped = true;\n input.signal.removeEventListener(\"abort\", stop);\n websocket.removeEventListener(\"message\", onMessage);\n websocket.removeEventListener(\"close\", onClose);\n websocket.removeEventListener(\"error\", onError);\n for (const track of microphoneTracks) track.removeEventListener?.(\"ended\", onMicrophoneEnded);\n channel.close();\n audio.dispose();\n if (\n websocket.readyState === WebSocket.OPEN ||\n websocket.readyState === WebSocket.CONNECTING\n ) {\n websocket.close(1000, \"Opengeni realtime connection retired\");\n }\n };\n input.signal.addEventListener(\"abort\", stop, { once: true });\n\n try {\n await waitForWebSocketOpen(websocket, input.signal);\n channel.open();\n send(\n websocket,\n dialect === \"xai\"\n ? xaiSessionUpdate(answer.instructions)\n : gatewaySessionUpdate(answer.instructions),\n );\n for (const item of answer.initialItems) {\n const text = `<session_initial_item role=\"${item.role}\">\\n${item.text}\\n</session_initial_item>`;\n send(\n websocket,\n dialect === \"xai\"\n ? {\n type: \"conversation.item.create\",\n item: {\n type: \"message\",\n role: \"user\",\n content: [{ type: \"input_text\", text }],\n },\n }\n : {\n type: \"conversation-item-create\",\n item: { type: \"text-message\", role: \"user\", text },\n },\n );\n }\n await audio.startCapture(input.media);\n input.onConnectionHealth(\"connected\");\n } catch (error) {\n stop();\n throw error;\n }\n\n return {\n peerConnection: null as unknown as RTCPeerConnection,\n events: channel.asRtcDataChannel(),\n media: input.media,\n operationId: input.operationId,\n connectionId: answer.connectionId,\n connectionEpoch: answer.connectionEpoch,\n startupFenceSequence: answer.startupFenceSequence,\n modeVersion: answer.modeVersion,\n microphoneHealthy: () =>\n microphoneTracks.length > 0 &&\n microphoneTracks.every((track) => track.readyState !== \"ended\"),\n audibleOutputState: () => audio.audibleOutputState(),\n setOutputMuted: (muted) => audio.setMuted(muted),\n activateRemoteAudio: () => void audio.resume(),\n retryAudibleOutput: () => audio.resume(),\n stop,\n } satisfies CodexRealtimeWebrtcSession;\n };\n}\n\nfunction delegationTool(): Record<string, unknown> {\n return {\n type: \"function\",\n name: DELEGATION_TOOL,\n description:\n \"Pass execution work, actions, and session tasks to the underlying session agent. Include the complete standalone request and relevant conversational context.\",\n parameters: {\n type: \"object\",\n properties: {\n request: {\n type: \"string\",\n description: \"Complete standalone task for the session agent\",\n },\n },\n required: [\"request\"],\n additionalProperties: false,\n },\n };\n}\n\nfunction gatewaySessionUpdate(instructions: string): GatewayClientEvent {\n return {\n type: \"session-update\",\n config: {\n instructions,\n outputModalities: [\"audio\"],\n inputAudioFormat: { type: \"audio/pcm\", rate: AUDIO_SAMPLE_RATE },\n outputAudioFormat: { type: \"audio/pcm\", rate: AUDIO_SAMPLE_RATE },\n inputAudioTranscription: {},\n outputAudioTranscription: {},\n turnDetection: {\n type: \"server-vad\",\n prefixPaddingMs: 300,\n silenceDurationMs: 500,\n },\n tools: [delegationTool()],\n },\n };\n}\n\nfunction xaiSessionUpdate(instructions: string): GatewayClientEvent {\n return {\n type: \"session.update\",\n session: {\n instructions,\n voice: \"eve\",\n reasoning: { effort: \"high\" },\n turn_detection: {\n type: \"server_vad\",\n prefix_padding_ms: 300,\n silence_duration_ms: 500,\n },\n audio: {\n input: {\n format: { type: \"audio/pcm\", rate: AUDIO_SAMPLE_RATE },\n transcription: { model: \"grok-transcribe\" },\n },\n output: { format: { type: \"audio/pcm\", rate: AUDIO_SAMPLE_RATE } },\n },\n tools: [delegationTool()],\n },\n };\n}\n\nfunction handleRealtimeEvent(input: {\n event: GatewayServerEvent;\n dialect: RealtimeDialect;\n channel: GatewayRealtimeDataChannel;\n websocket: WebSocket;\n audio: GatewayRealtimeAudio;\n finalizedAssistantItems: Set<string>;\n getCurrentOutputItemId(): string | null;\n setCurrentOutputItemId(value: string | null): void;\n}): void {\n const event = input.event;\n const eventId = providerEventId(event);\n if (event.type === \"session-created\" || event.type === \"session.created\") {\n const session = isRecord(event.session) ? event.session : null;\n const sessionId =\n stringValue(event.sessionId) ?? stringValue(session?.id) ?? `realtime-${crypto.randomUUID()}`;\n input.channel.providerEvent({\n type: \"session.started\",\n event_id: eventId,\n session: { id: sessionId },\n });\n return;\n }\n if (event.type === \"speech-started\" || event.type === \"input_audio_buffer.speech_started\") {\n const itemId = input.getCurrentOutputItemId();\n if (itemId && input.audio.isPlaying()) {\n const audioEndMs = input.audio.playbackOffsetMs();\n input.audio.stopPlayback();\n send(\n input.websocket,\n input.dialect === \"xai\"\n ? {\n type: \"conversation.item.truncate\",\n item_id: itemId,\n content_index: 0,\n audio_end_ms: Math.max(0, Math.round(audioEndMs)),\n }\n : {\n type: \"conversation-item-truncate\",\n itemId,\n contentIndex: 0,\n audioEndMs: Math.max(0, Math.round(audioEndMs)),\n },\n );\n }\n return;\n }\n if (\n event.type === \"input-transcription-completed\" ||\n event.type === \"conversation.item.input_audio_transcription.completed\"\n ) {\n const transcript = stringValue(event.transcript) ?? \"\";\n const itemId = stringValue(event.itemId) ?? stringValue(event.item_id) ?? crypto.randomUUID();\n if (transcript.trim()) {\n input.channel.providerEvent({\n type: \"turn.done\",\n event_id: eventId,\n turn: { id: itemId, role: \"user\", transcript },\n });\n }\n return;\n }\n if (\n event.type === \"audio-delta\" ||\n event.type === \"response.output_audio.delta\" ||\n event.type === \"response.audio.delta\"\n ) {\n const delta = stringValue(event.delta);\n if (!delta) return;\n const itemId = stringValue(event.itemId) ?? stringValue(event.item_id);\n if (itemId) input.setCurrentOutputItemId(itemId);\n input.audio.play(delta);\n input.channel.providerEvent({ type: \"output_audio.delta\", event_id: eventId, audio: delta });\n return;\n }\n if (\n event.type === \"audio-transcript-done\" ||\n event.type === \"text-done\" ||\n event.type === \"response.output_audio_transcript.done\" ||\n event.type === \"response.audio_transcript.done\" ||\n event.type === \"response.output_text.done\"\n ) {\n const itemId = stringValue(event.itemId) ?? stringValue(event.item_id) ?? crypto.randomUUID();\n const transcript = stringValue(event.transcript) ?? stringValue(event.text) ?? \"\";\n if (transcript.trim() && !input.finalizedAssistantItems.has(itemId)) {\n input.finalizedAssistantItems.add(itemId);\n input.channel.providerEvent({\n type: \"turn.done\",\n event_id: eventId,\n turn: { id: itemId, role: \"assistant\", transcript },\n });\n }\n return;\n }\n if (event.type === \"audio-done\" || event.type === \"response.output_audio.done\") return;\n if (\n event.type === \"function-call-arguments-done\" ||\n event.type === \"response.function_call_arguments.done\"\n ) {\n const callId =\n stringValue(event.callId) ??\n stringValue(event.call_id) ??\n stringValue(event.itemId) ??\n stringValue(event.item_id) ??\n crypto.randomUUID();\n const name = stringValue(event.name);\n if (name !== DELEGATION_TOOL) {\n sendFunctionOutput(\n input.websocket,\n input.dialect,\n callId,\n name,\n JSON.stringify({ error: \"Unsupported realtime tool\" }),\n );\n sendResponseCreate(input.websocket, input.dialect);\n return;\n }\n const request = delegationRequest(stringValue(event.arguments) ?? \"\");\n input.channel.providerEvent({\n type: \"delegation.created\",\n event_id: eventId,\n item: {\n id: callId,\n type: \"delegation\",\n target: \"client\",\n content: [{ type: \"input_text\", text: request }],\n },\n });\n return;\n }\n if (event.type === \"error\") {\n const nested = isRecord(event.error) ? event.error : null;\n input.channel.providerEvent({\n type: \"error\",\n event_id: eventId,\n message:\n stringValue(event.message) ?? stringValue(nested?.message) ?? \"Realtime provider error\",\n });\n }\n}\n\nclass GatewayRealtimeDataChannel extends EventTarget {\n readyState: RTCDataChannelState = \"connecting\";\n private pendingOutbound: Array<Record<string, unknown>> = [];\n private outboundScheduled = false;\n\n constructor(private readonly outbound: (messages: Array<Record<string, unknown>>) => void) {\n super();\n }\n\n asRtcDataChannel(): RTCDataChannel {\n return this as unknown as RTCDataChannel;\n }\n\n open(): void {\n this.readyState = \"open\";\n this.dispatchEvent(new Event(\"open\"));\n }\n\n send(payload: string): void {\n if (this.readyState !== \"open\") throw new Error(\"Gateway realtime channel is not open\");\n let parsed: unknown;\n try {\n parsed = JSON.parse(payload);\n } catch {\n return;\n }\n if (!isRecord(parsed)) return;\n this.pendingOutbound.push(parsed);\n if (this.outboundScheduled) return;\n this.outboundScheduled = true;\n queueMicrotask(() => {\n this.outboundScheduled = false;\n const messages = this.pendingOutbound;\n this.pendingOutbound = [];\n if (messages.length > 0 && this.readyState === \"open\") this.outbound(messages);\n });\n }\n\n providerEvent(event: Record<string, unknown>): void {\n if (this.readyState === \"closed\") return;\n this.dispatchEvent(new MessageEvent(\"message\", { data: JSON.stringify(event) }));\n }\n\n close(): void {\n if (this.readyState === \"closed\") return;\n this.readyState = \"closed\";\n this.pendingOutbound = [];\n this.dispatchEvent(new Event(\"close\"));\n }\n}\n\nfunction handleBridgeOutbound(\n websocket: WebSocket,\n messages: Array<Record<string, unknown>>,\n dialect: RealtimeDialect,\n): void {\n const groups = new Map<\n string,\n { type: string; id: string | null; channel: string; text: string }\n >();\n for (const message of messages) {\n const type = stringValue(message.type);\n if (type !== \"session.context.append\" && type !== \"delegation.context.append\") continue;\n const id = stringValue(message.delegation_item_id) ?? null;\n const channel = stringValue(message.channel) ?? \"commentary\";\n const key = `${type}:${id ?? \"session\"}:${channel}`;\n const content = Array.isArray(message.content) ? message.content : [];\n const text = content\n .filter(isRecord)\n .map((part) => stringValue(part.text) ?? \"\")\n .join(\"\");\n const existing = groups.get(key);\n groups.set(key, {\n type,\n id,\n channel,\n text: `${existing?.text ?? \"\"}${text}`,\n });\n }\n for (const group of groups.values()) {\n if (group.type === \"delegation.context.append\" && group.id && group.channel === \"speakable\") {\n sendFunctionOutput(\n websocket,\n dialect,\n group.id,\n DELEGATION_TOOL,\n JSON.stringify({ result: group.text }),\n );\n sendResponseCreate(websocket, dialect);\n continue;\n }\n const wrapper =\n group.type === \"delegation.context.append\"\n ? group.channel === \"commentary\"\n ? \"execution_progress\"\n : \"execution_result\"\n : \"session_update\";\n const text = `<${wrapper}>\\n${group.text}\\n</${wrapper}>`;\n send(\n websocket,\n dialect === \"xai\"\n ? {\n type: \"conversation.item.create\",\n item: {\n type: \"message\",\n role: \"user\",\n content: [{ type: \"input_text\", text }],\n },\n }\n : {\n type: \"conversation-item-create\",\n item: { type: \"text-message\", role: \"user\", text },\n },\n );\n if (group.channel === \"speakable\") sendResponseCreate(websocket, dialect);\n }\n}\n\nfunction sendFunctionOutput(\n websocket: WebSocket,\n dialect: RealtimeDialect,\n callId: string,\n name: string | null,\n output: string,\n): void {\n send(\n websocket,\n dialect === \"xai\"\n ? {\n type: \"conversation.item.create\",\n item: { type: \"function_call_output\", call_id: callId, output },\n }\n : {\n type: \"conversation-item-create\",\n item: { type: \"function-call-output\", callId, name, output },\n },\n );\n}\n\nfunction sendResponseCreate(websocket: WebSocket, dialect: RealtimeDialect): void {\n send(websocket, { type: dialect === \"xai\" ? \"response.create\" : \"response-create\" });\n}\n\nclass GatewayRealtimeAudio {\n private captureContext: AudioContext | null = null;\n private captureSource: MediaStreamAudioSourceNode | null = null;\n private captureProcessor: ScriptProcessorNode | null = null;\n private playbackContext: AudioContext | null = null;\n private playbackGain: GainNode | null = null;\n private playbackTime = 0;\n private playbackStartedAt = 0;\n private activeSources = new Set<AudioBufferSourceNode>();\n private outputState: CodexRealtimeAudibleOutputState = \"inactive\";\n private muted = false;\n\n constructor(\n private readonly options: {\n onAudio(audio: string): void;\n onAudibleOutputState(state: CodexRealtimeAudibleOutputState): void;\n },\n ) {}\n\n async startCapture(media: MediaStream): Promise<void> {\n const context = new AudioContext({ sampleRate: AUDIO_SAMPLE_RATE });\n this.captureContext = context;\n const source = context.createMediaStreamSource(media);\n const processor = context.createScriptProcessor(4096, 1, 1);\n this.captureSource = source;\n this.captureProcessor = processor;\n processor.onaudioprocess = (event) => {\n const samples = resample(\n new Float32Array(event.inputBuffer.getChannelData(0)),\n context.sampleRate,\n AUDIO_SAMPLE_RATE,\n );\n this.options.onAudio(encodePcm16(samples));\n };\n source.connect(processor);\n processor.connect(context.destination);\n await context.resume();\n }\n\n play(encoded: string): void {\n const context = (this.playbackContext ??= new AudioContext({ sampleRate: AUDIO_SAMPLE_RATE }));\n if (context.state !== \"running\") {\n void this.resume().then((resumed) => {\n if (resumed) this.schedule(encoded);\n });\n return;\n }\n this.schedule(encoded);\n }\n\n private schedule(encoded: string): void {\n const context = this.playbackContext;\n if (!context) return;\n const samples = decodePcm16(encoded);\n const buffer = context.createBuffer(1, samples.length, AUDIO_SAMPLE_RATE);\n buffer.getChannelData(0).set(samples);\n const source = context.createBufferSource();\n source.buffer = buffer;\n source.connect(this.outputNode(context));\n const startAt = Math.max(context.currentTime, this.playbackTime);\n if (this.activeSources.size === 0) this.playbackStartedAt = startAt;\n source.start(startAt);\n this.playbackTime = startAt + buffer.duration;\n this.activeSources.add(source);\n this.publish(\"audible\");\n source.onended = () => {\n this.activeSources.delete(source);\n if (this.activeSources.size === 0) this.publish(\"inactive\");\n };\n }\n\n stopPlayback(): void {\n for (const source of this.activeSources) {\n try {\n source.stop();\n } catch {\n // Already stopped.\n }\n }\n this.activeSources.clear();\n if (this.playbackContext) this.playbackTime = this.playbackContext.currentTime;\n this.publish(\"inactive\");\n }\n\n playbackOffsetMs(): number {\n return this.playbackContext\n ? Math.max(0, (this.playbackContext.currentTime - this.playbackStartedAt) * 1000)\n : 0;\n }\n\n audibleOutputState(): CodexRealtimeAudibleOutputState {\n return this.outputState;\n }\n\n setMuted(muted: boolean): void {\n this.muted = muted;\n const context = this.playbackContext;\n const gain = this.playbackGain;\n if (context && gain) gain.gain.setValueAtTime(muted ? 0 : 1, context.currentTime);\n }\n\n isPlaying(): boolean {\n return this.activeSources.size > 0;\n }\n\n async resume(): Promise<boolean> {\n const context = (this.playbackContext ??= new AudioContext({ sampleRate: AUDIO_SAMPLE_RATE }));\n this.publish(\"pending\");\n try {\n await context.resume();\n this.publish(this.activeSources.size > 0 ? \"audible\" : \"inactive\");\n return true;\n } catch {\n this.publish(\"blocked\");\n return false;\n }\n }\n\n dispose(): void {\n this.captureProcessor?.disconnect();\n this.captureSource?.disconnect();\n void this.captureContext?.close();\n this.captureProcessor = null;\n this.captureSource = null;\n this.captureContext = null;\n this.stopPlayback();\n this.playbackGain?.disconnect();\n void this.playbackContext?.close();\n this.playbackGain = null;\n this.playbackContext = null;\n }\n\n private outputNode(context: AudioContext): GainNode {\n if (!this.playbackGain) {\n this.playbackGain = context.createGain();\n this.playbackGain.gain.value = this.muted ? 0 : 1;\n this.playbackGain.connect(context.destination);\n }\n return this.playbackGain;\n }\n\n private publish(state: CodexRealtimeAudibleOutputState): void {\n if (state === this.outputState) return;\n this.outputState = state;\n this.options.onAudibleOutputState(state);\n }\n}\n\nfunction send(websocket: WebSocket, event: GatewayClientEvent): void {\n if (websocket.readyState !== WebSocket.OPEN) return;\n websocket.send(JSON.stringify(event));\n}\n\nfunction delegationRequest(argumentsJson: string): string {\n try {\n const parsed = JSON.parse(argumentsJson) as unknown;\n if (isRecord(parsed) && typeof parsed.request === \"string\" && parsed.request.trim()) {\n return parsed.request.trim();\n }\n } catch {\n // Fall through to the provider's raw argument string.\n }\n return argumentsJson.trim() || \"Continue the user's current request.\";\n}\n\nfunction providerEventId(event: Record<string, unknown>): string {\n const raw = isRecord(event.raw) ? event.raw : null;\n return (\n stringValue(event.eventId) ??\n stringValue(event.event_id) ??\n stringValue(raw?.event_id) ??\n stringValue(raw?.id) ??\n crypto.randomUUID()\n );\n}\n\nfunction encodePcm16(samples: Float32Array): string {\n const bytes = new Uint8Array(samples.length * 2);\n const view = new DataView(bytes.buffer);\n for (let index = 0; index < samples.length; index += 1) {\n const sample = Math.max(-1, Math.min(1, samples[index] ?? 0));\n view.setInt16(index * 2, sample < 0 ? sample * 0x8000 : sample * 0x7fff, true);\n }\n let binary = \"\";\n for (let start = 0; start < bytes.length; start += 0x8000) {\n binary += String.fromCharCode(...bytes.subarray(start, start + 0x8000));\n }\n return btoa(binary);\n}\n\nfunction decodePcm16(encoded: string): Float32Array {\n const binary = atob(encoded);\n const bytes = Uint8Array.from(binary, (character) => character.charCodeAt(0));\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const samples = new Float32Array(Math.floor(bytes.byteLength / 2));\n for (let index = 0; index < samples.length; index += 1) {\n samples[index] = view.getInt16(index * 2, true) / 32768;\n }\n return samples;\n}\n\nfunction resample(input: Float32Array, inputRate: number, outputRate: number): Float32Array {\n if (inputRate === outputRate) return input;\n const ratio = inputRate / outputRate;\n const output = new Float32Array(Math.round(input.length / ratio));\n for (let index = 0; index < output.length; index += 1) {\n const source = index * ratio;\n const floor = Math.floor(source);\n const ceil = Math.min(floor + 1, input.length - 1);\n const fraction = source - floor;\n output[index] = (input[floor] ?? 0) * (1 - fraction) + (input[ceil] ?? 0) * fraction;\n }\n return output;\n}\n\nasync function waitForWebSocketOpen(websocket: WebSocket, signal: AbortSignal): Promise<void> {\n if (websocket.readyState === WebSocket.OPEN) return;\n await new Promise<void>((resolve, reject) => {\n const cleanup = (): void => {\n websocket.removeEventListener(\"open\", onOpen);\n websocket.removeEventListener(\"error\", onError);\n websocket.removeEventListener(\"close\", onClose);\n signal.removeEventListener(\"abort\", onAbort);\n };\n const onOpen = (): void => {\n cleanup();\n resolve();\n };\n const onError = (): void => {\n cleanup();\n reject(new Error(\"AI Gateway realtime WebSocket failed to open\"));\n };\n const onClose = (): void => {\n cleanup();\n reject(new Error(\"AI Gateway realtime WebSocket closed before opening\"));\n };\n const onAbort = (): void => {\n cleanup();\n reject(signal.reason ?? new DOMException(\"Aborted\", \"AbortError\"));\n };\n websocket.addEventListener(\"open\", onOpen, { once: true });\n websocket.addEventListener(\"error\", onError, { once: true });\n websocket.addEventListener(\"close\", onClose, { once: true });\n signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction stringValue(value: unknown): string | null {\n return typeof value === \"string\" ? value : null;\n}\n\nfunction throwIfAborted(signal: AbortSignal): void {\n if (signal.aborted) throw signal.reason ?? new DOMException(\"Aborted\", \"AbortError\");\n}\n"],"mappings":"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","names":[]}
|
|
@@ -3,6 +3,9 @@ var DEFAULT_FILE_RESOURCE_MOUNT_ROOT = ".opengeni/files";
|
|
|
3
3
|
var PERSONAL_RESOURCE_SHARED_OUTPUT_WARNING_VERSION = 1;
|
|
4
4
|
var PERSONAL_RESOURCE_SHARED_OUTPUT_WARNING = "Personal resources used in a workspace-shared session may influence outputs visible to other workspace members. The underlying credentials and secret values are not shared by the attachment itself.";
|
|
5
5
|
var SESSION_EVENT_TYPES = [
|
|
6
|
+
"usage.threshold_reached",
|
|
7
|
+
"usage.exhausted",
|
|
8
|
+
"usage.period_reset",
|
|
6
9
|
"session.created",
|
|
7
10
|
"session.variable_sets.updated",
|
|
8
11
|
"session.runtime.configured",
|
|
@@ -13,6 +16,8 @@ var SESSION_EVENT_TYPES = [
|
|
|
13
16
|
"session.realtime.ended",
|
|
14
17
|
"session.requiresAction",
|
|
15
18
|
"session.humanInput.requested",
|
|
19
|
+
"session.notification.posted",
|
|
20
|
+
"session.notification.withdrawn",
|
|
16
21
|
"session.context.compaction.requested",
|
|
17
22
|
"session.context.compaction.started",
|
|
18
23
|
"session.context.compacted",
|
|
@@ -29,6 +34,7 @@ var SESSION_EVENT_TYPES = [
|
|
|
29
34
|
"turn.cancelled",
|
|
30
35
|
"turn.superseded",
|
|
31
36
|
"turn.recovery.requested",
|
|
37
|
+
"turn.dispatch.expired",
|
|
32
38
|
"turn.capacity_waiting",
|
|
33
39
|
"turn.startup.phase.started",
|
|
34
40
|
"turn.startup.phase.completed",
|
|
@@ -52,8 +58,14 @@ var SESSION_EVENT_TYPES = [
|
|
|
52
58
|
"sandbox.operation.failed",
|
|
53
59
|
"session.command.backgrounded",
|
|
54
60
|
"session.command.finished",
|
|
61
|
+
"session.wait.started",
|
|
62
|
+
"session.wait.finished",
|
|
55
63
|
"sandbox.command.output.delta",
|
|
56
64
|
"artifact.created",
|
|
65
|
+
"knowledge.confirmation.recovered",
|
|
66
|
+
"instruction.confirmation.recovered",
|
|
67
|
+
"knowledge.source.prepared",
|
|
68
|
+
"knowledge.source.failed",
|
|
57
69
|
"goal.set",
|
|
58
70
|
"goal.updated",
|
|
59
71
|
"goal.progress",
|
|
@@ -103,8 +115,19 @@ var SESSION_EVENT_TYPES = [
|
|
|
103
115
|
"session.personal_resources.attached",
|
|
104
116
|
"session.mcp.approval_policy.updated",
|
|
105
117
|
"session.tool_policy.updated",
|
|
118
|
+
"session.agent.updated",
|
|
119
|
+
"session.skills.updated",
|
|
120
|
+
"session.model_settings.updated",
|
|
121
|
+
// An authorized person or host changed the task root's usage limit.
|
|
122
|
+
"session.usage_limit.updated",
|
|
106
123
|
// Multi-account Codex (P1): the session's inference account changed.
|
|
107
124
|
"codex.account.switched",
|
|
125
|
+
"subscription.account.selected",
|
|
126
|
+
"subscription.account.switched",
|
|
127
|
+
"codex.account.selection.changed",
|
|
128
|
+
// A person chose the session's account (any provider) or returned it to
|
|
129
|
+
// automatic placement.
|
|
130
|
+
"model_account.selection.changed",
|
|
108
131
|
// credential allocator metadata-only per-turn credential selection audit.
|
|
109
132
|
"codex.credential.selected",
|
|
110
133
|
// Bounded, identity-free deterministic shadow/replay decision.
|
|
@@ -169,6 +192,7 @@ var KNOWN_PERMISSIONS = [
|
|
|
169
192
|
"github:manage",
|
|
170
193
|
"github:use",
|
|
171
194
|
"api_keys:manage",
|
|
195
|
+
"usage_allowances:manage",
|
|
172
196
|
"connections:read",
|
|
173
197
|
"connections:write",
|
|
174
198
|
"capabilities:manage",
|
|
@@ -183,6 +207,7 @@ var KNOWN_PERMISSIONS = [
|
|
|
183
207
|
"secrets:list",
|
|
184
208
|
"secrets:read",
|
|
185
209
|
"secrets:write",
|
|
210
|
+
"secrets:use",
|
|
186
211
|
"mcp_servers:attach",
|
|
187
212
|
"codemode:call",
|
|
188
213
|
"goals:manage",
|
|
@@ -193,7 +218,7 @@ var KNOWN_PERMISSIONS = [
|
|
|
193
218
|
"artifacts:read",
|
|
194
219
|
"artifacts:publish"
|
|
195
220
|
];
|
|
196
|
-
var OPENGENI_API_CONTRACT_REVISION = "2026-
|
|
221
|
+
var OPENGENI_API_CONTRACT_REVISION = "2026-09-plugins-and-skills-v1";
|
|
197
222
|
var OPENGENI_API_CONTRACT_HEADER = "x-opengeni-api-contract";
|
|
198
223
|
var OPENGENI_CORRELATION_HEADER = "x-opengeni-correlation-id";
|
|
199
224
|
var RETAINED_OUTPUT_DEFAULT_PAGE_BYTES = 256 * 1024;
|
|
@@ -236,4 +261,4 @@ export {
|
|
|
236
261
|
GENERATED_VIDEO_MAX_BYTES,
|
|
237
262
|
KNOWN_USAGE_EVENT_TYPES
|
|
238
263
|
};
|
|
239
|
-
//# sourceMappingURL=chunk-
|
|
264
|
+
//# sourceMappingURL=chunk-NCU5OAN7.js.map
|