@mastra/voice-inworld 0.3.0 → 0.3.3-alpha.0
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.
- package/CHANGELOG.md +6 -0
- package/dist/_types/@internal_voice/dist/_types/@internal_ai-sdk-v5/dist/index.d.ts +11 -8
- package/dist/docs/SKILL.md +1 -1
- package/dist/docs/assets/SOURCE_MAP.json +1 -1
- package/dist/docs/references/reference-voice-inworld-realtime.md +5 -5
- package/dist/docs/references/reference-voice-inworld.md +1 -1
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +10 -9
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"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/realtime/utils.ts","../src/realtime/index.ts","../src/index.ts"],"names":["Readable","json","zodToJsonSchema","EventEmitter","buffer","WebSocket","PassThrough","stream"],"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.info(`${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 { zodToJsonSchema } from 'zod-to-json-schema';\n\ntype ToolDefinition = {\n type: 'function';\n name: string;\n description: string;\n parameters: {\n [key: string]: any;\n };\n};\n\ntype TTools = ToolsInput;\n\n/**\n * Transforms a Mastra tools record into Inworld realtime tool definitions.\n * Inworld's realtime tool schema matches OpenAI's GA shape\n * (`{ type: 'function', name, description, parameters }`), so the transformation\n * is provider-agnostic. Execution itself goes through the Mastra tool's own\n * `execute` (called in `handleFunctionCall`), so no adapter is built here.\n */\nexport const transformTools = (tools?: TTools): ToolDefinition[] => {\n const inworldTools: ToolDefinition[] = [];\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 = isZodObject(tool.inputSchema)\n ? zodSchemaToJson(tool.inputSchema)\n : (tool.inputSchema as Record<string, unknown>);\n } else if ('parameters' in tool && tool.parameters) {\n parameters = isZodObject(tool.parameters)\n ? zodSchemaToJson(tool.parameters)\n : (tool.parameters as Record<string, unknown>);\n } else {\n // Zero-arg tool: advertise an empty-object schema so the server knows\n // the tool exists. `handleFunctionCall` already treats empty/missing\n // `arguments` as `{}`, so the round-trip works.\n parameters = { type: 'object', properties: {}, additionalProperties: false };\n }\n\n if (!tool.execute) {\n console.warn(`Tool ${name} has no execute function, skipping`);\n continue;\n }\n\n inworldTools.push({\n type: 'function',\n name,\n description: tool.description || `Tool: ${name}`,\n parameters,\n });\n }\n return inworldTools;\n};\n\n/**\n * Recursively merge `source` into `target`. Plain objects compose; arrays and\n * primitives in `source` replace whatever's in `target`. Used to merge the\n * typed `session` field and the untyped `providerData` escape hatch into\n * per-call `session.update` payloads without clobbering nested fields like\n * `audio.output.voice`.\n */\nexport function deepMerge(target: Record<string, unknown>, source: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = { ...target };\n for (const [key, value] of Object.entries(source)) {\n const existing = out[key];\n if (isPlainObject(existing) && isPlainObject(value)) {\n out[key] = deepMerge(existing as Record<string, unknown>, value as Record<string, unknown>);\n } else {\n out[key] = value;\n }\n }\n return out;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (!value || typeof value !== 'object') return false;\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\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\n/**\n * Convert a Zod schema (v3 or v4) to a JSON schema. Zod v4 ships its own\n * `toJSONSchema()` method; v3 relies on the `zod-to-json-schema` package.\n */\nfunction zodSchemaToJson(schema: any): Record<string, unknown> {\n if (typeof schema?.toJSONSchema === 'function') {\n const json = schema.toJSONSchema();\n delete json.$schema;\n return json;\n }\n const json = zodToJsonSchema(schema);\n delete json.$schema;\n return json;\n}\n\nfunction isZodObject(schema: unknown) {\n if (!schema || typeof schema !== 'object' || !('_def' in schema)) return false;\n const def = (schema as { _def?: Record<string, unknown> })._def;\n if (!def || typeof def !== 'object') return false;\n // Zod v3: _def.typeName === 'ZodObject'. Zod v4: _def.type === 'object'.\n return ('typeName' in def && def.typeName === 'ZodObject') || ('type' in def && def.type === 'object');\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 { WebSocket } from 'ws';\nimport type {\n InworldInputTranscription,\n InworldMemoryState,\n InworldProviderData,\n InworldResponseConfig,\n InworldSessionConfig,\n InworldTurnDetection,\n InworldVoiceEventMap,\n InworldVoiceProfile,\n} from './types';\nimport { deepMerge, isReadableStream, transformTools } from './utils';\n\ntype EventCallback = (...args: any[]) => void;\n\ntype StreamWithId = PassThrough & { id: string };\n\ntype EventStore = Record<string, EventCallback[]>;\n\n/**\n * Default voice. Inworld ships a curated voice catalog; the authoritative list\n * comes from `getSpeakers()`.\n */\nconst DEFAULT_VOICE = 'Sarah';\n\nconst DEFAULT_URL = 'wss://api.inworld.ai/api/v1/realtime/session';\n\n/**\n * Default realtime model. Inworld routes via an LLM Router; any model ID it\n * exposes is accepted (e.g. `inworld/...`, `anthropic/...`, `openai/...`).\n */\nconst DEFAULT_MODEL = 'inworld/models/gemma-4-26b-a4b-it';\n\n/**\n * Default turn-detection config. Semantic VAD is the conversational default —\n * it produces speech-started/speech-stopped events the server interprets in\n * context (rather than purely on energy thresholds) and lets the model\n * interrupt itself mid-response. Override per call via `session.audio.input.turn_detection`,\n * or disable entirely by passing `null`.\n */\nconst DEFAULT_TURN_DETECTION: InworldTurnDetection = {\n type: 'semantic_vad',\n eagerness: 'medium',\n create_response: true,\n interrupt_response: true,\n};\n\n/**\n * Default user-side transcription. The realtime server transcribes incoming\n * audio with its own engine by default; an Inworld voice provider should pick\n * Inworld's own STT rather than inherit that fallback. Override per call via\n * `session.audio.input.transcription`, or disable by passing `null`.\n */\nconst DEFAULT_TRANSCRIPTION: InworldInputTranscription = {\n model: 'inworld/inworld-stt-1',\n};\n\n/** Default deadline for the WS handshake + initial `session.updated` round-trip. */\nconst DEFAULT_CONNECT_TIMEOUT_MS = 15_000;\n\n/**\n * Curated voice list, mirroring how `@mastra/voice-openai-realtime` ships a\n * static array. Inworld accepts any voice ID from its catalog at runtime;\n * extend or fetch dynamically via `getSpeakers()`.\n */\nconst VOICES = ['Dennis', 'Hades', 'Wendy', 'Edward', 'Olivia', 'Sarah', 'Timothy', 'Priya', 'Ronald', 'Deborah'];\n\ntype TTools = ToolsInput;\n\nexport interface InworldRealtimeVoiceOptions {\n /** Inworld API key. Pre-Basic-encoded; passed verbatim. Falls back to `INWORLD_API_KEY`. */\n apiKey?: string;\n /** Override the realtime WebSocket endpoint. */\n url?: string;\n /** Default LLM Router model. Defaults to `inworld/models/gemma-4-26b-a4b-it`. */\n model?: string;\n /** Default voice catalog ID. Defaults to `Sarah`. */\n speaker?: string;\n /**\n * Optional client-generated session ID surfaced as the `key` URL parameter.\n * Inworld requires a per-session key; one is generated automatically if\n * omitted. Set this for replayable/observable sessions.\n */\n sessionId?: string;\n /** System prompt forwarded with the initial `session.update`. */\n instructions?: string;\n /**\n * First-class typed session config merged into every `session.update`. Use\n * this for Inworld-specific knobs (audio output speed/model, input\n * transcription, semantic-VAD eagerness, tool_choice, etc.). Deep-merged\n * with the per-call session payload — nested fields compose rather than\n * replace.\n */\n session?: Partial<InworldSessionConfig>;\n debug?: boolean;\n /**\n * Typed Inworld extension object (stt/tts/memory/backchannel/responsiveness\n * plus session-level `user_id`/`metadata`). Sent under `session.providerData`\n * in every `session.update`. Composes with `session.providerData` (deep-merged);\n * this constructor option wins on key collisions.\n */\n providerData?: InworldProviderData;\n /**\n * Max time `connect()` will wait for the WebSocket to open AND for the\n * initial `session.updated` handshake to land. A pre-open `error` or `close`\n * — or this timeout firing — surfaces as a rejected promise from `connect()`,\n * NOT an uncaught socket error. Defaults to 15s.\n */\n connectTimeoutMs?: number;\n}\n\n/**\n * InworldRealtimeVoice provides real-time voice interaction over Inworld's\n * Realtime API. The wire protocol is the OpenAI Realtime GA spec — same event\n * names on both sides (`conversation.item.added`, `conversation.item.done`,\n * `response.output_audio.delta`, etc.). Provider-level differences are the\n * endpoint, Basic auth, the URL session-key handshake, and Inworld-specific\n * session knobs surfaced through typed `session` + typed `providerData`\n * extensions (sent under `session.providerData`).\n *\n * Auth: Inworld API keys are already Basic-encoded — they are passed verbatim\n * in the `Authorization: Basic ...` header (do NOT re-encode).\n *\n * @example\n * ```typescript\n * const voice = new InworldRealtimeVoice({\n * apiKey: process.env.INWORLD_API_KEY,\n * // Defaults: model 'inworld/models/gemma-4-26b-a4b-it', speaker 'Sarah',\n * // STT 'inworld/inworld-stt-1', semantic-VAD turn detection.\n * session: {\n * audio: {\n * output: { speed: 1.1 },\n * input: { turn_detection: { type: 'semantic_vad', eagerness: 'high' } },\n * },\n * },\n * });\n *\n * await voice.connect();\n * voice.on('speaker', stream => { /* pipe to audio out *\\/ });\n * await voice.speak('Hello from Mastra!');\n * ```\n */\nexport class InworldRealtimeVoice extends MastraVoice {\n private ws?: WebSocket;\n private state: 'close' | 'open';\n private client: EventEmitter;\n private events: EventStore;\n private instructions?: string;\n private tools?: TTools;\n private debug: boolean;\n private queue: unknown[] = [];\n private requestContext?: RequestContext;\n private session?: Partial<InworldSessionConfig>;\n private providerData?: InworldProviderData;\n private sessionId: string;\n /** response_ids currently between `response.created` and `response.done`. */\n private activeResponseIds: Set<string> = new Set();\n /**\n * Per-response lock for the `writing` stream. Whichever of\n * `output_audio_transcript` or `output_text` fires its first delta wins, and\n * the other is suppressed for that response_id. Order-symmetric: works\n * regardless of which stream the server flushes first.\n */\n private writingSource: Map<string, 'audio_transcript' | 'text'> = new Map();\n /** Reject closures for `speak()` calls awaiting a response lifecycle. Drained on `close()`/`disconnect()`. */\n private pendingLifecycleRejecters: Set<(err: Error) => void> = new Set();\n /** Last emitted memory state version, used to dedupe rolling `memory` events. */\n private lastMemoryVersion?: number;\n /**\n * Ends + clears the per-connection stream maps owned by `setupEventListeners`\n * (the maps are closure-local). Called from `close()`/`disconnect()` so\n * in-flight back-channel streams don't leak when the socket goes away.\n */\n private endActiveStreams?: () => void;\n\n constructor(private options: InworldRealtimeVoiceOptions = {}) {\n super();\n\n this.client = new EventEmitter();\n this.state = 'close';\n this.events = {};\n this.speaker = options.speaker || DEFAULT_VOICE;\n this.debug = options.debug || false;\n this.session = options.session;\n this.providerData = options.providerData;\n this.instructions = options.instructions;\n this.sessionId = options.sessionId ?? `voice-${Date.now()}`;\n }\n\n /**\n * Returns the curated voice list. Inworld's voice catalog is larger than\n * this array — pass any voice ID via the `speaker` option to override.\n */\n getSpeakers(): Promise<Array<{ voiceId: string; [key: string]: any }>> {\n return Promise.resolve(VOICES.map(v => ({ voiceId: v })));\n }\n\n close() {\n if (!this.ws) return;\n this.ws.close();\n this.state = 'close';\n this.rejectPendingLifecycles();\n // Detach all internal routing handlers so the next `connect()` does not\n // double-fire on `client.emit`. Consumer-facing listeners on `this.events`\n // persist across reconnects.\n this.client.removeAllListeners();\n this.endActiveStreams?.();\n this.activeResponseIds.clear();\n this.writingSource.clear();\n this.lastMemoryVersion = undefined;\n }\n\n addInstructions(instructions?: string) {\n this.instructions = instructions;\n }\n\n addTools(tools?: TTools) {\n this.tools = tools || {};\n }\n\n /**\n * Generate speech from text. The model is asked to repeat the input\n * verbatim — this mirrors the behavior of @mastra/voice-openai-realtime.\n * A per-call `speaker` is scoped to this response only (sent via\n * `response.voice`); it does NOT mutate session state.\n *\n * Awaits the full response lifecycle: the returned promise resolves once\n * the next `response.done` (or rejects on `interrupted` / `error`) for\n * this `speak()` invocation. Serial `speak()` calls are supported;\n * concurrent calls share the same listener pool and have undefined\n * response-pinning order — most voice apps serialize.\n */\n async speak(input: string | NodeJS.ReadableStream, options?: { speaker?: string }): 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 // Register the lifecycle waiter BEFORE sending `response.create` so we\n // can't miss the `response.created` event the server emits in reply.\n const done = this.awaitResponseLifecycle();\n\n this.sendEvent('conversation.item.create', {\n item: {\n type: 'message',\n role: 'user',\n content: [{ type: 'input_text', text: input }],\n },\n });\n\n const response: InworldResponseConfig = {\n instructions: `Repeat the following text: ${input}`,\n };\n if (options?.speaker) {\n response.voice = options.speaker;\n }\n this.sendEvent('response.create', { response });\n\n await done;\n }\n\n /**\n * Resolves on the next `response.done`, pinned by the `response.id`\n * observed on the first `response.created` after registration. Rejects on\n * `error` and on the synthetic `interrupted` signal for the pinned id.\n */\n private awaitResponseLifecycle(): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n let pinnedId: string | undefined;\n\n const cleanup = () => {\n this.client.removeListener('response.created', onCreated);\n this.client.removeListener('response.done', onDone);\n this.client.removeListener('error', onError);\n this.client.removeListener('interrupted', onInterrupt);\n this.pendingLifecycleRejecters.delete(rejectWith);\n };\n\n const rejectWith = (err: Error) => {\n cleanup();\n reject(err);\n };\n\n const onCreated = (ev: any) => {\n if (pinnedId) return;\n pinnedId = ev?.response?.id;\n };\n\n const onDone = (ev: any) => {\n if (!pinnedId || ev?.response?.id !== pinnedId) return;\n cleanup();\n resolve();\n };\n\n const onInterrupt = (ev: { response_id: string }) => {\n if (!pinnedId || ev.response_id !== pinnedId) return;\n rejectWith(new Error(`Response ${pinnedId} was interrupted by user speech`));\n };\n\n const onError = (err: unknown) => {\n rejectWith(err instanceof Error ? err : new Error(String(err)));\n };\n\n this.pendingLifecycleRejecters.add(rejectWith);\n this.client.on('response.created', onCreated);\n this.client.on('response.done', onDone);\n this.client.on('error', onError);\n this.client.on('interrupted', onInterrupt);\n });\n }\n\n /**\n * Apply a new session config. The typed `session` constructor field is\n * deep-merged into the per-call payload, so nested fields (e.g.\n * `audio.output.voice` + `audio.output.speed`) compose rather than overwrite\n * each other. The constructor `providerData` is nested under\n * `session.providerData` (matching Inworld's wire field) and deep-merged on\n * top of any `session.providerData` set via the `session` field — the\n * constructor option wins on key collisions.\n */\n updateConfig(sessionConfig: Partial<InworldSessionConfig> | Record<string, unknown>): void {\n let merged: Record<string, unknown> = { ...sessionConfig } as Record<string, unknown>;\n if (this.session) merged = deepMerge(merged, this.session as Record<string, unknown>);\n if (this.providerData) {\n const existing = (merged.providerData as Record<string, unknown> | undefined) ?? {};\n merged.providerData = deepMerge(existing, this.providerData as Record<string, unknown>);\n }\n this.sendEvent('session.update', { session: merged });\n }\n\n async getListener() {\n return { enabled: true };\n }\n\n /**\n * Send an audio buffer to the realtime endpoint as a single user turn and\n * request a text-only transcription response.\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 output_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 /**\n * Resolves once the WebSocket emits `open`. Rejects on a pre-open `error`\n * or `close`, and on a connect-timeout. Mirrors the pattern from\n * `@mastra/voice-google-gemini-live-api` (ConnectionManager.waitForOpen).\n */\n waitForOpen(timeoutMs: number = this.options.connectTimeoutMs ?? DEFAULT_CONNECT_TIMEOUT_MS): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!this.ws) {\n reject(new Error('WebSocket not initialized'));\n return;\n }\n\n if (this.ws.readyState === this.ws.OPEN) {\n resolve();\n return;\n }\n\n const onOpen = () => {\n cleanup();\n resolve();\n };\n const onError = (err: Error) => {\n cleanup();\n reject(new Error(`Inworld realtime WebSocket failed to open: ${err?.message ?? String(err)}`));\n };\n const onClose = () => {\n cleanup();\n reject(new Error('Inworld realtime WebSocket closed before opening'));\n };\n const cleanup = () => {\n this.ws?.removeListener('open', onOpen);\n this.ws?.removeListener('error', onError);\n this.ws?.removeListener('close', onClose);\n clearTimeout(timer);\n };\n\n this.ws.once('open', onOpen);\n this.ws.once('error', onError);\n this.ws.once('close', onClose);\n\n const timer = setTimeout(() => {\n cleanup();\n reject(new Error(`Inworld realtime WebSocket connection timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n });\n }\n\n /**\n * Resolves on the first `session.updated` event. Inworld emits\n * `session.created` immediately on connect (despite older docs claiming\n * otherwise), but `session.updated` is the canonical handshake completion\n * because our `connect()` sends a `session.update` before declaring ready.\n *\n * Rejects with a clear error if the server does not acknowledge within\n * `timeoutMs` — otherwise `connect()` would hang forever on a half-open\n * socket.\n */\n waitForSessionCreated(\n timeoutMs: number = this.options.connectTimeoutMs ?? DEFAULT_CONNECT_TIMEOUT_MS,\n ): Promise<void> {\n return new Promise((resolve, reject) => {\n const ws = this.ws;\n let transportAttached = false;\n const cleanup = () => {\n clearTimeout(timer);\n this.client.removeListener('session.updated', onUpdated);\n ws?.removeListener('open', onOpen);\n if (transportAttached) {\n ws?.removeListener('close', onClose);\n ws?.removeListener('error', onError);\n }\n };\n const onUpdated = () => {\n cleanup();\n resolve();\n };\n // Only listen for close/error AFTER the socket is open. `waitForOpen()`\n // owns pre-open transport failures; attaching here too would double-reject\n // (and surface unhandled rejections, since `connect()` only awaits the\n // open promise on that path).\n const onClose = (code?: number, reason?: Buffer) => {\n cleanup();\n reject(\n new Error(\n `Inworld realtime websocket closed during handshake (code=${code ?? '?'}, reason=${reason?.toString() || 'n/a'})`,\n ),\n );\n };\n const onError = (err: Error) => {\n cleanup();\n reject(err);\n };\n const attachTransport = () => {\n if (transportAttached) return;\n transportAttached = true;\n ws?.once('close', onClose);\n ws?.once('error', onError);\n };\n const onOpen = () => attachTransport();\n\n this.client.once('session.updated', onUpdated);\n if (ws && ws.readyState === ws.OPEN) {\n attachTransport();\n } else {\n ws?.once('open', onOpen);\n }\n const timer = setTimeout(() => {\n cleanup();\n reject(new Error(`Inworld realtime session handshake timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n });\n }\n\n /**\n * Open the websocket, send the initial `session.update`, and wait for\n * `session.updated`.\n *\n * URL contract: Inworld's Realtime WebSocket requires a client-generated\n * session ID (`?key=...`) and `&protocol=realtime`. The model is configured\n * via the initial `session.update`, NOT the URL.\n *\n * A pre-open error/close on the WebSocket — or a timeout exceeding\n * `connectTimeoutMs` (15s default) — surfaces as a rejected promise\n * instead of an uncaught socket error. On reject, the half-open socket\n * is closed.\n */\n async connect({ requestContext }: { requestContext?: RequestContext } = {}) {\n const baseUrl = this.options.url || DEFAULT_URL;\n const url = `${baseUrl}?key=${encodeURIComponent(this.sessionId)}&protocol=realtime`;\n const apiKey = this.options.apiKey || process.env.INWORLD_API_KEY;\n if (!apiKey) {\n throw new Error(\n 'Missing Inworld API key. Pass `apiKey` to InworldRealtimeVoice or set INWORLD_API_KEY. Keys ship pre-Basic-encoded; paste verbatim.',\n );\n }\n this.requestContext = requestContext;\n\n this.ws = new WebSocket(url, undefined, {\n headers: {\n // Inworld API keys are pre-Basic-encoded; pass verbatim.\n Authorization: 'Basic ' + apiKey,\n },\n });\n\n this.setupEventListeners();\n\n let ready: Promise<void> | undefined;\n try {\n const opened = this.waitForOpen();\n ready = this.waitForSessionCreated();\n await opened;\n\n // Compose the connect-time defaults. The typed `session` field is\n // deep-merged on top in updateConfig() (and `providerData` is nested under\n // `session.providerData` there). `turn_detection` and `transcription` are\n // each opted out by setting them to `null` in `session`; we also skip a\n // default whenever `session` supplies that field explicitly, so the user's\n // shape doesn't inherit our defaults' nested fields.\n const userTd = this.userTurnDetection();\n const userTranscription = this.userTranscription();\n const audio: NonNullable<InworldSessionConfig['audio']> = {\n output: { voice: this.speaker },\n };\n const input: NonNullable<InworldSessionConfig['audio']>['input'] = {};\n if (userTd === undefined) {\n input.turn_detection = { ...DEFAULT_TURN_DETECTION };\n }\n if (userTranscription === undefined) {\n input.transcription = { ...DEFAULT_TRANSCRIPTION };\n }\n if (Object.keys(input).length > 0) {\n audio.input = input;\n }\n const initial: Partial<InworldSessionConfig> = {\n model: this.options.model || DEFAULT_MODEL,\n instructions: this.instructions,\n tools: transformTools(this.tools),\n audio,\n };\n this.updateConfig(initial);\n\n await ready;\n this.state = 'open';\n } catch (err) {\n // Close the half-open socket so we don't leak file descriptors.\n try {\n this.ws?.close();\n } catch {\n // ignore\n }\n this.state = 'close';\n this.client.removeAllListeners();\n throw err;\n }\n }\n\n disconnect() {\n this.state = 'close';\n this.ws?.close();\n this.rejectPendingLifecycles();\n this.client.removeAllListeners();\n this.endActiveStreams?.();\n this.activeResponseIds.clear();\n this.writingSource.clear();\n this.lastMemoryVersion = undefined;\n }\n\n /**\n * Reject any in-flight `speak()` awaiters. Called from `close()`/`disconnect()`\n * so a consumer cleanup pattern never hangs waiting for a `response.done`\n * that will never arrive.\n */\n private rejectPendingLifecycles(): void {\n if (this.pendingLifecycleRejecters.size === 0) return;\n const err = new Error('Inworld realtime voice closed while a response was in flight');\n for (const rej of this.pendingLifecycleRejecters) rej(err);\n this.pendingLifecycleRejecters.clear();\n }\n\n async send(audioData: NodeJS.ReadableStream | Int16Array, eventId?: string): Promise<void> {\n if (!this.state || this.state !== 'open') {\n console.warn('Cannot send audio when not open. Call connect() 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 async answer({ options }: { options?: Record<string, unknown> } = {}) {\n this.sendEvent('response.create', { response: options ?? {} });\n }\n\n /**\n * Manually commit buffered input audio as a user turn. Use for push-to-talk\n * or manual turn-taking when `turn_detection` is `null` (no auto-VAD).\n */\n commitInput(): void {\n this.sendEvent('input_audio_buffer.commit', {});\n }\n\n /**\n * Discard buffered input audio without committing it as a user turn.\n */\n clearInput(): void {\n this.sendEvent('input_audio_buffer.clear', {});\n }\n\n /**\n * Clear the server's ENTIRE output audio buffer, stopping playback. This also\n * stops any in-flight BACK-CHANNEL audio. The default barge-in path\n * (`response.cancel` on `interrupted`) is back-channel-safe; prefer it. Use\n * `clearOutput()` only when you explicitly want to flush everything.\n */\n clearOutput(): void {\n this.sendEvent('output_audio_buffer.clear', {});\n }\n\n on<E extends keyof InworldVoiceEventMap>(event: E, callback: (data: InworldVoiceEventMap[E]) => void): void;\n on(event: string, callback: EventCallback): void;\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 off<E extends keyof InworldVoiceEventMap>(event: E, callback: (data: InworldVoiceEventMap[E]) => void): void;\n off(event: string, callback: EventCallback): void;\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 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 backchannelStreams = new Map<string, StreamWithId>();\n const functionCallArgs = new Map<string, string>();\n\n if (!this.ws) {\n throw new Error('WebSocket not initialized');\n }\n\n // Wipe stale routing from a previous `connect()` before re-registering.\n // Reconnects (or test resets) would otherwise double-fire every event.\n // Consumer-facing handlers on `this.events` are intentionally preserved.\n this.client.removeAllListeners();\n this.activeResponseIds.clear();\n this.writingSource.clear();\n this.lastMemoryVersion = undefined;\n\n // Lets close()/disconnect() drain the closure-local stream maps below.\n this.endActiveStreams = () => {\n for (const stream of speakerStreams.values()) stream.end();\n speakerStreams.clear();\n for (const stream of backchannelStreams.values()) stream.end();\n backchannelStreams.clear();\n };\n\n this.ws.on('message', message => {\n // Surface malformed inbound frames as `error` events. Without the try,\n // a JSON.parse throw escapes the socket listener and crashes the process.\n let data: any;\n try {\n data = JSON.parse(message.toString());\n } catch (err) {\n this.emit('error', err instanceof Error ? err : new Error(`Invalid server frame: ${String(err)}`));\n return;\n }\n this.client.emit(data.type, data);\n\n if (this.debug) {\n const { delta, ...fields } = data;\n console.info(data.type, fields, delta && delta.length < 100 ? delta : '');\n }\n });\n\n this.client.on('session.created', ev => {\n this.emit('session.created', ev);\n });\n\n this.client.on('session.updated', ev => {\n this.emit('session.updated', ev);\n\n // Inworld echoes its rolling memory state back on the session object.\n // Dedupe by version so a `session.updated` for an unrelated config change\n // doesn't re-emit an unchanged memory snapshot.\n const memoryState: InworldMemoryState | undefined = ev.session?.providerData?.memory?.state;\n if (memoryState) {\n if (memoryState.version === undefined || memoryState.version !== this.lastMemoryVersion) {\n this.lastMemoryVersion = memoryState.version;\n this.emit('memory', memoryState);\n }\n }\n\n const queue = this.queue.splice(0, this.queue.length);\n for (const queued of queue) {\n this.ws?.send(JSON.stringify(queued));\n }\n });\n\n this.client.on('response.created', ev => {\n this.activeResponseIds.add(ev.response.id);\n this.emit('response.created', ev);\n\n const speakerStream = new PassThrough() as StreamWithId;\n speakerStream.id = ev.response.id;\n\n speakerStreams.set(ev.response.id, speakerStream);\n this.emit('speaker', speakerStream);\n });\n\n // GA-spec per-item lifecycle: `added` (item appended) and `done` (item\n // finished). Surface both upward so consumers can drive UI from either edge.\n this.client.on('conversation.item.added', ev => {\n this.emit('conversation.item.added', ev);\n });\n this.client.on('conversation.item.done', ev => {\n this.emit('conversation.item.done', ev);\n });\n\n // Barge-in. We fire `interrupted` (and a server-side `response.cancel`)\n // for each in-flight response from multiple \"user is speaking now\" signals,\n // because semantic_vad doesn't always emit `speech_started` quickly enough\n // when the bot's own audio is bleeding into the mic. The dedupe set keeps\n // us from emitting twice per response when several signals fire in a row.\n const interruptedFor = new Set<string>();\n const fireInterruptedForActive = () => {\n if (this.activeResponseIds.size === 0) return;\n const td = this.userTurnDetection() ?? DEFAULT_TURN_DETECTION;\n const shouldCancel = td?.interrupt_response !== false;\n for (const responseId of this.activeResponseIds) {\n if (interruptedFor.has(responseId)) continue;\n interruptedFor.add(responseId);\n const payload = { response_id: responseId };\n this.emit('interrupted', payload);\n // Internal channel for `speak()`'s awaiter (see awaitResponseLifecycle).\n this.client.emit('interrupted', payload);\n if (shouldCancel) {\n this.sendEvent('response.cancel', { response_id: responseId });\n }\n }\n };\n\n this.client.on('input_audio_buffer.speech_started', ev => {\n this.emit('speech-started', ev);\n fireInterruptedForActive();\n });\n this.client.on('input_audio_buffer.speech_stopped', ev => {\n this.emit('speech-stopped', ev);\n });\n\n // Smart-turn endpointing + manual turn-taking acks. These re-emit the raw\n // server events under ergonomic names; the trailing/duration/inference\n // timings are optional and passed through only when present.\n this.client.on('input_audio_buffer.turn_suggestion', ev => {\n this.emit('turn-suggestion', {\n item_id: ev.item_id,\n utterance_index: ev.utterance_index,\n probability: ev.probability,\n trailing_silence_ms: ev.trailing_silence_ms,\n audio_duration_ms: ev.audio_duration_ms,\n inference_ms: ev.inference_ms,\n });\n });\n this.client.on('input_audio_buffer.turn_suggestion_revoked', ev => {\n this.emit('turn-suggestion-revoked', { item_id: ev.item_id, utterance_index: ev.utterance_index });\n });\n this.client.on('input_audio_buffer.committed', ev => {\n this.emit('input-committed', { item_id: ev.item_id, previous_item_id: ev.previous_item_id });\n });\n this.client.on('input_audio_buffer.cleared', () => {\n this.emit('input-cleared', {});\n });\n this.client.on('input_audio_buffer.timeout_triggered', ev => {\n this.emit('input-timeout', {\n audio_start_ms: ev.audio_start_ms,\n audio_end_ms: ev.audio_end_ms,\n item_id: ev.item_id,\n });\n });\n\n // Output playback-state signals. None carry a response_id on the wire.\n this.client.on('output_audio_buffer.started', () => {\n this.emit('output-audio-started', {});\n });\n this.client.on('output_audio_buffer.stopped', () => {\n this.emit('output-audio-stopped', {});\n });\n this.client.on('output_audio_buffer.cleared', () => {\n this.emit('output-audio-cleared', {});\n });\n // STT deltas are a near-realtime \"user is talking\" signal that fires even\n // when semantic_vad has suppressed `speech_started`. Treat the first one\n // during an active response as a barge-in trigger.\n this.client.on('conversation.item.input_audio_transcription.delta', () => {\n fireInterruptedForActive();\n });\n\n // GA spec audio deltas (NOT preview-spec `response.audio.delta`).\n this.client.on('response.output_audio.delta', ev => {\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 this.client.on('response.output_audio.done', ev => {\n this.emit('speaking.done', { response_id: ev.response_id });\n\n const stream = speakerStreams.get(ev.response_id);\n stream?.end();\n });\n\n // Inworld can emit both `output_audio_transcript.delta` AND\n // `output_text.delta` for the same response when audio+text modalities\n // are both active. Lock the canonical `writing` source on the first\n // delta seen for the response_id (symmetric: whichever stream arrives\n // first wins). The trailing `\\n` on `.done` follows the same lock so it\n // only fires for the chosen source.\n this.client.on('response.output_audio_transcript.delta', ev => {\n const src = this.writingSource.get(ev.response_id);\n if (src === undefined) this.writingSource.set(ev.response_id, 'audio_transcript');\n else if (src !== 'audio_transcript') return;\n this.emit('writing', { text: ev.delta, response_id: ev.response_id, role: 'assistant' });\n });\n this.client.on('response.output_audio_transcript.done', ev => {\n if (this.writingSource.get(ev.response_id) !== 'audio_transcript') return;\n this.emit('writing', { text: '\\n', response_id: ev.response_id, role: 'assistant' });\n });\n\n this.client.on('response.output_text.delta', ev => {\n const src = this.writingSource.get(ev.response_id);\n if (src === undefined) this.writingSource.set(ev.response_id, 'text');\n else if (src !== 'text') return;\n this.emit('writing', { text: ev.delta, response_id: ev.response_id, role: 'assistant' });\n });\n this.client.on('response.output_text.done', ev => {\n if (this.writingSource.get(ev.response_id) !== 'text') return;\n this.emit('writing', { text: '\\n', response_id: ev.response_id, role: 'assistant' });\n });\n\n // User-side ASR. Transcription defaults to `inworld/inworld-stt-1` (set it\n // to `null` in `session`/`providerData` to disable). The OpenAI\n // Realtime GA spec describes `.delta` events as additive chunks, but Inworld\n // currently sends rolling-rewrite deltas (each one is the full transcript\n // so far). Streaming those naively would duplicate text, so we ignore deltas\n // and emit the final transcript once on `.completed`.\n this.client.on('conversation.item.input_audio_transcription.completed', ev => {\n // Voice profile (age/gender/emotion/...) rides along on the completed\n // transcript when `providerData.stt.voice_profile` is enabled. Attach it\n // to the user `writing` emit; it's optional and may be undefined.\n const voiceProfile: InworldVoiceProfile | undefined = ev.providerData?.voiceProfile;\n if (typeof ev.transcript === 'string' && ev.transcript.length > 0) {\n this.emit('writing', { text: ev.transcript, response_id: ev.item_id, role: 'user', voiceProfile });\n }\n this.emit('writing', { text: '\\n', response_id: ev.item_id, role: 'user' });\n });\n\n // Inworld uses the SINGULAR `function_call_arguments` (docs claim plural;\n // the live API emits singular). Accumulate the argument JSON across deltas\n // and parse on `.done` to expose a complete payload.\n this.client.on('response.function_call_arguments.delta', ev => {\n const prev = functionCallArgs.get(ev.call_id) || '';\n functionCallArgs.set(ev.call_id, prev + (ev.delta || ''));\n });\n this.client.on('response.function_call_arguments.done', ev => {\n const args = functionCallArgs.get(ev.call_id) ?? ev.arguments ?? '';\n functionCallArgs.delete(ev.call_id);\n this.emit('function_call.arguments', {\n call_id: ev.call_id,\n name: ev.name,\n arguments: args,\n });\n });\n\n // Back-channel audio. Short acknowledgements (\"uh-huh\", \"right\") that the\n // model emits while the user is still talking. Mirrors the `speaker` stream\n // pattern: a PassThrough per `backchannel_id`, written from base64 deltas.\n this.client.on('response.backchannel.audio.delta', ev => {\n const audio = Buffer.from(ev.delta, 'base64');\n let stream = backchannelStreams.get(ev.backchannel_id);\n if (!stream) {\n stream = new PassThrough() as StreamWithId;\n stream.id = ev.backchannel_id;\n backchannelStreams.set(ev.backchannel_id, stream);\n this.emit('backchannel', stream);\n }\n stream.write(audio);\n });\n this.client.on('response.backchannel.audio.done', ev => {\n const stream = backchannelStreams.get(ev.backchannel_id);\n stream?.end();\n backchannelStreams.delete(ev.backchannel_id);\n this.emit('backchannel.done', { backchannel_id: ev.backchannel_id, phrase: ev.phrase });\n });\n // The decider can skip a back-channel before any audio is produced.\n this.client.on('response.backchannel.skipped', ev => {\n this.emit('backchannel.skipped', { reason: ev.reason });\n });\n\n this.client.on('response.done', ev => {\n // Emit + clean up FIRST so downstream `response.done` observers and\n // barge-in logic don't sit behind tool latency, then kick off tool work.\n this.emit('response.done', ev);\n speakerStreams.delete(ev.response.id);\n this.activeResponseIds.delete(ev.response.id);\n this.writingSource.delete(ev.response.id);\n interruptedFor.delete(ev.response.id);\n void this.handleFunctionCalls(ev).catch(err => {\n this.emit('error', err instanceof Error ? err : new Error(String(err)));\n });\n });\n\n this.client.on('error', async ev => {\n this.emit('error', ev);\n });\n }\n\n /**\n * Returns the user-supplied `turn_detection` value (or `null` for explicit\n * opt-out), or `undefined` when it isn't set. `turn_detection` is a standard\n * `audio.input` field (not a providerData extension), so it's read only from\n * `session`. Used to decide whether to apply `DEFAULT_TURN_DETECTION`.\n */\n private userTurnDetection(): InworldTurnDetection | null | undefined {\n return this.session?.audio?.input?.turn_detection;\n }\n\n /**\n * Returns the user-supplied `transcription` value (or `null` for explicit\n * opt-out), or `undefined` when it isn't set. `transcription` is a standard\n * `audio.input` field (not a providerData extension), so it's read only from\n * `session`. Used to decide whether to apply `DEFAULT_TRANSCRIPTION`.\n */\n private userTranscription(): InworldInputTranscription | null | undefined {\n return this.session?.audio?.input?.transcription;\n }\n\n private async handleFunctionCalls(ev: any) {\n for (const output of ev.response?.output ?? []) {\n if (output.type === 'function_call') {\n await this.handleFunctionCall(output);\n }\n }\n }\n\n private async handleFunctionCall(output: any) {\n try {\n // Zero-arg tools come back with `arguments: \"\"` (or missing); treat\n // that as `{}` so the Zod input parse doesn't blow up on no-args.\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 } finally {\n this.sendEvent('response.create', {});\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\nexport type {\n InworldAudioConfig,\n InworldAudioFormat,\n InworldAudioInput,\n InworldAudioOutput,\n InworldBackchannelProviderData,\n InworldInputTranscription,\n InworldMemoryProviderData,\n InworldMemoryState,\n InworldNoiseReduction,\n InworldProviderData,\n InworldResponseConfig,\n InworldResponsivenessProviderData,\n InworldSessionConfig,\n InworldSttProviderData,\n InworldToolChoice,\n InworldTracing,\n InworldTtsProviderData,\n InworldTurnDetection,\n InworldVoiceEventMap,\n InworldVoiceProfile,\n InworldVoiceProfileLabel,\n} from './types';\n","import { PassThrough } from 'node:stream';\nimport { MastraVoice } from '@internal/voice';\n\nconst INWORLD_API_BASE = 'https://api.inworld.ai';\n\ntype InworldTtsModel = 'inworld-tts-2' | 'inworld-tts-1.5-max' | 'inworld-tts-1.5-mini';\n\ntype DeliveryMode = 'STABLE' | 'BALANCED' | 'CREATIVE';\n\ntype InworldSttModel = 'groq/whisper-large-v3';\n\ntype AudioEncoding = 'LINEAR16' | 'MP3' | 'OGG_OPUS' | 'ALAW' | 'MULAW' | 'FLAC' | 'PCM' | 'WAV';\n\ntype SttAudioEncoding = 'LINEAR16' | 'MP3' | 'OGG_OPUS' | 'FLAC' | 'AUTO_DETECT';\n\ninterface InworldVoiceConfig {\n name?: InworldTtsModel;\n apiKey?: string;\n}\n\ninterface InworldListeningConfig {\n name?: InworldSttModel;\n apiKey?: string;\n}\n\ninterface InworldSpeakOptions {\n speaker?: string;\n audioEncoding?: AudioEncoding;\n sampleRateHertz?: number;\n speakingRate?: number;\n temperature?: number;\n deliveryMode?: DeliveryMode;\n language?: string;\n}\n\ninterface InworldListenOptions {\n audioEncoding?: SttAudioEncoding;\n sampleRateHertz?: number;\n language?: string;\n numberOfChannels?: number;\n}\n\nexport type {\n InworldVoiceConfig,\n InworldListeningConfig,\n InworldSpeakOptions,\n InworldListenOptions,\n InworldTtsModel,\n InworldSttModel,\n AudioEncoding,\n SttAudioEncoding,\n DeliveryMode,\n};\n\nexport class InworldVoice extends MastraVoice {\n private speechApiKey: string;\n private listeningApiKey: string;\n private audioEncoding: AudioEncoding;\n private sampleRateHertz: number;\n private language: string;\n\n /**\n * Creates an instance of the InworldVoice class.\n *\n * @param {Object} options - The options for the voice configuration.\n * @param {InworldVoiceConfig} [options.speechModel] - TTS model config. Default: inworld-tts-2.\n * @param {InworldListeningConfig} [options.listeningModel] - STT model config. Default: groq/whisper-large-v3.\n * @param {string} [options.speaker] - Default voice ID. Default: 'Dennis'.\n * @param {AudioEncoding} [options.audioEncoding] - TTS audio format. Default: 'MP3'.\n * @param {number} [options.sampleRateHertz] - TTS sample rate. Default: 48000.\n * @param {string} [options.language] - STT language (BCP-47). Default: 'en-US'.\n *\n * @throws {Error} If no API key is provided or found in INWORLD_API_KEY env var.\n */\n constructor({\n speechModel,\n listeningModel,\n speaker,\n audioEncoding,\n sampleRateHertz,\n language,\n }: {\n speechModel?: InworldVoiceConfig;\n listeningModel?: InworldListeningConfig;\n speaker?: string;\n audioEncoding?: AudioEncoding;\n sampleRateHertz?: number;\n language?: string;\n } = {}) {\n // Resolve TTS and STT keys independently so callers can scope credentials\n // per service. If only one model is configured with a key, it is reused as\n // the fallback for the other (preserving the \"one key works everywhere\"\n // ergonomic). The INWORLD_API_KEY env var is the final fallback.\n const envKey = process.env.INWORLD_API_KEY;\n const speechApiKey = speechModel?.apiKey ?? listeningModel?.apiKey ?? envKey;\n const listeningApiKey = listeningModel?.apiKey ?? speechModel?.apiKey ?? envKey;\n\n if (!speechApiKey || !listeningApiKey) {\n throw new Error(\n 'Inworld API key is required. Pass apiKey in speechModel/listeningModel config or set INWORLD_API_KEY env var.',\n );\n }\n\n super({\n speechModel: {\n name: speechModel?.name ?? 'inworld-tts-2',\n apiKey: speechApiKey,\n },\n listeningModel: {\n name: listeningModel?.name ?? 'groq/whisper-large-v3',\n apiKey: listeningApiKey,\n },\n speaker: speaker ?? 'Dennis',\n });\n\n this.speechApiKey = speechApiKey;\n this.listeningApiKey = listeningApiKey;\n this.audioEncoding = audioEncoding ?? 'MP3';\n this.sampleRateHertz = sampleRateHertz ?? 48000;\n this.language = language ?? 'en-US';\n }\n\n /**\n * Retrieves a list of available voices from the Inworld API.\n *\n * @returns {Promise<Array<{ voiceId: string; name: string; language: string; description: string; tags: string[]; source: string }>>}\n */\n async getSpeakers() {\n const response = await fetch(`${INWORLD_API_BASE}/voices/v1/voices`, {\n headers: { Authorization: `Basic ${this.speechApiKey}` },\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Inworld list voices failed (${response.status}): ${text}`);\n }\n\n const data = (await response.json()) as {\n voices?: Array<{\n voiceId: string;\n displayName?: string;\n langCode?: string;\n description?: string;\n tags?: string[];\n source?: string;\n }>;\n };\n\n return (\n data.voices?.map(v => ({\n voiceId: v.voiceId,\n name: v.displayName ?? v.voiceId,\n language: v.langCode ?? 'en',\n description: v.description ?? '',\n tags: v.tags ?? [],\n source: v.source ?? 'SYSTEM',\n })) ?? []\n );\n }\n\n /**\n * Checks if listening capabilities are enabled.\n */\n async getListener() {\n return { enabled: !!this.listeningModel };\n }\n\n /**\n * Converts text to speech using Inworld's streaming TTS endpoint.\n *\n * Returns a ReadableStream that emits audio chunks progressively as they\n * arrive from the API — following the same streaming pattern used by the\n * Deepgram and PlayAI Mastra voice providers.\n *\n * Uses the `/tts/v1/voice:stream` endpoint which returns newline-delimited\n * JSON, each line containing a base64-encoded audio chunk.\n *\n * @param {string | NodeJS.ReadableStream} input - Text or stream to convert to speech.\n * @param {InworldSpeakOptions} [options] - TTS options.\n * @returns {Promise<NodeJS.ReadableStream>} Progressive audio stream.\n */\n async speak(\n input: string | NodeJS.ReadableStream,\n options?: InworldSpeakOptions & { speaker?: string },\n ): Promise<NodeJS.ReadableStream> {\n const text = typeof input === 'string' ? input : await this.streamToString(input);\n\n if (text.trim().length === 0) {\n throw new Error('Input text is empty');\n }\n\n const speaker = options?.speaker ?? this.speaker;\n\n const body = {\n text,\n voiceId: speaker,\n modelId: this.speechModel?.name ?? 'inworld-tts-2',\n audioConfig: {\n audioEncoding: options?.audioEncoding ?? this.audioEncoding,\n sampleRateHertz: options?.sampleRateHertz ?? this.sampleRateHertz,\n ...(options?.speakingRate !== undefined && { speakingRate: options.speakingRate }),\n },\n ...(options?.temperature !== undefined && { temperature: options.temperature }),\n ...(options?.deliveryMode !== undefined && { deliveryMode: options.deliveryMode }),\n ...(options?.language !== undefined && { language: options.language }),\n };\n\n const response = await fetch(`${INWORLD_API_BASE}/tts/v1/voice:stream`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Basic ${this.speechApiKey}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Inworld TTS failed (${response.status}): ${errorText}`);\n }\n\n if (!response.body) {\n throw new Error('Inworld TTS streaming response has no body');\n }\n\n // Progressive streaming: return the PassThrough immediately while reading\n // NDJSON chunks from the response body in a background async task.\n const outputStream = new PassThrough();\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n // Write with backpressure: await drain when the consumer is slow.\n const writeChunk = async (data: Buffer) => {\n if (outputStream.destroyed) return;\n if (!outputStream.write(data)) {\n await new Promise<void>((resolve, reject) => {\n outputStream.once('drain', resolve);\n outputStream.once('close', resolve);\n outputStream.once('error', reject);\n });\n }\n };\n\n // Cancel the upstream reader when the consumer closes early.\n outputStream.once('close', () => {\n void reader.cancel().catch(() => {});\n });\n\n void (async () => {\n try {\n while (true) {\n if (outputStream.destroyed) {\n void reader.cancel().catch(() => {});\n break;\n }\n\n const { done, value } = await reader.read();\n if (done) {\n // Process any remaining data in the buffer before ending\n const remaining = buffer.trim();\n if (remaining) {\n const chunk = JSON.parse(remaining);\n const audioContent = chunk.result?.audioContent ?? chunk.audioContent;\n if (audioContent) {\n await writeChunk(Buffer.from(audioContent, 'base64'));\n }\n }\n outputStream.end();\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n if (outputStream.destroyed) {\n void reader.cancel().catch(() => {});\n return;\n }\n\n const chunk = JSON.parse(trimmed);\n const audioContent = chunk.result?.audioContent ?? chunk.audioContent;\n if (audioContent) {\n await writeChunk(Buffer.from(audioContent, 'base64'));\n }\n }\n }\n } catch (err) {\n if (!outputStream.destroyed) {\n outputStream.destroy(err instanceof Error ? err : new Error(String(err)));\n }\n void reader.cancel().catch(() => {});\n }\n })().catch(() => {});\n\n return outputStream;\n }\n\n /**\n * Converts audio to text using Inworld's batch STT endpoint.\n *\n * @param {NodeJS.ReadableStream} input - Audio stream to transcribe.\n * @param {InworldListenOptions} [options] - STT options.\n * @returns {Promise<string>} Transcribed text.\n */\n async listen(input: NodeJS.ReadableStream, options?: InworldListenOptions): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of input) {\n chunks.push(typeof chunk === 'string' ? Buffer.from(chunk) : (chunk as Buffer));\n }\n const audioBase64 = Buffer.concat(chunks).toString('base64');\n\n const body = {\n transcribeConfig: {\n modelId: this.listeningModel?.name ?? 'groq/whisper-large-v3',\n audioEncoding: options?.audioEncoding ?? 'AUTO_DETECT',\n language: options?.language ?? this.language,\n sampleRateHertz: options?.sampleRateHertz ?? 16000,\n numberOfChannels: options?.numberOfChannels ?? 1,\n },\n audioData: {\n content: audioBase64,\n },\n };\n\n const response = await fetch(`${INWORLD_API_BASE}/stt/v1/transcribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Basic ${this.listeningApiKey}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Inworld STT failed (${response.status}): ${text}`);\n }\n\n const result = (await response.json()) as {\n transcription?: {\n transcript?: string;\n isFinal?: boolean;\n };\n };\n\n return result.transcription?.transcript ?? '';\n }\n\n private async streamToString(stream: NodeJS.ReadableStream): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of stream) {\n chunks.push(typeof chunk === 'string' ? Buffer.from(chunk) : (chunk as Buffer));\n }\n return Buffer.concat(chunks).toString('utf-8');\n }\n}\n\nexport * from './realtime';\n"]}
|
|
1
|
+
{"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/realtime/utils.ts","../src/realtime/index.ts","../src/index.ts"],"names":["Readable","json","zodToJsonSchema","EventEmitter","buffer","WebSocket","PassThrough","stream"],"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 { zodToJsonSchema } from 'zod-to-json-schema';\n\ntype ToolDefinition = {\n type: 'function';\n name: string;\n description: string;\n parameters: {\n [key: string]: any;\n };\n};\n\ntype TTools = ToolsInput;\n\n/**\n * Transforms a Mastra tools record into Inworld realtime tool definitions.\n * Inworld's realtime tool schema matches OpenAI's GA shape\n * (`{ type: 'function', name, description, parameters }`), so the transformation\n * is provider-agnostic. Execution itself goes through the Mastra tool's own\n * `execute` (called in `handleFunctionCall`), so no adapter is built here.\n */\nexport const transformTools = (tools?: TTools): ToolDefinition[] => {\n const inworldTools: ToolDefinition[] = [];\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 = isZodObject(tool.inputSchema)\n ? zodSchemaToJson(tool.inputSchema)\n : (tool.inputSchema as Record<string, unknown>);\n } else if ('parameters' in tool && tool.parameters) {\n parameters = isZodObject(tool.parameters)\n ? zodSchemaToJson(tool.parameters)\n : (tool.parameters as Record<string, unknown>);\n } else {\n // Zero-arg tool: advertise an empty-object schema so the server knows\n // the tool exists. `handleFunctionCall` already treats empty/missing\n // `arguments` as `{}`, so the round-trip works.\n parameters = { type: 'object', properties: {}, additionalProperties: false };\n }\n\n if (!tool.execute) {\n console.warn(`Tool ${name} has no execute function, skipping`);\n continue;\n }\n\n inworldTools.push({\n type: 'function',\n name,\n description: tool.description || `Tool: ${name}`,\n parameters,\n });\n }\n return inworldTools;\n};\n\n/**\n * Recursively merge `source` into `target`. Plain objects compose; arrays and\n * primitives in `source` replace whatever's in `target`. Used to merge the\n * typed `session` field and the untyped `providerData` escape hatch into\n * per-call `session.update` payloads without clobbering nested fields like\n * `audio.output.voice`.\n */\nexport function deepMerge(target: Record<string, unknown>, source: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = { ...target };\n for (const [key, value] of Object.entries(source)) {\n const existing = out[key];\n if (isPlainObject(existing) && isPlainObject(value)) {\n out[key] = deepMerge(existing as Record<string, unknown>, value as Record<string, unknown>);\n } else {\n out[key] = value;\n }\n }\n return out;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (!value || typeof value !== 'object') return false;\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\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\n/**\n * Convert a Zod schema (v3 or v4) to a JSON schema. Zod v4 ships its own\n * `toJSONSchema()` method; v3 relies on the `zod-to-json-schema` package.\n */\nfunction zodSchemaToJson(schema: any): Record<string, unknown> {\n if (typeof schema?.toJSONSchema === 'function') {\n const json = schema.toJSONSchema();\n delete json.$schema;\n return json;\n }\n const json = zodToJsonSchema(schema);\n delete json.$schema;\n return json;\n}\n\nfunction isZodObject(schema: unknown) {\n if (!schema || typeof schema !== 'object' || !('_def' in schema)) return false;\n const def = (schema as { _def?: Record<string, unknown> })._def;\n if (!def || typeof def !== 'object') return false;\n // Zod v3: _def.typeName === 'ZodObject'. Zod v4: _def.type === 'object'.\n return ('typeName' in def && def.typeName === 'ZodObject') || ('type' in def && def.type === 'object');\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 { WebSocket } from 'ws';\nimport type {\n InworldInputTranscription,\n InworldMemoryState,\n InworldProviderData,\n InworldResponseConfig,\n InworldSessionConfig,\n InworldTurnDetection,\n InworldVoiceEventMap,\n InworldVoiceProfile,\n} from './types';\nimport { deepMerge, isReadableStream, transformTools } from './utils';\n\ntype EventCallback = (...args: any[]) => void;\n\ntype StreamWithId = PassThrough & { id: string };\n\ntype EventStore = Record<string, EventCallback[]>;\n\n/**\n * Default voice. Inworld ships a curated voice catalog; the authoritative list\n * comes from `getSpeakers()`.\n */\nconst DEFAULT_VOICE = 'Sarah';\n\nconst DEFAULT_URL = 'wss://api.inworld.ai/api/v1/realtime/session';\n\n/**\n * Default realtime model. Inworld routes via an LLM Router; any model ID it\n * exposes is accepted (e.g. `inworld/...`, `anthropic/...`, `openai/...`).\n */\nconst DEFAULT_MODEL = 'inworld/models/gemma-4-26b-a4b-it';\n\n/**\n * Default turn-detection config. Semantic VAD is the conversational default —\n * it produces speech-started/speech-stopped events the server interprets in\n * context (rather than purely on energy thresholds) and lets the model\n * interrupt itself mid-response. Override per call via `session.audio.input.turn_detection`,\n * or disable entirely by passing `null`.\n */\nconst DEFAULT_TURN_DETECTION: InworldTurnDetection = {\n type: 'semantic_vad',\n eagerness: 'medium',\n create_response: true,\n interrupt_response: true,\n};\n\n/**\n * Default user-side transcription. The realtime server transcribes incoming\n * audio with its own engine by default; an Inworld voice provider should pick\n * Inworld's own STT rather than inherit that fallback. Override per call via\n * `session.audio.input.transcription`, or disable by passing `null`.\n */\nconst DEFAULT_TRANSCRIPTION: InworldInputTranscription = {\n model: 'inworld/inworld-stt-1',\n};\n\n/** Default deadline for the WS handshake + initial `session.updated` round-trip. */\nconst DEFAULT_CONNECT_TIMEOUT_MS = 15_000;\n\n/**\n * Curated voice list, mirroring how `@mastra/voice-openai-realtime` ships a\n * static array. Inworld accepts any voice ID from its catalog at runtime;\n * extend or fetch dynamically via `getSpeakers()`.\n */\nconst VOICES = ['Dennis', 'Hades', 'Wendy', 'Edward', 'Olivia', 'Sarah', 'Timothy', 'Priya', 'Ronald', 'Deborah'];\n\ntype TTools = ToolsInput;\n\nexport interface InworldRealtimeVoiceOptions {\n /** Inworld API key. Pre-Basic-encoded; passed verbatim. Falls back to `INWORLD_API_KEY`. */\n apiKey?: string;\n /** Override the realtime WebSocket endpoint. */\n url?: string;\n /** Default LLM Router model. Defaults to `inworld/models/gemma-4-26b-a4b-it`. */\n model?: string;\n /** Default voice catalog ID. Defaults to `Sarah`. */\n speaker?: string;\n /**\n * Optional client-generated session ID surfaced as the `key` URL parameter.\n * Inworld requires a per-session key; one is generated automatically if\n * omitted. Set this for replayable/observable sessions.\n */\n sessionId?: string;\n /** System prompt forwarded with the initial `session.update`. */\n instructions?: string;\n /**\n * First-class typed session config merged into every `session.update`. Use\n * this for Inworld-specific knobs (audio output speed/model, input\n * transcription, semantic-VAD eagerness, tool_choice, etc.). Deep-merged\n * with the per-call session payload — nested fields compose rather than\n * replace.\n */\n session?: Partial<InworldSessionConfig>;\n debug?: boolean;\n /**\n * Typed Inworld extension object (stt/tts/memory/backchannel/responsiveness\n * plus session-level `user_id`/`metadata`). Sent under `session.providerData`\n * in every `session.update`. Composes with `session.providerData` (deep-merged);\n * this constructor option wins on key collisions.\n */\n providerData?: InworldProviderData;\n /**\n * Max time `connect()` will wait for the WebSocket to open AND for the\n * initial `session.updated` handshake to land. A pre-open `error` or `close`\n * — or this timeout firing — surfaces as a rejected promise from `connect()`,\n * NOT an uncaught socket error. Defaults to 15s.\n */\n connectTimeoutMs?: number;\n}\n\n/**\n * InworldRealtimeVoice provides real-time voice interaction over Inworld's\n * Realtime API. The wire protocol is the OpenAI Realtime GA spec — same event\n * names on both sides (`conversation.item.added`, `conversation.item.done`,\n * `response.output_audio.delta`, etc.). Provider-level differences are the\n * endpoint, Basic auth, the URL session-key handshake, and Inworld-specific\n * session knobs surfaced through typed `session` + typed `providerData`\n * extensions (sent under `session.providerData`).\n *\n * Auth: Inworld API keys are already Basic-encoded — they are passed verbatim\n * in the `Authorization: Basic ...` header (do NOT re-encode).\n *\n * @example\n * ```typescript\n * const voice = new InworldRealtimeVoice({\n * apiKey: process.env.INWORLD_API_KEY,\n * // Defaults: model 'inworld/models/gemma-4-26b-a4b-it', speaker 'Sarah',\n * // STT 'inworld/inworld-stt-1', semantic-VAD turn detection.\n * session: {\n * audio: {\n * output: { speed: 1.1 },\n * input: { turn_detection: { type: 'semantic_vad', eagerness: 'high' } },\n * },\n * },\n * });\n *\n * await voice.connect();\n * voice.on('speaker', stream => { /* pipe to audio out *\\/ });\n * await voice.speak('Hello from Mastra!');\n * ```\n */\nexport class InworldRealtimeVoice extends MastraVoice {\n private ws?: WebSocket;\n private state: 'close' | 'open';\n private client: EventEmitter;\n private events: EventStore;\n private instructions?: string;\n private tools?: TTools;\n private debug: boolean;\n private queue: unknown[] = [];\n private requestContext?: RequestContext;\n private session?: Partial<InworldSessionConfig>;\n private providerData?: InworldProviderData;\n private sessionId: string;\n /** response_ids currently between `response.created` and `response.done`. */\n private activeResponseIds: Set<string> = new Set();\n /**\n * Per-response lock for the `writing` stream. Whichever of\n * `output_audio_transcript` or `output_text` fires its first delta wins, and\n * the other is suppressed for that response_id. Order-symmetric: works\n * regardless of which stream the server flushes first.\n */\n private writingSource: Map<string, 'audio_transcript' | 'text'> = new Map();\n /** Reject closures for `speak()` calls awaiting a response lifecycle. Drained on `close()`/`disconnect()`. */\n private pendingLifecycleRejecters: Set<(err: Error) => void> = new Set();\n /** Last emitted memory state version, used to dedupe rolling `memory` events. */\n private lastMemoryVersion?: number;\n /**\n * Ends + clears the per-connection stream maps owned by `setupEventListeners`\n * (the maps are closure-local). Called from `close()`/`disconnect()` so\n * in-flight back-channel streams don't leak when the socket goes away.\n */\n private endActiveStreams?: () => void;\n\n constructor(private options: InworldRealtimeVoiceOptions = {}) {\n super();\n\n this.client = new EventEmitter();\n this.state = 'close';\n this.events = {};\n this.speaker = options.speaker || DEFAULT_VOICE;\n this.debug = options.debug || false;\n this.session = options.session;\n this.providerData = options.providerData;\n this.instructions = options.instructions;\n this.sessionId = options.sessionId ?? `voice-${Date.now()}`;\n }\n\n /**\n * Returns the curated voice list. Inworld's voice catalog is larger than\n * this array — pass any voice ID via the `speaker` option to override.\n */\n getSpeakers(): Promise<Array<{ voiceId: string; [key: string]: any }>> {\n return Promise.resolve(VOICES.map(v => ({ voiceId: v })));\n }\n\n close() {\n if (!this.ws) return;\n this.ws.close();\n this.state = 'close';\n this.rejectPendingLifecycles();\n // Detach all internal routing handlers so the next `connect()` does not\n // double-fire on `client.emit`. Consumer-facing listeners on `this.events`\n // persist across reconnects.\n this.client.removeAllListeners();\n this.endActiveStreams?.();\n this.activeResponseIds.clear();\n this.writingSource.clear();\n this.lastMemoryVersion = undefined;\n }\n\n addInstructions(instructions?: string) {\n this.instructions = instructions;\n }\n\n addTools(tools?: TTools) {\n this.tools = tools || {};\n }\n\n /**\n * Generate speech from text. The model is asked to repeat the input\n * verbatim — this mirrors the behavior of @mastra/voice-openai-realtime.\n * A per-call `speaker` is scoped to this response only (sent via\n * `response.voice`); it does NOT mutate session state.\n *\n * Awaits the full response lifecycle: the returned promise resolves once\n * the next `response.done` (or rejects on `interrupted` / `error`) for\n * this `speak()` invocation. Serial `speak()` calls are supported;\n * concurrent calls share the same listener pool and have undefined\n * response-pinning order — most voice apps serialize.\n */\n async speak(input: string | NodeJS.ReadableStream, options?: { speaker?: string }): 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 // Register the lifecycle waiter BEFORE sending `response.create` so we\n // can't miss the `response.created` event the server emits in reply.\n const done = this.awaitResponseLifecycle();\n\n this.sendEvent('conversation.item.create', {\n item: {\n type: 'message',\n role: 'user',\n content: [{ type: 'input_text', text: input }],\n },\n });\n\n const response: InworldResponseConfig = {\n instructions: `Repeat the following text: ${input}`,\n };\n if (options?.speaker) {\n response.voice = options.speaker;\n }\n this.sendEvent('response.create', { response });\n\n await done;\n }\n\n /**\n * Resolves on the next `response.done`, pinned by the `response.id`\n * observed on the first `response.created` after registration. Rejects on\n * `error` and on the synthetic `interrupted` signal for the pinned id.\n */\n private awaitResponseLifecycle(): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n let pinnedId: string | undefined;\n\n const cleanup = () => {\n this.client.removeListener('response.created', onCreated);\n this.client.removeListener('response.done', onDone);\n this.client.removeListener('error', onError);\n this.client.removeListener('interrupted', onInterrupt);\n this.pendingLifecycleRejecters.delete(rejectWith);\n };\n\n const rejectWith = (err: Error) => {\n cleanup();\n reject(err);\n };\n\n const onCreated = (ev: any) => {\n if (pinnedId) return;\n pinnedId = ev?.response?.id;\n };\n\n const onDone = (ev: any) => {\n if (!pinnedId || ev?.response?.id !== pinnedId) return;\n cleanup();\n resolve();\n };\n\n const onInterrupt = (ev: { response_id: string }) => {\n if (!pinnedId || ev.response_id !== pinnedId) return;\n rejectWith(new Error(`Response ${pinnedId} was interrupted by user speech`));\n };\n\n const onError = (err: unknown) => {\n rejectWith(err instanceof Error ? err : new Error(String(err)));\n };\n\n this.pendingLifecycleRejecters.add(rejectWith);\n this.client.on('response.created', onCreated);\n this.client.on('response.done', onDone);\n this.client.on('error', onError);\n this.client.on('interrupted', onInterrupt);\n });\n }\n\n /**\n * Apply a new session config. The typed `session` constructor field is\n * deep-merged into the per-call payload, so nested fields (e.g.\n * `audio.output.voice` + `audio.output.speed`) compose rather than overwrite\n * each other. The constructor `providerData` is nested under\n * `session.providerData` (matching Inworld's wire field) and deep-merged on\n * top of any `session.providerData` set via the `session` field — the\n * constructor option wins on key collisions.\n */\n updateConfig(sessionConfig: Partial<InworldSessionConfig> | Record<string, unknown>): void {\n let merged: Record<string, unknown> = { ...sessionConfig } as Record<string, unknown>;\n if (this.session) merged = deepMerge(merged, this.session as Record<string, unknown>);\n if (this.providerData) {\n const existing = (merged.providerData as Record<string, unknown> | undefined) ?? {};\n merged.providerData = deepMerge(existing, this.providerData as Record<string, unknown>);\n }\n this.sendEvent('session.update', { session: merged });\n }\n\n async getListener() {\n return { enabled: true };\n }\n\n /**\n * Send an audio buffer to the realtime endpoint as a single user turn and\n * request a text-only transcription response.\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 output_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 /**\n * Resolves once the WebSocket emits `open`. Rejects on a pre-open `error`\n * or `close`, and on a connect-timeout. Mirrors the pattern from\n * `@mastra/voice-google-gemini-live-api` (ConnectionManager.waitForOpen).\n */\n waitForOpen(timeoutMs: number = this.options.connectTimeoutMs ?? DEFAULT_CONNECT_TIMEOUT_MS): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!this.ws) {\n reject(new Error('WebSocket not initialized'));\n return;\n }\n\n if (this.ws.readyState === this.ws.OPEN) {\n resolve();\n return;\n }\n\n const onOpen = () => {\n cleanup();\n resolve();\n };\n const onError = (err: Error) => {\n cleanup();\n reject(new Error(`Inworld realtime WebSocket failed to open: ${err?.message ?? String(err)}`));\n };\n const onClose = () => {\n cleanup();\n reject(new Error('Inworld realtime WebSocket closed before opening'));\n };\n const cleanup = () => {\n this.ws?.removeListener('open', onOpen);\n this.ws?.removeListener('error', onError);\n this.ws?.removeListener('close', onClose);\n clearTimeout(timer);\n };\n\n this.ws.once('open', onOpen);\n this.ws.once('error', onError);\n this.ws.once('close', onClose);\n\n const timer = setTimeout(() => {\n cleanup();\n reject(new Error(`Inworld realtime WebSocket connection timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n });\n }\n\n /**\n * Resolves on the first `session.updated` event. Inworld emits\n * `session.created` immediately on connect (despite older docs claiming\n * otherwise), but `session.updated` is the canonical handshake completion\n * because our `connect()` sends a `session.update` before declaring ready.\n *\n * Rejects with a clear error if the server does not acknowledge within\n * `timeoutMs` — otherwise `connect()` would hang forever on a half-open\n * socket.\n */\n waitForSessionCreated(\n timeoutMs: number = this.options.connectTimeoutMs ?? DEFAULT_CONNECT_TIMEOUT_MS,\n ): Promise<void> {\n return new Promise((resolve, reject) => {\n const ws = this.ws;\n let transportAttached = false;\n const cleanup = () => {\n clearTimeout(timer);\n this.client.removeListener('session.updated', onUpdated);\n ws?.removeListener('open', onOpen);\n if (transportAttached) {\n ws?.removeListener('close', onClose);\n ws?.removeListener('error', onError);\n }\n };\n const onUpdated = () => {\n cleanup();\n resolve();\n };\n // Only listen for close/error AFTER the socket is open. `waitForOpen()`\n // owns pre-open transport failures; attaching here too would double-reject\n // (and surface unhandled rejections, since `connect()` only awaits the\n // open promise on that path).\n const onClose = (code?: number, reason?: Buffer) => {\n cleanup();\n reject(\n new Error(\n `Inworld realtime websocket closed during handshake (code=${code ?? '?'}, reason=${reason?.toString() || 'n/a'})`,\n ),\n );\n };\n const onError = (err: Error) => {\n cleanup();\n reject(err);\n };\n const attachTransport = () => {\n if (transportAttached) return;\n transportAttached = true;\n ws?.once('close', onClose);\n ws?.once('error', onError);\n };\n const onOpen = () => attachTransport();\n\n this.client.once('session.updated', onUpdated);\n if (ws && ws.readyState === ws.OPEN) {\n attachTransport();\n } else {\n ws?.once('open', onOpen);\n }\n const timer = setTimeout(() => {\n cleanup();\n reject(new Error(`Inworld realtime session handshake timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n });\n }\n\n /**\n * Open the websocket, send the initial `session.update`, and wait for\n * `session.updated`.\n *\n * URL contract: Inworld's Realtime WebSocket requires a client-generated\n * session ID (`?key=...`) and `&protocol=realtime`. The model is configured\n * via the initial `session.update`, NOT the URL.\n *\n * A pre-open error/close on the WebSocket — or a timeout exceeding\n * `connectTimeoutMs` (15s default) — surfaces as a rejected promise\n * instead of an uncaught socket error. On reject, the half-open socket\n * is closed.\n */\n async connect({ requestContext }: { requestContext?: RequestContext } = {}) {\n const baseUrl = this.options.url || DEFAULT_URL;\n const url = `${baseUrl}?key=${encodeURIComponent(this.sessionId)}&protocol=realtime`;\n const apiKey = this.options.apiKey || process.env.INWORLD_API_KEY;\n if (!apiKey) {\n throw new Error(\n 'Missing Inworld API key. Pass `apiKey` to InworldRealtimeVoice or set INWORLD_API_KEY. Keys ship pre-Basic-encoded; paste verbatim.',\n );\n }\n this.requestContext = requestContext;\n\n this.ws = new WebSocket(url, undefined, {\n headers: {\n // Inworld API keys are pre-Basic-encoded; pass verbatim.\n Authorization: 'Basic ' + apiKey,\n },\n });\n\n this.setupEventListeners();\n\n let ready: Promise<void> | undefined;\n try {\n const opened = this.waitForOpen();\n ready = this.waitForSessionCreated();\n await opened;\n\n // Compose the connect-time defaults. The typed `session` field is\n // deep-merged on top in updateConfig() (and `providerData` is nested under\n // `session.providerData` there). `turn_detection` and `transcription` are\n // each opted out by setting them to `null` in `session`; we also skip a\n // default whenever `session` supplies that field explicitly, so the user's\n // shape doesn't inherit our defaults' nested fields.\n const userTd = this.userTurnDetection();\n const userTranscription = this.userTranscription();\n const audio: NonNullable<InworldSessionConfig['audio']> = {\n output: { voice: this.speaker },\n };\n const input: NonNullable<InworldSessionConfig['audio']>['input'] = {};\n if (userTd === undefined) {\n input.turn_detection = { ...DEFAULT_TURN_DETECTION };\n }\n if (userTranscription === undefined) {\n input.transcription = { ...DEFAULT_TRANSCRIPTION };\n }\n if (Object.keys(input).length > 0) {\n audio.input = input;\n }\n const initial: Partial<InworldSessionConfig> = {\n model: this.options.model || DEFAULT_MODEL,\n instructions: this.instructions,\n tools: transformTools(this.tools),\n audio,\n };\n this.updateConfig(initial);\n\n await ready;\n this.state = 'open';\n } catch (err) {\n // Close the half-open socket so we don't leak file descriptors.\n try {\n this.ws?.close();\n } catch {\n // ignore\n }\n this.state = 'close';\n this.client.removeAllListeners();\n throw err;\n }\n }\n\n disconnect() {\n this.state = 'close';\n this.ws?.close();\n this.rejectPendingLifecycles();\n this.client.removeAllListeners();\n this.endActiveStreams?.();\n this.activeResponseIds.clear();\n this.writingSource.clear();\n this.lastMemoryVersion = undefined;\n }\n\n /**\n * Reject any in-flight `speak()` awaiters. Called from `close()`/`disconnect()`\n * so a consumer cleanup pattern never hangs waiting for a `response.done`\n * that will never arrive.\n */\n private rejectPendingLifecycles(): void {\n if (this.pendingLifecycleRejecters.size === 0) return;\n const err = new Error('Inworld realtime voice closed while a response was in flight');\n for (const rej of this.pendingLifecycleRejecters) rej(err);\n this.pendingLifecycleRejecters.clear();\n }\n\n async send(audioData: NodeJS.ReadableStream | Int16Array, eventId?: string): Promise<void> {\n if (!this.state || this.state !== 'open') {\n console.warn('Cannot send audio when not open. Call connect() 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 async answer({ options }: { options?: Record<string, unknown> } = {}) {\n this.sendEvent('response.create', { response: options ?? {} });\n }\n\n /**\n * Manually commit buffered input audio as a user turn. Use for push-to-talk\n * or manual turn-taking when `turn_detection` is `null` (no auto-VAD).\n */\n commitInput(): void {\n this.sendEvent('input_audio_buffer.commit', {});\n }\n\n /**\n * Discard buffered input audio without committing it as a user turn.\n */\n clearInput(): void {\n this.sendEvent('input_audio_buffer.clear', {});\n }\n\n /**\n * Clear the server's ENTIRE output audio buffer, stopping playback. This also\n * stops any in-flight BACK-CHANNEL audio. The default barge-in path\n * (`response.cancel` on `interrupted`) is back-channel-safe; prefer it. Use\n * `clearOutput()` only when you explicitly want to flush everything.\n */\n clearOutput(): void {\n this.sendEvent('output_audio_buffer.clear', {});\n }\n\n on<E extends keyof InworldVoiceEventMap>(event: E, callback: (data: InworldVoiceEventMap[E]) => void): void;\n on(event: string, callback: EventCallback): void;\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 off<E extends keyof InworldVoiceEventMap>(event: E, callback: (data: InworldVoiceEventMap[E]) => void): void;\n off(event: string, callback: EventCallback): void;\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 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 backchannelStreams = new Map<string, StreamWithId>();\n const functionCallArgs = new Map<string, string>();\n\n if (!this.ws) {\n throw new Error('WebSocket not initialized');\n }\n\n // Wipe stale routing from a previous `connect()` before re-registering.\n // Reconnects (or test resets) would otherwise double-fire every event.\n // Consumer-facing handlers on `this.events` are intentionally preserved.\n this.client.removeAllListeners();\n this.activeResponseIds.clear();\n this.writingSource.clear();\n this.lastMemoryVersion = undefined;\n\n // Lets close()/disconnect() drain the closure-local stream maps below.\n this.endActiveStreams = () => {\n for (const stream of speakerStreams.values()) stream.end();\n speakerStreams.clear();\n for (const stream of backchannelStreams.values()) stream.end();\n backchannelStreams.clear();\n };\n\n this.ws.on('message', message => {\n // Surface malformed inbound frames as `error` events. Without the try,\n // a JSON.parse throw escapes the socket listener and crashes the process.\n let data: any;\n try {\n data = JSON.parse(message.toString());\n } catch (err) {\n this.emit('error', err instanceof Error ? err : new Error(`Invalid server frame: ${String(err)}`));\n return;\n }\n this.client.emit(data.type, data);\n\n if (this.debug) {\n const { delta, ...fields } = data;\n console.info(data.type, fields, delta && delta.length < 100 ? delta : '');\n }\n });\n\n this.client.on('session.created', ev => {\n this.emit('session.created', ev);\n });\n\n this.client.on('session.updated', ev => {\n this.emit('session.updated', ev);\n\n // Inworld echoes its rolling memory state back on the session object.\n // Dedupe by version so a `session.updated` for an unrelated config change\n // doesn't re-emit an unchanged memory snapshot.\n const memoryState: InworldMemoryState | undefined = ev.session?.providerData?.memory?.state;\n if (memoryState) {\n if (memoryState.version === undefined || memoryState.version !== this.lastMemoryVersion) {\n this.lastMemoryVersion = memoryState.version;\n this.emit('memory', memoryState);\n }\n }\n\n const queue = this.queue.splice(0, this.queue.length);\n for (const queued of queue) {\n this.ws?.send(JSON.stringify(queued));\n }\n });\n\n this.client.on('response.created', ev => {\n this.activeResponseIds.add(ev.response.id);\n this.emit('response.created', ev);\n\n const speakerStream = new PassThrough() as StreamWithId;\n speakerStream.id = ev.response.id;\n\n speakerStreams.set(ev.response.id, speakerStream);\n this.emit('speaker', speakerStream);\n });\n\n // GA-spec per-item lifecycle: `added` (item appended) and `done` (item\n // finished). Surface both upward so consumers can drive UI from either edge.\n this.client.on('conversation.item.added', ev => {\n this.emit('conversation.item.added', ev);\n });\n this.client.on('conversation.item.done', ev => {\n this.emit('conversation.item.done', ev);\n });\n\n // Barge-in. We fire `interrupted` (and a server-side `response.cancel`)\n // for each in-flight response from multiple \"user is speaking now\" signals,\n // because semantic_vad doesn't always emit `speech_started` quickly enough\n // when the bot's own audio is bleeding into the mic. The dedupe set keeps\n // us from emitting twice per response when several signals fire in a row.\n const interruptedFor = new Set<string>();\n const fireInterruptedForActive = () => {\n if (this.activeResponseIds.size === 0) return;\n const td = this.userTurnDetection() ?? DEFAULT_TURN_DETECTION;\n const shouldCancel = td?.interrupt_response !== false;\n for (const responseId of this.activeResponseIds) {\n if (interruptedFor.has(responseId)) continue;\n interruptedFor.add(responseId);\n const payload = { response_id: responseId };\n this.emit('interrupted', payload);\n // Internal channel for `speak()`'s awaiter (see awaitResponseLifecycle).\n this.client.emit('interrupted', payload);\n if (shouldCancel) {\n this.sendEvent('response.cancel', { response_id: responseId });\n }\n }\n };\n\n this.client.on('input_audio_buffer.speech_started', ev => {\n this.emit('speech-started', ev);\n fireInterruptedForActive();\n });\n this.client.on('input_audio_buffer.speech_stopped', ev => {\n this.emit('speech-stopped', ev);\n });\n\n // Smart-turn endpointing + manual turn-taking acks. These re-emit the raw\n // server events under ergonomic names; the trailing/duration/inference\n // timings are optional and passed through only when present.\n this.client.on('input_audio_buffer.turn_suggestion', ev => {\n this.emit('turn-suggestion', {\n item_id: ev.item_id,\n utterance_index: ev.utterance_index,\n probability: ev.probability,\n trailing_silence_ms: ev.trailing_silence_ms,\n audio_duration_ms: ev.audio_duration_ms,\n inference_ms: ev.inference_ms,\n });\n });\n this.client.on('input_audio_buffer.turn_suggestion_revoked', ev => {\n this.emit('turn-suggestion-revoked', { item_id: ev.item_id, utterance_index: ev.utterance_index });\n });\n this.client.on('input_audio_buffer.committed', ev => {\n this.emit('input-committed', { item_id: ev.item_id, previous_item_id: ev.previous_item_id });\n });\n this.client.on('input_audio_buffer.cleared', () => {\n this.emit('input-cleared', {});\n });\n this.client.on('input_audio_buffer.timeout_triggered', ev => {\n this.emit('input-timeout', {\n audio_start_ms: ev.audio_start_ms,\n audio_end_ms: ev.audio_end_ms,\n item_id: ev.item_id,\n });\n });\n\n // Output playback-state signals. None carry a response_id on the wire.\n this.client.on('output_audio_buffer.started', () => {\n this.emit('output-audio-started', {});\n });\n this.client.on('output_audio_buffer.stopped', () => {\n this.emit('output-audio-stopped', {});\n });\n this.client.on('output_audio_buffer.cleared', () => {\n this.emit('output-audio-cleared', {});\n });\n // STT deltas are a near-realtime \"user is talking\" signal that fires even\n // when semantic_vad has suppressed `speech_started`. Treat the first one\n // during an active response as a barge-in trigger.\n this.client.on('conversation.item.input_audio_transcription.delta', () => {\n fireInterruptedForActive();\n });\n\n // GA spec audio deltas (NOT preview-spec `response.audio.delta`).\n this.client.on('response.output_audio.delta', ev => {\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 this.client.on('response.output_audio.done', ev => {\n this.emit('speaking.done', { response_id: ev.response_id });\n\n const stream = speakerStreams.get(ev.response_id);\n stream?.end();\n });\n\n // Inworld can emit both `output_audio_transcript.delta` AND\n // `output_text.delta` for the same response when audio+text modalities\n // are both active. Lock the canonical `writing` source on the first\n // delta seen for the response_id (symmetric: whichever stream arrives\n // first wins). The trailing `\\n` on `.done` follows the same lock so it\n // only fires for the chosen source.\n this.client.on('response.output_audio_transcript.delta', ev => {\n const src = this.writingSource.get(ev.response_id);\n if (src === undefined) this.writingSource.set(ev.response_id, 'audio_transcript');\n else if (src !== 'audio_transcript') return;\n this.emit('writing', { text: ev.delta, response_id: ev.response_id, role: 'assistant' });\n });\n this.client.on('response.output_audio_transcript.done', ev => {\n if (this.writingSource.get(ev.response_id) !== 'audio_transcript') return;\n this.emit('writing', { text: '\\n', response_id: ev.response_id, role: 'assistant' });\n });\n\n this.client.on('response.output_text.delta', ev => {\n const src = this.writingSource.get(ev.response_id);\n if (src === undefined) this.writingSource.set(ev.response_id, 'text');\n else if (src !== 'text') return;\n this.emit('writing', { text: ev.delta, response_id: ev.response_id, role: 'assistant' });\n });\n this.client.on('response.output_text.done', ev => {\n if (this.writingSource.get(ev.response_id) !== 'text') return;\n this.emit('writing', { text: '\\n', response_id: ev.response_id, role: 'assistant' });\n });\n\n // User-side ASR. Transcription defaults to `inworld/inworld-stt-1` (set it\n // to `null` in `session`/`providerData` to disable). The OpenAI\n // Realtime GA spec describes `.delta` events as additive chunks, but Inworld\n // currently sends rolling-rewrite deltas (each one is the full transcript\n // so far). Streaming those naively would duplicate text, so we ignore deltas\n // and emit the final transcript once on `.completed`.\n this.client.on('conversation.item.input_audio_transcription.completed', ev => {\n // Voice profile (age/gender/emotion/...) rides along on the completed\n // transcript when `providerData.stt.voice_profile` is enabled. Attach it\n // to the user `writing` emit; it's optional and may be undefined.\n const voiceProfile: InworldVoiceProfile | undefined = ev.providerData?.voiceProfile;\n if (typeof ev.transcript === 'string' && ev.transcript.length > 0) {\n this.emit('writing', { text: ev.transcript, response_id: ev.item_id, role: 'user', voiceProfile });\n }\n this.emit('writing', { text: '\\n', response_id: ev.item_id, role: 'user' });\n });\n\n // Inworld uses the SINGULAR `function_call_arguments` (docs claim plural;\n // the live API emits singular). Accumulate the argument JSON across deltas\n // and parse on `.done` to expose a complete payload.\n this.client.on('response.function_call_arguments.delta', ev => {\n const prev = functionCallArgs.get(ev.call_id) || '';\n functionCallArgs.set(ev.call_id, prev + (ev.delta || ''));\n });\n this.client.on('response.function_call_arguments.done', ev => {\n const args = functionCallArgs.get(ev.call_id) ?? ev.arguments ?? '';\n functionCallArgs.delete(ev.call_id);\n this.emit('function_call.arguments', {\n call_id: ev.call_id,\n name: ev.name,\n arguments: args,\n });\n });\n\n // Back-channel audio. Short acknowledgements (\"uh-huh\", \"right\") that the\n // model emits while the user is still talking. Mirrors the `speaker` stream\n // pattern: a PassThrough per `backchannel_id`, written from base64 deltas.\n this.client.on('response.backchannel.audio.delta', ev => {\n const audio = Buffer.from(ev.delta, 'base64');\n let stream = backchannelStreams.get(ev.backchannel_id);\n if (!stream) {\n stream = new PassThrough() as StreamWithId;\n stream.id = ev.backchannel_id;\n backchannelStreams.set(ev.backchannel_id, stream);\n this.emit('backchannel', stream);\n }\n stream.write(audio);\n });\n this.client.on('response.backchannel.audio.done', ev => {\n const stream = backchannelStreams.get(ev.backchannel_id);\n stream?.end();\n backchannelStreams.delete(ev.backchannel_id);\n this.emit('backchannel.done', { backchannel_id: ev.backchannel_id, phrase: ev.phrase });\n });\n // The decider can skip a back-channel before any audio is produced.\n this.client.on('response.backchannel.skipped', ev => {\n this.emit('backchannel.skipped', { reason: ev.reason });\n });\n\n this.client.on('response.done', ev => {\n // Emit + clean up FIRST so downstream `response.done` observers and\n // barge-in logic don't sit behind tool latency, then kick off tool work.\n this.emit('response.done', ev);\n speakerStreams.delete(ev.response.id);\n this.activeResponseIds.delete(ev.response.id);\n this.writingSource.delete(ev.response.id);\n interruptedFor.delete(ev.response.id);\n void this.handleFunctionCalls(ev).catch(err => {\n this.emit('error', err instanceof Error ? err : new Error(String(err)));\n });\n });\n\n this.client.on('error', async ev => {\n this.emit('error', ev);\n });\n }\n\n /**\n * Returns the user-supplied `turn_detection` value (or `null` for explicit\n * opt-out), or `undefined` when it isn't set. `turn_detection` is a standard\n * `audio.input` field (not a providerData extension), so it's read only from\n * `session`. Used to decide whether to apply `DEFAULT_TURN_DETECTION`.\n */\n private userTurnDetection(): InworldTurnDetection | null | undefined {\n return this.session?.audio?.input?.turn_detection;\n }\n\n /**\n * Returns the user-supplied `transcription` value (or `null` for explicit\n * opt-out), or `undefined` when it isn't set. `transcription` is a standard\n * `audio.input` field (not a providerData extension), so it's read only from\n * `session`. Used to decide whether to apply `DEFAULT_TRANSCRIPTION`.\n */\n private userTranscription(): InworldInputTranscription | null | undefined {\n return this.session?.audio?.input?.transcription;\n }\n\n private async handleFunctionCalls(ev: any) {\n for (const output of ev.response?.output ?? []) {\n if (output.type === 'function_call') {\n await this.handleFunctionCall(output);\n }\n }\n }\n\n private async handleFunctionCall(output: any) {\n try {\n // Zero-arg tools come back with `arguments: \"\"` (or missing); treat\n // that as `{}` so the Zod input parse doesn't blow up on no-args.\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 } finally {\n this.sendEvent('response.create', {});\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\nexport type {\n InworldAudioConfig,\n InworldAudioFormat,\n InworldAudioInput,\n InworldAudioOutput,\n InworldBackchannelProviderData,\n InworldInputTranscription,\n InworldMemoryProviderData,\n InworldMemoryState,\n InworldNoiseReduction,\n InworldProviderData,\n InworldResponseConfig,\n InworldResponsivenessProviderData,\n InworldSessionConfig,\n InworldSttProviderData,\n InworldToolChoice,\n InworldTracing,\n InworldTtsProviderData,\n InworldTurnDetection,\n InworldVoiceEventMap,\n InworldVoiceProfile,\n InworldVoiceProfileLabel,\n} from './types';\n","import { PassThrough } from 'node:stream';\nimport { MastraVoice } from '@internal/voice';\n\nconst INWORLD_API_BASE = 'https://api.inworld.ai';\n\ntype InworldTtsModel = 'inworld-tts-2' | 'inworld-tts-1.5-max' | 'inworld-tts-1.5-mini';\n\ntype DeliveryMode = 'STABLE' | 'BALANCED' | 'CREATIVE';\n\ntype InworldSttModel = 'groq/whisper-large-v3';\n\ntype AudioEncoding = 'LINEAR16' | 'MP3' | 'OGG_OPUS' | 'ALAW' | 'MULAW' | 'FLAC' | 'PCM' | 'WAV';\n\ntype SttAudioEncoding = 'LINEAR16' | 'MP3' | 'OGG_OPUS' | 'FLAC' | 'AUTO_DETECT';\n\ninterface InworldVoiceConfig {\n name?: InworldTtsModel;\n apiKey?: string;\n}\n\ninterface InworldListeningConfig {\n name?: InworldSttModel;\n apiKey?: string;\n}\n\ninterface InworldSpeakOptions {\n speaker?: string;\n audioEncoding?: AudioEncoding;\n sampleRateHertz?: number;\n speakingRate?: number;\n temperature?: number;\n deliveryMode?: DeliveryMode;\n language?: string;\n}\n\ninterface InworldListenOptions {\n audioEncoding?: SttAudioEncoding;\n sampleRateHertz?: number;\n language?: string;\n numberOfChannels?: number;\n}\n\nexport type {\n InworldVoiceConfig,\n InworldListeningConfig,\n InworldSpeakOptions,\n InworldListenOptions,\n InworldTtsModel,\n InworldSttModel,\n AudioEncoding,\n SttAudioEncoding,\n DeliveryMode,\n};\n\nexport class InworldVoice extends MastraVoice {\n private speechApiKey: string;\n private listeningApiKey: string;\n private audioEncoding: AudioEncoding;\n private sampleRateHertz: number;\n private language: string;\n\n /**\n * Creates an instance of the InworldVoice class.\n *\n * @param {Object} options - The options for the voice configuration.\n * @param {InworldVoiceConfig} [options.speechModel] - TTS model config. Default: inworld-tts-2.\n * @param {InworldListeningConfig} [options.listeningModel] - STT model config. Default: groq/whisper-large-v3.\n * @param {string} [options.speaker] - Default voice ID. Default: 'Dennis'.\n * @param {AudioEncoding} [options.audioEncoding] - TTS audio format. Default: 'MP3'.\n * @param {number} [options.sampleRateHertz] - TTS sample rate. Default: 48000.\n * @param {string} [options.language] - STT language (BCP-47). Default: 'en-US'.\n *\n * @throws {Error} If no API key is provided or found in INWORLD_API_KEY env var.\n */\n constructor({\n speechModel,\n listeningModel,\n speaker,\n audioEncoding,\n sampleRateHertz,\n language,\n }: {\n speechModel?: InworldVoiceConfig;\n listeningModel?: InworldListeningConfig;\n speaker?: string;\n audioEncoding?: AudioEncoding;\n sampleRateHertz?: number;\n language?: string;\n } = {}) {\n // Resolve TTS and STT keys independently so callers can scope credentials\n // per service. If only one model is configured with a key, it is reused as\n // the fallback for the other (preserving the \"one key works everywhere\"\n // ergonomic). The INWORLD_API_KEY env var is the final fallback.\n const envKey = process.env.INWORLD_API_KEY;\n const speechApiKey = speechModel?.apiKey ?? listeningModel?.apiKey ?? envKey;\n const listeningApiKey = listeningModel?.apiKey ?? speechModel?.apiKey ?? envKey;\n\n if (!speechApiKey || !listeningApiKey) {\n throw new Error(\n 'Inworld API key is required. Pass apiKey in speechModel/listeningModel config or set INWORLD_API_KEY env var.',\n );\n }\n\n super({\n speechModel: {\n name: speechModel?.name ?? 'inworld-tts-2',\n apiKey: speechApiKey,\n },\n listeningModel: {\n name: listeningModel?.name ?? 'groq/whisper-large-v3',\n apiKey: listeningApiKey,\n },\n speaker: speaker ?? 'Dennis',\n });\n\n this.speechApiKey = speechApiKey;\n this.listeningApiKey = listeningApiKey;\n this.audioEncoding = audioEncoding ?? 'MP3';\n this.sampleRateHertz = sampleRateHertz ?? 48000;\n this.language = language ?? 'en-US';\n }\n\n /**\n * Retrieves a list of available voices from the Inworld API.\n *\n * @returns {Promise<Array<{ voiceId: string; name: string; language: string; description: string; tags: string[]; source: string }>>}\n */\n async getSpeakers() {\n const response = await fetch(`${INWORLD_API_BASE}/voices/v1/voices`, {\n headers: { Authorization: `Basic ${this.speechApiKey}` },\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Inworld list voices failed (${response.status}): ${text}`);\n }\n\n const data = (await response.json()) as {\n voices?: Array<{\n voiceId: string;\n displayName?: string;\n langCode?: string;\n description?: string;\n tags?: string[];\n source?: string;\n }>;\n };\n\n return (\n data.voices?.map(v => ({\n voiceId: v.voiceId,\n name: v.displayName ?? v.voiceId,\n language: v.langCode ?? 'en',\n description: v.description ?? '',\n tags: v.tags ?? [],\n source: v.source ?? 'SYSTEM',\n })) ?? []\n );\n }\n\n /**\n * Checks if listening capabilities are enabled.\n */\n async getListener() {\n return { enabled: !!this.listeningModel };\n }\n\n /**\n * Converts text to speech using Inworld's streaming TTS endpoint.\n *\n * Returns a ReadableStream that emits audio chunks progressively as they\n * arrive from the API — following the same streaming pattern used by the\n * Deepgram and PlayAI Mastra voice providers.\n *\n * Uses the `/tts/v1/voice:stream` endpoint which returns newline-delimited\n * JSON, each line containing a base64-encoded audio chunk.\n *\n * @param {string | NodeJS.ReadableStream} input - Text or stream to convert to speech.\n * @param {InworldSpeakOptions} [options] - TTS options.\n * @returns {Promise<NodeJS.ReadableStream>} Progressive audio stream.\n */\n async speak(\n input: string | NodeJS.ReadableStream,\n options?: InworldSpeakOptions & { speaker?: string },\n ): Promise<NodeJS.ReadableStream> {\n const text = typeof input === 'string' ? input : await this.streamToString(input);\n\n if (text.trim().length === 0) {\n throw new Error('Input text is empty');\n }\n\n const speaker = options?.speaker ?? this.speaker;\n\n const body = {\n text,\n voiceId: speaker,\n modelId: this.speechModel?.name ?? 'inworld-tts-2',\n audioConfig: {\n audioEncoding: options?.audioEncoding ?? this.audioEncoding,\n sampleRateHertz: options?.sampleRateHertz ?? this.sampleRateHertz,\n ...(options?.speakingRate !== undefined && { speakingRate: options.speakingRate }),\n },\n ...(options?.temperature !== undefined && { temperature: options.temperature }),\n ...(options?.deliveryMode !== undefined && { deliveryMode: options.deliveryMode }),\n ...(options?.language !== undefined && { language: options.language }),\n };\n\n const response = await fetch(`${INWORLD_API_BASE}/tts/v1/voice:stream`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Basic ${this.speechApiKey}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Inworld TTS failed (${response.status}): ${errorText}`);\n }\n\n if (!response.body) {\n throw new Error('Inworld TTS streaming response has no body');\n }\n\n // Progressive streaming: return the PassThrough immediately while reading\n // NDJSON chunks from the response body in a background async task.\n const outputStream = new PassThrough();\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n // Write with backpressure: await drain when the consumer is slow.\n const writeChunk = async (data: Buffer) => {\n if (outputStream.destroyed) return;\n if (!outputStream.write(data)) {\n await new Promise<void>((resolve, reject) => {\n outputStream.once('drain', resolve);\n outputStream.once('close', resolve);\n outputStream.once('error', reject);\n });\n }\n };\n\n // Cancel the upstream reader when the consumer closes early.\n outputStream.once('close', () => {\n void reader.cancel().catch(() => {});\n });\n\n void (async () => {\n try {\n while (true) {\n if (outputStream.destroyed) {\n void reader.cancel().catch(() => {});\n break;\n }\n\n const { done, value } = await reader.read();\n if (done) {\n // Process any remaining data in the buffer before ending\n const remaining = buffer.trim();\n if (remaining) {\n const chunk = JSON.parse(remaining);\n const audioContent = chunk.result?.audioContent ?? chunk.audioContent;\n if (audioContent) {\n await writeChunk(Buffer.from(audioContent, 'base64'));\n }\n }\n outputStream.end();\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n if (outputStream.destroyed) {\n void reader.cancel().catch(() => {});\n return;\n }\n\n const chunk = JSON.parse(trimmed);\n const audioContent = chunk.result?.audioContent ?? chunk.audioContent;\n if (audioContent) {\n await writeChunk(Buffer.from(audioContent, 'base64'));\n }\n }\n }\n } catch (err) {\n if (!outputStream.destroyed) {\n outputStream.destroy(err instanceof Error ? err : new Error(String(err)));\n }\n void reader.cancel().catch(() => {});\n }\n })().catch(() => {});\n\n return outputStream;\n }\n\n /**\n * Converts audio to text using Inworld's batch STT endpoint.\n *\n * @param {NodeJS.ReadableStream} input - Audio stream to transcribe.\n * @param {InworldListenOptions} [options] - STT options.\n * @returns {Promise<string>} Transcribed text.\n */\n async listen(input: NodeJS.ReadableStream, options?: InworldListenOptions): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of input) {\n chunks.push(typeof chunk === 'string' ? Buffer.from(chunk) : (chunk as Buffer));\n }\n const audioBase64 = Buffer.concat(chunks).toString('base64');\n\n const body = {\n transcribeConfig: {\n modelId: this.listeningModel?.name ?? 'groq/whisper-large-v3',\n audioEncoding: options?.audioEncoding ?? 'AUTO_DETECT',\n language: options?.language ?? this.language,\n sampleRateHertz: options?.sampleRateHertz ?? 16000,\n numberOfChannels: options?.numberOfChannels ?? 1,\n },\n audioData: {\n content: audioBase64,\n },\n };\n\n const response = await fetch(`${INWORLD_API_BASE}/stt/v1/transcribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Basic ${this.listeningApiKey}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Inworld STT failed (${response.status}): ${text}`);\n }\n\n const result = (await response.json()) as {\n transcription?: {\n transcript?: string;\n isFinal?: boolean;\n };\n };\n\n return result.transcription?.transcript ?? '';\n }\n\n private async streamToString(stream: NodeJS.ReadableStream): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of stream) {\n chunks.push(typeof chunk === 'string' ? Buffer.from(chunk) : (chunk as Buffer));\n }\n return Buffer.concat(chunks).toString('utf-8');\n }\n}\n\nexport * from './realtime';\n"]}
|