@prestyj/voice 4.3.191

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 (39) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +79 -0
  3. package/dist/bridges/ezboss.cjs +96 -0
  4. package/dist/bridges/ezboss.cjs.map +1 -0
  5. package/dist/bridges/ezboss.d.cts +13 -0
  6. package/dist/bridges/ezboss.d.ts +13 -0
  7. package/dist/bridges/ezboss.js +70 -0
  8. package/dist/bridges/ezboss.js.map +1 -0
  9. package/dist/bridges/ezcoder-rpc.cjs +128 -0
  10. package/dist/bridges/ezcoder-rpc.cjs.map +1 -0
  11. package/dist/bridges/ezcoder-rpc.d.cts +18 -0
  12. package/dist/bridges/ezcoder-rpc.d.ts +18 -0
  13. package/dist/bridges/ezcoder-rpc.js +101 -0
  14. package/dist/bridges/ezcoder-rpc.js.map +1 -0
  15. package/dist/chunk-VJ6MPV2Z.js +225 -0
  16. package/dist/chunk-VJ6MPV2Z.js.map +1 -0
  17. package/dist/chunk-YLNKQ7CC.js +234 -0
  18. package/dist/chunk-YLNKQ7CC.js.map +1 -0
  19. package/dist/index.cjs +357 -0
  20. package/dist/index.cjs.map +1 -0
  21. package/dist/index.d.cts +90 -0
  22. package/dist/index.d.ts +90 -0
  23. package/dist/index.js +109 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/providers/openai-codex-realtime.cjs +362 -0
  26. package/dist/providers/openai-codex-realtime.cjs.map +1 -0
  27. package/dist/providers/openai-codex-realtime.d.cts +15 -0
  28. package/dist/providers/openai-codex-realtime.d.ts +15 -0
  29. package/dist/providers/openai-codex-realtime.js +31 -0
  30. package/dist/providers/openai-codex-realtime.js.map +1 -0
  31. package/dist/providers/openai-realtime.cjs +342 -0
  32. package/dist/providers/openai-realtime.cjs.map +1 -0
  33. package/dist/providers/openai-realtime.d.cts +34 -0
  34. package/dist/providers/openai-realtime.d.ts +34 -0
  35. package/dist/providers/openai-realtime.js +12 -0
  36. package/dist/providers/openai-realtime.js.map +1 -0
  37. package/dist/types-Dc4Q3Z6X.d.cts +257 -0
  38. package/dist/types-Dc4Q3Z6X.d.ts +257 -0
  39. package/package.json +63 -0
@@ -0,0 +1,342 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/providers/openai-realtime.ts
21
+ var openai_realtime_exports = {};
22
+ __export(openai_realtime_exports, {
23
+ createOpenAIRealtimeProvider: () => createOpenAIRealtimeProvider,
24
+ normalizeOpenAIRealtimeEvent: () => normalizeOpenAIRealtimeEvent,
25
+ toOpenAISessionConfig: () => toOpenAISessionConfig
26
+ });
27
+ module.exports = __toCommonJS(openai_realtime_exports);
28
+
29
+ // src/session.ts
30
+ function createVoiceSession(options) {
31
+ return new VoiceSessionController(options);
32
+ }
33
+ function normalizeVoiceProviderError(error) {
34
+ if (error instanceof Error) {
35
+ return error;
36
+ }
37
+ if (typeof error === "string") {
38
+ return new Error(error);
39
+ }
40
+ return new Error("Voice provider error", { cause: error });
41
+ }
42
+ var VoiceSessionController = class {
43
+ id;
44
+ provider;
45
+ metadata;
46
+ #state = "connected";
47
+ #handlers = /* @__PURE__ */ new Set();
48
+ #unsubscribeTransport;
49
+ #options;
50
+ constructor(options) {
51
+ this.id = options.id;
52
+ this.provider = options.provider;
53
+ this.metadata = options.metadata ?? { sessionId: options.id, provider: options.provider };
54
+ this.#options = options;
55
+ this.#unsubscribeTransport = options.transport?.onEvent((event) => {
56
+ this.#handleTransportEvent(event);
57
+ });
58
+ }
59
+ get state() {
60
+ return this.#state;
61
+ }
62
+ onEvent(handler) {
63
+ this.#handlers.add(handler);
64
+ return () => {
65
+ this.#handlers.delete(handler);
66
+ };
67
+ }
68
+ async sendAudio(chunk, signal) {
69
+ await this.#options.onSendAudio?.(chunk, signal);
70
+ await this.#options.transport?.send({ type: "audio", chunk }, signal);
71
+ }
72
+ async sendText(text, signal) {
73
+ await this.#options.onSendText?.(text, signal);
74
+ await this.#options.transport?.send({ type: "text", text }, signal);
75
+ }
76
+ async sendToolResult(result, signal) {
77
+ await this.#options.onSendToolResult?.(result, signal);
78
+ await this.#options.transport?.send({ type: "tool_result", result }, signal);
79
+ this.#emit({ type: "tool_result_sent", result });
80
+ }
81
+ async updateConfig(config, signal) {
82
+ await this.#options.onUpdateConfig?.(config, signal);
83
+ await this.#options.transport?.send({ type: "config", config }, signal);
84
+ }
85
+ async close(reason) {
86
+ if (this.#state === "closed" || this.#state === "closing") {
87
+ return;
88
+ }
89
+ this.#state = "closing";
90
+ await this.#options.onClose?.(reason);
91
+ await this.#options.transport?.close(reason);
92
+ this.#unsubscribeTransport?.();
93
+ this.#state = "closed";
94
+ this.#emit({ type: "closed", reason });
95
+ }
96
+ #handleTransportEvent(event) {
97
+ if (event.type === "raw") {
98
+ return;
99
+ }
100
+ if (event.type === "closed") {
101
+ this.#state = "closed";
102
+ }
103
+ this.#emit(event);
104
+ }
105
+ #emit(event) {
106
+ const handlers = [...this.#handlers];
107
+ for (const handler of handlers) {
108
+ handler(event);
109
+ }
110
+ }
111
+ };
112
+
113
+ // src/tools.ts
114
+ var import_zod = require("zod");
115
+ function voiceToolToRealtimeFunctionTool(tool) {
116
+ return {
117
+ type: "function",
118
+ name: tool.name,
119
+ description: tool.description,
120
+ parameters: tool.parameters
121
+ };
122
+ }
123
+
124
+ // src/providers/openai-realtime.ts
125
+ function createOpenAIRealtimeProvider(options = {}) {
126
+ return {
127
+ name: options.providerName ?? "openai-realtime",
128
+ async connect(connectOptions) {
129
+ if (!connectOptions.transport) {
130
+ throw new Error("OpenAI Realtime provider requires an injected VoiceTransport");
131
+ }
132
+ const sessionConfig = toOpenAISessionConfig(connectOptions.session);
133
+ await connectOptions.transport.connect(connectOptions);
134
+ return createVoiceSession({
135
+ id: createSessionId(connectOptions.session),
136
+ provider: options.providerName ?? "openai-realtime",
137
+ transport: createNormalizingTransport(connectOptions.transport),
138
+ metadata: createMetadata(connectOptions.session),
139
+ onSendToolResult: async (result, signal) => {
140
+ await connectOptions.transport?.send(
141
+ { type: "tool_result", result: toOpenAIToolResult(result) },
142
+ signal
143
+ );
144
+ },
145
+ onUpdateConfig: async (config, signal) => {
146
+ await connectOptions.transport?.send(
147
+ {
148
+ type: "config",
149
+ config: { ...config, session: sessionConfig }
150
+ },
151
+ signal
152
+ );
153
+ }
154
+ });
155
+ }
156
+ };
157
+ }
158
+ function toOpenAISessionConfig(config) {
159
+ const audio = {};
160
+ if (config.voice) {
161
+ audio.output = { voice: config.voice };
162
+ }
163
+ if (config.inputAudioFormat) {
164
+ audio.input = { format: config.inputAudioFormat };
165
+ }
166
+ if (config.outputAudioFormat) {
167
+ audio.output = {
168
+ ...audio.output,
169
+ format: config.outputAudioFormat
170
+ };
171
+ }
172
+ if (config.turnDetection !== void 0) {
173
+ audio.input = {
174
+ ...audio.input,
175
+ turn_detection: config.turnDetection
176
+ };
177
+ }
178
+ return {
179
+ type: "realtime",
180
+ model: config.model,
181
+ ...config.instructions ? { instructions: config.instructions } : {},
182
+ ...Object.keys(audio).length > 0 ? { audio } : {},
183
+ ...config.tools && config.tools.length > 0 ? { tools: config.tools.map((tool) => voiceToolToRealtimeFunctionTool(tool)) } : {},
184
+ ...config.metadata ? { metadata: config.metadata } : {}
185
+ };
186
+ }
187
+ function normalizeOpenAIRealtimeEvent(event) {
188
+ if (!isJsonObject(event)) {
189
+ return null;
190
+ }
191
+ const type = typeof event.type === "string" ? event.type : "";
192
+ switch (type) {
193
+ case "session.created":
194
+ case "session.updated":
195
+ return {
196
+ type: "session_started",
197
+ session: normalizeSessionMetadata(event.session)
198
+ };
199
+ case "conversation.item.input_audio_transcription.delta":
200
+ return {
201
+ type: "input_transcript_delta",
202
+ delta: stringValue(event.delta),
203
+ itemId: stringOrUndefined(event.item_id)
204
+ };
205
+ case "conversation.item.input_audio_transcription.completed":
206
+ return {
207
+ type: "input_transcript_done",
208
+ text: stringValue(event.transcript),
209
+ itemId: stringOrUndefined(event.item_id)
210
+ };
211
+ case "response.output_audio_transcript.delta":
212
+ return {
213
+ type: "output_text_delta",
214
+ delta: stringValue(event.delta),
215
+ itemId: stringOrUndefined(event.item_id)
216
+ };
217
+ case "response.output_audio_transcript.done":
218
+ return {
219
+ type: "output_text_done",
220
+ text: stringValue(event.transcript),
221
+ itemId: stringOrUndefined(event.item_id)
222
+ };
223
+ case "response.output_text.delta":
224
+ case "response.text.delta":
225
+ return {
226
+ type: "output_text_delta",
227
+ delta: stringValue(event.delta),
228
+ itemId: stringOrUndefined(event.item_id)
229
+ };
230
+ case "response.output_text.done":
231
+ case "response.text.done":
232
+ return {
233
+ type: "output_text_done",
234
+ text: stringValue(event.text),
235
+ itemId: stringOrUndefined(event.item_id)
236
+ };
237
+ case "response.output_audio.delta":
238
+ case "response.audio.delta":
239
+ return {
240
+ type: "output_audio_delta",
241
+ chunk: { data: stringValue(event.delta), format: "base64" },
242
+ itemId: stringOrUndefined(event.item_id)
243
+ };
244
+ case "response.output_audio.done":
245
+ case "response.audio.done":
246
+ return { type: "output_audio_done", itemId: stringOrUndefined(event.item_id) };
247
+ case "response.function_call_arguments.done":
248
+ return { type: "tool_call", call: normalizeToolCall(event) };
249
+ case "error":
250
+ return {
251
+ type: "error",
252
+ error: normalizeVoiceProviderError(event.error ?? event),
253
+ recoverable: true
254
+ };
255
+ default:
256
+ return null;
257
+ }
258
+ }
259
+ function createNormalizingTransport(transport) {
260
+ return {
261
+ kind: transport.kind,
262
+ connect: transport.connect.bind(transport),
263
+ send: transport.send.bind(transport),
264
+ close: transport.close.bind(transport),
265
+ onEvent(handler) {
266
+ return transport.onEvent((event) => {
267
+ handler(normalizeTransportEvent(event));
268
+ });
269
+ }
270
+ };
271
+ }
272
+ function normalizeTransportEvent(event) {
273
+ if (event.type !== "raw") {
274
+ return event;
275
+ }
276
+ const normalized = normalizeOpenAIRealtimeEvent(event.data);
277
+ return normalized ?? event;
278
+ }
279
+ function normalizeToolCall(event) {
280
+ const args = parseJsonObject(event.arguments);
281
+ return {
282
+ id: stringValue(event.call_id ?? event.item_id ?? event.event_id),
283
+ name: stringValue(event.name),
284
+ args,
285
+ providerCallId: stringOrUndefined(event.call_id),
286
+ raw: event
287
+ };
288
+ }
289
+ function toOpenAIToolResult(result) {
290
+ return result;
291
+ }
292
+ function createMetadata(config) {
293
+ return {
294
+ provider: "openai-realtime",
295
+ model: config.model,
296
+ createdAt: (/* @__PURE__ */ new Date()).toISOString()
297
+ };
298
+ }
299
+ function createSessionId(config) {
300
+ const model = config.model.replace(/[^a-zA-Z0-9_-]/g, "_");
301
+ return `openai_${model}_${Date.now()}`;
302
+ }
303
+ function normalizeSessionMetadata(value) {
304
+ if (!isJsonObject(value)) {
305
+ return { provider: "openai-realtime" };
306
+ }
307
+ return {
308
+ sessionId: stringOrUndefined(value.id),
309
+ provider: "openai-realtime",
310
+ model: stringOrUndefined(value.model)
311
+ };
312
+ }
313
+ function parseJsonObject(value) {
314
+ if (isJsonObject(value)) {
315
+ return value;
316
+ }
317
+ if (typeof value !== "string") {
318
+ return {};
319
+ }
320
+ try {
321
+ const parsed = JSON.parse(value);
322
+ return isJsonObject(parsed) ? parsed : {};
323
+ } catch {
324
+ return {};
325
+ }
326
+ }
327
+ function stringValue(value) {
328
+ return typeof value === "string" ? value : "";
329
+ }
330
+ function stringOrUndefined(value) {
331
+ return typeof value === "string" ? value : void 0;
332
+ }
333
+ function isJsonObject(value) {
334
+ return typeof value === "object" && value !== null && !Array.isArray(value);
335
+ }
336
+ // Annotate the CommonJS export names for ESM import in node:
337
+ 0 && (module.exports = {
338
+ createOpenAIRealtimeProvider,
339
+ normalizeOpenAIRealtimeEvent,
340
+ toOpenAISessionConfig
341
+ });
342
+ //# sourceMappingURL=openai-realtime.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/providers/openai-realtime.ts","../../src/session.ts","../../src/tools.ts"],"sourcesContent":["import { createVoiceSession, normalizeVoiceProviderError } from \"../session.js\";\nimport { voiceToolToRealtimeFunctionTool } from \"../tools.js\";\nimport type {\n JsonObject,\n RealtimeFunctionToolDefinition,\n VoiceEvent,\n VoiceProvider,\n VoiceProviderConnectOptions,\n VoiceSession,\n VoiceSessionConfig,\n VoiceSessionMetadata,\n VoiceToolCall,\n VoiceToolResult,\n VoiceTransport,\n VoiceTransportEvent,\n} from \"../types.js\";\n\nexport interface OpenAIRealtimeProviderOptions {\n readonly baseUrl?: string;\n readonly providerName?: string;\n}\n\nexport interface OpenAIRealtimeSessionConfig {\n readonly type: \"realtime\";\n readonly model: string;\n readonly instructions?: string;\n readonly audio?: JsonObject;\n readonly tools?: readonly RealtimeFunctionToolDefinition[];\n readonly metadata?: Readonly<Record<string, string>>;\n}\n\nexport interface OpenAIClientSecretRequest {\n readonly session: OpenAIRealtimeSessionConfig;\n}\n\nexport interface OpenAIRealtimeCallRequest {\n readonly sdp: string;\n readonly session: OpenAIRealtimeSessionConfig;\n}\n\nexport interface OpenAIRealtimeHttpClient {\n createClientSecret(\n request: OpenAIClientSecretRequest,\n options: { readonly signal?: AbortSignal },\n ): Promise<JsonObject>;\n createCall(\n request: OpenAIRealtimeCallRequest,\n options: { readonly signal?: AbortSignal },\n ): Promise<string>;\n}\n\nexport function createOpenAIRealtimeProvider(\n options: OpenAIRealtimeProviderOptions = {},\n): VoiceProvider {\n return {\n name: options.providerName ?? \"openai-realtime\",\n async connect(connectOptions: VoiceProviderConnectOptions): Promise<VoiceSession> {\n if (!connectOptions.transport) {\n throw new Error(\"OpenAI Realtime provider requires an injected VoiceTransport\");\n }\n const sessionConfig = toOpenAISessionConfig(connectOptions.session);\n await connectOptions.transport.connect(connectOptions);\n return createVoiceSession({\n id: createSessionId(connectOptions.session),\n provider: options.providerName ?? \"openai-realtime\",\n transport: createNormalizingTransport(connectOptions.transport),\n metadata: createMetadata(connectOptions.session),\n onSendToolResult: async (result, signal) => {\n await connectOptions.transport?.send(\n { type: \"tool_result\", result: toOpenAIToolResult(result) },\n signal,\n );\n },\n onUpdateConfig: async (config, signal) => {\n await connectOptions.transport?.send(\n {\n type: \"config\",\n config: { ...config, session: sessionConfig } as Partial<VoiceSessionConfig>,\n },\n signal,\n );\n },\n });\n },\n };\n}\n\nexport function toOpenAISessionConfig(config: VoiceSessionConfig): OpenAIRealtimeSessionConfig {\n const audio: JsonObject = {};\n if (config.voice) {\n audio.output = { voice: config.voice };\n }\n if (config.inputAudioFormat) {\n audio.input = { format: config.inputAudioFormat };\n }\n if (config.outputAudioFormat) {\n audio.output = {\n ...(audio.output as JsonObject | undefined),\n format: config.outputAudioFormat,\n };\n }\n if (config.turnDetection !== undefined) {\n audio.input = {\n ...(audio.input as JsonObject | undefined),\n turn_detection: config.turnDetection,\n };\n }\n\n return {\n type: \"realtime\",\n model: config.model,\n ...(config.instructions ? { instructions: config.instructions } : {}),\n ...(Object.keys(audio).length > 0 ? { audio } : {}),\n ...(config.tools && config.tools.length > 0\n ? { tools: config.tools.map((tool) => voiceToolToRealtimeFunctionTool(tool)) }\n : {}),\n ...(config.metadata ? { metadata: config.metadata } : {}),\n };\n}\n\nexport function normalizeOpenAIRealtimeEvent(event: unknown): VoiceEvent | null {\n if (!isJsonObject(event)) {\n return null;\n }\n const type = typeof event.type === \"string\" ? event.type : \"\";\n switch (type) {\n case \"session.created\":\n case \"session.updated\":\n return {\n type: \"session_started\",\n session: normalizeSessionMetadata(event.session),\n };\n case \"conversation.item.input_audio_transcription.delta\":\n return {\n type: \"input_transcript_delta\",\n delta: stringValue(event.delta),\n itemId: stringOrUndefined(event.item_id),\n };\n case \"conversation.item.input_audio_transcription.completed\":\n return {\n type: \"input_transcript_done\",\n text: stringValue(event.transcript),\n itemId: stringOrUndefined(event.item_id),\n };\n case \"response.output_audio_transcript.delta\":\n return {\n type: \"output_text_delta\",\n delta: stringValue(event.delta),\n itemId: stringOrUndefined(event.item_id),\n };\n case \"response.output_audio_transcript.done\":\n return {\n type: \"output_text_done\",\n text: stringValue(event.transcript),\n itemId: stringOrUndefined(event.item_id),\n };\n case \"response.output_text.delta\":\n case \"response.text.delta\":\n return {\n type: \"output_text_delta\",\n delta: stringValue(event.delta),\n itemId: stringOrUndefined(event.item_id),\n };\n case \"response.output_text.done\":\n case \"response.text.done\":\n return {\n type: \"output_text_done\",\n text: stringValue(event.text),\n itemId: stringOrUndefined(event.item_id),\n };\n case \"response.output_audio.delta\":\n case \"response.audio.delta\":\n return {\n type: \"output_audio_delta\",\n chunk: { data: stringValue(event.delta), format: \"base64\" },\n itemId: stringOrUndefined(event.item_id),\n };\n case \"response.output_audio.done\":\n case \"response.audio.done\":\n return { type: \"output_audio_done\", itemId: stringOrUndefined(event.item_id) };\n case \"response.function_call_arguments.done\":\n return { type: \"tool_call\", call: normalizeToolCall(event) };\n case \"error\":\n return {\n type: \"error\",\n error: normalizeVoiceProviderError(event.error ?? event),\n recoverable: true,\n };\n default:\n return null;\n }\n}\n\nfunction createNormalizingTransport(transport: VoiceTransport): VoiceTransport {\n return {\n kind: transport.kind,\n connect: transport.connect.bind(transport),\n send: transport.send.bind(transport),\n close: transport.close.bind(transport),\n onEvent(handler) {\n return transport.onEvent((event) => {\n handler(normalizeTransportEvent(event));\n });\n },\n };\n}\n\nfunction normalizeTransportEvent(event: VoiceTransportEvent): VoiceTransportEvent {\n if (event.type !== \"raw\") {\n return event;\n }\n const normalized = normalizeOpenAIRealtimeEvent(event.data);\n return normalized ?? event;\n}\n\nfunction normalizeToolCall(event: JsonObject): VoiceToolCall {\n const args = parseJsonObject(event.arguments);\n return {\n id: stringValue(event.call_id ?? event.item_id ?? event.event_id),\n name: stringValue(event.name),\n args,\n providerCallId: stringOrUndefined(event.call_id),\n raw: event,\n };\n}\n\nfunction toOpenAIToolResult(result: VoiceToolResult): VoiceToolResult {\n return result;\n}\n\nfunction createMetadata(config: VoiceSessionConfig): VoiceSessionMetadata {\n return {\n provider: \"openai-realtime\",\n model: config.model,\n createdAt: new Date().toISOString(),\n };\n}\n\nfunction createSessionId(config: VoiceSessionConfig): string {\n const model = config.model.replace(/[^a-zA-Z0-9_-]/g, \"_\");\n return `openai_${model}_${Date.now()}`;\n}\n\nfunction normalizeSessionMetadata(value: unknown): VoiceSessionMetadata {\n if (!isJsonObject(value)) {\n return { provider: \"openai-realtime\" };\n }\n return {\n sessionId: stringOrUndefined(value.id),\n provider: \"openai-realtime\",\n model: stringOrUndefined(value.model),\n };\n}\n\nfunction parseJsonObject(value: unknown): JsonObject {\n if (isJsonObject(value)) {\n return value;\n }\n if (typeof value !== \"string\") {\n return {};\n }\n try {\n const parsed: unknown = JSON.parse(value);\n return isJsonObject(parsed) ? parsed : {};\n } catch {\n return {};\n }\n}\n\nfunction stringValue(value: unknown): string {\n return typeof value === \"string\" ? value : \"\";\n}\n\nfunction stringOrUndefined(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction isJsonObject(value: unknown): value is JsonObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import type {\n AudioInputChunk,\n JsonObject,\n VoiceConnectionState,\n VoiceEvent,\n VoiceEventHandler,\n VoiceSession,\n VoiceSessionConfig,\n VoiceSessionMetadata,\n VoiceToolResult,\n VoiceTransport,\n VoiceTransportEvent,\n} from \"./types.js\";\n\nexport interface VoiceSessionControllerOptions {\n readonly id: string;\n readonly provider: string;\n readonly transport?: VoiceTransport;\n readonly metadata?: VoiceSessionMetadata;\n readonly onSendToolResult?: (result: VoiceToolResult, signal?: AbortSignal) => Promise<void>;\n readonly onSendAudio?: (chunk: AudioInputChunk, signal?: AbortSignal) => Promise<void>;\n readonly onSendText?: (text: string, signal?: AbortSignal) => Promise<void>;\n readonly onUpdateConfig?: (\n config: Partial<VoiceSessionConfig>,\n signal?: AbortSignal,\n ) => Promise<void>;\n readonly onClose?: (reason?: string) => Promise<void>;\n}\n\nexport function createVoiceSession(options: VoiceSessionControllerOptions): VoiceSession {\n return new VoiceSessionController(options);\n}\n\nexport function normalizeVoiceProviderError(error: unknown): Error {\n if (error instanceof Error) {\n return error;\n }\n if (typeof error === \"string\") {\n return new Error(error);\n }\n return new Error(\"Voice provider error\", { cause: error });\n}\n\nclass VoiceSessionController implements VoiceSession {\n readonly id: string;\n readonly provider: string;\n readonly metadata: VoiceSessionMetadata;\n #state: VoiceConnectionState = \"connected\";\n #handlers = new Set<VoiceEventHandler>();\n #unsubscribeTransport?: () => void;\n #options: VoiceSessionControllerOptions;\n\n constructor(options: VoiceSessionControllerOptions) {\n this.id = options.id;\n this.provider = options.provider;\n this.metadata = options.metadata ?? { sessionId: options.id, provider: options.provider };\n this.#options = options;\n this.#unsubscribeTransport = options.transport?.onEvent((event) => {\n this.#handleTransportEvent(event);\n });\n }\n\n get state(): VoiceConnectionState {\n return this.#state;\n }\n\n onEvent(handler: VoiceEventHandler): () => void {\n this.#handlers.add(handler);\n return () => {\n this.#handlers.delete(handler);\n };\n }\n\n async sendAudio(chunk: AudioInputChunk, signal?: AbortSignal): Promise<void> {\n await this.#options.onSendAudio?.(chunk, signal);\n await this.#options.transport?.send({ type: \"audio\", chunk }, signal);\n }\n\n async sendText(text: string, signal?: AbortSignal): Promise<void> {\n await this.#options.onSendText?.(text, signal);\n await this.#options.transport?.send({ type: \"text\", text }, signal);\n }\n\n async sendToolResult(result: VoiceToolResult, signal?: AbortSignal): Promise<void> {\n await this.#options.onSendToolResult?.(result, signal);\n await this.#options.transport?.send({ type: \"tool_result\", result }, signal);\n this.#emit({ type: \"tool_result_sent\", result });\n }\n\n async updateConfig(config: Partial<VoiceSessionConfig>, signal?: AbortSignal): Promise<void> {\n await this.#options.onUpdateConfig?.(config, signal);\n await this.#options.transport?.send({ type: \"config\", config }, signal);\n }\n\n async close(reason?: string): Promise<void> {\n if (this.#state === \"closed\" || this.#state === \"closing\") {\n return;\n }\n this.#state = \"closing\";\n await this.#options.onClose?.(reason);\n await this.#options.transport?.close(reason);\n this.#unsubscribeTransport?.();\n this.#state = \"closed\";\n this.#emit({ type: \"closed\", reason });\n }\n\n #handleTransportEvent(event: VoiceTransportEvent): void {\n if (event.type === \"raw\") {\n return;\n }\n if (event.type === \"closed\") {\n this.#state = \"closed\";\n }\n this.#emit(event);\n }\n\n #emit(event: VoiceEvent): void {\n const handlers = [...this.#handlers];\n for (const handler of handlers) {\n handler(event);\n }\n }\n}\n\nexport function isJsonObject(value: unknown): value is JsonObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import type { AgentTool, ToolContext, ToolExecuteResult } from \"@prestyj/agent\";\nimport type { Tool } from \"@prestyj/ai\";\nimport { z } from \"zod\";\nimport type {\n JsonObject,\n RealtimeFunctionToolDefinition,\n ToolConfirmationDecision,\n VoiceTool,\n VoiceToolCall,\n VoiceToolContext,\n VoiceToolExecutionError,\n VoiceToolExecutionResult,\n VoiceToolResult,\n} from \"./types.js\";\n\ntype ZodParseResult = { success: true; data: unknown } | { success: false; error: z.ZodError };\n\nexport type VoiceToolSource = VoiceTool | AgentTool | Tool;\n\nexport interface ExecuteVoiceToolCallOptions {\n readonly tools: readonly VoiceTool[];\n readonly call: VoiceToolCall;\n readonly signal?: AbortSignal;\n readonly confirmation?: VoiceToolContext[\"confirmation\"];\n readonly onUpdate?: VoiceToolContext[\"onUpdate\"];\n}\n\nexport function ggAiToolToRealtimeFunctionTool(tool: Tool): RealtimeFunctionToolDefinition {\n return {\n type: \"function\",\n name: tool.name,\n description: tool.description,\n parameters: tool.rawInputSchema ?? zodToJsonSchemaObject(tool.parameters),\n };\n}\n\nexport function voiceToolToRealtimeFunctionTool(tool: VoiceTool): RealtimeFunctionToolDefinition {\n return {\n type: \"function\",\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n };\n}\n\nexport function ggAiToolToVoiceTool(tool: Tool): VoiceTool {\n return {\n name: tool.name,\n description: tool.description,\n parameters: tool.rawInputSchema ?? zodToJsonSchemaObject(tool.parameters),\n };\n}\n\nexport function agentToolToVoiceTool<T extends z.ZodType>(tool: AgentTool<T>): VoiceTool {\n return {\n name: tool.name,\n description: tool.description,\n parameters: tool.rawInputSchema ?? zodToJsonSchemaObject(tool.parameters),\n async execute(args, context): Promise<VoiceToolExecutionResult> {\n const parsed = tool.parameters.safeParse(args) as ZodParseResult;\n if (!parsed.success) {\n return {\n error: \"Invalid tool arguments\",\n issues: parsed.error.issues,\n };\n }\n\n const agentContext: ToolContext = {\n signal: context.signal,\n toolCallId: context.toolCallId,\n onUpdate: context.onUpdate,\n };\n const result = await tool.execute(parsed.data as z.infer<T>, agentContext);\n return normalizeAgentToolResult(result);\n },\n };\n}\n\nexport async function executeVoiceToolCall(\n options: ExecuteVoiceToolCallOptions,\n): Promise<VoiceToolResult> {\n const tool = options.tools.find((candidate) => candidate.name === options.call.name);\n if (!tool) {\n return createErrorResult(options.call, {\n type: \"tool_not_found\",\n message: `Tool not found: ${options.call.name}`,\n });\n }\n\n const confirmation = await resolveConfirmation(tool, options.call, options.confirmation);\n if (!confirmation.approved) {\n return createErrorResult(options.call, {\n type: \"tool_confirmation_denied\",\n message: confirmation.reason,\n });\n }\n\n if (!tool.execute) {\n return createErrorResult(options.call, {\n type: \"tool_execution_failed\",\n message: `Tool has no executor: ${tool.name}`,\n });\n }\n\n try {\n const abortController = new AbortController();\n const signal = options.signal ?? abortController.signal;\n const content = await tool.execute(options.call.args, {\n signal,\n toolCallId: options.call.id,\n confirmation: options.confirmation,\n onUpdate: options.onUpdate,\n });\n return {\n toolCallId: options.call.id,\n name: options.call.name,\n content,\n };\n } catch (error) {\n return createErrorResult(options.call, {\n type: \"tool_execution_failed\",\n message: error instanceof Error ? error.message : \"Tool execution failed\",\n cause: error,\n });\n }\n}\n\nfunction zodToJsonSchemaObject(schema: z.ZodType): JsonObject {\n const jsonSchema = z.toJSONSchema(schema) as JsonObject;\n const { $schema: _schema, ...rest } = jsonSchema;\n return rest;\n}\n\nfunction normalizeAgentToolResult(result: ToolExecuteResult): VoiceToolExecutionResult {\n if (typeof result === \"string\") {\n return result;\n }\n if (typeof result.content === \"string\") {\n if (result.details === undefined) {\n return result.content;\n }\n return { content: result.content, details: result.details };\n }\n return { content: result.content, details: result.details };\n}\n\nasync function resolveConfirmation(\n tool: VoiceTool,\n call: VoiceToolCall,\n confirmation: VoiceToolContext[\"confirmation\"],\n): Promise<ToolConfirmationDecision> {\n const policy = tool.confirmation ?? \"never\";\n if (policy === \"never\") {\n return { approved: true };\n }\n if (policy === \"destructive\" && !tool.destructive) {\n return { approved: true };\n }\n if (typeof policy === \"function\") {\n return policy({ call, tool });\n }\n if (!confirmation) {\n return {\n approved: false,\n reason: `Tool requires confirmation: ${tool.name}`,\n };\n }\n return confirmation({ call, tool });\n}\n\nfunction createErrorResult(call: VoiceToolCall, error: VoiceToolExecutionError): VoiceToolResult {\n const content: JsonObject = {\n error: error.message,\n type: error.type,\n };\n return {\n toolCallId: call.id,\n name: call.name,\n content,\n isError: true,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AC6BO,SAAS,mBAAmB,SAAsD;AACvF,SAAO,IAAI,uBAAuB,OAAO;AAC3C;AAEO,SAAS,4BAA4B,OAAuB;AACjE,MAAI,iBAAiB,OAAO;AAC1B,WAAO;AAAA,EACT;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,IAAI,MAAM,KAAK;AAAA,EACxB;AACA,SAAO,IAAI,MAAM,wBAAwB,EAAE,OAAO,MAAM,CAAC;AAC3D;AAEA,IAAM,yBAAN,MAAqD;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACT,SAA+B;AAAA,EAC/B,YAAY,oBAAI,IAAuB;AAAA,EACvC;AAAA,EACA;AAAA,EAEA,YAAY,SAAwC;AAClD,SAAK,KAAK,QAAQ;AAClB,SAAK,WAAW,QAAQ;AACxB,SAAK,WAAW,QAAQ,YAAY,EAAE,WAAW,QAAQ,IAAI,UAAU,QAAQ,SAAS;AACxF,SAAK,WAAW;AAChB,SAAK,wBAAwB,QAAQ,WAAW,QAAQ,CAAC,UAAU;AACjE,WAAK,sBAAsB,KAAK;AAAA,IAClC,CAAC;AAAA,EACH;AAAA,EAEA,IAAI,QAA8B;AAChC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,QAAQ,SAAwC;AAC9C,SAAK,UAAU,IAAI,OAAO;AAC1B,WAAO,MAAM;AACX,WAAK,UAAU,OAAO,OAAO;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,OAAwB,QAAqC;AAC3E,UAAM,KAAK,SAAS,cAAc,OAAO,MAAM;AAC/C,UAAM,KAAK,SAAS,WAAW,KAAK,EAAE,MAAM,SAAS,MAAM,GAAG,MAAM;AAAA,EACtE;AAAA,EAEA,MAAM,SAAS,MAAc,QAAqC;AAChE,UAAM,KAAK,SAAS,aAAa,MAAM,MAAM;AAC7C,UAAM,KAAK,SAAS,WAAW,KAAK,EAAE,MAAM,QAAQ,KAAK,GAAG,MAAM;AAAA,EACpE;AAAA,EAEA,MAAM,eAAe,QAAyB,QAAqC;AACjF,UAAM,KAAK,SAAS,mBAAmB,QAAQ,MAAM;AACrD,UAAM,KAAK,SAAS,WAAW,KAAK,EAAE,MAAM,eAAe,OAAO,GAAG,MAAM;AAC3E,SAAK,MAAM,EAAE,MAAM,oBAAoB,OAAO,CAAC;AAAA,EACjD;AAAA,EAEA,MAAM,aAAa,QAAqC,QAAqC;AAC3F,UAAM,KAAK,SAAS,iBAAiB,QAAQ,MAAM;AACnD,UAAM,KAAK,SAAS,WAAW,KAAK,EAAE,MAAM,UAAU,OAAO,GAAG,MAAM;AAAA,EACxE;AAAA,EAEA,MAAM,MAAM,QAAgC;AAC1C,QAAI,KAAK,WAAW,YAAY,KAAK,WAAW,WAAW;AACzD;AAAA,IACF;AACA,SAAK,SAAS;AACd,UAAM,KAAK,SAAS,UAAU,MAAM;AACpC,UAAM,KAAK,SAAS,WAAW,MAAM,MAAM;AAC3C,SAAK,wBAAwB;AAC7B,SAAK,SAAS;AACd,SAAK,MAAM,EAAE,MAAM,UAAU,OAAO,CAAC;AAAA,EACvC;AAAA,EAEA,sBAAsB,OAAkC;AACtD,QAAI,MAAM,SAAS,OAAO;AACxB;AAAA,IACF;AACA,QAAI,MAAM,SAAS,UAAU;AAC3B,WAAK,SAAS;AAAA,IAChB;AACA,SAAK,MAAM,KAAK;AAAA,EAClB;AAAA,EAEA,MAAM,OAAyB;AAC7B,UAAM,WAAW,CAAC,GAAG,KAAK,SAAS;AACnC,eAAW,WAAW,UAAU;AAC9B,cAAQ,KAAK;AAAA,IACf;AAAA,EACF;AACF;;;ACxHA,iBAAkB;AAkCX,SAAS,gCAAgC,MAAiD;AAC/F,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,KAAK;AAAA,IACX,aAAa,KAAK;AAAA,IAClB,YAAY,KAAK;AAAA,EACnB;AACF;;;AFQO,SAAS,6BACd,UAAyC,CAAC,GAC3B;AACf,SAAO;AAAA,IACL,MAAM,QAAQ,gBAAgB;AAAA,IAC9B,MAAM,QAAQ,gBAAoE;AAChF,UAAI,CAAC,eAAe,WAAW;AAC7B,cAAM,IAAI,MAAM,8DAA8D;AAAA,MAChF;AACA,YAAM,gBAAgB,sBAAsB,eAAe,OAAO;AAClE,YAAM,eAAe,UAAU,QAAQ,cAAc;AACrD,aAAO,mBAAmB;AAAA,QACxB,IAAI,gBAAgB,eAAe,OAAO;AAAA,QAC1C,UAAU,QAAQ,gBAAgB;AAAA,QAClC,WAAW,2BAA2B,eAAe,SAAS;AAAA,QAC9D,UAAU,eAAe,eAAe,OAAO;AAAA,QAC/C,kBAAkB,OAAO,QAAQ,WAAW;AAC1C,gBAAM,eAAe,WAAW;AAAA,YAC9B,EAAE,MAAM,eAAe,QAAQ,mBAAmB,MAAM,EAAE;AAAA,YAC1D;AAAA,UACF;AAAA,QACF;AAAA,QACA,gBAAgB,OAAO,QAAQ,WAAW;AACxC,gBAAM,eAAe,WAAW;AAAA,YAC9B;AAAA,cACE,MAAM;AAAA,cACN,QAAQ,EAAE,GAAG,QAAQ,SAAS,cAAc;AAAA,YAC9C;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEO,SAAS,sBAAsB,QAAyD;AAC7F,QAAM,QAAoB,CAAC;AAC3B,MAAI,OAAO,OAAO;AAChB,UAAM,SAAS,EAAE,OAAO,OAAO,MAAM;AAAA,EACvC;AACA,MAAI,OAAO,kBAAkB;AAC3B,UAAM,QAAQ,EAAE,QAAQ,OAAO,iBAAiB;AAAA,EAClD;AACA,MAAI,OAAO,mBAAmB;AAC5B,UAAM,SAAS;AAAA,MACb,GAAI,MAAM;AAAA,MACV,QAAQ,OAAO;AAAA,IACjB;AAAA,EACF;AACA,MAAI,OAAO,kBAAkB,QAAW;AACtC,UAAM,QAAQ;AAAA,MACZ,GAAI,MAAM;AAAA,MACV,gBAAgB,OAAO;AAAA,IACzB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO,OAAO;AAAA,IACd,GAAI,OAAO,eAAe,EAAE,cAAc,OAAO,aAAa,IAAI,CAAC;AAAA,IACnE,GAAI,OAAO,KAAK,KAAK,EAAE,SAAS,IAAI,EAAE,MAAM,IAAI,CAAC;AAAA,IACjD,GAAI,OAAO,SAAS,OAAO,MAAM,SAAS,IACtC,EAAE,OAAO,OAAO,MAAM,IAAI,CAAC,SAAS,gCAAgC,IAAI,CAAC,EAAE,IAC3E,CAAC;AAAA,IACL,GAAI,OAAO,WAAW,EAAE,UAAU,OAAO,SAAS,IAAI,CAAC;AAAA,EACzD;AACF;AAEO,SAAS,6BAA6B,OAAmC;AAC9E,MAAI,CAAC,aAAa,KAAK,GAAG;AACxB,WAAO;AAAA,EACT;AACA,QAAM,OAAO,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO;AAC3D,UAAQ,MAAM;AAAA,IACZ,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,yBAAyB,MAAM,OAAO;AAAA,MACjD;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,OAAO,YAAY,MAAM,KAAK;AAAA,QAC9B,QAAQ,kBAAkB,MAAM,OAAO;AAAA,MACzC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM,YAAY,MAAM,UAAU;AAAA,QAClC,QAAQ,kBAAkB,MAAM,OAAO;AAAA,MACzC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,OAAO,YAAY,MAAM,KAAK;AAAA,QAC9B,QAAQ,kBAAkB,MAAM,OAAO;AAAA,MACzC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM,YAAY,MAAM,UAAU;AAAA,QAClC,QAAQ,kBAAkB,MAAM,OAAO;AAAA,MACzC;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,OAAO,YAAY,MAAM,KAAK;AAAA,QAC9B,QAAQ,kBAAkB,MAAM,OAAO;AAAA,MACzC;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM,YAAY,MAAM,IAAI;AAAA,QAC5B,QAAQ,kBAAkB,MAAM,OAAO;AAAA,MACzC;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,OAAO,EAAE,MAAM,YAAY,MAAM,KAAK,GAAG,QAAQ,SAAS;AAAA,QAC1D,QAAQ,kBAAkB,MAAM,OAAO;AAAA,MACzC;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AACH,aAAO,EAAE,MAAM,qBAAqB,QAAQ,kBAAkB,MAAM,OAAO,EAAE;AAAA,IAC/E,KAAK;AACH,aAAO,EAAE,MAAM,aAAa,MAAM,kBAAkB,KAAK,EAAE;AAAA,IAC7D,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,OAAO,4BAA4B,MAAM,SAAS,KAAK;AAAA,QACvD,aAAa;AAAA,MACf;AAAA,IACF;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,2BAA2B,WAA2C;AAC7E,SAAO;AAAA,IACL,MAAM,UAAU;AAAA,IAChB,SAAS,UAAU,QAAQ,KAAK,SAAS;AAAA,IACzC,MAAM,UAAU,KAAK,KAAK,SAAS;AAAA,IACnC,OAAO,UAAU,MAAM,KAAK,SAAS;AAAA,IACrC,QAAQ,SAAS;AACf,aAAO,UAAU,QAAQ,CAAC,UAAU;AAClC,gBAAQ,wBAAwB,KAAK,CAAC;AAAA,MACxC,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,SAAS,wBAAwB,OAAiD;AAChF,MAAI,MAAM,SAAS,OAAO;AACxB,WAAO;AAAA,EACT;AACA,QAAM,aAAa,6BAA6B,MAAM,IAAI;AAC1D,SAAO,cAAc;AACvB;AAEA,SAAS,kBAAkB,OAAkC;AAC3D,QAAM,OAAO,gBAAgB,MAAM,SAAS;AAC5C,SAAO;AAAA,IACL,IAAI,YAAY,MAAM,WAAW,MAAM,WAAW,MAAM,QAAQ;AAAA,IAChE,MAAM,YAAY,MAAM,IAAI;AAAA,IAC5B;AAAA,IACA,gBAAgB,kBAAkB,MAAM,OAAO;AAAA,IAC/C,KAAK;AAAA,EACP;AACF;AAEA,SAAS,mBAAmB,QAA0C;AACpE,SAAO;AACT;AAEA,SAAS,eAAe,QAAkD;AACxE,SAAO;AAAA,IACL,UAAU;AAAA,IACV,OAAO,OAAO;AAAA,IACd,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC;AACF;AAEA,SAAS,gBAAgB,QAAoC;AAC3D,QAAM,QAAQ,OAAO,MAAM,QAAQ,mBAAmB,GAAG;AACzD,SAAO,UAAU,KAAK,IAAI,KAAK,IAAI,CAAC;AACtC;AAEA,SAAS,yBAAyB,OAAsC;AACtE,MAAI,CAAC,aAAa,KAAK,GAAG;AACxB,WAAO,EAAE,UAAU,kBAAkB;AAAA,EACvC;AACA,SAAO;AAAA,IACL,WAAW,kBAAkB,MAAM,EAAE;AAAA,IACrC,UAAU;AAAA,IACV,OAAO,kBAAkB,MAAM,KAAK;AAAA,EACtC;AACF;AAEA,SAAS,gBAAgB,OAA4B;AACnD,MAAI,aAAa,KAAK,GAAG;AACvB,WAAO;AAAA,EACT;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,CAAC;AAAA,EACV;AACA,MAAI;AACF,UAAM,SAAkB,KAAK,MAAM,KAAK;AACxC,WAAO,aAAa,MAAM,IAAI,SAAS,CAAC;AAAA,EAC1C,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,SAAS,YAAY,OAAwB;AAC3C,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAEA,SAAS,kBAAkB,OAAoC;AAC7D,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAEA,SAAS,aAAa,OAAqC;AACzD,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;","names":[]}
@@ -0,0 +1,34 @@
1
+ import { J as JsonObject, R as RealtimeFunctionToolDefinition, h as VoiceProvider, i as VoiceEvent, c as VoiceSessionConfig } from '../types-Dc4Q3Z6X.cjs';
2
+
3
+ interface OpenAIRealtimeProviderOptions {
4
+ readonly baseUrl?: string;
5
+ readonly providerName?: string;
6
+ }
7
+ interface OpenAIRealtimeSessionConfig {
8
+ readonly type: "realtime";
9
+ readonly model: string;
10
+ readonly instructions?: string;
11
+ readonly audio?: JsonObject;
12
+ readonly tools?: readonly RealtimeFunctionToolDefinition[];
13
+ readonly metadata?: Readonly<Record<string, string>>;
14
+ }
15
+ interface OpenAIClientSecretRequest {
16
+ readonly session: OpenAIRealtimeSessionConfig;
17
+ }
18
+ interface OpenAIRealtimeCallRequest {
19
+ readonly sdp: string;
20
+ readonly session: OpenAIRealtimeSessionConfig;
21
+ }
22
+ interface OpenAIRealtimeHttpClient {
23
+ createClientSecret(request: OpenAIClientSecretRequest, options: {
24
+ readonly signal?: AbortSignal;
25
+ }): Promise<JsonObject>;
26
+ createCall(request: OpenAIRealtimeCallRequest, options: {
27
+ readonly signal?: AbortSignal;
28
+ }): Promise<string>;
29
+ }
30
+ declare function createOpenAIRealtimeProvider(options?: OpenAIRealtimeProviderOptions): VoiceProvider;
31
+ declare function toOpenAISessionConfig(config: VoiceSessionConfig): OpenAIRealtimeSessionConfig;
32
+ declare function normalizeOpenAIRealtimeEvent(event: unknown): VoiceEvent | null;
33
+
34
+ export { type OpenAIClientSecretRequest, type OpenAIRealtimeCallRequest, type OpenAIRealtimeHttpClient, type OpenAIRealtimeProviderOptions, type OpenAIRealtimeSessionConfig, createOpenAIRealtimeProvider, normalizeOpenAIRealtimeEvent, toOpenAISessionConfig };
@@ -0,0 +1,34 @@
1
+ import { J as JsonObject, R as RealtimeFunctionToolDefinition, h as VoiceProvider, i as VoiceEvent, c as VoiceSessionConfig } from '../types-Dc4Q3Z6X.js';
2
+
3
+ interface OpenAIRealtimeProviderOptions {
4
+ readonly baseUrl?: string;
5
+ readonly providerName?: string;
6
+ }
7
+ interface OpenAIRealtimeSessionConfig {
8
+ readonly type: "realtime";
9
+ readonly model: string;
10
+ readonly instructions?: string;
11
+ readonly audio?: JsonObject;
12
+ readonly tools?: readonly RealtimeFunctionToolDefinition[];
13
+ readonly metadata?: Readonly<Record<string, string>>;
14
+ }
15
+ interface OpenAIClientSecretRequest {
16
+ readonly session: OpenAIRealtimeSessionConfig;
17
+ }
18
+ interface OpenAIRealtimeCallRequest {
19
+ readonly sdp: string;
20
+ readonly session: OpenAIRealtimeSessionConfig;
21
+ }
22
+ interface OpenAIRealtimeHttpClient {
23
+ createClientSecret(request: OpenAIClientSecretRequest, options: {
24
+ readonly signal?: AbortSignal;
25
+ }): Promise<JsonObject>;
26
+ createCall(request: OpenAIRealtimeCallRequest, options: {
27
+ readonly signal?: AbortSignal;
28
+ }): Promise<string>;
29
+ }
30
+ declare function createOpenAIRealtimeProvider(options?: OpenAIRealtimeProviderOptions): VoiceProvider;
31
+ declare function toOpenAISessionConfig(config: VoiceSessionConfig): OpenAIRealtimeSessionConfig;
32
+ declare function normalizeOpenAIRealtimeEvent(event: unknown): VoiceEvent | null;
33
+
34
+ export { type OpenAIClientSecretRequest, type OpenAIRealtimeCallRequest, type OpenAIRealtimeHttpClient, type OpenAIRealtimeProviderOptions, type OpenAIRealtimeSessionConfig, createOpenAIRealtimeProvider, normalizeOpenAIRealtimeEvent, toOpenAISessionConfig };
@@ -0,0 +1,12 @@
1
+ import {
2
+ createOpenAIRealtimeProvider,
3
+ normalizeOpenAIRealtimeEvent,
4
+ toOpenAISessionConfig
5
+ } from "../chunk-VJ6MPV2Z.js";
6
+ import "../chunk-YLNKQ7CC.js";
7
+ export {
8
+ createOpenAIRealtimeProvider,
9
+ normalizeOpenAIRealtimeEvent,
10
+ toOpenAISessionConfig
11
+ };
12
+ //# sourceMappingURL=openai-realtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}