{"version":3,"sources":["../../../packages/_internal-core/src/logger/index.ts","../../../packages/_internal-core/src/base/MastraBase.ts","../../../packages/_internals/voice/src/voice/voice.ts","../src/utils.ts","../src/index.ts"],"names":["Readable","schema","standardSchemaToJSONSchema","toStandardSchema","EventEmitter","buffer","WebSocket","ev","PassThrough"],"mappings":"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","file":"index.cjs","sourcesContent":["import { Transform } from 'node:stream';\n\nexport const RegisteredLogger = {\n  AGENT: 'AGENT',\n  OBSERVABILITY: 'OBSERVABILITY',\n  AUTH: 'AUTH',\n  BROWSER: 'BROWSER',\n  NETWORK: 'NETWORK',\n  WORKFLOW: 'WORKFLOW',\n  LLM: 'LLM',\n  TTS: 'TTS',\n  VOICE: 'VOICE',\n  VECTOR: 'VECTOR',\n  BUNDLER: 'BUNDLER',\n  DEPLOYER: 'DEPLOYER',\n  MEMORY: 'MEMORY',\n  STORAGE: 'STORAGE',\n  EMBEDDINGS: 'EMBEDDINGS',\n  MCP_SERVER: 'MCP_SERVER',\n  SERVER_CACHE: 'SERVER_CACHE',\n  SERVER: 'SERVER',\n  WORKSPACE: 'WORKSPACE',\n  CHANNEL: 'CHANNEL',\n} as const;\n\nexport type RegisteredLogger = (typeof RegisteredLogger)[keyof typeof RegisteredLogger];\n\nexport const LogLevel = {\n  DEBUG: 'debug',\n  INFO: 'info',\n  WARN: 'warn',\n  ERROR: 'error',\n  NONE: 'silent',\n} as const;\n\nexport type LogLevel = (typeof LogLevel)[keyof typeof LogLevel];\n\nexport interface BaseLogMessage {\n  runId?: string;\n  msg: string;\n  level: LogLevel;\n  time: Date;\n  pid: number;\n  hostname: string;\n  name: string;\n}\n\nexport abstract class LoggerTransport extends Transform {\n  constructor(opts: any = {}) {\n    super({ ...opts, objectMode: true });\n  }\n\n  async listLogsByRunId(_args: {\n    runId: string;\n    fromDate?: Date;\n    toDate?: Date;\n    logLevel?: LogLevel;\n    filters?: Record<string, any>;\n    page?: number;\n    perPage?: number;\n  }): Promise<{\n    logs: BaseLogMessage[];\n    total: number;\n    page: number;\n    perPage: number;\n    hasMore: boolean;\n  }> {\n    return { logs: [], total: 0, page: _args?.page ?? 1, perPage: _args?.perPage ?? 100, hasMore: false };\n  }\n\n  async listLogs(_args?: {\n    fromDate?: Date;\n    toDate?: Date;\n    logLevel?: LogLevel;\n    filters?: Record<string, any>;\n    returnPaginationResults?: boolean;\n    page?: number;\n    perPage?: number;\n  }): Promise<{\n    logs: BaseLogMessage[];\n    total: number;\n    page: number;\n    perPage: number;\n    hasMore: boolean;\n  }> {\n    return { logs: [], total: 0, page: _args?.page ?? 1, perPage: _args?.perPage ?? 100, hasMore: false };\n  }\n}\n\nexport const createCustomTransport = (\n  stream: Transform,\n  listLogs?: LoggerTransport['listLogs'],\n  listLogsByRunId?: LoggerTransport['listLogsByRunId'],\n) => {\n  let transport = stream as LoggerTransport;\n  if (listLogs) {\n    transport.listLogs = listLogs;\n  }\n  if (listLogsByRunId) {\n    transport.listLogsByRunId = listLogsByRunId;\n  }\n  return transport as LoggerTransport;\n};\n\nexport interface IMastraLogger {\n  debug(message: string, ...args: any[]): void;\n  info(message: string, ...args: any[]): void;\n  warn(message: string, ...args: any[]): void;\n  error(message: string, ...args: any[]): void;\n  trackException(error: Error, metadata?: Record<string, unknown>): void;\n\n  getTransports(): Map<string, LoggerTransport>;\n  listLogs(\n    _transportId: string,\n    _params?: {\n      fromDate?: Date;\n      toDate?: Date;\n      logLevel?: LogLevel;\n      filters?: Record<string, any>;\n      page?: number;\n      perPage?: number;\n    },\n  ): Promise<{ logs: BaseLogMessage[]; total: number; page: number; perPage: number; hasMore: boolean }>;\n  listLogsByRunId(_args: {\n    transportId: string;\n    runId: string;\n    fromDate?: Date;\n    toDate?: Date;\n    logLevel?: LogLevel;\n    filters?: Record<string, any>;\n    page?: number;\n    perPage?: number;\n  }): Promise<{ logs: BaseLogMessage[]; total: number; page: number; perPage: number; hasMore: boolean }>;\n}\n\nexport abstract class MastraLogger implements IMastraLogger {\n  protected name: string;\n  protected level: LogLevel;\n  protected transports: Map<string, LoggerTransport>;\n\n  constructor(\n    options: {\n      name?: string;\n      level?: LogLevel;\n      transports?: Record<string, LoggerTransport>;\n    } = {},\n  ) {\n    this.name = options.name || 'Mastra';\n    this.level = options.level || LogLevel.ERROR;\n    this.transports = new Map(Object.entries(options.transports || {}));\n  }\n\n  abstract debug(message: string, ...args: any[]): void;\n  abstract info(message: string, ...args: any[]): void;\n  abstract warn(message: string, ...args: any[]): void;\n  abstract error(message: string, ...args: any[]): void;\n\n  getTransports() {\n    return this.transports;\n  }\n\n  trackException(_error: Error, _metadata?: Record<string, unknown>) {}\n\n  async listLogs(\n    transportId: string,\n    params?: {\n      fromDate?: Date;\n      toDate?: Date;\n      logLevel?: LogLevel;\n      filters?: Record<string, any>;\n      page?: number;\n      perPage?: number;\n    },\n  ) {\n    if (!transportId || !this.transports.has(transportId)) {\n      return { logs: [], total: 0, page: params?.page ?? 1, perPage: params?.perPage ?? 100, hasMore: false };\n    }\n\n    return (\n      this.transports.get(transportId)!.listLogs?.(params) ?? {\n        logs: [],\n        total: 0,\n        page: params?.page ?? 1,\n        perPage: params?.perPage ?? 100,\n        hasMore: false,\n      }\n    );\n  }\n\n  async listLogsByRunId({\n    transportId,\n    runId,\n    fromDate,\n    toDate,\n    logLevel,\n    filters,\n    page,\n    perPage,\n  }: {\n    transportId: string;\n    runId: string;\n    fromDate?: Date;\n    toDate?: Date;\n    logLevel?: LogLevel;\n    filters?: Record<string, any>;\n    page?: number;\n    perPage?: number;\n  }) {\n    if (!transportId || !this.transports.has(transportId) || !runId) {\n      return { logs: [], total: 0, page: page ?? 1, perPage: perPage ?? 100, hasMore: false };\n    }\n\n    return (\n      this.transports\n        .get(transportId)!\n        .listLogsByRunId?.({ runId, fromDate, toDate, logLevel, filters, page, perPage }) ?? {\n        logs: [],\n        total: 0,\n        page: page ?? 1,\n        perPage: perPage ?? 100,\n        hasMore: false,\n      }\n    );\n  }\n}\n\nexport type LogFilterContext = {\n  component?: RegisteredLogger;\n  level: LogLevel;\n  message: string;\n  args: unknown[];\n};\n\nexport type LogFilter = (ctx: LogFilterContext) => boolean;\n\nexport interface ConsoleLoggerOptions {\n  name?: string;\n  level?: LogLevel;\n  component?: RegisteredLogger;\n  filter?: LogFilter;\n}\n\nexport class ConsoleLogger extends MastraLogger {\n  protected component?: RegisteredLogger;\n  protected filter?: LogFilter;\n\n  constructor(options: ConsoleLoggerOptions = {}) {\n    super(options);\n    this.component = options.component;\n    this.filter = options.filter;\n  }\n\n  child(componentOrBindings: RegisteredLogger | Record<string, unknown>): ConsoleLogger {\n    const component =\n      typeof componentOrBindings === 'string'\n        ? componentOrBindings\n        : ((componentOrBindings?.component as RegisteredLogger) ?? this.component);\n    return new ConsoleLogger({\n      name: this.name,\n      level: this.level,\n      component,\n      filter: this.filter,\n    });\n  }\n\n  private shouldLog(level: LogLevel, message: string, args: unknown[]): boolean {\n    if (!this.filter) return true;\n    try {\n      return this.filter({ component: this.component, level, message, args });\n    } catch (e) {\n      console.error(`[Logger] Filter error for component=${this.component} level=${level}:`, e);\n      return true;\n    }\n  }\n\n  private prefix(): string {\n    return this.component ? `[${this.component}] ` : '';\n  }\n\n  debug(message: string, ...args: any[]): void {\n    if (this.level === LogLevel.DEBUG && this.shouldLog(LogLevel.DEBUG, message, args)) {\n      console.info(`${this.prefix()}${message}`, ...args);\n    }\n  }\n\n  info(message: string, ...args: any[]): void {\n    if (\n      (this.level === LogLevel.INFO || this.level === LogLevel.DEBUG) &&\n      this.shouldLog(LogLevel.INFO, message, args)\n    ) {\n      console.info(`${this.prefix()}${message}`, ...args);\n    }\n  }\n\n  warn(message: string, ...args: any[]): void {\n    if (\n      (this.level === LogLevel.WARN || this.level === LogLevel.INFO || this.level === LogLevel.DEBUG) &&\n      this.shouldLog(LogLevel.WARN, message, args)\n    ) {\n      console.warn(`${this.prefix()}${message}`, ...args);\n    }\n  }\n\n  error(message: string, ...args: any[]): void {\n    if (\n      (this.level === LogLevel.ERROR ||\n        this.level === LogLevel.WARN ||\n        this.level === LogLevel.INFO ||\n        this.level === LogLevel.DEBUG) &&\n      this.shouldLog(LogLevel.ERROR, message, args)\n    ) {\n      console.error(`${this.prefix()}${message}`, ...args);\n    }\n  }\n\n  async listLogs(\n    _transportId: string,\n    _params?: {\n      fromDate?: Date;\n      toDate?: Date;\n      logLevel?: LogLevel;\n      filters?: Record<string, any>;\n      page?: number;\n      perPage?: number;\n    },\n  ) {\n    return { logs: [], total: 0, page: _params?.page ?? 1, perPage: _params?.perPage ?? 100, hasMore: false };\n  }\n\n  async listLogsByRunId(_args: {\n    transportId: string;\n    runId: string;\n    fromDate?: Date;\n    toDate?: Date;\n    logLevel?: LogLevel;\n    filters?: Record<string, any>;\n    page?: number;\n    perPage?: number;\n  }) {\n    return { logs: [], total: 0, page: _args.page ?? 1, perPage: _args.perPage ?? 100, hasMore: false };\n  }\n}\n","import type { IMastraLogger } from '../logger';\nimport { ConsoleLogger, RegisteredLogger } from '../logger';\n\nexport class MastraBase {\n  component: RegisteredLogger = RegisteredLogger.LLM;\n  protected logger: IMastraLogger;\n  name?: string;\n  #rawConfig?: Record<string, unknown>;\n\n  constructor({\n    component,\n    name,\n    rawConfig,\n  }: {\n    component?: RegisteredLogger;\n    name?: string;\n    rawConfig?: Record<string, unknown>;\n  }) {\n    this.component = component || RegisteredLogger.LLM;\n    this.name = name;\n    this.#rawConfig = rawConfig;\n    this.logger = new ConsoleLogger({ name: `${this.component} - ${this.name}` });\n  }\n\n  /**\n   * Returns the raw storage configuration this primitive was created from,\n   * or undefined if it was created from code.\n   */\n  toRawConfig(): Record<string, unknown> | undefined {\n    return this.#rawConfig;\n  }\n\n  /**\n   * Sets the raw storage configuration for this primitive.\n   * @internal\n   */\n  __setRawConfig(rawConfig: Record<string, unknown>): void {\n    this.#rawConfig = rawConfig;\n  }\n\n  /**\n   * Set the logger for the agent\n   * @param logger\n   */\n  __setLogger(logger: IMastraLogger) {\n    this.logger =\n      'child' in logger && typeof (logger as any).child === 'function'\n        ? (logger as any).child({ component: this.component })\n        : logger;\n  }\n}\n","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 { Readable } from 'node:stream';\nimport type { ToolsInput } from '@internal/voice';\nimport { standardSchemaToJSONSchema, toStandardSchema } from '@mastra/schema-compat/schema';\n\nexport type OpenAIExecuteFunction = (args: any) => Promise<any>;\ntype ToolDefinition = {\n  type: 'function';\n  name: string;\n  description: string;\n  parameters: {\n    [key: string]: any;\n  };\n};\n\ntype TTools = ToolsInput;\nexport const transformTools = (tools?: TTools) => {\n  const openaiTools: { openaiTool: ToolDefinition; execute: OpenAIExecuteFunction }[] = [];\n  for (const [name, tool] of Object.entries(tools || {})) {\n    let parameters: { [key: string]: any };\n\n    if ('inputSchema' in tool && tool.inputSchema) {\n      parameters = toToolParameters(tool.inputSchema);\n    } else if ('parameters' in tool) {\n      parameters = toToolParameters(tool.parameters);\n    } else {\n      console.warn(`Tool ${name} has neither inputSchema nor parameters, skipping`);\n      continue;\n    }\n    const openaiTool: ToolDefinition = {\n      type: 'function',\n      name,\n      description: tool.description || `Tool: ${name}`,\n      parameters,\n    };\n\n    if (tool.execute) {\n      // Create an adapter function that works with both ToolAction and VercelTool execute functions\n      const executeAdapter = async (args: any) => {\n        try {\n          if (!tool.execute) {\n            throw new Error(`Tool ${name} has no execute function`);\n          }\n\n          // For ToolAction, the first argument is a context object with the args in a 'context' property\n          if ('inputSchema' in tool) {\n            return await tool.execute(\n              { context: args },\n              {\n                toolCallId: 'unknown',\n                messages: [],\n              },\n            );\n          }\n          // For VercelTool, pass args directly\n          else {\n            // Create a minimal ToolExecutionOptions object with required properties\n            const options = {\n              toolCallId: 'unknown',\n              messages: [],\n            };\n            return await tool.execute(args, options);\n          }\n        } catch (error) {\n          console.error(`Error executing tool ${name}:`, error);\n          throw error;\n        }\n      };\n      openaiTools.push({ openaiTool, execute: executeAdapter });\n    } else {\n      console.warn(`Tool ${name} has no execute function, skipping`);\n    }\n  }\n  return openaiTools;\n};\n\nexport const isReadableStream = (obj: unknown) => {\n  return (\n    obj &&\n    obj instanceof Readable &&\n    typeof obj.read === 'function' &&\n    typeof obj.pipe === 'function' &&\n    obj.readable === true\n  );\n};\n\nfunction toToolParameters(schema: unknown): { [key: string]: any } {\n  const parameters = standardSchemaToJSONSchema(toStandardSchema(schema as never), { io: 'input' }) as {\n    [key: string]: any;\n  };\n  delete parameters.$schema;\n  return parameters;\n}\n","import { EventEmitter } from 'node:events';\nimport { PassThrough } from 'node:stream';\nimport type { ToolsInput, RequestContext } from '@internal/voice';\nimport { MastraVoice } from '@internal/voice';\nimport type { Realtime, RealtimeServerEvents } from 'openai-realtime-api';\nimport { WebSocket } from 'ws';\nimport { isReadableStream, transformTools } from './utils';\n\n/**\n * Event callback function type\n */\ntype EventCallback = (...args: any[]) => void;\n\ntype StreamWithId = PassThrough & { id: string };\n\n/**\n * Map of event types to their callback arrays\n */\ntype EventMap = {\n  transcribing: [{ text: string }];\n  writing: [{ text: string }];\n  speaking: [{ audio: string }];\n  speaker: [StreamWithId];\n  error: [Error];\n} & {\n  [key: string]: EventCallback[];\n};\n\n/** Default voice for text-to-speech. 'alloy' provides a neutral, balanced voice suitable for most use cases */\nconst DEFAULT_VOICE: Realtime.Voice = 'alloy';\n\nconst DEFAULT_TRANSCRIBER: Realtime.AudioTranscriptionModel = 'whisper-1';\n\nconst DEFAULT_URL = 'wss://api.openai.com/v1/realtime';\n\n/**\n * Default model for real-time voice interactions.\n * This model is optimized for low-latency responses while maintaining high quality output.\n */\nconst DEFAULT_MODEL = 'gpt-4o-mini-realtime-preview-2024-12-17';\n\n// /**\n//  * Default Voice Activity Detection (VAD) configuration.\n//  * These settings control how the system detects speech segments.\n//  *\n//  * @property {string} type - Uses server-side VAD for better accuracy\n//  * @property {number} threshold - Speech detection sensitivity (0.5 = balanced)\n//  * @property {number} prefix_padding_ms - Includes 1 second of audio before speech\n//  * @property {number} silence_duration_ms - Waits 1 second of silence before ending turn\n//  */\n// const DEFAULT_VAD_CONFIG = {\n//   type: 'server_vad',\n//   threshold: 0.5,\n//   prefix_padding_ms: 1000,\n//   silence_duration_ms: 1000,\n// } as Realtime.TurnDetection;\n\ntype TTools = ToolsInput;\n\n/**\n * Available voice options for text-to-speech.\n * Each voice has unique characteristics suitable for different use cases:\n * - alloy: Neutral and balanced\n * - echo: Warm and natural\n * - shimmer: Clear and expressive\n * - And more...\n */\nconst VOICES = ['alloy', 'ash', 'ballad', 'coral', 'echo', 'sage', 'shimmer', 'verse'];\n\ntype RealtimeClientServerEventMap = {\n  [K in RealtimeServerEvents.EventType]: [RealtimeServerEvents.EventMap[K]];\n} & {\n  ['conversation.item.input_audio_transcription.delta']: [{ delta: string; item_id: string; content_index: number }];\n  ['conversation.item.input_audio_transcription.completed']: [\n    { transcript: string; item_id: string; content_index: number; usage?: unknown },\n  ];\n  ['response.output_audio.delta']: [{ delta: string; response_id: string }];\n  ['response.output_audio.done']: [{ response_id: string }];\n  ['response.output_audio_transcript.delta']: [{ delta: string; response_id: string }];\n  ['response.output_audio_transcript.done']: [{ response_id: string }];\n  ['response.output_text.delta']: [{ delta: string; response_id: string }];\n  ['response.output_text.done']: [{ response_id: string }];\n};\n\n/**\n * OpenAIRealtimeVoice provides real-time voice interaction capabilities using OpenAI's\n * WebSocket-based API. It supports:\n * - Real-time text-to-speech\n * - Speech-to-text (transcription)\n * - Voice activity detection\n * - Multiple voice options\n * - Event-based audio streaming\n *\n * The class manages WebSocket connections, audio streaming, and event handling\n * for seamless voice interactions.\n *\n * @extends MastraVoice\n *\n * @example\n * ```typescript\n * const voice = new OpenAIRealtimeVoice({\n *   apiKey: process.env.OPENAI_API_KEY,\n *   model: 'gpt-4o-mini-realtime'\n * });\n *\n * await voice.open();\n * voice.on('speaking', (audioData) => {\n *   // Handle audio data\n * });\n *\n * await voice.speak('Hello, how can I help you today?');\n * ```\n */\nexport class OpenAIRealtimeVoice extends MastraVoice {\n  private ws?: WebSocket;\n  private state: 'close' | 'open';\n  private client: EventEmitter<RealtimeClientServerEventMap>;\n  private events: EventMap;\n  private instructions?: string;\n  private tools?: TTools;\n  private debug: boolean;\n  private queue: unknown[] = [];\n  private transcriber: Realtime.AudioTranscriptionModel;\n  private requestContext?: RequestContext;\n  /**\n   * Creates a new instance of OpenAIRealtimeVoice.\n   *\n   * @param options - Configuration options for the voice instance\n   * @param options.url - The base URL for the OpenAI Realtime API\n   * @param options.model - The model ID to use (defaults to GPT-4 Mini Realtime)\n   * @param options.apiKey - OpenAI API key. Falls back to process.env.OPENAI_API_KEY\n   * @param options.speaker - Voice ID to use (defaults to 'alloy')\n   * @param options.debug - Enable debug mode\n   *\n   * @example\n   * ```typescript\n   * const voice = new OpenAIRealtimeVoice({\n   *   apiKey: 'your-api-key',\n   *   model: 'gpt-4o-mini-realtime',\n   *   speaker: 'alloy'\n   * });\n   * ```\n   */\n  constructor(\n    private options: {\n      model?: string;\n      url?: string;\n      apiKey?: string;\n      speaker?: Realtime.Voice;\n      transcriber?: Realtime.AudioTranscriptionModel;\n      debug?: boolean;\n    } = {},\n  ) {\n    super();\n\n    this.client = new EventEmitter();\n    this.state = 'close';\n    this.events = {} as EventMap;\n    this.speaker = options.speaker || DEFAULT_VOICE;\n    this.transcriber = options.transcriber || DEFAULT_TRANSCRIBER;\n    this.debug = options.debug || false;\n  }\n\n  /**\n   * Returns a list of available voice speakers.\n   *\n   * @returns Promise resolving to an array of voice objects, each containing at least a voiceId\n   *\n   * @example\n   * ```typescript\n   * const speakers = await voice.getSpeakers();\n   * // speakers = [{ voiceId: 'alloy' }, { voiceId: 'echo' }, ...]\n   * ```\n   */\n  getSpeakers(): Promise<Array<{ voiceId: string; [key: string]: any }>> {\n    return Promise.resolve(VOICES.map(v => ({ voiceId: v })));\n  }\n\n  /**\n   * Disconnects from the OpenAI realtime session and cleans up resources.\n   * Should be called when you're done with the voice instance.\n   *\n   * @example\n   * ```typescript\n   * voice.close(); // Disconnects and cleans up\n   * ```\n   */\n  close() {\n    if (!this.ws) return;\n    this.ws.close();\n    this.state = 'close';\n  }\n\n  /**\n   * Equips the voice instance with a set of instructions.\n   * Instructions allow the model to perform additional actions during conversations.\n   *\n   * @param instructions - Optional instructions to addInstructions\n   * @returns Transformed instructions ready for use with the model\n   *\n   * @example\n   * ```typescript\n   * voice.addInstructions('You are a helpful assistant.');\n   * ```\n   */\n  addInstructions(instructions?: string) {\n    this.instructions = instructions;\n  }\n\n  /**\n   * Equips the voice instance with a set of tools.\n   * Tools allow the model to perform additional actions during conversations.\n   *\n   * @param tools - Optional tools configuration to addTools\n   * @returns Transformed tools configuration ready for use with the model\n   *\n   * @example\n   * ```typescript\n   * const tools = {\n   *   search: async (query: string) => { ... },\n   *   calculate: (expression: string) => { ... }\n   * };\n   * voice.addTools(tools);\n   * ```\n   */\n  addTools(tools?: TTools) {\n    this.tools = tools || {};\n  }\n\n  /**\n   * Emits a speaking event using the configured voice model.\n   * Can accept either a string or a readable stream as input.\n   *\n   * @param input - The text to convert to speech, or a readable stream containing the text\n   * @param options - Optional configuration for this specific speech request\n   * @param options.speaker - Override the voice to use for this specific request\n   *\n   * @throws {Error} If the input text is empty\n   *\n   * @example\n   * ```typescript\n   * // Simple text to speech\n   * await voice.speak('Hello world');\n   *\n   * // With custom voice\n   * await voice.speak('Hello world', { speaker: 'echo' });\n   *\n   * // Using a stream\n   * const stream = fs.createReadStream('text.txt');\n   * await voice.speak(stream);\n   * ```\n   */\n  async speak(input: string | NodeJS.ReadableStream, options?: { speaker?: Realtime.Voice }): Promise<void> {\n    if (typeof input !== 'string') {\n      const chunks: Buffer[] = [];\n      for await (const chunk of input) {\n        chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk)));\n      }\n      input = Buffer.concat(chunks).toString('utf-8');\n    }\n\n    if (input.trim().length === 0) {\n      throw new Error('Input text is empty');\n    }\n\n    this.sendEvent('response.create', {\n      response: {\n        instructions: `Repeat the following text: ${input}`,\n        voice: options?.speaker ? options.speaker : undefined,\n      },\n    });\n  }\n\n  /**\n   * Updates the session configuration for the voice instance.\n   * This can be used to modify voice settings, turn detection, and other parameters.\n   *\n   * @param sessionConfig - New session configuration to apply\n   *\n   * @example\n   * ```typescript\n   * voice.updateConfig({\n   *   voice: 'echo',\n   *   turn_detection: {\n   *     type: 'server_vad',\n   *     threshold: 0.5,\n   *     silence_duration_ms: 1000\n   *   }\n   * });\n   * ```\n   */\n  updateConfig(sessionConfig: unknown): void {\n    this.sendEvent('session.update', { session: sessionConfig });\n  }\n\n  /**\n   * Checks if listening capabilities are enabled.\n   *\n   * @returns {Promise<{ enabled: boolean }>}\n   */\n  async getListener() {\n    return { enabled: true };\n  }\n\n  /**\n   * Processes audio input for speech recognition.\n   * Takes a readable stream of audio data and emits a writing event.\n   * The output of the writing event is int16 audio data.\n   *\n   * @param audioData - Readable stream containing the audio data to process\n   * @param options - Optional configuration for audio processing\n   *\n   * @throws {Error} If the audio data format is not supported\n   *\n   * @example\n   * ```typescript\n   * // Process audio from a file\n   * const audioStream = fs.createReadStream('audio.raw');\n   * await voice.listen(audioStream);\n   *\n   * // Process audio with options\n   * await voice.listen(microphoneStream, {\n   *   format: 'int16',\n   *   sampleRate: 24000\n   * });\n   * ```\n   */\n  async listen(audioData: NodeJS.ReadableStream): Promise<void> {\n    if (isReadableStream(audioData)) {\n      const chunks: Buffer[] = [];\n      for await (const chunk of audioData) {\n        const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n        chunks.push(buffer);\n      }\n\n      const buffer = Buffer.concat(chunks);\n      const int16Array = new Int16Array(buffer.buffer, buffer.byteOffset ?? 0, (buffer.byteLength ?? 0) / 2);\n      const base64Audio = this.int16ArrayToBase64(int16Array);\n\n      this.sendEvent('conversation.item.create', {\n        item: {\n          type: 'message',\n          role: 'user',\n          content: [{ type: 'input_audio', audio: base64Audio }],\n        },\n      });\n\n      this.sendEvent('response.create', {\n        response: {\n          modalities: ['text'],\n          instructions: `ONLY repeat the input and DO NOT say anything else`,\n        },\n      });\n    } else {\n      this.emit('error', new Error('Unsupported audio data format'));\n    }\n  }\n\n  waitForOpen() {\n    return new Promise(resolve => {\n      this.ws?.on('open', resolve);\n    });\n  }\n\n  waitForSessionCreated() {\n    return new Promise(resolve => {\n      this.client.on('session.created', resolve);\n    });\n  }\n\n  /**\n   * Establishes a connection to the OpenAI realtime service.\n   * Must be called before using speak, listen, or relay functions.\n   *\n   * @throws {Error} If connection fails or session creation times out\n   *\n   * @example\n   * ```typescript\n   * await voice.open();\n   * // Now ready for voice interactions\n   * ```\n   */\n  async connect({ requestContext }: { requestContext?: RequestContext } = {}) {\n    const url = `${this.options.url || DEFAULT_URL}?model=${this.options.model || DEFAULT_MODEL}`;\n    const apiKey = this.options.apiKey || process.env.OPENAI_API_KEY;\n    this.requestContext = requestContext;\n\n    this.ws = new WebSocket(url, undefined, {\n      headers: {\n        Authorization: 'Bearer ' + apiKey,\n      },\n    });\n\n    this.setupEventListeners();\n    await Promise.all([this.waitForOpen(), this.waitForSessionCreated()]);\n\n    const openaiTools = transformTools(this.tools);\n    this.updateConfig({\n      type: 'realtime',\n      instructions: this.instructions,\n      tools: openaiTools.map(t => t.openaiTool),\n      audio: {\n        input: {\n          transcription: {\n            model: this.transcriber,\n          },\n        },\n        output: {\n          voice: this.speaker,\n        },\n      },\n    });\n    this.state = 'open';\n  }\n\n  disconnect() {\n    this.state = 'close';\n    this.ws?.close();\n  }\n\n  /**\n   * Streams audio data in real-time to the OpenAI service.\n   * Useful for continuous audio streaming scenarios like live microphone input.\n   * Must be in 'open' state before calling this method.\n   *\n   * @param audioData - Readable stream of audio data to relay\n   * @throws {Error} If audio format is not supported\n   *\n   * @example\n   * ```typescript\n   * // First connect\n   * await voice.open();\n   *\n   * // Then relay audio\n   * const micStream = getMicrophoneStream();\n   * await voice.relay(micStream);\n   * ```\n   */\n  async send(audioData: NodeJS.ReadableStream | Int16Array, eventId?: string): Promise<void> {\n    if (!this.state || this.state !== 'open') {\n      console.warn('Cannot relay audio when not open. Call open() first.');\n      return;\n    }\n\n    if (isReadableStream(audioData)) {\n      const stream = audioData as NodeJS.ReadableStream;\n      stream.on('data', chunk => {\n        try {\n          const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n          this.sendEvent('input_audio_buffer.append', { audio: buffer.toString('base64'), event_id: eventId });\n        } catch (err) {\n          this.emit('error', err);\n        }\n      });\n    } else if (audioData instanceof Int16Array) {\n      try {\n        const base64Audio = this.int16ArrayToBase64(audioData);\n        this.sendEvent('input_audio_buffer.append', { audio: base64Audio, event_id: eventId });\n      } catch (err) {\n        this.emit('error', err);\n      }\n    } else {\n      this.emit('error', new Error('Unsupported audio data format'));\n    }\n  }\n\n  /**\n   * Sends a response to the OpenAI Realtime API.\n   *\n   * Trigger a response to the real-time session.\n   *\n   * @param {Object} params - The parameters object\n   * @param {Realtime.ResponseConfig} params.options - Configuration options for the response\n   * @returns {Promise<void>} A promise that resolves when the response has been sent\n   *\n   * @example\n   * // Send a simple text response\n   * await realtimeVoice.answer({\n   *   options: {\n   *     content: \"Hello, how can I help you today?\",\n   *     voice: \"alloy\"\n   *   }\n   * });\n   */\n  async answer({ options }: { options?: Realtime.ResponseConfig }) {\n    this.sendEvent('response.create', { response: options ?? {} });\n  }\n\n  /**\n   * Registers an event listener for voice events.\n   * Available events: 'speaking', 'writing, 'error'\n   * Can listen to OpenAI Realtime events by prefixing with 'openAIRealtime:'\n   * Such as 'openAIRealtime:conversation.item.completed', 'openAIRealtime:conversation.updated', etc.\n   *\n   * @param event - Name of the event to listen for\n   * @param callback - Function to call when the event occurs\n   *\n   * @example\n   * ```typescript\n   * // Listen for speech events\n   * voice.on('speaking', (audioData: Int16Array) => {\n   *   // Handle audio data\n   * });\n   *\n   * // Handle errors\n   * voice.on('error', (error: Error) => {\n   *   console.error('Voice error:', error);\n   * });\n   * ```\n   */\n  on(event: string, callback: EventCallback): void {\n    if (!this.events[event]) {\n      this.events[event] = [];\n    }\n    this.events[event].push(callback);\n  }\n\n  /**\n   * Removes a previously registered event listener.\n   *\n   * @param event - Name of the event to stop listening to\n   * @param callback - The specific callback function to remove\n   *\n   * @example\n   * ```typescript\n   * // Create event handler\n   * const handleSpeech = (audioData: Int16Array) => {\n   *   // Handle audio data\n   * };\n   *\n   * // Add listener\n   * voice.on('speaking', handleSpeech);\n   *\n   * // Later, remove the listener\n   * voice.off('speaking', handleSpeech);\n   * ```\n   */\n  off(event: string, callback: EventCallback): void {\n    if (!this.events[event]) return;\n\n    const index = this.events[event].indexOf(callback);\n    if (index !== -1) {\n      this.events[event].splice(index, 1);\n    }\n  }\n\n  /**\n   * Emit an event with arguments\n   * @param event Event name\n   * @param args Arguments to pass to the callbacks\n   */\n  private emit(event: string, ...args: any[]): void {\n    if (!this.events[event]) return;\n\n    for (const callback of this.events[event]) {\n      callback(...args);\n    }\n  }\n\n  private setupEventListeners(): void {\n    const speakerStreams = new Map<string, StreamWithId>();\n    const userTranscriptionDeltaItems = new Set<string>();\n\n    if (!this.ws) {\n      throw new Error('WebSocket not initialized');\n    }\n\n    this.ws.on('message', message => {\n      const data = JSON.parse(message.toString());\n      this.client.emit(data.type, data);\n\n      if (this.debug) {\n        const { delta, ...fields } = data;\n        console.info(data.type, fields, delta?.length < 100 ? delta : '');\n      }\n    });\n\n    this.client.on('session.created', ev => {\n      this.emit('session.created', ev);\n\n      const queue = this.queue.splice(0, this.queue.length);\n      for (const ev of queue) {\n        this.ws?.send(JSON.stringify(ev));\n      }\n    });\n    this.client.on('session.updated', ev => {\n      this.emit('session.updated', ev);\n    });\n    this.client.on('response.created', ev => {\n      this.emit('response.created', ev);\n\n      const speakerStream = new PassThrough() as StreamWithId;\n\n      speakerStream.id = ev.response.id;\n\n      speakerStreams.set(ev.response.id, speakerStream);\n      this.emit('speaker', speakerStream);\n    });\n    this.client.on('conversation.item.input_audio_transcription.delta', ev => {\n      userTranscriptionDeltaItems.add(ev.item_id);\n      this.emit('writing', { text: ev.delta, response_id: ev.item_id, role: 'user' });\n    });\n    this.client.on('conversation.item.input_audio_transcription.completed', ev => {\n      if (!userTranscriptionDeltaItems.has(ev.item_id) && ev.transcript) {\n        this.emit('writing', { text: ev.transcript, response_id: ev.item_id, role: 'user' });\n      }\n      userTranscriptionDeltaItems.delete(ev.item_id);\n      this.emit('writing', { text: '\\n', response_id: ev.item_id, role: 'user' });\n    });\n    const handleAudioDelta = (ev: { delta: string; response_id: string }) => {\n      const audio = Buffer.from(ev.delta, 'base64');\n      this.emit('speaking', { audio, response_id: ev.response_id });\n\n      const stream = speakerStreams.get(ev.response_id);\n      stream?.write(audio);\n    };\n    const handleAudioDone = (ev: { response_id: string }) => {\n      this.emit('speaking.done', { response_id: ev.response_id });\n\n      const stream = speakerStreams.get(ev.response_id);\n      stream?.end();\n    };\n    const handleAudioTranscriptDelta = (ev: { delta: string; response_id: string }) => {\n      this.emit('writing', { text: ev.delta, response_id: ev.response_id, role: 'assistant' });\n    };\n    const handleAudioTranscriptDone = (ev: { response_id: string }) => {\n      this.emit('writing', { text: '\\n', response_id: ev.response_id, role: 'assistant' });\n    };\n    const handleTextDelta = (ev: { delta: string; response_id: string }) => {\n      this.emit('writing', { text: ev.delta, response_id: ev.response_id, role: 'assistant' });\n    };\n    const handleTextDone = (ev: { response_id: string }) => {\n      this.emit('writing', { text: '\\n', response_id: ev.response_id, role: 'assistant' });\n    };\n    this.client.on('response.audio.delta', handleAudioDelta);\n    this.client.on('response.output_audio.delta', handleAudioDelta);\n    this.client.on('response.audio.done', handleAudioDone);\n    this.client.on('response.output_audio.done', handleAudioDone);\n    this.client.on('response.audio_transcript.delta', handleAudioTranscriptDelta);\n    this.client.on('response.output_audio_transcript.delta', handleAudioTranscriptDelta);\n    this.client.on('response.audio_transcript.done', handleAudioTranscriptDone);\n    this.client.on('response.output_audio_transcript.done', handleAudioTranscriptDone);\n    this.client.on('response.text.delta', handleTextDelta);\n    this.client.on('response.output_text.delta', handleTextDelta);\n    this.client.on('response.text.done', handleTextDone);\n    this.client.on('response.output_text.done', handleTextDone);\n    this.client.on('response.done', async ev => {\n      await this.handleFunctionCalls(ev);\n      this.emit('response.done', ev);\n      speakerStreams.delete(ev.response.id);\n    });\n    this.client.on('error', async ev => {\n      this.emit('error', ev);\n    });\n  }\n\n  private async handleFunctionCalls(ev: any) {\n    let handledFunctionCall = false;\n    for (const output of ev.response?.output ?? []) {\n      if (output.type === 'function_call') {\n        handledFunctionCall = true;\n        await this.handleFunctionCall(output);\n      }\n    }\n    if (handledFunctionCall) {\n      this.sendEvent('response.create', {});\n    }\n  }\n\n  private async handleFunctionCall(output: any) {\n    try {\n      const context = JSON.parse(output.arguments);\n      const tool = this.tools?.[output.name];\n      if (!tool) {\n        console.warn(`Tool \"${output.name}\" not found`);\n        return;\n      }\n\n      if (tool?.execute) {\n        this.emit('tool-call-start', {\n          toolCallId: output.call_id,\n          toolName: output.name,\n          toolDescription: tool.description,\n          args: context,\n        });\n      }\n\n      const result = await tool?.execute?.(context, {\n        toolCallId: output.call_id,\n        messages: [],\n        requestContext: this.requestContext,\n      });\n\n      this.emit('tool-call-result', {\n        toolCallId: output.call_id,\n        toolName: output.name,\n        toolDescription: tool.description,\n        args: context,\n        result,\n      });\n\n      this.sendEvent('conversation.item.create', {\n        item: {\n          type: 'function_call_output',\n          call_id: output.call_id,\n          output: JSON.stringify(result),\n        },\n      });\n    } catch (e) {\n      const err = e as Error;\n      console.warn(`Error calling tool \"${output.name}\":`, err.message);\n      this.sendEvent('conversation.item.create', {\n        item: {\n          type: 'function_call_output',\n          call_id: output.call_id,\n          output: JSON.stringify({ error: err.message }),\n        },\n      });\n    }\n  }\n\n  private int16ArrayToBase64(int16Array: Int16Array): string {\n    const buffer = new ArrayBuffer(int16Array.length * 2);\n    const view = new DataView(buffer);\n    for (let i = 0; i < int16Array.length; i++) {\n      view.setInt16(i * 2, int16Array[i]!, true);\n    }\n    const uint8Array = new Uint8Array(buffer);\n    let binary = '';\n    for (let i = 0; i < uint8Array.length; i++) {\n      binary += String.fromCharCode(uint8Array[i]!);\n    }\n    return btoa(binary);\n  }\n\n  private sendEvent(type: string, data: any) {\n    if (!this.ws || this.ws.readyState !== this.ws.OPEN) {\n      this.queue.push({ type: type, ...data });\n    } else {\n      this.ws?.send(\n        JSON.stringify({\n          type: type,\n          ...data,\n        }),\n      );\n    }\n  }\n}\n"]}