@teamlearners/clawops 0.16.6 → 0.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -0
- package/dist/agent/index.cjs +289 -33
- package/dist/agent/index.cjs.map +1 -1
- package/dist/agent/index.d.cts +57 -1
- package/dist/agent/index.d.ts +57 -1
- package/dist/agent/index.js +281 -25
- package/dist/agent/index.js.map +1 -1
- package/dist/{chunk-RYJF2N7K.js → chunk-FTZ2FC2Q.js} +3 -3
- package/dist/{chunk-RYJF2N7K.js.map → chunk-FTZ2FC2Q.js.map} +1 -1
- package/dist/{chunk-OLGP2XVS.cjs → chunk-ZOSOGI2J.cjs} +3 -3
- package/dist/{chunk-OLGP2XVS.cjs.map → chunk-ZOSOGI2J.cjs.map} +1 -1
- package/dist/index.cjs +35 -35
- package/dist/index.js +2 -2
- package/package.json +1 -1
package/dist/agent/index.cjs.map
CHANGED
|
@@ -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/telemetry.ts","../../src/agent/session.ts","../../src/agent/builtin-tool.ts","../../src/agent/hold-audio.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","silence","VERSION","os","digit","BuiltinTool","SAMPLE_RATE","fs2","DEFAULT_BASE_URL","AgentError","AgentConnectionError","result"],"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 * Apply multiplicative gain to PCM16 little-endian audio.\n * gain=1.0 is pass-through, 0 is mute, 2.0 is 2x amplification (clipped to int16 range).\n */\nexport function applyPcm16Gain(pcm: Buffer, gain: number): Buffer {\n if (!pcm.length) return Buffer.alloc(0);\n if (gain === 1.0) return pcm;\n if (!Number.isFinite(gain) || gain < 0) {\n throw new Error('gain must be a finite number >= 0');\n }\n const nSamples = pcm.length >> 1;\n const out = Buffer.alloc(nSamples * 2);\n for (let i = 0; i < nSamples; i++) {\n let value = Math.round(pcm.readInt16LE(i * 2) * gain);\n if (value > 32767) value = 32767;\n else if (value < -32768) value = -32768;\n out.writeInt16LE(value, i * 2);\n }\n return out;\n}\n\n/**\n * Apply multiplicative gain to G.711 mu-law audio.\n */\nexport function applyUlawGain(ulaw: Buffer, gain: number): Buffer {\n if (!ulaw.length) return Buffer.alloc(0);\n if (gain === 1.0) return ulaw;\n return pcm16ToUlaw(applyPcm16Gain(ulawToPcm16(ulaw), gain));\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 _transferResolvers = new Map<string, {\n resolve: (value: Record<string, unknown>) => void;\n reject: (reason: Error) => void;\n }>();\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 /** Request a call transfer and wait for the result. */\n async requestTransfer(callId: string, params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return new Promise((resolve, reject) => {\n const timeout = ((params.timeout as number) || 30) + 10;\n const timer = setTimeout(() => {\n this._transferResolvers.delete(callId);\n reject(new Error('transfer timeout'));\n }, timeout * 1000);\n\n this._transferResolvers.set(callId, {\n resolve: (value) => { clearTimeout(timer); resolve(value); },\n reject: (reason) => { clearTimeout(timer); reject(reason); },\n });\n\n this.send({\n event: 'call.transfer',\n callId,\n transfer: params,\n });\n });\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 for (const [, resolver] of this._transferResolvers) {\n resolver.reject(new Error('connection closed'));\n }\n this._transferResolvers.clear();\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 // Resolve pending transfer promises on terminal transfer events\n if (['call.transfer.completed', 'call.transfer.failed'].includes(event.event)) {\n const callId = event.callId as string;\n const resolver = this._transferResolvers.get(callId);\n if (resolver) {\n this._transferResolvers.delete(callId);\n resolver.resolve((event.transfer as Record<string, unknown>) || {});\n }\n }\n\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 * Inbound/outbound 모두 media timestamp 기반 timeline에 기록한다.\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 _started = false\n private _baseTs: number | null = null\n private _outCursor = 0\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._started = true\n this._log.info('Recording started: %s', this._dir);\n }\n\n private _timestampToBytes(mediaTsMs: number): number {\n if (this._baseTs === null) {\n this._baseTs = mediaTsMs\n }\n const target = Math.floor(((mediaTsMs - this._baseTs) * BYTES_PER_SECOND) / 1000)\n return Math.max(0, target - (target % 2))\n }\n\n private _padSilence(fd: number, written: number, target: number): number {\n let gap = target - 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 data = data.subarray(0, data.length - (data.length % 2))\n if (data.length === 0) return\n const filePos = 44 + trackPos\n\n if (trackPos < this._mixWritten) {\n // Overlap: read existing, mix, write back\n let overlap = Math.min(data.length, this._mixWritten - trackPos)\n overlap = overlap - (overlap % 2)\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, mediaTsMs: number = 0): void {\n if (!this._started || this._fdIn === null) return\n try {\n pcm16_8k = pcm16_8k.subarray(0, pcm16_8k.length - (pcm16_8k.length % 2))\n if (pcm16_8k.length === 0) return\n const target = this._timestampToBytes(mediaTsMs)\n const gap = this._padSilence(this._fdIn, this._inWritten, target)\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, mediaTsMs?: number): void {\n if (!this._started || this._fdOut === null) return\n try {\n pcm16_8k = pcm16_8k.subarray(0, pcm16_8k.length - (pcm16_8k.length % 2))\n if (pcm16_8k.length === 0) return\n let target = this._outCursor\n if (mediaTsMs !== undefined) {\n target = Math.max(target, this._timestampToBytes(mediaTsMs))\n }\n const gap = this._padSilence(this._fdOut, this._outWritten, target)\n this._outWritten += gap\n const posBefore = this._outWritten\n fs.writeSync(this._fdOut, pcm16_8k)\n this._outWritten += pcm16_8k.length\n this._outCursor = this._outWritten\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 interface TransferFn {\n (params: Record<string, unknown>): Promise<Record<string, unknown>>;\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 */ _transferFn: TransferFn | 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 /** Transfer the call to another destination. */\n async transfer(\n to: string,\n options?: {\n mode?: 'blind' | 'warm';\n afterTransfer?: 'terminate' | 'return';\n holdMedia?: string;\n whisper?: string;\n context?: Record<string, unknown>;\n callerId?: string;\n timeout?: number;\n },\n ): Promise<Record<string, unknown>> {\n if (!this._transferFn) {\n throw new Error('transfer not available');\n }\n return this._transferFn({\n to,\n mode: options?.mode ?? 'blind',\n afterTransfer: options?.afterTransfer ?? 'terminate',\n holdMedia: options?.holdMedia ?? 'ringback',\n whisper: options?.whisper ?? null,\n context: options?.context ?? null,\n callerId: options?.callerId ?? null,\n timeout: options?.timeout ?? 30,\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 TRANSFER_CALL = 'transfer_call',\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 BuiltinTool.TRANSFER_CALL,\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 실행 중 대기 오디오 재생.\n *\n * HoldAudioPlayer는 tool 실행 동안 caller에게 대기음을 루프 재생한다.\n */\n\nimport * as fs from 'fs';\nimport { pcm16ToUlaw, resamplePcm16 } from './audio';\nimport type { CallSession } from './session';\n\nconst CHUNK_SIZE = 160; // 20ms @ 8kHz ulaw\nconst SAMPLE_RATE = 8000;\n\n// ── Bell note generation ─────────────────────────────────────\n\ninterface Partial {\n freqRatio: number;\n amplitude: number;\n decayRate: number;\n}\n\nconst BELL_PARTIALS: Partial[] = [\n { freqRatio: 1.0, amplitude: 1.0, decayRate: 1.2 },\n { freqRatio: 2.76, amplitude: 0.5, decayRate: 2.5 },\n { freqRatio: 5.4, amplitude: 0.25, decayRate: 4.0 },\n];\n\nfunction bellNote(freq: number, durationMs: number, volume: number): Int16Array {\n const n = (SAMPLE_RATE * durationMs) / 1000 | 0;\n const attackSamples = (0.003 * SAMPLE_RATE) | 0; // 3ms attack\n const samples = new Int16Array(n);\n\n for (let i = 0; i < n; i++) {\n const t = i / SAMPLE_RATE;\n let val = 0;\n for (const p of BELL_PARTIALS) {\n const f = freq * p.freqRatio;\n if (f >= SAMPLE_RATE / 2) continue; // Nyquist\n const env = p.amplitude * Math.exp(-p.decayRate * t * (1000 / durationMs));\n val += env * Math.sin(2 * Math.PI * f * t);\n }\n if (i < attackSamples) {\n val *= i / attackSamples;\n }\n samples[i] = Math.max(-32768, Math.min(32767, (volume * 32767 * val) | 0));\n }\n return samples;\n}\n\nfunction silence(durationMs: number): Int16Array {\n return new Int16Array(((SAMPLE_RATE * durationMs) / 1000) | 0);\n}\n\nfunction int16ArrayToBuffer(samples: Int16Array): Buffer {\n const buf = Buffer.alloc(samples.length * 2);\n for (let i = 0; i < samples.length; i++) {\n buf.writeInt16LE(samples[i]!, i * 2);\n }\n return buf;\n}\n\nfunction concatInt16Arrays(...arrays: Int16Array[]): Int16Array {\n let total = 0;\n for (const a of arrays) total += a.length;\n const result = new Int16Array(total);\n let offset = 0;\n for (const a of arrays) {\n result.set(a, offset);\n offset += a.length;\n }\n return result;\n}\n\n// ── C5 Pentatonic scale ──────────────────────────────────────\n\nconst PENTATONIC_C5 = {\n C5: 523.25,\n D5: 587.33,\n E5: 659.25,\n G5: 783.99,\n A5: 880.0,\n C6: 1046.5,\n} as const;\n\n// ── Public API ───────────────────────────────────────────────\n\n/**\n * 뮤직박스 스타일 대기음 생성 (C5 펜타토닉 차임 멜로디).\n * 약 13초 길이가 루프 재생된다.\n */\nexport function generateComfortTone(volume = 0.12): Buffer[] {\n const p = PENTATONIC_C5;\n\n const melody: Array<[number, number]> = [\n [p.E5, 450], [p.G5, 450], [p.A5, 450], [p.C6, 600],\n [0, 800],\n [p.A5, 400], [p.G5, 400], [p.E5, 400], [p.D5, 600],\n [0, 2500],\n [p.C5, 500], [p.E5, 500], [p.C6, 700],\n [0, 2500],\n ];\n\n const parts: Int16Array[] = [];\n for (const [freq, durMs] of melody) {\n if (freq === 0) {\n parts.push(silence(durMs));\n } else {\n parts.push(bellNote(freq, durMs, volume));\n parts.push(silence(150)); // 음 사이 간격\n }\n }\n\n const pcm = int16ArrayToBuffer(concatInt16Arrays(...parts));\n const ulaw = pcm16ToUlaw(pcm);\n\n const chunks: Buffer[] = [];\n for (let i = 0; i < ulaw.length; i += CHUNK_SIZE) {\n chunks.push(ulaw.subarray(i, i + CHUNK_SIZE));\n }\n return chunks;\n}\n\n/**\n * holdAudio 설정값에 따라 hold audio 청크를 로드한다.\n */\nexport function loadHoldAudio(source: true | string | Buffer): Buffer[] {\n if (source === true) {\n return generateComfortTone();\n }\n\n if (Buffer.isBuffer(source)) {\n const chunks: Buffer[] = [];\n for (let i = 0; i < source.length; i += CHUNK_SIZE) {\n chunks.push(source.subarray(i, i + CHUNK_SIZE));\n }\n return chunks;\n }\n\n if (typeof source === 'string') {\n const data = fs.readFileSync(source);\n\n // WAV header 파싱\n const riff = data.toString('ascii', 0, 4);\n if (riff !== 'RIFF') {\n throw new Error(`지원하지 않는 파일 형식입니다: ${source}`);\n }\n\n // fmt chunk 찾기\n let offset = 12;\n let channels = 1;\n let sampleRate = 8000;\n let bitsPerSample = 16;\n let pcmData: Buffer | null = null;\n\n while (offset < data.length - 8) {\n const chunkId = data.toString('ascii', offset, offset + 4);\n const chunkSize = data.readUInt32LE(offset + 4);\n\n if (chunkId === 'fmt ') {\n channels = data.readUInt16LE(offset + 10);\n sampleRate = data.readUInt32LE(offset + 12);\n bitsPerSample = data.readUInt16LE(offset + 22);\n } else if (chunkId === 'data') {\n pcmData = data.subarray(offset + 8, offset + 8 + chunkSize);\n }\n\n offset += 8 + chunkSize;\n if (chunkSize % 2 !== 0) offset++; // padding\n }\n\n if (!pcmData) {\n throw new Error(`WAV data chunk을 찾을 수 없습니다: ${source}`);\n }\n if (bitsPerSample !== 16) {\n throw new Error(`16-bit PCM wav만 지원합니다 (현재: ${bitsPerSample}-bit)`);\n }\n\n // 스테레오 → 모노\n if (channels === 2) {\n const monoLen = pcmData.length / 2;\n const mono = Buffer.alloc(monoLen);\n for (let i = 0; i < monoLen / 2; i++) {\n mono.writeInt16LE(pcmData.readInt16LE(i * 4), i * 2);\n }\n pcmData = mono;\n }\n\n // 리샘플링\n if (sampleRate !== SAMPLE_RATE) {\n pcmData = resamplePcm16(pcmData, sampleRate, SAMPLE_RATE);\n }\n\n const ulaw = pcm16ToUlaw(pcmData);\n const chunks: Buffer[] = [];\n for (let i = 0; i < ulaw.length; i += CHUNK_SIZE) {\n chunks.push(ulaw.subarray(i, i + CHUNK_SIZE));\n }\n return chunks;\n }\n\n throw new TypeError(`지원하지 않는 holdAudio 타입: ${typeof source}`);\n}\n\n/**\n * Tool 실행 중 대기 오디오를 루프 재생한다.\n */\nexport class HoldAudioPlayer {\n private readonly _call: CallSession;\n private readonly _chunks: Buffer[];\n private _timer: ReturnType<typeof setInterval> | null = null;\n private _index = 0;\n\n constructor(call: CallSession, chunks: Buffer[]) {\n this._call = call;\n this._chunks = chunks;\n }\n\n start(): void {\n if (this._timer !== null) return;\n this._index = 0;\n this._timer = setInterval(() => {\n if (this._index >= this._chunks.length) {\n this._index = 0; // 루프\n }\n const chunk = this._chunks[this._index++];\n if (chunk) {\n this._call.sendAudio(chunk);\n }\n }, 20); // 20ms pacing\n }\n\n stop(): void {\n if (this._timer === null) return;\n clearInterval(this._timer);\n this._timer = null;\n this._call.clearAudio();\n }\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 { applyUlawGain, 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 { loadHoldAudio } from './hold-audio.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\n/** Tool 실행 관련 설정. */\nexport interface ToolConfig {\n /** Tool 실행 중 재생할 hold audio. true=기본 차임, string=wav 파일 경로, Buffer=raw ulaw. */\n holdAudio?: boolean | string | Buffer;\n}\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 /** Tool 실행 관련 설정. */\n toolConfig?: ToolConfig;\n /**\n * Gain applied to inbound audio (caller → AI). 1.0 = pass-through (default), 0 = mute, 2.0 = 2x amplify.\n * AI/STT receive the gained audio, and recording captures it post-gain.\n */\n rxGain?: number;\n /**\n * Gain applied to outbound audio (AI → caller). 1.0 = pass-through (default), 0 = mute, 2.0 = 2x amplify.\n * The caller hears the gained audio, and recording captures it post-gain.\n */\n txGain?: number;\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 private _holdAudioChunks: Buffer[] | null = null;\n private _rxGain: number;\n private _txGain: number;\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 this._rxGain = ClawOpsAgent._validateGain('rxGain', options.rxGain ?? 1.0);\n this._txGain = ClawOpsAgent._validateGain('txGain', options.txGain ?? 1.0);\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 if (options.toolConfig?.holdAudio) {\n this._holdAudioChunks = loadHoldAudio(options.toolConfig.holdAudio as true | string | Buffer);\n }\n }\n\n private static _validateGain(name: string, gain: number): number {\n if (typeof gain !== 'number' || !Number.isFinite(gain) || gain < 0) {\n throw new AgentError(`${name}=${gain} must be a finite number >= 0`);\n }\n return gain;\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._safeStartCallSession(session, mediaUrl, callId);\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._safeStartCallSession(session, mediaUrl, callId);\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 /**\n * _startCallSession 의 예외를 잡아 control WS 로 call.session_failed 전송한다.\n *\n * OpenAI/Gemini API 키 누락 등 session.start() 단계 실패는 media WS connect 에\n * 도달하지 못해 call-engine 이 30 초간 무음 통화를 유지하게 만든다. 서버에 즉시\n * 알려서 fail-fast 시키고 _activeSessions 에서 정리한다.\n */\n private _safeStartCallSession(session: CallSession, mediaWsUrl: string, callId: string): void {\n this._startCallSession(session, mediaWsUrl).catch((err: unknown) => {\n const error = err as Error;\n this._log.error({ err }, 'Session start failed for %s', callId);\n if (this._controlWs) {\n try {\n this._controlWs.send({\n event: 'call.session_failed',\n callId,\n reason: error?.name ?? 'Error',\n message: error?.message ?? String(err),\n });\n } catch {\n // best-effort\n }\n }\n this._activeSessions.delete(callId);\n this._callSessions.delete(callId);\n });\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 let latestMediaTs = 0;\n\n // Bind transport functions to session — sessions send ulaw bytes directly\n session._bindTransport(\n (audio: Buffer) => {\n const gained = applyUlawGain(audio, this._txGain);\n if (recorder) {\n recorder.writeOutbound(ulawToPcm16(gained), latestMediaTs);\n }\n mediaWs.sendAudio(gained.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 session._transferFn = (params) => this._controlWs!.requestTransfer(session.callId, params);\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 if (\n this._holdAudioChunks &&\n 'setHoldAudio' in sessionHandler &&\n typeof sessionHandler.setHoldAudio === 'function'\n ) {\n sessionHandler.setHoldAudio(this._holdAudioChunks);\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 latestMediaTs = timestamp;\n const gained = applyUlawGain(ulawAudio, this._rxGain);\n if (recorder) {\n recorder.writeInbound(ulawToPcm16(gained), timestamp);\n }\n if (sessionHandler) {\n sessionHandler.feedAudio(gained, timestamp);\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\nconst TRANSFER_CALL = {\n name: 'transfer_call',\n description:\n 'Transfer the current call to another phone number. Use for blind transfer (direct handoff) or warm transfer (with whisper message to the target).',\n parameters: {\n type: 'object' as const,\n properties: {\n to: { type: 'string' as const, description: 'Phone number to transfer to' },\n mode: { type: 'string' as const, enum: ['blind', 'warm'], description: 'blind: direct transfer (default), warm: play whisper to target first' },\n after_transfer: { type: 'string' as const, enum: ['terminate', 'return'], description: 'terminate: end AI session (default), return: AI resumes after transfer ends' },\n whisper: { type: 'string' as const, description: 'Message to speak to transfer target before connecting customer (warm mode only)' },\n caller_id: { type: 'string' as const, description: 'Override caller ID for the transfer leg' },\n timeout: { type: 'integer' as const, description: 'Seconds to wait for transfer target to answer (default 30)' },\n },\n required: ['to'] as string[],\n },\n} as const;\n\ntype NeutralSchema = typeof HANG_UP | typeof COLLECT_DTMF | typeof SEND_DTMF | typeof TRANSFER_CALL;\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 [BuiltinTool.TRANSFER_CALL, TRANSFER_CALL],\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 if (funcName === 'transfer_call') {\n try {\n // Fire-and-forget: transfer 요청만 보내고 즉시 반환.\n // call-engine이 transfer 시작 시 media WS를 닫으므로,\n // 결과를 await하면 LLM 세션이 먼저 종료된다.\n call.transfer(args['to'] as string, {\n mode: (args['mode'] as 'blind' | 'warm') ?? undefined,\n afterTransfer: (args['after_transfer'] as 'terminate' | 'return') ?? undefined,\n whisper: args['whisper'] as string ?? undefined,\n callerId: args['caller_id'] as string ?? undefined,\n timeout: args['timeout'] as number ?? undefined,\n }).catch(() => {});\n return JSON.stringify({ status: 'transfer_initiated' });\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 { HoldAudioPlayer } from '../hold-audio.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 _holdAudioChunks: Buffer[] | 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 /** Tool 실행 중 재생할 hold audio 청크를 설정한다. */\n setHoldAudio(chunks: Buffer[]): void {\n this._holdAudioChunks = chunks;\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\n const player =\n this._holdAudioChunks && this._callSession\n ? new HoldAudioPlayer(this._callSession, this._holdAudioChunks)\n : null;\n player?.start();\n\n let result: unknown;\n try {\n result = await this._tools.call(name, args);\n } finally {\n player?.stop();\n }\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 // 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 { BuiltinTool } from '../../builtin-tool.js';\nimport type { Logger } from 'pino';\nimport { NOOP_LOGGER } from '../../logger.js';\nimport { HoldAudioPlayer } from '../../hold-audio.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 수신 시점의 media timestamp\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-2' */\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 // Hold audio — tool 실행 중 대기음\n private _holdAudioChunks: Buffer[] | null = null;\n\n constructor(options: OpenAIRealtimeOptions = {}) {\n this._apiKey = options.apiKey ?? process.env['OPENAI_API_KEY'] ?? '';\n if (!this._apiKey) {\n throw new Error(\n 'OpenAI API key is required. Set OPENAI_API_KEY env var or pass apiKey option.',\n );\n }\n this._systemPrompt = options.systemPrompt ?? '';\n this._model = options.model ?? 'gpt-realtime-2';\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 /** Tool 실행 중 재생할 hold audio 청크를 설정한다. */\n setHoldAudio(chunks: Buffer[]): void {\n this._holdAudioChunks = chunks;\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 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 },\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, timestamp?: number): void {\n this._latestMediaTs = timestamp ?? this._latestMediaTs;\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 type: 'realtime',\n output_modalities: ['audio'],\n instructions: this._systemPrompt,\n audio: {\n input: {\n format: { type: 'audio/pcmu' },\n noise_reduction: { type: 'far_field' },\n transcription: {\n model: 'gpt-realtime-whisper',\n language: this._language,\n },\n turn_detection: this._turnDetection,\n },\n output: {\n format: { type: 'audio/pcmu' },\n voice: this._voice,\n },\n },\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.output_audio.delta': {\n this._handleAudioDelta(msg);\n break;\n }\n case 'response.output_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.output_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,\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 // 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 - 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 const player =\n this._holdAudioChunks && this._call\n ? new HoldAudioPlayer(this._call, this._holdAudioChunks)\n : null;\n player?.start();\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 } finally {\n player?.stop();\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 { HoldAudioPlayer } from '../../hold-audio.js';\nimport {\n BUILTIN_TOOL_NAMES,\n executeBuiltinTool,\n getBuiltinToolSchemas,\n} 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-3.1-flash-live-preview' */\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 /** Gemini VAD config. @google/genai RealtimeInputConfig 구조 그대로 전달. */\n realtimeInputConfig?: Record<string, unknown>;\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 private _realtimeInputConfig: Record<string, unknown> | null;\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 _pendingToolCall: LiveServerToolCall | null = null;\n private _toolDrainTimer: ReturnType<typeof setTimeout> | null = null;\n private _lastAudioTime = 0;\n private _holdAudioChunks: Buffer[] | null = null;\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-3.1-flash-live-preview';\n this._voice = options.voice ?? 'Kore';\n this._language = options.language ?? 'ko';\n this._greeting = options.greeting ?? true;\n this._realtimeInputConfig = options.realtimeInputConfig ?? null;\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 /** Tool 실행 중 재생할 hold audio 청크를 설정한다. */\n setHoldAudio(chunks: Buffer[]): void {\n this._holdAudioChunks = chunks;\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 // @google/genai의 conditional exports 타입이 bundler 모드에서\n // live 프로퍼티를 인식하지 못하므로 node 엔트리 직접 import\n const { GoogleGenAI } = await import('@google/genai/node');\n const client = this._apiKey ? new GoogleGenAI({ apiKey: this._apiKey }) : new GoogleGenAI({});\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._realtimeInputConfig) {\n config['realtimeInputConfig'] = this._realtimeInputConfig;\n }\n\n if (this._systemPrompt) {\n config['systemInstruction'] = {\n parts: [{ text: this._systemPrompt }],\n };\n }\n\n // Tools\n const toolSchemas = this._buildToolSchemas();\n if (toolSchemas.length > 0) {\n config['tools'] = [{ functionDeclarations: toolSchemas }];\n }\n\n this._log.debug({ config }, 'Gemini SDK final config');\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(\n { code: (ev as { code?: number })?.code ?? 'unknown' },\n 'Gemini connection closed',\n );\n this._closed = true;\n },\n },\n });\n\n // Send greeting\n if (this._greeting) {\n this._session.sendRealtimeInput({ text: '인사해 주세요.' });\n }\n }\n\n feedAudio(audio: Buffer): void {\n if (this._session && !this._closed) {\n // G.711 ulaw 8kHz → PCM16 8kHz → PCM16 16kHz\n const pcm8k = ulawToPcm16(audio);\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.sendRealtimeInput({ text: `[DTMF 입력: ${digits}]` });\n }\n }\n\n async stop(): Promise<void> {\n this._closed = true;\n if (this._toolDrainTimer) {\n clearTimeout(this._toolDrainTimer);\n this._toolDrainTimer = null;\n }\n this._pendingToolCall = null;\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 if (this._pendingToolCall) this._lastAudioTime = Date.now();\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 — debounce로 남은 오디오 drain 후 실행\n if (msg.toolCall) {\n this._pendingToolCall = msg.toolCall;\n this._scheduleToolExecution();\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 this._pendingToolCall = null;\n if (this._toolDrainTimer) {\n clearTimeout(this._toolDrainTimer);\n this._toolDrainTimer = null;\n }\n }\n }\n\n private _handleAudioData(b64Data: string): void {\n if (!this._call) return;\n\n const pcm24k = Buffer.from(b64Data, 'base64');\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 // Gemini는 tool_call 후에도 오디오를 계속 보내므로, 이 시간 내 응답이 없으면 drain 완료로 간주\n private static readonly TOOL_DRAIN_TIMEOUT = 300;\n\n private _scheduleToolExecution(): void {\n if (this._toolDrainTimer) return;\n this._lastAudioTime = Date.now();\n this._toolDrainTimer = setTimeout(() => {\n this._toolDrainTimer = null;\n if (Date.now() - this._lastAudioTime < GeminiRealtime.TOOL_DRAIN_TIMEOUT) {\n // 아직 오디오가 오고 있음 — 재스케줄\n this._scheduleToolExecution();\n return;\n }\n if (this._pendingToolCall) {\n const tc = this._pendingToolCall;\n this._pendingToolCall = null;\n this._handleToolCall(tc);\n }\n }, GeminiRealtime.TOOL_DRAIN_TIMEOUT);\n }\n\n private async _handleToolCall(toolCall: LiveServerToolCall): Promise<void> {\n const functionCalls = toolCall.functionCalls;\n if (!functionCalls) return;\n\n const responses: Array<Record<string, unknown>> = [];\n\n const player =\n this._holdAudioChunks && this._call\n ? new HoldAudioPlayer(this._call, this._holdAudioChunks)\n : null;\n player?.start();\n\n try {\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(\n name,\n args as Record<string, unknown>,\n this._call,\n );\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 } finally {\n player?.stop();\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 }\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 apiKey = this._options.apiKey ?? process.env['GOOGLE_API_KEY'];\n const client = apiKey ? new GoogleGenAI({ apiKey }) : new GoogleGenAI();\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"]}
|
|
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/hold-audio.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/buffering-call.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","silence","VERSION","os","digit","BuiltinTool","SAMPLE_RATE","fs2","DEFAULT_BASE_URL","AgentError","AgentConnectionError","result"],"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 * Apply multiplicative gain to PCM16 little-endian audio.\n * gain=1.0 is pass-through, 0 is mute, 2.0 is 2x amplification (clipped to int16 range).\n */\nexport function applyPcm16Gain(pcm: Buffer, gain: number): Buffer {\n if (!pcm.length) return Buffer.alloc(0);\n if (gain === 1.0) return pcm;\n if (!Number.isFinite(gain) || gain < 0) {\n throw new Error('gain must be a finite number >= 0');\n }\n const nSamples = pcm.length >> 1;\n const out = Buffer.alloc(nSamples * 2);\n for (let i = 0; i < nSamples; i++) {\n let value = Math.round(pcm.readInt16LE(i * 2) * gain);\n if (value > 32767) value = 32767;\n else if (value < -32768) value = -32768;\n out.writeInt16LE(value, i * 2);\n }\n return out;\n}\n\n/**\n * Apply multiplicative gain to G.711 mu-law audio.\n */\nexport function applyUlawGain(ulaw: Buffer, gain: number): Buffer {\n if (!ulaw.length) return Buffer.alloc(0);\n if (gain === 1.0) return ulaw;\n return pcm16ToUlaw(applyPcm16Gain(ulawToPcm16(ulaw), gain));\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 _transferResolvers = new Map<string, {\n resolve: (value: Record<string, unknown>) => void;\n reject: (reason: Error) => void;\n }>();\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 /** Request a call transfer and wait for the result. */\n async requestTransfer(callId: string, params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return new Promise((resolve, reject) => {\n const timeout = ((params.timeout as number) || 30) + 10;\n const timer = setTimeout(() => {\n this._transferResolvers.delete(callId);\n reject(new Error('transfer timeout'));\n }, timeout * 1000);\n\n this._transferResolvers.set(callId, {\n resolve: (value) => { clearTimeout(timer); resolve(value); },\n reject: (reason) => { clearTimeout(timer); reject(reason); },\n });\n\n this.send({\n event: 'call.transfer',\n callId,\n transfer: params,\n });\n });\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 for (const [, resolver] of this._transferResolvers) {\n resolver.reject(new Error('connection closed'));\n }\n this._transferResolvers.clear();\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 // Resolve pending transfer promises on terminal transfer events\n if (['call.transfer.completed', 'call.transfer.failed'].includes(event.event)) {\n const callId = event.callId as string;\n const resolver = this._transferResolvers.get(callId);\n if (resolver) {\n this._transferResolvers.delete(callId);\n resolver.resolve((event.transfer as Record<string, unknown>) || {});\n }\n }\n\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 * Inbound/outbound 모두 media timestamp 기반 timeline에 기록한다.\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 _started = false\n private _baseTs: number | null = null\n private _outCursor = 0\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._started = true\n this._log.info('Recording started: %s', this._dir);\n }\n\n private _timestampToBytes(mediaTsMs: number): number {\n if (this._baseTs === null) {\n this._baseTs = mediaTsMs\n }\n const target = Math.floor(((mediaTsMs - this._baseTs) * BYTES_PER_SECOND) / 1000)\n return Math.max(0, target - (target % 2))\n }\n\n private _padSilence(fd: number, written: number, target: number): number {\n let gap = target - 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 data = data.subarray(0, data.length - (data.length % 2))\n if (data.length === 0) return\n const filePos = 44 + trackPos\n\n if (trackPos < this._mixWritten) {\n // Overlap: read existing, mix, write back\n let overlap = Math.min(data.length, this._mixWritten - trackPos)\n overlap = overlap - (overlap % 2)\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, mediaTsMs: number = 0): void {\n if (!this._started || this._fdIn === null) return\n try {\n pcm16_8k = pcm16_8k.subarray(0, pcm16_8k.length - (pcm16_8k.length % 2))\n if (pcm16_8k.length === 0) return\n const target = this._timestampToBytes(mediaTsMs)\n const gap = this._padSilence(this._fdIn, this._inWritten, target)\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, mediaTsMs?: number): void {\n if (!this._started || this._fdOut === null) return\n try {\n pcm16_8k = pcm16_8k.subarray(0, pcm16_8k.length - (pcm16_8k.length % 2))\n if (pcm16_8k.length === 0) return\n let target = this._outCursor\n if (mediaTsMs !== undefined) {\n target = Math.max(target, this._timestampToBytes(mediaTsMs))\n }\n const gap = this._padSilence(this._fdOut, this._outWritten, target)\n this._outWritten += gap\n const posBefore = this._outWritten\n fs.writeSync(this._fdOut, pcm16_8k)\n this._outWritten += pcm16_8k.length\n this._outCursor = this._outWritten\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 interface TransferFn {\n (params: Record<string, unknown>): Promise<Record<string, unknown>>;\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 */ _transferFn: TransferFn | 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 /** Transfer the call to another destination. */\n async transfer(\n to: string,\n options?: {\n mode?: 'blind' | 'warm';\n afterTransfer?: 'terminate' | 'return';\n holdMedia?: string;\n whisper?: string;\n context?: Record<string, unknown>;\n callerId?: string;\n timeout?: number;\n },\n ): Promise<Record<string, unknown>> {\n if (!this._transferFn) {\n throw new Error('transfer not available');\n }\n return this._transferFn({\n to,\n mode: options?.mode ?? 'blind',\n afterTransfer: options?.afterTransfer ?? 'terminate',\n holdMedia: options?.holdMedia ?? 'ringback',\n whisper: options?.whisper ?? null,\n context: options?.context ?? null,\n callerId: options?.callerId ?? null,\n timeout: options?.timeout ?? 30,\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 TRANSFER_CALL = 'transfer_call',\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 BuiltinTool.TRANSFER_CALL,\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 실행 중 대기 오디오 재생.\n *\n * HoldAudioPlayer는 tool 실행 동안 caller에게 대기음을 루프 재생한다.\n */\n\nimport * as fs from 'fs';\nimport { pcm16ToUlaw, resamplePcm16 } from './audio';\nimport type { CallSession } from './session';\n\nconst CHUNK_SIZE = 160; // 20ms @ 8kHz ulaw\nconst SAMPLE_RATE = 8000;\n\n// ── Bell note generation ─────────────────────────────────────\n\ninterface Partial {\n freqRatio: number;\n amplitude: number;\n decayRate: number;\n}\n\nconst BELL_PARTIALS: Partial[] = [\n { freqRatio: 1.0, amplitude: 1.0, decayRate: 1.2 },\n { freqRatio: 2.76, amplitude: 0.5, decayRate: 2.5 },\n { freqRatio: 5.4, amplitude: 0.25, decayRate: 4.0 },\n];\n\nfunction bellNote(freq: number, durationMs: number, volume: number): Int16Array {\n const n = (SAMPLE_RATE * durationMs) / 1000 | 0;\n const attackSamples = (0.003 * SAMPLE_RATE) | 0; // 3ms attack\n const samples = new Int16Array(n);\n\n for (let i = 0; i < n; i++) {\n const t = i / SAMPLE_RATE;\n let val = 0;\n for (const p of BELL_PARTIALS) {\n const f = freq * p.freqRatio;\n if (f >= SAMPLE_RATE / 2) continue; // Nyquist\n const env = p.amplitude * Math.exp(-p.decayRate * t * (1000 / durationMs));\n val += env * Math.sin(2 * Math.PI * f * t);\n }\n if (i < attackSamples) {\n val *= i / attackSamples;\n }\n samples[i] = Math.max(-32768, Math.min(32767, (volume * 32767 * val) | 0));\n }\n return samples;\n}\n\nfunction silence(durationMs: number): Int16Array {\n return new Int16Array(((SAMPLE_RATE * durationMs) / 1000) | 0);\n}\n\nfunction int16ArrayToBuffer(samples: Int16Array): Buffer {\n const buf = Buffer.alloc(samples.length * 2);\n for (let i = 0; i < samples.length; i++) {\n buf.writeInt16LE(samples[i]!, i * 2);\n }\n return buf;\n}\n\nfunction concatInt16Arrays(...arrays: Int16Array[]): Int16Array {\n let total = 0;\n for (const a of arrays) total += a.length;\n const result = new Int16Array(total);\n let offset = 0;\n for (const a of arrays) {\n result.set(a, offset);\n offset += a.length;\n }\n return result;\n}\n\n// ── C5 Pentatonic scale ──────────────────────────────────────\n\nconst PENTATONIC_C5 = {\n C5: 523.25,\n D5: 587.33,\n E5: 659.25,\n G5: 783.99,\n A5: 880.0,\n C6: 1046.5,\n} as const;\n\n// ── Public API ───────────────────────────────────────────────\n\n/**\n * 뮤직박스 스타일 대기음 생성 (C5 펜타토닉 차임 멜로디).\n * 약 13초 길이가 루프 재생된다.\n */\nexport function generateComfortTone(volume = 0.12): Buffer[] {\n const p = PENTATONIC_C5;\n\n const melody: Array<[number, number]> = [\n [p.E5, 450], [p.G5, 450], [p.A5, 450], [p.C6, 600],\n [0, 800],\n [p.A5, 400], [p.G5, 400], [p.E5, 400], [p.D5, 600],\n [0, 2500],\n [p.C5, 500], [p.E5, 500], [p.C6, 700],\n [0, 2500],\n ];\n\n const parts: Int16Array[] = [];\n for (const [freq, durMs] of melody) {\n if (freq === 0) {\n parts.push(silence(durMs));\n } else {\n parts.push(bellNote(freq, durMs, volume));\n parts.push(silence(150)); // 음 사이 간격\n }\n }\n\n const pcm = int16ArrayToBuffer(concatInt16Arrays(...parts));\n const ulaw = pcm16ToUlaw(pcm);\n\n const chunks: Buffer[] = [];\n for (let i = 0; i < ulaw.length; i += CHUNK_SIZE) {\n chunks.push(ulaw.subarray(i, i + CHUNK_SIZE));\n }\n return chunks;\n}\n\n/**\n * holdAudio 설정값에 따라 hold audio 청크를 로드한다.\n */\nexport function loadHoldAudio(source: true | string | Buffer): Buffer[] {\n if (source === true) {\n return generateComfortTone();\n }\n\n if (Buffer.isBuffer(source)) {\n const chunks: Buffer[] = [];\n for (let i = 0; i < source.length; i += CHUNK_SIZE) {\n chunks.push(source.subarray(i, i + CHUNK_SIZE));\n }\n return chunks;\n }\n\n if (typeof source === 'string') {\n const data = fs.readFileSync(source);\n\n // WAV header 파싱\n const riff = data.toString('ascii', 0, 4);\n if (riff !== 'RIFF') {\n throw new Error(`지원하지 않는 파일 형식입니다: ${source}`);\n }\n\n // fmt chunk 찾기\n let offset = 12;\n let channels = 1;\n let sampleRate = 8000;\n let bitsPerSample = 16;\n let pcmData: Buffer | null = null;\n\n while (offset < data.length - 8) {\n const chunkId = data.toString('ascii', offset, offset + 4);\n const chunkSize = data.readUInt32LE(offset + 4);\n\n if (chunkId === 'fmt ') {\n channels = data.readUInt16LE(offset + 10);\n sampleRate = data.readUInt32LE(offset + 12);\n bitsPerSample = data.readUInt16LE(offset + 22);\n } else if (chunkId === 'data') {\n pcmData = data.subarray(offset + 8, offset + 8 + chunkSize);\n }\n\n offset += 8 + chunkSize;\n if (chunkSize % 2 !== 0) offset++; // padding\n }\n\n if (!pcmData) {\n throw new Error(`WAV data chunk을 찾을 수 없습니다: ${source}`);\n }\n if (bitsPerSample !== 16) {\n throw new Error(`16-bit PCM wav만 지원합니다 (현재: ${bitsPerSample}-bit)`);\n }\n\n // 스테레오 → 모노\n if (channels === 2) {\n const monoLen = pcmData.length / 2;\n const mono = Buffer.alloc(monoLen);\n for (let i = 0; i < monoLen / 2; i++) {\n mono.writeInt16LE(pcmData.readInt16LE(i * 4), i * 2);\n }\n pcmData = mono;\n }\n\n // 리샘플링\n if (sampleRate !== SAMPLE_RATE) {\n pcmData = resamplePcm16(pcmData, sampleRate, SAMPLE_RATE);\n }\n\n const ulaw = pcm16ToUlaw(pcmData);\n const chunks: Buffer[] = [];\n for (let i = 0; i < ulaw.length; i += CHUNK_SIZE) {\n chunks.push(ulaw.subarray(i, i + CHUNK_SIZE));\n }\n return chunks;\n }\n\n throw new TypeError(`지원하지 않는 holdAudio 타입: ${typeof source}`);\n}\n\n/**\n * Tool 실행 중 대기 오디오를 루프 재생한다.\n */\nexport class HoldAudioPlayer {\n private readonly _call: CallSession;\n private readonly _chunks: Buffer[];\n private _timer: ReturnType<typeof setInterval> | null = null;\n private _index = 0;\n\n constructor(call: CallSession, chunks: Buffer[]) {\n this._call = call;\n this._chunks = chunks;\n }\n\n start(): void {\n if (this._timer !== null) return;\n this._index = 0;\n this._timer = setInterval(() => {\n if (this._index >= this._chunks.length) {\n this._index = 0; // 루프\n }\n const chunk = this._chunks[this._index++];\n if (chunk) {\n this._call.sendAudio(chunk);\n }\n }, 20); // 20ms pacing\n }\n\n stop(): void {\n if (this._timer === null) return;\n clearInterval(this._timer);\n this._timer = null;\n this._call.clearAudio();\n }\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 { applyUlawGain, 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 { loadHoldAudio } from './hold-audio.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\n/** Tool 실행 관련 설정. */\nexport interface ToolConfig {\n /** Tool 실행 중 재생할 hold audio. true=기본 차임, string=wav 파일 경로, Buffer=raw ulaw. */\n holdAudio?: boolean | string | Buffer;\n}\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 /** Tool 실행 관련 설정. */\n toolConfig?: ToolConfig;\n /**\n * Gain applied to inbound audio (caller → AI). 1.0 = pass-through (default), 0 = mute, 2.0 = 2x amplify.\n * AI/STT receive the gained audio, and recording captures it post-gain.\n */\n rxGain?: number;\n /**\n * Gain applied to outbound audio (AI → caller). 1.0 = pass-through (default), 0 = mute, 2.0 = 2x amplify.\n * The caller hears the gained audio, and recording captures it post-gain.\n */\n txGain?: number;\n /**\n * outbound_ready 시점에 session.prewarm() 을 백그라운드로 시작할지 여부.\n * false 면 기존 start() 단일 경로로 동작 (prewarm 비활성). Default: true.\n * Python SDK 의 `prewarm_enabled` 과 mirror.\n */\n prewarmEnabled?: boolean;\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 private _holdAudioChunks: Buffer[] | null = null;\n private _rxGain: number;\n private _txGain: number;\n private _prewarmTasks = new Map<string, Promise<void>>();\n private _prewarmFailed = new Set<string>();\n /** prewarm 세션이 실제 CallSession 에 attach 완료된 callId. attached 이후의 stop() 은 정상 종료 경로가 책임진다. */\n private _prewarmAttached = new Set<string>();\n private _prewarmEnabled: boolean;\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 this._rxGain = ClawOpsAgent._validateGain('rxGain', options.rxGain ?? 1.0);\n this._txGain = ClawOpsAgent._validateGain('txGain', options.txGain ?? 1.0);\n this._prewarmEnabled = options.prewarmEnabled ?? true;\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 if (options.toolConfig?.holdAudio) {\n this._holdAudioChunks = loadHoldAudio(options.toolConfig.holdAudio as true | string | Buffer);\n }\n }\n\n private static _validateGain(name: string, gain: number): number {\n if (typeof gain !== 'number' || !Number.isFinite(gain) || gain < 0) {\n throw new AgentError(`${name}=${gain} must be a finite number >= 0`);\n }\n return gain;\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\n // originate 직후 prewarm 을 시작한다 — ring 구간(answer 이전)에 LLM 연결 +\n // greeting 생성을 흡수해 answer→first-audio latency 를 줄인다. call.ringing\n // 이벤트는 트렁크가 SIP 18x 를 안 올리면 도착하지 않을 수 있어 신뢰하지 않는다.\n // ringing/outbound_ready 핸들러의 prewarm 시작은 이 시점을 놓쳤을 때의 fallback.\n if (this._prewarmEnabled) {\n this._startPrewarm(callSession.callId);\n }\n\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._safeStartCallSession(session, mediaUrl, callId);\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 void this._cleanupPrewarm(callId);\n }\n\n /**\n * Drop prewarm bookkeeping for a callId. Used on hangup/failure paths.\n *\n * prewarm 이 진행 중이거나 완료됐지만 attach 전에 호출되면 LLM WS 가 leak 되므로\n * race 후 session.stop() 으로 정리한다. (TS 에는 Promise.cancel 이 없어 Python\n * 의 task.cancel() 등가물은 _session.stop() 호출이다.)\n *\n * 이미 attach 된 callId 면 stop() 을 호출하지 않는다 — 정상 종료 경로 (call-session\n * finally) 가 책임지기 때문이다.\n */\n private async _cleanupPrewarm(callId: string): Promise<void> {\n const task = this._prewarmTasks.get(callId);\n const attached = this._prewarmAttached.has(callId);\n this._prewarmTasks.delete(callId);\n this._prewarmFailed.delete(callId);\n this._prewarmAttached.delete(callId);\n if (!task || attached) return;\n // prewarm 미완료 → 완료까지 await 한 뒤 stop(); 실패 시에도 stop() 시도.\n try {\n await task;\n } catch {\n /* prewarm error path already logged */\n }\n try {\n await this._session.stop();\n } catch (err) {\n this._log.warn({ err, callId }, 'prewarm cleanup stop() failed');\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 // prewarm 은 보통 _handleRinging(ring 구간)에서 이미 시작됐다. _startPrewarm 은\n // idempotent 하므로 여기서의 호출은 ringing 이 오지 않은 경우의 fallback 으로만\n // 동작한다. _startCallSession 이 이 task 를 await 후 attach() 로 부착한다.\n // prewarmEnabled=false 면 skip → 기존 start() 경로.\n if (this._prewarmEnabled) {\n this._startPrewarm(callId);\n }\n\n if (mediaUrl) {\n this._log.info('Outbound call answered: %s -> %s (%s)', this._fromNumber, session.toNumber, callId);\n this._safeStartCallSession(session, mediaUrl, callId);\n }\n }\n\n /**\n * Start the LLM session prewarm task for the given callId. Safe to call\n * multiple times — only the first invocation starts the task. Failures are\n * recorded in _prewarmFailed so the call-session path can fall back to start().\n */\n private _startPrewarm(callId: string): void {\n if (this._prewarmTasks.has(callId)) return;\n const sessionHandler = this._session;\n if (typeof sessionHandler.prewarm !== 'function') return;\n\n const PREWARM_TIMEOUT_MS = 10_000;\n const t0 = Date.now();\n this._log.info(`[PREWARM-T] start call_id=${callId} t=${(t0 / 1000).toFixed(3)}`);\n const task = (async () => {\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n const timeout = new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => reject(new Error('prewarm timeout')),\n PREWARM_TIMEOUT_MS,\n );\n });\n await Promise.race([sessionHandler.prewarm(), timeout]);\n const elapsed = Date.now() - t0;\n this._log.info(`[PREWARM-T] done call_id=${callId} elapsed_ms=${elapsed}`);\n } catch (err) {\n const elapsed = Date.now() - t0;\n const reason = err instanceof Error ? err.message : String(err);\n this._log.warn(\n { err, callId },\n `[PREWARM-T] failed call_id=${callId} elapsed_ms=${elapsed} reason=${reason}`,\n );\n this._prewarmFailed.add(callId);\n } finally {\n if (timer) clearTimeout(timer);\n }\n })();\n this._prewarmTasks.set(callId, task);\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 // ring 구간(answer 이전)에 prewarm 을 미리 시작한다 — LLM WS 연결 +\n // greeting 생성을 ring 시간으로 흡수해 answer→first-audio latency 를 줄인다.\n // outbound_ready 에서의 prewarm 시작은 ringing 이 안 온 경우의 fallback.\n if (this._prewarmEnabled) {\n this._startPrewarm(callId);\n }\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 void this._cleanupPrewarm(callId);\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 /**\n * _startCallSession 의 예외를 잡아 control WS 로 call.session_failed 전송한다.\n *\n * OpenAI/Gemini API 키 누락 등 session.start() 단계 실패는 media WS connect 에\n * 도달하지 못해 call-engine 이 30 초간 무음 통화를 유지하게 만든다. 서버에 즉시\n * 알려서 fail-fast 시키고 _activeSessions 에서 정리한다.\n */\n private _safeStartCallSession(session: CallSession, mediaWsUrl: string, callId: string): void {\n this._startCallSession(session, mediaWsUrl).catch((err: unknown) => {\n const error = err as Error;\n this._log.error({ err }, 'Session start failed for %s', callId);\n if (this._controlWs) {\n try {\n this._controlWs.send({\n event: 'call.session_failed',\n callId,\n reason: error?.name ?? 'Error',\n message: error?.message ?? String(err),\n });\n } catch {\n // best-effort\n }\n }\n this._activeSessions.delete(callId);\n this._callSessions.delete(callId);\n });\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 let latestMediaTs = 0;\n\n // Bind transport functions to session — sessions send ulaw bytes directly\n session._bindTransport(\n (audio: Buffer) => {\n const gained = applyUlawGain(audio, this._txGain);\n if (recorder) {\n recorder.writeOutbound(ulawToPcm16(gained), latestMediaTs);\n }\n mediaWs.sendAudio(gained.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 session._transferFn = (params) => this._controlWs!.requestTransfer(session.callId, params);\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 if (\n this._holdAudioChunks &&\n 'setHoldAudio' in sessionHandler &&\n typeof sessionHandler.setHoldAudio === 'function'\n ) {\n sessionHandler.setHoldAudio(this._holdAudioChunks);\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 latestMediaTs = timestamp;\n const gained = applyUlawGain(ulawAudio, this._rxGain);\n if (recorder) {\n recorder.writeInbound(ulawToPcm16(gained), timestamp);\n }\n if (sessionHandler) {\n sessionHandler.feedAudio(gained, timestamp);\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 // If a prewarm task was kicked off earlier (outbound_ready hook),\n // await it and then attach() instead of doing a full start(). This\n // trims the LLM connect + handshake off the perceived first-audio\n // latency. Falls back to start() if prewarm failed/timed out.\n const prewarmTask = this._prewarmTasks.get(session.callId);\n if (prewarmTask && !this._prewarmFailed.has(session.callId)) {\n try {\n await prewarmTask;\n if (this._prewarmFailed.has(session.callId)) {\n await sessionHandler.start(session, sessionTools);\n } else {\n this._log.info(\n `[PREWARM-T] attach call_id=${session.callId} t=${(Date.now() / 1000).toFixed(3)}`,\n );\n await sessionHandler.attach(session);\n this._prewarmAttached.add(session.callId);\n }\n } catch (err) {\n this._log.warn(\n { err, callId: session.callId },\n 'prewarm/attach failed, falling back to start()',\n );\n // attach() throw 시 prewarmed LLM 세션이 살아있다. 두 번째 start() 가\n // 새 WS 를 열어 첫 세션이 leak 되지 않도록 먼저 stop() 정리.\n try { await sessionHandler.stop(); } catch { /* best-effort */ }\n await sessionHandler.start(session, sessionTools);\n }\n } else {\n await sessionHandler.start(session, sessionTools);\n }\n // 정상 경로에서는 attached 플래그를 정상 종료가 책임지지만, bookkeeping 만 정리.\n this._prewarmTasks.delete(session.callId);\n this._prewarmFailed.delete(session.callId);\n this._prewarmAttached.delete(session.callId);\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\nconst TRANSFER_CALL = {\n name: 'transfer_call',\n description:\n 'Transfer the current call to another phone number. Use for blind transfer (direct handoff) or warm transfer (with whisper message to the target).',\n parameters: {\n type: 'object' as const,\n properties: {\n to: { type: 'string' as const, description: 'Phone number to transfer to' },\n mode: { type: 'string' as const, enum: ['blind', 'warm'], description: 'blind: direct transfer (default), warm: play whisper to target first' },\n after_transfer: { type: 'string' as const, enum: ['terminate', 'return'], description: 'terminate: end AI session (default), return: AI resumes after transfer ends' },\n whisper: { type: 'string' as const, description: 'Message to speak to transfer target before connecting customer (warm mode only)' },\n caller_id: { type: 'string' as const, description: 'Override caller ID for the transfer leg' },\n timeout: { type: 'integer' as const, description: 'Seconds to wait for transfer target to answer (default 30)' },\n },\n required: ['to'] as string[],\n },\n} as const;\n\ntype NeutralSchema = typeof HANG_UP | typeof COLLECT_DTMF | typeof SEND_DTMF | typeof TRANSFER_CALL;\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 [BuiltinTool.TRANSFER_CALL, TRANSFER_CALL],\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 if (funcName === 'transfer_call') {\n try {\n // Fire-and-forget: transfer 요청만 보내고 즉시 반환.\n // call-engine이 transfer 시작 시 media WS를 닫으므로,\n // 결과를 await하면 LLM 세션이 먼저 종료된다.\n call.transfer(args['to'] as string, {\n mode: (args['mode'] as 'blind' | 'warm') ?? undefined,\n afterTransfer: (args['after_transfer'] as 'terminate' | 'return') ?? undefined,\n whisper: args['whisper'] as string ?? undefined,\n callerId: args['caller_id'] as string ?? undefined,\n timeout: args['timeout'] as number ?? undefined,\n }).catch(() => {});\n return JSON.stringify({ status: 'transfer_initiated' });\n } catch (e) {\n return `Error: ${e}`;\n }\n }\n return null;\n}\n","/**\n * prewarm 단계에서 사용되는 CallSession stub.\n *\n * Session 구현체가 sendAudio() 를 호출하면 메모리 버퍼에 누적한다.\n * attach() 시점에 drainBuffer() 로 꺼내 실제 CallSession 에 flush.\n *\n * Python SDK 의 `_BufferingCall` mirror.\n */\n\nimport type { CallSession } from '../session.js';\n\nclass MetricsStub {\n recordToolCall(): void {}\n recordInterrupt(): void {}\n recordToolError(): void {}\n}\n\nexport class BufferingCall {\n private _buffer: Buffer[] = [];\n private _droppedEvents: Record<string, number> = {};\n readonly metrics = new MetricsStub();\n\n async sendAudio(chunk: Buffer): Promise<void> {\n this._buffer.push(chunk);\n }\n\n /** clearAudio 도 prewarm 동안엔 no-op (드물긴 하지만 안전하게). */\n clearAudio(): void {\n this._buffer = [];\n }\n\n /**\n * transcript 등 lifecycle 이벤트는 prewarm 동안 무시한다. silent drop 은 디버깅이\n * 어려우므로 event name 별 카운터로 누적하고 attachBuffered() 시 한 번에 로깅한다.\n */\n _emit(...args: unknown[]): void {\n this._recordDropped(args);\n }\n\n async emit(...args: unknown[]): Promise<void> {\n this._recordDropped(args);\n }\n\n private _recordDropped(args: unknown[]): void {\n let eventName = '?';\n if (args.length > 0 && typeof args[0] === 'string') {\n eventName = args[0];\n }\n this._droppedEvents[eventName] = (this._droppedEvents[eventName] ?? 0) + 1;\n }\n\n recordToolCall(): void {}\n recordToolError(): void {}\n recordFirstResponse(): void {}\n recordBargeIn(): void {}\n\n drainBuffer(): Buffer[] {\n const out = this._buffer;\n this._buffer = [];\n return out;\n }\n\n drainDroppedEvents(): Record<string, number> {\n const out = this._droppedEvents;\n this._droppedEvents = {};\n return out;\n }\n}\n\n/**\n * prewarm → attach 전환 시 BufferingCall 에 쌓인 audio chunk 를 실제\n * CallSession 으로 flush 하는 공통 헬퍼. OpenAI / Gemini / PipelineSession\n * attach() 가 동일 패턴이므로 한 곳에서 관리한다.\n *\n * 반환값: 한 개 이상의 chunk 를 drain 했으면 true. drain 시 PREWARM-T first-audio\n * 마커를 한 번 emit 한다. drained 가 비어 있으면 false 를 반환하여 호출자(Session)\n * 가 첫 실시간 audio.delta 송출 시 logFirstRealtimeAudio() 로 한 번만 마커를 찍을\n * 수 있게 한다.\n */\nexport function attachBuffered(\n prev: BufferingCall | CallSession | null,\n next: CallSession,\n): boolean {\n if (!(prev instanceof BufferingCall)) {\n return false;\n }\n\n const drained = prev.drainBuffer();\n const flushed = drained.length > 0;\n const callId = (next as { callId?: string }).callId ?? '?';\n\n if (flushed) {\n // eslint-disable-next-line no-console\n console.info(\n `[PREWARM-T] first-audio call_id=${callId} ` +\n `t=${(process.hrtime.bigint() / 1_000_000n).toString()} ` +\n `buffered_chunks=${drained.length} source=prebuffer`,\n );\n }\n for (const chunk of drained) {\n next.sendAudio(chunk);\n }\n\n const dropped = prev.drainDroppedEvents();\n if (Object.keys(dropped).length > 0) {\n // eslint-disable-next-line no-console\n console.info(\n `[PREWARM] dropped events during prewarm call_id=${callId} events=${JSON.stringify(dropped)}`,\n );\n }\n return flushed;\n}\n\n/**\n * prewarm prebuffer 가 비어 있던 케이스에서 첫 실시간 audio chunk 송출 시 호출.\n * 호출자(Session)는 attachBuffered() 반환값과 자체 플래그로 한 번만 호출하도록\n * 가드해야 한다.\n */\nexport function logFirstRealtimeAudio(call: { callId?: string } | null): void {\n const callId = call?.callId ?? '?';\n // eslint-disable-next-line no-console\n console.info(\n `[PREWARM-T] first-audio call_id=${callId} ` +\n `t=${(process.hrtime.bigint() / 1_000_000n).toString()} ` +\n `buffered_chunks=0 source=realtime`,\n );\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 { HoldAudioPlayer } from '../hold-audio.js';\nimport { BUILTIN_TOOL_NAMES, executeBuiltinTool, getBuiltinToolSchemas } from './builtin-tool-schemas.js';\nimport { BufferingCall, attachBuffered } from './buffering-call.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 | BufferingCall | 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 _holdAudioChunks: Buffer[] | 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 /** Tool 실행 중 재생할 hold audio 청크를 설정한다. */\n setHoldAudio(chunks: Buffer[]): void {\n this._holdAudioChunks = chunks;\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 /**\n * Pre-bootstrap conversation state and (optionally) trigger greeting synthesis\n * before a real CallSession is attached. Audio chunks are buffered into a\n * BufferingCall until attach() flushes them.\n */\n async prewarm(tools?: ToolRegistry): Promise<void> {\n if (tools) this._tools = tools;\n this._callSession = new BufferingCall();\n this._running = true;\n this._conversation = [];\n this._log.info('PipelineSession prewarmed');\n\n if (this._systemPrompt) {\n this._conversation.push({\n role: 'system',\n content: this._systemPrompt,\n });\n }\n\n if (this._greeting) {\n this._generateGreeting().catch((err) => {\n this._log.error({ err }, 'Greeting error');\n });\n }\n\n this._runSttLoop().catch((err) => {\n this._log.error({ err }, 'STT loop error');\n });\n }\n\n /** Attach a real CallSession to the prewarmed session and flush buffered audio. */\n async attach(callSession: CallSession): Promise<void> {\n const prev = this._callSession;\n this._callSession = callSession;\n attachBuffered(prev, callSession);\n }\n\n async start(callSession: CallSession, tools?: ToolRegistry): Promise<void> {\n this._tools = tools ?? null;\n await this.prewarm();\n await this.attach(callSession);\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 && !(this._callSession instanceof BufferingCall)) {\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\n const player =\n this._holdAudioChunks && this._callSession && !(this._callSession instanceof BufferingCall)\n ? new HoldAudioPlayer(this._callSession, this._holdAudioChunks)\n : null;\n player?.start();\n\n let result: unknown;\n try {\n result = await this._tools.call(name, args);\n } finally {\n player?.stop();\n }\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 // 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 { BufferingCall, attachBuffered } from '../buffering-call.js';\nimport type { SessionTelemetry } from '../../telemetry.js';\nimport { BuiltinTool } from '../../builtin-tool.js';\nimport type { Logger } from 'pino';\nimport { NOOP_LOGGER } from '../../logger.js';\nimport { HoldAudioPlayer } from '../../hold-audio.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 수신 시점의 media timestamp\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-2' */\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 | BufferingCall | 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 // Hold audio — tool 실행 중 대기음\n private _holdAudioChunks: Buffer[] | null = null;\n\n constructor(options: OpenAIRealtimeOptions = {}) {\n this._apiKey = options.apiKey ?? process.env['OPENAI_API_KEY'] ?? '';\n if (!this._apiKey) {\n throw new Error(\n 'OpenAI API key is required. Set OPENAI_API_KEY env var or pass apiKey option.',\n );\n }\n this._systemPrompt = options.systemPrompt ?? '';\n this._model = options.model ?? 'gpt-realtime-2';\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 /** Tool 실행 중 재생할 hold audio 청크를 설정한다. */\n setHoldAudio(chunks: Buffer[]): void {\n this._holdAudioChunks = chunks;\n }\n\n /** Open WS + session.update + (optional) response.create without a CallSession. */\n async prewarm(tools?: ToolRegistry): Promise<void> {\n if (tools) this._tools = tools;\n this._call = new BufferingCall();\n this._closed = false;\n this._playback = null;\n this._latestMediaTs = 0;\n\n const { WebSocket } = await import('ws');\n const url = `${OPENAI_REALTIME_URL}${this._model}`;\n this._ws = new WebSocket(url, {\n headers: { Authorization: `Bearer ${this._apiKey}` },\n });\n\n return new Promise<void>((resolve, reject) => {\n const ws = this._ws!;\n ws.on('open', () => {\n this._sendSessionUpdate();\n this._log.info('OpenAI Realtime connected (prewarm)');\n if (this._greeting) {\n this._send({ type: 'response.create' });\n }\n resolve();\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 ws.on('close', () => {\n this._closed = true;\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 /** Attach a real CallSession to the prewarmed session and flush buffered audio. */\n async attach(callSession: CallSession): Promise<void> {\n const prev = this._call;\n this._call = callSession;\n attachBuffered(prev, callSession);\n }\n\n async start(callSession: CallSession, tools?: ToolRegistry): Promise<void> {\n if (tools) this._tools = tools;\n await this.prewarm();\n await this.attach(callSession);\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, timestamp?: number): void {\n this._latestMediaTs = timestamp ?? this._latestMediaTs;\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 // Best-effort close with a 2s timeout guard so prewarm-then-cancel\n // (missed/declined outbound) doesn't leak the upstream WS.\n const ws = this._ws;\n this._ws = null;\n await new Promise<void>((resolve) => {\n let done = false;\n const finish = (): void => {\n if (done) return;\n done = true;\n resolve();\n };\n const timer = setTimeout(finish, 2000);\n try {\n ws.on('close', () => {\n clearTimeout(timer);\n finish();\n });\n ws.close();\n } catch {\n clearTimeout(timer);\n finish();\n }\n });\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 type: 'realtime',\n output_modalities: ['audio'],\n instructions: this._systemPrompt,\n audio: {\n input: {\n format: { type: 'audio/pcmu' },\n noise_reduction: { type: 'far_field' },\n transcription: {\n model: 'gpt-realtime-whisper',\n language: this._language,\n },\n turn_detection: this._turnDetection,\n },\n output: {\n format: { type: 'audio/pcmu' },\n voice: this._voice,\n },\n },\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.output_audio.delta': {\n this._handleAudioDelta(msg);\n break;\n }\n case 'response.output_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.output_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,\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 // 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 - 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 && !(this._call instanceof BufferingCall)) {\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 const player =\n this._holdAudioChunks && this._call && !(this._call instanceof BufferingCall)\n ? new HoldAudioPlayer(this._call, this._holdAudioChunks)\n : null;\n player?.start();\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 } finally {\n player?.stop();\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 { BufferingCall, attachBuffered } from '../buffering-call.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 { HoldAudioPlayer } from '../../hold-audio.js';\nimport {\n BUILTIN_TOOL_NAMES,\n executeBuiltinTool,\n getBuiltinToolSchemas,\n} 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-3.1-flash-live-preview' */\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 /** Gemini VAD config. @google/genai RealtimeInputConfig 구조 그대로 전달. */\n realtimeInputConfig?: Record<string, unknown>;\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 private _realtimeInputConfig: Record<string, unknown> | null;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _session: any = null;\n private _call: CallSession | BufferingCall | 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 _pendingToolCall: LiveServerToolCall | null = null;\n private _toolDrainTimer: ReturnType<typeof setTimeout> | null = null;\n private _lastAudioTime = 0;\n private _holdAudioChunks: Buffer[] | null = null;\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-3.1-flash-live-preview';\n this._voice = options.voice ?? 'Kore';\n this._language = options.language ?? 'ko';\n this._greeting = options.greeting ?? true;\n this._realtimeInputConfig = options.realtimeInputConfig ?? null;\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 /** Tool 실행 중 재생할 hold audio 청크를 설정한다. */\n setHoldAudio(chunks: Buffer[]): void {\n this._holdAudioChunks = chunks;\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 /** Open Live session (no CallSession). Audio deltas accumulate into BufferingCall until attach(). */\n async prewarm(tools?: ToolRegistry): Promise<void> {\n if (tools) this._tools = tools;\n this._call = new BufferingCall();\n this._closed = false;\n this._sentAudioChunks = 0;\n this._audioRemainder = Buffer.alloc(0);\n\n // @google/genai의 conditional exports 타입이 bundler 모드에서\n // live 프로퍼티를 인식하지 못하므로 node 엔트리 직접 import\n const { GoogleGenAI } = await import('@google/genai/node');\n const client = this._apiKey ? new GoogleGenAI({ apiKey: this._apiKey }) : new GoogleGenAI({});\n\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._realtimeInputConfig) {\n config['realtimeInputConfig'] = this._realtimeInputConfig;\n }\n\n if (this._systemPrompt) {\n config['systemInstruction'] = {\n parts: [{ text: this._systemPrompt }],\n };\n }\n\n const toolSchemas = this._buildToolSchemas();\n if (toolSchemas.length > 0) {\n config['tools'] = [{ functionDeclarations: toolSchemas }];\n }\n\n this._log.debug({ config }, 'Gemini SDK final config');\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(\n { code: (ev as { code?: number })?.code ?? 'unknown' },\n 'Gemini connection closed',\n );\n this._closed = true;\n },\n },\n });\n this._log.info('Gemini Live connected (prewarm)');\n\n if (this._greeting) {\n this._session.sendRealtimeInput({ text: '인사해 주세요.' });\n }\n }\n\n /** Attach a real CallSession to the prewarmed session and flush buffered audio. */\n async attach(callSession: CallSession): Promise<void> {\n const prev = this._call;\n this._call = callSession;\n attachBuffered(prev, callSession);\n }\n\n async start(callSession: CallSession, tools?: ToolRegistry): Promise<void> {\n if (tools) this._tools = tools;\n await this.prewarm();\n await this.attach(callSession);\n }\n\n feedAudio(audio: Buffer): void {\n if (this._session && !this._closed) {\n // G.711 ulaw 8kHz → PCM16 8kHz → PCM16 16kHz\n const pcm8k = ulawToPcm16(audio);\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.sendRealtimeInput({ text: `[DTMF 입력: ${digits}]` });\n }\n }\n\n async stop(): Promise<void> {\n this._closed = true;\n if (this._toolDrainTimer) {\n clearTimeout(this._toolDrainTimer);\n this._toolDrainTimer = null;\n }\n this._pendingToolCall = null;\n if (this._session) {\n const sess = this._session;\n this._session = null;\n // Best-effort close with a 2s timeout guard so prewarm-then-cancel\n // (missed/declined outbound) doesn't leak the upstream Live session.\n await Promise.race([\n (async () => {\n try {\n const ret = sess.close();\n if (ret && typeof ret.then === 'function') await ret;\n } catch {\n // ignore close errors\n }\n })(),\n new Promise<void>((resolve) => setTimeout(resolve, 2000)),\n ]);\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 if (this._pendingToolCall) this._lastAudioTime = Date.now();\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 — debounce로 남은 오디오 drain 후 실행\n if (msg.toolCall) {\n this._pendingToolCall = msg.toolCall;\n this._scheduleToolExecution();\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 this._pendingToolCall = null;\n if (this._toolDrainTimer) {\n clearTimeout(this._toolDrainTimer);\n this._toolDrainTimer = null;\n }\n }\n }\n\n private _handleAudioData(b64Data: string): void {\n if (!this._call) return;\n\n const pcm24k = Buffer.from(b64Data, 'base64');\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 // Gemini는 tool_call 후에도 오디오를 계속 보내므로, 이 시간 내 응답이 없으면 drain 완료로 간주\n private static readonly TOOL_DRAIN_TIMEOUT = 300;\n\n private _scheduleToolExecution(): void {\n if (this._toolDrainTimer) return;\n this._lastAudioTime = Date.now();\n this._toolDrainTimer = setTimeout(() => {\n this._toolDrainTimer = null;\n if (Date.now() - this._lastAudioTime < GeminiRealtime.TOOL_DRAIN_TIMEOUT) {\n // 아직 오디오가 오고 있음 — 재스케줄\n this._scheduleToolExecution();\n return;\n }\n if (this._pendingToolCall) {\n const tc = this._pendingToolCall;\n this._pendingToolCall = null;\n this._handleToolCall(tc);\n }\n }, GeminiRealtime.TOOL_DRAIN_TIMEOUT);\n }\n\n private async _handleToolCall(toolCall: LiveServerToolCall): Promise<void> {\n const functionCalls = toolCall.functionCalls;\n if (!functionCalls) return;\n\n const responses: Array<Record<string, unknown>> = [];\n\n const player =\n this._holdAudioChunks && this._call && !(this._call instanceof BufferingCall)\n ? new HoldAudioPlayer(this._call, this._holdAudioChunks)\n : null;\n player?.start();\n\n try {\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 && !(this._call instanceof BufferingCall)) {\n const result = await executeBuiltinTool(\n name,\n args as Record<string, unknown>,\n this._call,\n );\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 } finally {\n player?.stop();\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 }\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 apiKey = this._options.apiKey ?? process.env['GOOGLE_API_KEY'];\n const client = apiKey ? new GoogleGenAI({ apiKey }) : new GoogleGenAI();\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"]}
|