{"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 \"@kenkaiiii/gg-agent\";\nimport type { Tool } from \"@kenkaiiii/gg-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":"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","names":[]}