@teamlearners/clawops 0.5.8 → 0.6.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/agent/audio.ts","../../src/agent/logger.ts","../../src/agent/control-ws.ts","../../src/agent/mcp/client.ts","../../src/agent/media-ws.ts","../../src/agent/recorder.ts","../../src/agent/session.ts","../../src/agent/builtin-tool.ts","../../src/agent/tool.ts","../../src/agent/tracing/config.ts","../../src/agent/tracing/spans.ts","../../src/agent/tracing/attributes.ts","../../src/agent/agent.ts","../../src/agent/pipeline/builtin-tool-schemas.ts","../../src/agent/pipeline/pipeline-session.ts","../../src/agent/pipeline/realtime/openai-realtime.ts","../../src/agent/pipeline/realtime/gemini-realtime.ts","../../src/agent/pipeline/stt/deepgram-stt.ts","../../src/agent/pipeline/tts/elevenlabs-tts.ts","../../src/agent/pipeline/llm/openai-llm.ts","../../src/agent/pipeline/llm/anthropic-llm.ts","../../src/agent/pipeline/llm/gemini-llm.ts","../../src/agent/pipeline/llm/openai-compat-llm.ts","../../src/agent/pipeline/llm/ollama-llm.ts","../../src/agent/pipeline/llm/mistral-llm.ts","../../src/agent/pipeline/llm/groq-llm.ts","../../src/agent/pipeline/llm/perplexity-llm.ts","../../src/agent/pipeline/llm/together-llm.ts","../../src/agent/pipeline/llm/fireworks-llm.ts","../../src/agent/pipeline/llm/deepseek-llm.ts","../../src/agent/pipeline/llm/xai-llm.ts","../../src/agent/mcp/stdio.ts","../../src/agent/mcp/http.ts"],"names":["pino","path","fs","digit","BuiltinTool","DEFAULT_BASE_URL","AgentError","AgentConnectionError","result","pcm8k"],"mappings":"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A;AAAA,EACxD,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAS,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAS,GAAA;AAAA,EAAQ,GAAA;AAAA,EACxD,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EACxD,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EACxD,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAA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","file":"index.cjs","sourcesContent":["/**\n * Audio codec utilities: PCM16 <-> ulaw conversion and resampling.\n */\n\nconst _BIAS = 0x84;\nconst _CLIP = 32635;\n\n// prettier-ignore\nconst DECODE_TABLE: readonly number[] = [\n -32124, -31100, -30076, -29052, -28028, -27004, -25980, -24956,\n -23932, -22908, -21884, -20860, -19836, -18812, -17788, -16764,\n -15996, -15484, -14972, -14460, -13948, -13436, -12924, -12412,\n -11900, -11388, -10876, -10364, -9852, -9340, -8828, -8316,\n -7932, -7676, -7420, -7164, -6908, -6652, -6396, -6140,\n -5884, -5628, -5372, -5116, -4860, -4604, -4348, -4092,\n -3900, -3772, -3644, -3516, -3388, -3260, -3132, -3004,\n -2876, -2748, -2620, -2492, -2364, -2236, -2108, -1980,\n -1884, -1820, -1756, -1692, -1628, -1564, -1500, -1436,\n -1372, -1308, -1244, -1180, -1116, -1052, -988, -924,\n -876, -844, -812, -780, -748, -716, -684, -652,\n -620, -588, -556, -524, -492, -460, -428, -396,\n -372, -356, -340, -324, -308, -292, -276, -260,\n -244, -228, -212, -196, -180, -164, -148, -132,\n -120, -112, -104, -96, -88, -80, -72, -64,\n -56, -48, -40, -32, -24, -16, -8, 0,\n 32124, 31100, 30076, 29052, 28028, 27004, 25980, 24956,\n 23932, 22908, 21884, 20860, 19836, 18812, 17788, 16764,\n 15996, 15484, 14972, 14460, 13948, 13436, 12924, 12412,\n 11900, 11388, 10876, 10364, 9852, 9340, 8828, 8316,\n 7932, 7676, 7420, 7164, 6908, 6652, 6396, 6140,\n 5884, 5628, 5372, 5116, 4860, 4604, 4348, 4092,\n 3900, 3772, 3644, 3516, 3388, 3260, 3132, 3004,\n 2876, 2748, 2620, 2492, 2364, 2236, 2108, 1980,\n 1884, 1820, 1756, 1692, 1628, 1564, 1500, 1436,\n 1372, 1308, 1244, 1180, 1116, 1052, 988, 924,\n 876, 844, 812, 780, 748, 716, 684, 652,\n 620, 588, 556, 524, 492, 460, 428, 396,\n 372, 356, 340, 324, 308, 292, 276, 260,\n 244, 228, 212, 196, 180, 164, 148, 132,\n 120, 112, 104, 96, 88, 80, 72, 64,\n 56, 48, 40, 32, 24, 16, 8, 0,\n];\n\nfunction encodeUlawSample(sample: number): number {\n let sign = 0;\n if (sample < 0) {\n sign = 0x80;\n sample = -sample;\n }\n if (sample > _CLIP) {\n sample = _CLIP;\n }\n sample += _BIAS;\n\n let exponent = 7;\n const expValues = [0x4000, 0x2000, 0x1000, 0x0800, 0x0400, 0x0200, 0x0100];\n for (const expVal of expValues) {\n if (sample >= expVal) {\n break;\n }\n exponent -= 1;\n }\n\n const mantissa = (sample >> (exponent + 3)) & 0x0f;\n return ~(sign | (exponent << 4) | mantissa) & 0xff;\n}\n\n/**\n * Convert PCM16 little-endian audio to ulaw.\n */\nexport function pcm16ToUlaw(pcm: Buffer): Buffer {\n if (!pcm.length) return Buffer.alloc(0);\n const nSamples = pcm.length >> 1;\n const out = Buffer.alloc(nSamples);\n for (let i = 0; i < nSamples; i++) {\n const sample = pcm.readInt16LE(i * 2);\n out[i] = encodeUlawSample(sample);\n }\n return out;\n}\n\n/**\n * Convert ulaw audio to PCM16 little-endian.\n */\nexport function ulawToPcm16(ulaw: Buffer): Buffer {\n if (!ulaw.length) return Buffer.alloc(0);\n const out = Buffer.alloc(ulaw.length * 2);\n for (let i = 0; i < ulaw.length; i++) {\n out.writeInt16LE(DECODE_TABLE[ulaw[i]!]!, i * 2);\n }\n return out;\n}\n\n/**\n * Resample PCM16 audio using linear interpolation.\n */\nexport function resamplePcm16(pcm: Buffer, fromRate: number, toRate: number): Buffer {\n if (fromRate === toRate || !pcm.length) return pcm;\n\n const nSamples = pcm.length >> 1;\n const ratio = fromRate / toRate;\n const outLen = Math.floor(nSamples / ratio);\n const out = Buffer.alloc(outLen * 2);\n\n for (let i = 0; i < outLen; i++) {\n const srcPos = i * ratio;\n const idx = Math.floor(srcPos);\n const frac = srcPos - idx;\n\n let val: number;\n if (idx + 1 < nSamples) {\n val = pcm.readInt16LE(idx * 2) * (1 - frac) + pcm.readInt16LE((idx + 1) * 2) * frac;\n } else {\n val = pcm.readInt16LE(idx * 2);\n }\n out.writeInt16LE(Math.round(val), i * 2);\n }\n\n return out;\n}\n\nexport { DECODE_TABLE };\n","/**\n * Logger factory for the ClawOps agent module.\n *\n * Provides a 2-level hierarchy matching the Python SDK:\n * - clawops.agent (core: agent, session, control-ws, media-ws, recorder, mcp, realtime)\n * - clawops.agent.pipeline (pipeline: pipeline-session, stt, tts)\n */\n\nimport pino from 'pino';\nimport type { Logger } from 'pino';\n\nconst DEFAULT_LOGGER = pino({ name: 'clawops.agent' });\n\n/** A silent logger that discards all output. */\nexport const NOOP_LOGGER = pino({ level: 'silent' });\n\n/**\n * Create or return an agent-level logger.\n * If no user logger is provided, returns the default pino instance.\n */\nexport function createAgentLogger(userLogger?: Logger): Logger {\n return userLogger ?? DEFAULT_LOGGER;\n}\n\n/**\n * Create a pipeline child logger from a parent agent logger.\n * Adds `{ module: 'pipeline' }` to all log entries.\n */\nexport function createPipelineLogger(parent: Logger): Logger {\n return parent.child({ module: 'pipeline' });\n}\n\nexport type { Logger };\n","/**\n * Control WebSocket for agent signaling (call.incoming, call.ended, etc.).\n */\n\nimport type { WebSocket as WsType } from 'ws';\nimport type { Logger } from 'pino';\nimport { NOOP_LOGGER } from './logger.js';\n\nexport interface ControlWsOptions {\n baseUrl: string;\n apiKey: string;\n accountId: string;\n /** Phone number to register on. */\n number?: string;\n}\n\n/**\n * Control event is a flat JSON object with an 'event' field.\n * Example: { \"event\": \"call.incoming\", \"callId\": \"xxx\", \"from\": \"070...\", \"mediaUrl\": \"wss://...\" }\n */\nexport interface ControlEvent {\n event: string;\n [key: string]: unknown;\n}\n\ntype ControlEventHandler = (event: ControlEvent) => void | Promise<void>;\n\nconst INITIAL_RECONNECT_DELAY = 1000;\nconst MAX_RECONNECT_DELAY = 30000;\n/** Server sends ping every 30s; if no ping arrives within this window, assume dead. */\nconst PING_TIMEOUT = 60000;\n\n/**\n * Build the full control WebSocket URL from options.\n * Matches Python SDK: /v1/accounts/{account_id}/agent/listen?number={number}\n */\nexport function buildControlWsUrl(options: ControlWsOptions): string {\n const scheme = options.baseUrl.startsWith('https') ? 'wss' : 'ws';\n const host = options.baseUrl.replace(/^https?:\\/\\//, '').replace(/\\/$/, '');\n let url = `${scheme}://${host}/v1/accounts/${encodeURIComponent(options.accountId)}/agent/listen`;\n if (options.number) {\n url += `?number=${encodeURIComponent(options.number)}`;\n }\n return url;\n}\n\nexport class ControlWebSocket {\n private _url: string;\n private _ws: WsType | null = null;\n private _handlers: Map<string, ControlEventHandler[]> = new Map();\n private _reconnectDelay = INITIAL_RECONNECT_DELAY;\n private _closed = false;\n private _connectedResolve: (() => void) | null = null;\n private _connectedPromise: Promise<void>;\n private _log: Logger = NOOP_LOGGER;\n private _pingTimer: ReturnType<typeof setTimeout> | null = null;\n\n setLogger(logger: Logger): void {\n this._log = logger;\n }\n\n constructor(private readonly _options: ControlWsOptions) {\n this._url = buildControlWsUrl(_options);\n this._connectedPromise = new Promise<void>((resolve) => {\n this._connectedResolve = resolve;\n });\n }\n\n /** Register an event handler for a specific event type. */\n on(event: string, handler: ControlEventHandler): void {\n let list = this._handlers.get(event);\n if (!list) {\n list = [];\n this._handlers.set(event, list);\n }\n list.push(handler);\n }\n\n /** Connect to the control WebSocket. */\n async connect(): Promise<void> {\n this._closed = false;\n await this._doConnect();\n }\n\n /** Wait until the WebSocket is connected. */\n async waitConnected(): Promise<void> {\n return this._connectedPromise;\n }\n\n /** Send a JSON message over the control WebSocket. */\n send(message: Record<string, unknown>): void {\n if (this._ws && this._ws.readyState === 1 /* OPEN */) {\n this._ws.send(JSON.stringify(message));\n }\n }\n\n /** Close the WebSocket and stop reconnecting. */\n close(): void {\n this._closed = true;\n this._clearPingTimer();\n if (this._ws) {\n this._ws.close();\n this._ws = null;\n }\n }\n\n private async _doConnect(): Promise<void> {\n const { WebSocket } = await import('ws');\n\n const ws = new WebSocket(this._url, {\n followRedirects: true,\n headers: {\n Authorization: `Bearer ${this._options.apiKey}`,\n },\n });\n this._ws = ws;\n\n ws.on('open', () => {\n this._reconnectDelay = INITIAL_RECONNECT_DELAY;\n this._resetPingTimer();\n if (this._connectedResolve) {\n this._connectedResolve();\n this._connectedResolve = null;\n }\n this._log.info('Control WS connected: %s', this._url);\n });\n\n ws.on('ping', () => {\n this._resetPingTimer();\n });\n\n ws.on('message', (data: Buffer | string) => {\n try {\n const msg = JSON.parse(data.toString()) as ControlEvent;\n this._dispatchEvent(msg);\n } catch {\n this._log.warn('Control WS parse error');\n }\n });\n\n ws.on('close', () => {\n this._clearPingTimer();\n if (!this._closed) {\n this._scheduleReconnect();\n }\n });\n\n ws.on('error', (err: Error) => {\n this._log.warn('Control WS error: %s', err.message);\n });\n }\n\n private _dispatchEvent(event: ControlEvent): void {\n const handlers = this._handlers.get(event.event);\n if (handlers) {\n for (const handler of handlers) {\n try {\n const result = handler(event);\n if (result && typeof result.catch === 'function') {\n result.catch((err: unknown) => {\n this._log.error({ err }, 'Control WS handler error: %s', event.event);\n });\n }\n } catch (err) {\n this._log.error({ err }, 'Control WS handler error: %s', event.event);\n }\n }\n }\n }\n\n private _resetPingTimer(): void {\n this._clearPingTimer();\n this._pingTimer = setTimeout(() => {\n this._log.warn('Control WS ping timeout, closing connection');\n if (this._ws) {\n this._ws.terminate();\n }\n }, PING_TIMEOUT);\n }\n\n private _clearPingTimer(): void {\n if (this._pingTimer) {\n clearTimeout(this._pingTimer);\n this._pingTimer = null;\n }\n }\n\n private _scheduleReconnect(): void {\n const delay = this._reconnectDelay;\n this._reconnectDelay = Math.min(this._reconnectDelay * 2, MAX_RECONNECT_DELAY);\n this._log.info('Control WS reconnecting in %ds...', delay / 1000);\n\n setTimeout(() => {\n if (!this._closed) {\n this._doConnect().catch((err) => {\n this._log.warn({ err }, 'Control WS reconnect failed');\n this._scheduleReconnect();\n });\n }\n }, delay);\n }\n}\n","/**\n * MCP (Model Context Protocol) client for discovering and calling tools.\n */\n\nimport type { FunctionTool } from '../tool.js';\nimport type { Logger } from 'pino';\nimport { NOOP_LOGGER } from '../logger.js';\n\nexport interface MCPServerConfig {\n /** Server type discriminator. */\n type: 'stdio' | 'http';\n [key: string]: unknown;\n}\n\nexport interface MCPToolDefinition {\n name: string;\n description: string;\n inputSchema: {\n type: 'object';\n properties: Record<string, unknown>;\n required?: string[];\n };\n}\n\nexport class MCPClient {\n private _servers: Map<string, MCPServerConfig & Record<string, unknown>> = new Map();\n private _clients: Map<string, unknown> = new Map();\n private _log: Logger = NOOP_LOGGER;\n\n setLogger(logger: Logger): void {\n this._log = logger;\n }\n\n /** Add an MCP server configuration. */\n addServer(name: string, config: MCPServerConfig & Record<string, unknown>): void {\n this._servers.set(name, config);\n }\n\n /** Connect to all configured MCP servers and discover tools. */\n async connect(): Promise<FunctionTool[]> {\n const allTools: FunctionTool[] = [];\n\n for (const [name, config] of this._servers) {\n try {\n const tools = await this._connectServer(name, config);\n allTools.push(...tools);\n } catch (err) {\n this._log.error({ err }, 'MCP connection failed: %s', name);\n }\n }\n\n return allTools;\n }\n\n /** Disconnect from all MCP servers. */\n async disconnect(): Promise<void> {\n for (const [name, client] of this._clients) {\n try {\n this._log.debug('MCP closing: %s', name);\n const c = client as { close?: () => Promise<void> };\n if (c.close) {\n await c.close();\n }\n } catch (err) {\n this._log.error({ err }, 'MCP disconnect error: %s', name);\n }\n }\n this._clients.clear();\n }\n\n private async _connectServer(\n name: string,\n config: MCPServerConfig & Record<string, unknown>,\n ): Promise<FunctionTool[]> {\n // Dynamic import to keep @modelcontextprotocol/sdk optional\n const sdk = await import('@modelcontextprotocol/sdk/client/index.js');\n const { Client } = sdk;\n\n const client = new Client({ name: `clawops-${name}`, version: '1.0.0' });\n\n if (config.type === 'stdio') {\n this._log.debug('MCP connecting (stdio): %s', config['command']);\n } else if (config.type === 'http') {\n this._log.debug('MCP connecting (http): %s', config['url']);\n }\n\n let transport: unknown;\n\n if (config.type === 'stdio') {\n const { StdioClientTransport } = await import(\n '@modelcontextprotocol/sdk/client/stdio.js'\n );\n transport = new StdioClientTransport({\n command: config['command'] as string,\n args: (config['args'] as string[]) ?? [],\n env: config['env'] as Record<string, string> | undefined,\n });\n } else if (config.type === 'http') {\n const { StreamableHTTPClientTransport } = await import(\n '@modelcontextprotocol/sdk/client/streamableHttp.js'\n );\n transport = new StreamableHTTPClientTransport(\n new URL(config['url'] as string),\n );\n } else {\n throw new Error(`Unsupported MCP server type: ${config.type}`);\n }\n\n await client.connect(transport as Parameters<typeof client.connect>[0]);\n this._clients.set(name, client);\n\n // Discover tools\n const toolsResult = await client.listTools();\n const tools: FunctionTool[] = [];\n\n for (const toolDef of toolsResult.tools) {\n const inputSchema = toolDef.inputSchema as MCPToolDefinition['inputSchema'];\n tools.push({\n name: toolDef.name,\n description: toolDef.description ?? '',\n parameters: inputSchema.properties ?? {},\n required: inputSchema.required ?? [],\n handler: async (args: Record<string, unknown>) => {\n this._log.debug('MCP call_tool: %s', toolDef.name);\n const result = await client.callTool({\n name: toolDef.name,\n arguments: args,\n });\n // Extract text content from the result\n const content = result.content as Array<{ type: string; text?: string }>;\n if (content && content.length > 0) {\n return content\n .filter((c) => c.type === 'text')\n .map((c) => c.text)\n .join('\\n');\n }\n return JSON.stringify(result);\n },\n });\n }\n\n this._log.info('MCP server connected: %d tools found', tools.length);\n this._log.debug('MCP tools: %s', tools.map(t => t.name));\n\n return tools;\n }\n}\n","/**\n * Media WebSocket for streaming audio to/from the telephony platform.\n *\n * ClawOps VoiceML Stream protocol:\n * connected -> start -> media (G.711 ulaw 8kHz base64) -> mark -> stop\n */\n\nimport type { WebSocket as WsType } from 'ws';\nimport type { Logger } from 'pino';\nimport { NOOP_LOGGER } from './logger.js';\n\nexport interface MediaStartEvent {\n streamId: string;\n callId: string;\n accountId: string;\n sampleRate: number;\n}\n\nexport interface MediaEvent {\n audio: Buffer;\n timestamp: number;\n}\n\nexport interface DtmfEvent {\n digit: string;\n track: string;\n}\n\n/**\n * Parse a 'start' event payload from the media WebSocket.\n */\nexport function parseStartEvent(data: Record<string, unknown>): MediaStartEvent {\n const start = data['start'] as Record<string, unknown>;\n const fmt = (start['mediaFormat'] ?? {}) as Record<string, unknown>;\n return {\n streamId: (start['streamId'] ?? '') as string,\n callId: (start['callId'] ?? '') as string,\n accountId: (start['accountId'] ?? '') as string,\n sampleRate: (fmt['sampleRate'] ?? 8000) as number,\n };\n}\n\n/**\n * Parse a 'media' event payload.\n */\nexport function parseMediaEvent(data: Record<string, unknown>): MediaEvent {\n const media = data['media'] as Record<string, unknown>;\n return {\n audio: Buffer.from((media['payload'] ?? '') as string, 'base64'),\n timestamp: parseInt((media['timestamp'] as string) ?? '0', 10) || 0,\n };\n}\n\n/**\n * Build a media response message to send audio back.\n */\nexport function buildMediaResponse(audioBase64: string): string {\n return JSON.stringify({\n event: 'media',\n media: {\n payload: audioBase64,\n },\n });\n}\n\nconst VALID_DTMF_DIGITS = new Set('0123456789*#');\n\nexport function parseDtmfEvent(data: Record<string, unknown>): DtmfEvent {\n const dtmf = data['dtmf'] as Record<string, unknown>;\n return {\n digit: (dtmf['digit'] ?? '') as string,\n track: (dtmf['track'] ?? '') as string,\n };\n}\n\nexport function buildDtmfMessage(digit: string): string {\n if (!VALID_DTMF_DIGITS.has(digit)) {\n throw new Error(`유효하지 않은 DTMF digit: ${digit}`);\n }\n return JSON.stringify({ event: 'dtmf', dtmf: { digit } });\n}\n\nexport class MediaWebSocket {\n private _ws: WsType | null = null;\n private _audioQueue: string[] = [];\n private _sendLoopRunning = false;\n private _closed = false;\n private _onAudio: ((audio: Buffer, timestamp: number) => void) | null = null;\n private _onStart: ((event: MediaStartEvent) => void) | null = null;\n private _onClose: (() => void) | null = null;\n private _onDtmf: ((digit: string) => void) | null = null;\n private _markWaiters: Map<string, () => void> = new Map();\n private _log: Logger = NOOP_LOGGER;\n\n setLogger(logger: Logger): void {\n this._log = logger;\n }\n\n /** Set the handler for inbound audio data. */\n onAudio(handler: (audio: Buffer, timestamp: number) => void): void {\n this._onAudio = handler;\n }\n\n /** Set the handler for the start event. */\n onStart(handler: (event: MediaStartEvent) => void): void {\n this._onStart = handler;\n }\n\n /** Set the handler for connection close. */\n onClose(handler: () => void): void {\n this._onClose = handler;\n }\n\n /** Set the handler for inbound DTMF events. */\n onDtmf(handler: (digit: string) => void): void {\n this._onDtmf = handler;\n }\n\n /** Send a single DTMF digit to the platform. */\n sendDtmf(digit: string): void {\n if (this._ws && this._ws.readyState === 1) {\n this._ws.send(buildDtmfMessage(digit));\n }\n }\n\n /** Whether the WebSocket is connected. */\n get isConnected(): boolean {\n return this._ws !== null && this._ws.readyState === 1 && !this._closed;\n }\n\n /** Connect to a media WebSocket URL with Bearer authentication. */\n async connect(url: string, apiKey: string): Promise<void> {\n const { WebSocket } = await import('ws');\n\n return new Promise<void>((resolve, reject) => {\n const ws = new WebSocket(url, {\n followRedirects: true,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n });\n this._ws = ws;\n this._closed = false;\n\n ws.on('open', () => {\n this._startSendLoop();\n resolve();\n this._log.info('Media WS connected: %s', url);\n });\n\n ws.on('message', (data: Buffer | string) => {\n try {\n const msg = JSON.parse(data.toString()) as Record<string, unknown>;\n this._handleMessage(msg);\n } catch {\n // Ignore parse errors\n }\n });\n\n ws.on('close', () => {\n this._closed = true;\n if (this._onClose) {\n this._onClose();\n }\n });\n\n ws.on('error', (err: Error) => {\n if (!this._ws) {\n reject(err);\n }\n this._log.error({ err }, 'Media WS error');\n });\n });\n }\n\n /** Queue base64-encoded audio for sending. */\n sendAudio(audioBase64: string): void {\n this._audioQueue.push(audioBase64);\n }\n\n /** Clear all queued outbound audio. */\n sendClear(): void {\n this._audioQueue.length = 0;\n if (this._ws && this._ws.readyState === 1) {\n this._ws.send(JSON.stringify({ event: 'clear' }));\n }\n }\n\n /** Send a mark event. */\n sendMark(name: string): void {\n if (this._ws && this._ws.readyState === 1) {\n this._ws.send(\n JSON.stringify({\n event: 'mark',\n mark: { name },\n }),\n );\n }\n }\n\n /** Wait for all queued audio to be sent. */\n flush(): Promise<void> {\n if (this._audioQueue.length === 0 || this._closed) return Promise.resolve();\n return new Promise<void>((resolve) => {\n const check = () => {\n if (this._audioQueue.length === 0 || this._closed) {\n resolve();\n } else {\n setTimeout(check, 5);\n }\n };\n setTimeout(check, 5);\n });\n }\n\n /** Wait for a named mark to be echoed back by the server. */\n waitForMark(name: string, timeoutMs = 5000): Promise<void> {\n if (this._closed) return Promise.resolve();\n return new Promise<void>((resolve) => {\n const timer = setTimeout(() => {\n this._markWaiters.delete(name);\n resolve();\n }, timeoutMs);\n this._markWaiters.set(name, () => {\n clearTimeout(timer);\n resolve();\n });\n });\n }\n\n /** Close the media WebSocket. */\n close(): void {\n this._closed = true;\n if (this._ws) {\n this._ws.close();\n this._ws = null;\n }\n }\n\n private _handleMessage(msg: Record<string, unknown>): void {\n const event = msg['event'] as string;\n\n switch (event) {\n case 'start': {\n const startEvt = parseStartEvent(msg);\n if (this._onStart) {\n this._onStart(startEvt);\n }\n break;\n }\n case 'media': {\n const mediaEvt = parseMediaEvent(msg);\n if (this._onAudio) {\n this._onAudio(mediaEvt.audio, mediaEvt.timestamp);\n }\n break;\n }\n case 'dtmf': {\n const dtmfEvt = parseDtmfEvent(msg);\n if (this._onDtmf) {\n this._onDtmf(dtmfEvt.digit);\n }\n break;\n }\n case 'mark': {\n const markName = (msg['mark'] as Record<string, unknown>)?.['name'] as string;\n if (markName) {\n const resolve = this._markWaiters.get(markName);\n if (resolve) {\n this._markWaiters.delete(markName);\n resolve();\n }\n }\n break;\n }\n case 'stop': {\n this.close();\n break;\n }\n }\n }\n\n private _startSendLoop(): void {\n if (this._sendLoopRunning) return;\n this._sendLoopRunning = true;\n\n const loop = () => {\n if (this._closed) {\n this._sendLoopRunning = false;\n return;\n }\n\n while (this._audioQueue.length > 0 && this._ws && this._ws.readyState === 1) {\n const payload = this._audioQueue.shift()!;\n this._ws.send(buildMediaResponse(payload));\n }\n\n setTimeout(loop, 20);\n };\n\n loop();\n }\n}\n","/**\n * 3-file call recording: in.wav, out.wav, mix.wav\n *\n * Wall-clock 동기화로 실시간 녹음. 세 파일 모두 동일한 길이로 유지된다.\n * recordings/{call_id}/in.wav — 상대방 음성 (PCM16 8kHz mono)\n * recordings/{call_id}/out.wav — AI 음성 (PCM16 8kHz mono)\n * recordings/{call_id}/mix.wav — 양쪽 믹싱 (PCM16 8kHz mono)\n */\nimport * as fs from 'node:fs'\nimport * as path from 'node:path'\nimport type { Logger } from 'pino';\nimport { NOOP_LOGGER } from './logger.js';\n\nconst SAMPLE_RATE = 8000\nconst CHANNELS = 1\nconst BITS_PER_SAMPLE = 16\nconst BYTES_PER_SECOND = SAMPLE_RATE * CHANNELS * (BITS_PER_SAMPLE / 8) // 16000\n\nexport function makeWavHeader(dataSize: number = 0): Buffer {\n const header = Buffer.alloc(44)\n header.write('RIFF', 0, 'ascii')\n header.writeUInt32LE(36 + dataSize, 4)\n header.write('WAVE', 8, 'ascii')\n header.write('fmt ', 12, 'ascii')\n header.writeUInt32LE(16, 16) // fmt chunk size\n header.writeUInt16LE(1, 20) // PCM format\n header.writeUInt16LE(CHANNELS, 22)\n header.writeUInt32LE(SAMPLE_RATE, 24)\n header.writeUInt32LE(SAMPLE_RATE * CHANNELS * (BITS_PER_SAMPLE / 8), 28) // byte rate\n header.writeUInt16LE(CHANNELS * (BITS_PER_SAMPLE / 8), 32) // block align\n header.writeUInt16LE(BITS_PER_SAMPLE, 34)\n header.write('data', 36, 'ascii')\n header.writeUInt32LE(dataSize, 40)\n return header\n}\n\nexport function mixSamples(a: Buffer, b: Buffer): Buffer {\n const n = Math.min(a.length, b.length) >> 1 // sample count\n const result = Buffer.alloc(n * 2)\n for (let i = 0; i < n; i++) {\n const sa = a.readInt16LE(i * 2)\n const sb = b.readInt16LE(i * 2)\n result.writeInt16LE(Math.max(-32768, Math.min(32767, sa + sb)), i * 2)\n }\n return result\n}\n\nexport class AudioRecorder {\n private readonly _dir: string\n private _fdIn: number | null = null\n private _fdOut: number | null = null\n private _fdMix: number | null = null\n private _inWritten = 0\n private _outWritten = 0\n private _mixWritten = 0\n private _startTime = 0\n private _started = false\n private _log: Logger = NOOP_LOGGER;\n\n setLogger(logger: Logger): void {\n this._log = logger;\n }\n\n constructor(recordingPath: string, callId: string) {\n this._dir = path.join(recordingPath, callId)\n }\n\n start(): void {\n fs.mkdirSync(this._dir, { recursive: true })\n const header = makeWavHeader()\n this._fdIn = fs.openSync(path.join(this._dir, 'in.wav'), 'w')\n this._fdOut = fs.openSync(path.join(this._dir, 'out.wav'), 'w')\n this._fdMix = fs.openSync(path.join(this._dir, 'mix.wav'), 'w+')\n fs.writeSync(this._fdIn, header)\n fs.writeSync(this._fdOut, header)\n fs.writeSync(this._fdMix, header)\n this._startTime = performance.now()\n this._started = true\n this._log.info('Recording started: %s', this._dir);\n }\n\n private _expectedBytes(): number {\n const elapsed = (performance.now() - this._startTime) / 1000 // ms → s\n return Math.floor(elapsed * BYTES_PER_SECOND)\n }\n\n private _padSilence(fd: number, written: number): number {\n const expected = this._expectedBytes()\n let gap = expected - written\n if (gap <= 0) return 0\n gap = gap - (gap % 2) // 2-byte align\n if (gap > 0) {\n fs.writeSync(fd, Buffer.alloc(gap))\n }\n return gap\n }\n\n private _writeToMix(data: Buffer, trackPos: number): void {\n if (this._fdMix === null) return\n const filePos = 44 + trackPos\n\n if (trackPos < this._mixWritten) {\n // Overlap: read existing, mix, write back\n const overlap = Math.min(data.length, this._mixWritten - trackPos)\n const existing = Buffer.alloc(overlap)\n fs.readSync(this._fdMix, existing, 0, overlap, filePos)\n const mixed = mixSamples(existing, data.subarray(0, overlap))\n fs.writeSync(this._fdMix, mixed, 0, mixed.length, filePos)\n // Write remaining beyond overlap\n if (data.length > overlap) {\n fs.writeSync(this._fdMix, data, overlap, data.length - overlap, filePos + overlap)\n this._mixWritten = trackPos + data.length\n }\n } else {\n // No overlap: pad gap if needed, then write\n if (trackPos > this._mixWritten) {\n let gap = trackPos - this._mixWritten\n gap = gap - (gap % 2) // 2-byte align\n if (gap > 0) {\n const silence = Buffer.alloc(gap)\n fs.writeSync(this._fdMix, silence, 0, silence.length, 44 + this._mixWritten)\n this._mixWritten += gap\n }\n }\n fs.writeSync(this._fdMix, data, 0, data.length, 44 + this._mixWritten)\n this._mixWritten += data.length\n }\n }\n\n writeInbound(pcm16_8k: Buffer): void {\n if (!this._started || this._fdIn === null) return\n try {\n const gap = this._padSilence(this._fdIn, this._inWritten)\n this._inWritten += gap\n const posBefore = this._inWritten\n fs.writeSync(this._fdIn, pcm16_8k)\n this._inWritten += pcm16_8k.length\n this._writeToMix(pcm16_8k, posBefore)\n } catch (err) {\n this._log.error({ err }, 'Recording write error (inbound)');\n }\n }\n\n writeOutbound(pcm16_8k: Buffer): void {\n if (!this._started || this._fdOut === null) return\n try {\n const gap = this._padSilence(this._fdOut, this._outWritten)\n this._outWritten += gap\n const posBefore = this._outWritten\n fs.writeSync(this._fdOut, pcm16_8k)\n this._outWritten += pcm16_8k.length\n this._writeToMix(pcm16_8k, posBefore)\n } catch (err) {\n this._log.error({ err }, 'Recording write error (outbound)');\n }\n }\n\n stop(): void {\n if (!this._started) return\n try {\n let maxWritten = Math.max(this._inWritten, this._outWritten, this._mixWritten)\n maxWritten = maxWritten & ~1 // 2-byte align (round down)\n\n for (const [fd, written] of [\n [this._fdIn, this._inWritten],\n [this._fdOut, this._outWritten],\n [this._fdMix, this._mixWritten],\n ] as const) {\n if (fd === null) continue\n const pad = maxWritten - written\n if (pad > 0) {\n fs.writeSync(fd, Buffer.alloc(pad), 0, pad, 44 + written)\n }\n // Update WAV header\n fs.writeSync(fd, makeWavHeader(maxWritten), 0, 44, 0)\n fs.closeSync(fd)\n }\n const maxSec = maxWritten / 16000;\n this._log.info('Recording stopped: %s (%ds)', this._dir, maxSec);\n } catch (err) {\n this._log.error({ err }, 'Recording stop error');\n } finally {\n this._fdIn = null\n this._fdOut = null\n this._fdMix = null\n this._started = false\n }\n }\n}\n","/**\n * CallSession represents an active phone call and provides methods to\n * send audio, hang up, and listen for lifecycle events.\n */\n\nimport type { Logger } from 'pino';\nimport { NOOP_LOGGER } from './logger.js';\n\nexport type CallDirection = 'inbound' | 'outbound';\nexport type CallStatus = 'ringing' | 'active' | 'ended';\n\n/**\n * Session event handler: receives (call, ...args) like the Python SDK.\n * For example, 'transcript' events pass (call, role, text).\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype SessionEventHandler = (...args: any[]) => void | Promise<void>;\n\nexport interface SendAudioFn {\n (audio: Buffer): void;\n}\n\nexport interface ClearAudioFn {\n (): void;\n}\n\nexport interface HangupFn {\n (): void | Promise<void>;\n}\n\nexport interface SendDtmfFn {\n (digit: string): Promise<void>;\n}\n\nexport class CallSession {\n readonly callId: string;\n readonly fromNumber: string;\n readonly toNumber: string;\n readonly accountId: string;\n readonly direction: CallDirection;\n readonly startTime: Date;\n readonly metadata: Record<string, unknown>;\n\n private _status: CallStatus;\n private _sendAudioFn: SendAudioFn | null = null;\n private _clearAudioFn: ClearAudioFn | null = null;\n private _hangupFn: HangupFn | null = null;\n /** @internal */ _sendDtmfFn: SendDtmfFn | null = null;\n /** @internal */ _isTransportConnected: (() => boolean) | null = null;\n private _dtmfCollectorActive = false;\n private _dtmfResolvers: ((digit: string) => void)[] = [];\n private _dtmfBuffer: string[] = [];\n private _log: Logger = NOOP_LOGGER;\n private _handlers: Map<string, SessionEventHandler[]> = new Map();\n private _endedPromise: Promise<void>;\n private _resolveEnded!: () => void;\n\n constructor(options: {\n callId: string;\n fromNumber: string;\n toNumber: string;\n accountId: string;\n direction: CallDirection;\n metadata?: Record<string, unknown>;\n }) {\n this.callId = options.callId;\n this.fromNumber = options.fromNumber;\n this.toNumber = options.toNumber;\n this.accountId = options.accountId;\n this.direction = options.direction;\n this.metadata = options.metadata ?? {};\n this._status = 'ringing';\n this.startTime = new Date();\n\n this._endedPromise = new Promise<void>((resolve) => {\n this._resolveEnded = resolve;\n });\n }\n\n setLogger(logger: Logger): void {\n this._log = logger;\n }\n\n get status(): CallStatus {\n return this._status;\n }\n\n get duration(): number {\n return (Date.now() - this.startTime.getTime()) / 1000;\n }\n\n /** Bind transport functions (called internally by the agent). */\n _bindTransport(\n send: SendAudioFn,\n clear: ClearAudioFn,\n hangup: HangupFn,\n sendDtmf?: SendDtmfFn,\n isConnected?: () => boolean,\n ): void {\n this._sendAudioFn = send;\n this._clearAudioFn = clear;\n this._hangupFn = hangup;\n if (sendDtmf) this._sendDtmfFn = sendDtmf;\n if (isConnected) this._isTransportConnected = isConnected;\n this._status = 'active';\n }\n\n /** Send PCM16 or ulaw audio to the caller. */\n sendAudio(audio: Buffer): void {\n if (this._sendAudioFn) {\n this._sendAudioFn(audio);\n }\n }\n\n /** Clear any queued outbound audio. */\n clearAudio(): void {\n if (this._clearAudioFn) {\n this._clearAudioFn();\n }\n }\n\n /** Hang up the call, waiting for pending audio to finish. */\n async hangup(): Promise<void> {\n if (this._hangupFn) {\n await this._hangupFn();\n }\n }\n\n /** @internal Route a received DTMF digit to an active collector or buffer. */\n _routeDtmf(digit: string): void {\n if (this._dtmfCollectorActive && this._dtmfResolvers.length > 0) {\n const resolve = this._dtmfResolvers.shift()!;\n resolve(digit);\n } else {\n // Buffer the digit — collector may not be active yet (tool call timing)\n this._dtmfBuffer.push(digit);\n }\n }\n\n /** Collect DTMF digits from the caller. */\n async collectDtmf(options: {\n maxDigits: number;\n finishOnKey?: string;\n timeout?: number;\n secure?: boolean;\n }): Promise<string> {\n if (this._dtmfCollectorActive) {\n throw new Error('이미 DTMF 수집 중입니다');\n }\n\n const { maxDigits, finishOnKey = '#', timeout = 5 } = options;\n this._dtmfCollectorActive = true;\n // Don't clear buffer — digits may have arrived before tool call was processed\n const collected: string[] = [];\n\n try {\n while (collected.length < maxDigits) {\n // Drain the buffer first\n if (this._dtmfBuffer.length > 0) {\n const digit = this._dtmfBuffer.shift()!;\n if (digit === finishOnKey) break;\n collected.push(digit);\n continue;\n }\n\n const digit = await Promise.race([\n new Promise<string>((resolve) => {\n this._dtmfResolvers.push(resolve);\n }),\n new Promise<null>((resolve) => {\n setTimeout(() => resolve(null), timeout * 1000);\n }),\n ]);\n\n if (digit === null) break; // timeout\n if (digit === finishOnKey) break;\n collected.push(digit);\n }\n } finally {\n this._dtmfCollectorActive = false;\n this._dtmfResolvers = [];\n this._dtmfBuffer = [];\n }\n\n const result = collected.join('');\n this._log.info('DTMF collected: %s', result);\n return result;\n }\n\n /** Send a sequence of DTMF digits. */\n async sendDtmfSequence(digits: string): Promise<void> {\n if (!this._sendDtmfFn) {\n throw new Error('DTMF 전송 함수가 바인딩되지 않았습니다');\n }\n for (const ch of digits) {\n if (this._isTransportConnected && !this._isTransportConnected()) {\n throw new Error('DTMF 전송 중 연결이 끊어졌습니다');\n }\n if (ch === 'w') {\n await new Promise((r) => setTimeout(r, 500));\n } else if (ch === 'W') {\n await new Promise((r) => setTimeout(r, 1000));\n } else if ('0123456789*#'.includes(ch)) {\n if (this._sendDtmfFn) {\n await this._sendDtmfFn(ch);\n }\n } else {\n throw new Error(`유효하지 않은 DTMF 문자: ${ch}`);\n }\n }\n }\n\n /** Register an event handler. */\n on(event: string, handler: SessionEventHandler): void {\n let list = this._handlers.get(event);\n if (!list) {\n list = [];\n this._handlers.set(event, list);\n }\n list.push(handler);\n }\n\n /** Wait for the call to end. */\n async wait(): Promise<void> {\n return this._endedPromise;\n }\n\n /** Mark the session as ended (called internally). */\n _markEnded(): void {\n this._status = 'ended';\n this._resolveEnded();\n }\n\n /** Emit an event to registered handlers. Matches Python SDK: _emit(event, ...args) */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n _emit(event: string, ...args: any[]): void {\n const handlers = this._handlers.get(event);\n if (handlers) {\n for (const handler of handlers) {\n try {\n const result = handler(this, ...args);\n if (result && typeof result.catch === 'function') {\n result.catch((err: unknown) => {\n this._log.error({ err }, 'CallSession handler error: %s', event);\n });\n }\n } catch (err) {\n this._log.error({ err }, 'CallSession handler error: %s', event);\n }\n }\n }\n }\n}\n","/**\n * Built-in tool definitions and selection constants.\n */\n\nexport enum BuiltinTool {\n /** 전화 종료 도구. AI가 대화 완료 시 통화를 종료합니다. */\n HANG_UP = 'hang_up',\n /** DTMF 수집 도구. 사용자의 키패드 입력을 수집합니다. */\n COLLECT_DTMF = 'collect_dtmf',\n /** DTMF 전송 도구. ARS 탐색이나 내선번호 입력에 사용합니다. */\n SEND_DTMF = 'send_dtmf',\n\n /** 모든 내장 도구를 활성화합니다. (기본값) */\n ALL = 'all',\n /** 모든 내장 도구를 비활성화합니다. */\n NONE = 'none',\n}\n\nconst INDIVIDUAL_TOOLS = new Set([\n BuiltinTool.HANG_UP,\n BuiltinTool.COLLECT_DTMF,\n BuiltinTool.SEND_DTMF,\n]);\n\nexport function resolveBuiltinTools(\n value: BuiltinTool | BuiltinTool[],\n): Set<BuiltinTool> {\n if (typeof value === 'string') {\n if (value === BuiltinTool.ALL) {\n return new Set(INDIVIDUAL_TOOLS);\n }\n if (value === BuiltinTool.NONE) {\n return new Set();\n }\n return new Set([value]);\n }\n return new Set(value.filter((t) => INDIVIDUAL_TOOLS.has(t)));\n}\n","/**\n * Tool registry for function-calling in voice agent pipelines.\n * Uses Zod schemas for parameter validation.\n */\n\nimport type { z } from 'zod';\n\nexport interface FunctionTool {\n name: string;\n description: string;\n parameters: Record<string, unknown>;\n required: string[];\n handler: (args: Record<string, unknown>) => unknown | Promise<unknown>;\n}\n\nexport interface OpenAIToolDefinition {\n type: 'function';\n function: {\n name: string;\n description: string;\n parameters: {\n type: 'object';\n properties: Record<string, unknown>;\n required: string[];\n };\n };\n}\n\n/**\n * Decorator / identity function for marking a function as a tool handler.\n * In TypeScript, this simply returns the function as-is. Use with ToolRegistry.register().\n */\nexport function functionTool<T extends (...args: unknown[]) => unknown>(fn: T): T {\n return fn;\n}\n\nexport class ToolRegistry {\n private _tools: Map<string, FunctionTool> = new Map();\n private _mcpTools: Map<string, FunctionTool> = new Map();\n\n /** Register a function tool. */\n register(tool: FunctionTool): void {\n this._tools.set(tool.name, tool);\n }\n\n /** Register tools discovered from MCP servers. */\n registerMcpTools(tools: FunctionTool[]): void {\n for (const tool of tools) {\n this._mcpTools.set(tool.name, tool);\n }\n }\n\n /** Clear all MCP-registered tools. */\n clearMcpTools(): void {\n this._mcpTools.clear();\n }\n\n /**\n * Create a fork (shallow copy) of this registry.\n * Useful for per-session tool isolation.\n */\n fork(): ToolRegistry {\n const copy = new ToolRegistry();\n for (const [name, tool] of this._tools) {\n copy._tools.set(name, tool);\n }\n for (const [name, tool] of this._mcpTools) {\n copy._mcpTools.set(name, tool);\n }\n return copy;\n }\n\n /** Check if a tool is registered. */\n has(name: string): boolean {\n return this._tools.has(name) || this._mcpTools.has(name);\n }\n\n /** Get a tool by name. */\n get(name: string): FunctionTool | undefined {\n return this._tools.get(name) ?? this._mcpTools.get(name);\n }\n\n /** Convert all registered tools to OpenAI function-calling format. */\n toOpenAITools(): OpenAIToolDefinition[] {\n const result: OpenAIToolDefinition[] = [];\n const allTools = [...this._tools.values(), ...this._mcpTools.values()];\n\n for (const tool of allTools) {\n result.push({\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: {\n type: 'object',\n properties: tool.parameters,\n required: tool.required,\n },\n },\n });\n }\n\n return result;\n }\n\n /** Call a tool by name with the given arguments. */\n async call(name: string, args: Record<string, unknown>): Promise<unknown> {\n const tool = this.get(name);\n if (!tool) {\n throw new Error(`Tool '${name}' not found in registry`);\n }\n return tool.handler(args);\n }\n\n /** Get the number of registered tools (including MCP). */\n get size(): number {\n return this._tools.size + this._mcpTools.size;\n }\n}\n\n/**\n * Helper to convert a Zod object schema into a JSON Schema properties + required list.\n */\nexport function zodToToolParams(schema: z.ZodObject<z.ZodRawShape>): {\n parameters: Record<string, unknown>;\n required: string[];\n} {\n const shape = schema.shape;\n const parameters: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const [key, field] of Object.entries(shape)) {\n const zodField = field as z.ZodTypeAny;\n const desc = zodField.description;\n let isOptional = false;\n let innerType = zodField;\n\n // Unwrap ZodOptional\n if ('unwrap' in zodField && zodField._def?.typeName === 'ZodOptional') {\n isOptional = true;\n innerType = (zodField as z.ZodOptional<z.ZodTypeAny>).unwrap();\n }\n\n const jsonSchema: Record<string, unknown> = {};\n\n // Map common Zod types to JSON Schema\n const typeName = innerType._def?.typeName as string | undefined;\n switch (typeName) {\n case 'ZodString':\n jsonSchema.type = 'string';\n break;\n case 'ZodNumber':\n jsonSchema.type = 'number';\n break;\n case 'ZodBoolean':\n jsonSchema.type = 'boolean';\n break;\n case 'ZodArray':\n jsonSchema.type = 'array';\n break;\n case 'ZodEnum':\n jsonSchema.type = 'string';\n jsonSchema.enum = innerType._def?.values;\n break;\n default:\n jsonSchema.type = 'string';\n }\n\n if (desc) {\n jsonSchema.description = desc;\n }\n\n parameters[key] = jsonSchema;\n\n if (!isOptional) {\n required.push(key);\n }\n }\n\n return { parameters, required };\n}\n","/**\n * Tracing configuration for OpenTelemetry integration.\n */\n\nexport interface TracingConfig {\n /** Whether tracing is enabled. Default: false */\n enabled: boolean;\n /** Service name for traces. Default: 'clawops-agent' */\n serviceName?: string;\n /**\n * Optional TracerProvider instance from @opentelemetry/api.\n * If not provided, the global tracer provider will be used.\n */\n tracerProvider?: unknown;\n}\n\nconst DEFAULT_CONFIG: TracingConfig = {\n enabled: false,\n serviceName: 'clawops-agent',\n};\n\nlet _currentConfig: TracingConfig = { ...DEFAULT_CONFIG };\n\n/** Get the current tracing configuration. */\nexport function getTracingConfig(): TracingConfig {\n return _currentConfig;\n}\n\n/** Set the tracing configuration. */\nexport function setTracingConfig(config: Partial<TracingConfig>): void {\n _currentConfig = { ..._currentConfig, ...config };\n}\n\n/** Reset tracing configuration to defaults. */\nexport function resetTracingConfig(): void {\n _currentConfig = { ...DEFAULT_CONFIG };\n}\n","/**\n * OpenTelemetry span helpers. No-op when OpenTelemetry is not installed.\n */\n\nimport { getTracingConfig } from './config.js';\n\n/** Tracer interface (subset of @opentelemetry/api Tracer). */\ninterface Tracer {\n startSpan(name: string, options?: Record<string, unknown>): Span;\n startActiveSpan<T>(\n name: string,\n options: Record<string, unknown>,\n fn: (span: Span) => T,\n ): T;\n}\n\n/** Span interface (subset of @opentelemetry/api Span). */\ninterface Span {\n setAttribute(key: string, value: string | number | boolean): void;\n setStatus(status: { code: number; message?: string }): void;\n recordException(error: Error): void;\n end(): void;\n}\n\n// Cached tracer instance\nlet _tracer: Tracer | null = null;\n\n/**\n * Get the tracer, or null if tracing is not enabled/available.\n */\nasync function getTracer(): Promise<Tracer | null> {\n const config = getTracingConfig();\n if (!config.enabled) return null;\n\n if (_tracer) return _tracer;\n\n try {\n const otel = await import('@opentelemetry/api');\n const provider = config.tracerProvider ?? otel.trace.getTracerProvider();\n _tracer = (provider as { getTracer: (name: string, version?: string) => Tracer }).getTracer(\n config.serviceName ?? 'clawops-agent',\n '1.0.0',\n );\n return _tracer;\n } catch {\n // OpenTelemetry not installed\n return null;\n }\n}\n\n/**\n * Start a new span. Returns a no-op span if tracing is not available.\n */\nexport async function startSpan(\n name: string,\n attributes?: Record<string, string | number | boolean>,\n): Promise<Span> {\n const tracer = await getTracer();\n if (!tracer) {\n return createNoOpSpan();\n }\n\n const span = tracer.startSpan(name, {\n attributes,\n });\n return span;\n}\n\n/**\n * Run a function within a new active span.\n */\nexport async function withSpan<T>(\n name: string,\n attributes: Record<string, string | number | boolean>,\n fn: (span: Span) => Promise<T>,\n): Promise<T> {\n const tracer = await getTracer();\n if (!tracer) {\n return fn(createNoOpSpan());\n }\n\n const span = tracer.startSpan(name, { attributes });\n try {\n const result = await fn(span);\n span.setStatus({ code: 1 }); // OK\n return result;\n } catch (err) {\n span.setStatus({ code: 2, message: String(err) }); // ERROR\n if (err instanceof Error) {\n span.recordException(err);\n }\n throw err;\n } finally {\n span.end();\n }\n}\n\nfunction createNoOpSpan(): Span {\n return {\n setAttribute() {},\n setStatus() {},\n recordException() {},\n end() {},\n };\n}\n\n/** Reset the cached tracer (for testing). */\nexport function _resetTracer(): void {\n _tracer = null;\n}\n","/**\n * OpenTelemetry semantic attribute constants for ClawOps agent tracing.\n */\n\n// Call attributes\nexport const ATTR_CALL_ID = 'clawops.call.id';\nexport const ATTR_CALL_DIRECTION = 'clawops.call.direction';\nexport const ATTR_CALL_FROM = 'clawops.call.from';\nexport const ATTR_CALL_TO = 'clawops.call.to';\nexport const ATTR_CALL_STATUS = 'clawops.call.status';\nexport const ATTR_CALL_DURATION = 'clawops.call.duration';\n\n// Agent attributes\nexport const ATTR_AGENT_ID = 'clawops.agent.id';\nexport const ATTR_AGENT_SESSION_TYPE = 'clawops.agent.session_type';\n\n// Pipeline attributes\nexport const ATTR_STT_PROVIDER = 'clawops.stt.provider';\nexport const ATTR_STT_MODEL = 'clawops.stt.model';\nexport const ATTR_STT_LANGUAGE = 'clawops.stt.language';\nexport const ATTR_STT_TRANSCRIPT = 'clawops.stt.transcript';\n\nexport const ATTR_LLM_PROVIDER = 'clawops.llm.provider';\nexport const ATTR_LLM_MODEL = 'clawops.llm.model';\nexport const ATTR_LLM_PROMPT_TOKENS = 'clawops.llm.prompt_tokens';\nexport const ATTR_LLM_COMPLETION_TOKENS = 'clawops.llm.completion_tokens';\nexport const ATTR_LLM_TOTAL_TOKENS = 'clawops.llm.total_tokens';\n\nexport const ATTR_TTS_PROVIDER = 'clawops.tts.provider';\nexport const ATTR_TTS_VOICE = 'clawops.tts.voice';\nexport const ATTR_TTS_MODEL = 'clawops.tts.model';\n\n// Tool attributes\nexport const ATTR_TOOL_NAME = 'clawops.tool.name';\nexport const ATTR_TOOL_RESULT = 'clawops.tool.result';\nexport const ATTR_TOOL_ERROR = 'clawops.tool.error';\n\n// MCP attributes\nexport const ATTR_MCP_SERVER_NAME = 'clawops.mcp.server_name';\nexport const ATTR_MCP_SERVER_TYPE = 'clawops.mcp.server_type';\n\n// Audio attributes\nexport const ATTR_AUDIO_SAMPLE_RATE = 'clawops.audio.sample_rate';\nexport const ATTR_AUDIO_ENCODING = 'clawops.audio.encoding';\nexport const ATTR_AUDIO_DURATION = 'clawops.audio.duration';\n","/**\n * ClawOpsAgent - main agent class for handling voice calls.\n */\n\nimport { DEFAULT_BASE_URL } from '../constants.js';\nimport { AgentConnectionError, AgentError } from '../error.js';\nimport { ulawToPcm16 } from './audio.js';\nimport { ControlWebSocket } from './control-ws.js';\nimport type { ControlEvent } from './control-ws.js';\nimport { MCPClient } from './mcp/client.js';\nimport type { MCPServerStdio, MCPServerHTTP } from './mcp/index.js';\nimport { MediaWebSocket } from './media-ws.js';\nimport { AudioRecorder } from './recorder.js';\nimport { CallSession } from './session.js';\nimport { BuiltinTool, resolveBuiltinTools } from './builtin-tool.js';\nimport { ToolRegistry } from './tool.js';\nimport type { FunctionTool } from './tool.js';\nimport type { Session } from './pipeline/base.js';\nimport { setTracingConfig } from './tracing/config.js';\nimport type { TracingConfig } from './tracing/config.js';\nimport { withSpan } from './tracing/spans.js';\nimport { ATTR_CALL_ID, ATTR_CALL_DIRECTION, ATTR_AGENT_ID } from './tracing/attributes.js';\nimport type { Logger } from 'pino';\nimport { createAgentLogger, createPipelineLogger } from './logger.js';\n\nexport type AgentEventType = 'call_start' | 'call_end' | 'call_failed' | 'transcript' | 'dtmf';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AgentEventHandler = (...args: any[]) => void | Promise<void>;\n\nexport interface ClawOpsAgentOptions {\n /** ClawOps API key. Falls back to CLAWOPS_API_KEY env var. */\n apiKey?: string;\n /** Account ID. Falls back to CLAWOPS_ACCOUNT_ID env var. */\n accountId?: string;\n /** API base URL. */\n baseUrl?: string;\n /** Phone number to send/receive calls from. Required. */\n from: string;\n /** Session implementation (OpenAIRealtime, GeminiRealtime, PipelineSession, etc.). */\n session: Session;\n /** Enable call recording. */\n recording?: boolean;\n /** Recording output directory. Default: './recordings' */\n recordingPath?: string;\n /** MCP server configurations. */\n mcpServers?: Array<MCPServerStdio | MCPServerHTTP>;\n /** Tracing configuration. */\n tracing?: TracingConfig;\n /** 활성화할 내장 도구. Default: BuiltinTool.ALL */\n builtinTools?: BuiltinTool | BuiltinTool[];\n /** Debounce time (ms) for passive DTMF accumulation. Default: 500 */\n passiveDtmfDebounceMs?: number;\n /** Custom pino logger instance. If omitted, a default logger is created. */\n logger?: Logger;\n}\n\nexport class ClawOpsAgent {\n private _apiKey: string;\n private _accountId: string;\n private _baseUrl: string;\n private _fromNumber: string;\n private _session: Session;\n private _tools: ToolRegistry = new ToolRegistry();\n private _handlers: Map<string, AgentEventHandler[]> = new Map();\n private _controlWs: ControlWebSocket | null = null;\n private _mcpServers: Array<MCPServerStdio | MCPServerHTTP>;\n private _recording: boolean;\n private _recordingPath: string;\n private _activeSessions: Map<string, CallSession> = new Map();\n private _builtinTools!: Set<BuiltinTool>;\n private _passiveDtmfDebounceMs: number;\n private _passiveDtmfBuffer: string[] = [];\n private _passiveDtmfTimer: ReturnType<typeof setTimeout> | null = null;\n private _passiveDtmfCallId: string | null = null;\n private _callSessions = new Map<string, Session>();\n private _log: Logger;\n private _pipelineLog: Logger;\n private _isPipelineSession = false;\n\n constructor(options: ClawOpsAgentOptions) {\n this._apiKey = options.apiKey ?? process.env['CLAWOPS_API_KEY'] ?? '';\n this._accountId = options.accountId ?? process.env['CLAWOPS_ACCOUNT_ID'] ?? '';\n this._baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;\n this._fromNumber = options.from;\n this._session = options.session;\n this._recording = options.recording ?? false;\n this._recordingPath = options.recordingPath ?? './recordings';\n this._mcpServers = options.mcpServers ?? [];\n this._builtinTools = resolveBuiltinTools(options.builtinTools ?? BuiltinTool.ALL);\n this._passiveDtmfDebounceMs = options.passiveDtmfDebounceMs ?? 500;\n\n // Configure tracing\n if (options.tracing) {\n setTracingConfig(options.tracing);\n }\n\n this._log = createAgentLogger(options.logger);\n this._pipelineLog = createPipelineLogger(this._log);\n // Detect PipelineSession at construction time (duck-type check)\n this._isPipelineSession = '_stt' in this._session && '_llm' in this._session;\n }\n\n /**\n * Register a function tool.\n *\n * Supports two signatures (matching Python SDK):\n * agent.tool(name, description, parameters, handler)\n * agent.tool(functionToolObject)\n */\n tool(\n nameOrTool: string | FunctionTool,\n description?: string,\n parameters?: Record<string, unknown>,\n handler?: (args: Record<string, unknown>) => unknown | Promise<unknown>,\n ): this {\n if (typeof nameOrTool === 'string') {\n if (!description || !parameters || !handler) {\n throw new AgentError(\n 'tool(name, description, parameters, handler) requires all arguments.',\n );\n }\n this._tools.register({\n name: nameOrTool,\n description,\n parameters,\n required: Object.keys(parameters),\n handler,\n });\n } else {\n this._tools.register(nameOrTool);\n }\n return this;\n }\n\n /**\n * Register an event handler.\n *\n * Matches Python SDK decorator style:\n * agent.on(\"call_start\", (call) => { ... })\n * agent.on(\"transcript\", (call, role, text) => { ... })\n */\n on(event: AgentEventType, handler: AgentEventHandler): this {\n let list = this._handlers.get(event);\n if (!list) {\n list = [];\n this._handlers.set(event, list);\n }\n list.push(handler);\n return this;\n }\n\n /** Connect to the ClawOps platform and start listening for calls. */\n async connect(): Promise<void> {\n if (this._controlWs) return;\n\n if (!this._apiKey) {\n throw new AgentError('API key is required. Set CLAWOPS_API_KEY or pass apiKey option.');\n }\n if (!this._accountId) {\n throw new AgentError(\n 'Account ID is required. Set CLAWOPS_ACCOUNT_ID or pass accountId option.',\n );\n }\n\n // Connect control WebSocket\n this._controlWs = new ControlWebSocket({\n baseUrl: this._baseUrl,\n apiKey: this._apiKey,\n accountId: this._accountId,\n number: this._fromNumber,\n });\n\n this._controlWs.setLogger(this._log);\n\n this._controlWs.on('call.incoming', (event) => this._handleIncoming(event));\n this._controlWs.on('call.ended', (event) => this._handleEnded(event));\n this._controlWs.on('call.outbound_ready', (event) => this._handleOutboundReady(event));\n this._controlWs.on('call.ringing', (event) => this._handleRinging(event));\n this._controlWs.on('call.failed', (event) => this._handleFailed(event));\n\n try {\n await this._controlWs.connect();\n await this._controlWs.waitConnected();\n } catch (err) {\n throw new AgentConnectionError(\n `Failed to connect to ClawOps: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n this._log.info('ClawOpsAgent connected on %s', this._fromNumber);\n }\n\n /**\n * Connect and block until disconnected.\n * Convenience method for simple agent scripts.\n */\n async serve(): Promise<void> {\n await this.connect();\n\n // Block indefinitely until process signal\n return new Promise<void>((resolve) => {\n const shutdown = () => {\n this.disconnect()\n .then(resolve)\n .catch(() => resolve());\n };\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n });\n }\n\n /** Disconnect from the platform. */\n async disconnect(): Promise<void> {\n if (this._controlWs) {\n this._controlWs.close();\n this._controlWs = null;\n }\n\n for (const session of this._activeSessions.values()) {\n session._markEnded();\n }\n this._activeSessions.clear();\n this._callSessions.clear();\n this._log.info('ClawOpsAgent disconnected');\n }\n\n /**\n * Initiate an outbound call.\n * Matches Python SDK: agent.call(to, { timeout })\n */\n async call(to: string, options?: { timeout?: number }): Promise<CallSession> {\n await this.connect();\n\n const url = `${this._baseUrl}/v1/accounts/${this._accountId}/calls`;\n const body = { To: to, From: this._fromNumber, Timeout: options?.timeout ?? 60 };\n const resp = await fetch(url, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this._apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n });\n\n if (resp.status !== 201) {\n const error = (await resp.json()) as Record<string, unknown>;\n throw new AgentError(`발신 실패 (${resp.status}): ${(error['error'] as string) ?? ''}`);\n }\n\n const data = (await resp.json()) as Record<string, unknown>;\n\n const callSession = new CallSession({\n callId: data['callId'] as string,\n fromNumber: this._fromNumber,\n toNumber: to,\n accountId: this._accountId,\n direction: 'outbound',\n });\n\n // Register all agent-level event handlers on the session\n for (const [evt, handlers] of this._handlers) {\n for (const handler of handlers) {\n callSession.on(evt, handler);\n }\n }\n\n callSession.setLogger(this._log);\n this._activeSessions.set(callSession.callId, callSession);\n this._log.info('Outbound call initiated: %s -> %s (%s)', this._fromNumber, to, callSession.callId);\n return callSession;\n }\n\n private _handleIncoming(event: ControlEvent): void {\n const callId = event['callId'] as string;\n const fromNumber = (event['from'] as string) ?? '';\n const mediaUrl = (event['mediaUrl'] as string) ?? '';\n\n const session = new CallSession({\n callId,\n fromNumber,\n toNumber: this._fromNumber,\n accountId: this._accountId,\n direction: 'inbound',\n });\n\n // Register all agent-level event handlers on the session\n for (const [evt, handlers] of this._handlers) {\n for (const handler of handlers) {\n session.on(evt, handler);\n }\n }\n\n session.setLogger(this._log);\n this._activeSessions.set(callId, session);\n this._log.info('Incoming call: %s -> %s (%s)', fromNumber, this._fromNumber, callId);\n\n // Accept the call\n if (this._controlWs) {\n this._controlWs.send({ event: 'call.accept', callId });\n }\n\n if (mediaUrl) {\n this._startCallSession(session, mediaUrl).catch((err) => {\n this._log.error({ err }, 'Call session error: %s', callId);\n });\n }\n }\n\n private _handleEnded(event: ControlEvent): void {\n const callId = event['callId'] as string;\n const session = this._activeSessions.get(callId);\n if (session) {\n this._log.info('Call ended (server): %s', callId);\n session._markEnded();\n this._activeSessions.delete(callId);\n }\n }\n\n private _handleOutboundReady(event: ControlEvent): void {\n const callId = event['callId'] as string;\n const mediaUrl = (event['mediaUrl'] as string) ?? '';\n let session = this._activeSessions.get(callId);\n\n if (!session) {\n session = new CallSession({\n callId,\n fromNumber: this._fromNumber,\n toNumber: (event['to'] as string) ?? '',\n accountId: this._accountId,\n direction: 'outbound',\n });\n session.setLogger(this._log);\n\n // Register all agent-level event handlers on the session\n for (const [evt, handlers] of this._handlers) {\n for (const handler of handlers) {\n session.on(evt, handler);\n }\n }\n\n this._activeSessions.set(callId, session);\n }\n\n if (mediaUrl) {\n this._log.info('Outbound call answered: %s -> %s (%s)', this._fromNumber, session.toNumber, callId);\n this._startCallSession(session, mediaUrl).catch((err) => {\n this._log.error({ err }, 'Call session error: %s', callId);\n });\n }\n }\n\n private _handleRinging(event: ControlEvent): void {\n const callId = event['callId'] as string;\n const session = this._activeSessions.get(callId);\n if (session) {\n this._log.info('Outbound call ringing: %s', callId);\n }\n }\n\n private _handleFailed(event: ControlEvent): void {\n const callId = event['callId'] as string;\n const session = this._activeSessions.get(callId);\n if (session) {\n this._log.info('Outbound call failed: %s (%s)', callId, (event['reason'] as string) ?? 'failed');\n session._emit('call_failed', (event['reason'] as string) ?? 'failed');\n session._markEnded();\n this._activeSessions.delete(callId);\n }\n }\n\n private _onDtmfEvent(callSession: CallSession, digit: string): void {\n callSession._emit('dtmf', digit);\n\n // Always route to session buffer — collector may not be active yet (tool call timing)\n callSession._routeDtmf(digit);\n\n if ((callSession as any)._dtmfCollectorActive) {\n callSession.clearAudio();\n return;\n }\n\n this._passiveDtmfBuffer.push(digit);\n this._passiveDtmfCallId = callSession.callId;\n if (this._passiveDtmfTimer) {\n clearTimeout(this._passiveDtmfTimer);\n }\n this._passiveDtmfTimer = setTimeout(() => {\n const digits = this._passiveDtmfBuffer.join('');\n this._passiveDtmfBuffer = [];\n const sessionHandler = this._passiveDtmfCallId\n ? this._callSessions.get(this._passiveDtmfCallId)\n : null;\n this._passiveDtmfCallId = null;\n if (digits && sessionHandler && sessionHandler.feedDtmf) {\n sessionHandler.feedDtmf(digits).catch((err: unknown) => {\n this._log.error({ err }, 'DTMF feed error');\n });\n }\n }, this._passiveDtmfDebounceMs);\n }\n\n private async _startCallSession(session: CallSession, mediaWsUrl: string): Promise<void> {\n await withSpan(\n 'clawops.call_session',\n {\n [ATTR_CALL_ID]: session.callId,\n [ATTR_CALL_DIRECTION]: session.direction,\n [ATTR_AGENT_ID]: this._accountId,\n },\n async () => {\n // Fork tools for this session (per-call MCP isolation)\n const sessionTools = this._tools.fork();\n\n // MCP: start servers per call\n const mcpClients: MCPClient[] = [];\n if (this._mcpServers.length > 0) {\n for (const serverConfig of this._mcpServers) {\n const client = new MCPClient();\n client.setLogger(this._log);\n client.addServer('mcp', serverConfig);\n try {\n const tools = await client.connect();\n sessionTools.registerMcpTools(tools);\n mcpClients.push(client);\n } catch (err) {\n this._log.error({ err }, 'MCP connection error');\n }\n }\n }\n\n // Set up recorder if configured\n let recorder: AudioRecorder | null = null;\n if (this._recording) {\n recorder = new AudioRecorder(this._recordingPath, session.callId);\n recorder.setLogger(this._log);\n recorder.start();\n }\n\n // Connect media WebSocket\n const mediaWs = new MediaWebSocket();\n mediaWs.setLogger(this._log);\n\n // Bind transport functions to session — sessions send ulaw bytes directly\n session._bindTransport(\n (audio: Buffer) => {\n mediaWs.sendAudio(audio.toString('base64'));\n },\n () => {\n mediaWs.sendClear();\n },\n async () => {\n await mediaWs.flush();\n const markName = `hangup-${Date.now()}`;\n mediaWs.sendMark(markName);\n await mediaWs.waitForMark(markName, 5000);\n mediaWs.close();\n },\n async (digit: string) => {\n mediaWs.sendDtmf(digit);\n },\n () => mediaWs.isConnected,\n );\n\n const sessionHandler = this._session;\n\n // Inject tools and recorder into session if supported\n if (\n 'setToolRegistry' in sessionHandler &&\n typeof sessionHandler.setToolRegistry === 'function'\n ) {\n sessionHandler.setToolRegistry(sessionTools);\n }\n if (\n recorder &&\n 'setRecorder' in sessionHandler &&\n typeof sessionHandler.setRecorder === 'function'\n ) {\n sessionHandler.setRecorder(recorder);\n }\n if ('setBuiltinTools' in sessionHandler && typeof sessionHandler.setBuiltinTools === 'function') {\n (sessionHandler as any).setBuiltinTools(this._builtinTools);\n }\n if ('setLogger' in sessionHandler && typeof sessionHandler.setLogger === 'function') {\n sessionHandler.setLogger(this._isPipelineSession ? this._pipelineLog : this._log);\n }\n\n // Save session handler for DTMF routing\n this._callSessions.set(session.callId, sessionHandler);\n\n // Handle inbound audio — feed raw ulaw to session (each session converts as needed)\n mediaWs.onAudio((ulawAudio: Buffer, _timestamp: number) => {\n if (sessionHandler) {\n sessionHandler.feedAudio(ulawAudio);\n }\n if (recorder) {\n recorder.writeInbound(ulawToPcm16(ulawAudio));\n }\n });\n\n // Handle inbound DTMF\n mediaWs.onDtmf((digit: string) => {\n this._onDtmfEvent(session, digit);\n });\n\n mediaWs.onClose(() => {\n this._log.info('Media stream stopped: %s', session.callId);\n if (recorder) {\n recorder.stop();\n }\n session._markEnded();\n });\n\n // Emit call_start\n session._emit('call_start');\n\n try {\n await mediaWs.connect(mediaWsUrl, this._apiKey);\n this._log.info('Media stream started: %s', session.callId);\n\n // Start the session handler\n await sessionHandler.start(session, sessionTools);\n\n // Wait for the call to end\n await session.wait();\n\n // Stop the session handler\n await sessionHandler.stop();\n } catch (err) {\n this._log.error({ err }, 'Call session error: %s', session.callId);\n } finally {\n // Clean up MCP clients\n if (mcpClients.length > 0) {\n sessionTools.clearMcpTools();\n for (const c of mcpClients) {\n await c.disconnect();\n }\n }\n\n mediaWs.close();\n if (recorder) {\n recorder.stop();\n }\n\n // Emit call_end\n session._emit('call_end');\n session._markEnded();\n this._activeSessions.delete(session.callId);\n this._callSessions.delete(session.callId);\n }\n },\n );\n }\n}\n","/**\n * Built-in tool 스키마 정의, 포맷 변환, 실행 헬퍼.\n *\n * 모든 세션(PipelineSession, OpenAIRealtime, GeminiRealtime)이 공통으로 사용하는\n * 내장 도구 스키마를 한 곳에서 관리한다.\n */\n\nimport { BuiltinTool } from '../builtin-tool.js';\nimport type { CallSession } from '../session.js';\n\n// ── 정규 스키마 (neutral 포맷) ──────────────────────────────────────\n\nconst HANG_UP = {\n name: 'hang_up',\n description:\n 'End the phone call. Use when the conversation is finished or the caller says goodbye.',\n parameters: { type: 'object' as const, properties: {} as Record<string, unknown> },\n} as const;\n\nconst COLLECT_DTMF = {\n name: 'collect_dtmf',\n description:\n '사용자로부터 DTMF(전화 키패드) 입력을 수집합니다. 반드시 사용자에게 무엇을 입력해야 하는지 안내한 후 호출하세요.',\n parameters: {\n type: 'object' as const,\n properties: {\n max_digits: { type: 'integer' as const, description: '수집할 최대 자릿수' },\n finish_on_key: { type: 'string' as const, description: '입력 종료 키 (기본: #)' },\n timeout: { type: 'integer' as const, description: '입력 대기 시간(초, 기본: 5)' },\n },\n required: ['max_digits'] as string[],\n },\n} as const;\n\nconst SEND_DTMF = {\n name: 'send_dtmf',\n description: 'DTMF 신호를 전송합니다. ARS 메뉴 탐색이나 내선번호 입력 시 사용합니다.',\n parameters: {\n type: 'object' as const,\n properties: {\n digits: {\n type: 'string' as const,\n description:\n \"전송할 번호 (0-9, *, #). 'w'는 500ms 대기, 'W'는 1000ms 대기. 예: '1', '1234#', '1w2'\",\n },\n },\n required: ['digits'] as string[],\n },\n} as const;\n\ntype NeutralSchema = typeof HANG_UP | typeof COLLECT_DTMF | typeof SEND_DTMF;\n\nconst TOOL_MAP = new Map<BuiltinTool, NeutralSchema>([\n [BuiltinTool.HANG_UP, HANG_UP],\n [BuiltinTool.COLLECT_DTMF, COLLECT_DTMF],\n [BuiltinTool.SEND_DTMF, SEND_DTMF],\n]);\n\nexport const BUILTIN_TOOL_NAMES: Set<string> = new Set(\n Array.from(TOOL_MAP.values()).map((s) => s.name),\n);\n\n// ── 포맷 변환 ───────────────────────────────────────────────────────\n\nfunction toChatCompletions(schema: NeutralSchema): Record<string, unknown> {\n return {\n type: 'function',\n function: {\n name: schema.name,\n description: schema.description,\n parameters: schema.parameters,\n },\n };\n}\n\nfunction toRealtime(schema: NeutralSchema): Record<string, unknown> {\n return {\n type: 'function',\n name: schema.name,\n description: schema.description,\n parameters: schema.parameters,\n };\n}\n\nfunction toGemini(schema: NeutralSchema): Record<string, unknown> {\n return {\n name: schema.name,\n description: schema.description,\n parameters: schema.parameters,\n };\n}\n\nconst CONVERTERS = {\n chat: toChatCompletions,\n realtime: toRealtime,\n gemini: toGemini,\n} as const;\n\n/**\n * 활성화된 builtin tool 스키마를 요청한 포맷으로 반환.\n */\nexport function getBuiltinToolSchemas(\n builtinTools: Set<BuiltinTool> | null,\n fmt: 'chat' | 'realtime' | 'gemini',\n): Array<Record<string, unknown>> {\n const converter = CONVERTERS[fmt];\n const result: Array<Record<string, unknown>> = [];\n for (const [toolEnum, schema] of TOOL_MAP) {\n if (builtinTools === null || builtinTools.has(toolEnum)) {\n result.push(converter(schema));\n }\n }\n return result;\n}\n\n// ── 공통 실행 헬퍼 ──────────────────────────────────────────────────\n\n/**\n * Builtin tool을 실행하고 결과 문자열을 반환한다.\n *\n * `funcName`이 builtin tool이 아니면 `null`을 반환한다.\n * `hang_up`의 경우 빈 문자열 `\"\"`을 반환한다 (호출자가 종료 처리).\n */\nexport function isBuiltinTool(name: string): boolean {\n return BUILTIN_TOOL_NAMES.has(name);\n}\n\nexport async function executeBuiltinTool(\n funcName: string,\n args: Record<string, unknown>,\n call: CallSession,\n): Promise<string | null> {\n if (funcName === 'hang_up') {\n await call.hangup();\n return '';\n }\n if (funcName === 'collect_dtmf') {\n try {\n const result = await call.collectDtmf({\n maxDigits: (args['max_digits'] as number) ?? 4,\n finishOnKey: (args['finish_on_key'] as string) ?? '#',\n timeout: (args['timeout'] as number) ?? 5,\n });\n return result || '(타임아웃 - 입력 없음)';\n } catch (e) {\n return `Error: ${e}`;\n }\n }\n if (funcName === 'send_dtmf') {\n try {\n await call.sendDtmfSequence((args['digits'] as string) ?? '');\n return 'sent';\n } catch (e) {\n return `Error: ${e}`;\n }\n }\n return null;\n}\n","/**\n * PipelineSession orchestrates STT -> LLM -> TTS for a voice call.\n */\n\nimport { pcm16ToUlaw, resamplePcm16, ulawToPcm16 } from '../audio.js';\nimport { BuiltinTool } from '../builtin-tool.js';\nimport type { AudioRecorder } from '../recorder.js';\nimport type { CallSession } from '../session.js';\nimport { ToolRegistry } from '../tool.js';\nimport type {\n ConversationMessage,\n LLM,\n LLMChunk,\n Session,\n STT,\n TTS,\n} from './base.js';\nimport type { Logger } from 'pino';\nimport { NOOP_LOGGER } from '../logger.js';\nimport { BUILTIN_TOOL_NAMES, executeBuiltinTool, getBuiltinToolSchemas } from './builtin-tool-schemas.js';\n\nexport interface PipelineSessionOptions {\n stt: STT;\n llm: LLM;\n tts: TTS;\n /** System prompt for the LLM. */\n systemPrompt?: string;\n /** Send initial greeting. Default: true */\n greeting?: boolean;\n /** Language code. Default: 'ko' */\n language?: string;\n /** Tool registry for function calling. */\n toolRegistry?: ToolRegistry;\n /** Audio recorder for the session. */\n recorder?: AudioRecorder;\n /** LLM temperature. */\n temperature?: number;\n /** Max tokens for LLM generation. */\n maxTokens?: number;\n /** Sample rate for audio. Default: 8000 */\n sampleRate?: number;\n /** Whether to interrupt TTS when user starts speaking. Default: true */\n interruptOnSpeech?: boolean;\n}\n\nexport class PipelineSession implements Session {\n private _stt: STT;\n private _llm: LLM;\n private _tts: TTS;\n private _systemPrompt: string | undefined;\n private _greeting: boolean;\n private _language: string;\n private _temperature: number | undefined;\n private _maxTokens: number | undefined;\n private _sampleRate: number;\n private _interruptOnSpeech: boolean;\n\n private _callSession: CallSession | null = null;\n private _tools: ToolRegistry | null = null;\n private _recorder: AudioRecorder | null = null;\n private _conversation: ConversationMessage[] = [];\n private _audioBuffer: Buffer[] = [];\n private _running = false;\n private _speaking = false;\n private _builtinTools: Set<BuiltinTool> | null = null;\n private _log: Logger = NOOP_LOGGER;\n\n constructor(options: PipelineSessionOptions) {\n this._stt = options.stt;\n this._llm = options.llm;\n this._tts = options.tts;\n this._systemPrompt = options.systemPrompt;\n this._greeting = options.greeting ?? true;\n this._language = options.language ?? 'ko';\n this._temperature = options.temperature;\n this._maxTokens = options.maxTokens;\n this._sampleRate = options.sampleRate ?? 8000;\n this._interruptOnSpeech = options.interruptOnSpeech ?? true;\n if (options.toolRegistry) this._tools = options.toolRegistry;\n if (options.recorder) this._recorder = options.recorder;\n }\n\n setToolRegistry(registry: ToolRegistry): void {\n this._tools = registry;\n }\n\n setRecorder(recorder: AudioRecorder): void {\n this._recorder = recorder;\n }\n\n setBuiltinTools(tools: Set<BuiltinTool>): void {\n this._builtinTools = tools;\n }\n\n setLogger(logger: Logger): void {\n this._log = logger;\n if ('setLogger' in this._stt && typeof (this._stt as any).setLogger === 'function') {\n (this._stt as any).setLogger(logger);\n }\n if ('setLogger' in this._tts && typeof (this._tts as any).setLogger === 'function') {\n (this._tts as any).setLogger(logger);\n }\n }\n\n async start(callSession: CallSession, tools?: ToolRegistry): Promise<void> {\n this._callSession = callSession;\n this._tools = tools ?? null;\n this._running = true;\n this._log.info('PipelineSession started');\n this._conversation = [];\n\n if (this._systemPrompt) {\n this._conversation.push({\n role: 'system',\n content: this._systemPrompt,\n });\n }\n\n // Generate initial greeting if enabled\n if (this._greeting) {\n this._generateGreeting().catch((err) => {\n this._log.error({ err }, 'Greeting error');\n });\n }\n\n // Start the STT listening loop\n this._runSttLoop().catch((err) => {\n this._log.error({ err }, 'STT loop error');\n });\n }\n\n feedAudio(audio: Buffer): void {\n if (this._running) {\n this._audioBuffer.push(audio);\n }\n }\n\n async feedDtmf(digits: string): Promise<void> {\n this._conversation.push({\n role: 'user',\n content: `[DTMF 입력: ${digits}]`,\n });\n await this._respond();\n }\n\n async stop(): Promise<void> {\n this._running = false;\n this._log.info('PipelineSession stopped');\n this._audioBuffer = [];\n }\n\n private async _runSttLoop(): Promise<void> {\n const audioStream = this._createAudioStream();\n\n for await (const event of this._stt.transcribe(audioStream, {\n sampleRate: this._sampleRate,\n })) {\n if (!this._running) break;\n\n if (event.type === 'interim' && this._speaking && this._interruptOnSpeech) {\n // User started speaking while TTS is active - interrupt\n this._speaking = false;\n if (this._callSession) {\n this._callSession.clearAudio();\n }\n this._log.info('Barge-in: \"%s\"', event.transcript.substring(0, 30));\n }\n\n if (event.type === 'final' && event.transcript.trim()) {\n this._log.info('STT: %s', event.transcript);\n await this._handleUserSpeech(event.transcript);\n }\n }\n }\n\n private async *_createAudioStream(): AsyncGenerator<Buffer> {\n while (this._running) {\n if (this._audioBuffer.length > 0) {\n const ulaw = this._audioBuffer.shift()!;\n // G.711 ulaw 8kHz → PCM16 8kHz → PCM16 16kHz\n const pcm8k = ulawToPcm16(ulaw);\n const pcm16k = resamplePcm16(pcm8k, 8000, 16000);\n yield pcm16k;\n } else {\n // Wait a bit before checking again\n await new Promise((resolve) => setTimeout(resolve, 20));\n }\n }\n }\n\n private async _generateGreeting(): Promise<void> {\n await new Promise((resolve) => setTimeout(resolve, 500));\n await this._respond();\n }\n\n private async _handleUserSpeech(transcript: string): Promise<void> {\n this._conversation.push({ role: 'user', content: transcript });\n await this._respond();\n }\n\n private _buildEffectiveTools(): ToolRegistry | undefined {\n const builtinSchemas = getBuiltinToolSchemas(this._builtinTools, 'chat');\n // Filter to only DTMF tools (hang_up is handled at session level, not LLM tool)\n const dtmfSchemas = builtinSchemas.filter((s) => {\n const name = (s['function'] as Record<string, unknown>)?.['name'] as string;\n return name === 'collect_dtmf' || name === 'send_dtmf';\n });\n\n if (dtmfSchemas.length === 0) return this._tools ?? undefined;\n\n // Inject DTMF tool stubs into a forked registry so the LLM sees them\n const base = this._tools ? this._tools.fork() : new ToolRegistry();\n for (const schema of dtmfSchemas) {\n const fn = schema['function'] as Record<string, unknown>;\n const params = fn['parameters'] as Record<string, unknown>;\n base.register({\n name: fn['name'] as string,\n description: fn['description'] as string,\n parameters: (params['properties'] ?? {}) as Record<string, unknown>,\n required: (params['required'] ?? []) as string[],\n handler: async () => '',\n });\n }\n return base;\n }\n\n private async _respond(): Promise<void> {\n // Run LLM generation (may include tool calls)\n let fullResponse = '';\n const textChunks: string[] = [];\n\n const effectiveTools = this._buildEffectiveTools();\n const llmStream = this._llm.generate(this._conversation, {\n tools: effectiveTools,\n temperature: this._temperature,\n maxTokens: this._maxTokens,\n });\n\n for await (const chunk of llmStream) {\n if (!this._running) break;\n\n if (chunk.type === 'text' && chunk.text) {\n textChunks.push(chunk.text);\n fullResponse += chunk.text;\n } else if (chunk.type === 'tool_call' && chunk.toolCall) {\n await this._handleToolCall(chunk);\n }\n }\n\n if (fullResponse.trim()) {\n this._log.info('Assistant: %s', fullResponse.substring(0, 100));\n this._conversation.push({ role: 'assistant', content: fullResponse });\n // Synthesize and send audio\n await this._synthesizeAndSend(fullResponse);\n }\n }\n\n private async _handleToolCall(chunk: LLMChunk): Promise<void> {\n if (!chunk.toolCall) return;\n\n const { id, name, arguments: argsStr } = chunk.toolCall;\n\n try {\n const args = JSON.parse(argsStr) as Record<string, unknown>;\n\n // Built-in tools - intercept before registry lookup\n if (BUILTIN_TOOL_NAMES.has(name) && this._callSession) {\n const result = await executeBuiltinTool(name, args, this._callSession);\n if (result !== null) {\n if (name === 'hang_up') return;\n this._conversation.push({ role: 'tool', content: result, tool_call_id: id, name });\n await this._respond();\n return;\n }\n }\n\n if (!this._tools) return;\n const result = await this._tools.call(name, args);\n\n this._conversation.push({\n role: 'assistant',\n content: '',\n // Tool call info stored in the message flow\n });\n this._conversation.push({\n role: 'tool',\n content: typeof result === 'string' ? result : JSON.stringify(result),\n tool_call_id: id,\n name,\n });\n\n // Re-generate after tool result\n const effectiveTools = this._buildEffectiveTools();\n let followUpText = '';\n const followUpStream = this._llm.generate(this._conversation, {\n tools: effectiveTools,\n temperature: this._temperature,\n maxTokens: this._maxTokens,\n });\n\n for await (const followChunk of followUpStream) {\n if (!this._running) break;\n if (followChunk.type === 'text' && followChunk.text) {\n followUpText += followChunk.text;\n }\n }\n\n if (followUpText.trim()) {\n this._conversation.push({ role: 'assistant', content: followUpText });\n await this._synthesizeAndSend(followUpText);\n }\n } catch (err) {\n this._log.error({ err }, 'Tool call failed: %s', name);\n }\n }\n\n private async _synthesizeAndSend(text: string): Promise<void> {\n if (!this._callSession || !this._running) return;\n\n this._speaking = true;\n\n try {\n for await (const audioChunk of this._tts.synthesize(text, {\n sampleRate: this._sampleRate,\n })) {\n if (!this._running || !this._speaking) break;\n if (this._recorder) {\n const pcm8k = this._sampleRate !== 8000\n ? resamplePcm16(audioChunk, this._sampleRate, 8000)\n : audioChunk\n this._recorder.writeOutbound(pcm8k)\n }\n // Resample TTS output → 8kHz → ulaw, send in 160B frames\n const pcm8k = resamplePcm16(audioChunk, this._sampleRate, 8000);\n const ulaw = pcm16ToUlaw(pcm8k);\n for (let off = 0; off < ulaw.length; off += 160) {\n let chunk = ulaw.subarray(off, off + 160);\n if (chunk.length < 160) {\n chunk = Buffer.concat([chunk, Buffer.alloc(160 - chunk.length, 0xff)]);\n }\n this._callSession.sendAudio(chunk);\n }\n }\n } catch (err) {\n this._log.error({ err }, 'TTS error');\n } finally {\n this._speaking = false;\n }\n }\n}\n","/**\n * OpenAI Realtime API session (speech-to-speech).\n *\n * Matches Python SDK's OpenAIRealtime implementation.\n */\n\nimport type { CallSession } from '../../session.js';\nimport type { ToolRegistry } from '../../tool.js';\nimport type { AudioRecorder } from '../../recorder.js';\nimport type { Session } from '../base.js';\nimport { ulawToPcm16 } from '../../audio.js';\nimport { BuiltinTool } from '../../builtin-tool.js';\nimport type { Logger } from 'pino';\nimport { NOOP_LOGGER } from '../../logger.js';\nimport {\n BUILTIN_TOOL_NAMES,\n executeBuiltinTool,\n getBuiltinToolSchemas,\n} from '../builtin-tool-schemas.js';\n\nconst OPENAI_REALTIME_URL = 'wss://api.openai.com/v1/realtime?model=';\n\n/**\n * 현재 재생 중인 응답의 상태. 하나의 assistant 응답에 대한 모든 정보를 담는다.\n */\ninterface PlaybackState {\n itemId: string; // OpenAI conversation item ID\n startTs: number; // 첫 delta 수신 시점의 timestamp (Date.now)\n sentChunks: number; // 플랫폼으로 전송된 오디오 청크 수 (각 20ms)\n generating: boolean; // OpenAI가 아직 오디오를 생성 중인지\n audioRemainder: Buffer; // 160B 미만 잔여 오디오 버퍼\n}\n\nexport interface OpenAIRealtimeOptions {\n /** OpenAI API key. Falls back to OPENAI_API_KEY env var. */\n apiKey?: string;\n /** System prompt / instructions for the AI. */\n systemPrompt?: string;\n /** Model to use. Default: 'gpt-realtime-1.5' */\n model?: string;\n /** Voice ID. Default: 'marin' */\n voice?: string;\n /** Language code (BCP 47). Default: 'ko' */\n language?: string;\n /**\n * Turn detection configuration. Default: semantic_vad with eagerness 'medium'.\n * - `{ type: 'semantic_vad', eagerness?: 'low'|'medium'|'high'|'auto', interrupt_response?: boolean }`\n * - `{ type: 'server_vad', threshold?: number, silence_duration_ms?: number, prefix_padding_ms?: number }`\n * - `null` to disable turn detection\n */\n turnDetection?: Record<string, unknown> | null;\n /** Send initial greeting. Default: true */\n greeting?: boolean;\n}\n\nexport class OpenAIRealtime implements Session {\n private _apiKey: string;\n private _systemPrompt: string;\n private _model: string;\n private _voice: string;\n private _language: string;\n private _turnDetection!: Record<string, unknown> | null;\n private _greeting: boolean;\n\n private _log: Logger = NOOP_LOGGER;\n private _builtinTools: Set<BuiltinTool> | null = null;\n\n setLogger(logger: Logger): void {\n this._log = logger;\n }\n\n setBuiltinTools(tools: Set<BuiltinTool>): void {\n this._builtinTools = tools;\n }\n\n private _ws: import('ws').WebSocket | null = null;\n private _call: CallSession | null = null;\n private _tools: ToolRegistry | null = null;\n private _recorder: AudioRecorder | null = null;\n private _closed = false;\n\n // PlaybackState — 현재 재생 중인 응답 상태\n private _playback: PlaybackState | null = null;\n private _latestMediaTs = 0;\n\n // Pending tool call tracking — 인터럽트 시 취소용\n private _pendingToolCalls = new Map<string, AbortController>();\n\n // Response state tracking — prevent sending response.create while one is active\n private _responseInProgress = false;\n private _onResponseDone: (() => void) | null = null;\n\n constructor(options: OpenAIRealtimeOptions = {}) {\n this._apiKey = options.apiKey ?? process.env['OPENAI_API_KEY'] ?? '';\n this._systemPrompt = options.systemPrompt ?? '';\n this._model = options.model ?? 'gpt-realtime-1.5';\n this._voice = options.voice ?? 'marin';\n this._language = options.language ?? 'ko';\n this._turnDetection =\n options.turnDetection !== undefined\n ? options.turnDetection\n : { type: 'semantic_vad', eagerness: 'medium', interrupt_response: true };\n this._greeting = options.greeting ?? true;\n }\n\n /** Inject per-call ToolRegistry. */\n setToolRegistry(registry: ToolRegistry): void {\n this._tools = registry;\n }\n\n /** Inject per-call AudioRecorder. */\n setRecorder(recorder: AudioRecorder): void {\n this._recorder = recorder;\n }\n\n async start(callSession: CallSession, tools?: ToolRegistry): Promise<void> {\n this._call = callSession;\n if (tools) this._tools = tools;\n this._closed = false;\n this._playback = null;\n this._latestMediaTs = 0;\n\n if (!this._apiKey) {\n throw new Error('OpenAI API key is required. Set OPENAI_API_KEY or pass apiKey option.');\n }\n\n const { WebSocket } = await import('ws');\n const url = `${OPENAI_REALTIME_URL}${this._model}`;\n\n this._ws = new WebSocket(url, {\n headers: {\n Authorization: `Bearer ${this._apiKey}`,\n 'OpenAI-Beta': 'realtime=v1',\n },\n });\n\n return new Promise<void>((resolve, reject) => {\n const ws = this._ws!;\n\n ws.on('open', () => {\n this._sendSessionUpdate();\n this._log.info('OpenAI Realtime connected');\n\n // Send initial greeting if enabled (matching Python SDK)\n if (this._greeting) {\n this._send({ type: 'response.create' });\n }\n\n resolve();\n });\n\n ws.on('message', (data: Buffer | string) => {\n try {\n const msg = JSON.parse(data.toString()) as Record<string, unknown>;\n this._handleMessage(msg);\n } catch {\n // Ignore parse errors\n }\n });\n\n ws.on('close', () => {\n this._closed = true;\n });\n\n ws.on('error', (err: Error) => {\n if (!this._ws) {\n reject(err);\n }\n this._log.error({ err }, 'OpenAI Realtime WS error');\n });\n });\n }\n\n async feedDtmf(digits: string): Promise<void> {\n await this._waitForResponseDone();\n this._send({\n type: 'conversation.item.create',\n item: {\n type: 'message',\n role: 'user',\n content: [{ type: 'input_text', text: `[DTMF 입력: ${digits}]` }],\n },\n });\n this._send({ type: 'response.create' });\n }\n\n feedAudio(audio: Buffer): void {\n this._latestMediaTs = Date.now();\n if (this._ws && this._ws.readyState === 1 && !this._closed) {\n // Agent path: audio comes as ulaw directly from platform, no conversion needed\n this._send({\n type: 'input_audio_buffer.append',\n audio: audio.toString('base64'),\n });\n }\n }\n\n async stop(): Promise<void> {\n this._closed = true;\n // Pending tool call 정리\n for (const [, controller] of this._pendingToolCalls) {\n controller.abort();\n }\n this._pendingToolCalls.clear();\n if (this._ws) {\n this._ws.close();\n this._ws = null;\n }\n }\n\n private _sendSessionUpdate(): void {\n if (!this._ws || this._ws.readyState !== 1) return;\n\n // Build tool schemas: user tools + builtin tools\n // OpenAI Realtime API uses flat tool format: { type, name, description, parameters }\n const toolSchemas: Array<Record<string, unknown>> = this._tools\n ? this._tools.toOpenAITools().map((t) => ({ type: 'function' as const, ...t.function }))\n : [];\n toolSchemas.push(...getBuiltinToolSchemas(this._builtinTools, 'realtime'));\n\n this._send({\n type: 'session.update',\n session: {\n modalities: ['text', 'audio'],\n voice: this._voice,\n instructions: this._systemPrompt,\n input_audio_format: 'g711_ulaw',\n output_audio_format: 'g711_ulaw',\n input_audio_transcription: {\n model: 'whisper-1',\n language: this._language,\n },\n input_audio_noise_reduction: { type: 'far_field' },\n turn_detection: this._turnDetection,\n tools: toolSchemas,\n },\n });\n }\n\n private _handleMessage(msg: Record<string, unknown>): void {\n const type = msg['type'] as string;\n\n switch (type) {\n case 'response.audio.delta': {\n this._handleAudioDelta(msg);\n break;\n }\n case 'response.audio.done': {\n if (this._playback) {\n this._playback.generating = false;\n if (this._playback.audioRemainder.length > 0) {\n const padded = Buffer.concat([\n this._playback.audioRemainder,\n Buffer.alloc(160 - this._playback.audioRemainder.length, 0xff),\n ]);\n if (this._call) {\n this._call.sendAudio(padded);\n }\n this._playback.sentChunks++;\n this._playback.audioRemainder = Buffer.alloc(0);\n }\n }\n break;\n }\n case 'input_audio_buffer.speech_started': {\n this._handleTruncation();\n break;\n }\n case 'response.output_item.done': {\n // Handle tool calls — fire-and-forget (matching Python SDK)\n const item = msg['item'] as Record<string, unknown> | undefined;\n if (item && item['type'] === 'function_call') {\n this._handleToolCall(item);\n // _playback은 여기서 리셋하지 않는다.\n // 큐에 재생 대기 중인 오디오가 있을 수 있고,\n // 인터럽트 시 truncate하려면 item_id가 필요하다.\n }\n break;\n }\n case 'conversation.item.input_audio_transcription.completed': {\n // User transcript\n if (this._call) {\n this._call._emit('transcript', 'user', (msg['transcript'] as string) ?? '');\n }\n break;\n }\n case 'response.audio_transcript.done': {\n // Assistant transcript\n if (this._call) {\n this._call._emit('transcript', 'assistant', (msg['transcript'] as string) ?? '');\n }\n break;\n }\n case 'response.created': {\n this._responseInProgress = true;\n break;\n }\n case 'response.done': {\n this._responseInProgress = false;\n if (this._onResponseDone) {\n const cb = this._onResponseDone;\n this._onResponseDone = null;\n cb();\n }\n break;\n }\n case 'error': {\n this._log.error({ apiError: msg['error'] }, 'OpenAI error');\n break;\n }\n }\n }\n\n private _handleAudioDelta(msg: Record<string, unknown>): void {\n if (this._playback === null) {\n this._playback = {\n itemId: (msg['item_id'] as string) || '',\n startTs: this._latestMediaTs || Date.now(),\n sentChunks: 0,\n generating: true,\n audioRemainder: Buffer.alloc(0),\n };\n } else if (msg['item_id']) {\n this._playback.itemId = msg['item_id'] as string;\n }\n\n const pb = this._playback;\n const ulaw = Buffer.from(msg['delta'] as string, 'base64');\n\n if (this._recorder) {\n this._recorder.writeOutbound(ulawToPcm16(ulaw));\n }\n\n // Align to 160B (20ms at 8kHz ulaw) frames, matching Python SDK\n const combined = Buffer.concat([pb.audioRemainder, ulaw]);\n const chunkSize = 160;\n const fullEnd = Math.floor(combined.length / chunkSize) * chunkSize;\n\n for (let off = 0; off < fullEnd; off += chunkSize) {\n if (this._call) {\n this._call.sendAudio(combined.subarray(off, off + chunkSize));\n }\n pb.sentChunks++;\n }\n\n pb.audioRemainder = combined.subarray(fullEnd);\n }\n\n private _handleTruncation(): void {\n // 진행 중인 tool call 취소\n for (const [, controller] of this._pendingToolCalls) {\n controller.abort();\n }\n this._pendingToolCalls.clear();\n\n // 큐에 남아있는 오디오를 항상 비운다\n if (this._call) {\n this._call.clearAudio();\n }\n\n const pb = this._playback;\n if (pb === null) {\n return;\n }\n\n // interrupt_response=true이므로 서버가 자동으로 응답을 취소한다.\n // response.cancel을 중복 호출하면 서버 상태가 꼬일 수 있으므로 생략.\n // conversation.item.truncate는 오디오와 transcript를 모두 잘라내어\n // 대화 맥락을 손실시키므로 호출하지 않는다.\n const playedMs = Math.max(0, (this._latestMediaTs || Date.now()) - pb.startTs);\n\n this._log.info(\n '[Interrupt] item=%s played=%dms total=%dms',\n pb.itemId,\n playedMs,\n pb.sentChunks * 20,\n );\n\n this._playback = null;\n }\n\n private async _handleToolCall(item: Record<string, unknown>): Promise<void> {\n const funcName = item['name'] as string;\n const callId = item['call_id'] as string;\n this._log.info('Tool call: %s', funcName);\n\n const controller = new AbortController();\n this._pendingToolCalls.set(callId, controller);\n\n try {\n // Built-in tools\n if (BUILTIN_TOOL_NAMES.has(funcName) && this._call) {\n const args = JSON.parse((item['arguments'] as string) ?? '{}') as Record<string, unknown>;\n const result = await executeBuiltinTool(funcName, args, this._call);\n if (result !== null) {\n if (funcName === 'hang_up') return;\n if (controller.signal.aborted) return;\n await this._waitForResponseDone();\n this._send({\n type: 'conversation.item.create',\n item: {\n type: 'function_call_output',\n call_id: callId,\n output: result,\n },\n });\n this._send({ type: 'response.create' });\n return;\n }\n }\n\n if (!this._tools || !this._tools.has(funcName)) {\n this._log.error('Unknown tool: %s', funcName);\n await this._waitForResponseDone();\n this._send({\n type: 'conversation.item.create',\n item: {\n type: 'function_call_output',\n call_id: callId,\n output: JSON.stringify({ error: `Unknown tool: ${funcName}` }),\n },\n });\n this._send({ type: 'response.create' });\n return;\n }\n\n let result: unknown;\n try {\n const args = JSON.parse((item['arguments'] as string) ?? '{}') as Record<string, unknown>;\n result = await this._tools.call(funcName, args);\n } catch (err) {\n this._log.error({ err }, 'Tool call failed: %s', funcName);\n result = `Error: ${err}`;\n }\n\n if (controller.signal.aborted) {\n this._log.info('Tool call cancelled (user interrupted): %s', funcName);\n return;\n }\n\n const resultStr = typeof result === 'string' ? result : JSON.stringify(result);\n await this._waitForResponseDone();\n this._send({\n type: 'conversation.item.create',\n item: {\n type: 'function_call_output',\n call_id: callId,\n output: resultStr,\n },\n });\n this._log.info('[ToolResult] %s call_id=%s len=%d', funcName, callId, resultStr.length);\n this._send({ type: 'response.create' });\n } finally {\n this._pendingToolCalls.delete(callId);\n }\n }\n\n private _waitForResponseDone(): Promise<void> {\n if (!this._responseInProgress) return Promise.resolve();\n return new Promise<void>((resolve) => {\n this._onResponseDone = resolve;\n });\n }\n\n private _send(data: Record<string, unknown>): void {\n if (this._ws && this._ws.readyState === 1 && !this._closed) {\n this._ws.send(JSON.stringify(data));\n }\n }\n}\n","/**\n * Google Gemini Realtime API session (speech-to-speech).\n *\n * Uses @google/genai SDK's live.connect() method.\n * Matches Python SDK's GeminiRealtime implementation (v0.14.0).\n */\n\nimport type { CallSession } from '../../session.js';\nimport type { ToolRegistry } from '../../tool.js';\nimport type { AudioRecorder } from '../../recorder.js';\nimport type { Session } from '../base.js';\nimport type { LiveServerMessage, LiveServerToolCall } from '@google/genai/node';\nimport { pcm16ToUlaw, resamplePcm16, ulawToPcm16 } from '../../audio.js';\nimport { BuiltinTool } from '../../builtin-tool.js';\nimport type { Logger } from 'pino';\nimport { NOOP_LOGGER } from '../../logger.js';\nimport { BUILTIN_TOOL_NAMES, executeBuiltinTool, getBuiltinToolSchemas } from '../builtin-tool-schemas.js';\n\n/**\n * $ref 문자열을 $defs에서 찾아 반환한다.\n */\nfunction resolveRef(ref: string, defs: Record<string, unknown>): Record<string, unknown> {\n const parts = ref.replace(/^#\\//, '').split('/');\n let result: unknown = defs;\n for (const part of parts) {\n if (result && typeof result === 'object' && !Array.isArray(result)) {\n result = (result as Record<string, unknown>)[part];\n } else {\n return {};\n }\n }\n return typeof result === 'object' && result !== null && !Array.isArray(result)\n ? (result as Record<string, unknown>)\n : {};\n}\n\n/**\n * JSON Schema를 Gemini functionDeclarations 호환 형식으로 변환한다.\n *\n * - $ref를 인라인으로 resolve\n * - oneOf/anyOf/allOf를 단순화 (첫 번째 object 타입 또는 첫 번째 항목 사용)\n * - 지원되지 않는 키워드 제거\n * - 재귀 깊이 제한으로 순환 참조 방지\n */\nfunction sanitizeSchemaForGemini(\n schema: Record<string, unknown>,\n defs?: Record<string, unknown>,\n depth = 0,\n): Record<string, unknown> {\n if (depth > 15) return { type: 'object', properties: {} };\n if (!schema || typeof schema !== 'object') return { type: 'object', properties: {} };\n\n // 최상위에서 $defs 추출\n if (defs === undefined) {\n defs = (schema['$defs'] ?? schema['definitions'] ?? {}) as Record<string, unknown>;\n }\n\n // $ref resolve\n if (typeof schema['$ref'] === 'string') {\n const resolved = resolveRef(schema['$ref'], { $defs: defs, definitions: defs });\n if (resolved && Object.keys(resolved).length > 0) {\n return sanitizeSchemaForGemini(resolved, defs, depth + 1);\n }\n return { type: 'object', properties: {} };\n }\n\n // oneOf / anyOf / allOf 처리\n for (const comboKey of ['oneOf', 'anyOf', 'allOf'] as const) {\n const variants = schema[comboKey];\n if (Array.isArray(variants) && variants.length > 0) {\n // object 타입 우선 선택\n for (const v of variants) {\n if (v && typeof v === 'object') {\n const resolved = sanitizeSchemaForGemini(v as Record<string, unknown>, defs, depth + 1);\n if (resolved['type'] === 'object' && resolved['properties']) {\n return resolved;\n }\n }\n }\n // 없으면 첫 번째 항목\n const first = variants[0];\n if (first && typeof first === 'object') {\n return sanitizeSchemaForGemini(first as Record<string, unknown>, defs, depth + 1);\n }\n }\n }\n\n const result: Record<string, unknown> = {};\n\n // type 처리 - 배열 type에서 null 제거\n let schemaType = schema['type'];\n if (Array.isArray(schemaType)) {\n const nonNull = schemaType.filter((t) => t !== 'null');\n schemaType = nonNull[0] ?? 'string';\n }\n if (schemaType) result['type'] = schemaType;\n\n // description 유지\n if (schema['description']) result['description'] = schema['description'];\n\n // enum 유지\n if (schema['enum']) result['enum'] = schema['enum'];\n\n // required 유지\n if (schema['required']) result['required'] = schema['required'];\n\n // properties 재귀 처리\n if (schema['properties'] && typeof schema['properties'] === 'object') {\n const props: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(schema['properties'] as Record<string, unknown>)) {\n if (val && typeof val === 'object') {\n props[key] = sanitizeSchemaForGemini(val as Record<string, unknown>, defs, depth + 1);\n }\n }\n result['properties'] = props;\n }\n\n // items 재귀 처리 (array)\n if (schema['items'] && typeof schema['items'] === 'object' && !Array.isArray(schema['items'])) {\n result['items'] = sanitizeSchemaForGemini(\n schema['items'] as Record<string, unknown>,\n defs,\n depth + 1,\n );\n }\n\n // type이 없고 properties가 있으면 object로 추정\n if (!result['type'] && result['properties']) result['type'] = 'object';\n\n // type이 object인데 properties가 없으면 빈 properties 추가\n if (result['type'] === 'object' && !result['properties']) result['properties'] = {};\n\n return result;\n}\n\nexport interface GeminiRealtimeOptions {\n /** Google API key. Falls back to GOOGLE_API_KEY env var. */\n apiKey?: string;\n /** System prompt / instructions for the AI. */\n systemPrompt?: string;\n /** Model to use. Default: 'gemini-2.5-flash-native-audio-preview-12-2025' */\n model?: string;\n /** Voice name. Default: 'Kore' */\n voice?: string;\n /** Language code. Default: 'ko' */\n language?: string;\n /** Send initial greeting. Default: true */\n greeting?: boolean;\n}\n\nexport class GeminiRealtime implements Session {\n private _apiKey: string;\n private _systemPrompt: string;\n private _model: string;\n private _voice: string;\n private _language: string;\n private _greeting: boolean;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _session: any = null;\n private _call: CallSession | null = null;\n private _tools: ToolRegistry | null = null;\n private _recorder: AudioRecorder | null = null;\n private _closed = false;\n private _sentAudioChunks = 0;\n private _audioRemainder: Buffer = Buffer.alloc(0);\n private _builtinTools: Set<BuiltinTool> | null = null;\n private _toolCallInProgress = false;\n private _log: Logger = NOOP_LOGGER;\n\n constructor(options: GeminiRealtimeOptions = {}) {\n this._apiKey = options.apiKey ?? process.env['GOOGLE_API_KEY'] ?? '';\n this._systemPrompt = options.systemPrompt ?? '';\n this._model = options.model ?? 'gemini-2.5-flash-native-audio-preview-12-2025';\n this._voice = options.voice ?? 'Kore';\n this._language = options.language ?? 'ko';\n this._greeting = options.greeting ?? true;\n }\n\n /** Inject per-call ToolRegistry. */\n setToolRegistry(registry: ToolRegistry): void {\n this._tools = registry;\n }\n\n /** Inject per-call AudioRecorder. */\n setRecorder(recorder: AudioRecorder): void {\n this._recorder = recorder;\n }\n\n setBuiltinTools(tools: Set<BuiltinTool>): void {\n this._builtinTools = tools;\n }\n\n setLogger(logger: Logger): void {\n this._log = logger;\n }\n\n async start(callSession: CallSession, tools?: ToolRegistry): Promise<void> {\n this._call = callSession;\n if (tools) this._tools = tools;\n this._closed = false;\n this._sentAudioChunks = 0;\n this._audioRemainder = Buffer.alloc(0);\n\n if (!this._apiKey) {\n throw new Error('Google API key is required. Set GOOGLE_API_KEY or pass apiKey option.');\n }\n\n // @google/genai의 conditional exports 타입이 bundler 모드에서\n // live 프로퍼티를 인식하지 못하므로 node 엔트리 직접 import\n const { GoogleGenAI } = await import('@google/genai/node');\n const client = new GoogleGenAI({ apiKey: this._apiKey });\n\n // Build config\n const config: Record<string, unknown> = {\n responseModalities: ['AUDIO'],\n speechConfig: {\n voiceConfig: {\n prebuiltVoiceConfig: {\n voiceName: this._voice,\n },\n },\n },\n inputAudioTranscription: {},\n outputAudioTranscription: {},\n };\n\n if (this._systemPrompt) {\n config['systemInstruction'] = this._systemPrompt;\n }\n\n // Tools\n const toolSchemas = this._buildToolSchemas();\n if (toolSchemas.length > 0) {\n config['tools'] = [{ functionDeclarations: toolSchemas }];\n }\n\n this._session = await client.live.connect({\n model: this._model,\n config,\n callbacks: {\n onmessage: (msg) => this._handleMessage(msg),\n onerror: (err) => {\n this._log.error({ err }, 'Gemini SDK error');\n },\n onclose: (ev) => {\n this._log.info({ code: (ev as { code?: number })?.code ?? 'unknown' }, 'Gemini connection closed');\n this._closed = true;\n },\n },\n });\n\n // Send greeting\n if (this._greeting) {\n this._session.sendClientContent({\n turns: [\n {\n role: 'user',\n parts: [{ text: '인사해 주세요.' }],\n },\n ],\n turnComplete: true,\n });\n }\n }\n\n feedAudio(audio: Buffer): void {\n if (this._session && !this._closed && !this._toolCallInProgress) {\n // G.711 ulaw 8kHz → PCM16 8kHz → PCM16 16kHz\n const pcm8k = ulawToPcm16(audio);\n if (this._recorder) {\n this._recorder.writeInbound(pcm8k);\n }\n const pcm16k = resamplePcm16(pcm8k, 8000, 16000);\n\n // SDK Blob.data expects base64 string, not Buffer\n this._session.sendRealtimeInput({\n audio: {\n data: Buffer.from(pcm16k).toString('base64'),\n mimeType: 'audio/pcm;rate=16000',\n },\n });\n }\n }\n\n async feedDtmf(digits: string): Promise<void> {\n if (this._session) {\n this._session.sendClientContent({\n turns: [{ role: 'user', parts: [{ text: `[DTMF 입력: ${digits}]` }] }],\n turnComplete: true,\n });\n }\n }\n\n async stop(): Promise<void> {\n this._closed = true;\n if (this._session) {\n try {\n this._session.close();\n } catch {\n // Ignore close errors\n }\n this._session = null;\n }\n }\n\n private _buildToolSchemas(): Array<Record<string, unknown>> {\n const toolDefs: Array<Record<string, unknown>> = this._tools\n ? this._tools.toOpenAITools().map((t) => ({\n name: t.function.name,\n description: t.function.description,\n parameters: sanitizeSchemaForGemini(\n (t.function.parameters ?? { type: 'object', properties: {} }) as Record<\n string,\n unknown\n >,\n ),\n }))\n : [];\n toolDefs.push(...getBuiltinToolSchemas(this._builtinTools, 'gemini'));\n return toolDefs;\n }\n\n private _handleMessage(msg: LiveServerMessage): void {\n if (!this._call) return;\n\n // Handle server content\n const serverContent = msg.serverContent;\n if (serverContent) {\n // Audio from model turn\n const modelTurn = serverContent.modelTurn;\n if (modelTurn) {\n for (const part of modelTurn.parts ?? []) {\n const inlineData = part.inlineData;\n if (inlineData?.data) {\n const mimeType = inlineData.mimeType ?? '';\n if (mimeType.includes('audio')) {\n this._handleAudioData(inlineData.data as string);\n }\n }\n // NOTE: modelTurn text는 outputTranscription과 중복이므로 emit하지 않음\n }\n }\n\n // Turn complete - flush audio remainder\n if (serverContent.turnComplete) {\n this._log.debug('Turn complete');\n this._flushAudioRemainder();\n }\n\n // Barge-in (interrupt)\n if (serverContent.interrupted) {\n this._log.info('Barge-in detected');\n if (this._call) {\n this._call.clearAudio();\n }\n this._sentAudioChunks = 0;\n this._audioRemainder = Buffer.alloc(0);\n }\n\n // Input transcription (under serverContent in SDK)\n const inputText = serverContent.inputTranscription?.text;\n if (inputText && this._call) {\n this._log.info('User: %s', inputText);\n this._call._emit('transcript', 'user', inputText);\n }\n\n // Output transcription (under serverContent in SDK)\n const outputText = serverContent.outputTranscription?.text;\n if (outputText && this._call) {\n this._log.info('Assistant: %s', outputText);\n this._call._emit('transcript', 'assistant', outputText);\n }\n }\n\n // Handle tool calls\n if (msg.toolCall) {\n this._handleToolCall(msg.toolCall);\n }\n\n // Handle tool call cancellation\n const toolCancellation = (msg as unknown as Record<string, unknown>)['toolCallCancellation'] as\n | { ids?: string[] }\n | undefined;\n if (toolCancellation) {\n this._log.info({ ids: toolCancellation.ids }, 'Tool call cancelled');\n }\n }\n\n private _handleAudioData(b64Data: string): void {\n if (!this._call) return;\n\n const pcm24k = Buffer.from(b64Data, 'base64');\n if (this._recorder) {\n this._recorder.writeOutbound(resamplePcm16(pcm24k, 24000, 8000));\n }\n\n // PCM16 24kHz → PCM16 8kHz → G.711 ulaw\n const pcm8k = resamplePcm16(pcm24k, 24000, 8000);\n const ulaw = pcm16ToUlaw(pcm8k);\n\n // 160B frame alignment (160B = 20ms at 8kHz ulaw)\n // 프레임 정렬 후 한 번에 전송 (개별 160B 전송 대신 배치 전송)\n const combined = Buffer.concat([this._audioRemainder, ulaw]);\n const chunkSize = 160;\n const fullEnd = Math.floor(combined.length / chunkSize) * chunkSize;\n if (fullEnd > 0) {\n this._call.sendAudio(combined.subarray(0, fullEnd));\n this._sentAudioChunks += fullEnd / chunkSize;\n }\n this._audioRemainder = combined.subarray(fullEnd);\n }\n\n private _flushAudioRemainder(): void {\n if (this._audioRemainder.length > 0 && this._call) {\n const padded = Buffer.concat([\n this._audioRemainder,\n Buffer.alloc(160 - this._audioRemainder.length, 0xff),\n ]);\n this._call.sendAudio(padded);\n this._sentAudioChunks++;\n this._audioRemainder = Buffer.alloc(0);\n }\n }\n\n private async _handleToolCall(toolCall: LiveServerToolCall): Promise<void> {\n const functionCalls = toolCall.functionCalls;\n if (!functionCalls) return;\n\n // 도구 호출 중에는 오디오 입력 중단 (Gemini가 tool call 상태에서 audio input 수신 시 1008 에러)\n this._toolCallInProgress = true;\n\n const responses: Array<Record<string, unknown>> = [];\n\n for (const fc of functionCalls) {\n const name = fc.name ?? '';\n const fcId = fc.id ?? '';\n const args = fc.args ?? {};\n this._log.info({ tool: name, args }, 'Tool call: %s', name);\n\n // Built-in tools\n if (BUILTIN_TOOL_NAMES.has(name) && this._call) {\n const result = await executeBuiltinTool(name, args as Record<string, unknown>, this._call);\n if (result !== null) {\n if (name === 'hang_up') {\n this._log.info('hang_up: ending call');\n return;\n }\n this._log.info('Builtin tool result: %s -> %s', name, result);\n responses.push({ id: fcId, name, response: { result } });\n continue;\n }\n }\n\n if (!this._tools || !this._tools.has(name)) {\n this._log.error('Unknown tool: %s', name);\n responses.push({ id: fcId, name, response: { error: `Unknown tool: ${name}` } });\n continue;\n }\n\n try {\n const result = await this._tools.call(name, args);\n const resultStr = typeof result === 'string' ? result : JSON.stringify(result);\n this._log.info('Tool result: %s -> %s', name, resultStr.substring(0, 200));\n responses.push({\n id: fcId,\n name,\n response: { result: resultStr },\n });\n } catch (err) {\n this._log.error({ err }, 'Tool call failed: %s', name);\n responses.push({\n id: fcId,\n name,\n response: { error: String(err) },\n });\n }\n }\n\n if (responses.length > 0 && this._session) {\n this._log.debug('Sending %d tool response(s)', responses.length);\n this._session.sendToolResponse({\n functionResponses: responses,\n });\n }\n this._toolCallInProgress = false;\n }\n}\n","/**\n * Deepgram STT (Speech-to-Text) provider.\n */\n\nimport type { Logger } from 'pino';\n\nimport type { SpeechEvent, STT } from '../base.js';\nimport { NOOP_LOGGER } from '../../logger.js';\n\nexport interface DeepgramSTTOptions {\n /** Deepgram API key. Falls back to DEEPGRAM_API_KEY env var. */\n apiKey?: string;\n /** Model to use. Default: 'nova-3' */\n model?: string;\n /** Language code. Default: 'ko' */\n language?: string;\n /** Sample rate. Default: 16000 */\n sampleRate?: number;\n /** Encoding. Default: 'linear16' */\n encoding?: string;\n /** Enable punctuation. Default: true */\n punctuate?: boolean;\n /** Enable interim results. Default: true */\n interimResults?: boolean;\n /** Endpointing timeout in ms. Default: 300 */\n endpointing?: number;\n /** Utterance end silence timeout in ms. Default: 1000 */\n utteranceEndMs?: number;\n}\n\nexport class DeepgramSTT implements STT {\n private _options: DeepgramSTTOptions;\n private _log: Logger = NOOP_LOGGER;\n\n setLogger(logger: Logger): void {\n this._log = logger;\n }\n\n constructor(options: DeepgramSTTOptions = {}) {\n this._options = {\n model: 'nova-3',\n language: 'ko',\n sampleRate: 16000,\n encoding: 'linear16',\n punctuate: true,\n interimResults: true,\n endpointing: 300,\n utteranceEndMs: 1000,\n ...options,\n };\n }\n\n async *transcribe(\n audioStream: AsyncIterable<Buffer>,\n options?: { language?: string; sampleRate?: number },\n ): AsyncGenerator<SpeechEvent> {\n const apiKey = this._options.apiKey ?? process.env['DEEPGRAM_API_KEY'];\n if (!apiKey) {\n throw new Error('Deepgram API key is required');\n }\n\n const language = options?.language ?? this._options.language;\n const sampleRate = options?.sampleRate ?? this._options.sampleRate;\n\n // Use Deepgram live transcription via WebSocket\n const { WebSocket } = await import('ws');\n\n const params = new URLSearchParams({\n model: this._options.model!,\n language: language!,\n punctuate: String(this._options.punctuate),\n interim_results: String(this._options.interimResults),\n encoding: this._options.encoding!,\n sample_rate: String(sampleRate),\n endpointing: String(this._options.endpointing),\n utterance_end_ms: String(this._options.utteranceEndMs),\n });\n\n const url = `wss://api.deepgram.com/v1/listen?${params.toString()}`;\n const ws = new WebSocket(url, {\n headers: { Authorization: `Token ${apiKey}` },\n });\n\n // Queue for speech events\n const eventQueue: SpeechEvent[] = [];\n let resolveWait: (() => void) | null = null;\n let done = false;\n\n ws.on('message', (data: Buffer | string) => {\n try {\n const msg = JSON.parse(data.toString()) as Record<string, unknown>;\n const channel = msg['channel'] as Record<string, unknown> | undefined;\n if (!channel) return;\n\n const alternatives = channel['alternatives'] as Array<Record<string, unknown>> | undefined;\n if (!alternatives || alternatives.length === 0) return;\n\n const transcript = (alternatives[0]!['transcript'] as string) ?? '';\n if (!transcript) return;\n\n const isFinal = msg['is_final'] as boolean;\n const speechFinal = msg['speech_final'] as boolean;\n\n const event: SpeechEvent = {\n type: isFinal || speechFinal ? 'final' : 'interim',\n transcript,\n };\n\n eventQueue.push(event);\n if (resolveWait) {\n resolveWait();\n resolveWait = null;\n }\n } catch {\n // Ignore parse errors\n }\n });\n\n ws.on('close', () => {\n done = true;\n if (resolveWait) {\n resolveWait();\n resolveWait = null;\n }\n });\n\n ws.on('error', (err: Error) => {\n this._log.error({ err }, 'Deepgram STT error');\n done = true;\n if (resolveWait) {\n resolveWait();\n resolveWait = null;\n }\n });\n\n // Wait for connection\n await new Promise<void>((resolve, reject) => {\n ws.on('open', resolve);\n ws.on('error', reject);\n });\n this._log.info('Deepgram STT connected');\n\n // Feed audio in background\n const feedPromise = (async () => {\n try {\n for await (const chunk of audioStream) {\n if (done) break;\n if (ws.readyState === 1) {\n ws.send(chunk);\n }\n }\n } finally {\n // Send close message\n if (ws.readyState === 1) {\n ws.send(JSON.stringify({ type: 'CloseStream' }));\n }\n }\n })();\n\n // Yield speech events\n try {\n while (!done || eventQueue.length > 0) {\n if (eventQueue.length > 0) {\n yield eventQueue.shift()!;\n } else if (!done) {\n await new Promise<void>((resolve) => {\n resolveWait = resolve;\n });\n }\n }\n } finally {\n done = true;\n ws.close();\n await feedPromise.catch(() => {});\n }\n }\n}\n","/**\n * ElevenLabs TTS (Text-to-Speech) provider.\n */\n\nimport type { Logger } from 'pino';\n\nimport type { TTS } from '../base.js';\nimport { NOOP_LOGGER } from '../../logger.js';\n\nexport interface ElevenLabsTTSOptions {\n /** ElevenLabs API key. Falls back to ELEVENLABS_API_KEY env var. */\n apiKey?: string;\n /** Voice ID. Default: 'EXAVITQu4vr4xnSDxMaL' (Rachel) */\n voiceId?: string;\n /** Model ID. Default: 'eleven_flash_v2_5' */\n model?: string;\n /** Output format. Default: 'pcm_24000' */\n outputFormat?: string;\n /** Stability. Default: 0.5 */\n stability?: number;\n /** Similarity boost. Default: 0.75 */\n similarityBoost?: number;\n /** Language code. Default: 'ko' */\n languageCode?: string;\n}\n\nexport class ElevenLabsTTS implements TTS {\n private _options: ElevenLabsTTSOptions;\n private _log: Logger = NOOP_LOGGER;\n\n setLogger(logger: Logger): void {\n this._log = logger;\n }\n\n constructor(options: ElevenLabsTTSOptions = {}) {\n this._options = {\n voiceId: 'EXAVITQu4vr4xnSDxMaL',\n model: 'eleven_flash_v2_5',\n outputFormat: 'pcm_24000',\n stability: 0.5,\n similarityBoost: 0.75,\n languageCode: 'ko',\n ...options,\n };\n }\n\n async *synthesize(\n text: string | AsyncIterable<string>,\n options?: { voice?: string; sampleRate?: number },\n ): AsyncGenerator<Buffer> {\n const apiKey = this._options.apiKey ?? process.env['ELEVENLABS_API_KEY'];\n if (!apiKey) {\n throw new Error('ElevenLabs API key is required');\n }\n\n const voiceId = options?.voice ?? this._options.voiceId;\n\n if (typeof text === 'string') {\n // Non-streaming: single request\n yield* this._synthesizeSingle(apiKey, voiceId!, text);\n } else {\n // Streaming: use WebSocket for chunked text input\n yield* this._synthesizeStreaming(apiKey, voiceId!, text);\n }\n }\n\n private async *_synthesizeSingle(\n apiKey: string,\n voiceId: string,\n text: string,\n ): AsyncGenerator<Buffer> {\n const url = `https://api.elevenlabs.io/v1/text-to-speech/${voiceId}?output_format=${this._options.outputFormat}`;\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'xi-api-key': apiKey,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n text,\n model_id: this._options.model,\n voice_settings: {\n stability: this._options.stability,\n similarity_boost: this._options.similarityBoost,\n },\n }),\n });\n\n if (!response.ok) {\n throw new Error(`ElevenLabs API error: ${response.status} ${response.statusText}`);\n }\n\n const body = response.body;\n if (!body) {\n throw new Error('ElevenLabs returned empty response');\n }\n\n const reader = body.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n yield Buffer.from(value);\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n private async *_synthesizeStreaming(\n apiKey: string,\n voiceId: string,\n textStream: AsyncIterable<string>,\n ): AsyncGenerator<Buffer> {\n const { WebSocket } = await import('ws');\n\n const url = `wss://api.elevenlabs.io/v1/text-to-speech/${voiceId}/stream-input?model_id=${this._options.model}&output_format=${this._options.outputFormat}`;\n\n const ws = new WebSocket(url);\n\n const audioQueue: Buffer[] = [];\n let resolveWait: (() => void) | null = null;\n let done = false;\n\n ws.on('open', () => {\n // Send initial config\n ws.send(\n JSON.stringify({\n text: ' ',\n voice_settings: {\n stability: this._options.stability,\n similarity_boost: this._options.similarityBoost,\n },\n xi_api_key: apiKey,\n }),\n );\n });\n\n ws.on('message', (data: Buffer | string) => {\n try {\n const msg = JSON.parse(data.toString()) as Record<string, unknown>;\n const audio = msg['audio'] as string | undefined;\n if (audio) {\n audioQueue.push(Buffer.from(audio, 'base64'));\n if (resolveWait) {\n resolveWait();\n resolveWait = null;\n }\n }\n } catch {\n // Ignore parse errors\n }\n });\n\n ws.on('close', () => {\n done = true;\n if (resolveWait) {\n resolveWait();\n resolveWait = null;\n }\n });\n\n ws.on('error', (err: Error) => {\n this._log.error({ err }, 'ElevenLabs TTS error');\n done = true;\n if (resolveWait) {\n resolveWait();\n resolveWait = null;\n }\n });\n\n // Wait for connection\n await new Promise<void>((resolve, reject) => {\n ws.on('open', resolve);\n ws.on('error', reject);\n });\n this._log.info('ElevenLabs TTS connected');\n\n // Feed text in background\n const feedPromise = (async () => {\n try {\n for await (const chunk of textStream) {\n if (done) break;\n if (ws.readyState === 1) {\n this._log.debug('ElevenLabs sending text: %s', chunk.substring(0, 60));\n ws.send(JSON.stringify({ text: chunk }));\n }\n }\n } finally {\n // Send end-of-stream\n if (ws.readyState === 1) {\n this._log.debug('ElevenLabs sending EOS');\n ws.send(JSON.stringify({ text: '' }));\n }\n }\n })();\n\n // Yield audio chunks\n try {\n while (!done || audioQueue.length > 0) {\n if (audioQueue.length > 0) {\n yield audioQueue.shift()!;\n } else if (!done) {\n await new Promise<void>((resolve) => {\n resolveWait = resolve;\n });\n }\n }\n } finally {\n done = true;\n ws.close();\n await feedPromise.catch(() => {});\n }\n }\n}\n","/**\n * OpenAI LLM provider for pipeline-based voice agents.\n */\n\nimport type { ConversationMessage, LLM, LLMChunk } from '../base.js';\nimport type { ToolRegistry } from '../../tool.js';\n\nexport interface OpenAILLMOptions {\n /** OpenAI API key. Falls back to OPENAI_API_KEY env var. */\n apiKey?: string;\n /** Model to use. Default: 'gpt-4o-mini' */\n model?: string;\n /** Default temperature. Default: 0.8 */\n temperature?: number;\n /** Default max tokens. Default: 4096 */\n maxTokens?: number;\n}\n\nexport class OpenAILLM implements LLM {\n private _options: OpenAILLMOptions;\n\n constructor(options: OpenAILLMOptions = {}) {\n this._options = {\n model: 'gpt-4o-mini',\n temperature: 0.8,\n maxTokens: 4096,\n ...options,\n };\n }\n\n async *generate(\n messages: ConversationMessage[],\n options?: {\n tools?: ToolRegistry;\n temperature?: number;\n maxTokens?: number;\n },\n ): AsyncGenerator<LLMChunk> {\n const OpenAI = (await import('openai')).default;\n\n const client = new OpenAI({\n apiKey: this._options.apiKey ?? process.env['OPENAI_API_KEY'],\n });\n\n const requestParams: Record<string, unknown> = {\n model: this._options.model,\n messages: messages.map((m) => {\n const msg: Record<string, unknown> = { role: m.role, content: m.content };\n if (m.name) msg['name'] = m.name;\n if (m.tool_call_id) msg['tool_call_id'] = m.tool_call_id;\n return msg;\n }),\n stream: true,\n temperature: options?.temperature ?? this._options.temperature,\n max_tokens: options?.maxTokens ?? this._options.maxTokens,\n };\n\n if (options?.tools && options.tools.size > 0) {\n requestParams['tools'] = options.tools.toOpenAITools();\n }\n\n const stream = await client.chat.completions.create(\n requestParams as Parameters<typeof client.chat.completions.create>[0],\n );\n\n let currentToolCall: { id: string; name: string; arguments: string } | null = null;\n\n for await (const chunk of stream as AsyncIterable<Record<string, unknown>>) {\n const choices = chunk['choices'] as Array<Record<string, unknown>> | undefined;\n if (!choices || choices.length === 0) continue;\n\n const delta = choices[0]!['delta'] as Record<string, unknown> | undefined;\n if (!delta) continue;\n\n // Text content\n const content = delta['content'] as string | undefined;\n if (content) {\n yield { type: 'text', text: content };\n }\n\n // Tool calls\n const toolCalls = delta['tool_calls'] as Array<Record<string, unknown>> | undefined;\n if (toolCalls) {\n for (const tc of toolCalls) {\n const fn = tc['function'] as Record<string, unknown> | undefined;\n if (fn) {\n if (fn['name']) {\n // Start of a new tool call\n if (currentToolCall) {\n yield {\n type: 'tool_call',\n toolCall: {\n id: currentToolCall.id,\n name: currentToolCall.name,\n arguments: currentToolCall.arguments,\n },\n };\n }\n currentToolCall = {\n id: (tc['id'] as string) ?? '',\n name: fn['name'] as string,\n arguments: (fn['arguments'] as string) ?? '',\n };\n } else if (currentToolCall && fn['arguments']) {\n currentToolCall.arguments += fn['arguments'] as string;\n }\n }\n }\n }\n }\n\n // Emit final tool call if pending\n if (currentToolCall) {\n yield {\n type: 'tool_call',\n toolCall: {\n id: currentToolCall.id,\n name: currentToolCall.name,\n arguments: currentToolCall.arguments,\n },\n };\n }\n\n yield { type: 'done' };\n }\n}\n","/**\n * Anthropic LLM provider for pipeline-based voice agents.\n */\n\nimport type { ConversationMessage, LLM, LLMChunk } from '../base.js';\nimport type { ToolRegistry } from '../../tool.js';\n\nexport interface AnthropicLLMOptions {\n /** Anthropic API key. Falls back to ANTHROPIC_API_KEY env var. */\n apiKey?: string;\n /** Model to use. Default: 'claude-sonnet-4-6' */\n model?: string;\n /** Default temperature. Default: 0.8 */\n temperature?: number;\n /** Default max tokens. Default: 4096 */\n maxTokens?: number;\n}\n\nexport class AnthropicLLM implements LLM {\n private _options: AnthropicLLMOptions;\n\n constructor(options: AnthropicLLMOptions = {}) {\n this._options = {\n model: 'claude-sonnet-4-6',\n temperature: 0.8,\n maxTokens: 4096,\n ...options,\n };\n }\n\n async *generate(\n messages: ConversationMessage[],\n options?: {\n tools?: ToolRegistry;\n temperature?: number;\n maxTokens?: number;\n },\n ): AsyncGenerator<LLMChunk> {\n const AnthropicModule = await import('@anthropic-ai/sdk');\n const Anthropic = AnthropicModule.default;\n\n const client = new Anthropic({\n apiKey: this._options.apiKey ?? process.env['ANTHROPIC_API_KEY'],\n });\n\n // Separate system message from conversation\n let systemPrompt: string | undefined;\n const conversationMessages: Array<Record<string, unknown>> = [];\n\n for (const msg of messages) {\n if (msg.role === 'system') {\n systemPrompt = msg.content;\n } else {\n conversationMessages.push({\n role: msg.role === 'tool' ? 'user' : msg.role,\n content:\n msg.role === 'tool'\n ? [\n {\n type: 'tool_result',\n tool_use_id: msg.tool_call_id,\n content: msg.content,\n },\n ]\n : msg.content,\n });\n }\n }\n\n const requestParams: Record<string, unknown> = {\n model: this._options.model,\n messages: conversationMessages,\n max_tokens: options?.maxTokens ?? this._options.maxTokens,\n stream: true,\n };\n\n if (systemPrompt) {\n requestParams['system'] = systemPrompt;\n }\n if (options?.temperature ?? this._options.temperature) {\n requestParams['temperature'] = options?.temperature ?? this._options.temperature;\n }\n\n if (options?.tools && options.tools.size > 0) {\n const toolDefs = options.tools.toOpenAITools().map((t) => ({\n name: t.function.name,\n description: t.function.description,\n input_schema: t.function.parameters,\n }));\n requestParams['tools'] = toolDefs;\n }\n\n const stream = client.messages.stream(\n requestParams as Parameters<typeof client.messages.stream>[0],\n );\n\n let currentToolCall: { id: string; name: string; arguments: string } | null = null;\n\n for await (const event of stream as AsyncIterable<Record<string, unknown>>) {\n const eventType = event['type'] as string;\n\n switch (eventType) {\n case 'content_block_start': {\n const contentBlock = event['content_block'] as Record<string, unknown>;\n if (contentBlock?.['type'] === 'tool_use') {\n currentToolCall = {\n id: contentBlock['id'] as string,\n name: contentBlock['name'] as string,\n arguments: '',\n };\n }\n break;\n }\n case 'content_block_delta': {\n const delta = event['delta'] as Record<string, unknown>;\n if (delta?.['type'] === 'text_delta') {\n yield { type: 'text', text: delta['text'] as string };\n } else if (delta?.['type'] === 'input_json_delta' && currentToolCall) {\n currentToolCall.arguments += (delta['partial_json'] as string) ?? '';\n }\n break;\n }\n case 'content_block_stop': {\n if (currentToolCall) {\n yield {\n type: 'tool_call',\n toolCall: {\n id: currentToolCall.id,\n name: currentToolCall.name,\n arguments: currentToolCall.arguments,\n },\n };\n currentToolCall = null;\n }\n break;\n }\n case 'message_stop': {\n yield { type: 'done' };\n break;\n }\n }\n }\n }\n}\n","/**\n * Google Gemini LLM provider for pipeline-based voice agents.\n */\n\nimport type { ConversationMessage, LLM, LLMChunk } from '../base.js';\nimport type { ToolRegistry } from '../../tool.js';\n\nexport interface GeminiLLMOptions {\n /** Google API key. Falls back to GOOGLE_API_KEY env var. */\n apiKey?: string;\n /** Model to use. Default: 'gemini-2.5-flash' */\n model?: string;\n /** Default temperature. Default: 0.8 */\n temperature?: number;\n /** Default max tokens. Default: 4096 */\n maxTokens?: number;\n}\n\nexport class GeminiLLM implements LLM {\n private _options: GeminiLLMOptions;\n\n constructor(options: GeminiLLMOptions = {}) {\n this._options = {\n model: 'gemini-2.5-flash',\n temperature: 0.8,\n maxTokens: 4096,\n ...options,\n };\n }\n\n async *generate(\n messages: ConversationMessage[],\n options?: {\n tools?: ToolRegistry;\n temperature?: number;\n maxTokens?: number;\n },\n ): AsyncGenerator<LLMChunk> {\n const { GoogleGenAI } = await import('@google/genai');\n\n const client = new GoogleGenAI({\n apiKey: this._options.apiKey ?? process.env['GOOGLE_API_KEY'],\n });\n\n // Convert messages to Gemini format\n let systemInstruction: string | undefined;\n const contents: Array<Record<string, unknown>> = [];\n\n for (const msg of messages) {\n if (msg.role === 'system') {\n systemInstruction = msg.content;\n continue;\n }\n\n const role = msg.role === 'assistant' ? 'model' : 'user';\n contents.push({\n role,\n parts: [{ text: msg.content }],\n });\n }\n\n const requestConfig: Record<string, unknown> = {\n contents,\n };\n\n if (systemInstruction) {\n requestConfig['systemInstruction'] = { parts: [{ text: systemInstruction }] };\n }\n\n const generationConfig: Record<string, unknown> = {};\n if (options?.temperature ?? this._options.temperature) {\n generationConfig['temperature'] = options?.temperature ?? this._options.temperature;\n }\n if (options?.maxTokens ?? this._options.maxTokens) {\n generationConfig['maxOutputTokens'] = options?.maxTokens ?? this._options.maxTokens;\n }\n if (Object.keys(generationConfig).length > 0) {\n requestConfig['generationConfig'] = generationConfig;\n }\n\n if (options?.tools && options.tools.size > 0) {\n const toolDefs = options.tools.toOpenAITools().map((t) => ({\n name: t.function.name,\n description: t.function.description,\n parameters: t.function.parameters,\n }));\n requestConfig['tools'] = [{ functionDeclarations: toolDefs }];\n }\n\n const response = await client.models.generateContentStream({\n model: this._options.model!,\n ...requestConfig,\n });\n\n for await (const chunk of response) {\n const candidates = (chunk as Record<string, unknown>)['candidates'] as\n | Array<Record<string, unknown>>\n | undefined;\n if (!candidates || candidates.length === 0) continue;\n\n const content = candidates[0]?.['content'] as Record<string, unknown> | undefined;\n const parts = content?.['parts'] as Array<Record<string, unknown>> | undefined;\n if (!parts) continue;\n\n for (const part of parts) {\n if ('text' in part && part['text']) {\n yield { type: 'text', text: part['text'] as string };\n }\n\n if ('functionCall' in part && part['functionCall']) {\n const fc = part['functionCall'] as { name: string; args: Record<string, unknown> };\n yield {\n type: 'tool_call',\n toolCall: {\n id: `gemini_${Date.now()}`,\n name: fc.name,\n arguments: JSON.stringify(fc.args ?? {}),\n },\n };\n }\n }\n }\n\n yield { type: 'done' };\n }\n}\n","/**\n * OpenAI-compatible LLM provider (works with any OpenAI-compatible API).\n */\n\nimport type { ConversationMessage, LLM, LLMChunk } from '../base.js';\nimport type { ToolRegistry } from '../../tool.js';\n\nexport interface OpenAICompatLLMOptions {\n /** API key. */\n apiKey?: string;\n /** Base URL for the OpenAI-compatible API. */\n baseUrl: string;\n /** Model to use. */\n model: string;\n /** Default temperature. */\n temperature?: number;\n /** Default max tokens. */\n maxTokens?: number;\n /** Additional default headers. */\n defaultHeaders?: Record<string, string>;\n}\n\nexport class OpenAICompatLLM implements LLM {\n private _options: OpenAICompatLLMOptions;\n\n constructor(options: OpenAICompatLLMOptions) {\n this._options = options;\n }\n\n async *generate(\n messages: ConversationMessage[],\n options?: {\n tools?: ToolRegistry;\n temperature?: number;\n maxTokens?: number;\n },\n ): AsyncGenerator<LLMChunk> {\n const OpenAI = (await import('openai')).default;\n\n const client = new OpenAI({\n apiKey: this._options.apiKey ?? 'not-needed',\n baseURL: this._options.baseUrl,\n defaultHeaders: this._options.defaultHeaders,\n });\n\n const requestParams: Record<string, unknown> = {\n model: this._options.model,\n messages: messages.map((m) => {\n const msg: Record<string, unknown> = { role: m.role, content: m.content };\n if (m.name) msg['name'] = m.name;\n if (m.tool_call_id) msg['tool_call_id'] = m.tool_call_id;\n return msg;\n }),\n stream: true,\n temperature: options?.temperature ?? this._options.temperature,\n max_tokens: options?.maxTokens ?? this._options.maxTokens,\n };\n\n if (options?.tools && options.tools.size > 0) {\n requestParams['tools'] = options.tools.toOpenAITools();\n }\n\n const stream = await client.chat.completions.create(\n requestParams as Parameters<typeof client.chat.completions.create>[0],\n );\n\n let currentToolCall: { id: string; name: string; arguments: string } | null = null;\n\n for await (const chunk of stream as AsyncIterable<Record<string, unknown>>) {\n const choices = chunk['choices'] as Array<Record<string, unknown>> | undefined;\n if (!choices || choices.length === 0) continue;\n\n const delta = choices[0]!['delta'] as Record<string, unknown> | undefined;\n if (!delta) continue;\n\n const content = delta['content'] as string | undefined;\n if (content) {\n yield { type: 'text', text: content };\n }\n\n const toolCalls = delta['tool_calls'] as Array<Record<string, unknown>> | undefined;\n if (toolCalls) {\n for (const tc of toolCalls) {\n const fn = tc['function'] as Record<string, unknown> | undefined;\n if (fn) {\n if (fn['name']) {\n if (currentToolCall) {\n yield {\n type: 'tool_call',\n toolCall: {\n id: currentToolCall.id,\n name: currentToolCall.name,\n arguments: currentToolCall.arguments,\n },\n };\n }\n currentToolCall = {\n id: (tc['id'] as string) ?? '',\n name: fn['name'] as string,\n arguments: (fn['arguments'] as string) ?? '',\n };\n } else if (currentToolCall && fn['arguments']) {\n currentToolCall.arguments += fn['arguments'] as string;\n }\n }\n }\n }\n }\n\n if (currentToolCall) {\n yield {\n type: 'tool_call',\n toolCall: {\n id: currentToolCall.id,\n name: currentToolCall.name,\n arguments: currentToolCall.arguments,\n },\n };\n }\n\n yield { type: 'done' };\n }\n}\n","/**\n * Ollama LLM provider for pipeline-based voice agents.\n * Uses the OpenAI-compatible API that Ollama exposes.\n */\n\nimport type { ConversationMessage, LLM, LLMChunk } from '../base.js';\nimport type { ToolRegistry } from '../../tool.js';\nimport { OpenAICompatLLM } from './openai-compat-llm.js';\n\nexport interface OllamaLLMOptions {\n /** Ollama server URL. Falls back to OLLAMA_BASE_URL env var. Default: 'http://localhost:11434/v1' */\n baseUrl?: string;\n /** Model to use. Default: 'llama3.2' */\n model?: string;\n /** Default temperature. Default: 0.8 */\n temperature?: number;\n /** Default max tokens. Default: 4096 */\n maxTokens?: number;\n}\n\nexport class OllamaLLM implements LLM {\n private _inner: OpenAICompatLLM;\n\n constructor(options: OllamaLLMOptions = {}) {\n const baseUrl = options.baseUrl ?? process.env['OLLAMA_BASE_URL'] ?? 'http://localhost:11434/v1';\n this._inner = new OpenAICompatLLM({\n baseUrl: baseUrl.replace(/\\/$/, ''),\n model: options.model ?? 'llama3.2',\n apiKey: 'ollama',\n temperature: options.temperature ?? 0.8,\n maxTokens: options.maxTokens ?? 4096,\n });\n }\n\n async *generate(\n messages: ConversationMessage[],\n options?: {\n tools?: ToolRegistry;\n temperature?: number;\n maxTokens?: number;\n },\n ): AsyncGenerator<LLMChunk> {\n yield* this._inner.generate(messages, options);\n }\n}\n","import type { ConversationMessage, LLM, LLMChunk } from '../base.js';\nimport type { ToolRegistry } from '../../tool.js';\nimport { OpenAICompatLLM } from './openai-compat-llm.js';\n\nexport interface MistralLLMOptions {\n apiKey?: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n}\n\nexport class MistralLLM implements LLM {\n private _inner: OpenAICompatLLM;\n\n constructor(options: MistralLLMOptions = {}) {\n this._inner = new OpenAICompatLLM({\n apiKey: options.apiKey ?? process.env['MISTRAL_API_KEY'],\n baseUrl: 'https://api.mistral.ai/v1',\n model: options.model ?? 'mistral-small-latest',\n temperature: options.temperature,\n maxTokens: options.maxTokens,\n });\n }\n\n async *generate(\n messages: ConversationMessage[],\n options?: { tools?: ToolRegistry; temperature?: number; maxTokens?: number },\n ): AsyncGenerator<LLMChunk> {\n yield* this._inner.generate(messages, options);\n }\n}\n","import type { ConversationMessage, LLM, LLMChunk } from '../base.js';\nimport type { ToolRegistry } from '../../tool.js';\nimport { OpenAICompatLLM } from './openai-compat-llm.js';\n\nexport interface GroqLLMOptions {\n apiKey?: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n}\n\nexport class GroqLLM implements LLM {\n private _inner: OpenAICompatLLM;\n\n constructor(options: GroqLLMOptions = {}) {\n this._inner = new OpenAICompatLLM({\n apiKey: options.apiKey ?? process.env['GROQ_API_KEY'],\n baseUrl: 'https://api.groq.com/openai/v1',\n model: options.model ?? 'meta-llama/llama-4-scout-17b-16e-instruct',\n temperature: options.temperature,\n maxTokens: options.maxTokens,\n });\n }\n\n async *generate(\n messages: ConversationMessage[],\n options?: { tools?: ToolRegistry; temperature?: number; maxTokens?: number },\n ): AsyncGenerator<LLMChunk> {\n yield* this._inner.generate(messages, options);\n }\n}\n","import type { ConversationMessage, LLM, LLMChunk } from '../base.js';\nimport type { ToolRegistry } from '../../tool.js';\nimport { OpenAICompatLLM } from './openai-compat-llm.js';\n\nexport interface PerplexityLLMOptions {\n apiKey?: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n}\n\nexport class PerplexityLLM implements LLM {\n private _inner: OpenAICompatLLM;\n\n constructor(options: PerplexityLLMOptions = {}) {\n this._inner = new OpenAICompatLLM({\n apiKey: options.apiKey ?? process.env['PERPLEXITY_API_KEY'],\n baseUrl: 'https://api.perplexity.ai',\n model: options.model ?? 'sonar',\n temperature: options.temperature,\n maxTokens: options.maxTokens,\n });\n }\n\n async *generate(\n messages: ConversationMessage[],\n options?: { tools?: ToolRegistry; temperature?: number; maxTokens?: number },\n ): AsyncGenerator<LLMChunk> {\n yield* this._inner.generate(messages, options);\n }\n}\n","import type { ConversationMessage, LLM, LLMChunk } from '../base.js';\nimport type { ToolRegistry } from '../../tool.js';\nimport { OpenAICompatLLM } from './openai-compat-llm.js';\n\nexport interface TogetherLLMOptions {\n apiKey?: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n}\n\nexport class TogetherLLM implements LLM {\n private _inner: OpenAICompatLLM;\n\n constructor(options: TogetherLLMOptions = {}) {\n this._inner = new OpenAICompatLLM({\n apiKey: options.apiKey ?? process.env['TOGETHER_API_KEY'],\n baseUrl: 'https://api.together.xyz/v1',\n model: options.model ?? 'meta-llama/Llama-4-Scout-17B-16E-Instruct',\n temperature: options.temperature,\n maxTokens: options.maxTokens,\n });\n }\n\n async *generate(\n messages: ConversationMessage[],\n options?: { tools?: ToolRegistry; temperature?: number; maxTokens?: number },\n ): AsyncGenerator<LLMChunk> {\n yield* this._inner.generate(messages, options);\n }\n}\n","import type { ConversationMessage, LLM, LLMChunk } from '../base.js';\nimport type { ToolRegistry } from '../../tool.js';\nimport { OpenAICompatLLM } from './openai-compat-llm.js';\n\nexport interface FireworksLLMOptions {\n apiKey?: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n}\n\nexport class FireworksLLM implements LLM {\n private _inner: OpenAICompatLLM;\n\n constructor(options: FireworksLLMOptions = {}) {\n this._inner = new OpenAICompatLLM({\n apiKey: options.apiKey ?? process.env['FIREWORKS_API_KEY'],\n baseUrl: 'https://api.fireworks.ai/inference/v1',\n model: options.model ?? 'accounts/fireworks/models/llama4-scout-instruct-basic',\n temperature: options.temperature,\n maxTokens: options.maxTokens,\n });\n }\n\n async *generate(\n messages: ConversationMessage[],\n options?: { tools?: ToolRegistry; temperature?: number; maxTokens?: number },\n ): AsyncGenerator<LLMChunk> {\n yield* this._inner.generate(messages, options);\n }\n}\n","import type { ConversationMessage, LLM, LLMChunk } from '../base.js';\nimport type { ToolRegistry } from '../../tool.js';\nimport { OpenAICompatLLM } from './openai-compat-llm.js';\n\nexport interface DeepSeekLLMOptions {\n apiKey?: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n}\n\nexport class DeepSeekLLM implements LLM {\n private _inner: OpenAICompatLLM;\n\n constructor(options: DeepSeekLLMOptions = {}) {\n this._inner = new OpenAICompatLLM({\n apiKey: options.apiKey ?? process.env['DEEPSEEK_API_KEY'],\n baseUrl: 'https://api.deepseek.com',\n model: options.model ?? 'deepseek-chat',\n temperature: options.temperature,\n maxTokens: options.maxTokens,\n });\n }\n\n async *generate(\n messages: ConversationMessage[],\n options?: { tools?: ToolRegistry; temperature?: number; maxTokens?: number },\n ): AsyncGenerator<LLMChunk> {\n yield* this._inner.generate(messages, options);\n }\n}\n","import type { ConversationMessage, LLM, LLMChunk } from '../base.js';\nimport type { ToolRegistry } from '../../tool.js';\nimport { OpenAICompatLLM } from './openai-compat-llm.js';\n\nexport interface XaiLLMOptions {\n apiKey?: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n}\n\nexport class XaiLLM implements LLM {\n private _inner: OpenAICompatLLM;\n\n constructor(options: XaiLLMOptions = {}) {\n this._inner = new OpenAICompatLLM({\n apiKey: options.apiKey ?? process.env['XAI_API_KEY'],\n baseUrl: 'https://api.x.ai/v1',\n model: options.model ?? 'grok-4-1-fast',\n temperature: options.temperature,\n maxTokens: options.maxTokens,\n });\n }\n\n async *generate(\n messages: ConversationMessage[],\n options?: { tools?: ToolRegistry; temperature?: number; maxTokens?: number },\n ): AsyncGenerator<LLMChunk> {\n yield* this._inner.generate(messages, options);\n }\n}\n","/**\n * MCP server configuration for stdio-based servers.\n */\n\nexport interface MCPServerStdio {\n type: 'stdio';\n /** Command to execute. */\n command: string;\n /** Command arguments. */\n args?: string[];\n /** Environment variables. */\n env?: Record<string, string>;\n [key: string]: unknown;\n}\n\n/**\n * Create a stdio MCP server configuration.\n */\nexport function mcpServerStdio(options: {\n command: string;\n args?: string[];\n env?: Record<string, string>;\n}): MCPServerStdio {\n return {\n type: 'stdio',\n command: options.command,\n args: options.args,\n env: options.env,\n };\n}\n","/**\n * MCP server configuration for HTTP-based servers.\n */\n\nexport interface MCPServerHTTP {\n type: 'http';\n /** Server URL. */\n url: string;\n /** Additional headers to send with requests. */\n headers?: Record<string, string>;\n [key: string]: unknown;\n}\n\n/**\n * Create an HTTP MCP server configuration.\n */\nexport function mcpServerHTTP(options: {\n url: string;\n headers?: Record<string, string>;\n}): MCPServerHTTP {\n return {\n type: 'http',\n url: options.url,\n headers: options.headers,\n };\n}\n"]}
1
+ {"version":3,"sources":["../../src/agent/audio.ts","../../src/agent/logger.ts","../../src/agent/control-ws.ts","../../src/agent/mcp/client.ts","../../src/agent/media-ws.ts","../../src/agent/recorder.ts","../../src/agent/telemetry.ts","../../src/agent/session.ts","../../src/agent/builtin-tool.ts","../../src/agent/tool.ts","../../src/agent/tracing/config.ts","../../src/agent/tracing/spans.ts","../../src/agent/tracing/attributes.ts","../../src/agent/agent.ts","../../src/agent/pipeline/builtin-tool-schemas.ts","../../src/agent/pipeline/pipeline-session.ts","../../src/agent/pipeline/realtime/openai-realtime.ts","../../src/agent/pipeline/realtime/gemini-realtime.ts","../../src/agent/pipeline/stt/deepgram-stt.ts","../../src/agent/pipeline/tts/elevenlabs-tts.ts","../../src/agent/pipeline/llm/openai-llm.ts","../../src/agent/pipeline/llm/anthropic-llm.ts","../../src/agent/pipeline/llm/gemini-llm.ts","../../src/agent/pipeline/llm/openai-compat-llm.ts","../../src/agent/pipeline/llm/ollama-llm.ts","../../src/agent/pipeline/llm/mistral-llm.ts","../../src/agent/pipeline/llm/groq-llm.ts","../../src/agent/pipeline/llm/perplexity-llm.ts","../../src/agent/pipeline/llm/together-llm.ts","../../src/agent/pipeline/llm/fireworks-llm.ts","../../src/agent/pipeline/llm/deepseek-llm.ts","../../src/agent/pipeline/llm/xai-llm.ts","../../src/agent/mcp/stdio.ts","../../src/agent/mcp/http.ts"],"names":["pino","path","fs","VERSION","os","digit","BuiltinTool","DEFAULT_BASE_URL","AgentError","AgentConnectionError","result","pcm8k"],"mappings":"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AAA;AAAA,EACxD,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAS,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAS,GAAA;AAAA,EAAQ,GAAA;AAAA,EACxD,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EACxD,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EACxD,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;A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","file":"index.cjs","sourcesContent":["/**\n * Audio codec utilities: PCM16 <-> ulaw conversion and resampling.\n */\n\nconst _BIAS = 0x84;\nconst _CLIP = 32635;\n\n// prettier-ignore\nconst DECODE_TABLE: readonly number[] = [\n -32124, -31100, -30076, -29052, -28028, -27004, -25980, -24956,\n -23932, -22908, -21884, -20860, -19836, -18812, -17788, -16764,\n -15996, -15484, -14972, -14460, -13948, -13436, -12924, -12412,\n -11900, -11388, -10876, -10364, -9852, -9340, -8828, -8316,\n -7932, -7676, -7420, -7164, -6908, -6652, -6396, -6140,\n -5884, -5628, -5372, -5116, -4860, -4604, -4348, -4092,\n -3900, -3772, -3644, -3516, -3388, -3260, -3132, -3004,\n -2876, -2748, -2620, -2492, -2364, -2236, -2108, -1980,\n -1884, -1820, -1756, -1692, -1628, -1564, -1500, -1436,\n -1372, -1308, -1244, -1180, -1116, -1052, -988, -924,\n -876, -844, -812, -780, -748, -716, -684, -652,\n -620, -588, -556, -524, -492, -460, -428, -396,\n -372, -356, -340, -324, -308, -292, -276, -260,\n -244, -228, -212, -196, -180, -164, -148, -132,\n -120, -112, -104, -96, -88, -80, -72, -64,\n -56, -48, -40, -32, -24, -16, -8, 0,\n 32124, 31100, 30076, 29052, 28028, 27004, 25980, 24956,\n 23932, 22908, 21884, 20860, 19836, 18812, 17788, 16764,\n 15996, 15484, 14972, 14460, 13948, 13436, 12924, 12412,\n 11900, 11388, 10876, 10364, 9852, 9340, 8828, 8316,\n 7932, 7676, 7420, 7164, 6908, 6652, 6396, 6140,\n 5884, 5628, 5372, 5116, 4860, 4604, 4348, 4092,\n 3900, 3772, 3644, 3516, 3388, 3260, 3132, 3004,\n 2876, 2748, 2620, 2492, 2364, 2236, 2108, 1980,\n 1884, 1820, 1756, 1692, 1628, 1564, 1500, 1436,\n 1372, 1308, 1244, 1180, 1116, 1052, 988, 924,\n 876, 844, 812, 780, 748, 716, 684, 652,\n 620, 588, 556, 524, 492, 460, 428, 396,\n 372, 356, 340, 324, 308, 292, 276, 260,\n 244, 228, 212, 196, 180, 164, 148, 132,\n 120, 112, 104, 96, 88, 80, 72, 64,\n 56, 48, 40, 32, 24, 16, 8, 0,\n];\n\nfunction encodeUlawSample(sample: number): number {\n let sign = 0;\n if (sample < 0) {\n sign = 0x80;\n sample = -sample;\n }\n if (sample > _CLIP) {\n sample = _CLIP;\n }\n sample += _BIAS;\n\n let exponent = 7;\n const expValues = [0x4000, 0x2000, 0x1000, 0x0800, 0x0400, 0x0200, 0x0100];\n for (const expVal of expValues) {\n if (sample >= expVal) {\n break;\n }\n exponent -= 1;\n }\n\n const mantissa = (sample >> (exponent + 3)) & 0x0f;\n return ~(sign | (exponent << 4) | mantissa) & 0xff;\n}\n\n/**\n * Convert PCM16 little-endian audio to ulaw.\n */\nexport function pcm16ToUlaw(pcm: Buffer): Buffer {\n if (!pcm.length) return Buffer.alloc(0);\n const nSamples = pcm.length >> 1;\n const out = Buffer.alloc(nSamples);\n for (let i = 0; i < nSamples; i++) {\n const sample = pcm.readInt16LE(i * 2);\n out[i] = encodeUlawSample(sample);\n }\n return out;\n}\n\n/**\n * Convert ulaw audio to PCM16 little-endian.\n */\nexport function ulawToPcm16(ulaw: Buffer): Buffer {\n if (!ulaw.length) return Buffer.alloc(0);\n const out = Buffer.alloc(ulaw.length * 2);\n for (let i = 0; i < ulaw.length; i++) {\n out.writeInt16LE(DECODE_TABLE[ulaw[i]!]!, i * 2);\n }\n return out;\n}\n\n/**\n * Resample PCM16 audio using linear interpolation.\n */\nexport function resamplePcm16(pcm: Buffer, fromRate: number, toRate: number): Buffer {\n if (fromRate === toRate || !pcm.length) return pcm;\n\n const nSamples = pcm.length >> 1;\n const ratio = fromRate / toRate;\n const outLen = Math.floor(nSamples / ratio);\n const out = Buffer.alloc(outLen * 2);\n\n for (let i = 0; i < outLen; i++) {\n const srcPos = i * ratio;\n const idx = Math.floor(srcPos);\n const frac = srcPos - idx;\n\n let val: number;\n if (idx + 1 < nSamples) {\n val = pcm.readInt16LE(idx * 2) * (1 - frac) + pcm.readInt16LE((idx + 1) * 2) * frac;\n } else {\n val = pcm.readInt16LE(idx * 2);\n }\n out.writeInt16LE(Math.round(val), i * 2);\n }\n\n return out;\n}\n\nexport { DECODE_TABLE };\n","/**\n * Logger factory for the ClawOps agent module.\n *\n * Provides a 2-level hierarchy matching the Python SDK:\n * - clawops.agent (core: agent, session, control-ws, media-ws, recorder, mcp, realtime)\n * - clawops.agent.pipeline (pipeline: pipeline-session, stt, tts)\n */\n\nimport pino from 'pino';\nimport type { Logger } from 'pino';\n\nconst DEFAULT_LOGGER = pino({ name: 'clawops.agent' });\n\n/** A silent logger that discards all output. */\nexport const NOOP_LOGGER = pino({ level: 'silent' });\n\n/**\n * Create or return an agent-level logger.\n * If no user logger is provided, returns the default pino instance.\n */\nexport function createAgentLogger(userLogger?: Logger): Logger {\n return userLogger ?? DEFAULT_LOGGER;\n}\n\n/**\n * Create a pipeline child logger from a parent agent logger.\n * Adds `{ module: 'pipeline' }` to all log entries.\n */\nexport function createPipelineLogger(parent: Logger): Logger {\n return parent.child({ module: 'pipeline' });\n}\n\nexport type { Logger };\n","/**\n * Control WebSocket for agent signaling (call.incoming, call.ended, etc.).\n */\n\nimport type { WebSocket as WsType } from 'ws';\nimport type { Logger } from 'pino';\nimport { NOOP_LOGGER } from './logger.js';\n\nexport interface ControlWsOptions {\n baseUrl: string;\n apiKey: string;\n accountId: string;\n /** Phone number to register on. */\n number?: string;\n}\n\n/**\n * Control event is a flat JSON object with an 'event' field.\n * Example: { \"event\": \"call.incoming\", \"callId\": \"xxx\", \"from\": \"070...\", \"mediaUrl\": \"wss://...\" }\n */\nexport interface ControlEvent {\n event: string;\n [key: string]: unknown;\n}\n\ntype ControlEventHandler = (event: ControlEvent) => void | Promise<void>;\n\nconst INITIAL_RECONNECT_DELAY = 1000;\nconst MAX_RECONNECT_DELAY = 30000;\n/** Server sends ping every 30s; if no ping arrives within this window, assume dead. */\nconst PING_TIMEOUT = 60000;\n\n/**\n * Build the full control WebSocket URL from options.\n * Matches Python SDK: /v1/accounts/{account_id}/agent/listen?number={number}\n */\nexport function buildControlWsUrl(options: ControlWsOptions): string {\n const scheme = options.baseUrl.startsWith('https') ? 'wss' : 'ws';\n const host = options.baseUrl.replace(/^https?:\\/\\//, '').replace(/\\/$/, '');\n let url = `${scheme}://${host}/v1/accounts/${encodeURIComponent(options.accountId)}/agent/listen`;\n if (options.number) {\n url += `?number=${encodeURIComponent(options.number)}`;\n }\n return url;\n}\n\nexport class ControlWebSocket {\n private _url: string;\n private _ws: WsType | null = null;\n private _handlers: Map<string, ControlEventHandler[]> = new Map();\n private _reconnectDelay = INITIAL_RECONNECT_DELAY;\n private _closed = false;\n private _connectedResolve: (() => void) | null = null;\n private _connectedPromise: Promise<void>;\n private _log: Logger = NOOP_LOGGER;\n private _pingTimer: ReturnType<typeof setTimeout> | null = null;\n\n setLogger(logger: Logger): void {\n this._log = logger;\n }\n\n constructor(private readonly _options: ControlWsOptions) {\n this._url = buildControlWsUrl(_options);\n this._connectedPromise = new Promise<void>((resolve) => {\n this._connectedResolve = resolve;\n });\n }\n\n /** Register an event handler for a specific event type. */\n on(event: string, handler: ControlEventHandler): void {\n let list = this._handlers.get(event);\n if (!list) {\n list = [];\n this._handlers.set(event, list);\n }\n list.push(handler);\n }\n\n /** Connect to the control WebSocket. */\n async connect(): Promise<void> {\n this._closed = false;\n await this._doConnect();\n }\n\n /** Wait until the WebSocket is connected. */\n async waitConnected(): Promise<void> {\n return this._connectedPromise;\n }\n\n /** Send a JSON message over the control WebSocket. */\n send(message: Record<string, unknown>): void {\n if (this._ws && this._ws.readyState === 1 /* OPEN */) {\n this._ws.send(JSON.stringify(message));\n }\n }\n\n /** Close the WebSocket and stop reconnecting. */\n close(): void {\n this._closed = true;\n this._clearPingTimer();\n if (this._ws) {\n this._ws.close();\n this._ws = null;\n }\n }\n\n private async _doConnect(): Promise<void> {\n const { WebSocket } = await import('ws');\n\n const ws = new WebSocket(this._url, {\n followRedirects: true,\n headers: {\n Authorization: `Bearer ${this._options.apiKey}`,\n },\n });\n this._ws = ws;\n\n ws.on('open', () => {\n this._reconnectDelay = INITIAL_RECONNECT_DELAY;\n this._resetPingTimer();\n if (this._connectedResolve) {\n this._connectedResolve();\n this._connectedResolve = null;\n }\n this._log.info('Control WS connected: %s', this._url);\n });\n\n ws.on('ping', () => {\n this._resetPingTimer();\n });\n\n ws.on('message', (data: Buffer | string) => {\n try {\n const msg = JSON.parse(data.toString()) as ControlEvent;\n this._dispatchEvent(msg);\n } catch {\n this._log.warn('Control WS parse error');\n }\n });\n\n ws.on('close', () => {\n this._clearPingTimer();\n if (!this._closed) {\n this._scheduleReconnect();\n }\n });\n\n ws.on('error', (err: Error) => {\n this._log.warn('Control WS error: %s', err.message);\n });\n }\n\n private _dispatchEvent(event: ControlEvent): void {\n const handlers = this._handlers.get(event.event);\n if (handlers) {\n for (const handler of handlers) {\n try {\n const result = handler(event);\n if (result && typeof result.catch === 'function') {\n result.catch((err: unknown) => {\n this._log.error({ err }, 'Control WS handler error: %s', event.event);\n });\n }\n } catch (err) {\n this._log.error({ err }, 'Control WS handler error: %s', event.event);\n }\n }\n }\n }\n\n private _resetPingTimer(): void {\n this._clearPingTimer();\n this._pingTimer = setTimeout(() => {\n this._log.warn('Control WS ping timeout, closing connection');\n if (this._ws) {\n this._ws.terminate();\n }\n }, PING_TIMEOUT);\n }\n\n private _clearPingTimer(): void {\n if (this._pingTimer) {\n clearTimeout(this._pingTimer);\n this._pingTimer = null;\n }\n }\n\n private _scheduleReconnect(): void {\n const delay = this._reconnectDelay;\n this._reconnectDelay = Math.min(this._reconnectDelay * 2, MAX_RECONNECT_DELAY);\n this._log.info('Control WS reconnecting in %ds...', delay / 1000);\n\n setTimeout(() => {\n if (!this._closed) {\n this._doConnect().catch((err) => {\n this._log.warn({ err }, 'Control WS reconnect failed');\n this._scheduleReconnect();\n });\n }\n }, delay);\n }\n}\n","/**\n * MCP (Model Context Protocol) client for discovering and calling tools.\n */\n\nimport type { FunctionTool } from '../tool.js';\nimport type { Logger } from 'pino';\nimport { NOOP_LOGGER } from '../logger.js';\n\nexport interface MCPServerConfig {\n /** Server type discriminator. */\n type: 'stdio' | 'http';\n [key: string]: unknown;\n}\n\nexport interface MCPToolDefinition {\n name: string;\n description: string;\n inputSchema: {\n type: 'object';\n properties: Record<string, unknown>;\n required?: string[];\n };\n}\n\nexport class MCPClient {\n private _servers: Map<string, MCPServerConfig & Record<string, unknown>> = new Map();\n private _clients: Map<string, unknown> = new Map();\n private _log: Logger = NOOP_LOGGER;\n\n setLogger(logger: Logger): void {\n this._log = logger;\n }\n\n /** Add an MCP server configuration. */\n addServer(name: string, config: MCPServerConfig & Record<string, unknown>): void {\n this._servers.set(name, config);\n }\n\n /** Connect to all configured MCP servers and discover tools. */\n async connect(): Promise<FunctionTool[]> {\n const allTools: FunctionTool[] = [];\n\n for (const [name, config] of this._servers) {\n try {\n const tools = await this._connectServer(name, config);\n allTools.push(...tools);\n } catch (err) {\n this._log.error({ err }, 'MCP connection failed: %s', name);\n }\n }\n\n return allTools;\n }\n\n /** Disconnect from all MCP servers. */\n async disconnect(): Promise<void> {\n for (const [name, client] of this._clients) {\n try {\n this._log.debug('MCP closing: %s', name);\n const c = client as { close?: () => Promise<void> };\n if (c.close) {\n await c.close();\n }\n } catch (err) {\n this._log.error({ err }, 'MCP disconnect error: %s', name);\n }\n }\n this._clients.clear();\n }\n\n private async _connectServer(\n name: string,\n config: MCPServerConfig & Record<string, unknown>,\n ): Promise<FunctionTool[]> {\n // Dynamic import to keep @modelcontextprotocol/sdk optional\n const sdk = await import('@modelcontextprotocol/sdk/client/index.js');\n const { Client } = sdk;\n\n const client = new Client({ name: `clawops-${name}`, version: '1.0.0' });\n\n if (config.type === 'stdio') {\n this._log.debug('MCP connecting (stdio): %s', config['command']);\n } else if (config.type === 'http') {\n this._log.debug('MCP connecting (http): %s', config['url']);\n }\n\n let transport: unknown;\n\n if (config.type === 'stdio') {\n const { StdioClientTransport } = await import(\n '@modelcontextprotocol/sdk/client/stdio.js'\n );\n transport = new StdioClientTransport({\n command: config['command'] as string,\n args: (config['args'] as string[]) ?? [],\n env: config['env'] as Record<string, string> | undefined,\n });\n } else if (config.type === 'http') {\n const { StreamableHTTPClientTransport } = await import(\n '@modelcontextprotocol/sdk/client/streamableHttp.js'\n );\n transport = new StreamableHTTPClientTransport(\n new URL(config['url'] as string),\n );\n } else {\n throw new Error(`Unsupported MCP server type: ${config.type}`);\n }\n\n await client.connect(transport as Parameters<typeof client.connect>[0]);\n this._clients.set(name, client);\n\n // Discover tools\n const toolsResult = await client.listTools();\n const tools: FunctionTool[] = [];\n\n for (const toolDef of toolsResult.tools) {\n const inputSchema = toolDef.inputSchema as MCPToolDefinition['inputSchema'];\n tools.push({\n name: toolDef.name,\n description: toolDef.description ?? '',\n parameters: inputSchema.properties ?? {},\n required: inputSchema.required ?? [],\n handler: async (args: Record<string, unknown>) => {\n this._log.debug('MCP call_tool: %s', toolDef.name);\n const result = await client.callTool({\n name: toolDef.name,\n arguments: args,\n });\n // Extract text content from the result\n const content = result.content as Array<{ type: string; text?: string }>;\n if (content && content.length > 0) {\n return content\n .filter((c) => c.type === 'text')\n .map((c) => c.text)\n .join('\\n');\n }\n return JSON.stringify(result);\n },\n });\n }\n\n this._log.info('MCP server connected: %d tools found', tools.length);\n this._log.debug('MCP tools: %s', tools.map(t => t.name));\n\n return tools;\n }\n}\n","/**\n * Media WebSocket for streaming audio to/from the telephony platform.\n *\n * ClawOps VoiceML Stream protocol:\n * connected -> start -> media (G.711 ulaw 8kHz base64) -> mark -> stop\n */\n\nimport type { WebSocket as WsType } from 'ws';\nimport type { Logger } from 'pino';\nimport { NOOP_LOGGER } from './logger.js';\n\nexport interface MediaStartEvent {\n streamId: string;\n callId: string;\n accountId: string;\n sampleRate: number;\n}\n\nexport interface MediaEvent {\n audio: Buffer;\n timestamp: number;\n}\n\nexport interface DtmfEvent {\n digit: string;\n track: string;\n}\n\n/**\n * Parse a 'start' event payload from the media WebSocket.\n */\nexport function parseStartEvent(data: Record<string, unknown>): MediaStartEvent {\n const start = data['start'] as Record<string, unknown>;\n const fmt = (start['mediaFormat'] ?? {}) as Record<string, unknown>;\n return {\n streamId: (start['streamId'] ?? '') as string,\n callId: (start['callId'] ?? '') as string,\n accountId: (start['accountId'] ?? '') as string,\n sampleRate: (fmt['sampleRate'] ?? 8000) as number,\n };\n}\n\n/**\n * Parse a 'media' event payload.\n */\nexport function parseMediaEvent(data: Record<string, unknown>): MediaEvent {\n const media = data['media'] as Record<string, unknown>;\n return {\n audio: Buffer.from((media['payload'] ?? '') as string, 'base64'),\n timestamp: parseInt((media['timestamp'] as string) ?? '0', 10) || 0,\n };\n}\n\n/**\n * Build a media response message to send audio back.\n */\nexport function buildMediaResponse(audioBase64: string): string {\n return JSON.stringify({\n event: 'media',\n media: {\n payload: audioBase64,\n },\n });\n}\n\nconst VALID_DTMF_DIGITS = new Set('0123456789*#');\n\nexport function parseDtmfEvent(data: Record<string, unknown>): DtmfEvent {\n const dtmf = data['dtmf'] as Record<string, unknown>;\n return {\n digit: (dtmf['digit'] ?? '') as string,\n track: (dtmf['track'] ?? '') as string,\n };\n}\n\nexport function buildDtmfMessage(digit: string): string {\n if (!VALID_DTMF_DIGITS.has(digit)) {\n throw new Error(`유효하지 않은 DTMF digit: ${digit}`);\n }\n return JSON.stringify({ event: 'dtmf', dtmf: { digit } });\n}\n\nexport class MediaWebSocket {\n private _ws: WsType | null = null;\n private _audioQueue: string[] = [];\n private _sendLoopRunning = false;\n private _closed = false;\n private _onAudio: ((audio: Buffer, timestamp: number) => void) | null = null;\n private _onStart: ((event: MediaStartEvent) => void) | null = null;\n private _onClose: (() => void) | null = null;\n private _onDtmf: ((digit: string) => void) | null = null;\n private _markWaiters: Map<string, () => void> = new Map();\n private _log: Logger = NOOP_LOGGER;\n\n setLogger(logger: Logger): void {\n this._log = logger;\n }\n\n /** Set the handler for inbound audio data. */\n onAudio(handler: (audio: Buffer, timestamp: number) => void): void {\n this._onAudio = handler;\n }\n\n /** Set the handler for the start event. */\n onStart(handler: (event: MediaStartEvent) => void): void {\n this._onStart = handler;\n }\n\n /** Set the handler for connection close. */\n onClose(handler: () => void): void {\n this._onClose = handler;\n }\n\n /** Set the handler for inbound DTMF events. */\n onDtmf(handler: (digit: string) => void): void {\n this._onDtmf = handler;\n }\n\n /** Send a single DTMF digit to the platform. */\n sendDtmf(digit: string): void {\n if (this._ws && this._ws.readyState === 1) {\n this._ws.send(buildDtmfMessage(digit));\n }\n }\n\n /** Whether the WebSocket is connected. */\n get isConnected(): boolean {\n return this._ws !== null && this._ws.readyState === 1 && !this._closed;\n }\n\n /** Connect to a media WebSocket URL with Bearer authentication. */\n async connect(url: string, apiKey: string): Promise<void> {\n const { WebSocket } = await import('ws');\n\n return new Promise<void>((resolve, reject) => {\n const ws = new WebSocket(url, {\n followRedirects: true,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n });\n this._ws = ws;\n this._closed = false;\n\n ws.on('open', () => {\n this._startSendLoop();\n resolve();\n this._log.info('Media WS connected: %s', url);\n });\n\n ws.on('message', (data: Buffer | string) => {\n try {\n const msg = JSON.parse(data.toString()) as Record<string, unknown>;\n this._handleMessage(msg);\n } catch {\n // Ignore parse errors\n }\n });\n\n ws.on('close', () => {\n this._closed = true;\n if (this._onClose) {\n this._onClose();\n }\n });\n\n ws.on('error', (err: Error) => {\n if (!this._ws) {\n reject(err);\n }\n this._log.error({ err }, 'Media WS error');\n });\n });\n }\n\n /** Queue base64-encoded audio for sending. */\n sendAudio(audioBase64: string): void {\n this._audioQueue.push(audioBase64);\n }\n\n /** Clear all queued outbound audio. */\n sendClear(): void {\n this._audioQueue.length = 0;\n if (this._ws && this._ws.readyState === 1) {\n this._ws.send(JSON.stringify({ event: 'clear' }));\n }\n }\n\n /** Send a mark event. */\n sendMark(name: string): void {\n if (this._ws && this._ws.readyState === 1) {\n this._ws.send(\n JSON.stringify({\n event: 'mark',\n mark: { name },\n }),\n );\n }\n }\n\n /** Wait for all queued audio to be sent. */\n flush(): Promise<void> {\n if (this._audioQueue.length === 0 || this._closed) return Promise.resolve();\n return new Promise<void>((resolve) => {\n const check = () => {\n if (this._audioQueue.length === 0 || this._closed) {\n resolve();\n } else {\n setTimeout(check, 5);\n }\n };\n setTimeout(check, 5);\n });\n }\n\n /** Wait for a named mark to be echoed back by the server. */\n waitForMark(name: string, timeoutMs = 5000): Promise<void> {\n if (this._closed) return Promise.resolve();\n return new Promise<void>((resolve) => {\n const timer = setTimeout(() => {\n this._markWaiters.delete(name);\n resolve();\n }, timeoutMs);\n this._markWaiters.set(name, () => {\n clearTimeout(timer);\n resolve();\n });\n });\n }\n\n /** Close the media WebSocket. */\n close(): void {\n this._closed = true;\n if (this._ws) {\n this._ws.close();\n this._ws = null;\n }\n }\n\n private _handleMessage(msg: Record<string, unknown>): void {\n const event = msg['event'] as string;\n\n switch (event) {\n case 'start': {\n const startEvt = parseStartEvent(msg);\n if (this._onStart) {\n this._onStart(startEvt);\n }\n break;\n }\n case 'media': {\n const mediaEvt = parseMediaEvent(msg);\n if (this._onAudio) {\n this._onAudio(mediaEvt.audio, mediaEvt.timestamp);\n }\n break;\n }\n case 'dtmf': {\n const dtmfEvt = parseDtmfEvent(msg);\n if (this._onDtmf) {\n this._onDtmf(dtmfEvt.digit);\n }\n break;\n }\n case 'mark': {\n const markName = (msg['mark'] as Record<string, unknown>)?.['name'] as string;\n if (markName) {\n const resolve = this._markWaiters.get(markName);\n if (resolve) {\n this._markWaiters.delete(markName);\n resolve();\n }\n }\n break;\n }\n case 'stop': {\n this.close();\n break;\n }\n }\n }\n\n private _startSendLoop(): void {\n if (this._sendLoopRunning) return;\n this._sendLoopRunning = true;\n\n const loop = () => {\n if (this._closed) {\n this._sendLoopRunning = false;\n return;\n }\n\n while (this._audioQueue.length > 0 && this._ws && this._ws.readyState === 1) {\n const payload = this._audioQueue.shift()!;\n this._ws.send(buildMediaResponse(payload));\n }\n\n setTimeout(loop, 20);\n };\n\n loop();\n }\n}\n","/**\n * 3-file call recording: in.wav, out.wav, mix.wav\n *\n * Wall-clock 동기화로 실시간 녹음. 세 파일 모두 동일한 길이로 유지된다.\n * recordings/{call_id}/in.wav — 상대방 음성 (PCM16 8kHz mono)\n * recordings/{call_id}/out.wav — AI 음성 (PCM16 8kHz mono)\n * recordings/{call_id}/mix.wav — 양쪽 믹싱 (PCM16 8kHz mono)\n */\nimport * as fs from 'node:fs'\nimport * as path from 'node:path'\nimport type { Logger } from 'pino';\nimport { NOOP_LOGGER } from './logger.js';\n\nconst SAMPLE_RATE = 8000\nconst CHANNELS = 1\nconst BITS_PER_SAMPLE = 16\nconst BYTES_PER_SECOND = SAMPLE_RATE * CHANNELS * (BITS_PER_SAMPLE / 8) // 16000\n\nexport function makeWavHeader(dataSize: number = 0): Buffer {\n const header = Buffer.alloc(44)\n header.write('RIFF', 0, 'ascii')\n header.writeUInt32LE(36 + dataSize, 4)\n header.write('WAVE', 8, 'ascii')\n header.write('fmt ', 12, 'ascii')\n header.writeUInt32LE(16, 16) // fmt chunk size\n header.writeUInt16LE(1, 20) // PCM format\n header.writeUInt16LE(CHANNELS, 22)\n header.writeUInt32LE(SAMPLE_RATE, 24)\n header.writeUInt32LE(SAMPLE_RATE * CHANNELS * (BITS_PER_SAMPLE / 8), 28) // byte rate\n header.writeUInt16LE(CHANNELS * (BITS_PER_SAMPLE / 8), 32) // block align\n header.writeUInt16LE(BITS_PER_SAMPLE, 34)\n header.write('data', 36, 'ascii')\n header.writeUInt32LE(dataSize, 40)\n return header\n}\n\nexport function mixSamples(a: Buffer, b: Buffer): Buffer {\n const n = Math.min(a.length, b.length) >> 1 // sample count\n const result = Buffer.alloc(n * 2)\n for (let i = 0; i < n; i++) {\n const sa = a.readInt16LE(i * 2)\n const sb = b.readInt16LE(i * 2)\n result.writeInt16LE(Math.max(-32768, Math.min(32767, sa + sb)), i * 2)\n }\n return result\n}\n\nexport class AudioRecorder {\n private readonly _dir: string\n private _fdIn: number | null = null\n private _fdOut: number | null = null\n private _fdMix: number | null = null\n private _inWritten = 0\n private _outWritten = 0\n private _mixWritten = 0\n private _startTime = 0\n private _started = false\n private _log: Logger = NOOP_LOGGER;\n\n setLogger(logger: Logger): void {\n this._log = logger;\n }\n\n constructor(recordingPath: string, callId: string) {\n this._dir = path.join(recordingPath, callId)\n }\n\n start(): void {\n fs.mkdirSync(this._dir, { recursive: true })\n const header = makeWavHeader()\n this._fdIn = fs.openSync(path.join(this._dir, 'in.wav'), 'w')\n this._fdOut = fs.openSync(path.join(this._dir, 'out.wav'), 'w')\n this._fdMix = fs.openSync(path.join(this._dir, 'mix.wav'), 'w+')\n fs.writeSync(this._fdIn, header)\n fs.writeSync(this._fdOut, header)\n fs.writeSync(this._fdMix, header)\n this._startTime = performance.now()\n this._started = true\n this._log.info('Recording started: %s', this._dir);\n }\n\n private _expectedBytes(): number {\n const elapsed = (performance.now() - this._startTime) / 1000 // ms → s\n return Math.floor(elapsed * BYTES_PER_SECOND)\n }\n\n private _padSilence(fd: number, written: number): number {\n const expected = this._expectedBytes()\n let gap = expected - written\n if (gap <= 0) return 0\n gap = gap - (gap % 2) // 2-byte align\n if (gap > 0) {\n fs.writeSync(fd, Buffer.alloc(gap))\n }\n return gap\n }\n\n private _writeToMix(data: Buffer, trackPos: number): void {\n if (this._fdMix === null) return\n const filePos = 44 + trackPos\n\n if (trackPos < this._mixWritten) {\n // Overlap: read existing, mix, write back\n const overlap = Math.min(data.length, this._mixWritten - trackPos)\n const existing = Buffer.alloc(overlap)\n fs.readSync(this._fdMix, existing, 0, overlap, filePos)\n const mixed = mixSamples(existing, data.subarray(0, overlap))\n fs.writeSync(this._fdMix, mixed, 0, mixed.length, filePos)\n // Write remaining beyond overlap\n if (data.length > overlap) {\n fs.writeSync(this._fdMix, data, overlap, data.length - overlap, filePos + overlap)\n this._mixWritten = trackPos + data.length\n }\n } else {\n // No overlap: pad gap if needed, then write\n if (trackPos > this._mixWritten) {\n let gap = trackPos - this._mixWritten\n gap = gap - (gap % 2) // 2-byte align\n if (gap > 0) {\n const silence = Buffer.alloc(gap)\n fs.writeSync(this._fdMix, silence, 0, silence.length, 44 + this._mixWritten)\n this._mixWritten += gap\n }\n }\n fs.writeSync(this._fdMix, data, 0, data.length, 44 + this._mixWritten)\n this._mixWritten += data.length\n }\n }\n\n writeInbound(pcm16_8k: Buffer): void {\n if (!this._started || this._fdIn === null) return\n try {\n const gap = this._padSilence(this._fdIn, this._inWritten)\n this._inWritten += gap\n const posBefore = this._inWritten\n fs.writeSync(this._fdIn, pcm16_8k)\n this._inWritten += pcm16_8k.length\n this._writeToMix(pcm16_8k, posBefore)\n } catch (err) {\n this._log.error({ err }, 'Recording write error (inbound)');\n }\n }\n\n writeOutbound(pcm16_8k: Buffer): void {\n if (!this._started || this._fdOut === null) return\n try {\n const gap = this._padSilence(this._fdOut, this._outWritten)\n this._outWritten += gap\n const posBefore = this._outWritten\n fs.writeSync(this._fdOut, pcm16_8k)\n this._outWritten += pcm16_8k.length\n this._writeToMix(pcm16_8k, posBefore)\n } catch (err) {\n this._log.error({ err }, 'Recording write error (outbound)');\n }\n }\n\n stop(): void {\n if (!this._started) return\n try {\n let maxWritten = Math.max(this._inWritten, this._outWritten, this._mixWritten)\n maxWritten = maxWritten & ~1 // 2-byte align (round down)\n\n for (const [fd, written] of [\n [this._fdIn, this._inWritten],\n [this._fdOut, this._outWritten],\n [this._fdMix, this._mixWritten],\n ] as const) {\n if (fd === null) continue\n const pad = maxWritten - written\n if (pad > 0) {\n fs.writeSync(fd, Buffer.alloc(pad), 0, pad, 44 + written)\n }\n // Update WAV header\n fs.writeSync(fd, makeWavHeader(maxWritten), 0, 44, 0)\n fs.closeSync(fd)\n }\n const maxSec = maxWritten / 16000;\n this._log.info('Recording stopped: %s (%ds)', this._dir, maxSec);\n } catch (err) {\n this._log.error({ err }, 'Recording stop error');\n } finally {\n this._fdIn = null\n this._fdOut = null\n this._fdMix = null\n this._started = false\n }\n }\n}\n","/**\n * Call telemetry types and helpers for reporting SDK info,\n * session configuration, and call performance metrics.\n */\n\nimport os from 'os';\nimport { VERSION } from '../version.js';\n\nexport interface SdkInfo {\n name: string;\n version: string;\n runtime: string;\n os: string;\n}\n\nexport interface ProviderInfo {\n provider: string;\n model: string;\n}\n\nexport interface SessionTelemetry {\n sessionType: string;\n llm: ProviderInfo | null;\n stt: ProviderInfo | null;\n tts: ProviderInfo | null;\n voice: string | null;\n language: string;\n greetingEnabled: boolean;\n recordingEnabled: boolean;\n toolCount: number;\n mcpServerCount: number;\n builtinTools: string[];\n}\n\nexport interface CallMetrics {\n firstResponseMs: number | null;\n turnCount: number;\n toolCallCount: number;\n toolErrorCount: number;\n bargeInCount: number;\n endReason: string | null;\n errors: Array<{ type: string; message: string }>;\n}\n\nconst MAX_ERRORS = 20;\nconst MAX_ERROR_MESSAGE_LENGTH = 200;\n\nexport function getSdkInfo(): SdkInfo {\n return {\n name: 'clawops-node',\n version: VERSION,\n runtime: `node/${process.versions.node}`,\n os: `${process.platform}/${os.arch()}`,\n };\n}\n\nexport function createCallMetrics(): CallMetrics {\n return {\n firstResponseMs: null,\n turnCount: 0,\n toolCallCount: 0,\n toolErrorCount: 0,\n bargeInCount: 0,\n endReason: null,\n errors: [],\n };\n}\n\nexport function addMetricError(metrics: CallMetrics, err: Error): void {\n metrics.toolErrorCount++;\n if (metrics.errors.length < MAX_ERRORS) {\n metrics.errors.push({\n type: err.name || 'Error',\n message: (err.message || '').slice(0, MAX_ERROR_MESSAGE_LENGTH),\n });\n }\n}\n","/**\n * CallSession represents an active phone call and provides methods to\n * send audio, hang up, and listen for lifecycle events.\n */\n\nimport type { Logger } from 'pino';\nimport { NOOP_LOGGER } from './logger.js';\nimport { type CallMetrics, createCallMetrics, addMetricError } from './telemetry.js';\n\nexport type CallDirection = 'inbound' | 'outbound';\nexport type CallStatus = 'ringing' | 'active' | 'ended';\n\n/**\n * Session event handler: receives (call, ...args) like the Python SDK.\n * For example, 'transcript' events pass (call, role, text).\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype SessionEventHandler = (...args: any[]) => void | Promise<void>;\n\nexport interface SendAudioFn {\n (audio: Buffer): void;\n}\n\nexport interface ClearAudioFn {\n (): void;\n}\n\nexport interface HangupFn {\n (): void | Promise<void>;\n}\n\nexport interface SendDtmfFn {\n (digit: string): Promise<void>;\n}\n\nexport class CallSession {\n readonly callId: string;\n readonly fromNumber: string;\n readonly toNumber: string;\n readonly accountId: string;\n readonly direction: CallDirection;\n readonly startTime: Date;\n readonly metadata: Record<string, unknown>;\n\n private _status: CallStatus;\n private _sendAudioFn: SendAudioFn | null = null;\n private _clearAudioFn: ClearAudioFn | null = null;\n private _hangupFn: HangupFn | null = null;\n /** @internal */ _sendDtmfFn: SendDtmfFn | null = null;\n /** @internal */ _isTransportConnected: (() => boolean) | null = null;\n private _dtmfCollectorActive = false;\n private _dtmfResolvers: ((digit: string) => void)[] = [];\n private _dtmfBuffer: string[] = [];\n private _log: Logger = NOOP_LOGGER;\n private _handlers: Map<string, SessionEventHandler[]> = new Map();\n private _endedPromise: Promise<void>;\n private _resolveEnded!: () => void;\n private _metrics: CallMetrics = createCallMetrics();\n private _firstResponseSent = false;\n\n constructor(options: {\n callId: string;\n fromNumber: string;\n toNumber: string;\n accountId: string;\n direction: CallDirection;\n metadata?: Record<string, unknown>;\n }) {\n this.callId = options.callId;\n this.fromNumber = options.fromNumber;\n this.toNumber = options.toNumber;\n this.accountId = options.accountId;\n this.direction = options.direction;\n this.metadata = options.metadata ?? {};\n this._status = 'ringing';\n this.startTime = new Date();\n\n this._endedPromise = new Promise<void>((resolve) => {\n this._resolveEnded = resolve;\n });\n }\n\n setLogger(logger: Logger): void {\n this._log = logger;\n }\n\n get status(): CallStatus {\n return this._status;\n }\n\n get duration(): number {\n return (Date.now() - this.startTime.getTime()) / 1000;\n }\n\n get metrics(): Readonly<CallMetrics> { return this._metrics; }\n\n recordFirstResponse(): void {\n if (!this._firstResponseSent) {\n this._firstResponseSent = true;\n this._metrics.firstResponseMs = Date.now() - this.startTime.getTime();\n }\n }\n recordTurn(): void { this._metrics.turnCount++; }\n recordToolCall(): void { this._metrics.toolCallCount++; }\n recordToolError(err: Error): void { addMetricError(this._metrics, err); }\n recordBargeIn(): void { this._metrics.bargeInCount++; }\n recordEndReason(reason: string): void { this._metrics.endReason = reason; }\n\n /** Bind transport functions (called internally by the agent). */\n _bindTransport(\n send: SendAudioFn,\n clear: ClearAudioFn,\n hangup: HangupFn,\n sendDtmf?: SendDtmfFn,\n isConnected?: () => boolean,\n ): void {\n this._sendAudioFn = send;\n this._clearAudioFn = clear;\n this._hangupFn = hangup;\n if (sendDtmf) this._sendDtmfFn = sendDtmf;\n if (isConnected) this._isTransportConnected = isConnected;\n this._status = 'active';\n }\n\n /** Send PCM16 or ulaw audio to the caller. */\n sendAudio(audio: Buffer): void {\n if (this._sendAudioFn) {\n this._sendAudioFn(audio);\n }\n }\n\n /** Clear any queued outbound audio. */\n clearAudio(): void {\n if (this._clearAudioFn) {\n this._clearAudioFn();\n }\n }\n\n /** Hang up the call, waiting for pending audio to finish. */\n async hangup(): Promise<void> {\n if (this._hangupFn) {\n await this._hangupFn();\n }\n }\n\n /** @internal Route a received DTMF digit to an active collector or buffer. */\n _routeDtmf(digit: string): void {\n if (this._dtmfCollectorActive && this._dtmfResolvers.length > 0) {\n const resolve = this._dtmfResolvers.shift()!;\n resolve(digit);\n } else {\n // Buffer the digit — collector may not be active yet (tool call timing)\n this._dtmfBuffer.push(digit);\n }\n }\n\n /** Collect DTMF digits from the caller. */\n async collectDtmf(options: {\n maxDigits: number;\n finishOnKey?: string;\n timeout?: number;\n secure?: boolean;\n }): Promise<string> {\n if (this._dtmfCollectorActive) {\n throw new Error('이미 DTMF 수집 중입니다');\n }\n\n const { maxDigits, finishOnKey = '#', timeout = 5 } = options;\n this._dtmfCollectorActive = true;\n // Don't clear buffer — digits may have arrived before tool call was processed\n const collected: string[] = [];\n\n try {\n while (collected.length < maxDigits) {\n // Drain the buffer first\n if (this._dtmfBuffer.length > 0) {\n const digit = this._dtmfBuffer.shift()!;\n if (digit === finishOnKey) break;\n collected.push(digit);\n continue;\n }\n\n const digit = await Promise.race([\n new Promise<string>((resolve) => {\n this._dtmfResolvers.push(resolve);\n }),\n new Promise<null>((resolve) => {\n setTimeout(() => resolve(null), timeout * 1000);\n }),\n ]);\n\n if (digit === null) break; // timeout\n if (digit === finishOnKey) break;\n collected.push(digit);\n }\n } finally {\n this._dtmfCollectorActive = false;\n this._dtmfResolvers = [];\n this._dtmfBuffer = [];\n }\n\n const result = collected.join('');\n this._log.info('DTMF collected: %s', result);\n return result;\n }\n\n /** Send a sequence of DTMF digits. */\n async sendDtmfSequence(digits: string): Promise<void> {\n if (!this._sendDtmfFn) {\n throw new Error('DTMF 전송 함수가 바인딩되지 않았습니다');\n }\n for (const ch of digits) {\n if (this._isTransportConnected && !this._isTransportConnected()) {\n throw new Error('DTMF 전송 중 연결이 끊어졌습니다');\n }\n if (ch === 'w') {\n await new Promise((r) => setTimeout(r, 500));\n } else if (ch === 'W') {\n await new Promise((r) => setTimeout(r, 1000));\n } else if ('0123456789*#'.includes(ch)) {\n if (this._sendDtmfFn) {\n await this._sendDtmfFn(ch);\n }\n } else {\n throw new Error(`유효하지 않은 DTMF 문자: ${ch}`);\n }\n }\n }\n\n /** Register an event handler. */\n on(event: string, handler: SessionEventHandler): void {\n let list = this._handlers.get(event);\n if (!list) {\n list = [];\n this._handlers.set(event, list);\n }\n list.push(handler);\n }\n\n /** Wait for the call to end. */\n async wait(): Promise<void> {\n return this._endedPromise;\n }\n\n /** Mark the session as ended (called internally). */\n _markEnded(): void {\n this._status = 'ended';\n this._resolveEnded();\n }\n\n /** Emit an event to registered handlers. Matches Python SDK: _emit(event, ...args) */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n _emit(event: string, ...args: any[]): void {\n const handlers = this._handlers.get(event);\n if (handlers) {\n for (const handler of handlers) {\n try {\n const result = handler(this, ...args);\n if (result && typeof result.catch === 'function') {\n result.catch((err: unknown) => {\n this._log.error({ err }, 'CallSession handler error: %s', event);\n });\n }\n } catch (err) {\n this._log.error({ err }, 'CallSession handler error: %s', event);\n }\n }\n }\n }\n}\n","/**\n * Built-in tool definitions and selection constants.\n */\n\nexport enum BuiltinTool {\n /** 전화 종료 도구. AI가 대화 완료 시 통화를 종료합니다. */\n HANG_UP = 'hang_up',\n /** DTMF 수집 도구. 사용자의 키패드 입력을 수집합니다. */\n COLLECT_DTMF = 'collect_dtmf',\n /** DTMF 전송 도구. ARS 탐색이나 내선번호 입력에 사용합니다. */\n SEND_DTMF = 'send_dtmf',\n\n /** 모든 내장 도구를 활성화합니다. (기본값) */\n ALL = 'all',\n /** 모든 내장 도구를 비활성화합니다. */\n NONE = 'none',\n}\n\nconst INDIVIDUAL_TOOLS = new Set([\n BuiltinTool.HANG_UP,\n BuiltinTool.COLLECT_DTMF,\n BuiltinTool.SEND_DTMF,\n]);\n\nexport function resolveBuiltinTools(\n value: BuiltinTool | BuiltinTool[],\n): Set<BuiltinTool> {\n if (typeof value === 'string') {\n if (value === BuiltinTool.ALL) {\n return new Set(INDIVIDUAL_TOOLS);\n }\n if (value === BuiltinTool.NONE) {\n return new Set();\n }\n return new Set([value]);\n }\n return new Set(value.filter((t) => INDIVIDUAL_TOOLS.has(t)));\n}\n","/**\n * Tool registry for function-calling in voice agent pipelines.\n * Uses Zod schemas for parameter validation.\n */\n\nimport type { z } from 'zod';\n\nexport interface FunctionTool {\n name: string;\n description: string;\n parameters: Record<string, unknown>;\n required: string[];\n handler: (args: Record<string, unknown>) => unknown | Promise<unknown>;\n}\n\nexport interface OpenAIToolDefinition {\n type: 'function';\n function: {\n name: string;\n description: string;\n parameters: {\n type: 'object';\n properties: Record<string, unknown>;\n required: string[];\n };\n };\n}\n\n/**\n * Decorator / identity function for marking a function as a tool handler.\n * In TypeScript, this simply returns the function as-is. Use with ToolRegistry.register().\n */\nexport function functionTool<T extends (...args: unknown[]) => unknown>(fn: T): T {\n return fn;\n}\n\nexport class ToolRegistry {\n private _tools: Map<string, FunctionTool> = new Map();\n private _mcpTools: Map<string, FunctionTool> = new Map();\n\n /** Register a function tool. */\n register(tool: FunctionTool): void {\n this._tools.set(tool.name, tool);\n }\n\n /** Register tools discovered from MCP servers. */\n registerMcpTools(tools: FunctionTool[]): void {\n for (const tool of tools) {\n this._mcpTools.set(tool.name, tool);\n }\n }\n\n /** Clear all MCP-registered tools. */\n clearMcpTools(): void {\n this._mcpTools.clear();\n }\n\n /**\n * Create a fork (shallow copy) of this registry.\n * Useful for per-session tool isolation.\n */\n fork(): ToolRegistry {\n const copy = new ToolRegistry();\n for (const [name, tool] of this._tools) {\n copy._tools.set(name, tool);\n }\n for (const [name, tool] of this._mcpTools) {\n copy._mcpTools.set(name, tool);\n }\n return copy;\n }\n\n /** Check if a tool is registered. */\n has(name: string): boolean {\n return this._tools.has(name) || this._mcpTools.has(name);\n }\n\n /** Get a tool by name. */\n get(name: string): FunctionTool | undefined {\n return this._tools.get(name) ?? this._mcpTools.get(name);\n }\n\n /** Convert all registered tools to OpenAI function-calling format. */\n toOpenAITools(): OpenAIToolDefinition[] {\n const result: OpenAIToolDefinition[] = [];\n const allTools = [...this._tools.values(), ...this._mcpTools.values()];\n\n for (const tool of allTools) {\n result.push({\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: {\n type: 'object',\n properties: tool.parameters,\n required: tool.required,\n },\n },\n });\n }\n\n return result;\n }\n\n /** Call a tool by name with the given arguments. */\n async call(name: string, args: Record<string, unknown>): Promise<unknown> {\n const tool = this.get(name);\n if (!tool) {\n throw new Error(`Tool '${name}' not found in registry`);\n }\n return tool.handler(args);\n }\n\n /** Get the number of registered tools (including MCP). */\n get size(): number {\n return this._tools.size + this._mcpTools.size;\n }\n}\n\n/**\n * Helper to convert a Zod object schema into a JSON Schema properties + required list.\n */\nexport function zodToToolParams(schema: z.ZodObject<z.ZodRawShape>): {\n parameters: Record<string, unknown>;\n required: string[];\n} {\n const shape = schema.shape;\n const parameters: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const [key, field] of Object.entries(shape)) {\n const zodField = field as z.ZodTypeAny;\n const desc = zodField.description;\n let isOptional = false;\n let innerType = zodField;\n\n // Unwrap ZodOptional\n if ('unwrap' in zodField && zodField._def?.typeName === 'ZodOptional') {\n isOptional = true;\n innerType = (zodField as z.ZodOptional<z.ZodTypeAny>).unwrap();\n }\n\n const jsonSchema: Record<string, unknown> = {};\n\n // Map common Zod types to JSON Schema\n const typeName = innerType._def?.typeName as string | undefined;\n switch (typeName) {\n case 'ZodString':\n jsonSchema.type = 'string';\n break;\n case 'ZodNumber':\n jsonSchema.type = 'number';\n break;\n case 'ZodBoolean':\n jsonSchema.type = 'boolean';\n break;\n case 'ZodArray':\n jsonSchema.type = 'array';\n break;\n case 'ZodEnum':\n jsonSchema.type = 'string';\n jsonSchema.enum = innerType._def?.values;\n break;\n default:\n jsonSchema.type = 'string';\n }\n\n if (desc) {\n jsonSchema.description = desc;\n }\n\n parameters[key] = jsonSchema;\n\n if (!isOptional) {\n required.push(key);\n }\n }\n\n return { parameters, required };\n}\n","/**\n * Tracing configuration for OpenTelemetry integration.\n */\n\nexport interface TracingConfig {\n /** Whether tracing is enabled. Default: false */\n enabled: boolean;\n /** Service name for traces. Default: 'clawops-agent' */\n serviceName?: string;\n /**\n * Optional TracerProvider instance from @opentelemetry/api.\n * If not provided, the global tracer provider will be used.\n */\n tracerProvider?: unknown;\n}\n\nconst DEFAULT_CONFIG: TracingConfig = {\n enabled: false,\n serviceName: 'clawops-agent',\n};\n\nlet _currentConfig: TracingConfig = { ...DEFAULT_CONFIG };\n\n/** Get the current tracing configuration. */\nexport function getTracingConfig(): TracingConfig {\n return _currentConfig;\n}\n\n/** Set the tracing configuration. */\nexport function setTracingConfig(config: Partial<TracingConfig>): void {\n _currentConfig = { ..._currentConfig, ...config };\n}\n\n/** Reset tracing configuration to defaults. */\nexport function resetTracingConfig(): void {\n _currentConfig = { ...DEFAULT_CONFIG };\n}\n","/**\n * OpenTelemetry span helpers. No-op when OpenTelemetry is not installed.\n */\n\nimport { getTracingConfig } from './config.js';\n\n/** Tracer interface (subset of @opentelemetry/api Tracer). */\ninterface Tracer {\n startSpan(name: string, options?: Record<string, unknown>): Span;\n startActiveSpan<T>(\n name: string,\n options: Record<string, unknown>,\n fn: (span: Span) => T,\n ): T;\n}\n\n/** Span interface (subset of @opentelemetry/api Span). */\ninterface Span {\n setAttribute(key: string, value: string | number | boolean): void;\n setStatus(status: { code: number; message?: string }): void;\n recordException(error: Error): void;\n end(): void;\n}\n\n// Cached tracer instance\nlet _tracer: Tracer | null = null;\n\n/**\n * Get the tracer, or null if tracing is not enabled/available.\n */\nasync function getTracer(): Promise<Tracer | null> {\n const config = getTracingConfig();\n if (!config.enabled) return null;\n\n if (_tracer) return _tracer;\n\n try {\n const otel = await import('@opentelemetry/api');\n const provider = config.tracerProvider ?? otel.trace.getTracerProvider();\n _tracer = (provider as { getTracer: (name: string, version?: string) => Tracer }).getTracer(\n config.serviceName ?? 'clawops-agent',\n '1.0.0',\n );\n return _tracer;\n } catch {\n // OpenTelemetry not installed\n return null;\n }\n}\n\n/**\n * Start a new span. Returns a no-op span if tracing is not available.\n */\nexport async function startSpan(\n name: string,\n attributes?: Record<string, string | number | boolean>,\n): Promise<Span> {\n const tracer = await getTracer();\n if (!tracer) {\n return createNoOpSpan();\n }\n\n const span = tracer.startSpan(name, {\n attributes,\n });\n return span;\n}\n\n/**\n * Run a function within a new active span.\n */\nexport async function withSpan<T>(\n name: string,\n attributes: Record<string, string | number | boolean>,\n fn: (span: Span) => Promise<T>,\n): Promise<T> {\n const tracer = await getTracer();\n if (!tracer) {\n return fn(createNoOpSpan());\n }\n\n const span = tracer.startSpan(name, { attributes });\n try {\n const result = await fn(span);\n span.setStatus({ code: 1 }); // OK\n return result;\n } catch (err) {\n span.setStatus({ code: 2, message: String(err) }); // ERROR\n if (err instanceof Error) {\n span.recordException(err);\n }\n throw err;\n } finally {\n span.end();\n }\n}\n\nfunction createNoOpSpan(): Span {\n return {\n setAttribute() {},\n setStatus() {},\n recordException() {},\n end() {},\n };\n}\n\n/** Reset the cached tracer (for testing). */\nexport function _resetTracer(): void {\n _tracer = null;\n}\n","/**\n * OpenTelemetry semantic attribute constants for ClawOps agent tracing.\n */\n\n// Call attributes\nexport const ATTR_CALL_ID = 'clawops.call.id';\nexport const ATTR_CALL_DIRECTION = 'clawops.call.direction';\nexport const ATTR_CALL_FROM = 'clawops.call.from';\nexport const ATTR_CALL_TO = 'clawops.call.to';\nexport const ATTR_CALL_STATUS = 'clawops.call.status';\nexport const ATTR_CALL_DURATION = 'clawops.call.duration';\n\n// Agent attributes\nexport const ATTR_AGENT_ID = 'clawops.agent.id';\nexport const ATTR_AGENT_SESSION_TYPE = 'clawops.agent.session_type';\n\n// Pipeline attributes\nexport const ATTR_STT_PROVIDER = 'clawops.stt.provider';\nexport const ATTR_STT_MODEL = 'clawops.stt.model';\nexport const ATTR_STT_LANGUAGE = 'clawops.stt.language';\nexport const ATTR_STT_TRANSCRIPT = 'clawops.stt.transcript';\n\nexport const ATTR_LLM_PROVIDER = 'clawops.llm.provider';\nexport const ATTR_LLM_MODEL = 'clawops.llm.model';\nexport const ATTR_LLM_PROMPT_TOKENS = 'clawops.llm.prompt_tokens';\nexport const ATTR_LLM_COMPLETION_TOKENS = 'clawops.llm.completion_tokens';\nexport const ATTR_LLM_TOTAL_TOKENS = 'clawops.llm.total_tokens';\n\nexport const ATTR_TTS_PROVIDER = 'clawops.tts.provider';\nexport const ATTR_TTS_VOICE = 'clawops.tts.voice';\nexport const ATTR_TTS_MODEL = 'clawops.tts.model';\n\n// Tool attributes\nexport const ATTR_TOOL_NAME = 'clawops.tool.name';\nexport const ATTR_TOOL_RESULT = 'clawops.tool.result';\nexport const ATTR_TOOL_ERROR = 'clawops.tool.error';\n\n// MCP attributes\nexport const ATTR_MCP_SERVER_NAME = 'clawops.mcp.server_name';\nexport const ATTR_MCP_SERVER_TYPE = 'clawops.mcp.server_type';\n\n// Audio attributes\nexport const ATTR_AUDIO_SAMPLE_RATE = 'clawops.audio.sample_rate';\nexport const ATTR_AUDIO_ENCODING = 'clawops.audio.encoding';\nexport const ATTR_AUDIO_DURATION = 'clawops.audio.duration';\n","/**\n * ClawOpsAgent - main agent class for handling voice calls.\n */\n\nimport { DEFAULT_BASE_URL } from '../constants.js';\nimport { AgentConnectionError, AgentError } from '../error.js';\nimport { ulawToPcm16 } from './audio.js';\nimport { ControlWebSocket } from './control-ws.js';\nimport type { ControlEvent } from './control-ws.js';\nimport { MCPClient } from './mcp/client.js';\nimport type { MCPServerStdio, MCPServerHTTP } from './mcp/index.js';\nimport { MediaWebSocket } from './media-ws.js';\nimport { AudioRecorder } from './recorder.js';\nimport { CallSession } from './session.js';\nimport { BuiltinTool, resolveBuiltinTools } from './builtin-tool.js';\nimport { ToolRegistry } from './tool.js';\nimport type { FunctionTool } from './tool.js';\nimport type { Session } from './pipeline/base.js';\nimport { getSdkInfo } from './telemetry.js';\nimport { setTracingConfig } from './tracing/config.js';\nimport type { TracingConfig } from './tracing/config.js';\nimport { withSpan } from './tracing/spans.js';\nimport { ATTR_CALL_ID, ATTR_CALL_DIRECTION, ATTR_AGENT_ID } from './tracing/attributes.js';\nimport type { Logger } from 'pino';\nimport { createAgentLogger, createPipelineLogger } from './logger.js';\n\nexport type AgentEventType = 'call_start' | 'call_end' | 'call_failed' | 'transcript' | 'dtmf';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AgentEventHandler = (...args: any[]) => void | Promise<void>;\n\nexport interface ClawOpsAgentOptions {\n /** ClawOps API key. Falls back to CLAWOPS_API_KEY env var. */\n apiKey?: string;\n /** Account ID. Falls back to CLAWOPS_ACCOUNT_ID env var. */\n accountId?: string;\n /** API base URL. */\n baseUrl?: string;\n /** Phone number to send/receive calls from. Required. */\n from: string;\n /** Session implementation (OpenAIRealtime, GeminiRealtime, PipelineSession, etc.). */\n session: Session;\n /** Enable call recording. */\n recording?: boolean;\n /** Recording output directory. Default: './recordings' */\n recordingPath?: string;\n /** MCP server configurations. */\n mcpServers?: Array<MCPServerStdio | MCPServerHTTP>;\n /** Tracing configuration. */\n tracing?: TracingConfig;\n /** 활성화할 내장 도구. Default: BuiltinTool.ALL */\n builtinTools?: BuiltinTool | BuiltinTool[];\n /** Debounce time (ms) for passive DTMF accumulation. Default: 500 */\n passiveDtmfDebounceMs?: number;\n /** Custom pino logger instance. If omitted, a default logger is created. */\n logger?: Logger;\n}\n\nexport class ClawOpsAgent {\n private _apiKey: string;\n private _accountId: string;\n private _baseUrl: string;\n private _fromNumber: string;\n private _session: Session;\n private _tools: ToolRegistry = new ToolRegistry();\n private _handlers: Map<string, AgentEventHandler[]> = new Map();\n private _controlWs: ControlWebSocket | null = null;\n private _mcpServers: Array<MCPServerStdio | MCPServerHTTP>;\n private _recording: boolean;\n private _recordingPath: string;\n private _activeSessions: Map<string, CallSession> = new Map();\n private _builtinTools!: Set<BuiltinTool>;\n private _passiveDtmfDebounceMs: number;\n private _passiveDtmfBuffer: string[] = [];\n private _passiveDtmfTimer: ReturnType<typeof setTimeout> | null = null;\n private _passiveDtmfCallId: string | null = null;\n private _callSessions = new Map<string, Session>();\n private _log: Logger;\n private _pipelineLog: Logger;\n private _isPipelineSession = false;\n\n constructor(options: ClawOpsAgentOptions) {\n this._apiKey = options.apiKey ?? process.env['CLAWOPS_API_KEY'] ?? '';\n this._accountId = options.accountId ?? process.env['CLAWOPS_ACCOUNT_ID'] ?? '';\n this._baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;\n this._fromNumber = options.from;\n this._session = options.session;\n this._recording = options.recording ?? false;\n this._recordingPath = options.recordingPath ?? './recordings';\n this._mcpServers = options.mcpServers ?? [];\n this._builtinTools = resolveBuiltinTools(options.builtinTools ?? BuiltinTool.ALL);\n this._passiveDtmfDebounceMs = options.passiveDtmfDebounceMs ?? 500;\n\n // Configure tracing\n if (options.tracing) {\n setTracingConfig(options.tracing);\n }\n\n this._log = createAgentLogger(options.logger);\n this._pipelineLog = createPipelineLogger(this._log);\n // Detect PipelineSession at construction time (duck-type check)\n this._isPipelineSession = '_stt' in this._session && '_llm' in this._session;\n }\n\n /**\n * Register a function tool.\n *\n * Supports two signatures (matching Python SDK):\n * agent.tool(name, description, parameters, handler)\n * agent.tool(functionToolObject)\n */\n tool(\n nameOrTool: string | FunctionTool,\n description?: string,\n parameters?: Record<string, unknown>,\n handler?: (args: Record<string, unknown>) => unknown | Promise<unknown>,\n ): this {\n if (typeof nameOrTool === 'string') {\n if (!description || !parameters || !handler) {\n throw new AgentError(\n 'tool(name, description, parameters, handler) requires all arguments.',\n );\n }\n this._tools.register({\n name: nameOrTool,\n description,\n parameters,\n required: Object.keys(parameters),\n handler,\n });\n } else {\n this._tools.register(nameOrTool);\n }\n return this;\n }\n\n /**\n * Register an event handler.\n *\n * Matches Python SDK decorator style:\n * agent.on(\"call_start\", (call) => { ... })\n * agent.on(\"transcript\", (call, role, text) => { ... })\n */\n on(event: AgentEventType, handler: AgentEventHandler): this {\n let list = this._handlers.get(event);\n if (!list) {\n list = [];\n this._handlers.set(event, list);\n }\n list.push(handler);\n return this;\n }\n\n /** Connect to the ClawOps platform and start listening for calls. */\n async connect(): Promise<void> {\n if (this._controlWs) return;\n\n if (!this._apiKey) {\n throw new AgentError('API key is required. Set CLAWOPS_API_KEY or pass apiKey option.');\n }\n if (!this._accountId) {\n throw new AgentError(\n 'Account ID is required. Set CLAWOPS_ACCOUNT_ID or pass accountId option.',\n );\n }\n\n // Connect control WebSocket\n this._controlWs = new ControlWebSocket({\n baseUrl: this._baseUrl,\n apiKey: this._apiKey,\n accountId: this._accountId,\n number: this._fromNumber,\n });\n\n this._controlWs.setLogger(this._log);\n\n this._controlWs.on('call.incoming', (event) => this._handleIncoming(event));\n this._controlWs.on('call.ended', (event) => this._handleEnded(event));\n this._controlWs.on('call.outbound_ready', (event) => this._handleOutboundReady(event));\n this._controlWs.on('call.ringing', (event) => this._handleRinging(event));\n this._controlWs.on('call.failed', (event) => this._handleFailed(event));\n\n try {\n await this._controlWs.connect();\n await this._controlWs.waitConnected();\n try {\n this._controlWs.send({ event: 'agent.hello', sdk: getSdkInfo() });\n } catch { /* best-effort */ }\n } catch (err) {\n throw new AgentConnectionError(\n `Failed to connect to ClawOps: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n this._log.info('ClawOpsAgent connected on %s', this._fromNumber);\n }\n\n /**\n * Connect and block until disconnected.\n * Convenience method for simple agent scripts.\n */\n async serve(): Promise<void> {\n await this.connect();\n\n // Block indefinitely until process signal\n return new Promise<void>((resolve) => {\n const shutdown = () => {\n this.disconnect()\n .then(resolve)\n .catch(() => resolve());\n };\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n });\n }\n\n /** Disconnect from the platform. */\n async disconnect(): Promise<void> {\n if (this._controlWs) {\n this._controlWs.close();\n this._controlWs = null;\n }\n\n for (const session of this._activeSessions.values()) {\n session._markEnded();\n }\n this._activeSessions.clear();\n this._callSessions.clear();\n this._log.info('ClawOpsAgent disconnected');\n }\n\n /**\n * Initiate an outbound call.\n * Matches Python SDK: agent.call(to, { timeout })\n */\n async call(to: string, options?: { timeout?: number }): Promise<CallSession> {\n await this.connect();\n\n const url = `${this._baseUrl}/v1/accounts/${this._accountId}/calls`;\n const body = { To: to, From: this._fromNumber, Timeout: options?.timeout ?? 60 };\n const resp = await fetch(url, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this._apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n });\n\n if (resp.status !== 201) {\n const error = (await resp.json()) as Record<string, unknown>;\n throw new AgentError(`발신 실패 (${resp.status}): ${(error['error'] as string) ?? ''}`);\n }\n\n const data = (await resp.json()) as Record<string, unknown>;\n\n const callSession = new CallSession({\n callId: data['callId'] as string,\n fromNumber: this._fromNumber,\n toNumber: to,\n accountId: this._accountId,\n direction: 'outbound',\n });\n\n // Register all agent-level event handlers on the session\n for (const [evt, handlers] of this._handlers) {\n for (const handler of handlers) {\n callSession.on(evt, handler);\n }\n }\n\n callSession.setLogger(this._log);\n this._activeSessions.set(callSession.callId, callSession);\n this._log.info('Outbound call initiated: %s -> %s (%s)', this._fromNumber, to, callSession.callId);\n return callSession;\n }\n\n private _handleIncoming(event: ControlEvent): void {\n const callId = event['callId'] as string;\n const fromNumber = (event['from'] as string) ?? '';\n const mediaUrl = (event['mediaUrl'] as string) ?? '';\n\n const session = new CallSession({\n callId,\n fromNumber,\n toNumber: this._fromNumber,\n accountId: this._accountId,\n direction: 'inbound',\n });\n\n // Register all agent-level event handlers on the session\n for (const [evt, handlers] of this._handlers) {\n for (const handler of handlers) {\n session.on(evt, handler);\n }\n }\n\n session.setLogger(this._log);\n this._activeSessions.set(callId, session);\n this._log.info('Incoming call: %s -> %s (%s)', fromNumber, this._fromNumber, callId);\n\n // Accept the call\n if (this._controlWs) {\n this._controlWs.send({ event: 'call.accept', callId });\n }\n\n if (mediaUrl) {\n this._startCallSession(session, mediaUrl).catch((err) => {\n this._log.error({ err }, 'Call session error: %s', callId);\n });\n }\n }\n\n private _handleEnded(event: ControlEvent): void {\n const callId = event['callId'] as string;\n const session = this._activeSessions.get(callId);\n if (session) {\n this._log.info('Call ended (server): %s', callId);\n session._markEnded();\n this._activeSessions.delete(callId);\n }\n }\n\n private _handleOutboundReady(event: ControlEvent): void {\n const callId = event['callId'] as string;\n const mediaUrl = (event['mediaUrl'] as string) ?? '';\n let session = this._activeSessions.get(callId);\n\n if (!session) {\n session = new CallSession({\n callId,\n fromNumber: this._fromNumber,\n toNumber: (event['to'] as string) ?? '',\n accountId: this._accountId,\n direction: 'outbound',\n });\n session.setLogger(this._log);\n\n // Register all agent-level event handlers on the session\n for (const [evt, handlers] of this._handlers) {\n for (const handler of handlers) {\n session.on(evt, handler);\n }\n }\n\n this._activeSessions.set(callId, session);\n }\n\n if (mediaUrl) {\n this._log.info('Outbound call answered: %s -> %s (%s)', this._fromNumber, session.toNumber, callId);\n this._startCallSession(session, mediaUrl).catch((err) => {\n this._log.error({ err }, 'Call session error: %s', callId);\n });\n }\n }\n\n private _handleRinging(event: ControlEvent): void {\n const callId = event['callId'] as string;\n const session = this._activeSessions.get(callId);\n if (session) {\n this._log.info('Outbound call ringing: %s', callId);\n }\n }\n\n private _handleFailed(event: ControlEvent): void {\n const callId = event['callId'] as string;\n const session = this._activeSessions.get(callId);\n if (session) {\n this._log.info('Outbound call failed: %s (%s)', callId, (event['reason'] as string) ?? 'failed');\n session._emit('call_failed', (event['reason'] as string) ?? 'failed');\n session._markEnded();\n this._activeSessions.delete(callId);\n }\n }\n\n private _onDtmfEvent(callSession: CallSession, digit: string): void {\n callSession._emit('dtmf', digit);\n\n // Always route to session buffer — collector may not be active yet (tool call timing)\n callSession._routeDtmf(digit);\n\n if ((callSession as any)._dtmfCollectorActive) {\n callSession.clearAudio();\n return;\n }\n\n this._passiveDtmfBuffer.push(digit);\n this._passiveDtmfCallId = callSession.callId;\n if (this._passiveDtmfTimer) {\n clearTimeout(this._passiveDtmfTimer);\n }\n this._passiveDtmfTimer = setTimeout(() => {\n const digits = this._passiveDtmfBuffer.join('');\n this._passiveDtmfBuffer = [];\n const sessionHandler = this._passiveDtmfCallId\n ? this._callSessions.get(this._passiveDtmfCallId)\n : null;\n this._passiveDtmfCallId = null;\n if (digits && sessionHandler && sessionHandler.feedDtmf) {\n sessionHandler.feedDtmf(digits).catch((err: unknown) => {\n this._log.error({ err }, 'DTMF feed error');\n });\n }\n }, this._passiveDtmfDebounceMs);\n }\n\n private async _startCallSession(session: CallSession, mediaWsUrl: string): Promise<void> {\n await withSpan(\n 'clawops.call_session',\n {\n [ATTR_CALL_ID]: session.callId,\n [ATTR_CALL_DIRECTION]: session.direction,\n [ATTR_AGENT_ID]: this._accountId,\n },\n async () => {\n // Fork tools for this session (per-call MCP isolation)\n const sessionTools = this._tools.fork();\n\n // MCP: start servers per call\n const mcpClients: MCPClient[] = [];\n if (this._mcpServers.length > 0) {\n for (const serverConfig of this._mcpServers) {\n const client = new MCPClient();\n client.setLogger(this._log);\n client.addServer('mcp', serverConfig);\n try {\n const tools = await client.connect();\n sessionTools.registerMcpTools(tools);\n mcpClients.push(client);\n } catch (err) {\n this._log.error({ err }, 'MCP connection error');\n }\n }\n }\n\n // Set up recorder if configured\n let recorder: AudioRecorder | null = null;\n if (this._recording) {\n recorder = new AudioRecorder(this._recordingPath, session.callId);\n recorder.setLogger(this._log);\n recorder.start();\n }\n\n // Connect media WebSocket\n const mediaWs = new MediaWebSocket();\n mediaWs.setLogger(this._log);\n\n // Bind transport functions to session — sessions send ulaw bytes directly\n session._bindTransport(\n (audio: Buffer) => {\n mediaWs.sendAudio(audio.toString('base64'));\n session.recordFirstResponse();\n },\n () => {\n mediaWs.sendClear();\n session.recordBargeIn();\n },\n async () => {\n await mediaWs.flush();\n const markName = `hangup-${Date.now()}`;\n mediaWs.sendMark(markName);\n await mediaWs.waitForMark(markName, 5000);\n mediaWs.close();\n },\n async (digit: string) => {\n mediaWs.sendDtmf(digit);\n },\n () => mediaWs.isConnected,\n );\n\n const sessionHandler = this._session;\n\n // Inject tools and recorder into session if supported\n if (\n 'setToolRegistry' in sessionHandler &&\n typeof sessionHandler.setToolRegistry === 'function'\n ) {\n sessionHandler.setToolRegistry(sessionTools);\n }\n if (\n recorder &&\n 'setRecorder' in sessionHandler &&\n typeof sessionHandler.setRecorder === 'function'\n ) {\n sessionHandler.setRecorder(recorder);\n }\n if ('setBuiltinTools' in sessionHandler && typeof sessionHandler.setBuiltinTools === 'function') {\n (sessionHandler as any).setBuiltinTools(this._builtinTools);\n }\n if ('setLogger' in sessionHandler && typeof sessionHandler.setLogger === 'function') {\n sessionHandler.setLogger(this._isPipelineSession ? this._pipelineLog : this._log);\n }\n\n // Save session handler for DTMF routing\n this._callSessions.set(session.callId, sessionHandler);\n\n // Handle inbound audio — feed raw ulaw to session (each session converts as needed)\n mediaWs.onAudio((ulawAudio: Buffer, _timestamp: number) => {\n if (sessionHandler) {\n sessionHandler.feedAudio(ulawAudio);\n }\n if (recorder) {\n recorder.writeInbound(ulawToPcm16(ulawAudio));\n }\n });\n\n // Handle inbound DTMF\n mediaWs.onDtmf((digit: string) => {\n this._onDtmfEvent(session, digit);\n });\n\n mediaWs.onClose(() => {\n this._log.info('Media stream stopped: %s', session.callId);\n if (recorder) {\n recorder.stop();\n }\n session._markEnded();\n });\n\n // Emit call_start\n session._emit('call_start');\n\n try {\n await mediaWs.connect(mediaWsUrl, this._apiKey);\n this._log.info('Media stream started: %s', session.callId);\n\n // Start the session handler\n await sessionHandler.start(session, sessionTools);\n\n // Send session telemetry\n const telemetry = sessionHandler.getTelemetry?.() ?? null;\n if (telemetry) {\n telemetry.toolCount = sessionTools?.size ?? 0;\n telemetry.mcpServerCount = this._mcpServers?.length ?? 0;\n telemetry.builtinTools = this._builtinTools ? [...this._builtinTools].map(t => t.toString()) : [];\n telemetry.recordingEnabled = this._recording;\n try {\n this._controlWs!.send({ event: 'call.telemetry', callId: session.callId, telemetry });\n } catch { /* best-effort */ }\n }\n\n // Wait for the call to end\n await session.wait();\n\n // Stop the session handler\n await sessionHandler.stop();\n } catch (err) {\n this._log.error({ err }, 'Call session error: %s', session.callId);\n session.recordEndReason('error');\n } finally {\n // Clean up MCP clients\n if (mcpClients.length > 0) {\n sessionTools.clearMcpTools();\n for (const c of mcpClients) {\n await c.disconnect();\n }\n }\n\n mediaWs.close();\n if (recorder) {\n recorder.stop();\n }\n\n // Determine end reason and send metrics\n if (!session.metrics.endReason) {\n session.recordEndReason(session.status === 'ended' ? 'user_hangup' : 'agent_hangup');\n }\n try {\n this._controlWs?.send({ event: 'call.metrics', callId: session.callId, metrics: session.metrics });\n } catch { /* best-effort */ }\n\n // Emit call_end\n session._emit('call_end');\n session._markEnded();\n this._activeSessions.delete(session.callId);\n this._callSessions.delete(session.callId);\n }\n },\n );\n }\n}\n","/**\n * Built-in tool 스키마 정의, 포맷 변환, 실행 헬퍼.\n *\n * 모든 세션(PipelineSession, OpenAIRealtime, GeminiRealtime)이 공통으로 사용하는\n * 내장 도구 스키마를 한 곳에서 관리한다.\n */\n\nimport { BuiltinTool } from '../builtin-tool.js';\nimport type { CallSession } from '../session.js';\n\n// ── 정규 스키마 (neutral 포맷) ──────────────────────────────────────\n\nconst HANG_UP = {\n name: 'hang_up',\n description:\n 'End the phone call. Use when the conversation is finished or the caller says goodbye.',\n parameters: { type: 'object' as const, properties: {} as Record<string, unknown> },\n} as const;\n\nconst COLLECT_DTMF = {\n name: 'collect_dtmf',\n description:\n '사용자로부터 DTMF(전화 키패드) 입력을 수집합니다. 반드시 사용자에게 무엇을 입력해야 하는지 안내한 후 호출하세요.',\n parameters: {\n type: 'object' as const,\n properties: {\n max_digits: { type: 'integer' as const, description: '수집할 최대 자릿수' },\n finish_on_key: { type: 'string' as const, description: '입력 종료 키 (기본: #)' },\n timeout: { type: 'integer' as const, description: '입력 대기 시간(초, 기본: 5)' },\n },\n required: ['max_digits'] as string[],\n },\n} as const;\n\nconst SEND_DTMF = {\n name: 'send_dtmf',\n description: 'DTMF 신호를 전송합니다. ARS 메뉴 탐색이나 내선번호 입력 시 사용합니다.',\n parameters: {\n type: 'object' as const,\n properties: {\n digits: {\n type: 'string' as const,\n description:\n \"전송할 번호 (0-9, *, #). 'w'는 500ms 대기, 'W'는 1000ms 대기. 예: '1', '1234#', '1w2'\",\n },\n },\n required: ['digits'] as string[],\n },\n} as const;\n\ntype NeutralSchema = typeof HANG_UP | typeof COLLECT_DTMF | typeof SEND_DTMF;\n\nconst TOOL_MAP = new Map<BuiltinTool, NeutralSchema>([\n [BuiltinTool.HANG_UP, HANG_UP],\n [BuiltinTool.COLLECT_DTMF, COLLECT_DTMF],\n [BuiltinTool.SEND_DTMF, SEND_DTMF],\n]);\n\nexport const BUILTIN_TOOL_NAMES: Set<string> = new Set(\n Array.from(TOOL_MAP.values()).map((s) => s.name),\n);\n\n// ── 포맷 변환 ───────────────────────────────────────────────────────\n\nfunction toChatCompletions(schema: NeutralSchema): Record<string, unknown> {\n return {\n type: 'function',\n function: {\n name: schema.name,\n description: schema.description,\n parameters: schema.parameters,\n },\n };\n}\n\nfunction toRealtime(schema: NeutralSchema): Record<string, unknown> {\n return {\n type: 'function',\n name: schema.name,\n description: schema.description,\n parameters: schema.parameters,\n };\n}\n\nfunction toGemini(schema: NeutralSchema): Record<string, unknown> {\n return {\n name: schema.name,\n description: schema.description,\n parameters: schema.parameters,\n };\n}\n\nconst CONVERTERS = {\n chat: toChatCompletions,\n realtime: toRealtime,\n gemini: toGemini,\n} as const;\n\n/**\n * 활성화된 builtin tool 스키마를 요청한 포맷으로 반환.\n */\nexport function getBuiltinToolSchemas(\n builtinTools: Set<BuiltinTool> | null,\n fmt: 'chat' | 'realtime' | 'gemini',\n): Array<Record<string, unknown>> {\n const converter = CONVERTERS[fmt];\n const result: Array<Record<string, unknown>> = [];\n for (const [toolEnum, schema] of TOOL_MAP) {\n if (builtinTools === null || builtinTools.has(toolEnum)) {\n result.push(converter(schema));\n }\n }\n return result;\n}\n\n// ── 공통 실행 헬퍼 ──────────────────────────────────────────────────\n\n/**\n * Builtin tool을 실행하고 결과 문자열을 반환한다.\n *\n * `funcName`이 builtin tool이 아니면 `null`을 반환한다.\n * `hang_up`의 경우 빈 문자열 `\"\"`을 반환한다 (호출자가 종료 처리).\n */\nexport function isBuiltinTool(name: string): boolean {\n return BUILTIN_TOOL_NAMES.has(name);\n}\n\nexport async function executeBuiltinTool(\n funcName: string,\n args: Record<string, unknown>,\n call: CallSession,\n): Promise<string | null> {\n if (funcName === 'hang_up') {\n await call.hangup();\n return '';\n }\n if (funcName === 'collect_dtmf') {\n try {\n const result = await call.collectDtmf({\n maxDigits: (args['max_digits'] as number) ?? 4,\n finishOnKey: (args['finish_on_key'] as string) ?? '#',\n timeout: (args['timeout'] as number) ?? 5,\n });\n return result || '(타임아웃 - 입력 없음)';\n } catch (e) {\n return `Error: ${e}`;\n }\n }\n if (funcName === 'send_dtmf') {\n try {\n await call.sendDtmfSequence((args['digits'] as string) ?? '');\n return 'sent';\n } catch (e) {\n return `Error: ${e}`;\n }\n }\n return null;\n}\n","/**\n * PipelineSession orchestrates STT -> LLM -> TTS for a voice call.\n */\n\nimport { pcm16ToUlaw, resamplePcm16, ulawToPcm16 } from '../audio.js';\nimport { BuiltinTool } from '../builtin-tool.js';\nimport type { AudioRecorder } from '../recorder.js';\nimport type { CallSession } from '../session.js';\nimport { ToolRegistry } from '../tool.js';\nimport type {\n ConversationMessage,\n LLM,\n LLMChunk,\n Session,\n STT,\n TTS,\n} from './base.js';\nimport type { SessionTelemetry } from '../telemetry.js';\nimport type { Logger } from 'pino';\nimport { NOOP_LOGGER } from '../logger.js';\nimport { BUILTIN_TOOL_NAMES, executeBuiltinTool, getBuiltinToolSchemas } from './builtin-tool-schemas.js';\n\nexport interface PipelineSessionOptions {\n stt: STT;\n llm: LLM;\n tts: TTS;\n /** System prompt for the LLM. */\n systemPrompt?: string;\n /** Send initial greeting. Default: true */\n greeting?: boolean;\n /** Language code. Default: 'ko' */\n language?: string;\n /** Tool registry for function calling. */\n toolRegistry?: ToolRegistry;\n /** Audio recorder for the session. */\n recorder?: AudioRecorder;\n /** LLM temperature. */\n temperature?: number;\n /** Max tokens for LLM generation. */\n maxTokens?: number;\n /** Sample rate for audio. Default: 8000 */\n sampleRate?: number;\n /** Whether to interrupt TTS when user starts speaking. Default: true */\n interruptOnSpeech?: boolean;\n}\n\nexport class PipelineSession implements Session {\n private _stt: STT;\n private _llm: LLM;\n private _tts: TTS;\n private _systemPrompt: string | undefined;\n private _greeting: boolean;\n private _language: string;\n private _temperature: number | undefined;\n private _maxTokens: number | undefined;\n private _sampleRate: number;\n private _interruptOnSpeech: boolean;\n\n private _callSession: CallSession | null = null;\n private _tools: ToolRegistry | null = null;\n private _recorder: AudioRecorder | null = null;\n private _conversation: ConversationMessage[] = [];\n private _audioBuffer: Buffer[] = [];\n private _running = false;\n private _speaking = false;\n private _builtinTools: Set<BuiltinTool> | null = null;\n private _log: Logger = NOOP_LOGGER;\n\n constructor(options: PipelineSessionOptions) {\n this._stt = options.stt;\n this._llm = options.llm;\n this._tts = options.tts;\n this._systemPrompt = options.systemPrompt;\n this._greeting = options.greeting ?? true;\n this._language = options.language ?? 'ko';\n this._temperature = options.temperature;\n this._maxTokens = options.maxTokens;\n this._sampleRate = options.sampleRate ?? 8000;\n this._interruptOnSpeech = options.interruptOnSpeech ?? true;\n if (options.toolRegistry) this._tools = options.toolRegistry;\n if (options.recorder) this._recorder = options.recorder;\n }\n\n setToolRegistry(registry: ToolRegistry): void {\n this._tools = registry;\n }\n\n setRecorder(recorder: AudioRecorder): void {\n this._recorder = recorder;\n }\n\n setBuiltinTools(tools: Set<BuiltinTool>): void {\n this._builtinTools = tools;\n }\n\n getTelemetry(): SessionTelemetry {\n const llm = this._llm as any;\n const stt = this._stt as any;\n const tts = this._tts as any;\n return {\n sessionType: 'pipeline',\n llm: llm.provider && llm.model ? { provider: llm.provider, model: llm.model } : null,\n stt: stt.provider && stt.model ? { provider: stt.provider, model: stt.model } : null,\n tts: tts.provider && tts.model ? { provider: tts.provider, model: tts.model } : null,\n voice: (tts as any).voiceId ?? null,\n language: this._language,\n greetingEnabled: this._greeting,\n recordingEnabled: !!this._recorder,\n toolCount: this._tools?.size ?? 0,\n mcpServerCount: 0,\n builtinTools: [],\n };\n }\n\n setLogger(logger: Logger): void {\n this._log = logger;\n if ('setLogger' in this._stt && typeof (this._stt as any).setLogger === 'function') {\n (this._stt as any).setLogger(logger);\n }\n if ('setLogger' in this._tts && typeof (this._tts as any).setLogger === 'function') {\n (this._tts as any).setLogger(logger);\n }\n }\n\n async start(callSession: CallSession, tools?: ToolRegistry): Promise<void> {\n this._callSession = callSession;\n this._tools = tools ?? null;\n this._running = true;\n this._log.info('PipelineSession started');\n this._conversation = [];\n\n if (this._systemPrompt) {\n this._conversation.push({\n role: 'system',\n content: this._systemPrompt,\n });\n }\n\n // Generate initial greeting if enabled\n if (this._greeting) {\n this._generateGreeting().catch((err) => {\n this._log.error({ err }, 'Greeting error');\n });\n }\n\n // Start the STT listening loop\n this._runSttLoop().catch((err) => {\n this._log.error({ err }, 'STT loop error');\n });\n }\n\n feedAudio(audio: Buffer): void {\n if (this._running) {\n this._audioBuffer.push(audio);\n }\n }\n\n async feedDtmf(digits: string): Promise<void> {\n this._conversation.push({\n role: 'user',\n content: `[DTMF 입력: ${digits}]`,\n });\n await this._respond();\n }\n\n async stop(): Promise<void> {\n this._running = false;\n this._log.info('PipelineSession stopped');\n this._audioBuffer = [];\n }\n\n private async _runSttLoop(): Promise<void> {\n const audioStream = this._createAudioStream();\n\n for await (const event of this._stt.transcribe(audioStream, {\n sampleRate: this._sampleRate,\n })) {\n if (!this._running) break;\n\n if (event.type === 'interim' && this._speaking && this._interruptOnSpeech) {\n // User started speaking while TTS is active - interrupt\n this._speaking = false;\n if (this._callSession) {\n this._callSession.clearAudio();\n }\n this._log.info('Barge-in: \"%s\"', event.transcript.substring(0, 30));\n }\n\n if (event.type === 'final' && event.transcript.trim()) {\n this._log.info('STT: %s', event.transcript);\n await this._handleUserSpeech(event.transcript);\n }\n }\n }\n\n private async *_createAudioStream(): AsyncGenerator<Buffer> {\n while (this._running) {\n if (this._audioBuffer.length > 0) {\n const ulaw = this._audioBuffer.shift()!;\n // G.711 ulaw 8kHz → PCM16 8kHz → PCM16 16kHz\n const pcm8k = ulawToPcm16(ulaw);\n const pcm16k = resamplePcm16(pcm8k, 8000, 16000);\n yield pcm16k;\n } else {\n // Wait a bit before checking again\n await new Promise((resolve) => setTimeout(resolve, 20));\n }\n }\n }\n\n private async _generateGreeting(): Promise<void> {\n await new Promise((resolve) => setTimeout(resolve, 500));\n await this._respond();\n }\n\n private async _handleUserSpeech(transcript: string): Promise<void> {\n this._conversation.push({ role: 'user', content: transcript });\n await this._respond();\n }\n\n private _buildEffectiveTools(): ToolRegistry | undefined {\n const builtinSchemas = getBuiltinToolSchemas(this._builtinTools, 'chat');\n // Filter to only DTMF tools (hang_up is handled at session level, not LLM tool)\n const dtmfSchemas = builtinSchemas.filter((s) => {\n const name = (s['function'] as Record<string, unknown>)?.['name'] as string;\n return name === 'collect_dtmf' || name === 'send_dtmf';\n });\n\n if (dtmfSchemas.length === 0) return this._tools ?? undefined;\n\n // Inject DTMF tool stubs into a forked registry so the LLM sees them\n const base = this._tools ? this._tools.fork() : new ToolRegistry();\n for (const schema of dtmfSchemas) {\n const fn = schema['function'] as Record<string, unknown>;\n const params = fn['parameters'] as Record<string, unknown>;\n base.register({\n name: fn['name'] as string,\n description: fn['description'] as string,\n parameters: (params['properties'] ?? {}) as Record<string, unknown>,\n required: (params['required'] ?? []) as string[],\n handler: async () => '',\n });\n }\n return base;\n }\n\n private async _respond(): Promise<void> {\n // Run LLM generation (may include tool calls)\n let fullResponse = '';\n const textChunks: string[] = [];\n\n const effectiveTools = this._buildEffectiveTools();\n const llmStream = this._llm.generate(this._conversation, {\n tools: effectiveTools,\n temperature: this._temperature,\n maxTokens: this._maxTokens,\n });\n\n for await (const chunk of llmStream) {\n if (!this._running) break;\n\n if (chunk.type === 'text' && chunk.text) {\n textChunks.push(chunk.text);\n fullResponse += chunk.text;\n } else if (chunk.type === 'tool_call' && chunk.toolCall) {\n await this._handleToolCall(chunk);\n }\n }\n\n if (fullResponse.trim()) {\n this._log.info('Assistant: %s', fullResponse.substring(0, 100));\n this._conversation.push({ role: 'assistant', content: fullResponse });\n // Synthesize and send audio\n await this._synthesizeAndSend(fullResponse);\n }\n }\n\n private async _handleToolCall(chunk: LLMChunk): Promise<void> {\n if (!chunk.toolCall) return;\n\n const { id, name, arguments: argsStr } = chunk.toolCall;\n\n try {\n const args = JSON.parse(argsStr) as Record<string, unknown>;\n\n // Built-in tools - intercept before registry lookup\n if (BUILTIN_TOOL_NAMES.has(name) && this._callSession) {\n const result = await executeBuiltinTool(name, args, this._callSession);\n if (result !== null) {\n if (name === 'hang_up') return;\n this._conversation.push({ role: 'tool', content: result, tool_call_id: id, name });\n await this._respond();\n return;\n }\n }\n\n if (!this._tools) return;\n this._callSession?.recordToolCall();\n const result = await this._tools.call(name, args);\n\n this._conversation.push({\n role: 'assistant',\n content: '',\n // Tool call info stored in the message flow\n });\n this._conversation.push({\n role: 'tool',\n content: typeof result === 'string' ? result : JSON.stringify(result),\n tool_call_id: id,\n name,\n });\n\n // Re-generate after tool result\n const effectiveTools = this._buildEffectiveTools();\n let followUpText = '';\n const followUpStream = this._llm.generate(this._conversation, {\n tools: effectiveTools,\n temperature: this._temperature,\n maxTokens: this._maxTokens,\n });\n\n for await (const followChunk of followUpStream) {\n if (!this._running) break;\n if (followChunk.type === 'text' && followChunk.text) {\n followUpText += followChunk.text;\n }\n }\n\n if (followUpText.trim()) {\n this._conversation.push({ role: 'assistant', content: followUpText });\n await this._synthesizeAndSend(followUpText);\n }\n } catch (err) {\n this._log.error({ err }, 'Tool call failed: %s', name);\n if (err instanceof Error) {\n this._callSession?.recordToolError(err);\n }\n }\n }\n\n private async _synthesizeAndSend(text: string): Promise<void> {\n if (!this._callSession || !this._running) return;\n\n this._speaking = true;\n\n try {\n for await (const audioChunk of this._tts.synthesize(text, {\n sampleRate: this._sampleRate,\n })) {\n if (!this._running || !this._speaking) break;\n if (this._recorder) {\n const pcm8k = this._sampleRate !== 8000\n ? resamplePcm16(audioChunk, this._sampleRate, 8000)\n : audioChunk\n this._recorder.writeOutbound(pcm8k)\n }\n // Resample TTS output → 8kHz → ulaw, send in 160B frames\n const pcm8k = resamplePcm16(audioChunk, this._sampleRate, 8000);\n const ulaw = pcm16ToUlaw(pcm8k);\n for (let off = 0; off < ulaw.length; off += 160) {\n let chunk = ulaw.subarray(off, off + 160);\n if (chunk.length < 160) {\n chunk = Buffer.concat([chunk, Buffer.alloc(160 - chunk.length, 0xff)]);\n }\n this._callSession.sendAudio(chunk);\n }\n }\n } catch (err) {\n this._log.error({ err }, 'TTS error');\n } finally {\n this._speaking = false;\n }\n }\n}\n","/**\n * OpenAI Realtime API session (speech-to-speech).\n *\n * Matches Python SDK's OpenAIRealtime implementation.\n */\n\nimport type { CallSession } from '../../session.js';\nimport type { ToolRegistry } from '../../tool.js';\nimport type { AudioRecorder } from '../../recorder.js';\nimport type { Session } from '../base.js';\nimport type { SessionTelemetry } from '../../telemetry.js';\nimport { ulawToPcm16 } from '../../audio.js';\nimport { BuiltinTool } from '../../builtin-tool.js';\nimport type { Logger } from 'pino';\nimport { NOOP_LOGGER } from '../../logger.js';\nimport {\n BUILTIN_TOOL_NAMES,\n executeBuiltinTool,\n getBuiltinToolSchemas,\n} from '../builtin-tool-schemas.js';\n\nconst OPENAI_REALTIME_URL = 'wss://api.openai.com/v1/realtime?model=';\n\n/**\n * 현재 재생 중인 응답의 상태. 하나의 assistant 응답에 대한 모든 정보를 담는다.\n */\ninterface PlaybackState {\n itemId: string; // OpenAI conversation item ID\n startTs: number; // 첫 delta 수신 시점의 timestamp (Date.now)\n sentChunks: number; // 플랫폼으로 전송된 오디오 청크 수 (각 20ms)\n generating: boolean; // OpenAI가 아직 오디오를 생성 중인지\n audioRemainder: Buffer; // 160B 미만 잔여 오디오 버퍼\n}\n\nexport interface OpenAIRealtimeOptions {\n /** OpenAI API key. Falls back to OPENAI_API_KEY env var. */\n apiKey?: string;\n /** System prompt / instructions for the AI. */\n systemPrompt?: string;\n /** Model to use. Default: 'gpt-realtime-1.5' */\n model?: string;\n /** Voice ID. Default: 'marin' */\n voice?: string;\n /** Language code (BCP 47). Default: 'ko' */\n language?: string;\n /**\n * Turn detection configuration. Default: semantic_vad with eagerness 'medium'.\n * - `{ type: 'semantic_vad', eagerness?: 'low'|'medium'|'high'|'auto', interrupt_response?: boolean }`\n * - `{ type: 'server_vad', threshold?: number, silence_duration_ms?: number, prefix_padding_ms?: number }`\n * - `null` to disable turn detection\n */\n turnDetection?: Record<string, unknown> | null;\n /** Send initial greeting. Default: true */\n greeting?: boolean;\n}\n\nexport class OpenAIRealtime implements Session {\n private _apiKey: string;\n private _systemPrompt: string;\n private _model: string;\n private _voice: string;\n private _language: string;\n private _turnDetection!: Record<string, unknown> | null;\n private _greeting: boolean;\n\n private _log: Logger = NOOP_LOGGER;\n private _builtinTools: Set<BuiltinTool> | null = null;\n\n setLogger(logger: Logger): void {\n this._log = logger;\n }\n\n setBuiltinTools(tools: Set<BuiltinTool>): void {\n this._builtinTools = tools;\n }\n\n getTelemetry(): SessionTelemetry {\n return {\n sessionType: 'openai_realtime',\n llm: { provider: 'openai', model: this._model },\n stt: null,\n tts: null,\n voice: this._voice,\n language: this._language,\n greetingEnabled: this._greeting,\n recordingEnabled: !!this._recorder,\n toolCount: this._tools?.size ?? 0,\n mcpServerCount: 0,\n builtinTools: [],\n };\n }\n\n private _ws: import('ws').WebSocket | null = null;\n private _call: CallSession | null = null;\n private _tools: ToolRegistry | null = null;\n private _recorder: AudioRecorder | null = null;\n private _closed = false;\n\n // PlaybackState — 현재 재생 중인 응답 상태\n private _playback: PlaybackState | null = null;\n private _latestMediaTs = 0;\n\n // Pending tool call tracking — 인터럽트 시 취소용\n private _pendingToolCalls = new Map<string, AbortController>();\n\n // Response state tracking — prevent sending response.create while one is active\n private _responseInProgress = false;\n private _onResponseDone: (() => void) | null = null;\n\n constructor(options: OpenAIRealtimeOptions = {}) {\n this._apiKey = options.apiKey ?? process.env['OPENAI_API_KEY'] ?? '';\n this._systemPrompt = options.systemPrompt ?? '';\n this._model = options.model ?? 'gpt-realtime-1.5';\n this._voice = options.voice ?? 'marin';\n this._language = options.language ?? 'ko';\n this._turnDetection =\n options.turnDetection !== undefined\n ? options.turnDetection\n : { type: 'semantic_vad', eagerness: 'medium', interrupt_response: true };\n this._greeting = options.greeting ?? true;\n }\n\n /** Inject per-call ToolRegistry. */\n setToolRegistry(registry: ToolRegistry): void {\n this._tools = registry;\n }\n\n /** Inject per-call AudioRecorder. */\n setRecorder(recorder: AudioRecorder): void {\n this._recorder = recorder;\n }\n\n async start(callSession: CallSession, tools?: ToolRegistry): Promise<void> {\n this._call = callSession;\n if (tools) this._tools = tools;\n this._closed = false;\n this._playback = null;\n this._latestMediaTs = 0;\n\n if (!this._apiKey) {\n throw new Error('OpenAI API key is required. Set OPENAI_API_KEY or pass apiKey option.');\n }\n\n const { WebSocket } = await import('ws');\n const url = `${OPENAI_REALTIME_URL}${this._model}`;\n\n this._ws = new WebSocket(url, {\n headers: {\n Authorization: `Bearer ${this._apiKey}`,\n 'OpenAI-Beta': 'realtime=v1',\n },\n });\n\n return new Promise<void>((resolve, reject) => {\n const ws = this._ws!;\n\n ws.on('open', () => {\n this._sendSessionUpdate();\n this._log.info('OpenAI Realtime connected');\n\n // Send initial greeting if enabled (matching Python SDK)\n if (this._greeting) {\n this._send({ type: 'response.create' });\n }\n\n resolve();\n });\n\n ws.on('message', (data: Buffer | string) => {\n try {\n const msg = JSON.parse(data.toString()) as Record<string, unknown>;\n this._handleMessage(msg);\n } catch {\n // Ignore parse errors\n }\n });\n\n ws.on('close', () => {\n this._closed = true;\n });\n\n ws.on('error', (err: Error) => {\n if (!this._ws) {\n reject(err);\n }\n this._log.error({ err }, 'OpenAI Realtime WS error');\n });\n });\n }\n\n async feedDtmf(digits: string): Promise<void> {\n await this._waitForResponseDone();\n this._send({\n type: 'conversation.item.create',\n item: {\n type: 'message',\n role: 'user',\n content: [{ type: 'input_text', text: `[DTMF 입력: ${digits}]` }],\n },\n });\n this._send({ type: 'response.create' });\n }\n\n feedAudio(audio: Buffer): void {\n this._latestMediaTs = Date.now();\n if (this._ws && this._ws.readyState === 1 && !this._closed) {\n // Agent path: audio comes as ulaw directly from platform, no conversion needed\n this._send({\n type: 'input_audio_buffer.append',\n audio: audio.toString('base64'),\n });\n }\n }\n\n async stop(): Promise<void> {\n this._closed = true;\n // Pending tool call 정리\n for (const [, controller] of this._pendingToolCalls) {\n controller.abort();\n }\n this._pendingToolCalls.clear();\n if (this._ws) {\n this._ws.close();\n this._ws = null;\n }\n }\n\n private _sendSessionUpdate(): void {\n if (!this._ws || this._ws.readyState !== 1) return;\n\n // Build tool schemas: user tools + builtin tools\n // OpenAI Realtime API uses flat tool format: { type, name, description, parameters }\n const toolSchemas: Array<Record<string, unknown>> = this._tools\n ? this._tools.toOpenAITools().map((t) => ({ type: 'function' as const, ...t.function }))\n : [];\n toolSchemas.push(...getBuiltinToolSchemas(this._builtinTools, 'realtime'));\n\n this._send({\n type: 'session.update',\n session: {\n modalities: ['text', 'audio'],\n voice: this._voice,\n instructions: this._systemPrompt,\n input_audio_format: 'g711_ulaw',\n output_audio_format: 'g711_ulaw',\n input_audio_transcription: {\n model: 'whisper-1',\n language: this._language,\n },\n input_audio_noise_reduction: { type: 'far_field' },\n turn_detection: this._turnDetection,\n tools: toolSchemas,\n },\n });\n }\n\n private _handleMessage(msg: Record<string, unknown>): void {\n const type = msg['type'] as string;\n\n switch (type) {\n case 'response.audio.delta': {\n this._handleAudioDelta(msg);\n break;\n }\n case 'response.audio.done': {\n if (this._playback) {\n this._playback.generating = false;\n if (this._playback.audioRemainder.length > 0) {\n const padded = Buffer.concat([\n this._playback.audioRemainder,\n Buffer.alloc(160 - this._playback.audioRemainder.length, 0xff),\n ]);\n if (this._call) {\n this._call.sendAudio(padded);\n }\n this._playback.sentChunks++;\n this._playback.audioRemainder = Buffer.alloc(0);\n }\n }\n break;\n }\n case 'input_audio_buffer.speech_started': {\n this._handleTruncation();\n break;\n }\n case 'response.output_item.done': {\n // Handle tool calls — fire-and-forget (matching Python SDK)\n const item = msg['item'] as Record<string, unknown> | undefined;\n if (item && item['type'] === 'function_call') {\n this._handleToolCall(item);\n // _playback은 여기서 리셋하지 않는다.\n // 큐에 재생 대기 중인 오디오가 있을 수 있고,\n // 인터럽트 시 truncate하려면 item_id가 필요하다.\n }\n break;\n }\n case 'conversation.item.input_audio_transcription.completed': {\n // User transcript\n if (this._call) {\n this._call._emit('transcript', 'user', (msg['transcript'] as string) ?? '');\n }\n break;\n }\n case 'response.audio_transcript.done': {\n // Assistant transcript\n if (this._call) {\n this._call._emit('transcript', 'assistant', (msg['transcript'] as string) ?? '');\n }\n break;\n }\n case 'response.created': {\n this._responseInProgress = true;\n break;\n }\n case 'response.done': {\n this._responseInProgress = false;\n if (this._onResponseDone) {\n const cb = this._onResponseDone;\n this._onResponseDone = null;\n cb();\n }\n break;\n }\n case 'error': {\n this._log.error({ apiError: msg['error'] }, 'OpenAI error');\n break;\n }\n }\n }\n\n private _handleAudioDelta(msg: Record<string, unknown>): void {\n if (this._playback === null) {\n this._playback = {\n itemId: (msg['item_id'] as string) || '',\n startTs: this._latestMediaTs || Date.now(),\n sentChunks: 0,\n generating: true,\n audioRemainder: Buffer.alloc(0),\n };\n } else if (msg['item_id']) {\n this._playback.itemId = msg['item_id'] as string;\n }\n\n const pb = this._playback;\n const ulaw = Buffer.from(msg['delta'] as string, 'base64');\n\n if (this._recorder) {\n this._recorder.writeOutbound(ulawToPcm16(ulaw));\n }\n\n // Align to 160B (20ms at 8kHz ulaw) frames, matching Python SDK\n const combined = Buffer.concat([pb.audioRemainder, ulaw]);\n const chunkSize = 160;\n const fullEnd = Math.floor(combined.length / chunkSize) * chunkSize;\n\n for (let off = 0; off < fullEnd; off += chunkSize) {\n if (this._call) {\n this._call.sendAudio(combined.subarray(off, off + chunkSize));\n }\n pb.sentChunks++;\n }\n\n pb.audioRemainder = combined.subarray(fullEnd);\n }\n\n private _handleTruncation(): void {\n // 진행 중인 tool call 취소\n for (const [, controller] of this._pendingToolCalls) {\n controller.abort();\n }\n this._pendingToolCalls.clear();\n\n // 큐에 남아있는 오디오를 항상 비운다\n if (this._call) {\n this._call.clearAudio();\n }\n\n const pb = this._playback;\n if (pb === null) {\n return;\n }\n\n // interrupt_response=true이므로 서버가 자동으로 응답을 취소한다.\n // response.cancel을 중복 호출하면 서버 상태가 꼬일 수 있으므로 생략.\n // conversation.item.truncate는 오디오와 transcript를 모두 잘라내어\n // 대화 맥락을 손실시키므로 호출하지 않는다.\n const playedMs = Math.max(0, (this._latestMediaTs || Date.now()) - pb.startTs);\n\n this._log.info(\n '[Interrupt] item=%s played=%dms total=%dms',\n pb.itemId,\n playedMs,\n pb.sentChunks * 20,\n );\n\n this._playback = null;\n }\n\n private async _handleToolCall(item: Record<string, unknown>): Promise<void> {\n const funcName = item['name'] as string;\n const callId = item['call_id'] as string;\n this._log.info('Tool call: %s', funcName);\n\n const controller = new AbortController();\n this._pendingToolCalls.set(callId, controller);\n\n try {\n // Built-in tools\n if (BUILTIN_TOOL_NAMES.has(funcName) && this._call) {\n const args = JSON.parse((item['arguments'] as string) ?? '{}') as Record<string, unknown>;\n const result = await executeBuiltinTool(funcName, args, this._call);\n if (result !== null) {\n if (funcName === 'hang_up') return;\n if (controller.signal.aborted) return;\n await this._waitForResponseDone();\n this._send({\n type: 'conversation.item.create',\n item: {\n type: 'function_call_output',\n call_id: callId,\n output: result,\n },\n });\n this._send({ type: 'response.create' });\n return;\n }\n }\n\n if (!this._tools || !this._tools.has(funcName)) {\n this._log.error('Unknown tool: %s', funcName);\n await this._waitForResponseDone();\n this._send({\n type: 'conversation.item.create',\n item: {\n type: 'function_call_output',\n call_id: callId,\n output: JSON.stringify({ error: `Unknown tool: ${funcName}` }),\n },\n });\n this._send({ type: 'response.create' });\n return;\n }\n\n let result: unknown;\n try {\n const args = JSON.parse((item['arguments'] as string) ?? '{}') as Record<string, unknown>;\n this._call?.recordToolCall();\n result = await this._tools.call(funcName, args);\n } catch (err) {\n this._log.error({ err }, 'Tool call failed: %s', funcName);\n if (err instanceof Error) {\n this._call?.recordToolError(err);\n }\n result = `Error: ${err}`;\n }\n\n if (controller.signal.aborted) {\n this._log.info('Tool call cancelled (user interrupted): %s', funcName);\n return;\n }\n\n const resultStr = typeof result === 'string' ? result : JSON.stringify(result);\n await this._waitForResponseDone();\n this._send({\n type: 'conversation.item.create',\n item: {\n type: 'function_call_output',\n call_id: callId,\n output: resultStr,\n },\n });\n this._log.info('[ToolResult] %s call_id=%s len=%d', funcName, callId, resultStr.length);\n this._send({ type: 'response.create' });\n } finally {\n this._pendingToolCalls.delete(callId);\n }\n }\n\n private _waitForResponseDone(): Promise<void> {\n if (!this._responseInProgress) return Promise.resolve();\n return new Promise<void>((resolve) => {\n this._onResponseDone = resolve;\n });\n }\n\n private _send(data: Record<string, unknown>): void {\n if (this._ws && this._ws.readyState === 1 && !this._closed) {\n this._ws.send(JSON.stringify(data));\n }\n }\n}\n","/**\n * Google Gemini Realtime API session (speech-to-speech).\n *\n * Uses @google/genai SDK's live.connect() method.\n * Matches Python SDK's GeminiRealtime implementation (v0.14.0).\n */\n\nimport type { CallSession } from '../../session.js';\nimport type { ToolRegistry } from '../../tool.js';\nimport type { AudioRecorder } from '../../recorder.js';\nimport type { Session } from '../base.js';\nimport type { SessionTelemetry } from '../../telemetry.js';\nimport type { LiveServerMessage, LiveServerToolCall } from '@google/genai/node';\nimport { pcm16ToUlaw, resamplePcm16, ulawToPcm16 } from '../../audio.js';\nimport { BuiltinTool } from '../../builtin-tool.js';\nimport type { Logger } from 'pino';\nimport { NOOP_LOGGER } from '../../logger.js';\nimport { BUILTIN_TOOL_NAMES, executeBuiltinTool, getBuiltinToolSchemas } from '../builtin-tool-schemas.js';\n\n/**\n * $ref 문자열을 $defs에서 찾아 반환한다.\n */\nfunction resolveRef(ref: string, defs: Record<string, unknown>): Record<string, unknown> {\n const parts = ref.replace(/^#\\//, '').split('/');\n let result: unknown = defs;\n for (const part of parts) {\n if (result && typeof result === 'object' && !Array.isArray(result)) {\n result = (result as Record<string, unknown>)[part];\n } else {\n return {};\n }\n }\n return typeof result === 'object' && result !== null && !Array.isArray(result)\n ? (result as Record<string, unknown>)\n : {};\n}\n\n/**\n * JSON Schema를 Gemini functionDeclarations 호환 형식으로 변환한다.\n *\n * - $ref를 인라인으로 resolve\n * - oneOf/anyOf/allOf를 단순화 (첫 번째 object 타입 또는 첫 번째 항목 사용)\n * - 지원되지 않는 키워드 제거\n * - 재귀 깊이 제한으로 순환 참조 방지\n */\nfunction sanitizeSchemaForGemini(\n schema: Record<string, unknown>,\n defs?: Record<string, unknown>,\n depth = 0,\n): Record<string, unknown> {\n if (depth > 15) return { type: 'object', properties: {} };\n if (!schema || typeof schema !== 'object') return { type: 'object', properties: {} };\n\n // 최상위에서 $defs 추출\n if (defs === undefined) {\n defs = (schema['$defs'] ?? schema['definitions'] ?? {}) as Record<string, unknown>;\n }\n\n // $ref resolve\n if (typeof schema['$ref'] === 'string') {\n const resolved = resolveRef(schema['$ref'], { $defs: defs, definitions: defs });\n if (resolved && Object.keys(resolved).length > 0) {\n return sanitizeSchemaForGemini(resolved, defs, depth + 1);\n }\n return { type: 'object', properties: {} };\n }\n\n // oneOf / anyOf / allOf 처리\n for (const comboKey of ['oneOf', 'anyOf', 'allOf'] as const) {\n const variants = schema[comboKey];\n if (Array.isArray(variants) && variants.length > 0) {\n // object 타입 우선 선택\n for (const v of variants) {\n if (v && typeof v === 'object') {\n const resolved = sanitizeSchemaForGemini(v as Record<string, unknown>, defs, depth + 1);\n if (resolved['type'] === 'object' && resolved['properties']) {\n return resolved;\n }\n }\n }\n // 없으면 첫 번째 항목\n const first = variants[0];\n if (first && typeof first === 'object') {\n return sanitizeSchemaForGemini(first as Record<string, unknown>, defs, depth + 1);\n }\n }\n }\n\n const result: Record<string, unknown> = {};\n\n // type 처리 - 배열 type에서 null 제거\n let schemaType = schema['type'];\n if (Array.isArray(schemaType)) {\n const nonNull = schemaType.filter((t) => t !== 'null');\n schemaType = nonNull[0] ?? 'string';\n }\n if (schemaType) result['type'] = schemaType;\n\n // description 유지\n if (schema['description']) result['description'] = schema['description'];\n\n // enum 유지\n if (schema['enum']) result['enum'] = schema['enum'];\n\n // required 유지\n if (schema['required']) result['required'] = schema['required'];\n\n // properties 재귀 처리\n if (schema['properties'] && typeof schema['properties'] === 'object') {\n const props: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(schema['properties'] as Record<string, unknown>)) {\n if (val && typeof val === 'object') {\n props[key] = sanitizeSchemaForGemini(val as Record<string, unknown>, defs, depth + 1);\n }\n }\n result['properties'] = props;\n }\n\n // items 재귀 처리 (array)\n if (schema['items'] && typeof schema['items'] === 'object' && !Array.isArray(schema['items'])) {\n result['items'] = sanitizeSchemaForGemini(\n schema['items'] as Record<string, unknown>,\n defs,\n depth + 1,\n );\n }\n\n // type이 없고 properties가 있으면 object로 추정\n if (!result['type'] && result['properties']) result['type'] = 'object';\n\n // type이 object인데 properties가 없으면 빈 properties 추가\n if (result['type'] === 'object' && !result['properties']) result['properties'] = {};\n\n return result;\n}\n\nexport interface GeminiRealtimeOptions {\n /** Google API key. Falls back to GOOGLE_API_KEY env var. */\n apiKey?: string;\n /** System prompt / instructions for the AI. */\n systemPrompt?: string;\n /** Model to use. Default: 'gemini-2.5-flash-native-audio-preview-12-2025' */\n model?: string;\n /** Voice name. Default: 'Kore' */\n voice?: string;\n /** Language code. Default: 'ko' */\n language?: string;\n /** Send initial greeting. Default: true */\n greeting?: boolean;\n}\n\nexport class GeminiRealtime implements Session {\n private _apiKey: string;\n private _systemPrompt: string;\n private _model: string;\n private _voice: string;\n private _language: string;\n private _greeting: boolean;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _session: any = null;\n private _call: CallSession | null = null;\n private _tools: ToolRegistry | null = null;\n private _recorder: AudioRecorder | null = null;\n private _closed = false;\n private _sentAudioChunks = 0;\n private _audioRemainder: Buffer = Buffer.alloc(0);\n private _builtinTools: Set<BuiltinTool> | null = null;\n private _toolCallInProgress = false;\n private _log: Logger = NOOP_LOGGER;\n\n constructor(options: GeminiRealtimeOptions = {}) {\n this._apiKey = options.apiKey ?? process.env['GOOGLE_API_KEY'] ?? '';\n this._systemPrompt = options.systemPrompt ?? '';\n this._model = options.model ?? 'gemini-2.5-flash-native-audio-preview-12-2025';\n this._voice = options.voice ?? 'Kore';\n this._language = options.language ?? 'ko';\n this._greeting = options.greeting ?? true;\n }\n\n /** Inject per-call ToolRegistry. */\n setToolRegistry(registry: ToolRegistry): void {\n this._tools = registry;\n }\n\n /** Inject per-call AudioRecorder. */\n setRecorder(recorder: AudioRecorder): void {\n this._recorder = recorder;\n }\n\n setBuiltinTools(tools: Set<BuiltinTool>): void {\n this._builtinTools = tools;\n }\n\n setLogger(logger: Logger): void {\n this._log = logger;\n }\n\n getTelemetry(): SessionTelemetry {\n return {\n sessionType: 'gemini_realtime',\n llm: { provider: 'gemini', model: this._model },\n stt: null,\n tts: null,\n voice: this._voice,\n language: this._language,\n greetingEnabled: this._greeting,\n recordingEnabled: !!this._recorder,\n toolCount: this._tools?.size ?? 0,\n mcpServerCount: 0,\n builtinTools: [],\n };\n }\n\n async start(callSession: CallSession, tools?: ToolRegistry): Promise<void> {\n this._call = callSession;\n if (tools) this._tools = tools;\n this._closed = false;\n this._sentAudioChunks = 0;\n this._audioRemainder = Buffer.alloc(0);\n\n if (!this._apiKey) {\n throw new Error('Google API key is required. Set GOOGLE_API_KEY or pass apiKey option.');\n }\n\n // @google/genai의 conditional exports 타입이 bundler 모드에서\n // live 프로퍼티를 인식하지 못하므로 node 엔트리 직접 import\n const { GoogleGenAI } = await import('@google/genai/node');\n const client = new GoogleGenAI({ apiKey: this._apiKey });\n\n // Build config\n const config: Record<string, unknown> = {\n responseModalities: ['AUDIO'],\n speechConfig: {\n voiceConfig: {\n prebuiltVoiceConfig: {\n voiceName: this._voice,\n },\n },\n },\n inputAudioTranscription: {},\n outputAudioTranscription: {},\n };\n\n if (this._systemPrompt) {\n config['systemInstruction'] = this._systemPrompt;\n }\n\n // Tools\n const toolSchemas = this._buildToolSchemas();\n if (toolSchemas.length > 0) {\n config['tools'] = [{ functionDeclarations: toolSchemas }];\n }\n\n this._session = await client.live.connect({\n model: this._model,\n config,\n callbacks: {\n onmessage: (msg) => this._handleMessage(msg),\n onerror: (err) => {\n this._log.error({ err }, 'Gemini SDK error');\n },\n onclose: (ev) => {\n this._log.info({ code: (ev as { code?: number })?.code ?? 'unknown' }, 'Gemini connection closed');\n this._closed = true;\n },\n },\n });\n\n // Send greeting\n if (this._greeting) {\n this._session.sendClientContent({\n turns: [\n {\n role: 'user',\n parts: [{ text: '인사해 주세요.' }],\n },\n ],\n turnComplete: true,\n });\n }\n }\n\n feedAudio(audio: Buffer): void {\n if (this._session && !this._closed && !this._toolCallInProgress) {\n // G.711 ulaw 8kHz → PCM16 8kHz → PCM16 16kHz\n const pcm8k = ulawToPcm16(audio);\n if (this._recorder) {\n this._recorder.writeInbound(pcm8k);\n }\n const pcm16k = resamplePcm16(pcm8k, 8000, 16000);\n\n // SDK Blob.data expects base64 string, not Buffer\n this._session.sendRealtimeInput({\n audio: {\n data: Buffer.from(pcm16k).toString('base64'),\n mimeType: 'audio/pcm;rate=16000',\n },\n });\n }\n }\n\n async feedDtmf(digits: string): Promise<void> {\n if (this._session) {\n this._session.sendClientContent({\n turns: [{ role: 'user', parts: [{ text: `[DTMF 입력: ${digits}]` }] }],\n turnComplete: true,\n });\n }\n }\n\n async stop(): Promise<void> {\n this._closed = true;\n if (this._session) {\n try {\n this._session.close();\n } catch {\n // Ignore close errors\n }\n this._session = null;\n }\n }\n\n private _buildToolSchemas(): Array<Record<string, unknown>> {\n const toolDefs: Array<Record<string, unknown>> = this._tools\n ? this._tools.toOpenAITools().map((t) => ({\n name: t.function.name,\n description: t.function.description,\n parameters: sanitizeSchemaForGemini(\n (t.function.parameters ?? { type: 'object', properties: {} }) as Record<\n string,\n unknown\n >,\n ),\n }))\n : [];\n toolDefs.push(...getBuiltinToolSchemas(this._builtinTools, 'gemini'));\n return toolDefs;\n }\n\n private _handleMessage(msg: LiveServerMessage): void {\n if (!this._call) return;\n\n // Handle server content\n const serverContent = msg.serverContent;\n if (serverContent) {\n // Audio from model turn\n const modelTurn = serverContent.modelTurn;\n if (modelTurn) {\n for (const part of modelTurn.parts ?? []) {\n const inlineData = part.inlineData;\n if (inlineData?.data) {\n const mimeType = inlineData.mimeType ?? '';\n if (mimeType.includes('audio')) {\n this._handleAudioData(inlineData.data as string);\n }\n }\n // NOTE: modelTurn text는 outputTranscription과 중복이므로 emit하지 않음\n }\n }\n\n // Turn complete - flush audio remainder\n if (serverContent.turnComplete) {\n this._log.debug('Turn complete');\n this._flushAudioRemainder();\n }\n\n // Barge-in (interrupt)\n if (serverContent.interrupted) {\n this._log.info('Barge-in detected');\n if (this._call) {\n this._call.clearAudio();\n }\n this._sentAudioChunks = 0;\n this._audioRemainder = Buffer.alloc(0);\n }\n\n // Input transcription (under serverContent in SDK)\n const inputText = serverContent.inputTranscription?.text;\n if (inputText && this._call) {\n this._log.info('User: %s', inputText);\n this._call._emit('transcript', 'user', inputText);\n }\n\n // Output transcription (under serverContent in SDK)\n const outputText = serverContent.outputTranscription?.text;\n if (outputText && this._call) {\n this._log.info('Assistant: %s', outputText);\n this._call._emit('transcript', 'assistant', outputText);\n }\n }\n\n // Handle tool calls\n if (msg.toolCall) {\n this._handleToolCall(msg.toolCall);\n }\n\n // Handle tool call cancellation\n const toolCancellation = (msg as unknown as Record<string, unknown>)['toolCallCancellation'] as\n | { ids?: string[] }\n | undefined;\n if (toolCancellation) {\n this._log.info({ ids: toolCancellation.ids }, 'Tool call cancelled');\n }\n }\n\n private _handleAudioData(b64Data: string): void {\n if (!this._call) return;\n\n const pcm24k = Buffer.from(b64Data, 'base64');\n if (this._recorder) {\n this._recorder.writeOutbound(resamplePcm16(pcm24k, 24000, 8000));\n }\n\n // PCM16 24kHz → PCM16 8kHz → G.711 ulaw\n const pcm8k = resamplePcm16(pcm24k, 24000, 8000);\n const ulaw = pcm16ToUlaw(pcm8k);\n\n // 160B frame alignment (160B = 20ms at 8kHz ulaw)\n // 프레임 정렬 후 한 번에 전송 (개별 160B 전송 대신 배치 전송)\n const combined = Buffer.concat([this._audioRemainder, ulaw]);\n const chunkSize = 160;\n const fullEnd = Math.floor(combined.length / chunkSize) * chunkSize;\n if (fullEnd > 0) {\n this._call.sendAudio(combined.subarray(0, fullEnd));\n this._sentAudioChunks += fullEnd / chunkSize;\n }\n this._audioRemainder = combined.subarray(fullEnd);\n }\n\n private _flushAudioRemainder(): void {\n if (this._audioRemainder.length > 0 && this._call) {\n const padded = Buffer.concat([\n this._audioRemainder,\n Buffer.alloc(160 - this._audioRemainder.length, 0xff),\n ]);\n this._call.sendAudio(padded);\n this._sentAudioChunks++;\n this._audioRemainder = Buffer.alloc(0);\n }\n }\n\n private async _handleToolCall(toolCall: LiveServerToolCall): Promise<void> {\n const functionCalls = toolCall.functionCalls;\n if (!functionCalls) return;\n\n // 도구 호출 중에는 오디오 입력 중단 (Gemini가 tool call 상태에서 audio input 수신 시 1008 에러)\n this._toolCallInProgress = true;\n\n const responses: Array<Record<string, unknown>> = [];\n\n for (const fc of functionCalls) {\n const name = fc.name ?? '';\n const fcId = fc.id ?? '';\n const args = fc.args ?? {};\n this._log.info({ tool: name, args }, 'Tool call: %s', name);\n\n // Built-in tools\n if (BUILTIN_TOOL_NAMES.has(name) && this._call) {\n const result = await executeBuiltinTool(name, args as Record<string, unknown>, this._call);\n if (result !== null) {\n if (name === 'hang_up') {\n this._log.info('hang_up: ending call');\n return;\n }\n this._log.info('Builtin tool result: %s -> %s', name, result);\n responses.push({ id: fcId, name, response: { result } });\n continue;\n }\n }\n\n if (!this._tools || !this._tools.has(name)) {\n this._log.error('Unknown tool: %s', name);\n responses.push({ id: fcId, name, response: { error: `Unknown tool: ${name}` } });\n continue;\n }\n\n try {\n this._call?.recordToolCall();\n const result = await this._tools.call(name, args);\n const resultStr = typeof result === 'string' ? result : JSON.stringify(result);\n this._log.info('Tool result: %s -> %s', name, resultStr.substring(0, 200));\n responses.push({\n id: fcId,\n name,\n response: { result: resultStr },\n });\n } catch (err) {\n this._log.error({ err }, 'Tool call failed: %s', name);\n if (err instanceof Error) {\n this._call?.recordToolError(err);\n }\n responses.push({\n id: fcId,\n name,\n response: { error: String(err) },\n });\n }\n }\n\n if (responses.length > 0 && this._session) {\n this._log.debug('Sending %d tool response(s)', responses.length);\n this._session.sendToolResponse({\n functionResponses: responses,\n });\n }\n this._toolCallInProgress = false;\n }\n}\n","/**\n * Deepgram STT (Speech-to-Text) provider.\n */\n\nimport type { Logger } from 'pino';\n\nimport type { SpeechEvent, STT } from '../base.js';\nimport { NOOP_LOGGER } from '../../logger.js';\n\nexport interface DeepgramSTTOptions {\n /** Deepgram API key. Falls back to DEEPGRAM_API_KEY env var. */\n apiKey?: string;\n /** Model to use. Default: 'nova-3' */\n model?: string;\n /** Language code. Default: 'ko' */\n language?: string;\n /** Sample rate. Default: 16000 */\n sampleRate?: number;\n /** Encoding. Default: 'linear16' */\n encoding?: string;\n /** Enable punctuation. Default: true */\n punctuate?: boolean;\n /** Enable interim results. Default: true */\n interimResults?: boolean;\n /** Endpointing timeout in ms. Default: 300 */\n endpointing?: number;\n /** Utterance end silence timeout in ms. Default: 1000 */\n utteranceEndMs?: number;\n}\n\nexport class DeepgramSTT implements STT {\n private _options: DeepgramSTTOptions;\n private _log: Logger = NOOP_LOGGER;\n\n get provider(): string { return 'deepgram'; }\n get model(): string { return this._options.model ?? 'nova-3'; }\n\n setLogger(logger: Logger): void {\n this._log = logger;\n }\n\n constructor(options: DeepgramSTTOptions = {}) {\n this._options = {\n model: 'nova-3',\n language: 'ko',\n sampleRate: 16000,\n encoding: 'linear16',\n punctuate: true,\n interimResults: true,\n endpointing: 300,\n utteranceEndMs: 1000,\n ...options,\n };\n }\n\n async *transcribe(\n audioStream: AsyncIterable<Buffer>,\n options?: { language?: string; sampleRate?: number },\n ): AsyncGenerator<SpeechEvent> {\n const apiKey = this._options.apiKey ?? process.env['DEEPGRAM_API_KEY'];\n if (!apiKey) {\n throw new Error('Deepgram API key is required');\n }\n\n const language = options?.language ?? this._options.language;\n const sampleRate = options?.sampleRate ?? this._options.sampleRate;\n\n // Use Deepgram live transcription via WebSocket\n const { WebSocket } = await import('ws');\n\n const params = new URLSearchParams({\n model: this._options.model!,\n language: language!,\n punctuate: String(this._options.punctuate),\n interim_results: String(this._options.interimResults),\n encoding: this._options.encoding!,\n sample_rate: String(sampleRate),\n endpointing: String(this._options.endpointing),\n utterance_end_ms: String(this._options.utteranceEndMs),\n });\n\n const url = `wss://api.deepgram.com/v1/listen?${params.toString()}`;\n const ws = new WebSocket(url, {\n headers: { Authorization: `Token ${apiKey}` },\n });\n\n // Queue for speech events\n const eventQueue: SpeechEvent[] = [];\n let resolveWait: (() => void) | null = null;\n let done = false;\n\n ws.on('message', (data: Buffer | string) => {\n try {\n const msg = JSON.parse(data.toString()) as Record<string, unknown>;\n const channel = msg['channel'] as Record<string, unknown> | undefined;\n if (!channel) return;\n\n const alternatives = channel['alternatives'] as Array<Record<string, unknown>> | undefined;\n if (!alternatives || alternatives.length === 0) return;\n\n const transcript = (alternatives[0]!['transcript'] as string) ?? '';\n if (!transcript) return;\n\n const isFinal = msg['is_final'] as boolean;\n const speechFinal = msg['speech_final'] as boolean;\n\n const event: SpeechEvent = {\n type: isFinal || speechFinal ? 'final' : 'interim',\n transcript,\n };\n\n eventQueue.push(event);\n if (resolveWait) {\n resolveWait();\n resolveWait = null;\n }\n } catch {\n // Ignore parse errors\n }\n });\n\n ws.on('close', () => {\n done = true;\n if (resolveWait) {\n resolveWait();\n resolveWait = null;\n }\n });\n\n ws.on('error', (err: Error) => {\n this._log.error({ err }, 'Deepgram STT error');\n done = true;\n if (resolveWait) {\n resolveWait();\n resolveWait = null;\n }\n });\n\n // Wait for connection\n await new Promise<void>((resolve, reject) => {\n ws.on('open', resolve);\n ws.on('error', reject);\n });\n this._log.info('Deepgram STT connected');\n\n // Feed audio in background\n const feedPromise = (async () => {\n try {\n for await (const chunk of audioStream) {\n if (done) break;\n if (ws.readyState === 1) {\n ws.send(chunk);\n }\n }\n } finally {\n // Send close message\n if (ws.readyState === 1) {\n ws.send(JSON.stringify({ type: 'CloseStream' }));\n }\n }\n })();\n\n // Yield speech events\n try {\n while (!done || eventQueue.length > 0) {\n if (eventQueue.length > 0) {\n yield eventQueue.shift()!;\n } else if (!done) {\n await new Promise<void>((resolve) => {\n resolveWait = resolve;\n });\n }\n }\n } finally {\n done = true;\n ws.close();\n await feedPromise.catch(() => {});\n }\n }\n}\n","/**\n * ElevenLabs TTS (Text-to-Speech) provider.\n */\n\nimport type { Logger } from 'pino';\n\nimport type { TTS } from '../base.js';\nimport { NOOP_LOGGER } from '../../logger.js';\n\nexport interface ElevenLabsTTSOptions {\n /** ElevenLabs API key. Falls back to ELEVENLABS_API_KEY env var. */\n apiKey?: string;\n /** Voice ID. Default: 'EXAVITQu4vr4xnSDxMaL' (Rachel) */\n voiceId?: string;\n /** Model ID. Default: 'eleven_flash_v2_5' */\n model?: string;\n /** Output format. Default: 'pcm_24000' */\n outputFormat?: string;\n /** Stability. Default: 0.5 */\n stability?: number;\n /** Similarity boost. Default: 0.75 */\n similarityBoost?: number;\n /** Language code. Default: 'ko' */\n languageCode?: string;\n}\n\nexport class ElevenLabsTTS implements TTS {\n private _options: ElevenLabsTTSOptions;\n private _log: Logger = NOOP_LOGGER;\n\n get provider(): string { return 'elevenlabs'; }\n get model(): string { return this._options.model ?? 'eleven_flash_v2_5'; }\n get voiceId(): string { return this._options.voiceId ?? 'EXAVITQu4vr4xnSDxMaL'; }\n\n setLogger(logger: Logger): void {\n this._log = logger;\n }\n\n constructor(options: ElevenLabsTTSOptions = {}) {\n this._options = {\n voiceId: 'EXAVITQu4vr4xnSDxMaL',\n model: 'eleven_flash_v2_5',\n outputFormat: 'pcm_24000',\n stability: 0.5,\n similarityBoost: 0.75,\n languageCode: 'ko',\n ...options,\n };\n }\n\n async *synthesize(\n text: string | AsyncIterable<string>,\n options?: { voice?: string; sampleRate?: number },\n ): AsyncGenerator<Buffer> {\n const apiKey = this._options.apiKey ?? process.env['ELEVENLABS_API_KEY'];\n if (!apiKey) {\n throw new Error('ElevenLabs API key is required');\n }\n\n const voiceId = options?.voice ?? this._options.voiceId;\n\n if (typeof text === 'string') {\n // Non-streaming: single request\n yield* this._synthesizeSingle(apiKey, voiceId!, text);\n } else {\n // Streaming: use WebSocket for chunked text input\n yield* this._synthesizeStreaming(apiKey, voiceId!, text);\n }\n }\n\n private async *_synthesizeSingle(\n apiKey: string,\n voiceId: string,\n text: string,\n ): AsyncGenerator<Buffer> {\n const url = `https://api.elevenlabs.io/v1/text-to-speech/${voiceId}?output_format=${this._options.outputFormat}`;\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'xi-api-key': apiKey,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n text,\n model_id: this._options.model,\n voice_settings: {\n stability: this._options.stability,\n similarity_boost: this._options.similarityBoost,\n },\n }),\n });\n\n if (!response.ok) {\n throw new Error(`ElevenLabs API error: ${response.status} ${response.statusText}`);\n }\n\n const body = response.body;\n if (!body) {\n throw new Error('ElevenLabs returned empty response');\n }\n\n const reader = body.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n yield Buffer.from(value);\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n private async *_synthesizeStreaming(\n apiKey: string,\n voiceId: string,\n textStream: AsyncIterable<string>,\n ): AsyncGenerator<Buffer> {\n const { WebSocket } = await import('ws');\n\n const url = `wss://api.elevenlabs.io/v1/text-to-speech/${voiceId}/stream-input?model_id=${this._options.model}&output_format=${this._options.outputFormat}`;\n\n const ws = new WebSocket(url);\n\n const audioQueue: Buffer[] = [];\n let resolveWait: (() => void) | null = null;\n let done = false;\n\n ws.on('open', () => {\n // Send initial config\n ws.send(\n JSON.stringify({\n text: ' ',\n voice_settings: {\n stability: this._options.stability,\n similarity_boost: this._options.similarityBoost,\n },\n xi_api_key: apiKey,\n }),\n );\n });\n\n ws.on('message', (data: Buffer | string) => {\n try {\n const msg = JSON.parse(data.toString()) as Record<string, unknown>;\n const audio = msg['audio'] as string | undefined;\n if (audio) {\n audioQueue.push(Buffer.from(audio, 'base64'));\n if (resolveWait) {\n resolveWait();\n resolveWait = null;\n }\n }\n } catch {\n // Ignore parse errors\n }\n });\n\n ws.on('close', () => {\n done = true;\n if (resolveWait) {\n resolveWait();\n resolveWait = null;\n }\n });\n\n ws.on('error', (err: Error) => {\n this._log.error({ err }, 'ElevenLabs TTS error');\n done = true;\n if (resolveWait) {\n resolveWait();\n resolveWait = null;\n }\n });\n\n // Wait for connection\n await new Promise<void>((resolve, reject) => {\n ws.on('open', resolve);\n ws.on('error', reject);\n });\n this._log.info('ElevenLabs TTS connected');\n\n // Feed text in background\n const feedPromise = (async () => {\n try {\n for await (const chunk of textStream) {\n if (done) break;\n if (ws.readyState === 1) {\n this._log.debug('ElevenLabs sending text: %s', chunk.substring(0, 60));\n ws.send(JSON.stringify({ text: chunk }));\n }\n }\n } finally {\n // Send end-of-stream\n if (ws.readyState === 1) {\n this._log.debug('ElevenLabs sending EOS');\n ws.send(JSON.stringify({ text: '' }));\n }\n }\n })();\n\n // Yield audio chunks\n try {\n while (!done || audioQueue.length > 0) {\n if (audioQueue.length > 0) {\n yield audioQueue.shift()!;\n } else if (!done) {\n await new Promise<void>((resolve) => {\n resolveWait = resolve;\n });\n }\n }\n } finally {\n done = true;\n ws.close();\n await feedPromise.catch(() => {});\n }\n }\n}\n","/**\n * OpenAI LLM provider for pipeline-based voice agents.\n */\n\nimport type { ConversationMessage, LLM, LLMChunk } from '../base.js';\nimport type { ToolRegistry } from '../../tool.js';\n\nexport interface OpenAILLMOptions {\n /** OpenAI API key. Falls back to OPENAI_API_KEY env var. */\n apiKey?: string;\n /** Model to use. Default: 'gpt-4o-mini' */\n model?: string;\n /** Default temperature. Default: 0.8 */\n temperature?: number;\n /** Default max tokens. Default: 4096 */\n maxTokens?: number;\n}\n\nexport class OpenAILLM implements LLM {\n private _options: OpenAILLMOptions;\n\n get provider(): string { return 'openai'; }\n get model(): string { return this._options.model!; }\n\n constructor(options: OpenAILLMOptions = {}) {\n this._options = {\n model: 'gpt-4o-mini',\n temperature: 0.8,\n maxTokens: 4096,\n ...options,\n };\n }\n\n async *generate(\n messages: ConversationMessage[],\n options?: {\n tools?: ToolRegistry;\n temperature?: number;\n maxTokens?: number;\n },\n ): AsyncGenerator<LLMChunk> {\n const OpenAI = (await import('openai')).default;\n\n const client = new OpenAI({\n apiKey: this._options.apiKey ?? process.env['OPENAI_API_KEY'],\n });\n\n const requestParams: Record<string, unknown> = {\n model: this._options.model,\n messages: messages.map((m) => {\n const msg: Record<string, unknown> = { role: m.role, content: m.content };\n if (m.name) msg['name'] = m.name;\n if (m.tool_call_id) msg['tool_call_id'] = m.tool_call_id;\n return msg;\n }),\n stream: true,\n temperature: options?.temperature ?? this._options.temperature,\n max_tokens: options?.maxTokens ?? this._options.maxTokens,\n };\n\n if (options?.tools && options.tools.size > 0) {\n requestParams['tools'] = options.tools.toOpenAITools();\n }\n\n const stream = await client.chat.completions.create(\n requestParams as Parameters<typeof client.chat.completions.create>[0],\n );\n\n let currentToolCall: { id: string; name: string; arguments: string } | null = null;\n\n for await (const chunk of stream as AsyncIterable<Record<string, unknown>>) {\n const choices = chunk['choices'] as Array<Record<string, unknown>> | undefined;\n if (!choices || choices.length === 0) continue;\n\n const delta = choices[0]!['delta'] as Record<string, unknown> | undefined;\n if (!delta) continue;\n\n // Text content\n const content = delta['content'] as string | undefined;\n if (content) {\n yield { type: 'text', text: content };\n }\n\n // Tool calls\n const toolCalls = delta['tool_calls'] as Array<Record<string, unknown>> | undefined;\n if (toolCalls) {\n for (const tc of toolCalls) {\n const fn = tc['function'] as Record<string, unknown> | undefined;\n if (fn) {\n if (fn['name']) {\n // Start of a new tool call\n if (currentToolCall) {\n yield {\n type: 'tool_call',\n toolCall: {\n id: currentToolCall.id,\n name: currentToolCall.name,\n arguments: currentToolCall.arguments,\n },\n };\n }\n currentToolCall = {\n id: (tc['id'] as string) ?? '',\n name: fn['name'] as string,\n arguments: (fn['arguments'] as string) ?? '',\n };\n } else if (currentToolCall && fn['arguments']) {\n currentToolCall.arguments += fn['arguments'] as string;\n }\n }\n }\n }\n }\n\n // Emit final tool call if pending\n if (currentToolCall) {\n yield {\n type: 'tool_call',\n toolCall: {\n id: currentToolCall.id,\n name: currentToolCall.name,\n arguments: currentToolCall.arguments,\n },\n };\n }\n\n yield { type: 'done' };\n }\n}\n","/**\n * Anthropic LLM provider for pipeline-based voice agents.\n */\n\nimport type { ConversationMessage, LLM, LLMChunk } from '../base.js';\nimport type { ToolRegistry } from '../../tool.js';\n\nexport interface AnthropicLLMOptions {\n /** Anthropic API key. Falls back to ANTHROPIC_API_KEY env var. */\n apiKey?: string;\n /** Model to use. Default: 'claude-sonnet-4-6' */\n model?: string;\n /** Default temperature. Default: 0.8 */\n temperature?: number;\n /** Default max tokens. Default: 4096 */\n maxTokens?: number;\n}\n\nexport class AnthropicLLM implements LLM {\n private _options: AnthropicLLMOptions;\n\n get provider(): string { return 'anthropic'; }\n get model(): string { return this._options.model!; }\n\n constructor(options: AnthropicLLMOptions = {}) {\n this._options = {\n model: 'claude-sonnet-4-6',\n temperature: 0.8,\n maxTokens: 4096,\n ...options,\n };\n }\n\n async *generate(\n messages: ConversationMessage[],\n options?: {\n tools?: ToolRegistry;\n temperature?: number;\n maxTokens?: number;\n },\n ): AsyncGenerator<LLMChunk> {\n const AnthropicModule = await import('@anthropic-ai/sdk');\n const Anthropic = AnthropicModule.default;\n\n const client = new Anthropic({\n apiKey: this._options.apiKey ?? process.env['ANTHROPIC_API_KEY'],\n });\n\n // Separate system message from conversation\n let systemPrompt: string | undefined;\n const conversationMessages: Array<Record<string, unknown>> = [];\n\n for (const msg of messages) {\n if (msg.role === 'system') {\n systemPrompt = msg.content;\n } else {\n conversationMessages.push({\n role: msg.role === 'tool' ? 'user' : msg.role,\n content:\n msg.role === 'tool'\n ? [\n {\n type: 'tool_result',\n tool_use_id: msg.tool_call_id,\n content: msg.content,\n },\n ]\n : msg.content,\n });\n }\n }\n\n const requestParams: Record<string, unknown> = {\n model: this._options.model,\n messages: conversationMessages,\n max_tokens: options?.maxTokens ?? this._options.maxTokens,\n stream: true,\n };\n\n if (systemPrompt) {\n requestParams['system'] = systemPrompt;\n }\n if (options?.temperature ?? this._options.temperature) {\n requestParams['temperature'] = options?.temperature ?? this._options.temperature;\n }\n\n if (options?.tools && options.tools.size > 0) {\n const toolDefs = options.tools.toOpenAITools().map((t) => ({\n name: t.function.name,\n description: t.function.description,\n input_schema: t.function.parameters,\n }));\n requestParams['tools'] = toolDefs;\n }\n\n const stream = client.messages.stream(\n requestParams as Parameters<typeof client.messages.stream>[0],\n );\n\n let currentToolCall: { id: string; name: string; arguments: string } | null = null;\n\n for await (const event of stream as AsyncIterable<Record<string, unknown>>) {\n const eventType = event['type'] as string;\n\n switch (eventType) {\n case 'content_block_start': {\n const contentBlock = event['content_block'] as Record<string, unknown>;\n if (contentBlock?.['type'] === 'tool_use') {\n currentToolCall = {\n id: contentBlock['id'] as string,\n name: contentBlock['name'] as string,\n arguments: '',\n };\n }\n break;\n }\n case 'content_block_delta': {\n const delta = event['delta'] as Record<string, unknown>;\n if (delta?.['type'] === 'text_delta') {\n yield { type: 'text', text: delta['text'] as string };\n } else if (delta?.['type'] === 'input_json_delta' && currentToolCall) {\n currentToolCall.arguments += (delta['partial_json'] as string) ?? '';\n }\n break;\n }\n case 'content_block_stop': {\n if (currentToolCall) {\n yield {\n type: 'tool_call',\n toolCall: {\n id: currentToolCall.id,\n name: currentToolCall.name,\n arguments: currentToolCall.arguments,\n },\n };\n currentToolCall = null;\n }\n break;\n }\n case 'message_stop': {\n yield { type: 'done' };\n break;\n }\n }\n }\n }\n}\n","/**\n * Google Gemini LLM provider for pipeline-based voice agents.\n */\n\nimport type { ConversationMessage, LLM, LLMChunk } from '../base.js';\nimport type { ToolRegistry } from '../../tool.js';\n\nexport interface GeminiLLMOptions {\n /** Google API key. Falls back to GOOGLE_API_KEY env var. */\n apiKey?: string;\n /** Model to use. Default: 'gemini-2.5-flash' */\n model?: string;\n /** Default temperature. Default: 0.8 */\n temperature?: number;\n /** Default max tokens. Default: 4096 */\n maxTokens?: number;\n}\n\nexport class GeminiLLM implements LLM {\n private _options: GeminiLLMOptions;\n\n get provider(): string { return 'gemini'; }\n get model(): string { return this._options.model!; }\n\n constructor(options: GeminiLLMOptions = {}) {\n this._options = {\n model: 'gemini-2.5-flash',\n temperature: 0.8,\n maxTokens: 4096,\n ...options,\n };\n }\n\n async *generate(\n messages: ConversationMessage[],\n options?: {\n tools?: ToolRegistry;\n temperature?: number;\n maxTokens?: number;\n },\n ): AsyncGenerator<LLMChunk> {\n const { GoogleGenAI } = await import('@google/genai');\n\n const client = new GoogleGenAI({\n apiKey: this._options.apiKey ?? process.env['GOOGLE_API_KEY'],\n });\n\n // Convert messages to Gemini format\n let systemInstruction: string | undefined;\n const contents: Array<Record<string, unknown>> = [];\n\n for (const msg of messages) {\n if (msg.role === 'system') {\n systemInstruction = msg.content;\n continue;\n }\n\n const role = msg.role === 'assistant' ? 'model' : 'user';\n contents.push({\n role,\n parts: [{ text: msg.content }],\n });\n }\n\n const requestConfig: Record<string, unknown> = {\n contents,\n };\n\n if (systemInstruction) {\n requestConfig['systemInstruction'] = { parts: [{ text: systemInstruction }] };\n }\n\n const generationConfig: Record<string, unknown> = {};\n if (options?.temperature ?? this._options.temperature) {\n generationConfig['temperature'] = options?.temperature ?? this._options.temperature;\n }\n if (options?.maxTokens ?? this._options.maxTokens) {\n generationConfig['maxOutputTokens'] = options?.maxTokens ?? this._options.maxTokens;\n }\n if (Object.keys(generationConfig).length > 0) {\n requestConfig['generationConfig'] = generationConfig;\n }\n\n if (options?.tools && options.tools.size > 0) {\n const toolDefs = options.tools.toOpenAITools().map((t) => ({\n name: t.function.name,\n description: t.function.description,\n parameters: t.function.parameters,\n }));\n requestConfig['tools'] = [{ functionDeclarations: toolDefs }];\n }\n\n const response = await client.models.generateContentStream({\n model: this._options.model!,\n ...requestConfig,\n });\n\n for await (const chunk of response) {\n const candidates = (chunk as Record<string, unknown>)['candidates'] as\n | Array<Record<string, unknown>>\n | undefined;\n if (!candidates || candidates.length === 0) continue;\n\n const content = candidates[0]?.['content'] as Record<string, unknown> | undefined;\n const parts = content?.['parts'] as Array<Record<string, unknown>> | undefined;\n if (!parts) continue;\n\n for (const part of parts) {\n if ('text' in part && part['text']) {\n yield { type: 'text', text: part['text'] as string };\n }\n\n if ('functionCall' in part && part['functionCall']) {\n const fc = part['functionCall'] as { name: string; args: Record<string, unknown> };\n yield {\n type: 'tool_call',\n toolCall: {\n id: `gemini_${Date.now()}`,\n name: fc.name,\n arguments: JSON.stringify(fc.args ?? {}),\n },\n };\n }\n }\n }\n\n yield { type: 'done' };\n }\n}\n","/**\n * OpenAI-compatible LLM provider (works with any OpenAI-compatible API).\n */\n\nimport type { ConversationMessage, LLM, LLMChunk } from '../base.js';\nimport type { ToolRegistry } from '../../tool.js';\n\nexport interface OpenAICompatLLMOptions {\n /** API key. */\n apiKey?: string;\n /** Base URL for the OpenAI-compatible API. */\n baseUrl: string;\n /** Model to use. */\n model: string;\n /** Default temperature. */\n temperature?: number;\n /** Default max tokens. */\n maxTokens?: number;\n /** Additional default headers. */\n defaultHeaders?: Record<string, string>;\n}\n\nexport class OpenAICompatLLM implements LLM {\n private _options: OpenAICompatLLMOptions;\n\n get provider(): string { return 'openai_compatible'; }\n get model(): string { return this._options.model; }\n\n constructor(options: OpenAICompatLLMOptions) {\n this._options = options;\n }\n\n async *generate(\n messages: ConversationMessage[],\n options?: {\n tools?: ToolRegistry;\n temperature?: number;\n maxTokens?: number;\n },\n ): AsyncGenerator<LLMChunk> {\n const OpenAI = (await import('openai')).default;\n\n const client = new OpenAI({\n apiKey: this._options.apiKey ?? 'not-needed',\n baseURL: this._options.baseUrl,\n defaultHeaders: this._options.defaultHeaders,\n });\n\n const requestParams: Record<string, unknown> = {\n model: this._options.model,\n messages: messages.map((m) => {\n const msg: Record<string, unknown> = { role: m.role, content: m.content };\n if (m.name) msg['name'] = m.name;\n if (m.tool_call_id) msg['tool_call_id'] = m.tool_call_id;\n return msg;\n }),\n stream: true,\n temperature: options?.temperature ?? this._options.temperature,\n max_tokens: options?.maxTokens ?? this._options.maxTokens,\n };\n\n if (options?.tools && options.tools.size > 0) {\n requestParams['tools'] = options.tools.toOpenAITools();\n }\n\n const stream = await client.chat.completions.create(\n requestParams as Parameters<typeof client.chat.completions.create>[0],\n );\n\n let currentToolCall: { id: string; name: string; arguments: string } | null = null;\n\n for await (const chunk of stream as AsyncIterable<Record<string, unknown>>) {\n const choices = chunk['choices'] as Array<Record<string, unknown>> | undefined;\n if (!choices || choices.length === 0) continue;\n\n const delta = choices[0]!['delta'] as Record<string, unknown> | undefined;\n if (!delta) continue;\n\n const content = delta['content'] as string | undefined;\n if (content) {\n yield { type: 'text', text: content };\n }\n\n const toolCalls = delta['tool_calls'] as Array<Record<string, unknown>> | undefined;\n if (toolCalls) {\n for (const tc of toolCalls) {\n const fn = tc['function'] as Record<string, unknown> | undefined;\n if (fn) {\n if (fn['name']) {\n if (currentToolCall) {\n yield {\n type: 'tool_call',\n toolCall: {\n id: currentToolCall.id,\n name: currentToolCall.name,\n arguments: currentToolCall.arguments,\n },\n };\n }\n currentToolCall = {\n id: (tc['id'] as string) ?? '',\n name: fn['name'] as string,\n arguments: (fn['arguments'] as string) ?? '',\n };\n } else if (currentToolCall && fn['arguments']) {\n currentToolCall.arguments += fn['arguments'] as string;\n }\n }\n }\n }\n }\n\n if (currentToolCall) {\n yield {\n type: 'tool_call',\n toolCall: {\n id: currentToolCall.id,\n name: currentToolCall.name,\n arguments: currentToolCall.arguments,\n },\n };\n }\n\n yield { type: 'done' };\n }\n}\n","/**\n * Ollama LLM provider for pipeline-based voice agents.\n * Uses the OpenAI-compatible API that Ollama exposes.\n */\n\nimport type { ConversationMessage, LLM, LLMChunk } from '../base.js';\nimport type { ToolRegistry } from '../../tool.js';\nimport { OpenAICompatLLM } from './openai-compat-llm.js';\n\nexport interface OllamaLLMOptions {\n /** Ollama server URL. Falls back to OLLAMA_BASE_URL env var. Default: 'http://localhost:11434/v1' */\n baseUrl?: string;\n /** Model to use. Default: 'llama3.2' */\n model?: string;\n /** Default temperature. Default: 0.8 */\n temperature?: number;\n /** Default max tokens. Default: 4096 */\n maxTokens?: number;\n}\n\nexport class OllamaLLM implements LLM {\n private _inner: OpenAICompatLLM;\n\n get provider(): string { return 'ollama'; }\n get model(): string { return this._inner.model; }\n\n constructor(options: OllamaLLMOptions = {}) {\n const baseUrl = options.baseUrl ?? process.env['OLLAMA_BASE_URL'] ?? 'http://localhost:11434/v1';\n this._inner = new OpenAICompatLLM({\n baseUrl: baseUrl.replace(/\\/$/, ''),\n model: options.model ?? 'llama3.2',\n apiKey: 'ollama',\n temperature: options.temperature ?? 0.8,\n maxTokens: options.maxTokens ?? 4096,\n });\n }\n\n async *generate(\n messages: ConversationMessage[],\n options?: {\n tools?: ToolRegistry;\n temperature?: number;\n maxTokens?: number;\n },\n ): AsyncGenerator<LLMChunk> {\n yield* this._inner.generate(messages, options);\n }\n}\n","import type { ConversationMessage, LLM, LLMChunk } from '../base.js';\nimport type { ToolRegistry } from '../../tool.js';\nimport { OpenAICompatLLM } from './openai-compat-llm.js';\n\nexport interface MistralLLMOptions {\n apiKey?: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n}\n\nexport class MistralLLM implements LLM {\n private _inner: OpenAICompatLLM;\n\n get provider(): string { return 'mistral'; }\n get model(): string { return this._inner.model; }\n\n constructor(options: MistralLLMOptions = {}) {\n this._inner = new OpenAICompatLLM({\n apiKey: options.apiKey ?? process.env['MISTRAL_API_KEY'],\n baseUrl: 'https://api.mistral.ai/v1',\n model: options.model ?? 'mistral-small-latest',\n temperature: options.temperature,\n maxTokens: options.maxTokens,\n });\n }\n\n async *generate(\n messages: ConversationMessage[],\n options?: { tools?: ToolRegistry; temperature?: number; maxTokens?: number },\n ): AsyncGenerator<LLMChunk> {\n yield* this._inner.generate(messages, options);\n }\n}\n","import type { ConversationMessage, LLM, LLMChunk } from '../base.js';\nimport type { ToolRegistry } from '../../tool.js';\nimport { OpenAICompatLLM } from './openai-compat-llm.js';\n\nexport interface GroqLLMOptions {\n apiKey?: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n}\n\nexport class GroqLLM implements LLM {\n private _inner: OpenAICompatLLM;\n\n get provider(): string { return 'groq'; }\n get model(): string { return this._inner.model; }\n\n constructor(options: GroqLLMOptions = {}) {\n this._inner = new OpenAICompatLLM({\n apiKey: options.apiKey ?? process.env['GROQ_API_KEY'],\n baseUrl: 'https://api.groq.com/openai/v1',\n model: options.model ?? 'meta-llama/llama-4-scout-17b-16e-instruct',\n temperature: options.temperature,\n maxTokens: options.maxTokens,\n });\n }\n\n async *generate(\n messages: ConversationMessage[],\n options?: { tools?: ToolRegistry; temperature?: number; maxTokens?: number },\n ): AsyncGenerator<LLMChunk> {\n yield* this._inner.generate(messages, options);\n }\n}\n","import type { ConversationMessage, LLM, LLMChunk } from '../base.js';\nimport type { ToolRegistry } from '../../tool.js';\nimport { OpenAICompatLLM } from './openai-compat-llm.js';\n\nexport interface PerplexityLLMOptions {\n apiKey?: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n}\n\nexport class PerplexityLLM implements LLM {\n private _inner: OpenAICompatLLM;\n\n get provider(): string { return 'perplexity'; }\n get model(): string { return this._inner.model; }\n\n constructor(options: PerplexityLLMOptions = {}) {\n this._inner = new OpenAICompatLLM({\n apiKey: options.apiKey ?? process.env['PERPLEXITY_API_KEY'],\n baseUrl: 'https://api.perplexity.ai',\n model: options.model ?? 'sonar',\n temperature: options.temperature,\n maxTokens: options.maxTokens,\n });\n }\n\n async *generate(\n messages: ConversationMessage[],\n options?: { tools?: ToolRegistry; temperature?: number; maxTokens?: number },\n ): AsyncGenerator<LLMChunk> {\n yield* this._inner.generate(messages, options);\n }\n}\n","import type { ConversationMessage, LLM, LLMChunk } from '../base.js';\nimport type { ToolRegistry } from '../../tool.js';\nimport { OpenAICompatLLM } from './openai-compat-llm.js';\n\nexport interface TogetherLLMOptions {\n apiKey?: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n}\n\nexport class TogetherLLM implements LLM {\n private _inner: OpenAICompatLLM;\n\n get provider(): string { return 'together'; }\n get model(): string { return this._inner.model; }\n\n constructor(options: TogetherLLMOptions = {}) {\n this._inner = new OpenAICompatLLM({\n apiKey: options.apiKey ?? process.env['TOGETHER_API_KEY'],\n baseUrl: 'https://api.together.xyz/v1',\n model: options.model ?? 'meta-llama/Llama-4-Scout-17B-16E-Instruct',\n temperature: options.temperature,\n maxTokens: options.maxTokens,\n });\n }\n\n async *generate(\n messages: ConversationMessage[],\n options?: { tools?: ToolRegistry; temperature?: number; maxTokens?: number },\n ): AsyncGenerator<LLMChunk> {\n yield* this._inner.generate(messages, options);\n }\n}\n","import type { ConversationMessage, LLM, LLMChunk } from '../base.js';\nimport type { ToolRegistry } from '../../tool.js';\nimport { OpenAICompatLLM } from './openai-compat-llm.js';\n\nexport interface FireworksLLMOptions {\n apiKey?: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n}\n\nexport class FireworksLLM implements LLM {\n private _inner: OpenAICompatLLM;\n\n get provider(): string { return 'fireworks'; }\n get model(): string { return this._inner.model; }\n\n constructor(options: FireworksLLMOptions = {}) {\n this._inner = new OpenAICompatLLM({\n apiKey: options.apiKey ?? process.env['FIREWORKS_API_KEY'],\n baseUrl: 'https://api.fireworks.ai/inference/v1',\n model: options.model ?? 'accounts/fireworks/models/llama4-scout-instruct-basic',\n temperature: options.temperature,\n maxTokens: options.maxTokens,\n });\n }\n\n async *generate(\n messages: ConversationMessage[],\n options?: { tools?: ToolRegistry; temperature?: number; maxTokens?: number },\n ): AsyncGenerator<LLMChunk> {\n yield* this._inner.generate(messages, options);\n }\n}\n","import type { ConversationMessage, LLM, LLMChunk } from '../base.js';\nimport type { ToolRegistry } from '../../tool.js';\nimport { OpenAICompatLLM } from './openai-compat-llm.js';\n\nexport interface DeepSeekLLMOptions {\n apiKey?: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n}\n\nexport class DeepSeekLLM implements LLM {\n private _inner: OpenAICompatLLM;\n\n get provider(): string { return 'deepseek'; }\n get model(): string { return this._inner.model; }\n\n constructor(options: DeepSeekLLMOptions = {}) {\n this._inner = new OpenAICompatLLM({\n apiKey: options.apiKey ?? process.env['DEEPSEEK_API_KEY'],\n baseUrl: 'https://api.deepseek.com',\n model: options.model ?? 'deepseek-chat',\n temperature: options.temperature,\n maxTokens: options.maxTokens,\n });\n }\n\n async *generate(\n messages: ConversationMessage[],\n options?: { tools?: ToolRegistry; temperature?: number; maxTokens?: number },\n ): AsyncGenerator<LLMChunk> {\n yield* this._inner.generate(messages, options);\n }\n}\n","import type { ConversationMessage, LLM, LLMChunk } from '../base.js';\nimport type { ToolRegistry } from '../../tool.js';\nimport { OpenAICompatLLM } from './openai-compat-llm.js';\n\nexport interface XaiLLMOptions {\n apiKey?: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n}\n\nexport class XaiLLM implements LLM {\n private _inner: OpenAICompatLLM;\n\n get provider(): string { return 'xai'; }\n get model(): string { return this._inner.model; }\n\n constructor(options: XaiLLMOptions = {}) {\n this._inner = new OpenAICompatLLM({\n apiKey: options.apiKey ?? process.env['XAI_API_KEY'],\n baseUrl: 'https://api.x.ai/v1',\n model: options.model ?? 'grok-4-1-fast',\n temperature: options.temperature,\n maxTokens: options.maxTokens,\n });\n }\n\n async *generate(\n messages: ConversationMessage[],\n options?: { tools?: ToolRegistry; temperature?: number; maxTokens?: number },\n ): AsyncGenerator<LLMChunk> {\n yield* this._inner.generate(messages, options);\n }\n}\n","/**\n * MCP server configuration for stdio-based servers.\n */\n\nexport interface MCPServerStdio {\n type: 'stdio';\n /** Command to execute. */\n command: string;\n /** Command arguments. */\n args?: string[];\n /** Environment variables. */\n env?: Record<string, string>;\n [key: string]: unknown;\n}\n\n/**\n * Create a stdio MCP server configuration.\n */\nexport function mcpServerStdio(options: {\n command: string;\n args?: string[];\n env?: Record<string, string>;\n}): MCPServerStdio {\n return {\n type: 'stdio',\n command: options.command,\n args: options.args,\n env: options.env,\n };\n}\n","/**\n * MCP server configuration for HTTP-based servers.\n */\n\nexport interface MCPServerHTTP {\n type: 'http';\n /** Server URL. */\n url: string;\n /** Additional headers to send with requests. */\n headers?: Record<string, string>;\n [key: string]: unknown;\n}\n\n/**\n * Create an HTTP MCP server configuration.\n */\nexport function mcpServerHTTP(options: {\n url: string;\n headers?: Record<string, string>;\n}): MCPServerHTTP {\n return {\n type: 'http',\n url: options.url,\n headers: options.headers,\n };\n}\n"]}