@opengeni/sdk 0.52.1 → 1.0.1

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 (56) hide show
  1. package/README.md +67 -7
  2. package/dist/artifacts.js +5 -5
  3. package/dist/{chunk-FRJFNDIR.js → chunk-4DV37UUA.js} +6 -2
  4. package/dist/chunk-4DV37UUA.js.map +1 -0
  5. package/dist/{chunk-KIHGPM7H.js → chunk-A5DC5WEM.js} +288 -45
  6. package/dist/chunk-A5DC5WEM.js.map +1 -0
  7. package/dist/{chunk-V5F253OG.js → chunk-GU6JF75T.js} +6 -3
  8. package/dist/chunk-GU6JF75T.js.map +1 -0
  9. package/dist/{chunk-MZWTWOX6.js → chunk-ST5DDKJP.js} +327 -1
  10. package/dist/chunk-ST5DDKJP.js.map +1 -0
  11. package/dist/{chunk-FHI4DFIG.js → chunk-TYZ4JL4J.js} +2 -2
  12. package/dist/{chunk-ILQZR5N6.js → chunk-YGH5P47G.js} +693 -34
  13. package/dist/chunk-YGH5P47G.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 +108 -18
  17. package/dist/codex-realtime-controller.d.ts +5 -0
  18. package/dist/codex-realtime-controller.js +2 -2
  19. package/dist/codex-realtime-v3.d.ts +13 -2
  20. package/dist/core.js +7 -7
  21. package/dist/desktop.d.ts +8 -0
  22. package/dist/editable-artifacts.js +4 -4
  23. package/dist/gateway-realtime-transport.d.ts +1 -0
  24. package/dist/gateway-realtime-transport.js +5 -3
  25. package/dist/index.d.ts +6 -2
  26. package/dist/index.js +68 -34
  27. package/dist/index.js.map +1 -1
  28. package/dist/interaction-revision-stream.d.ts +11 -0
  29. package/dist/interaction.d.ts +604 -5
  30. package/dist/interaction.js +27 -1
  31. package/dist/realtime.d.ts +3 -3
  32. package/dist/realtime.js +11 -7
  33. package/dist/realtime.js.map +1 -1
  34. package/dist/types.d.ts +283 -69
  35. package/dist/workspace-live-stream.d.ts +14 -0
  36. package/package.json +2 -2
  37. package/src/client.ts +863 -62
  38. package/src/codex-realtime-controller.ts +239 -12
  39. package/src/codex-realtime-lifecycle.ts +1 -0
  40. package/src/codex-realtime-v3.ts +162 -31
  41. package/src/desktop.ts +11 -1
  42. package/src/errors.ts +16 -2
  43. package/src/gateway-realtime-transport.ts +252 -109
  44. package/src/index.ts +42 -13
  45. package/src/interaction-revision-stream.ts +117 -0
  46. package/src/interaction.ts +1049 -5
  47. package/src/realtime.ts +14 -4
  48. package/src/types.ts +353 -72
  49. package/src/workspace-live-stream.ts +137 -0
  50. package/dist/chunk-DXDL7EEW.js.map +0 -1
  51. package/dist/chunk-FRJFNDIR.js.map +0 -1
  52. package/dist/chunk-ILQZR5N6.js.map +0 -1
  53. package/dist/chunk-KIHGPM7H.js.map +0 -1
  54. package/dist/chunk-MZWTWOX6.js.map +0 -1
  55. package/dist/chunk-V5F253OG.js.map +0 -1
  56. /package/dist/{chunk-FHI4DFIG.js.map → chunk-TYZ4JL4J.js.map} +0 -0
@@ -2,12 +2,21 @@
2
2
  var AUDIO_SAMPLE_RATE = 24e3;
3
3
  var DELEGATION_TOOL = "delegate_to_session";
4
4
  function createGatewayRealtimeTransportStarter() {
5
+ return createWebsocketRealtimeTransportStarter("gateway");
6
+ }
7
+ function createXaiSubscriptionRealtimeTransportStarter() {
8
+ return createWebsocketRealtimeTransportStarter("xai");
9
+ }
10
+ function createWebsocketRealtimeTransportStarter(dialect) {
5
11
  return async (input) => {
6
12
  const client = input.client;
7
- if (!client.negotiateGatewayRealtime) {
8
- throw new Error("The OpenGeni client does not support AI Gateway realtime");
13
+ const negotiate = dialect === "xai" ? client.negotiateXaiSubscriptionRealtime?.bind(client) : client.negotiateGatewayRealtime?.bind(client);
14
+ if (!negotiate) {
15
+ throw new Error(
16
+ dialect === "xai" ? "The OpenGeni client does not support connected SuperGrok realtime" : "The OpenGeni client does not support AI Gateway realtime"
17
+ );
9
18
  }
10
- const answer = await client.negotiateGatewayRealtime(
19
+ const answer = await negotiate(
11
20
  input.workspaceId,
12
21
  input.sessionId,
13
22
  {
@@ -22,16 +31,19 @@ function createGatewayRealtimeTransportStarter() {
22
31
  { signal: input.signal }
23
32
  );
24
33
  throwIfAborted(input.signal);
25
- const websocket = new WebSocket(answer.url, [
26
- "ai-gateway-realtime.v1",
27
- `ai-gateway-auth.${answer.token}`
28
- ]);
34
+ const websocket = new WebSocket(
35
+ answer.url,
36
+ dialect === "xai" ? [`xai-client-secret.${answer.token}`] : ["ai-gateway-realtime.v1", `ai-gateway-auth.${answer.token}`]
37
+ );
29
38
  const channel = new GatewayRealtimeDataChannel(
30
- (payload) => handleBridgeOutbound(websocket, payload)
39
+ (payload) => handleBridgeOutbound(websocket, payload, dialect)
31
40
  );
32
41
  input.onEventsCreated(channel.asRtcDataChannel());
33
42
  const audio = new GatewayRealtimeAudio({
34
- onAudio: (encoded) => send(websocket, { type: "input-audio-append", audio: encoded }),
43
+ onAudio: (encoded) => send(websocket, {
44
+ type: dialect === "xai" ? "input_audio_buffer.append" : "input-audio-append",
45
+ audio: encoded
46
+ }),
35
47
  onAudibleOutputState: input.onAudibleOutputState
36
48
  });
37
49
  let stopped = false;
@@ -51,8 +63,9 @@ function createGatewayRealtimeTransportStarter() {
51
63
  return;
52
64
  }
53
65
  if (!isRecord(parsed) || typeof parsed.type !== "string") return;
54
- handleGatewayEvent({
66
+ handleRealtimeEvent({
55
67
  event: parsed,
68
+ dialect,
56
69
  channel,
57
70
  websocket,
58
71
  audio,
@@ -72,56 +85,6 @@ function createGatewayRealtimeTransportStarter() {
72
85
  websocket.addEventListener("message", onMessage);
73
86
  websocket.addEventListener("close", onClose);
74
87
  websocket.addEventListener("error", onError);
75
- await waitForWebSocketOpen(websocket, input.signal);
76
- channel.open();
77
- send(websocket, {
78
- type: "session-update",
79
- config: {
80
- instructions: answer.instructions,
81
- outputModalities: ["audio"],
82
- inputAudioFormat: { type: "audio/pcm", rate: AUDIO_SAMPLE_RATE },
83
- outputAudioFormat: { type: "audio/pcm", rate: AUDIO_SAMPLE_RATE },
84
- inputAudioTranscription: {},
85
- outputAudioTranscription: {},
86
- turnDetection: {
87
- type: "server-vad",
88
- prefixPaddingMs: 300,
89
- silenceDurationMs: 500
90
- },
91
- tools: [
92
- {
93
- type: "function",
94
- name: DELEGATION_TOOL,
95
- description: "Pass execution work, actions, and session tasks to the underlying session agent. Include the complete standalone request and relevant conversational context.",
96
- parameters: {
97
- type: "object",
98
- properties: {
99
- request: {
100
- type: "string",
101
- description: "Complete standalone task for the session agent"
102
- }
103
- },
104
- required: ["request"],
105
- additionalProperties: false
106
- }
107
- }
108
- ]
109
- }
110
- });
111
- for (const item of answer.initialItems) {
112
- send(websocket, {
113
- type: "conversation-item-create",
114
- item: {
115
- type: "text-message",
116
- role: "user",
117
- text: `<session_initial_item role="${item.role}">
118
- ${item.text}
119
- </session_initial_item>`
120
- }
121
- });
122
- }
123
- await audio.startCapture(input.media);
124
- input.onConnectionHealth("connected");
125
88
  const stop = () => {
126
89
  if (stopped) return;
127
90
  stopped = true;
@@ -137,6 +100,38 @@ ${item.text}
137
100
  }
138
101
  };
139
102
  input.signal.addEventListener("abort", stop, { once: true });
103
+ try {
104
+ await waitForWebSocketOpen(websocket, input.signal);
105
+ channel.open();
106
+ send(
107
+ websocket,
108
+ dialect === "xai" ? xaiSessionUpdate(answer.instructions) : gatewaySessionUpdate(answer.instructions)
109
+ );
110
+ for (const item of answer.initialItems) {
111
+ const text = `<session_initial_item role="${item.role}">
112
+ ${item.text}
113
+ </session_initial_item>`;
114
+ send(
115
+ websocket,
116
+ dialect === "xai" ? {
117
+ type: "conversation.item.create",
118
+ item: {
119
+ type: "message",
120
+ role: "user",
121
+ content: [{ type: "input_text", text }]
122
+ }
123
+ } : {
124
+ type: "conversation-item-create",
125
+ item: { type: "text-message", role: "user", text }
126
+ }
127
+ );
128
+ }
129
+ await audio.startCapture(input.media);
130
+ input.onConnectionHealth("connected");
131
+ } catch (error) {
132
+ stop();
133
+ throw error;
134
+ }
140
135
  return {
141
136
  peerConnection: null,
142
137
  events: channel.asRtcDataChannel(),
@@ -155,11 +150,72 @@ ${item.text}
155
150
  };
156
151
  };
157
152
  }
158
- function handleGatewayEvent(input) {
153
+ function delegationTool() {
154
+ return {
155
+ type: "function",
156
+ name: DELEGATION_TOOL,
157
+ description: "Pass execution work, actions, and session tasks to the underlying session agent. Include the complete standalone request and relevant conversational context.",
158
+ parameters: {
159
+ type: "object",
160
+ properties: {
161
+ request: {
162
+ type: "string",
163
+ description: "Complete standalone task for the session agent"
164
+ }
165
+ },
166
+ required: ["request"],
167
+ additionalProperties: false
168
+ }
169
+ };
170
+ }
171
+ function gatewaySessionUpdate(instructions) {
172
+ return {
173
+ type: "session-update",
174
+ config: {
175
+ instructions,
176
+ outputModalities: ["audio"],
177
+ inputAudioFormat: { type: "audio/pcm", rate: AUDIO_SAMPLE_RATE },
178
+ outputAudioFormat: { type: "audio/pcm", rate: AUDIO_SAMPLE_RATE },
179
+ inputAudioTranscription: {},
180
+ outputAudioTranscription: {},
181
+ turnDetection: {
182
+ type: "server-vad",
183
+ prefixPaddingMs: 300,
184
+ silenceDurationMs: 500
185
+ },
186
+ tools: [delegationTool()]
187
+ }
188
+ };
189
+ }
190
+ function xaiSessionUpdate(instructions) {
191
+ return {
192
+ type: "session.update",
193
+ session: {
194
+ instructions,
195
+ voice: "eve",
196
+ reasoning: { effort: "high" },
197
+ turn_detection: {
198
+ type: "server_vad",
199
+ prefix_padding_ms: 300,
200
+ silence_duration_ms: 500
201
+ },
202
+ audio: {
203
+ input: {
204
+ format: { type: "audio/pcm", rate: AUDIO_SAMPLE_RATE },
205
+ transcription: { model: "grok-transcribe" }
206
+ },
207
+ output: { format: { type: "audio/pcm", rate: AUDIO_SAMPLE_RATE } }
208
+ },
209
+ tools: [delegationTool()]
210
+ }
211
+ };
212
+ }
213
+ function handleRealtimeEvent(input) {
159
214
  const event = input.event;
160
215
  const eventId = providerEventId(event);
161
- if (event.type === "session-created") {
162
- const sessionId = stringValue(event.sessionId) ?? `gateway-${crypto.randomUUID()}`;
216
+ if (event.type === "session-created" || event.type === "session.created") {
217
+ const session = isRecord(event.session) ? event.session : null;
218
+ const sessionId = stringValue(event.sessionId) ?? stringValue(session?.id) ?? `realtime-${crypto.randomUUID()}`;
163
219
  input.channel.providerEvent({
164
220
  type: "session.started",
165
221
  event_id: eventId,
@@ -167,23 +223,31 @@ function handleGatewayEvent(input) {
167
223
  });
168
224
  return;
169
225
  }
170
- if (event.type === "speech-started") {
226
+ if (event.type === "speech-started" || event.type === "input_audio_buffer.speech_started") {
171
227
  const itemId = input.getCurrentOutputItemId();
172
228
  if (itemId && input.audio.isPlaying()) {
173
229
  const audioEndMs = input.audio.playbackOffsetMs();
174
230
  input.audio.stopPlayback();
175
- send(input.websocket, {
176
- type: "conversation-item-truncate",
177
- itemId,
178
- contentIndex: 0,
179
- audioEndMs: Math.max(0, Math.round(audioEndMs))
180
- });
231
+ send(
232
+ input.websocket,
233
+ input.dialect === "xai" ? {
234
+ type: "conversation.item.truncate",
235
+ item_id: itemId,
236
+ content_index: 0,
237
+ audio_end_ms: Math.max(0, Math.round(audioEndMs))
238
+ } : {
239
+ type: "conversation-item-truncate",
240
+ itemId,
241
+ contentIndex: 0,
242
+ audioEndMs: Math.max(0, Math.round(audioEndMs))
243
+ }
244
+ );
181
245
  }
182
246
  return;
183
247
  }
184
- if (event.type === "input-transcription-completed") {
248
+ if (event.type === "input-transcription-completed" || event.type === "conversation.item.input_audio_transcription.completed") {
185
249
  const transcript = stringValue(event.transcript) ?? "";
186
- const itemId = stringValue(event.itemId) ?? crypto.randomUUID();
250
+ const itemId = stringValue(event.itemId) ?? stringValue(event.item_id) ?? crypto.randomUUID();
187
251
  if (transcript.trim()) {
188
252
  input.channel.providerEvent({
189
253
  type: "turn.done",
@@ -193,17 +257,17 @@ function handleGatewayEvent(input) {
193
257
  }
194
258
  return;
195
259
  }
196
- if (event.type === "audio-delta") {
260
+ if (event.type === "audio-delta" || event.type === "response.output_audio.delta" || event.type === "response.audio.delta") {
197
261
  const delta = stringValue(event.delta);
198
262
  if (!delta) return;
199
- const itemId = stringValue(event.itemId);
263
+ const itemId = stringValue(event.itemId) ?? stringValue(event.item_id);
200
264
  if (itemId) input.setCurrentOutputItemId(itemId);
201
265
  input.audio.play(delta);
202
266
  input.channel.providerEvent({ type: "output_audio.delta", event_id: eventId, audio: delta });
203
267
  return;
204
268
  }
205
- if (event.type === "audio-transcript-done" || event.type === "text-done") {
206
- const itemId = stringValue(event.itemId) ?? crypto.randomUUID();
269
+ if (event.type === "audio-transcript-done" || event.type === "text-done" || event.type === "response.output_audio_transcript.done" || event.type === "response.audio_transcript.done" || event.type === "response.output_text.done") {
270
+ const itemId = stringValue(event.itemId) ?? stringValue(event.item_id) ?? crypto.randomUUID();
207
271
  const transcript = stringValue(event.transcript) ?? stringValue(event.text) ?? "";
208
272
  if (transcript.trim() && !input.finalizedAssistantItems.has(itemId)) {
209
273
  input.finalizedAssistantItems.add(itemId);
@@ -215,21 +279,19 @@ function handleGatewayEvent(input) {
215
279
  }
216
280
  return;
217
281
  }
218
- if (event.type === "audio-done") return;
219
- if (event.type === "function-call-arguments-done") {
220
- const callId = stringValue(event.callId) ?? stringValue(event.itemId) ?? crypto.randomUUID();
282
+ if (event.type === "audio-done" || event.type === "response.output_audio.done") return;
283
+ if (event.type === "function-call-arguments-done" || event.type === "response.function_call_arguments.done") {
284
+ const callId = stringValue(event.callId) ?? stringValue(event.call_id) ?? stringValue(event.itemId) ?? stringValue(event.item_id) ?? crypto.randomUUID();
221
285
  const name = stringValue(event.name);
222
286
  if (name !== DELEGATION_TOOL) {
223
- send(input.websocket, {
224
- type: "conversation-item-create",
225
- item: {
226
- type: "function-call-output",
227
- callId,
228
- name,
229
- output: JSON.stringify({ error: "Unsupported realtime tool" })
230
- }
231
- });
232
- send(input.websocket, { type: "response-create" });
287
+ sendFunctionOutput(
288
+ input.websocket,
289
+ input.dialect,
290
+ callId,
291
+ name,
292
+ JSON.stringify({ error: "Unsupported realtime tool" })
293
+ );
294
+ sendResponseCreate(input.websocket, input.dialect);
233
295
  return;
234
296
  }
235
297
  const request = delegationRequest(stringValue(event.arguments) ?? "");
@@ -246,10 +308,11 @@ function handleGatewayEvent(input) {
246
308
  return;
247
309
  }
248
310
  if (event.type === "error") {
311
+ const nested = isRecord(event.error) ? event.error : null;
249
312
  input.channel.providerEvent({
250
313
  type: "error",
251
314
  event_id: eventId,
252
- message: stringValue(event.message) ?? "AI Gateway realtime provider error"
315
+ message: stringValue(event.message) ?? stringValue(nested?.message) ?? "Realtime provider error"
253
316
  });
254
317
  }
255
318
  }
@@ -298,7 +361,7 @@ var GatewayRealtimeDataChannel = class extends EventTarget {
298
361
  this.dispatchEvent(new Event("close"));
299
362
  }
300
363
  };
301
- function handleBridgeOutbound(websocket, messages) {
364
+ function handleBridgeOutbound(websocket, messages, dialect) {
302
365
  const groups = /* @__PURE__ */ new Map();
303
366
  for (const message of messages) {
304
367
  const type = stringValue(message.type);
@@ -318,32 +381,52 @@ function handleBridgeOutbound(websocket, messages) {
318
381
  }
319
382
  for (const group of groups.values()) {
320
383
  if (group.type === "delegation.context.append" && group.id && group.channel === "speakable") {
321
- send(websocket, {
322
- type: "conversation-item-create",
323
- item: {
324
- type: "function-call-output",
325
- callId: group.id,
326
- name: DELEGATION_TOOL,
327
- output: JSON.stringify({ result: group.text })
328
- }
329
- });
330
- send(websocket, { type: "response-create" });
384
+ sendFunctionOutput(
385
+ websocket,
386
+ dialect,
387
+ group.id,
388
+ DELEGATION_TOOL,
389
+ JSON.stringify({ result: group.text })
390
+ );
391
+ sendResponseCreate(websocket, dialect);
331
392
  continue;
332
393
  }
333
394
  const wrapper = group.type === "delegation.context.append" ? group.channel === "commentary" ? "execution_progress" : "execution_result" : "session_update";
334
- send(websocket, {
335
- type: "conversation-item-create",
336
- item: {
337
- type: "text-message",
338
- role: "user",
339
- text: `<${wrapper}>
395
+ const text = `<${wrapper}>
340
396
  ${group.text}
341
- </${wrapper}>`
397
+ </${wrapper}>`;
398
+ send(
399
+ websocket,
400
+ dialect === "xai" ? {
401
+ type: "conversation.item.create",
402
+ item: {
403
+ type: "message",
404
+ role: "user",
405
+ content: [{ type: "input_text", text }]
406
+ }
407
+ } : {
408
+ type: "conversation-item-create",
409
+ item: { type: "text-message", role: "user", text }
342
410
  }
343
- });
344
- if (group.channel === "speakable") send(websocket, { type: "response-create" });
411
+ );
412
+ if (group.channel === "speakable") sendResponseCreate(websocket, dialect);
345
413
  }
346
414
  }
415
+ function sendFunctionOutput(websocket, dialect, callId, name, output) {
416
+ send(
417
+ websocket,
418
+ dialect === "xai" ? {
419
+ type: "conversation.item.create",
420
+ item: { type: "function_call_output", call_id: callId, output }
421
+ } : {
422
+ type: "conversation-item-create",
423
+ item: { type: "function-call-output", callId, name, output }
424
+ }
425
+ );
426
+ }
427
+ function sendResponseCreate(websocket, dialect) {
428
+ send(websocket, { type: dialect === "xai" ? "response.create" : "response-create" });
429
+ }
347
430
  var GatewayRealtimeAudio = class {
348
431
  constructor(options) {
349
432
  this.options = options;
@@ -488,7 +571,7 @@ function delegationRequest(argumentsJson) {
488
571
  }
489
572
  function providerEventId(event) {
490
573
  const raw = isRecord(event.raw) ? event.raw : null;
491
- return stringValue(event.eventId) ?? stringValue(raw?.event_id) ?? stringValue(raw?.id) ?? crypto.randomUUID();
574
+ return stringValue(event.eventId) ?? stringValue(event.event_id) ?? stringValue(raw?.event_id) ?? stringValue(raw?.id) ?? crypto.randomUUID();
492
575
  }
493
576
  function encodePcm16(samples) {
494
577
  const bytes = new Uint8Array(samples.length * 2);
@@ -568,6 +651,7 @@ function throwIfAborted(signal) {
568
651
  }
569
652
 
570
653
  export {
571
- createGatewayRealtimeTransportStarter
654
+ createGatewayRealtimeTransportStarter,
655
+ createXaiSubscriptionRealtimeTransportStarter
572
656
  };
573
- //# sourceMappingURL=chunk-DXDL7EEW.js.map
657
+ //# sourceMappingURL=chunk-YKZME56C.js.map
@@ -0,0 +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":[]}