{"version":3,"sources":["../../_internals/voice/src/voice/voice.ts","../../_internals/voice/src/voice/aisdk/speech.ts","../../_internals/voice/src/voice/aisdk/transcription.ts","../../_internals/voice/src/voice/composite-voice.ts","../../_internals/voice/src/voice/default-voice.ts"],"names":["MastraBase","generateSpeech","stream","PassThrough","transcribe","MastraError","ErrorDomain","ErrorCategory"],"mappings":"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","file":"chunk-HTJOJJRF.cjs","sourcesContent":["import { MastraBase } from '@internal/core/base';\nimport type { ToolsInput } from '@internal/core/types';\n\nexport type VoiceEventType = 'speaking' | 'writing' | 'error' | string;\n\nexport interface VoiceEventMap {\n  speaker: NodeJS.ReadableStream;\n  speaking: { audio?: string };\n  writing: { text: string; role: 'assistant' | 'user' };\n  error: { message: string; code?: string; details?: unknown };\n  [key: string]: unknown;\n}\n\ninterface BuiltInModelConfig {\n  name: string;\n  apiKey?: string;\n}\n\nexport interface VoiceConfig<T = unknown> {\n  listeningModel?: BuiltInModelConfig;\n  speechModel?: BuiltInModelConfig;\n  speaker?: string;\n  name?: string;\n  realtimeConfig?: {\n    model?: string;\n    apiKey?: string;\n    options?: T;\n  };\n}\n\nexport interface VoiceSpanConfig {\n  component: 'VOICE';\n  name?: string;\n  speaker?: string;\n  listeningModel?: { name: string };\n  speechModel?: { name: string };\n  realtimeModel?: string;\n}\n\nexport interface IMastraVoice<\n  TSpeakOptions = unknown,\n  TListenOptions = unknown,\n  TTools extends ToolsInput = ToolsInput,\n  TEventArgs extends VoiceEventMap = VoiceEventMap,\n  TSpeakerMetadata = unknown,\n> {\n  serializeForSpan(): VoiceSpanConfig;\n  speak(\n    input: string | NodeJS.ReadableStream,\n    options?: {\n      speaker?: string;\n    } & TSpeakOptions,\n  ): Promise<NodeJS.ReadableStream | void>;\n  listen(\n    audioStream: NodeJS.ReadableStream | unknown,\n    options?: TListenOptions,\n  ): Promise<string | NodeJS.ReadableStream | void>;\n  updateConfig(options: Record<string, unknown>): void;\n  connect(options?: Record<string, unknown>): Promise<void>;\n  send(audioData: NodeJS.ReadableStream | Int16Array): Promise<void>;\n  answer(options?: Record<string, unknown>): Promise<void>;\n  addInstructions(instructions?: string): void;\n  addTools(tools: TTools): void;\n  close(): void;\n  on<E extends VoiceEventType>(\n    event: E,\n    callback: (data: E extends keyof TEventArgs ? TEventArgs[E] : unknown) => void,\n  ): void;\n  off<E extends VoiceEventType>(\n    event: E,\n    callback: (data: E extends keyof TEventArgs ? TEventArgs[E] : unknown) => void,\n  ): void;\n  getSpeakers(): Promise<\n    Array<\n      {\n        voiceId: string;\n      } & TSpeakerMetadata\n    >\n  >;\n  getListener(): Promise<{ enabled: boolean }>;\n}\n\nexport abstract class MastraVoice<\n  TOptions = unknown,\n  TSpeakOptions = unknown,\n  TListenOptions = unknown,\n  TTools extends ToolsInput = ToolsInput,\n  TEventArgs extends VoiceEventMap = VoiceEventMap,\n  TSpeakerMetadata = unknown,\n>\n  extends MastraBase\n  implements IMastraVoice<TSpeakOptions, TListenOptions, TTools, TEventArgs, TSpeakerMetadata>\n{\n  protected listeningModel?: BuiltInModelConfig;\n  protected speechModel?: BuiltInModelConfig;\n  protected speaker?: string;\n  protected realtimeConfig?: {\n    model?: string;\n    apiKey?: string;\n    options?: TOptions;\n  };\n\n  constructor({ listeningModel, speechModel, speaker, realtimeConfig, name }: VoiceConfig<TOptions> = {}) {\n    super({\n      component: 'VOICE',\n      name,\n    });\n    this.listeningModel = listeningModel;\n    this.speechModel = speechModel;\n    this.speaker = speaker;\n    this.realtimeConfig = realtimeConfig;\n  }\n\n  /**\n   * Custom serialization for tracing/observability spans.\n   * Excludes `apiKey` from listeningModel / speechModel / realtimeConfig\n   * and any provider-specific state held by subclasses. Subclasses that\n   * need to expose additional non-sensitive fields can override.\n   */\n  serializeForSpan(): VoiceSpanConfig {\n    return {\n      component: 'VOICE',\n      name: this.name,\n      speaker: this.speaker,\n      listeningModel: this.listeningModel ? { name: this.listeningModel.name } : undefined,\n      speechModel: this.speechModel ? { name: this.speechModel.name } : undefined,\n      realtimeModel: this.realtimeConfig?.model,\n    };\n  }\n\n  /**\n   * Convert text to speech\n   * @param input Text or text stream to convert to speech\n   * @param options Speech options including speaker and provider-specific options\n   * @returns Audio stream\n   */\n  /**\n   * Convert text to speech\n   * @param input Text or text stream to convert to speech\n   * @param options Speech options including speaker and provider-specific options\n   * @returns Audio stream or void if in chat mode\n   */\n  abstract speak(\n    input: string | NodeJS.ReadableStream,\n    options?: {\n      speaker?: string;\n    } & TSpeakOptions,\n  ): Promise<NodeJS.ReadableStream | void>;\n\n  /**\n   * Convert speech to text\n   * @param audioStream Audio stream to transcribe\n   * @param options Provider-specific transcription options\n   * @returns Text or text stream\n   */\n  /**\n   * Convert speech to text\n   * @param audioStream Audio stream to transcribe\n   * @param options Provider-specific transcription options\n   * @returns Text, text stream, or void if in chat mode\n   */\n  abstract listen(\n    audioStream: NodeJS.ReadableStream | unknown, // Allow other audio input types for OpenAI realtime API\n    options?: TListenOptions,\n  ): Promise<string | NodeJS.ReadableStream | void>;\n\n  updateConfig(_options: Record<string, unknown>): void {\n    this.logger.debug('updateConfig not implemented by this voice provider');\n  }\n\n  /**\n   * Initializes a WebSocket or WebRTC connection for real-time communication\n   * @returns Promise that resolves when the connection is established\n   */\n  async connect(_options?: Record<string, unknown>): Promise<void> {\n    // Default implementation - voice providers can override if they support this feature\n    this.logger.debug('connect not implemented by this voice provider');\n  }\n\n  /**\n   * Relay audio data to the voice provider for real-time processing\n   * @param audioData Audio data to relay\n   */\n  async send(_audioData: NodeJS.ReadableStream | Int16Array): Promise<void> {\n    // Default implementation - voice providers can override if they support this feature\n    this.logger.debug('relay not implemented by this voice provider');\n  }\n\n  /**\n   * Trigger voice providers to respond\n   */\n  async answer(_options?: Record<string, unknown>): Promise<void> {\n    this.logger.debug('answer not implemented by this voice provider');\n  }\n\n  /**\n   * Equip the voice provider with instructions\n   * @param instructions Instructions to add\n   */\n  addInstructions(_instructions?: string): void {\n    // Default implementation - voice providers can override if they support this feature\n  }\n\n  /**\n   * Equip the voice provider with tools\n   * @param tools Array of tools to add\n   */\n  addTools(_tools: TTools): void {\n    // Default implementation - voice providers can override if they support this feature\n  }\n\n  /**\n   * Disconnect from the WebSocket or WebRTC connection\n   */\n  close(): void {\n    // Default implementation - voice providers can override if they support this feature\n    this.logger.debug('close not implemented by this voice provider');\n  }\n\n  /**\n   * Register an event listener\n   * @param event Event name (e.g., 'speaking', 'writing', 'error')\n   * @param callback Callback function that receives event data\n   */\n  on<E extends VoiceEventType>(\n    _event: E,\n    _callback: (data: E extends keyof TEventArgs ? TEventArgs[E] : unknown) => void,\n  ): void {\n    // Default implementation - voice providers can override if they support this feature\n    this.logger.debug('on not implemented by this voice provider');\n  }\n\n  /**\n   * Remove an event listener\n   * @param event Event name (e.g., 'speaking', 'writing', 'error')\n   * @param callback Callback function to remove\n   */\n  off<E extends VoiceEventType>(\n    _event: E,\n    _callback: (data: E extends keyof TEventArgs ? TEventArgs[E] : unknown) => void,\n  ): void {\n    // Default implementation - voice providers can override if they support this feature\n    this.logger.debug('off not implemented by this voice provider');\n  }\n\n  /**\n   * Get available speakers/voices\n   * @returns Array of available voice IDs and their metadata\n   */\n  getSpeakers(): Promise<\n    Array<\n      {\n        voiceId: string;\n      } & TSpeakerMetadata\n    >\n  > {\n    // Default implementation - voice providers can override if they support this feature\n    this.logger.debug('getSpeakers not implemented by this voice provider');\n    return Promise.resolve([]);\n  }\n\n  /**\n   * Get available speakers/voices\n   * @returns Array of available voice IDs and their metadata\n   */\n  getListener(): Promise<{ enabled: boolean }> {\n    // Default implementation - voice providers can override if they support this feature\n    this.logger.debug('getListener not implemented by this voice provider');\n    return Promise.resolve({ enabled: false });\n  }\n}\n","import { PassThrough } from 'node:stream';\nimport { experimental_generateSpeech } from '@internal/ai-sdk-v5';\nimport type { SpeechModel } from '@internal/ai-sdk-v5';\nimport { MastraVoice } from '../voice';\n\nexport class AISDKSpeech extends MastraVoice {\n  private model: SpeechModel;\n  private defaultVoice?: string;\n\n  constructor(model: SpeechModel, options?: { voice?: string }) {\n    super({ name: 'ai-sdk-speech' });\n    this.model = model;\n    this.defaultVoice = options?.voice;\n  }\n\n  async speak(\n    input: string | NodeJS.ReadableStream,\n    options?: {\n      speaker?: string;\n      language?: string;\n      providerOptions?: Record<string, any>;\n      abortSignal?: AbortSignal;\n      headers?: Record<string, string>;\n    },\n  ): Promise<NodeJS.ReadableStream> {\n    // Convert stream to text if needed\n    const text = typeof input === 'string' ? input : await this.streamToText(input);\n\n    const result = await experimental_generateSpeech({\n      model: this.model,\n      text,\n      voice: options?.speaker || this.defaultVoice, // Map speaker to AI SDK's voice parameter\n      language: options?.language,\n      providerOptions: options?.providerOptions,\n      abortSignal: options?.abortSignal,\n      headers: options?.headers,\n    });\n\n    // Convert Uint8Array to Node stream\n    const stream = new PassThrough();\n    stream.end(Buffer.from(result.audio.uint8Array));\n    return stream;\n  }\n\n  async listen(): Promise<string> {\n    throw new Error('AI SDK speech models do not support transcription. Use AISDKTranscription instead.');\n  }\n\n  async getSpeakers() {\n    // Return empty array - voice must be specified in speak() options\n    return [];\n  }\n\n  async getListener() {\n    return { enabled: false };\n  }\n\n  private async streamToText(stream: NodeJS.ReadableStream): Promise<string> {\n    const chunks: Buffer[] = [];\n    for await (const chunk of stream) {\n      chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n    }\n    return Buffer.concat(chunks).toString('utf-8');\n  }\n}\n","import { experimental_transcribe } from '@internal/ai-sdk-v5';\nimport type { TranscriptionModel } from '@internal/ai-sdk-v5';\nimport { MastraVoice } from '../voice';\n\nexport class AISDKTranscription extends MastraVoice {\n  private model: TranscriptionModel;\n\n  constructor(model: TranscriptionModel) {\n    super({ name: 'ai-sdk-transcription' });\n    this.model = model;\n  }\n\n  async speak(): Promise<NodeJS.ReadableStream> {\n    throw new Error('AI SDK transcription models do not support text-to-speech. Use AISDKSpeech instead.');\n  }\n\n  async getSpeakers() {\n    return [];\n  }\n\n  async getListener() {\n    return { enabled: true };\n  }\n\n  /**\n   * Transcribe audio to text\n   * For enhanced metadata (segments, language, duration), use AI SDK's transcribe() directly\n   */\n  async listen(\n    audioStream: NodeJS.ReadableStream,\n    options?: {\n      providerOptions?: Record<string, any>;\n      abortSignal?: AbortSignal;\n      headers?: Record<string, string>;\n    },\n  ): Promise<string> {\n    const audioBuffer = await this.convertToBuffer(audioStream);\n\n    const result = await experimental_transcribe({\n      model: this.model,\n      audio: audioBuffer,\n      providerOptions: options?.providerOptions,\n      abortSignal: options?.abortSignal,\n      headers: options?.headers,\n    });\n\n    return result.text;\n  }\n\n  private async convertToBuffer(audio: NodeJS.ReadableStream | Buffer | Uint8Array | string): Promise<Buffer> {\n    if (Buffer.isBuffer(audio)) return audio;\n    if (audio instanceof Uint8Array) return Buffer.from(audio);\n    if (typeof audio === 'string') return Buffer.from(audio, 'base64');\n\n    const chunks: Buffer[] = [];\n    for await (const chunk of audio) {\n      chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n    }\n    return Buffer.concat(chunks);\n  }\n}\n","import type { TranscriptionModel, SpeechModel } from '@internal/ai-sdk-v5';\n\nimport { MastraError, ErrorDomain, ErrorCategory } from '@internal/core/error';\nimport type { ToolsInput } from '@internal/core/types';\n\nimport { AISDKSpeech } from './aisdk/speech';\nimport { AISDKTranscription } from './aisdk/transcription';\nimport { MastraVoice } from './voice';\nimport type { VoiceEventType, VoiceEventMap } from '.';\n\nconst supportedSpecificationVersions = ['v2', 'v3'];\n\n// Helper to check if something is an AI SDK model\nfunction isTranscriptionModel(obj: any): obj is TranscriptionModel {\n  return (\n    obj && typeof obj === 'object' && obj.modelId && supportedSpecificationVersions.includes(obj.specificationVersion)\n  );\n}\n\nfunction isSpeechModel(obj: any): obj is SpeechModel {\n  return (\n    obj && typeof obj === 'object' && obj.modelId && supportedSpecificationVersions.includes(obj.specificationVersion)\n  );\n}\n\nexport class CompositeVoice extends MastraVoice<unknown, unknown, unknown, ToolsInput, VoiceEventMap> {\n  protected speakProvider?: MastraVoice;\n  protected listenProvider?: MastraVoice;\n  protected realtimeProvider?: MastraVoice;\n\n  constructor({\n    input,\n    output,\n    realtime,\n  }: {\n    input?: MastraVoice | TranscriptionModel;\n    output?: MastraVoice | SpeechModel;\n    realtime?: MastraVoice;\n  }) {\n    super();\n\n    // Auto-wrap AI SDK models\n    if (input) {\n      this.listenProvider = isTranscriptionModel(input) ? new AISDKTranscription(input) : input;\n    }\n\n    if (output) {\n      this.speakProvider = isSpeechModel(output) ? new AISDKSpeech(output) : output;\n    }\n\n    this.realtimeProvider = realtime;\n  }\n\n  /**\n   * Convert text to speech using the configured provider\n   * @param input Text or text stream to convert to speech\n   * @param options Speech options including speaker and provider-specific options\n   * @returns Audio stream or void if in realtime mode\n   */\n  async speak(\n    input: string | NodeJS.ReadableStream,\n    options?: { speaker?: string } & any,\n  ): Promise<NodeJS.ReadableStream | void> {\n    if (this.realtimeProvider) {\n      return this.realtimeProvider.speak(input, options);\n    } else if (this.speakProvider) {\n      return this.speakProvider.speak(input, options);\n    }\n\n    throw new MastraError({\n      id: 'VOICE_COMPOSITE_NO_SPEAK_PROVIDER',\n      text: 'No speak provider or realtime provider configured',\n      domain: ErrorDomain.MASTRA_VOICE,\n      category: ErrorCategory.USER,\n    });\n  }\n\n  async listen(audioStream: NodeJS.ReadableStream, options?: any) {\n    if (this.realtimeProvider) {\n      return await this.realtimeProvider.listen(audioStream, options);\n    } else if (this.listenProvider) {\n      return await this.listenProvider.listen(audioStream, options);\n    }\n\n    throw new MastraError({\n      id: 'VOICE_COMPOSITE_NO_LISTEN_PROVIDER',\n      text: 'No listen provider or realtime provider configured',\n      domain: ErrorDomain.MASTRA_VOICE,\n      category: ErrorCategory.USER,\n    });\n  }\n\n  async getSpeakers() {\n    if (this.realtimeProvider) {\n      return this.realtimeProvider.getSpeakers();\n    } else if (this.speakProvider) {\n      return this.speakProvider.getSpeakers();\n    }\n\n    throw new MastraError({\n      id: 'VOICE_COMPOSITE_NO_SPEAKERS_PROVIDER',\n      text: 'No speak provider or realtime provider configured',\n      domain: ErrorDomain.MASTRA_VOICE,\n      category: ErrorCategory.USER,\n    });\n  }\n\n  async getListener() {\n    if (this.realtimeProvider) {\n      return this.realtimeProvider.getListener();\n    } else if (this.listenProvider) {\n      return this.listenProvider.getListener();\n    }\n\n    throw new MastraError({\n      id: 'VOICE_COMPOSITE_NO_LISTENER_PROVIDER',\n      text: 'No listener provider or realtime provider configured',\n      domain: ErrorDomain.MASTRA_VOICE,\n      category: ErrorCategory.USER,\n    });\n  }\n\n  updateConfig(options: Record<string, unknown>): void {\n    if (!this.realtimeProvider) {\n      return;\n    }\n    this.realtimeProvider.updateConfig(options);\n  }\n\n  /**\n   * Initializes a WebSocket or WebRTC connection for real-time communication\n   * @returns Promise that resolves when the connection is established\n   */\n  connect(options?: Record<string, unknown>): Promise<void> {\n    if (!this.realtimeProvider) {\n      throw new MastraError({\n        id: 'VOICE_COMPOSITE_NO_REALTIME_PROVIDER_CONNECT',\n        text: 'No realtime provider configured',\n        domain: ErrorDomain.MASTRA_VOICE,\n        category: ErrorCategory.USER,\n      });\n    }\n    return this.realtimeProvider.connect(options);\n  }\n\n  /**\n   * Relay audio data to the voice provider for real-time processing\n   * @param audioData Audio data to send\n   */\n  send(audioData: NodeJS.ReadableStream | Int16Array): Promise<void> {\n    if (!this.realtimeProvider) {\n      throw new MastraError({\n        id: 'VOICE_COMPOSITE_NO_REALTIME_PROVIDER_SEND',\n        text: 'No realtime provider configured',\n        domain: ErrorDomain.MASTRA_VOICE,\n        category: ErrorCategory.USER,\n      });\n    }\n    return this.realtimeProvider.send(audioData);\n  }\n\n  /**\n   * Trigger voice providers to respond\n   */\n  answer(options?: Record<string, unknown>): Promise<void> {\n    if (!this.realtimeProvider) {\n      throw new MastraError({\n        id: 'VOICE_COMPOSITE_NO_REALTIME_PROVIDER_ANSWER',\n        text: 'No realtime provider configured',\n        domain: ErrorDomain.MASTRA_VOICE,\n        category: ErrorCategory.USER,\n      });\n    }\n    return this.realtimeProvider.answer(options);\n  }\n\n  /**\n   * Equip the voice provider with instructions\n   * @param instructions Instructions to add\n   */\n  addInstructions(instructions: string): void {\n    if (!this.realtimeProvider) {\n      return;\n    }\n    this.realtimeProvider.addInstructions(instructions);\n  }\n\n  /**\n   * Equip the voice provider with tools\n   * @param tools Array of tools to add\n   */\n  addTools(tools: ToolsInput): void {\n    if (!this.realtimeProvider) {\n      return;\n    }\n    this.realtimeProvider.addTools(tools);\n  }\n\n  /**\n   * Disconnect from the WebSocket or WebRTC connection\n   */\n  close(): void {\n    if (!this.realtimeProvider) {\n      throw new MastraError({\n        id: 'VOICE_COMPOSITE_NO_REALTIME_PROVIDER_CLOSE',\n        text: 'No realtime provider configured',\n        domain: ErrorDomain.MASTRA_VOICE,\n        category: ErrorCategory.USER,\n      });\n    }\n    this.realtimeProvider.close();\n  }\n\n  /**\n   * Register an event listener\n   * @param event Event name (e.g., 'speaking', 'writing', 'error')\n   * @param callback Callback function that receives event data\n   */\n  on<E extends VoiceEventType>(\n    event: E,\n    callback: (data: E extends keyof VoiceEventMap ? VoiceEventMap[E] : unknown) => void,\n  ): void {\n    if (!this.realtimeProvider) {\n      throw new MastraError({\n        id: 'VOICE_COMPOSITE_NO_REALTIME_PROVIDER_ON',\n        text: 'No realtime provider configured',\n        domain: ErrorDomain.MASTRA_VOICE,\n        category: ErrorCategory.USER,\n      });\n    }\n    this.realtimeProvider.on(event, callback);\n  }\n\n  /**\n   * Remove an event listener\n   * @param event Event name (e.g., 'speaking', 'writing', 'error')\n   * @param callback Callback function to remove\n   */\n  off<E extends VoiceEventType>(\n    event: E,\n    callback: (data: E extends keyof VoiceEventMap ? VoiceEventMap[E] : unknown) => void,\n  ): void {\n    if (!this.realtimeProvider) {\n      throw new MastraError({\n        id: 'VOICE_COMPOSITE_NO_REALTIME_PROVIDER_OFF',\n        text: 'No realtime provider configured',\n        domain: ErrorDomain.MASTRA_VOICE,\n        category: ErrorCategory.USER,\n      });\n    }\n    this.realtimeProvider.off(event, callback);\n  }\n}\n","import { MastraError, ErrorDomain, ErrorCategory } from '@internal/core/error';\nimport { MastraVoice } from '.';\n\nexport class DefaultVoice extends MastraVoice {\n  constructor() {\n    super();\n  }\n\n  async speak(_input: string | NodeJS.ReadableStream): Promise<NodeJS.ReadableStream> {\n    throw new MastraError({\n      id: 'VOICE_DEFAULT_NO_SPEAK_PROVIDER',\n      text: 'No voice provider configured',\n      domain: ErrorDomain.MASTRA_VOICE,\n      category: ErrorCategory.USER,\n    });\n  }\n\n  async listen(_input: string | NodeJS.ReadableStream): Promise<string> {\n    throw new MastraError({\n      id: 'VOICE_DEFAULT_NO_LISTEN_PROVIDER',\n      text: 'No voice provider configured',\n      domain: ErrorDomain.MASTRA_VOICE,\n      category: ErrorCategory.USER,\n    });\n  }\n\n  async getSpeakers(): Promise<{ voiceId: string }[]> {\n    throw new MastraError({\n      id: 'VOICE_DEFAULT_NO_SPEAKERS_PROVIDER',\n      text: 'No voice provider configured',\n      domain: ErrorDomain.MASTRA_VOICE,\n      category: ErrorCategory.USER,\n    });\n  }\n\n  async getListener(): Promise<{ enabled: boolean }> {\n    throw new MastraError({\n      id: 'VOICE_DEFAULT_NO_LISTENER_PROVIDER',\n      text: 'No voice provider configured',\n      domain: ErrorDomain.MASTRA_VOICE,\n      category: ErrorCategory.USER,\n    });\n  }\n}\n"]}