@teamlearners/clawops 0.32.1 → 0.34.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 +192 -0
- package/dist/agent/index.cjs +16 -10
- package/dist/agent/index.cjs.map +1 -1
- package/dist/agent/index.d.cts +2 -2
- package/dist/agent/index.d.ts +2 -2
- package/dist/agent/index.js +8 -2
- package/dist/agent/index.js.map +1 -1
- package/dist/agent/livekit/index.d.cts +1 -1
- package/dist/agent/livekit/index.d.ts +1 -1
- package/dist/{base-B6S9WQRN.d.cts → base-C3yzF1e0.d.cts} +6 -1
- package/dist/{base-B6S9WQRN.d.ts → base-C3yzF1e0.d.ts} +6 -1
- package/dist/chunk-2IHVQDIP.cjs +20 -0
- package/dist/chunk-2IHVQDIP.cjs.map +1 -0
- package/dist/{chunk-ESYMNP2G.js → chunk-36JABW7P.js} +9 -13
- package/dist/chunk-36JABW7P.js.map +1 -0
- package/dist/chunk-QNWXGJTJ.js +13 -0
- package/dist/chunk-QNWXGJTJ.js.map +1 -0
- package/dist/{chunk-6ABL54D2.cjs → chunk-TVDUOKJD.cjs} +9 -18
- package/dist/chunk-TVDUOKJD.cjs.map +1 -0
- package/dist/client-CKaAfPlF.d.cts +1460 -0
- package/dist/client-CKaAfPlF.d.ts +1460 -0
- package/dist/index.cjs +44 -38
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -1444
- package/dist/index.d.ts +2 -1444
- package/dist/index.js +6 -3
- package/dist/index.js.map +1 -1
- package/dist/solapi/index.cjs +662 -0
- package/dist/solapi/index.cjs.map +1 -0
- package/dist/solapi/index.d.cts +269 -0
- package/dist/solapi/index.d.ts +269 -0
- package/dist/solapi/index.js +651 -0
- package/dist/solapi/index.js.map +1 -0
- package/package.json +12 -2
- package/dist/chunk-6ABL54D2.cjs.map +0 -1
- package/dist/chunk-ESYMNP2G.js.map +0 -1
package/dist/agent/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../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/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/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":["NOOP_LOGGER","path","fs","silence","VERSION","os","digit","SAMPLE_RATE","pcm16ToUlaw","fs2","resamplePcm16","DEFAULT_BASE_URL","resolveBuiltinTools","createAgentLogger","createPipelineLogger","AgentError","AgentConnectionError","applyUlawGain","ulawToPcm16","BufferingCall","attachBuffered","getBuiltinToolSchemas","BUILTIN_TOOL_NAMES","result","executeBuiltinTool","CALL_NOT_READY_RESULT"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\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 _endedStatus: string | null = null;\n private _endedDuration: number | null = null;\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 /**\n * @internal Media WS playout 마커 훅. LiveKit(`ClawOpsAudioOutput`)이 재생 완료\n * 판정(mark echo)과 barge-in 절단 위치 계산에 쓴다. 다른 세션 타입은 읽지 않는다.\n * prewarm 중(BufferingCall)에는 바인딩되지 않아 null 이다.\n */\n /** @internal */ _sendMark: ((name: string) => void) | null = null;\n /** @internal */ _waitForMark: ((name: string, timeoutMs: number) => Promise<void>) | null = null;\n /** @internal */ _flushTransport: (() => Promise<void>) | 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 /**\n * 서버가 통보한 최종 종료 상태. 통화가 끝나기 전에는 null.\n *\n * `completed`(성사) / `no-answer`(벨은 울렸으나 무응답) / `busy`(통화중) /\n * `rejected`(수신 거절) / `canceled`(응답 전 발신 측 취소) / `failed`(시스템·망 오류).\n * `status` 는 SDK 내부 수명주기(ringing→active→ended)이므로 통화 성사 여부는\n * 이 값이나 `call_failed` 이벤트로 판단한다.\n */\n get endedStatus(): string | null {\n return this._endedStatus;\n }\n\n /**\n * 서버가 확정한 통화 시간(초). 통화가 끝나기 전에는 `null`.\n *\n * ⚠️ `duration` 과 다르다 — 그쪽은 SDK 가 로컬 시계로 재는 **경과 시간**이라 통화 중에도\n * 읽히고, 세션이 붙기 전후의 오차를 포함한다. 기록·정산에 쓸 값은 이쪽이다.\n */\n get endedDuration(): number | null {\n return this._endedDuration;\n }\n\n get duration(): number {\n return (Date.now() - this.startTime.getTime()) / 1000;\n }\n\n /** @internal 서버가 통보한 통화 시간을 확정한다. */\n _setEndedDuration(seconds: number): void {\n this._endedDuration = seconds;\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 /**\n * Transfer the call to a phone number or SIP endpoint.\n *\n * destinationType='pstn' (default): `to` is a phone number dialed via carrier.\n * destinationType='sip': `to` is a SIP URI (e.g. `sip:user@host`) connected\n * directly to a SIP endpoint without going through the PSTN carrier. Requires the\n * account to have an active `sip_trunk` add-on; otherwise the transfer fails and\n * the call continues with the AI (result `{ status: 'failed', ... }`).\n *\n * 전환받는 쪽에 표시되는 발신번호는 기본이 **계정 보유번호**(인바운드면 착신 070)다.\n *\n * `callerIdMode: 'original'` 은 인바운드 통화의 **원 발신자 번호를 승계하려는 선호**다.\n * 승계할 수 없는 통화(KCT 직결 인입이 아니거나 국내 번호로 정규화되지 않는 발신번호)면\n * 조용히 계정 보유번호로 내려앉고 **전환은 그대로 성사된다**.\n *\n * `callerId` 는 번호를 직접 주는 **지시**라 성격이 다르다. 허용 범위(계정 보유번호 또는\n * KCT 직결 인입의 원 발신자)를 벗어나면 전환 자체가 실패한다. 둘 다 주면 `callerId` 가\n * 이기고 `callerIdMode` 는 무시된다 — 우선순위 판단은 서버가 한다.\n */\n async transfer(\n to: string,\n options?: {\n destinationType?: 'pstn' | 'sip';\n mode?: 'blind' | 'warm';\n afterTransfer?: 'terminate' | 'return';\n holdMedia?: string;\n whisper?: string;\n context?: Record<string, unknown>;\n callerId?: string;\n callerIdMode?: 'account' | 'original';\n timeout?: number;\n },\n ): Promise<Record<string, unknown>> {\n if (!this._transferFn) {\n throw new Error('transfer not available');\n }\n // 서버는 'original' 만 특별 취급하고 나머지 값은 조용히 무시한다. 오타를 그대로\n // 흘려보내면 아무 에러 없이 계정 번호가 나가고, 개발자는 켰다고 믿는다 — 여기서 막는다.\n const callerIdMode = options?.callerIdMode;\n if (callerIdMode !== undefined && callerIdMode !== 'account' && callerIdMode !== 'original') {\n throw new Error(\n `callerIdMode must be 'account' or 'original', got ${JSON.stringify(callerIdMode)}`,\n );\n }\n return this._transferFn({\n to,\n destinationType: options?.destinationType ?? 'pstn',\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 // 안 주면 키를 붙이지 않는다 — 구 서버와 기존 동작을 그대로 둔다(additive).\n ...(callerIdMode !== undefined ? { callerIdMode } : {}),\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 /**\n * Mark the session as ended (called internally).\n *\n * @param status 서버가 통보한 최종 상태(completed/no-answer/busy/rejected/canceled/\n * failed). 주어지면 `endedStatus` 로 확정한다 — 상대가 받지 않은 통화를 성사된 통화와\n * 구분하기 위함이다. 생략하면 미디어 세션 정리 경로에서의 호출이므로, 아직 종료 전일\n * 때만 'completed' 로 채우고 이미 확정된 서버 상태는 덮어쓰지 않는다.\n */\n _markEnded(status?: string): void {\n if (status !== undefined) {\n this._endedStatus = status;\n } else if (this._status !== 'ended') {\n this._endedStatus = 'completed';\n }\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 * 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/**\n * 미디어 정리 후 서버 종료 프레임을 기다리는 상한(ms). 정상 경로에서는 밀리초 안에 풀리고,\n * 제어 연결이 죽어 프레임이 아예 안 올 때만 이 값을 다 쓴다.\n *\n * 🔴 이건 **임시 장치**다. 서버가 미디어 WS 를 먼저 닫고 정리를 마친 뒤에 종료 프레임을\n * 보내기 때문에 클라이언트가 그 순서를 보정하고 있다. 서버가 종료 프레임을 미디어 WS\n * 닫기 **전에** 보내게 되면 이 대기는 통째로 필요 없어진다. 다만 그때도 구 서버가 남아\n * 있는 동안은 유지해야 한다 — 버전 협상이 없어 \"모두 새 서버\" 를 확신할 방법이 없다.\n */\nconst TERMINAL_FRAME_GRACE_MS = 2000;\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 * 이 에이전트의 모든 발신에 적용되는 AMD(machineDetection) default.\n * `'Enable'`=감지 후 `AnsweredBy` 통보(통화 계속), `'Hangup'`=음성사서함 감지 시 자동 종료.\n * `call(to, { machineDetection })` 로 호출별 override 가능.\n * 우선순위: 호출 인자 > 인스턴스 default > 비활성. Python SDK 의 `machine_detection` 과 mirror.\n */\n machineDetection?: 'Enable' | 'Hangup';\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 /** 미디어 정리를 마친 통화가 서버 종료 프레임을 기다리는 자리. callId → resolve. */\n private _terminalWaiters = new Map<string, () => void>();\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 /** 모든 발신에 적용되는 AMD default. call() 인자로 호출별 override 가능. */\n private _machineDetection?: 'Enable' | 'Hangup';\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 this._machineDetection = options.machineDetection;\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 // 제어 연결이 닫힌 뒤엔 종료 프레임이 올 수 없다 — 기다리는 통화를 즉시 놓아주지 않으면\n // 종료 중인 통화마다 상한(2초)을 통째로 헛쓴다. ControlWebSocket.close() 가 대기 중인\n // 전환 resolver 를 정리하는 것과 같은 규율이다.\n for (const wake of [...this._terminalWaiters.values()]) wake();\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, machineDetection })\n *\n * @param options.machineDetection 자동응답기/음성사서함 감지(AMD).\n * `'Enable'`=감지 후 `AnsweredBy` 통보(통화 계속), `'Hangup'`=음성사서함 감지 시 자동 종료.\n * 미지정 시 인스턴스 default(생성자의 `machineDetection`)를 따른다.\n * 우선순위: 호출 인자 > 인스턴스 default > 비활성.\n */\n async call(\n to: string,\n options?: { timeout?: number; machineDetection?: 'Enable' | 'Hangup' },\n ): Promise<CallSession> {\n await this.connect();\n\n const url = `${this._baseUrl}/v1/accounts/${this._accountId}/calls`;\n const body: Record<string, unknown> = {\n To: to,\n From: this._fromNumber,\n Timeout: options?.timeout ?? 60,\n };\n const effectiveMd = options?.machineDetection ?? this._machineDetection;\n if (effectiveMd) {\n body['MachineDetection'] = effectiveMd;\n }\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 /**\n * 서버 종료 프레임을 짧게 기다린다. 미디어 정리 직후에만 부른다.\n *\n * 왜 기다리나: `call_end` 는 인바운드 사용자가 통화 결과를 받는 **유일한 통로**인데, 서버는\n * 미디어 WS 를 먼저 닫고 자원 정리를 마친 뒤에야 control 종료 프레임을 보낸다. 안 기다리면\n * 그 핸들러 안에서 `endedDuration` 은 영영 null 이다.\n *\n * 상한을 다 쓰는 경우는 제어 연결이 죽어 프레임이 아예 안 오는 때뿐이다 — 그 프레임은\n * 예전부터 늘 오던 것이고(이번에 바뀐 건 내용뿐), 정상 경로에서는 밀리초 안에 풀린다.\n */\n private async _awaitServerTerminal(session: CallSession): Promise<void> {\n if (session.endedDuration !== null) return;\n await new Promise<void>((resolve) => {\n const done = (): void => {\n clearTimeout(timer);\n this._terminalWaiters.delete(session.callId);\n resolve();\n };\n const timer = setTimeout(() => {\n this._log.debug(\n '서버 종료 프레임이 %dms 안에 오지 않았다 — endedDuration 없이 진행: %s',\n TERMINAL_FRAME_GRACE_MS,\n session.callId,\n );\n done();\n }, TERMINAL_FRAME_GRACE_MS);\n this._terminalWaiters.set(session.callId, done);\n });\n }\n\n private _handleEnded(event: ControlEvent): void {\n const callId = event['callId'] as string;\n // 서버는 종료 사유를 status 로 싣는다(completed/no-answer/busy/rejected/canceled/\n // failed). 예전에는 이 값을 버려서 상대가 받지 않은 통화를 성사된 통화와 구분할 수\n // 없었다.\n const status = (event['status'] as string) || 'completed';\n // 서버가 확정한 통화 시간. 구 서버는 이 값을 안 보내거나 0 을 보내므로 그대로 둔다 —\n // 없는 값을 로컬 계산으로 지어내면 어느 쪽인지 구분할 수 없게 된다.\n const endedDuration = event['duration'];\n const session = this._activeSessions.get(callId);\n if (session) {\n this._log.info('Call ended (server): %s (status=%s)', callId, status);\n if (typeof endedDuration === 'number') session._setEndedDuration(endedDuration);\n if (status !== 'completed') {\n // 미연결 종료. call_start 가 없었으므로 call_end 도 발화되지 않는다 —\n // 이 이벤트가 발신 실패를 알 수 있는 유일한 통로다.\n this._log.info('Outbound call not connected: %s (%s)', callId, status);\n session._emit('call_failed', status);\n }\n session._markEnded(status);\n this._activeSessions.delete(callId);\n }\n // 미디어 정리를 마치고 이 프레임을 기다리는 통화가 있으면 깨운다(awaitServerTerminal).\n this._terminalWaiters.get(callId)?.();\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 /**\n * 세션에 콜별 의존성(도구·내장도구·hold audio·recorder·logger)을 주입한다.\n *\n * prewarm 과 _startCallSession 양쪽에서 부른다. prewarm 은 세션이 LLM 에 보낼\n * tool 스키마를 그 시점에 확정하므로(OpenAI session.update / Gemini live connect\n * config), prewarm **전에** 최소 한 번은 도구가 들어가 있어야 한다.\n */\n private _injectSessionDeps(tools: ToolRegistry, recorder?: AudioRecorder | null): void {\n const sessionHandler = this._session;\n if (\n 'setToolRegistry' in sessionHandler &&\n typeof sessionHandler.setToolRegistry === 'function'\n ) {\n sessionHandler.setToolRegistry(tools);\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\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 // MCP 도구는 통화 시작 시점(_startCallSession)에야 등록되는데, 연결 후 도구\n // 변경이 불가능한 세션(Gemini Live)은 prewarm 하면 MCP 도구를 영영 못 쓴다.\n // 그런 조합에서는 prewarm 을 건너뛰고 기존 start() 경로로 간다.\n if (\n this._mcpServers.length > 0 &&\n (sessionHandler as { toolsFrozenAfterPrewarm?: boolean }).toolsFrozenAfterPrewarm\n ) {\n this._log.info(\n { callId },\n 'Skipping prewarm — 세션이 연결 후 도구 변경을 지원하지 않아 MCP 도구가 누락된다.',\n );\n return;\n }\n\n // prewarm 은 tool 스키마를 LLM 에 확정 전송한다. 여기서 주입하지 않으면\n // agent.tool() 로 등록한 도구가 통째로 빠진 채 세션이 시작된다 —\n // _startCallSession 의 주입은 answer 이후라 이미 늦다.\n this._injectSessionDeps(this._tools.fork());\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 const reason = (event['reason'] as string) ?? 'failed';\n this._log.info('Outbound call failed: %s (%s)', callId, reason);\n session._emit('call_failed', reason);\n session._markEnded(reason);\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 // Media WS mark/flush 를 세션에 노출 — LiveKit ClawOpsAudioOutput 이 재생 완료\n // (mark echo) 판정과 barge-in 절단 위치 계산에 쓴다. native 세션은 읽지 않는다.\n session._sendMark = (name: string) => mediaWs.sendMark(name);\n session._waitForMark = (name: string, timeoutMs: number) => mediaWs.waitForMark(name, timeoutMs);\n session._flushTransport = () => mediaWs.flush();\n\n const sessionHandler = this._session;\n\n // Inject tools and recorder into session if supported\n this._injectSessionDeps(sessionTools, recorder);\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 // 서버가 확정한 통화 시간을 call_end 핸들러가 읽을 수 있게 잠깐 기다린다.\n // 서버는 미디어 WS 를 먼저 닫고 자원 정리 뒤에 control 종료 프레임을 보내므로,\n // 안 기다리면 endedDuration 은 인바운드 사용자에게 **영영 null** 이다 —\n // call_end 가 그들의 유일한 통로다.\n await this._awaitServerTerminal(session);\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 * 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 {\n BUILTIN_TOOL_NAMES,\n CALL_NOT_READY_RESULT,\n executeBuiltinTool,\n getBuiltinToolSchemas,\n} 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 // prewarm 창(=상대가 받기 전)에는 통화 제어 도구를 수행할 대상이 없다.\n if (BUILTIN_TOOL_NAMES.has(name) && this._callSession instanceof BufferingCall) {\n this._log.warn('Builtin tool %s called before answer — deferring', name);\n this._conversation.push({\n role: 'tool',\n content: CALL_NOT_READY_RESULT,\n tool_call_id: id,\n name,\n });\n await this._respond();\n return;\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 CALL_NOT_READY_RESULT,\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 'low'.\n * - `{ type: 'semantic_vad', eagerness?: 'low'|'medium'|'high'|'auto', create_response?: boolean, 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 * 마지막 session.update 로 LLM 에 알린 tool 이름들. attach() 가 이 값과 현재\n * registry 를 비교해 달라졌을 때만(=MCP 도구 등 뒤늦게 붙은 경우) 재전송한다.\n */\n private _sentToolNames: string[] | 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 : {\n type: 'semantic_vad',\n eagerness: 'low',\n create_response: true,\n interrupt_response: true,\n };\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 this._resyncTools();\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 /** Current tool schemas: user tools + builtin tools (flat realtime format). */\n private _currentToolSchemas(): Array<Record<string, unknown>> {\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 return toolSchemas;\n }\n\n /**\n * prewarm 이후 도구가 바뀌었으면 session.update 로 재전송한다.\n *\n * MCP 도구는 통화 시작 시점에 registry 에 붙으므로 prewarm 시점의 스키마에는\n * 없다. 여기서 맞춰주지 않으면 발신 통화에서 MCP 도구를 영영 못 쓴다.\n */\n private _resyncTools(): void {\n if (!this._ws || this._ws.readyState !== 1) return;\n const toolSchemas = this._currentToolSchemas();\n const names = toolSchemas.map((t) => String(t['name'] ?? ''));\n if (\n this._sentToolNames &&\n names.length === this._sentToolNames.length &&\n names.every((n, i) => n === this._sentToolNames![i])\n ) {\n return;\n }\n this._send({\n type: 'session.update',\n session: { type: 'realtime', tools: toolSchemas },\n });\n this._sentToolNames = names;\n this._log.info('Tool schema resynced after prewarm: %s', names.join(', '));\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 = this._currentToolSchemas();\n this._sentToolNames = toolSchemas.map((t) => String(t['name'] ?? ''));\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: 'near_field' },\n transcription: {\n model: 'gpt-4o-transcribe',\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 // prewarm 창(=상대가 받기 전)에는 통화 제어 도구를 수행할 대상이 없다.\n // 'Unknown tool' 로 뭉뚱그리지 말고 모델이 이해할 결과를 돌려준다.\n if (BUILTIN_TOOL_NAMES.has(funcName) && this._call instanceof BufferingCall) {\n this._log.warn('Builtin tool %s called before answer — deferring', 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: CALL_NOT_READY_RESULT,\n },\n });\n this._send({ type: 'response.create' });\n return;\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 CALL_NOT_READY_RESULT,\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 /**\n * Gemini Live 는 connect 시점의 config 로 도구가 고정되어 세션 도중 변경할 수 없다.\n *\n * 통화 시작 시점에야 붙는 MCP 도구는 prewarm 된 세션에 넣을 방법이 없으므로,\n * `ClawOpsAgent` 가 MCP 서버 설정과 이 플래그를 보고 prewarm 을 건너뛴다.\n */\n readonly toolsFrozenAfterPrewarm = true;\n\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 // prewarm 창(=상대가 받기 전)에는 통화 제어 도구를 수행할 대상이 없다.\n if (BUILTIN_TOOL_NAMES.has(name) && this._call instanceof BufferingCall) {\n this._log.warn('Builtin tool %s called before answer — deferring', name);\n responses.push({ id: fcId, name, response: { result: CALL_NOT_READY_RESULT } });\n continue;\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/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/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/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":["NOOP_LOGGER","path","fs","silence","VERSION","os","digit","SAMPLE_RATE","pcm16ToUlaw","fs2","resamplePcm16","DEFAULT_BASE_URL","resolveBuiltinTools","createAgentLogger","createPipelineLogger","AgentError","AgentConnectionError","applyUlawGain","ulawToPcm16","BufferingCall","attachBuffered","getBuiltinToolSchemas","BUILTIN_TOOL_NAMES","result","executeBuiltinTool","CALL_NOT_READY_RESULT"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\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 _endedStatus: string | null = null;\n private _endedDuration: number | null = null;\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 /**\n * @internal Media WS playout 마커 훅. LiveKit(`ClawOpsAudioOutput`)이 재생 완료\n * 판정(mark echo)과 barge-in 절단 위치 계산에 쓴다. 다른 세션 타입은 읽지 않는다.\n * prewarm 중(BufferingCall)에는 바인딩되지 않아 null 이다.\n */\n /** @internal */ _sendMark: ((name: string) => void) | null = null;\n /** @internal */ _waitForMark: ((name: string, timeoutMs: number) => Promise<void>) | null = null;\n /** @internal */ _flushTransport: (() => Promise<void>) | 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 /**\n * 서버가 통보한 최종 종료 상태. 통화가 끝나기 전에는 null.\n *\n * `completed`(성사) / `no-answer`(벨은 울렸으나 무응답) / `busy`(통화중) /\n * `rejected`(수신 거절) / `canceled`(응답 전 발신 측 취소) / `failed`(시스템·망 오류).\n * `status` 는 SDK 내부 수명주기(ringing→active→ended)이므로 통화 성사 여부는\n * 이 값이나 `call_failed` 이벤트로 판단한다.\n */\n get endedStatus(): string | null {\n return this._endedStatus;\n }\n\n /**\n * 서버가 확정한 통화 시간(초). 통화가 끝나기 전에는 `null`.\n *\n * ⚠️ `duration` 과 다르다 — 그쪽은 SDK 가 로컬 시계로 재는 **경과 시간**이라 통화 중에도\n * 읽히고, 세션이 붙기 전후의 오차를 포함한다. 기록·정산에 쓸 값은 이쪽이다.\n */\n get endedDuration(): number | null {\n return this._endedDuration;\n }\n\n get duration(): number {\n return (Date.now() - this.startTime.getTime()) / 1000;\n }\n\n /** @internal 서버가 통보한 통화 시간을 확정한다. */\n _setEndedDuration(seconds: number): void {\n this._endedDuration = seconds;\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 /**\n * Send G.711 μ-law audio (8kHz, mono) to the caller.\n *\n * NOT PCM16. The transport applies μ-law gain and forwards the bytes as-is,\n * so PCM16 input is reinterpreted as μ-law and plays as noise. Convert first.\n */\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 /**\n * Transfer the call to a phone number or SIP endpoint.\n *\n * destinationType='pstn' (default): `to` is a phone number dialed via carrier.\n * destinationType='sip': `to` is a SIP URI (e.g. `sip:user@host`) connected\n * directly to a SIP endpoint without going through the PSTN carrier. Requires the\n * account to have an active `sip_trunk` add-on; otherwise the transfer fails and\n * the call continues with the AI (result `{ status: 'failed', ... }`).\n *\n * 전환받는 쪽에 표시되는 발신번호는 기본이 **계정 보유번호**(인바운드면 착신 070)다.\n *\n * `callerIdMode: 'original'` 은 인바운드 통화의 **원 발신자 번호를 승계하려는 선호**다.\n * 승계할 수 없는 통화(KCT 직결 인입이 아니거나 국내 번호로 정규화되지 않는 발신번호)면\n * 조용히 계정 보유번호로 내려앉고 **전환은 그대로 성사된다**.\n *\n * `callerId` 는 번호를 직접 주는 **지시**라 성격이 다르다. 허용 범위(계정 보유번호 또는\n * KCT 직결 인입의 원 발신자)를 벗어나면 전환 자체가 실패한다. 둘 다 주면 `callerId` 가\n * 이기고 `callerIdMode` 는 무시된다 — 우선순위 판단은 서버가 한다.\n */\n async transfer(\n to: string,\n options?: {\n destinationType?: 'pstn' | 'sip';\n mode?: 'blind' | 'warm';\n afterTransfer?: 'terminate' | 'return';\n holdMedia?: string;\n whisper?: string;\n context?: Record<string, unknown>;\n callerId?: string;\n callerIdMode?: 'account' | 'original';\n timeout?: number;\n },\n ): Promise<Record<string, unknown>> {\n if (!this._transferFn) {\n throw new Error('transfer not available');\n }\n // 서버는 'original' 만 특별 취급하고 나머지 값은 조용히 무시한다. 오타를 그대로\n // 흘려보내면 아무 에러 없이 계정 번호가 나가고, 개발자는 켰다고 믿는다 — 여기서 막는다.\n const callerIdMode = options?.callerIdMode;\n if (callerIdMode !== undefined && callerIdMode !== 'account' && callerIdMode !== 'original') {\n throw new Error(\n `callerIdMode must be 'account' or 'original', got ${JSON.stringify(callerIdMode)}`,\n );\n }\n return this._transferFn({\n to,\n destinationType: options?.destinationType ?? 'pstn',\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 // 안 주면 키를 붙이지 않는다 — 구 서버와 기존 동작을 그대로 둔다(additive).\n ...(callerIdMode !== undefined ? { callerIdMode } : {}),\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 /**\n * Mark the session as ended (called internally).\n *\n * @param status 서버가 통보한 최종 상태(completed/no-answer/busy/rejected/canceled/\n * failed). 주어지면 `endedStatus` 로 확정한다 — 상대가 받지 않은 통화를 성사된 통화와\n * 구분하기 위함이다. 생략하면 미디어 세션 정리 경로에서의 호출이므로, 아직 종료 전일\n * 때만 'completed' 로 채우고 이미 확정된 서버 상태는 덮어쓰지 않는다.\n */\n _markEnded(status?: string): void {\n if (status !== undefined) {\n this._endedStatus = status;\n } else if (this._status !== 'ended') {\n this._endedStatus = 'completed';\n }\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 * 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/**\n * 미디어 정리 후 서버 종료 프레임을 기다리는 상한(ms). 정상 경로에서는 밀리초 안에 풀리고,\n * 제어 연결이 죽어 프레임이 아예 안 올 때만 이 값을 다 쓴다.\n *\n * 🔴 이건 **임시 장치**다. 서버가 미디어 WS 를 먼저 닫고 정리를 마친 뒤에 종료 프레임을\n * 보내기 때문에 클라이언트가 그 순서를 보정하고 있다. 서버가 종료 프레임을 미디어 WS\n * 닫기 **전에** 보내게 되면 이 대기는 통째로 필요 없어진다. 다만 그때도 구 서버가 남아\n * 있는 동안은 유지해야 한다 — 버전 협상이 없어 \"모두 새 서버\" 를 확신할 방법이 없다.\n */\nconst TERMINAL_FRAME_GRACE_MS = 2000;\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 * 이 에이전트의 모든 발신에 적용되는 AMD(machineDetection) default.\n * `'Enable'`=감지 후 `AnsweredBy` 통보(통화 계속), `'Hangup'`=음성사서함 감지 시 자동 종료.\n * `call(to, { machineDetection })` 로 호출별 override 가능.\n * 우선순위: 호출 인자 > 인스턴스 default > 비활성. Python SDK 의 `machine_detection` 과 mirror.\n */\n machineDetection?: 'Enable' | 'Hangup';\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 /** 미디어 정리를 마친 통화가 서버 종료 프레임을 기다리는 자리. callId → resolve. */\n private _terminalWaiters = new Map<string, () => void>();\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 /** 모든 발신에 적용되는 AMD default. call() 인자로 호출별 override 가능. */\n private _machineDetection?: 'Enable' | 'Hangup';\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 this._machineDetection = options.machineDetection;\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 // 제어 연결이 닫힌 뒤엔 종료 프레임이 올 수 없다 — 기다리는 통화를 즉시 놓아주지 않으면\n // 종료 중인 통화마다 상한(2초)을 통째로 헛쓴다. ControlWebSocket.close() 가 대기 중인\n // 전환 resolver 를 정리하는 것과 같은 규율이다.\n for (const wake of [...this._terminalWaiters.values()]) wake();\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, machineDetection })\n *\n * @param options.machineDetection 자동응답기/음성사서함 감지(AMD).\n * `'Enable'`=감지 후 `AnsweredBy` 통보(통화 계속), `'Hangup'`=음성사서함 감지 시 자동 종료.\n * 미지정 시 인스턴스 default(생성자의 `machineDetection`)를 따른다.\n * 우선순위: 호출 인자 > 인스턴스 default > 비활성.\n */\n async call(\n to: string,\n options?: { timeout?: number; machineDetection?: 'Enable' | 'Hangup' },\n ): Promise<CallSession> {\n await this.connect();\n\n const url = `${this._baseUrl}/v1/accounts/${this._accountId}/calls`;\n const body: Record<string, unknown> = {\n To: to,\n From: this._fromNumber,\n Timeout: options?.timeout ?? 60,\n };\n const effectiveMd = options?.machineDetection ?? this._machineDetection;\n if (effectiveMd) {\n body['MachineDetection'] = effectiveMd;\n }\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 /**\n * 서버 종료 프레임을 짧게 기다린다. 미디어 정리 직후에만 부른다.\n *\n * 왜 기다리나: `call_end` 는 인바운드 사용자가 통화 결과를 받는 **유일한 통로**인데, 서버는\n * 미디어 WS 를 먼저 닫고 자원 정리를 마친 뒤에야 control 종료 프레임을 보낸다. 안 기다리면\n * 그 핸들러 안에서 `endedDuration` 은 영영 null 이다.\n *\n * 상한을 다 쓰는 경우는 제어 연결이 죽어 프레임이 아예 안 오는 때뿐이다 — 그 프레임은\n * 예전부터 늘 오던 것이고(이번에 바뀐 건 내용뿐), 정상 경로에서는 밀리초 안에 풀린다.\n */\n private async _awaitServerTerminal(session: CallSession): Promise<void> {\n if (session.endedDuration !== null) return;\n await new Promise<void>((resolve) => {\n const done = (): void => {\n clearTimeout(timer);\n this._terminalWaiters.delete(session.callId);\n resolve();\n };\n const timer = setTimeout(() => {\n this._log.debug(\n '서버 종료 프레임이 %dms 안에 오지 않았다 — endedDuration 없이 진행: %s',\n TERMINAL_FRAME_GRACE_MS,\n session.callId,\n );\n done();\n }, TERMINAL_FRAME_GRACE_MS);\n this._terminalWaiters.set(session.callId, done);\n });\n }\n\n private _handleEnded(event: ControlEvent): void {\n const callId = event['callId'] as string;\n // 서버는 종료 사유를 status 로 싣는다(completed/no-answer/busy/rejected/canceled/\n // failed). 예전에는 이 값을 버려서 상대가 받지 않은 통화를 성사된 통화와 구분할 수\n // 없었다.\n const status = (event['status'] as string) || 'completed';\n // 서버가 확정한 통화 시간. 구 서버는 이 값을 안 보내거나 0 을 보내므로 그대로 둔다 —\n // 없는 값을 로컬 계산으로 지어내면 어느 쪽인지 구분할 수 없게 된다.\n const endedDuration = event['duration'];\n const session = this._activeSessions.get(callId);\n if (session) {\n this._log.info('Call ended (server): %s (status=%s)', callId, status);\n if (typeof endedDuration === 'number') session._setEndedDuration(endedDuration);\n if (status !== 'completed') {\n // 미연결 종료. call_start 가 없었으므로 call_end 도 발화되지 않는다 —\n // 이 이벤트가 발신 실패를 알 수 있는 유일한 통로다.\n this._log.info('Outbound call not connected: %s (%s)', callId, status);\n session._emit('call_failed', status);\n }\n session._markEnded(status);\n this._activeSessions.delete(callId);\n }\n // 미디어 정리를 마치고 이 프레임을 기다리는 통화가 있으면 깨운다(awaitServerTerminal).\n this._terminalWaiters.get(callId)?.();\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 /**\n * 세션에 콜별 의존성(도구·내장도구·hold audio·recorder·logger)을 주입한다.\n *\n * prewarm 과 _startCallSession 양쪽에서 부른다. prewarm 은 세션이 LLM 에 보낼\n * tool 스키마를 그 시점에 확정하므로(OpenAI session.update / Gemini live connect\n * config), prewarm **전에** 최소 한 번은 도구가 들어가 있어야 한다.\n */\n private _injectSessionDeps(tools: ToolRegistry, recorder?: AudioRecorder | null): void {\n const sessionHandler = this._session;\n if (\n 'setToolRegistry' in sessionHandler &&\n typeof sessionHandler.setToolRegistry === 'function'\n ) {\n sessionHandler.setToolRegistry(tools);\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\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 // MCP 도구는 통화 시작 시점(_startCallSession)에야 등록되는데, 연결 후 도구\n // 변경이 불가능한 세션(Gemini Live)은 prewarm 하면 MCP 도구를 영영 못 쓴다.\n // 그런 조합에서는 prewarm 을 건너뛰고 기존 start() 경로로 간다.\n if (\n this._mcpServers.length > 0 &&\n (sessionHandler as { toolsFrozenAfterPrewarm?: boolean }).toolsFrozenAfterPrewarm\n ) {\n this._log.info(\n { callId },\n 'Skipping prewarm — 세션이 연결 후 도구 변경을 지원하지 않아 MCP 도구가 누락된다.',\n );\n return;\n }\n\n // prewarm 은 tool 스키마를 LLM 에 확정 전송한다. 여기서 주입하지 않으면\n // agent.tool() 로 등록한 도구가 통째로 빠진 채 세션이 시작된다 —\n // _startCallSession 의 주입은 answer 이후라 이미 늦다.\n this._injectSessionDeps(this._tools.fork());\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 const reason = (event['reason'] as string) ?? 'failed';\n this._log.info('Outbound call failed: %s (%s)', callId, reason);\n session._emit('call_failed', reason);\n session._markEnded(reason);\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 // Media WS mark/flush 를 세션에 노출 — LiveKit ClawOpsAudioOutput 이 재생 완료\n // (mark echo) 판정과 barge-in 절단 위치 계산에 쓴다. native 세션은 읽지 않는다.\n session._sendMark = (name: string) => mediaWs.sendMark(name);\n session._waitForMark = (name: string, timeoutMs: number) => mediaWs.waitForMark(name, timeoutMs);\n session._flushTransport = () => mediaWs.flush();\n\n const sessionHandler = this._session;\n\n // Inject tools and recorder into session if supported\n this._injectSessionDeps(sessionTools, recorder);\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 // 서버가 확정한 통화 시간을 call_end 핸들러가 읽을 수 있게 잠깐 기다린다.\n // 서버는 미디어 WS 를 먼저 닫고 자원 정리 뒤에 control 종료 프레임을 보내므로,\n // 안 기다리면 endedDuration 은 인바운드 사용자에게 **영영 null** 이다 —\n // call_end 가 그들의 유일한 통로다.\n await this._awaitServerTerminal(session);\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 * 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 {\n BUILTIN_TOOL_NAMES,\n CALL_NOT_READY_RESULT,\n executeBuiltinTool,\n getBuiltinToolSchemas,\n} 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 // prewarm 창(=상대가 받기 전)에는 통화 제어 도구를 수행할 대상이 없다.\n if (BUILTIN_TOOL_NAMES.has(name) && this._callSession instanceof BufferingCall) {\n this._log.warn('Builtin tool %s called before answer — deferring', name);\n this._conversation.push({\n role: 'tool',\n content: CALL_NOT_READY_RESULT,\n tool_call_id: id,\n name,\n });\n await this._respond();\n return;\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 CALL_NOT_READY_RESULT,\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 'low'.\n * - `{ type: 'semantic_vad', eagerness?: 'low'|'medium'|'high'|'auto', create_response?: boolean, 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 * 마지막 session.update 로 LLM 에 알린 tool 이름들. attach() 가 이 값과 현재\n * registry 를 비교해 달라졌을 때만(=MCP 도구 등 뒤늦게 붙은 경우) 재전송한다.\n */\n private _sentToolNames: string[] | 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 : {\n type: 'semantic_vad',\n eagerness: 'low',\n create_response: true,\n interrupt_response: true,\n };\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 this._resyncTools();\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 /** Current tool schemas: user tools + builtin tools (flat realtime format). */\n private _currentToolSchemas(): Array<Record<string, unknown>> {\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 return toolSchemas;\n }\n\n /**\n * prewarm 이후 도구가 바뀌었으면 session.update 로 재전송한다.\n *\n * MCP 도구는 통화 시작 시점에 registry 에 붙으므로 prewarm 시점의 스키마에는\n * 없다. 여기서 맞춰주지 않으면 발신 통화에서 MCP 도구를 영영 못 쓴다.\n */\n private _resyncTools(): void {\n if (!this._ws || this._ws.readyState !== 1) return;\n const toolSchemas = this._currentToolSchemas();\n const names = toolSchemas.map((t) => String(t['name'] ?? ''));\n if (\n this._sentToolNames &&\n names.length === this._sentToolNames.length &&\n names.every((n, i) => n === this._sentToolNames![i])\n ) {\n return;\n }\n this._send({\n type: 'session.update',\n session: { type: 'realtime', tools: toolSchemas },\n });\n this._sentToolNames = names;\n this._log.info('Tool schema resynced after prewarm: %s', names.join(', '));\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 = this._currentToolSchemas();\n this._sentToolNames = toolSchemas.map((t) => String(t['name'] ?? ''));\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: 'near_field' },\n transcription: {\n model: 'gpt-4o-transcribe',\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 // prewarm 창(=상대가 받기 전)에는 통화 제어 도구를 수행할 대상이 없다.\n // 'Unknown tool' 로 뭉뚱그리지 말고 모델이 이해할 결과를 돌려준다.\n if (BUILTIN_TOOL_NAMES.has(funcName) && this._call instanceof BufferingCall) {\n this._log.warn('Builtin tool %s called before answer — deferring', 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: CALL_NOT_READY_RESULT,\n },\n });\n this._send({ type: 'response.create' });\n return;\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 CALL_NOT_READY_RESULT,\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 /**\n * Gemini Live 는 connect 시점의 config 로 도구가 고정되어 세션 도중 변경할 수 없다.\n *\n * 통화 시작 시점에야 붙는 MCP 도구는 prewarm 된 세션에 넣을 방법이 없으므로,\n * `ClawOpsAgent` 가 MCP 서버 설정과 이 플래그를 보고 prewarm 을 건너뛴다.\n */\n readonly toolsFrozenAfterPrewarm = true;\n\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 // prewarm 창(=상대가 받기 전)에는 통화 제어 도구를 수행할 대상이 없다.\n if (BUILTIN_TOOL_NAMES.has(name) && this._call instanceof BufferingCall) {\n this._log.warn('Builtin tool %s called before answer — deferring', name);\n responses.push({ id: fcId, name, response: { result: CALL_NOT_READY_RESULT } });\n continue;\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"]}
|