@teamlearners/clawops 0.3.0 → 0.3.1
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/LICENSE +1 -1
- package/dist/agent/index.cjs +71 -1
- package/dist/agent/index.cjs.map +1 -1
- package/dist/agent/index.js +71 -1
- package/dist/agent/index.js.map +1 -1
- package/package.json +1 -1
package/dist/agent/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/agent/audio.ts","../../src/agent/control-ws.ts","../../src/agent/mcp/client.ts","../../src/agent/media-ws.ts","../../src/agent/recorder.ts","../../src/agent/session.ts","../../src/agent/tool.ts","../../src/agent/tracing/config.ts","../../src/agent/tracing/spans.ts","../../src/agent/tracing/attributes.ts","../../src/agent/agent.ts","../../src/agent/pipeline/openai-realtime.ts","../../src/agent/pipeline/gemini-realtime.ts","../../src/agent/pipeline/pipeline-session.ts","../../src/agent/pipeline/deepgram-stt.ts","../../src/agent/pipeline/elevenlabs-tts.ts","../../src/agent/pipeline/openai-llm.ts","../../src/agent/pipeline/anthropic-llm.ts","../../src/agent/pipeline/gemini-llm.ts","../../src/agent/pipeline/openai-compat-llm.ts","../../src/agent/pipeline/ollama-llm.ts","../../src/agent/pipeline/mistral-llm.ts","../../src/agent/pipeline/groq-llm.ts","../../src/agent/pipeline/perplexity-llm.ts","../../src/agent/pipeline/together-llm.ts","../../src/agent/pipeline/fireworks-llm.ts","../../src/agent/pipeline/deepseek-llm.ts","../../src/agent/pipeline/xai-llm.ts","../../src/agent/mcp/stdio.ts","../../src/agent/mcp/http.ts"],"names":["path","fs","DEFAULT_BASE_URL","AgentError","AgentConnectionError","HANG_UP_TOOL","pcm8k"],"mappings":"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AA,EACxD,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAS,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAS,GAAA;AAAA,EAAQ,GAAA;AAAA,EACxD,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EACxD,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EACxD,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EA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","file":"index.cjs","sourcesContent":["/**\n * Audio codec utilities: PCM16 <-> ulaw conversion and resampling.\n */\n\nconst _BIAS = 0x84;\nconst _CLIP = 32635;\n\n// prettier-ignore\nconst DECODE_TABLE: readonly number[] = [\n -32124, -31100, -30076, -29052, -28028, -27004, -25980, -24956,\n -23932, -22908, -21884, -20860, -19836, -18812, -17788, -16764,\n -15996, -15484, -14972, -14460, -13948, -13436, -12924, -12412,\n -11900, -11388, -10876, -10364, -9852, -9340, -8828, -8316,\n -7932, -7676, -7420, -7164, -6908, -6652, -6396, -6140,\n -5884, -5628, -5372, -5116, -4860, -4604, -4348, -4092,\n -3900, -3772, -3644, -3516, -3388, -3260, -3132, -3004,\n -2876, -2748, -2620, -2492, -2364, -2236, -2108, -1980,\n -1884, -1820, -1756, -1692, -1628, -1564, -1500, -1436,\n -1372, -1308, -1244, -1180, -1116, -1052, -988, -924,\n -876, -844, -812, -780, -748, -716, -684, -652,\n -620, -588, -556, -524, -492, -460, -428, -396,\n -372, -356, -340, -324, -308, -292, -276, -260,\n -244, -228, -212, -196, -180, -164, -148, -132,\n -120, -112, -104, -96, -88, -80, -72, -64,\n -56, -48, -40, -32, -24, -16, -8, 0,\n 32124, 31100, 30076, 29052, 28028, 27004, 25980, 24956,\n 23932, 22908, 21884, 20860, 19836, 18812, 17788, 16764,\n 15996, 15484, 14972, 14460, 13948, 13436, 12924, 12412,\n 11900, 11388, 10876, 10364, 9852, 9340, 8828, 8316,\n 7932, 7676, 7420, 7164, 6908, 6652, 6396, 6140,\n 5884, 5628, 5372, 5116, 4860, 4604, 4348, 4092,\n 3900, 3772, 3644, 3516, 3388, 3260, 3132, 3004,\n 2876, 2748, 2620, 2492, 2364, 2236, 2108, 1980,\n 1884, 1820, 1756, 1692, 1628, 1564, 1500, 1436,\n 1372, 1308, 1244, 1180, 1116, 1052, 988, 924,\n 876, 844, 812, 780, 748, 716, 684, 652,\n 620, 588, 556, 524, 492, 460, 428, 396,\n 372, 356, 340, 324, 308, 292, 276, 260,\n 244, 228, 212, 196, 180, 164, 148, 132,\n 120, 112, 104, 96, 88, 80, 72, 64,\n 56, 48, 40, 32, 24, 16, 8, 0,\n];\n\nfunction encodeUlawSample(sample: number): number {\n let sign = 0;\n if (sample < 0) {\n sign = 0x80;\n sample = -sample;\n }\n if (sample > _CLIP) {\n sample = _CLIP;\n }\n sample += _BIAS;\n\n let exponent = 7;\n const expValues = [0x4000, 0x2000, 0x1000, 0x0800, 0x0400, 0x0200, 0x0100];\n for (const expVal of expValues) {\n if (sample >= expVal) {\n break;\n }\n exponent -= 1;\n }\n\n const mantissa = (sample >> (exponent + 3)) & 0x0f;\n return ~(sign | (exponent << 4) | mantissa) & 0xff;\n}\n\n/**\n * Convert PCM16 little-endian audio to ulaw.\n */\nexport function pcm16ToUlaw(pcm: Buffer): Buffer {\n if (!pcm.length) return Buffer.alloc(0);\n const nSamples = pcm.length >> 1;\n const out = Buffer.alloc(nSamples);\n for (let i = 0; i < nSamples; i++) {\n const sample = pcm.readInt16LE(i * 2);\n out[i] = encodeUlawSample(sample);\n }\n return out;\n}\n\n/**\n * Convert ulaw audio to PCM16 little-endian.\n */\nexport function ulawToPcm16(ulaw: Buffer): Buffer {\n if (!ulaw.length) return Buffer.alloc(0);\n const out = Buffer.alloc(ulaw.length * 2);\n for (let i = 0; i < ulaw.length; i++) {\n out.writeInt16LE(DECODE_TABLE[ulaw[i]!]!, i * 2);\n }\n return out;\n}\n\n/**\n * Resample PCM16 audio using linear interpolation.\n */\nexport function resamplePcm16(pcm: Buffer, fromRate: number, toRate: number): Buffer {\n if (fromRate === toRate || !pcm.length) return pcm;\n\n const nSamples = pcm.length >> 1;\n const ratio = fromRate / toRate;\n const outLen = Math.floor(nSamples / ratio);\n const out = Buffer.alloc(outLen * 2);\n\n for (let i = 0; i < outLen; i++) {\n const srcPos = i * ratio;\n const idx = Math.floor(srcPos);\n const frac = srcPos - idx;\n\n let val: number;\n if (idx + 1 < nSamples) {\n val = pcm.readInt16LE(idx * 2) * (1 - frac) + pcm.readInt16LE((idx + 1) * 2) * frac;\n } else {\n val = pcm.readInt16LE(idx * 2);\n }\n out.writeInt16LE(Math.round(val), i * 2);\n }\n\n return out;\n}\n\nexport { DECODE_TABLE };\n","/**\n * Control WebSocket for agent signaling (call.incoming, call.ended, etc.).\n */\n\nimport type { WebSocket as WsType } from 'ws';\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\n/**\n * Build the full control WebSocket URL from options.\n * Matches Python SDK: /v1/accounts/{account_id}/agent/listen?number={number}\n */\nexport function buildControlWsUrl(options: ControlWsOptions): string {\n const scheme = options.baseUrl.startsWith('https') ? 'wss' : 'ws';\n const host = options.baseUrl.replace(/^https?:\\/\\//, '').replace(/\\/$/, '');\n let url = `${scheme}://${host}/v1/accounts/${encodeURIComponent(options.accountId)}/agent/listen`;\n if (options.number) {\n url += `?number=${encodeURIComponent(options.number)}`;\n }\n return url;\n}\n\nexport class ControlWebSocket {\n private _url: string;\n private _ws: WsType | null = null;\n private _handlers: Map<string, ControlEventHandler[]> = new Map();\n private _reconnectDelay = INITIAL_RECONNECT_DELAY;\n private _closed = false;\n private _connectedResolve: (() => void) | null = null;\n private _connectedPromise: Promise<void>;\n\n constructor(private readonly _options: ControlWsOptions) {\n this._url = buildControlWsUrl(_options);\n this._connectedPromise = new Promise<void>((resolve) => {\n this._connectedResolve = resolve;\n });\n }\n\n /** Register an event handler for a specific event type. */\n on(event: string, handler: ControlEventHandler): void {\n let list = this._handlers.get(event);\n if (!list) {\n list = [];\n this._handlers.set(event, list);\n }\n list.push(handler);\n }\n\n /** Connect to the control WebSocket. */\n async connect(): Promise<void> {\n this._closed = false;\n await this._doConnect();\n }\n\n /** Wait until the WebSocket is connected. */\n async waitConnected(): Promise<void> {\n return this._connectedPromise;\n }\n\n /** Send a JSON message over the control WebSocket. */\n send(message: Record<string, unknown>): void {\n if (this._ws && this._ws.readyState === 1 /* OPEN */) {\n this._ws.send(JSON.stringify(message));\n }\n }\n\n /** Close the WebSocket and stop reconnecting. */\n close(): void {\n this._closed = true;\n 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 if (this._connectedResolve) {\n this._connectedResolve();\n this._connectedResolve = null;\n }\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 console.error('[ControlWebSocket] Failed to parse message');\n }\n });\n\n ws.on('close', () => {\n if (!this._closed) {\n this._scheduleReconnect();\n }\n });\n\n ws.on('error', (err: Error) => {\n console.error('[ControlWebSocket] Error:', err.message);\n });\n }\n\n private _dispatchEvent(event: ControlEvent): void {\n const handlers = this._handlers.get(event.event);\n if (handlers) {\n for (const handler of handlers) {\n try {\n const result = handler(event);\n if (result && typeof result.catch === 'function') {\n result.catch((err: unknown) => {\n console.error(`[ControlWebSocket] Error in handler for ${event.event}:`, err);\n });\n }\n } catch (err) {\n console.error(`[ControlWebSocket] Error in handler for ${event.event}:`, err);\n }\n }\n }\n }\n\n private _scheduleReconnect(): void {\n const delay = this._reconnectDelay;\n this._reconnectDelay = Math.min(this._reconnectDelay * 2, MAX_RECONNECT_DELAY);\n\n setTimeout(() => {\n if (!this._closed) {\n this._doConnect().catch((err) => {\n console.error('[ControlWebSocket] Reconnect failed:', err);\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';\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\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 console.error(`[MCPClient] Failed to connect to server '${name}':`, err);\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 const c = client as { close?: () => Promise<void> };\n if (c.close) {\n await c.close();\n }\n } catch (err) {\n console.error(`[MCPClient] Error disconnecting from '${name}':`, err);\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 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 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 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';\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\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\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\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 /** 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 });\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 console.error('[MediaWebSocket] Error:', err.message);\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 /** 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 'stop': {\n this.close();\n break;\n }\n }\n }\n\n private _startSendLoop(): void {\n if (this._sendLoopRunning) return;\n this._sendLoopRunning = true;\n\n const loop = () => {\n if (this._closed) {\n this._sendLoopRunning = false;\n return;\n }\n\n while (this._audioQueue.length > 0 && this._ws && this._ws.readyState === 1) {\n const payload = this._audioQueue.shift()!;\n this._ws.send(buildMediaResponse(payload));\n }\n\n setTimeout(loop, 20);\n };\n\n loop();\n }\n}\n","/**\n * 3-file call recording: in.wav, out.wav, mix.wav\n *\n * Wall-clock 동기화로 실시간 녹음. 세 파일 모두 동일한 길이로 유지된다.\n * recordings/{call_id}/in.wav — 상대방 음성 (PCM16 8kHz mono)\n * recordings/{call_id}/out.wav — AI 음성 (PCM16 8kHz mono)\n * recordings/{call_id}/mix.wav — 양쪽 믹싱 (PCM16 8kHz mono)\n */\nimport * as fs from 'node:fs'\nimport * as path from 'node:path'\n\nconst SAMPLE_RATE = 8000\nconst CHANNELS = 1\nconst BITS_PER_SAMPLE = 16\nconst BYTES_PER_SECOND = SAMPLE_RATE * CHANNELS * (BITS_PER_SAMPLE / 8) // 16000\n\nexport function makeWavHeader(dataSize: number = 0): Buffer {\n const header = Buffer.alloc(44)\n header.write('RIFF', 0, 'ascii')\n header.writeUInt32LE(36 + dataSize, 4)\n header.write('WAVE', 8, 'ascii')\n header.write('fmt ', 12, 'ascii')\n header.writeUInt32LE(16, 16) // fmt chunk size\n header.writeUInt16LE(1, 20) // PCM format\n header.writeUInt16LE(CHANNELS, 22)\n header.writeUInt32LE(SAMPLE_RATE, 24)\n header.writeUInt32LE(SAMPLE_RATE * CHANNELS * (BITS_PER_SAMPLE / 8), 28) // byte rate\n header.writeUInt16LE(CHANNELS * (BITS_PER_SAMPLE / 8), 32) // block align\n header.writeUInt16LE(BITS_PER_SAMPLE, 34)\n header.write('data', 36, 'ascii')\n header.writeUInt32LE(dataSize, 40)\n return header\n}\n\nexport function mixSamples(a: Buffer, b: Buffer): Buffer {\n const n = Math.min(a.length, b.length) >> 1 // sample count\n const result = Buffer.alloc(n * 2)\n for (let i = 0; i < n; i++) {\n const sa = a.readInt16LE(i * 2)\n const sb = b.readInt16LE(i * 2)\n result.writeInt16LE(Math.max(-32768, Math.min(32767, sa + sb)), i * 2)\n }\n return result\n}\n\nexport class AudioRecorder {\n private readonly _dir: string\n private _fdIn: number | null = null\n private _fdOut: number | null = null\n private _fdMix: number | null = null\n private _inWritten = 0\n private _outWritten = 0\n private _mixWritten = 0\n private _startTime = 0\n private _started = false\n\n constructor(recordingPath: string, callId: string) {\n this._dir = path.join(recordingPath, callId)\n }\n\n start(): void {\n fs.mkdirSync(this._dir, { recursive: true })\n const header = makeWavHeader()\n this._fdIn = fs.openSync(path.join(this._dir, 'in.wav'), 'w')\n this._fdOut = fs.openSync(path.join(this._dir, 'out.wav'), 'w')\n this._fdMix = fs.openSync(path.join(this._dir, 'mix.wav'), 'w+')\n fs.writeSync(this._fdIn, header)\n fs.writeSync(this._fdOut, header)\n fs.writeSync(this._fdMix, header)\n this._startTime = performance.now()\n this._started = true\n }\n\n private _expectedBytes(): number {\n const elapsed = (performance.now() - this._startTime) / 1000 // ms → s\n return Math.floor(elapsed * BYTES_PER_SECOND)\n }\n\n private _padSilence(fd: number, written: number): number {\n const expected = this._expectedBytes()\n let gap = expected - written\n if (gap <= 0) return 0\n gap = gap - (gap % 2) // 2-byte align\n if (gap > 0) {\n fs.writeSync(fd, Buffer.alloc(gap))\n }\n return gap\n }\n\n private _writeToMix(data: Buffer, trackPos: number): void {\n if (this._fdMix === null) return\n const filePos = 44 + trackPos\n\n if (trackPos < this._mixWritten) {\n // Overlap: read existing, mix, write back\n const overlap = Math.min(data.length, this._mixWritten - trackPos)\n const existing = Buffer.alloc(overlap)\n fs.readSync(this._fdMix, existing, 0, overlap, filePos)\n const mixed = mixSamples(existing, data.subarray(0, overlap))\n fs.writeSync(this._fdMix, mixed, 0, mixed.length, filePos)\n // Write remaining beyond overlap\n if (data.length > overlap) {\n fs.writeSync(this._fdMix, data, overlap, data.length - overlap, filePos + overlap)\n this._mixWritten = trackPos + data.length\n }\n } else {\n // No overlap: pad gap if needed, then write\n if (trackPos > this._mixWritten) {\n let gap = trackPos - this._mixWritten\n gap = gap - (gap % 2) // 2-byte align\n if (gap > 0) {\n const silence = Buffer.alloc(gap)\n fs.writeSync(this._fdMix, silence, 0, silence.length, 44 + this._mixWritten)\n this._mixWritten += gap\n }\n }\n fs.writeSync(this._fdMix, data, 0, data.length, 44 + this._mixWritten)\n this._mixWritten += data.length\n }\n }\n\n writeInbound(pcm16_8k: Buffer): void {\n if (!this._started || this._fdIn === null) return\n try {\n const gap = this._padSilence(this._fdIn, this._inWritten)\n this._inWritten += gap\n const posBefore = this._inWritten\n fs.writeSync(this._fdIn, pcm16_8k)\n this._inWritten += pcm16_8k.length\n this._writeToMix(pcm16_8k, posBefore)\n } catch (err) {\n console.error('Error writing inbound audio:', err)\n }\n }\n\n writeOutbound(pcm16_8k: Buffer): void {\n if (!this._started || this._fdOut === null) return\n try {\n const gap = this._padSilence(this._fdOut, this._outWritten)\n this._outWritten += gap\n const posBefore = this._outWritten\n fs.writeSync(this._fdOut, pcm16_8k)\n this._outWritten += pcm16_8k.length\n this._writeToMix(pcm16_8k, posBefore)\n } catch (err) {\n console.error('Error writing outbound audio:', err)\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 } catch (err) {\n console.error('Error stopping recorder:', err)\n } finally {\n this._fdIn = null\n this._fdOut = null\n this._fdMix = null\n this._started = false\n }\n }\n}\n","/**\n * CallSession represents an active phone call and provides methods to\n * send audio, hang up, and listen for lifecycle events.\n */\n\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;\n}\n\nexport class CallSession {\n readonly callId: string;\n readonly fromNumber: string;\n readonly toNumber: string;\n readonly accountId: string;\n readonly direction: CallDirection;\n readonly startTime: Date;\n readonly metadata: Record<string, unknown>;\n\n private _status: CallStatus;\n private _sendAudioFn: SendAudioFn | null = null;\n private _clearAudioFn: ClearAudioFn | null = null;\n private _hangupFn: HangupFn | null = null;\n private _handlers: Map<string, SessionEventHandler[]> = new Map();\n private _endedPromise: Promise<void>;\n private _resolveEnded!: () => void;\n\n constructor(options: {\n callId: string;\n fromNumber: string;\n toNumber: string;\n accountId: string;\n direction: CallDirection;\n metadata?: Record<string, unknown>;\n }) {\n this.callId = options.callId;\n this.fromNumber = options.fromNumber;\n this.toNumber = options.toNumber;\n this.accountId = options.accountId;\n this.direction = options.direction;\n this.metadata = options.metadata ?? {};\n this._status = 'ringing';\n this.startTime = new Date();\n\n this._endedPromise = new Promise<void>((resolve) => {\n this._resolveEnded = resolve;\n });\n }\n\n get status(): CallStatus {\n return this._status;\n }\n\n get duration(): number {\n return (Date.now() - this.startTime.getTime()) / 1000;\n }\n\n /** Bind transport functions (called internally by the agent). */\n _bindTransport(send: SendAudioFn, clear: ClearAudioFn, hangup: HangupFn): void {\n this._sendAudioFn = send;\n this._clearAudioFn = clear;\n this._hangupFn = hangup;\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. */\n hangup(): void {\n if (this._hangupFn) {\n this._hangupFn();\n }\n }\n\n /** Register an event handler. */\n on(event: string, handler: SessionEventHandler): void {\n let list = this._handlers.get(event);\n if (!list) {\n list = [];\n this._handlers.set(event, list);\n }\n list.push(handler);\n }\n\n /** Wait for the call to end. */\n async wait(): Promise<void> {\n return this._endedPromise;\n }\n\n /** Mark the session as ended (called internally). */\n _markEnded(): void {\n this._status = 'ended';\n this._resolveEnded();\n }\n\n /** Emit an event to registered handlers. Matches Python SDK: _emit(event, ...args) */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n _emit(event: string, ...args: any[]): void {\n const handlers = this._handlers.get(event);\n if (handlers) {\n for (const handler of handlers) {\n try {\n const result = handler(this, ...args);\n if (result && typeof result.catch === 'function') {\n result.catch((err: unknown) => {\n console.error(`[CallSession] Error in ${event} handler:`, err);\n });\n }\n } catch (err) {\n console.error(`[CallSession] Error in ${event} handler:`, err);\n }\n }\n }\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 { 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 { ToolRegistry } from './tool.js';\nimport type { FunctionTool } from './tool.js';\nimport type { Session } from './pipeline/base.js';\nimport { setTracingConfig } from './tracing/config.js';\nimport type { TracingConfig } from './tracing/config.js';\nimport { withSpan } from './tracing/spans.js';\nimport { ATTR_CALL_ID, ATTR_CALL_DIRECTION, ATTR_AGENT_ID } from './tracing/attributes.js';\n\nexport type AgentEventType =\n | 'call_start'\n | 'call_end'\n | 'call_failed'\n | 'transcript';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AgentEventHandler = (...args: any[]) => void | Promise<void>;\n\nexport interface ClawOpsAgentOptions {\n /** ClawOps API key. Falls back to CLAWOPS_API_KEY env var. */\n apiKey?: string;\n /** Account ID. Falls back to CLAWOPS_ACCOUNT_ID env var. */\n accountId?: string;\n /** API base URL. */\n baseUrl?: string;\n /** Phone number to send/receive calls from. Required. */\n from: string;\n /** Session implementation (OpenAIRealtime, GeminiRealtime, PipelineSession, etc.). */\n session: Session;\n /** Enable call recording. */\n recording?: boolean;\n /** Recording output directory. Default: './recordings' */\n recordingPath?: string;\n /** MCP server configurations. */\n mcpServers?: Array<MCPServerStdio | MCPServerHTTP>;\n /** Tracing configuration. */\n tracing?: TracingConfig;\n}\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\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\n // Configure tracing\n if (options.tracing) {\n setTracingConfig(options.tracing);\n }\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('tool(name, description, parameters, handler) requires all arguments.');\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._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('Account ID is required. Set CLAWOPS_ACCOUNT_ID or pass accountId option.');\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.on('call.incoming', (event) => this._handleIncoming(event));\n this._controlWs.on('call.ended', (event) => this._handleEnded(event));\n this._controlWs.on('call.outbound_ready', (event) => this._handleOutboundReady(event));\n this._controlWs.on('call.ringing', (event) => this._handleRinging(event));\n this._controlWs.on('call.failed', (event) => this._handleFailed(event));\n\n try {\n await this._controlWs.connect();\n await this._controlWs.waitConnected();\n } catch (err) {\n throw new AgentConnectionError(\n `Failed to connect to ClawOps: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n console.log(`[ClawOpsAgent] Connected on ${this._fromNumber}`);\n }\n\n /**\n * Connect and block until disconnected.\n * Convenience method for simple agent scripts.\n */\n async serve(): Promise<void> {\n await this.connect();\n\n // Block indefinitely until process signal\n return new Promise<void>((resolve) => {\n const shutdown = () => {\n this.disconnect()\n .then(resolve)\n .catch(() => resolve());\n };\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n });\n }\n\n /** Disconnect from the platform. */\n async disconnect(): Promise<void> {\n if (this._controlWs) {\n this._controlWs.close();\n this._controlWs = null;\n }\n\n for (const session of this._activeSessions.values()) {\n session._markEnded();\n }\n this._activeSessions.clear();\n console.log('[ClawOpsAgent] Disconnected');\n }\n\n /**\n * Initiate an outbound call.\n * Matches Python SDK: agent.call(to, { timeout })\n */\n async call(to: string, options?: { timeout?: number }): Promise<CallSession> {\n await this.connect();\n\n const url = `${this._baseUrl}/v1/accounts/${this._accountId}/calls`;\n const body = { To: to, From: this._fromNumber, Timeout: options?.timeout ?? 60 };\n const resp = await fetch(url, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this._apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n });\n\n if (resp.status !== 201) {\n const error = (await resp.json()) as Record<string, unknown>;\n throw new AgentError(`발신 실패 (${resp.status}): ${(error['error'] as string) ?? ''}`);\n }\n\n const data = (await resp.json()) as Record<string, unknown>;\n\n const callSession = new CallSession({\n callId: data['callId'] as string,\n fromNumber: this._fromNumber,\n toNumber: to,\n accountId: this._accountId,\n direction: 'outbound',\n });\n\n // Register all agent-level event handlers on the session\n for (const [evt, handlers] of this._handlers) {\n for (const handler of handlers) {\n callSession.on(evt, handler);\n }\n }\n\n this._activeSessions.set(callSession.callId, callSession);\n console.log(`[ClawOpsAgent] Outbound call initiated: ${this._fromNumber} -> ${to} (${callSession.callId})`);\n return callSession;\n }\n\n private _handleIncoming(event: ControlEvent): void {\n const callId = event['callId'] as string;\n const fromNumber = (event['from'] as string) ?? '';\n const mediaUrl = (event['mediaUrl'] as string) ?? '';\n\n const session = new CallSession({\n callId,\n fromNumber,\n toNumber: this._fromNumber,\n accountId: this._accountId,\n direction: 'inbound',\n });\n\n // Register all agent-level event handlers on the session\n for (const [evt, handlers] of this._handlers) {\n for (const handler of handlers) {\n session.on(evt, handler);\n }\n }\n\n this._activeSessions.set(callId, session);\n\n // Accept the call\n if (this._controlWs) {\n this._controlWs.send({ event: 'call.accept', callId });\n }\n\n if (mediaUrl) {\n this._startCallSession(session, mediaUrl).catch((err) => {\n console.error(`[ClawOpsAgent] Error in call session ${callId}:`, err);\n });\n }\n }\n\n private _handleEnded(event: ControlEvent): void {\n const callId = event['callId'] as string;\n const session = this._activeSessions.get(callId);\n if (session) {\n session._markEnded();\n this._activeSessions.delete(callId);\n }\n }\n\n private _handleOutboundReady(event: ControlEvent): void {\n const callId = event['callId'] as string;\n const mediaUrl = (event['mediaUrl'] as string) ?? '';\n let session = this._activeSessions.get(callId);\n\n if (!session) {\n session = new CallSession({\n callId,\n fromNumber: this._fromNumber,\n toNumber: (event['to'] as string) ?? '',\n accountId: this._accountId,\n direction: 'outbound',\n });\n\n // Register all agent-level event handlers on the session\n for (const [evt, handlers] of this._handlers) {\n for (const handler of handlers) {\n session.on(evt, handler);\n }\n }\n\n this._activeSessions.set(callId, session);\n }\n\n if (mediaUrl) {\n this._startCallSession(session, mediaUrl).catch((err) => {\n console.error(`[ClawOpsAgent] Error in call session ${callId}:`, err);\n });\n }\n }\n\n private _handleRinging(event: ControlEvent): void {\n const callId = event['callId'] as string;\n const session = this._activeSessions.get(callId);\n if (session) {\n console.log(`[ClawOpsAgent] Outbound call ringing: ${callId}`);\n }\n }\n\n private _handleFailed(event: ControlEvent): void {\n const callId = event['callId'] as string;\n const session = this._activeSessions.get(callId);\n if (session) {\n session._emit('call_failed', (event['reason'] as string) ?? 'failed');\n session._markEnded();\n this._activeSessions.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.addServer('mcp', serverConfig);\n try {\n const tools = await client.connect();\n sessionTools.registerMcpTools(tools);\n mcpClients.push(client);\n } catch (err) {\n console.error('[ClawOpsAgent] MCP connection error:', err);\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.start();\n }\n\n // Connect media WebSocket\n const mediaWs = new MediaWebSocket();\n\n // Bind transport functions to session — sessions send ulaw bytes directly\n session._bindTransport(\n (audio: Buffer) => {\n mediaWs.sendAudio(audio.toString('base64'));\n },\n () => {\n mediaWs.sendClear();\n },\n () => {\n mediaWs.close();\n },\n );\n\n const sessionHandler = this._session;\n\n // Inject tools and recorder into session if supported\n if ('setToolRegistry' in sessionHandler && typeof sessionHandler.setToolRegistry === 'function') {\n sessionHandler.setToolRegistry(sessionTools);\n }\n if (recorder && 'setRecorder' in sessionHandler && typeof sessionHandler.setRecorder === 'function') {\n sessionHandler.setRecorder(recorder);\n }\n\n // Handle inbound audio — feed raw ulaw to session (each session converts as needed)\n mediaWs.onAudio((ulawAudio: Buffer, _timestamp: number) => {\n if (sessionHandler) {\n sessionHandler.feedAudio(ulawAudio);\n }\n if (recorder) {\n recorder.writeInbound(ulawToPcm16(ulawAudio));\n }\n });\n\n mediaWs.onClose(() => {\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\n // Start the session handler\n await sessionHandler.start(session, sessionTools);\n\n // Wait for the call to end\n await session.wait();\n\n // Stop the session handler\n await sessionHandler.stop();\n } catch (err) {\n console.error(`[ClawOpsAgent] Call session error:`, err);\n } finally {\n // Clean up MCP clients\n if (mcpClients.length > 0) {\n sessionTools.clearMcpTools();\n for (const c of mcpClients) {\n await c.disconnect();\n }\n }\n\n mediaWs.close();\n if (recorder) {\n recorder.stop();\n }\n\n // Emit call_end\n session._emit('call_end');\n session._markEnded();\n this._activeSessions.delete(session.callId);\n }\n },\n );\n }\n}\n","/**\n * OpenAI Realtime API session (speech-to-speech).\n *\n * Matches Python SDK's OpenAIRealtime implementation.\n */\n\nimport type { CallSession } from '../session.js';\nimport type { ToolRegistry } from '../tool.js';\nimport type { AudioRecorder } from '../recorder.js';\nimport type { Session } from './base.js';\nimport { ulawToPcm16 } from '../audio.js';\n\nconst OPENAI_REALTIME_URL = 'wss://api.openai.com/v1/realtime?model=';\n\nconst HANG_UP_TOOL = {\n type: 'function' as const,\n name: 'hang_up',\n description: 'End the phone call. Use when the conversation is finished or the caller says goodbye.',\n parameters: { type: 'object' as const, properties: {} as Record<string, unknown>, required: [] as string[] },\n};\n\nexport interface OpenAIRealtimeOptions {\n /** OpenAI API key. Falls back to OPENAI_API_KEY env var. */\n apiKey?: string;\n /** System prompt / instructions for the AI. */\n systemPrompt?: string;\n /** Model to use. Default: 'gpt-realtime-1.5' */\n model?: string;\n /** Voice ID. Default: 'marin' */\n voice?: string;\n /** Language code (BCP 47). Default: 'ko' */\n language?: string;\n /** VAD eagerness: 'low', 'medium', 'high'. Default: 'high' */\n eagerness?: string;\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 _eagerness: string;\n private _greeting: boolean;\n\n private _ws: import('ws').WebSocket | null = null;\n private _call: CallSession | null = null;\n private _tools: ToolRegistry | null = null;\n private _recorder: AudioRecorder | null = null;\n private _closed = false;\n\n // Truncation / barge-in tracking (matching Python SDK)\n private _lastAssistantItem: string | null = null;\n private _responseStartTs: number | null = null;\n private _sentAudioChunks = 0;\n private _audioRemainder: Buffer = Buffer.alloc(0);\n\n constructor(options: OpenAIRealtimeOptions = {}) {\n this._apiKey = options.apiKey ?? process.env['OPENAI_API_KEY'] ?? '';\n this._systemPrompt = options.systemPrompt ?? '';\n this._model = options.model ?? 'gpt-realtime-1.5';\n this._voice = options.voice ?? 'marin';\n this._language = options.language ?? 'ko';\n this._eagerness = options.eagerness ?? 'high';\n this._greeting = options.greeting ?? true;\n }\n\n /** Inject per-call ToolRegistry. */\n setToolRegistry(registry: ToolRegistry): void {\n this._tools = registry;\n }\n\n /** Inject per-call AudioRecorder. */\n setRecorder(recorder: AudioRecorder): void {\n this._recorder = recorder;\n }\n\n async start(callSession: CallSession, tools?: ToolRegistry): Promise<void> {\n this._call = callSession;\n if (tools) this._tools = tools;\n this._closed = false;\n this._lastAssistantItem = null;\n this._responseStartTs = null;\n this._sentAudioChunks = 0;\n this._audioRemainder = Buffer.alloc(0);\n\n if (!this._apiKey) {\n throw new Error('OpenAI API key is required. Set OPENAI_API_KEY or pass apiKey option.');\n }\n\n const { WebSocket } = await import('ws');\n const url = `${OPENAI_REALTIME_URL}${this._model}`;\n\n this._ws = new WebSocket(url, {\n headers: {\n Authorization: `Bearer ${this._apiKey}`,\n 'OpenAI-Beta': 'realtime=v1',\n },\n });\n\n return new Promise<void>((resolve, reject) => {\n const ws = this._ws!;\n\n ws.on('open', () => {\n this._sendSessionUpdate();\n\n // Send initial greeting if enabled (matching Python SDK)\n if (this._greeting) {\n this._send({ type: 'response.create' });\n }\n\n resolve();\n });\n\n ws.on('message', (data: Buffer | string) => {\n try {\n const msg = JSON.parse(data.toString()) as Record<string, unknown>;\n this._handleMessage(msg);\n } catch {\n // Ignore parse errors\n }\n });\n\n ws.on('close', () => {\n this._closed = true;\n });\n\n ws.on('error', (err: Error) => {\n if (!this._ws) {\n reject(err);\n }\n console.error('[OpenAIRealtime] WebSocket error:', err.message);\n });\n });\n }\n\n feedAudio(audio: Buffer): void {\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 if (this._ws) {\n this._ws.close();\n this._ws = null;\n }\n }\n\n private _sendSessionUpdate(): void {\n if (!this._ws || this._ws.readyState !== 1) return;\n\n // Build tool schemas: user tools + hang_up\n // OpenAI Realtime API uses flat tool format: { type, name, description, parameters }\n const toolSchemas = this._tools\n ? this._tools.toOpenAITools().map((t) => ({ type: 'function' as const, ...t.function }))\n : [];\n toolSchemas.push(HANG_UP_TOOL);\n\n this._send({\n type: 'session.update',\n session: {\n modalities: ['text', 'audio'],\n voice: this._voice,\n instructions: this._systemPrompt,\n input_audio_format: 'g711_ulaw',\n output_audio_format: 'g711_ulaw',\n input_audio_transcription: {\n model: 'gpt-4o-mini-transcribe',\n language: this._language,\n },\n input_audio_noise_reduction: { type: 'far_field' },\n turn_detection: {\n type: 'semantic_vad',\n interrupt_response: true,\n eagerness: this._eagerness,\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.audio.delta': {\n this._handleAudioDelta(msg);\n break;\n }\n case 'response.audio.done': {\n // Flush remaining audio with silence padding\n if (this._audioRemainder.length > 0) {\n const padded = Buffer.concat([\n this._audioRemainder,\n Buffer.alloc(160 - this._audioRemainder.length, 0xff),\n ]);\n if (this._call) {\n this._call.sendAudio(padded);\n }\n this._sentAudioChunks++;\n this._audioRemainder = Buffer.alloc(0);\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 (matching Python SDK: response.output_item.done)\n const item = msg['item'] as Record<string, unknown> | undefined;\n if (item && item['type'] === 'function_call') {\n this._handleToolCall(item);\n }\n break;\n }\n case 'conversation.item.input_audio_transcription.completed': {\n // User transcript\n if (this._call) {\n this._call._emit('transcript', 'user', (msg['transcript'] as string) ?? '');\n }\n break;\n }\n case 'response.audio_transcript.done': {\n // Assistant transcript\n if (this._call) {\n this._call._emit('transcript', 'assistant', (msg['transcript'] as string) ?? '');\n }\n break;\n }\n case 'error': {\n console.error('[OpenAIRealtime] API error:', msg['error']);\n break;\n }\n }\n }\n\n private _handleAudioDelta(msg: Record<string, unknown>): void {\n if (this._responseStartTs === null) {\n this._responseStartTs = Date.now();\n this._sentAudioChunks = 0;\n }\n if (msg['item_id']) {\n this._lastAssistantItem = msg['item_id'] as string;\n }\n\n const ulaw = Buffer.from(msg['delta'] as string, 'base64');\n\n if (this._recorder) {\n this._recorder.writeOutbound(ulawToPcm16(ulaw));\n }\n\n // Align to 160B (20ms at 8kHz ulaw) frames, matching Python SDK\n const combined = Buffer.concat([this._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 this._sentAudioChunks++;\n }\n\n this._audioRemainder = combined.subarray(fullEnd);\n }\n\n private _handleTruncation(): void {\n if (!this._lastAssistantItem || this._responseStartTs === null) {\n return;\n }\n\n // Calculate audio end based on sent chunks (160B = 20ms per ulaw chunk)\n const audioEndMs = Math.max(0, this._sentAudioChunks * 20);\n\n this._send({\n type: 'conversation.item.truncate',\n item_id: this._lastAssistantItem,\n content_index: 0,\n audio_end_ms: audioEndMs,\n });\n\n if (this._call) {\n this._call.clearAudio();\n }\n\n this._lastAssistantItem = null;\n this._responseStartTs = null;\n this._sentAudioChunks = 0;\n this._audioRemainder = Buffer.alloc(0);\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\n // Built-in hang_up tool\n if (funcName === 'hang_up') {\n if (this._call) {\n this._call.hangup();\n }\n return;\n }\n\n if (!this._tools || !this._tools.has(funcName)) {\n console.error(`[OpenAIRealtime] Unknown tool: ${funcName}`);\n return;\n }\n\n let result: unknown;\n try {\n const args = JSON.parse((item['arguments'] as string) ?? '{}') as Record<string, unknown>;\n result = await this._tools.call(funcName, args);\n } catch (err) {\n console.error(`[OpenAIRealtime] Tool call failed: ${funcName}:`, err);\n result = `Error: ${err}`;\n }\n\n this._send({\n type: 'conversation.item.create',\n item: {\n type: 'function_call_output',\n call_id: callId,\n output: typeof result === 'string' ? result : JSON.stringify(result),\n },\n });\n\n this._send({ type: 'response.create' });\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 * Matches Python SDK's GeminiRealtime 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 { pcm16ToUlaw, resamplePcm16, ulawToPcm16 } from '../audio.js';\n\nconst HANG_UP_TOOL = {\n name: 'hang_up',\n description: 'End the phone call. Use when the conversation is finished or the caller says goodbye.',\n parameters: { type: 'object', properties: {} },\n};\n\nexport interface GeminiRealtimeOptions {\n /** Google API key. Falls back to GOOGLE_API_KEY env var. */\n apiKey?: string;\n /** System prompt / instructions for the AI. */\n systemPrompt?: string;\n /** Model to use. Default: 'gemini-2.5-flash-native-audio-preview-12-2025' */\n model?: string;\n /** Voice name. Default: 'Kore' */\n voice?: string;\n /** Language code. Default: 'ko' */\n language?: string;\n /** Send initial greeting. Default: true */\n greeting?: boolean;\n /** Generation config overrides. */\n generationConfig?: Record<string, unknown>;\n}\n\nexport class GeminiRealtime implements Session {\n private _apiKey: string;\n private _systemPrompt: string;\n private _model: string;\n private _voice: string;\n private _language: string;\n private _greeting: boolean;\n private _generationConfig: Record<string, unknown> | undefined;\n\n private _ws: import('ws').WebSocket | null = null;\n private _call: CallSession | null = null;\n private _tools: ToolRegistry | null = null;\n private _recorder: AudioRecorder | null = null;\n private _closed = false;\n private _sentAudioChunks = 0;\n private _audioRemainder: Buffer = Buffer.alloc(0);\n\n constructor(options: GeminiRealtimeOptions = {}) {\n this._apiKey = options.apiKey ?? process.env['GOOGLE_API_KEY'] ?? '';\n this._systemPrompt = options.systemPrompt ?? '';\n this._model = options.model ?? 'gemini-2.5-flash-native-audio-preview-12-2025';\n this._voice = options.voice ?? 'Kore';\n this._language = options.language ?? 'ko';\n this._greeting = options.greeting ?? true;\n this._generationConfig = options.generationConfig;\n }\n\n /** Inject per-call ToolRegistry. */\n setToolRegistry(registry: ToolRegistry): void {\n this._tools = registry;\n }\n\n /** Inject per-call AudioRecorder. */\n setRecorder(recorder: AudioRecorder): void {\n this._recorder = recorder;\n }\n\n async start(callSession: CallSession, tools?: ToolRegistry): Promise<void> {\n this._call = callSession;\n if (tools) this._tools = tools;\n this._closed = false;\n this._sentAudioChunks = 0;\n this._audioRemainder = Buffer.alloc(0);\n\n if (!this._apiKey) {\n throw new Error('Google API key is required. Set GOOGLE_API_KEY or pass apiKey option.');\n }\n\n const { WebSocket } = await import('ws');\n const url = `wss://generativelanguage.googleapis.com/ws/google.ai.generativelanguage.v1beta.GenerativeService.BidiGenerateContent?key=${this._apiKey}`;\n\n this._ws = new WebSocket(url);\n\n return new Promise<void>((resolve, reject) => {\n const ws = this._ws!;\n\n ws.on('open', () => {\n this._sendSetup();\n // Wait for setupComplete before resolving\n this._waitSetupComplete().then(() => {\n if (this._greeting) {\n this._sendGreeting();\n }\n // Start receive loop\n this._receiveLoop();\n resolve();\n }).catch(reject);\n });\n\n ws.on('close', () => {\n this._closed = true;\n });\n\n ws.on('error', (err: Error) => {\n if (!this._ws) {\n reject(err);\n }\n console.error('[GeminiRealtime] WebSocket error:', err.message);\n });\n });\n }\n\n feedAudio(audio: Buffer): void {\n if (this._ws && this._ws.readyState === 1 && !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 this._ws.send(\n JSON.stringify({\n realtimeInput: {\n mediaChunks: [\n {\n mimeType: 'audio/pcm;rate=16000',\n data: pcm16k.toString('base64'),\n },\n ],\n },\n }),\n );\n }\n }\n\n async stop(): Promise<void> {\n this._closed = true;\n if (this._ws) {\n this._ws.close();\n this._ws = null;\n }\n }\n\n private _sendSetup(): void {\n if (!this._ws || this._ws.readyState !== 1) return;\n\n const setupConfig: Record<string, unknown> = {\n model: `models/${this._model}`,\n generationConfig: {\n responseModalities: ['AUDIO'],\n speechConfig: {\n voiceConfig: {\n prebuiltVoiceConfig: {\n voiceName: this._voice,\n },\n },\n },\n ...this._generationConfig,\n },\n realtimeInputConfig: {\n automaticActivityDetection: {\n disabled: false,\n },\n },\n };\n\n if (this._systemPrompt) {\n setupConfig['systemInstruction'] = {\n parts: [{ text: this._systemPrompt }],\n };\n }\n\n // Tools: user tools + hang_up\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: t.function.parameters,\n }))\n : [];\n toolDefs.push(HANG_UP_TOOL);\n setupConfig['tools'] = [{ functionDeclarations: toolDefs }];\n\n this._ws.send(JSON.stringify({ setup: setupConfig }));\n }\n\n private _waitSetupComplete(): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n if (!this._ws) {\n reject(new Error('WebSocket not connected'));\n return;\n }\n const onMessage = (data: Buffer | string) => {\n try {\n const msg = JSON.parse(data.toString()) as Record<string, unknown>;\n if ('setupComplete' in msg) {\n this._ws?.removeListener('message', onMessage);\n resolve();\n }\n } catch {\n // Ignore parse errors\n }\n };\n this._ws.on('message', onMessage);\n });\n }\n\n private _sendGreeting(): void {\n if (!this._ws || this._ws.readyState !== 1) return;\n this._ws.send(\n JSON.stringify({\n clientContent: {\n turns: [\n {\n role: 'user',\n parts: [{ text: '인사해 주세요.' }],\n },\n ],\n turnComplete: true,\n },\n }),\n );\n }\n\n private _receiveLoop(): void {\n if (!this._ws) return;\n this._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\n private _handleMessage(msg: Record<string, unknown>): void {\n if (!this._call) return;\n\n // Handle server content with audio\n const serverContent = msg['serverContent'] as Record<string, unknown> | undefined;\n if (serverContent) {\n const modelTurn = serverContent['modelTurn'] as Record<string, unknown> | undefined;\n if (modelTurn) {\n const parts = modelTurn['parts'] as Array<Record<string, unknown>> | undefined;\n if (parts) {\n for (const part of parts) {\n const inlineData = part['inlineData'] as Record<string, unknown> | undefined;\n if (inlineData && inlineData['data']) {\n const mimeType = (inlineData['mimeType'] as string) ?? '';\n if (mimeType.includes('audio')) {\n this._handleAudioData(inlineData['data'] as string);\n }\n }\n\n // Text transcript from model turn\n const text = part['text'] as string | undefined;\n if (text && this._call) {\n this._call._emit('transcript', 'assistant', text);\n }\n }\n }\n }\n\n // Turn complete - flush audio remainder\n if (serverContent['turnComplete']) {\n this._flushAudioRemainder();\n }\n\n // Barge-in (interrupt)\n if (serverContent['interrupted']) {\n if (this._call) {\n this._call.clearAudio();\n }\n this._sentAudioChunks = 0;\n this._audioRemainder = Buffer.alloc(0);\n }\n }\n\n // Input transcription (top-level field)\n const inputTranscription = msg['inputTranscription'] as Record<string, unknown> | undefined;\n if (inputTranscription) {\n const text = inputTranscription['text'] as string | undefined;\n if (text && this._call) {\n this._call._emit('transcript', 'user', text);\n }\n }\n\n // Output transcription (top-level field)\n const outputTranscription = msg['outputTranscription'] as Record<string, unknown> | undefined;\n if (outputTranscription) {\n const text = outputTranscription['text'] as string | undefined;\n if (text && this._call) {\n this._call._emit('transcript', 'assistant', text);\n }\n }\n\n // Handle tool calls\n const toolCall = msg['toolCall'] as Record<string, unknown> | undefined;\n if (toolCall) {\n this._handleToolCall(toolCall);\n }\n\n // Handle tool call cancellation\n if (msg['toolCallCancellation']) {\n // Logged but no action needed\n }\n }\n\n private _handleAudioData(b64Data: string): void {\n if (!this._call) return;\n\n const pcm24k = Buffer.from(b64Data, 'base64');\n if (this._recorder) {\n this._recorder.writeOutbound(resamplePcm16(pcm24k, 24000, 8000));\n }\n\n // PCM16 24kHz → PCM16 8kHz → G.711 ulaw\n const pcm8k = resamplePcm16(pcm24k, 24000, 8000);\n const ulaw = pcm16ToUlaw(pcm8k);\n\n // 160B frame alignment (160B = 20ms at 8kHz ulaw)\n const combined = Buffer.concat([this._audioRemainder, ulaw]);\n const chunkSize = 160;\n const fullEnd = Math.floor(combined.length / chunkSize) * chunkSize;\n for (let off = 0; off < fullEnd; off += chunkSize) {\n this._call.sendAudio(combined.subarray(off, off + chunkSize));\n this._sentAudioChunks++;\n }\n this._audioRemainder = combined.subarray(fullEnd);\n }\n\n private _flushAudioRemainder(): void {\n if (this._audioRemainder.length > 0 && this._call) {\n const padded = Buffer.concat([\n this._audioRemainder,\n Buffer.alloc(160 - this._audioRemainder.length, 0xff),\n ]);\n this._call.sendAudio(padded);\n this._sentAudioChunks++;\n this._audioRemainder = Buffer.alloc(0);\n }\n }\n\n private async _handleToolCall(toolCall: Record<string, unknown>): Promise<void> {\n const functionCalls = toolCall['functionCalls'] as Array<Record<string, unknown>> | undefined;\n if (!functionCalls) return;\n\n const responses: Array<Record<string, unknown>> = [];\n\n for (const fc of functionCalls) {\n const name = fc['name'] as string;\n const fcId = (fc['id'] as string) ?? '';\n const args = (fc['args'] as Record<string, unknown>) ?? {};\n\n // Built-in hang_up tool\n if (name === 'hang_up') {\n if (this._call) {\n this._call.hangup();\n }\n return;\n }\n\n if (!this._tools || !this._tools.has(name)) {\n console.error(`[GeminiRealtime] Unknown tool: ${name}`);\n responses.push({ id: fcId, name, response: { error: `Unknown tool: ${name}` } });\n continue;\n }\n\n try {\n const result = await this._tools.call(name, args);\n responses.push({\n id: fcId,\n name,\n response: { result: typeof result === 'string' ? result : JSON.stringify(result) },\n });\n } catch (err) {\n console.error(`[GeminiRealtime] Tool call error for ${name}:`, err);\n responses.push({\n id: fcId,\n name,\n response: { error: String(err) },\n });\n }\n }\n\n if (this._ws && this._ws.readyState === 1) {\n this._ws.send(\n JSON.stringify({\n toolResponse: {\n functionResponses: responses,\n },\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 type { AudioRecorder } from '../recorder.js';\nimport type { CallSession } from '../session.js';\nimport type { ToolRegistry } from '../tool.js';\nimport type {\n ConversationMessage,\n LLM,\n LLMChunk,\n Session,\n STT,\n TTS,\n} from './base.js';\n\nexport interface PipelineSessionOptions {\n stt: STT;\n llm: LLM;\n tts: TTS;\n /** System prompt for the LLM. */\n systemPrompt?: string;\n /** Send initial greeting. Default: true */\n greeting?: boolean;\n /** Language code. Default: 'ko' */\n language?: string;\n /** Tool registry for function calling. */\n toolRegistry?: ToolRegistry;\n /** Audio recorder for the session. */\n recorder?: AudioRecorder;\n /** LLM temperature. */\n temperature?: number;\n /** Max tokens for LLM generation. */\n maxTokens?: number;\n /** Sample rate for audio. Default: 8000 */\n sampleRate?: number;\n /** Whether to interrupt TTS when user starts speaking. Default: true */\n interruptOnSpeech?: boolean;\n}\n\nexport class PipelineSession implements Session {\n private _stt: STT;\n private _llm: LLM;\n private _tts: TTS;\n private _systemPrompt: string | undefined;\n private _greeting: boolean;\n private _language: string;\n private _temperature: number | undefined;\n private _maxTokens: number | undefined;\n private _sampleRate: number;\n private _interruptOnSpeech: boolean;\n\n private _callSession: CallSession | null = null;\n private _tools: ToolRegistry | null = null;\n private _recorder: AudioRecorder | null = null;\n private _conversation: ConversationMessage[] = [];\n private _audioBuffer: Buffer[] = [];\n private _running = false;\n private _speaking = false;\n\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 async start(callSession: CallSession, tools?: ToolRegistry): Promise<void> {\n this._callSession = callSession;\n this._tools = tools ?? null;\n this._running = true;\n this._conversation = [];\n\n if (this._systemPrompt) {\n this._conversation.push({\n role: 'system',\n content: this._systemPrompt,\n });\n }\n\n // Generate initial greeting if enabled\n if (this._greeting) {\n this._generateGreeting().catch((err) => {\n console.error('[PipelineSession] Greeting error:', err);\n });\n }\n\n // Start the STT listening loop\n this._runSttLoop().catch((err) => {\n console.error('[PipelineSession] STT loop error:', err);\n });\n }\n\n feedAudio(audio: Buffer): void {\n if (this._running) {\n this._audioBuffer.push(audio);\n }\n }\n\n async stop(): Promise<void> {\n this._running = false;\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 }\n\n if (event.type === 'final' && event.transcript.trim()) {\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 async _respond(): Promise<void> {\n // Run LLM generation (may include tool calls)\n let fullResponse = '';\n const textChunks: string[] = [];\n\n const llmStream = this._llm.generate(this._conversation, {\n tools: this._tools ?? undefined,\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._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 || !this._tools) return;\n\n const { id, name, arguments: argsStr } = chunk.toolCall;\n\n try {\n const args = JSON.parse(argsStr) as Record<string, unknown>;\n const result = await this._tools.call(name, args);\n\n this._conversation.push({\n role: 'assistant',\n content: '',\n // Tool call info stored in the message flow\n });\n this._conversation.push({\n role: 'tool',\n content: typeof result === 'string' ? result : JSON.stringify(result),\n tool_call_id: id,\n name,\n });\n\n // Re-generate after tool result\n let followUpText = '';\n const followUpStream = this._llm.generate(this._conversation, {\n tools: this._tools ?? undefined,\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 console.error(`[PipelineSession] Tool call error for ${name}:`, err);\n }\n }\n\n private async _synthesizeAndSend(text: string): Promise<void> {\n if (!this._callSession || !this._running) return;\n\n this._speaking = true;\n\n try {\n for await (const audioChunk of this._tts.synthesize(text, {\n sampleRate: this._sampleRate,\n })) {\n if (!this._running || !this._speaking) break;\n if (this._recorder) {\n const pcm8k = this._sampleRate !== 8000\n ? resamplePcm16(audioChunk, this._sampleRate, 8000)\n : audioChunk\n this._recorder.writeOutbound(pcm8k)\n }\n // Resample TTS output → 8kHz → ulaw, send in 160B frames\n const pcm8k = resamplePcm16(audioChunk, this._sampleRate, 8000);\n const ulaw = pcm16ToUlaw(pcm8k);\n for (let off = 0; off < ulaw.length; off += 160) {\n let chunk = ulaw.subarray(off, off + 160);\n if (chunk.length < 160) {\n chunk = Buffer.concat([chunk, Buffer.alloc(160 - chunk.length, 0xff)]);\n }\n this._callSession.sendAudio(chunk);\n }\n }\n } catch (err) {\n console.error('[PipelineSession] TTS error:', err);\n } finally {\n this._speaking = false;\n }\n }\n}\n","/**\n * Deepgram STT (Speech-to-Text) provider.\n */\n\nimport type { SpeechEvent, STT } from './base.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\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 console.error('[DeepgramSTT] WebSocket error:', err.message);\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\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 { TTS } from './base.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\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 console.error('[ElevenLabsTTS] WebSocket error:', err.message);\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\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 ws.send(JSON.stringify({ text: chunk }));\n }\n }\n } finally {\n // Send end-of-stream\n if (ws.readyState === 1) {\n ws.send(JSON.stringify({ text: '' }));\n }\n }\n })();\n\n // Yield audio chunks\n try {\n while (!done || audioQueue.length > 0) {\n if (audioQueue.length > 0) {\n yield audioQueue.shift()!;\n } else if (!done) {\n await new Promise<void>((resolve) => {\n resolveWait = resolve;\n });\n }\n }\n } finally {\n done = true;\n ws.close();\n await feedPromise.catch(() => {});\n }\n }\n}\n","/**\n * OpenAI LLM provider for pipeline-based voice agents.\n */\n\nimport type { ConversationMessage, LLM, LLMChunk } from './base.js';\nimport type { ToolRegistry } from '../tool.js';\n\nexport interface OpenAILLMOptions {\n /** OpenAI API key. Falls back to OPENAI_API_KEY env var. */\n apiKey?: string;\n /** Model to use. Default: 'gpt-4o-mini' */\n model?: string;\n /** Default temperature. Default: 0.8 */\n temperature?: number;\n /** Default max tokens. Default: 4096 */\n maxTokens?: number;\n}\n\nexport class OpenAILLM implements LLM {\n private _options: OpenAILLMOptions;\n\n constructor(options: OpenAILLMOptions = {}) {\n this._options = {\n model: 'gpt-4o-mini',\n temperature: 0.8,\n maxTokens: 4096,\n ...options,\n };\n }\n\n async *generate(\n messages: ConversationMessage[],\n options?: {\n tools?: ToolRegistry;\n temperature?: number;\n maxTokens?: number;\n },\n ): AsyncGenerator<LLMChunk> {\n const OpenAI = (await import('openai')).default;\n\n const client = new OpenAI({\n apiKey: this._options.apiKey ?? process.env['OPENAI_API_KEY'],\n });\n\n const requestParams: Record<string, unknown> = {\n model: this._options.model,\n messages: messages.map((m) => {\n const msg: Record<string, unknown> = { role: m.role, content: m.content };\n if (m.name) msg['name'] = m.name;\n if (m.tool_call_id) msg['tool_call_id'] = m.tool_call_id;\n return msg;\n }),\n stream: true,\n temperature: options?.temperature ?? this._options.temperature,\n max_tokens: options?.maxTokens ?? this._options.maxTokens,\n };\n\n if (options?.tools && options.tools.size > 0) {\n requestParams['tools'] = options.tools.toOpenAITools();\n }\n\n const stream = await client.chat.completions.create(\n requestParams as Parameters<typeof client.chat.completions.create>[0],\n );\n\n let currentToolCall: { id: string; name: string; arguments: string } | null = null;\n\n for await (const chunk of stream as AsyncIterable<Record<string, unknown>>) {\n const choices = chunk['choices'] as Array<Record<string, unknown>> | undefined;\n if (!choices || choices.length === 0) continue;\n\n const delta = choices[0]!['delta'] as Record<string, unknown> | undefined;\n if (!delta) continue;\n\n // Text content\n const content = delta['content'] as string | undefined;\n if (content) {\n yield { type: 'text', text: content };\n }\n\n // Tool calls\n const toolCalls = delta['tool_calls'] as Array<Record<string, unknown>> | undefined;\n if (toolCalls) {\n for (const tc of toolCalls) {\n const fn = tc['function'] as Record<string, unknown> | undefined;\n if (fn) {\n if (fn['name']) {\n // Start of a new tool call\n if (currentToolCall) {\n yield {\n type: 'tool_call',\n toolCall: {\n id: currentToolCall.id,\n name: currentToolCall.name,\n arguments: currentToolCall.arguments,\n },\n };\n }\n currentToolCall = {\n id: (tc['id'] as string) ?? '',\n name: fn['name'] as string,\n arguments: (fn['arguments'] as string) ?? '',\n };\n } else if (currentToolCall && fn['arguments']) {\n currentToolCall.arguments += fn['arguments'] as string;\n }\n }\n }\n }\n }\n\n // Emit final tool call if pending\n if (currentToolCall) {\n yield {\n type: 'tool_call',\n toolCall: {\n id: currentToolCall.id,\n name: currentToolCall.name,\n arguments: currentToolCall.arguments,\n },\n };\n }\n\n yield { type: 'done' };\n }\n}\n","/**\n * Anthropic LLM provider for pipeline-based voice agents.\n */\n\nimport type { ConversationMessage, LLM, LLMChunk } from './base.js';\nimport type { ToolRegistry } from '../tool.js';\n\nexport interface AnthropicLLMOptions {\n /** Anthropic API key. Falls back to ANTHROPIC_API_KEY env var. */\n apiKey?: string;\n /** Model to use. Default: 'claude-sonnet-4-6' */\n model?: string;\n /** Default temperature. Default: 0.8 */\n temperature?: number;\n /** Default max tokens. Default: 4096 */\n maxTokens?: number;\n}\n\nexport class AnthropicLLM implements LLM {\n private _options: AnthropicLLMOptions;\n\n constructor(options: AnthropicLLMOptions = {}) {\n this._options = {\n model: 'claude-sonnet-4-6',\n temperature: 0.8,\n maxTokens: 4096,\n ...options,\n };\n }\n\n async *generate(\n messages: ConversationMessage[],\n options?: {\n tools?: ToolRegistry;\n temperature?: number;\n maxTokens?: number;\n },\n ): AsyncGenerator<LLMChunk> {\n const AnthropicModule = await import('@anthropic-ai/sdk');\n const Anthropic = AnthropicModule.default;\n\n const client = new Anthropic({\n apiKey: this._options.apiKey ?? process.env['ANTHROPIC_API_KEY'],\n });\n\n // Separate system message from conversation\n let systemPrompt: string | undefined;\n const conversationMessages: Array<Record<string, unknown>> = [];\n\n for (const msg of messages) {\n if (msg.role === 'system') {\n systemPrompt = msg.content;\n } else {\n conversationMessages.push({\n role: msg.role === 'tool' ? 'user' : msg.role,\n content:\n msg.role === 'tool'\n ? [\n {\n type: 'tool_result',\n tool_use_id: msg.tool_call_id,\n content: msg.content,\n },\n ]\n : msg.content,\n });\n }\n }\n\n const requestParams: Record<string, unknown> = {\n model: this._options.model,\n messages: conversationMessages,\n max_tokens: options?.maxTokens ?? this._options.maxTokens,\n stream: true,\n };\n\n if (systemPrompt) {\n requestParams['system'] = systemPrompt;\n }\n if (options?.temperature ?? this._options.temperature) {\n requestParams['temperature'] = options?.temperature ?? this._options.temperature;\n }\n\n if (options?.tools && options.tools.size > 0) {\n const toolDefs = options.tools.toOpenAITools().map((t) => ({\n name: t.function.name,\n description: t.function.description,\n input_schema: t.function.parameters,\n }));\n requestParams['tools'] = toolDefs;\n }\n\n const stream = client.messages.stream(\n requestParams as Parameters<typeof client.messages.stream>[0],\n );\n\n let currentToolCall: { id: string; name: string; arguments: string } | null = null;\n\n for await (const event of stream as AsyncIterable<Record<string, unknown>>) {\n const eventType = event['type'] as string;\n\n switch (eventType) {\n case 'content_block_start': {\n const contentBlock = event['content_block'] as Record<string, unknown>;\n if (contentBlock?.['type'] === 'tool_use') {\n currentToolCall = {\n id: contentBlock['id'] as string,\n name: contentBlock['name'] as string,\n arguments: '',\n };\n }\n break;\n }\n case 'content_block_delta': {\n const delta = event['delta'] as Record<string, unknown>;\n if (delta?.['type'] === 'text_delta') {\n yield { type: 'text', text: delta['text'] as string };\n } else if (delta?.['type'] === 'input_json_delta' && currentToolCall) {\n currentToolCall.arguments += (delta['partial_json'] as string) ?? '';\n }\n break;\n }\n case 'content_block_stop': {\n if (currentToolCall) {\n yield {\n type: 'tool_call',\n toolCall: {\n id: currentToolCall.id,\n name: currentToolCall.name,\n arguments: currentToolCall.arguments,\n },\n };\n currentToolCall = null;\n }\n break;\n }\n case 'message_stop': {\n yield { type: 'done' };\n break;\n }\n }\n }\n }\n}\n","/**\n * Google Gemini LLM provider for pipeline-based voice agents.\n */\n\nimport type { ConversationMessage, LLM, LLMChunk } from './base.js';\nimport type { ToolRegistry } from '../tool.js';\n\nexport interface GeminiLLMOptions {\n /** Google API key. Falls back to GOOGLE_API_KEY env var. */\n apiKey?: string;\n /** Model to use. Default: 'gemini-2.5-flash' */\n model?: string;\n /** Default temperature. Default: 0.8 */\n temperature?: number;\n /** Default max tokens. Default: 4096 */\n maxTokens?: number;\n}\n\nexport class GeminiLLM implements LLM {\n private _options: GeminiLLMOptions;\n\n constructor(options: GeminiLLMOptions = {}) {\n this._options = {\n model: 'gemini-2.5-flash',\n temperature: 0.8,\n maxTokens: 4096,\n ...options,\n };\n }\n\n async *generate(\n messages: ConversationMessage[],\n options?: {\n tools?: ToolRegistry;\n temperature?: number;\n maxTokens?: number;\n },\n ): AsyncGenerator<LLMChunk> {\n const { GoogleGenAI } = await import('@google/genai');\n\n const client = new GoogleGenAI({\n apiKey: this._options.apiKey ?? process.env['GOOGLE_API_KEY'],\n });\n\n // Convert messages to Gemini format\n let systemInstruction: string | undefined;\n const contents: Array<Record<string, unknown>> = [];\n\n for (const msg of messages) {\n if (msg.role === 'system') {\n systemInstruction = msg.content;\n continue;\n }\n\n const role = msg.role === 'assistant' ? 'model' : 'user';\n contents.push({\n role,\n parts: [{ text: msg.content }],\n });\n }\n\n const requestConfig: Record<string, unknown> = {\n contents,\n };\n\n if (systemInstruction) {\n requestConfig['systemInstruction'] = { parts: [{ text: systemInstruction }] };\n }\n\n const generationConfig: Record<string, unknown> = {};\n if (options?.temperature ?? this._options.temperature) {\n generationConfig['temperature'] = options?.temperature ?? this._options.temperature;\n }\n if (options?.maxTokens ?? this._options.maxTokens) {\n generationConfig['maxOutputTokens'] = options?.maxTokens ?? this._options.maxTokens;\n }\n if (Object.keys(generationConfig).length > 0) {\n requestConfig['generationConfig'] = generationConfig;\n }\n\n if (options?.tools && options.tools.size > 0) {\n const toolDefs = options.tools.toOpenAITools().map((t) => ({\n name: t.function.name,\n description: t.function.description,\n parameters: t.function.parameters,\n }));\n requestConfig['tools'] = [{ functionDeclarations: toolDefs }];\n }\n\n const response = await client.models.generateContentStream({\n model: this._options.model!,\n ...requestConfig,\n });\n\n for await (const chunk of response) {\n const candidates = (chunk as Record<string, unknown>)['candidates'] as\n | Array<Record<string, unknown>>\n | undefined;\n if (!candidates || candidates.length === 0) continue;\n\n const content = candidates[0]?.['content'] as Record<string, unknown> | undefined;\n const parts = content?.['parts'] as Array<Record<string, unknown>> | undefined;\n if (!parts) continue;\n\n for (const part of parts) {\n if ('text' in part && part['text']) {\n yield { type: 'text', text: part['text'] as string };\n }\n\n if ('functionCall' in part && part['functionCall']) {\n const fc = part['functionCall'] as { name: string; args: Record<string, unknown> };\n yield {\n type: 'tool_call',\n toolCall: {\n id: `gemini_${Date.now()}`,\n name: fc.name,\n arguments: JSON.stringify(fc.args ?? {}),\n },\n };\n }\n }\n }\n\n yield { type: 'done' };\n }\n}\n","/**\n * OpenAI-compatible LLM provider (works with any OpenAI-compatible API).\n */\n\nimport type { ConversationMessage, LLM, LLMChunk } from './base.js';\nimport type { ToolRegistry } from '../tool.js';\n\nexport interface OpenAICompatLLMOptions {\n /** API key. */\n apiKey?: string;\n /** Base URL for the OpenAI-compatible API. */\n baseUrl: string;\n /** Model to use. */\n model: string;\n /** Default temperature. */\n temperature?: number;\n /** Default max tokens. */\n maxTokens?: number;\n /** Additional default headers. */\n defaultHeaders?: Record<string, string>;\n}\n\nexport class OpenAICompatLLM implements LLM {\n private _options: OpenAICompatLLMOptions;\n\n constructor(options: OpenAICompatLLMOptions) {\n this._options = options;\n }\n\n async *generate(\n messages: ConversationMessage[],\n options?: {\n tools?: ToolRegistry;\n temperature?: number;\n maxTokens?: number;\n },\n ): AsyncGenerator<LLMChunk> {\n const OpenAI = (await import('openai')).default;\n\n const client = new OpenAI({\n apiKey: this._options.apiKey ?? 'not-needed',\n baseURL: this._options.baseUrl,\n defaultHeaders: this._options.defaultHeaders,\n });\n\n const requestParams: Record<string, unknown> = {\n model: this._options.model,\n messages: messages.map((m) => {\n const msg: Record<string, unknown> = { role: m.role, content: m.content };\n if (m.name) msg['name'] = m.name;\n if (m.tool_call_id) msg['tool_call_id'] = m.tool_call_id;\n return msg;\n }),\n stream: true,\n temperature: options?.temperature ?? this._options.temperature,\n max_tokens: options?.maxTokens ?? this._options.maxTokens,\n };\n\n if (options?.tools && options.tools.size > 0) {\n requestParams['tools'] = options.tools.toOpenAITools();\n }\n\n const stream = await client.chat.completions.create(\n requestParams as Parameters<typeof client.chat.completions.create>[0],\n );\n\n let currentToolCall: { id: string; name: string; arguments: string } | null = null;\n\n for await (const chunk of stream as AsyncIterable<Record<string, unknown>>) {\n const choices = chunk['choices'] as Array<Record<string, unknown>> | undefined;\n if (!choices || choices.length === 0) continue;\n\n const delta = choices[0]!['delta'] as Record<string, unknown> | undefined;\n if (!delta) continue;\n\n const content = delta['content'] as string | undefined;\n if (content) {\n yield { type: 'text', text: content };\n }\n\n const toolCalls = delta['tool_calls'] as Array<Record<string, unknown>> | undefined;\n if (toolCalls) {\n for (const tc of toolCalls) {\n const fn = tc['function'] as Record<string, unknown> | undefined;\n if (fn) {\n if (fn['name']) {\n if (currentToolCall) {\n yield {\n type: 'tool_call',\n toolCall: {\n id: currentToolCall.id,\n name: currentToolCall.name,\n arguments: currentToolCall.arguments,\n },\n };\n }\n currentToolCall = {\n id: (tc['id'] as string) ?? '',\n name: fn['name'] as string,\n arguments: (fn['arguments'] as string) ?? '',\n };\n } else if (currentToolCall && fn['arguments']) {\n currentToolCall.arguments += fn['arguments'] as string;\n }\n }\n }\n }\n }\n\n if (currentToolCall) {\n yield {\n type: 'tool_call',\n toolCall: {\n id: currentToolCall.id,\n name: currentToolCall.name,\n arguments: currentToolCall.arguments,\n },\n };\n }\n\n yield { type: 'done' };\n }\n}\n","/**\n * Ollama LLM provider for pipeline-based voice agents.\n * Uses the OpenAI-compatible API that Ollama exposes.\n */\n\nimport type { ConversationMessage, LLM, LLMChunk } from './base.js';\nimport type { ToolRegistry } from '../tool.js';\nimport { OpenAICompatLLM } from './openai-compat-llm.js';\n\nexport interface OllamaLLMOptions {\n /** Ollama server URL. Falls back to OLLAMA_BASE_URL env var. Default: 'http://localhost:11434/v1' */\n baseUrl?: string;\n /** Model to use. Default: 'llama3.2' */\n model?: string;\n /** Default temperature. Default: 0.8 */\n temperature?: number;\n /** Default max tokens. Default: 4096 */\n maxTokens?: number;\n}\n\nexport class OllamaLLM implements LLM {\n private _inner: OpenAICompatLLM;\n\n constructor(options: OllamaLLMOptions = {}) {\n const baseUrl = options.baseUrl ?? process.env['OLLAMA_BASE_URL'] ?? 'http://localhost:11434/v1';\n this._inner = new OpenAICompatLLM({\n baseUrl: baseUrl.replace(/\\/$/, ''),\n model: options.model ?? 'llama3.2',\n apiKey: 'ollama',\n temperature: options.temperature ?? 0.8,\n maxTokens: options.maxTokens ?? 4096,\n });\n }\n\n async *generate(\n messages: ConversationMessage[],\n options?: {\n tools?: ToolRegistry;\n temperature?: number;\n maxTokens?: number;\n },\n ): AsyncGenerator<LLMChunk> {\n yield* this._inner.generate(messages, options);\n }\n}\n","import type { ConversationMessage, LLM, LLMChunk } from './base.js';\nimport type { ToolRegistry } from '../tool.js';\nimport { OpenAICompatLLM } from './openai-compat-llm.js';\n\nexport interface MistralLLMOptions {\n apiKey?: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n}\n\nexport class MistralLLM implements LLM {\n private _inner: OpenAICompatLLM;\n\n constructor(options: MistralLLMOptions = {}) {\n this._inner = new OpenAICompatLLM({\n apiKey: options.apiKey ?? process.env['MISTRAL_API_KEY'],\n baseUrl: 'https://api.mistral.ai/v1',\n model: options.model ?? 'mistral-small-latest',\n temperature: options.temperature,\n maxTokens: options.maxTokens,\n });\n }\n\n async *generate(\n messages: ConversationMessage[],\n options?: { tools?: ToolRegistry; temperature?: number; maxTokens?: number },\n ): AsyncGenerator<LLMChunk> {\n yield* this._inner.generate(messages, options);\n }\n}\n","import type { ConversationMessage, LLM, LLMChunk } from './base.js';\nimport type { ToolRegistry } from '../tool.js';\nimport { OpenAICompatLLM } from './openai-compat-llm.js';\n\nexport interface GroqLLMOptions {\n apiKey?: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n}\n\nexport class GroqLLM implements LLM {\n private _inner: OpenAICompatLLM;\n\n constructor(options: GroqLLMOptions = {}) {\n this._inner = new OpenAICompatLLM({\n apiKey: options.apiKey ?? process.env['GROQ_API_KEY'],\n baseUrl: 'https://api.groq.com/openai/v1',\n model: options.model ?? 'meta-llama/llama-4-scout-17b-16e-instruct',\n temperature: options.temperature,\n maxTokens: options.maxTokens,\n });\n }\n\n async *generate(\n messages: ConversationMessage[],\n options?: { tools?: ToolRegistry; temperature?: number; maxTokens?: number },\n ): AsyncGenerator<LLMChunk> {\n yield* this._inner.generate(messages, options);\n }\n}\n","import type { ConversationMessage, LLM, LLMChunk } from './base.js';\nimport type { ToolRegistry } from '../tool.js';\nimport { OpenAICompatLLM } from './openai-compat-llm.js';\n\nexport interface PerplexityLLMOptions {\n apiKey?: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n}\n\nexport class PerplexityLLM implements LLM {\n private _inner: OpenAICompatLLM;\n\n constructor(options: PerplexityLLMOptions = {}) {\n this._inner = new OpenAICompatLLM({\n apiKey: options.apiKey ?? process.env['PERPLEXITY_API_KEY'],\n baseUrl: 'https://api.perplexity.ai',\n model: options.model ?? 'sonar',\n temperature: options.temperature,\n maxTokens: options.maxTokens,\n });\n }\n\n async *generate(\n messages: ConversationMessage[],\n options?: { tools?: ToolRegistry; temperature?: number; maxTokens?: number },\n ): AsyncGenerator<LLMChunk> {\n yield* this._inner.generate(messages, options);\n }\n}\n","import type { ConversationMessage, LLM, LLMChunk } from './base.js';\nimport type { ToolRegistry } from '../tool.js';\nimport { OpenAICompatLLM } from './openai-compat-llm.js';\n\nexport interface TogetherLLMOptions {\n apiKey?: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n}\n\nexport class TogetherLLM implements LLM {\n private _inner: OpenAICompatLLM;\n\n constructor(options: TogetherLLMOptions = {}) {\n this._inner = new OpenAICompatLLM({\n apiKey: options.apiKey ?? process.env['TOGETHER_API_KEY'],\n baseUrl: 'https://api.together.xyz/v1',\n model: options.model ?? 'meta-llama/Llama-4-Scout-17B-16E-Instruct',\n temperature: options.temperature,\n maxTokens: options.maxTokens,\n });\n }\n\n async *generate(\n messages: ConversationMessage[],\n options?: { tools?: ToolRegistry; temperature?: number; maxTokens?: number },\n ): AsyncGenerator<LLMChunk> {\n yield* this._inner.generate(messages, options);\n }\n}\n","import type { ConversationMessage, LLM, LLMChunk } from './base.js';\nimport type { ToolRegistry } from '../tool.js';\nimport { OpenAICompatLLM } from './openai-compat-llm.js';\n\nexport interface FireworksLLMOptions {\n apiKey?: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n}\n\nexport class FireworksLLM implements LLM {\n private _inner: OpenAICompatLLM;\n\n constructor(options: FireworksLLMOptions = {}) {\n this._inner = new OpenAICompatLLM({\n apiKey: options.apiKey ?? process.env['FIREWORKS_API_KEY'],\n baseUrl: 'https://api.fireworks.ai/inference/v1',\n model: options.model ?? 'accounts/fireworks/models/llama4-scout-instruct-basic',\n temperature: options.temperature,\n maxTokens: options.maxTokens,\n });\n }\n\n async *generate(\n messages: ConversationMessage[],\n options?: { tools?: ToolRegistry; temperature?: number; maxTokens?: number },\n ): AsyncGenerator<LLMChunk> {\n yield* this._inner.generate(messages, options);\n }\n}\n","import type { ConversationMessage, LLM, LLMChunk } from './base.js';\nimport type { ToolRegistry } from '../tool.js';\nimport { OpenAICompatLLM } from './openai-compat-llm.js';\n\nexport interface DeepSeekLLMOptions {\n apiKey?: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n}\n\nexport class DeepSeekLLM implements LLM {\n private _inner: OpenAICompatLLM;\n\n constructor(options: DeepSeekLLMOptions = {}) {\n this._inner = new OpenAICompatLLM({\n apiKey: options.apiKey ?? process.env['DEEPSEEK_API_KEY'],\n baseUrl: 'https://api.deepseek.com',\n model: options.model ?? 'deepseek-chat',\n temperature: options.temperature,\n maxTokens: options.maxTokens,\n });\n }\n\n async *generate(\n messages: ConversationMessage[],\n options?: { tools?: ToolRegistry; temperature?: number; maxTokens?: number },\n ): AsyncGenerator<LLMChunk> {\n yield* this._inner.generate(messages, options);\n }\n}\n","import type { ConversationMessage, LLM, LLMChunk } from './base.js';\nimport type { ToolRegistry } from '../tool.js';\nimport { OpenAICompatLLM } from './openai-compat-llm.js';\n\nexport interface XaiLLMOptions {\n apiKey?: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n}\n\nexport class XaiLLM implements LLM {\n private _inner: OpenAICompatLLM;\n\n constructor(options: XaiLLMOptions = {}) {\n this._inner = new OpenAICompatLLM({\n apiKey: options.apiKey ?? process.env['XAI_API_KEY'],\n baseUrl: 'https://api.x.ai/v1',\n model: options.model ?? 'grok-4-1-fast',\n temperature: options.temperature,\n maxTokens: options.maxTokens,\n });\n }\n\n async *generate(\n messages: ConversationMessage[],\n options?: { tools?: ToolRegistry; temperature?: number; maxTokens?: number },\n ): AsyncGenerator<LLMChunk> {\n yield* this._inner.generate(messages, options);\n }\n}\n","/**\n * MCP server configuration for stdio-based servers.\n */\n\nexport interface MCPServerStdio {\n type: 'stdio';\n /** Command to execute. */\n command: string;\n /** Command arguments. */\n args?: string[];\n /** Environment variables. */\n env?: Record<string, string>;\n [key: string]: unknown;\n}\n\n/**\n * Create a stdio MCP server configuration.\n */\nexport function mcpServerStdio(options: {\n command: string;\n args?: string[];\n env?: Record<string, string>;\n}): MCPServerStdio {\n return {\n type: 'stdio',\n command: options.command,\n args: options.args,\n env: options.env,\n };\n}\n","/**\n * MCP server configuration for HTTP-based servers.\n */\n\nexport interface MCPServerHTTP {\n type: 'http';\n /** Server URL. */\n url: string;\n /** Additional headers to send with requests. */\n headers?: Record<string, string>;\n [key: string]: unknown;\n}\n\n/**\n * Create an HTTP MCP server configuration.\n */\nexport function mcpServerHTTP(options: {\n url: string;\n headers?: Record<string, string>;\n}): MCPServerHTTP {\n return {\n type: 'http',\n url: options.url,\n headers: options.headers,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/agent/audio.ts","../../src/agent/control-ws.ts","../../src/agent/mcp/client.ts","../../src/agent/media-ws.ts","../../src/agent/recorder.ts","../../src/agent/session.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/openai-realtime.ts","../../src/agent/pipeline/gemini-realtime.ts","../../src/agent/pipeline/pipeline-session.ts","../../src/agent/pipeline/deepgram-stt.ts","../../src/agent/pipeline/elevenlabs-tts.ts","../../src/agent/pipeline/openai-llm.ts","../../src/agent/pipeline/anthropic-llm.ts","../../src/agent/pipeline/gemini-llm.ts","../../src/agent/pipeline/openai-compat-llm.ts","../../src/agent/pipeline/ollama-llm.ts","../../src/agent/pipeline/mistral-llm.ts","../../src/agent/pipeline/groq-llm.ts","../../src/agent/pipeline/perplexity-llm.ts","../../src/agent/pipeline/together-llm.ts","../../src/agent/pipeline/fireworks-llm.ts","../../src/agent/pipeline/deepseek-llm.ts","../../src/agent/pipeline/xai-llm.ts","../../src/agent/mcp/stdio.ts","../../src/agent/mcp/http.ts"],"names":["path","fs","DEFAULT_BASE_URL","AgentError","AgentConnectionError","HANG_UP_TOOL","pcm8k"],"mappings":"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AA,EACxD,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAS,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAS,GAAA;AAAA,EAAQ,GAAA;AAAA,EACxD,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EACxD,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EACxD,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EA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","file":"index.cjs","sourcesContent":["/**\n * Audio codec utilities: PCM16 <-> ulaw conversion and resampling.\n */\n\nconst _BIAS = 0x84;\nconst _CLIP = 32635;\n\n// prettier-ignore\nconst DECODE_TABLE: readonly number[] = [\n -32124, -31100, -30076, -29052, -28028, -27004, -25980, -24956,\n -23932, -22908, -21884, -20860, -19836, -18812, -17788, -16764,\n -15996, -15484, -14972, -14460, -13948, -13436, -12924, -12412,\n -11900, -11388, -10876, -10364, -9852, -9340, -8828, -8316,\n -7932, -7676, -7420, -7164, -6908, -6652, -6396, -6140,\n -5884, -5628, -5372, -5116, -4860, -4604, -4348, -4092,\n -3900, -3772, -3644, -3516, -3388, -3260, -3132, -3004,\n -2876, -2748, -2620, -2492, -2364, -2236, -2108, -1980,\n -1884, -1820, -1756, -1692, -1628, -1564, -1500, -1436,\n -1372, -1308, -1244, -1180, -1116, -1052, -988, -924,\n -876, -844, -812, -780, -748, -716, -684, -652,\n -620, -588, -556, -524, -492, -460, -428, -396,\n -372, -356, -340, -324, -308, -292, -276, -260,\n -244, -228, -212, -196, -180, -164, -148, -132,\n -120, -112, -104, -96, -88, -80, -72, -64,\n -56, -48, -40, -32, -24, -16, -8, 0,\n 32124, 31100, 30076, 29052, 28028, 27004, 25980, 24956,\n 23932, 22908, 21884, 20860, 19836, 18812, 17788, 16764,\n 15996, 15484, 14972, 14460, 13948, 13436, 12924, 12412,\n 11900, 11388, 10876, 10364, 9852, 9340, 8828, 8316,\n 7932, 7676, 7420, 7164, 6908, 6652, 6396, 6140,\n 5884, 5628, 5372, 5116, 4860, 4604, 4348, 4092,\n 3900, 3772, 3644, 3516, 3388, 3260, 3132, 3004,\n 2876, 2748, 2620, 2492, 2364, 2236, 2108, 1980,\n 1884, 1820, 1756, 1692, 1628, 1564, 1500, 1436,\n 1372, 1308, 1244, 1180, 1116, 1052, 988, 924,\n 876, 844, 812, 780, 748, 716, 684, 652,\n 620, 588, 556, 524, 492, 460, 428, 396,\n 372, 356, 340, 324, 308, 292, 276, 260,\n 244, 228, 212, 196, 180, 164, 148, 132,\n 120, 112, 104, 96, 88, 80, 72, 64,\n 56, 48, 40, 32, 24, 16, 8, 0,\n];\n\nfunction encodeUlawSample(sample: number): number {\n let sign = 0;\n if (sample < 0) {\n sign = 0x80;\n sample = -sample;\n }\n if (sample > _CLIP) {\n sample = _CLIP;\n }\n sample += _BIAS;\n\n let exponent = 7;\n const expValues = [0x4000, 0x2000, 0x1000, 0x0800, 0x0400, 0x0200, 0x0100];\n for (const expVal of expValues) {\n if (sample >= expVal) {\n break;\n }\n exponent -= 1;\n }\n\n const mantissa = (sample >> (exponent + 3)) & 0x0f;\n return ~(sign | (exponent << 4) | mantissa) & 0xff;\n}\n\n/**\n * Convert PCM16 little-endian audio to ulaw.\n */\nexport function pcm16ToUlaw(pcm: Buffer): Buffer {\n if (!pcm.length) return Buffer.alloc(0);\n const nSamples = pcm.length >> 1;\n const out = Buffer.alloc(nSamples);\n for (let i = 0; i < nSamples; i++) {\n const sample = pcm.readInt16LE(i * 2);\n out[i] = encodeUlawSample(sample);\n }\n return out;\n}\n\n/**\n * Convert ulaw audio to PCM16 little-endian.\n */\nexport function ulawToPcm16(ulaw: Buffer): Buffer {\n if (!ulaw.length) return Buffer.alloc(0);\n const out = Buffer.alloc(ulaw.length * 2);\n for (let i = 0; i < ulaw.length; i++) {\n out.writeInt16LE(DECODE_TABLE[ulaw[i]!]!, i * 2);\n }\n return out;\n}\n\n/**\n * Resample PCM16 audio using linear interpolation.\n */\nexport function resamplePcm16(pcm: Buffer, fromRate: number, toRate: number): Buffer {\n if (fromRate === toRate || !pcm.length) return pcm;\n\n const nSamples = pcm.length >> 1;\n const ratio = fromRate / toRate;\n const outLen = Math.floor(nSamples / ratio);\n const out = Buffer.alloc(outLen * 2);\n\n for (let i = 0; i < outLen; i++) {\n const srcPos = i * ratio;\n const idx = Math.floor(srcPos);\n const frac = srcPos - idx;\n\n let val: number;\n if (idx + 1 < nSamples) {\n val = pcm.readInt16LE(idx * 2) * (1 - frac) + pcm.readInt16LE((idx + 1) * 2) * frac;\n } else {\n val = pcm.readInt16LE(idx * 2);\n }\n out.writeInt16LE(Math.round(val), i * 2);\n }\n\n return out;\n}\n\nexport { DECODE_TABLE };\n","/**\n * Control WebSocket for agent signaling (call.incoming, call.ended, etc.).\n */\n\nimport type { WebSocket as WsType } from 'ws';\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\n/**\n * Build the full control WebSocket URL from options.\n * Matches Python SDK: /v1/accounts/{account_id}/agent/listen?number={number}\n */\nexport function buildControlWsUrl(options: ControlWsOptions): string {\n const scheme = options.baseUrl.startsWith('https') ? 'wss' : 'ws';\n const host = options.baseUrl.replace(/^https?:\\/\\//, '').replace(/\\/$/, '');\n let url = `${scheme}://${host}/v1/accounts/${encodeURIComponent(options.accountId)}/agent/listen`;\n if (options.number) {\n url += `?number=${encodeURIComponent(options.number)}`;\n }\n return url;\n}\n\nexport class ControlWebSocket {\n private _url: string;\n private _ws: WsType | null = null;\n private _handlers: Map<string, ControlEventHandler[]> = new Map();\n private _reconnectDelay = INITIAL_RECONNECT_DELAY;\n private _closed = false;\n private _connectedResolve: (() => void) | null = null;\n private _connectedPromise: Promise<void>;\n\n constructor(private readonly _options: ControlWsOptions) {\n this._url = buildControlWsUrl(_options);\n this._connectedPromise = new Promise<void>((resolve) => {\n this._connectedResolve = resolve;\n });\n }\n\n /** Register an event handler for a specific event type. */\n on(event: string, handler: ControlEventHandler): void {\n let list = this._handlers.get(event);\n if (!list) {\n list = [];\n this._handlers.set(event, list);\n }\n list.push(handler);\n }\n\n /** Connect to the control WebSocket. */\n async connect(): Promise<void> {\n this._closed = false;\n await this._doConnect();\n }\n\n /** Wait until the WebSocket is connected. */\n async waitConnected(): Promise<void> {\n return this._connectedPromise;\n }\n\n /** Send a JSON message over the control WebSocket. */\n send(message: Record<string, unknown>): void {\n if (this._ws && this._ws.readyState === 1 /* OPEN */) {\n this._ws.send(JSON.stringify(message));\n }\n }\n\n /** Close the WebSocket and stop reconnecting. */\n close(): void {\n this._closed = true;\n 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 if (this._connectedResolve) {\n this._connectedResolve();\n this._connectedResolve = null;\n }\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 console.error('[ControlWebSocket] Failed to parse message');\n }\n });\n\n ws.on('close', () => {\n if (!this._closed) {\n this._scheduleReconnect();\n }\n });\n\n ws.on('error', (err: Error) => {\n console.error('[ControlWebSocket] Error:', err.message);\n });\n }\n\n private _dispatchEvent(event: ControlEvent): void {\n const handlers = this._handlers.get(event.event);\n if (handlers) {\n for (const handler of handlers) {\n try {\n const result = handler(event);\n if (result && typeof result.catch === 'function') {\n result.catch((err: unknown) => {\n console.error(`[ControlWebSocket] Error in handler for ${event.event}:`, err);\n });\n }\n } catch (err) {\n console.error(`[ControlWebSocket] Error in handler for ${event.event}:`, err);\n }\n }\n }\n }\n\n private _scheduleReconnect(): void {\n const delay = this._reconnectDelay;\n this._reconnectDelay = Math.min(this._reconnectDelay * 2, MAX_RECONNECT_DELAY);\n\n setTimeout(() => {\n if (!this._closed) {\n this._doConnect().catch((err) => {\n console.error('[ControlWebSocket] Reconnect failed:', err);\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';\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\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 console.error(`[MCPClient] Failed to connect to server '${name}':`, err);\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 const c = client as { close?: () => Promise<void> };\n if (c.close) {\n await c.close();\n }\n } catch (err) {\n console.error(`[MCPClient] Error disconnecting from '${name}':`, err);\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 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 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 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';\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\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\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\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 /** 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 });\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 console.error('[MediaWebSocket] Error:', err.message);\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 /** 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 'stop': {\n this.close();\n break;\n }\n }\n }\n\n private _startSendLoop(): void {\n if (this._sendLoopRunning) return;\n this._sendLoopRunning = true;\n\n const loop = () => {\n if (this._closed) {\n this._sendLoopRunning = false;\n return;\n }\n\n while (this._audioQueue.length > 0 && this._ws && this._ws.readyState === 1) {\n const payload = this._audioQueue.shift()!;\n this._ws.send(buildMediaResponse(payload));\n }\n\n setTimeout(loop, 20);\n };\n\n loop();\n }\n}\n","/**\n * 3-file call recording: in.wav, out.wav, mix.wav\n *\n * Wall-clock 동기화로 실시간 녹음. 세 파일 모두 동일한 길이로 유지된다.\n * recordings/{call_id}/in.wav — 상대방 음성 (PCM16 8kHz mono)\n * recordings/{call_id}/out.wav — AI 음성 (PCM16 8kHz mono)\n * recordings/{call_id}/mix.wav — 양쪽 믹싱 (PCM16 8kHz mono)\n */\nimport * as fs from 'node:fs'\nimport * as path from 'node:path'\n\nconst SAMPLE_RATE = 8000\nconst CHANNELS = 1\nconst BITS_PER_SAMPLE = 16\nconst BYTES_PER_SECOND = SAMPLE_RATE * CHANNELS * (BITS_PER_SAMPLE / 8) // 16000\n\nexport function makeWavHeader(dataSize: number = 0): Buffer {\n const header = Buffer.alloc(44)\n header.write('RIFF', 0, 'ascii')\n header.writeUInt32LE(36 + dataSize, 4)\n header.write('WAVE', 8, 'ascii')\n header.write('fmt ', 12, 'ascii')\n header.writeUInt32LE(16, 16) // fmt chunk size\n header.writeUInt16LE(1, 20) // PCM format\n header.writeUInt16LE(CHANNELS, 22)\n header.writeUInt32LE(SAMPLE_RATE, 24)\n header.writeUInt32LE(SAMPLE_RATE * CHANNELS * (BITS_PER_SAMPLE / 8), 28) // byte rate\n header.writeUInt16LE(CHANNELS * (BITS_PER_SAMPLE / 8), 32) // block align\n header.writeUInt16LE(BITS_PER_SAMPLE, 34)\n header.write('data', 36, 'ascii')\n header.writeUInt32LE(dataSize, 40)\n return header\n}\n\nexport function mixSamples(a: Buffer, b: Buffer): Buffer {\n const n = Math.min(a.length, b.length) >> 1 // sample count\n const result = Buffer.alloc(n * 2)\n for (let i = 0; i < n; i++) {\n const sa = a.readInt16LE(i * 2)\n const sb = b.readInt16LE(i * 2)\n result.writeInt16LE(Math.max(-32768, Math.min(32767, sa + sb)), i * 2)\n }\n return result\n}\n\nexport class AudioRecorder {\n private readonly _dir: string\n private _fdIn: number | null = null\n private _fdOut: number | null = null\n private _fdMix: number | null = null\n private _inWritten = 0\n private _outWritten = 0\n private _mixWritten = 0\n private _startTime = 0\n private _started = false\n\n constructor(recordingPath: string, callId: string) {\n this._dir = path.join(recordingPath, callId)\n }\n\n start(): void {\n fs.mkdirSync(this._dir, { recursive: true })\n const header = makeWavHeader()\n this._fdIn = fs.openSync(path.join(this._dir, 'in.wav'), 'w')\n this._fdOut = fs.openSync(path.join(this._dir, 'out.wav'), 'w')\n this._fdMix = fs.openSync(path.join(this._dir, 'mix.wav'), 'w+')\n fs.writeSync(this._fdIn, header)\n fs.writeSync(this._fdOut, header)\n fs.writeSync(this._fdMix, header)\n this._startTime = performance.now()\n this._started = true\n }\n\n private _expectedBytes(): number {\n const elapsed = (performance.now() - this._startTime) / 1000 // ms → s\n return Math.floor(elapsed * BYTES_PER_SECOND)\n }\n\n private _padSilence(fd: number, written: number): number {\n const expected = this._expectedBytes()\n let gap = expected - written\n if (gap <= 0) return 0\n gap = gap - (gap % 2) // 2-byte align\n if (gap > 0) {\n fs.writeSync(fd, Buffer.alloc(gap))\n }\n return gap\n }\n\n private _writeToMix(data: Buffer, trackPos: number): void {\n if (this._fdMix === null) return\n const filePos = 44 + trackPos\n\n if (trackPos < this._mixWritten) {\n // Overlap: read existing, mix, write back\n const overlap = Math.min(data.length, this._mixWritten - trackPos)\n const existing = Buffer.alloc(overlap)\n fs.readSync(this._fdMix, existing, 0, overlap, filePos)\n const mixed = mixSamples(existing, data.subarray(0, overlap))\n fs.writeSync(this._fdMix, mixed, 0, mixed.length, filePos)\n // Write remaining beyond overlap\n if (data.length > overlap) {\n fs.writeSync(this._fdMix, data, overlap, data.length - overlap, filePos + overlap)\n this._mixWritten = trackPos + data.length\n }\n } else {\n // No overlap: pad gap if needed, then write\n if (trackPos > this._mixWritten) {\n let gap = trackPos - this._mixWritten\n gap = gap - (gap % 2) // 2-byte align\n if (gap > 0) {\n const silence = Buffer.alloc(gap)\n fs.writeSync(this._fdMix, silence, 0, silence.length, 44 + this._mixWritten)\n this._mixWritten += gap\n }\n }\n fs.writeSync(this._fdMix, data, 0, data.length, 44 + this._mixWritten)\n this._mixWritten += data.length\n }\n }\n\n writeInbound(pcm16_8k: Buffer): void {\n if (!this._started || this._fdIn === null) return\n try {\n const gap = this._padSilence(this._fdIn, this._inWritten)\n this._inWritten += gap\n const posBefore = this._inWritten\n fs.writeSync(this._fdIn, pcm16_8k)\n this._inWritten += pcm16_8k.length\n this._writeToMix(pcm16_8k, posBefore)\n } catch (err) {\n console.error('Error writing inbound audio:', err)\n }\n }\n\n writeOutbound(pcm16_8k: Buffer): void {\n if (!this._started || this._fdOut === null) return\n try {\n const gap = this._padSilence(this._fdOut, this._outWritten)\n this._outWritten += gap\n const posBefore = this._outWritten\n fs.writeSync(this._fdOut, pcm16_8k)\n this._outWritten += pcm16_8k.length\n this._writeToMix(pcm16_8k, posBefore)\n } catch (err) {\n console.error('Error writing outbound audio:', err)\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 } catch (err) {\n console.error('Error stopping recorder:', err)\n } finally {\n this._fdIn = null\n this._fdOut = null\n this._fdMix = null\n this._started = false\n }\n }\n}\n","/**\n * CallSession represents an active phone call and provides methods to\n * send audio, hang up, and listen for lifecycle events.\n */\n\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;\n}\n\nexport class CallSession {\n readonly callId: string;\n readonly fromNumber: string;\n readonly toNumber: string;\n readonly accountId: string;\n readonly direction: CallDirection;\n readonly startTime: Date;\n readonly metadata: Record<string, unknown>;\n\n private _status: CallStatus;\n private _sendAudioFn: SendAudioFn | null = null;\n private _clearAudioFn: ClearAudioFn | null = null;\n private _hangupFn: HangupFn | null = null;\n private _handlers: Map<string, SessionEventHandler[]> = new Map();\n private _endedPromise: Promise<void>;\n private _resolveEnded!: () => void;\n\n constructor(options: {\n callId: string;\n fromNumber: string;\n toNumber: string;\n accountId: string;\n direction: CallDirection;\n metadata?: Record<string, unknown>;\n }) {\n this.callId = options.callId;\n this.fromNumber = options.fromNumber;\n this.toNumber = options.toNumber;\n this.accountId = options.accountId;\n this.direction = options.direction;\n this.metadata = options.metadata ?? {};\n this._status = 'ringing';\n this.startTime = new Date();\n\n this._endedPromise = new Promise<void>((resolve) => {\n this._resolveEnded = resolve;\n });\n }\n\n get status(): CallStatus {\n return this._status;\n }\n\n get duration(): number {\n return (Date.now() - this.startTime.getTime()) / 1000;\n }\n\n /** Bind transport functions (called internally by the agent). */\n _bindTransport(send: SendAudioFn, clear: ClearAudioFn, hangup: HangupFn): void {\n this._sendAudioFn = send;\n this._clearAudioFn = clear;\n this._hangupFn = hangup;\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. */\n hangup(): void {\n if (this._hangupFn) {\n this._hangupFn();\n }\n }\n\n /** Register an event handler. */\n on(event: string, handler: SessionEventHandler): void {\n let list = this._handlers.get(event);\n if (!list) {\n list = [];\n this._handlers.set(event, list);\n }\n list.push(handler);\n }\n\n /** Wait for the call to end. */\n async wait(): Promise<void> {\n return this._endedPromise;\n }\n\n /** Mark the session as ended (called internally). */\n _markEnded(): void {\n this._status = 'ended';\n this._resolveEnded();\n }\n\n /** Emit an event to registered handlers. Matches Python SDK: _emit(event, ...args) */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n _emit(event: string, ...args: any[]): void {\n const handlers = this._handlers.get(event);\n if (handlers) {\n for (const handler of handlers) {\n try {\n const result = handler(this, ...args);\n if (result && typeof result.catch === 'function') {\n result.catch((err: unknown) => {\n console.error(`[CallSession] Error in ${event} handler:`, err);\n });\n }\n } catch (err) {\n console.error(`[CallSession] Error in ${event} handler:`, err);\n }\n }\n }\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 { 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 { ToolRegistry } from './tool.js';\nimport type { FunctionTool } from './tool.js';\nimport type { Session } from './pipeline/base.js';\nimport { setTracingConfig } from './tracing/config.js';\nimport type { TracingConfig } from './tracing/config.js';\nimport { withSpan } from './tracing/spans.js';\nimport { ATTR_CALL_ID, ATTR_CALL_DIRECTION, ATTR_AGENT_ID } from './tracing/attributes.js';\n\nexport type AgentEventType =\n | 'call_start'\n | 'call_end'\n | 'call_failed'\n | 'transcript';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AgentEventHandler = (...args: any[]) => void | Promise<void>;\n\nexport interface ClawOpsAgentOptions {\n /** ClawOps API key. Falls back to CLAWOPS_API_KEY env var. */\n apiKey?: string;\n /** Account ID. Falls back to CLAWOPS_ACCOUNT_ID env var. */\n accountId?: string;\n /** API base URL. */\n baseUrl?: string;\n /** Phone number to send/receive calls from. Required. */\n from: string;\n /** Session implementation (OpenAIRealtime, GeminiRealtime, PipelineSession, etc.). */\n session: Session;\n /** Enable call recording. */\n recording?: boolean;\n /** Recording output directory. Default: './recordings' */\n recordingPath?: string;\n /** MCP server configurations. */\n mcpServers?: Array<MCPServerStdio | MCPServerHTTP>;\n /** Tracing configuration. */\n tracing?: TracingConfig;\n}\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\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\n // Configure tracing\n if (options.tracing) {\n setTracingConfig(options.tracing);\n }\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('tool(name, description, parameters, handler) requires all arguments.');\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._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('Account ID is required. Set CLAWOPS_ACCOUNT_ID or pass accountId option.');\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.on('call.incoming', (event) => this._handleIncoming(event));\n this._controlWs.on('call.ended', (event) => this._handleEnded(event));\n this._controlWs.on('call.outbound_ready', (event) => this._handleOutboundReady(event));\n this._controlWs.on('call.ringing', (event) => this._handleRinging(event));\n this._controlWs.on('call.failed', (event) => this._handleFailed(event));\n\n try {\n await this._controlWs.connect();\n await this._controlWs.waitConnected();\n } catch (err) {\n throw new AgentConnectionError(\n `Failed to connect to ClawOps: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n console.log(`[ClawOpsAgent] Connected on ${this._fromNumber}`);\n }\n\n /**\n * Connect and block until disconnected.\n * Convenience method for simple agent scripts.\n */\n async serve(): Promise<void> {\n await this.connect();\n\n // Block indefinitely until process signal\n return new Promise<void>((resolve) => {\n const shutdown = () => {\n this.disconnect()\n .then(resolve)\n .catch(() => resolve());\n };\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n });\n }\n\n /** Disconnect from the platform. */\n async disconnect(): Promise<void> {\n if (this._controlWs) {\n this._controlWs.close();\n this._controlWs = null;\n }\n\n for (const session of this._activeSessions.values()) {\n session._markEnded();\n }\n this._activeSessions.clear();\n console.log('[ClawOpsAgent] Disconnected');\n }\n\n /**\n * Initiate an outbound call.\n * Matches Python SDK: agent.call(to, { timeout })\n */\n async call(to: string, options?: { timeout?: number }): Promise<CallSession> {\n await this.connect();\n\n const url = `${this._baseUrl}/v1/accounts/${this._accountId}/calls`;\n const body = { To: to, From: this._fromNumber, Timeout: options?.timeout ?? 60 };\n const resp = await fetch(url, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this._apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n });\n\n if (resp.status !== 201) {\n const error = (await resp.json()) as Record<string, unknown>;\n throw new AgentError(`발신 실패 (${resp.status}): ${(error['error'] as string) ?? ''}`);\n }\n\n const data = (await resp.json()) as Record<string, unknown>;\n\n const callSession = new CallSession({\n callId: data['callId'] as string,\n fromNumber: this._fromNumber,\n toNumber: to,\n accountId: this._accountId,\n direction: 'outbound',\n });\n\n // Register all agent-level event handlers on the session\n for (const [evt, handlers] of this._handlers) {\n for (const handler of handlers) {\n callSession.on(evt, handler);\n }\n }\n\n this._activeSessions.set(callSession.callId, callSession);\n console.log(`[ClawOpsAgent] Outbound call initiated: ${this._fromNumber} -> ${to} (${callSession.callId})`);\n return callSession;\n }\n\n private _handleIncoming(event: ControlEvent): void {\n const callId = event['callId'] as string;\n const fromNumber = (event['from'] as string) ?? '';\n const mediaUrl = (event['mediaUrl'] as string) ?? '';\n\n const session = new CallSession({\n callId,\n fromNumber,\n toNumber: this._fromNumber,\n accountId: this._accountId,\n direction: 'inbound',\n });\n\n // Register all agent-level event handlers on the session\n for (const [evt, handlers] of this._handlers) {\n for (const handler of handlers) {\n session.on(evt, handler);\n }\n }\n\n this._activeSessions.set(callId, session);\n\n // Accept the call\n if (this._controlWs) {\n this._controlWs.send({ event: 'call.accept', callId });\n }\n\n if (mediaUrl) {\n this._startCallSession(session, mediaUrl).catch((err) => {\n console.error(`[ClawOpsAgent] Error in call session ${callId}:`, err);\n });\n }\n }\n\n private _handleEnded(event: ControlEvent): void {\n const callId = event['callId'] as string;\n const session = this._activeSessions.get(callId);\n if (session) {\n session._markEnded();\n this._activeSessions.delete(callId);\n }\n }\n\n private _handleOutboundReady(event: ControlEvent): void {\n const callId = event['callId'] as string;\n const mediaUrl = (event['mediaUrl'] as string) ?? '';\n let session = this._activeSessions.get(callId);\n\n if (!session) {\n session = new CallSession({\n callId,\n fromNumber: this._fromNumber,\n toNumber: (event['to'] as string) ?? '',\n accountId: this._accountId,\n direction: 'outbound',\n });\n\n // Register all agent-level event handlers on the session\n for (const [evt, handlers] of this._handlers) {\n for (const handler of handlers) {\n session.on(evt, handler);\n }\n }\n\n this._activeSessions.set(callId, session);\n }\n\n if (mediaUrl) {\n this._startCallSession(session, mediaUrl).catch((err) => {\n console.error(`[ClawOpsAgent] Error in call session ${callId}:`, err);\n });\n }\n }\n\n private _handleRinging(event: ControlEvent): void {\n const callId = event['callId'] as string;\n const session = this._activeSessions.get(callId);\n if (session) {\n console.log(`[ClawOpsAgent] Outbound call ringing: ${callId}`);\n }\n }\n\n private _handleFailed(event: ControlEvent): void {\n const callId = event['callId'] as string;\n const session = this._activeSessions.get(callId);\n if (session) {\n session._emit('call_failed', (event['reason'] as string) ?? 'failed');\n session._markEnded();\n this._activeSessions.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.addServer('mcp', serverConfig);\n try {\n const tools = await client.connect();\n sessionTools.registerMcpTools(tools);\n mcpClients.push(client);\n } catch (err) {\n console.error('[ClawOpsAgent] MCP connection error:', err);\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.start();\n }\n\n // Connect media WebSocket\n const mediaWs = new MediaWebSocket();\n\n // Bind transport functions to session — sessions send ulaw bytes directly\n session._bindTransport(\n (audio: Buffer) => {\n mediaWs.sendAudio(audio.toString('base64'));\n },\n () => {\n mediaWs.sendClear();\n },\n () => {\n mediaWs.close();\n },\n );\n\n const sessionHandler = this._session;\n\n // Inject tools and recorder into session if supported\n if ('setToolRegistry' in sessionHandler && typeof sessionHandler.setToolRegistry === 'function') {\n sessionHandler.setToolRegistry(sessionTools);\n }\n if (recorder && 'setRecorder' in sessionHandler && typeof sessionHandler.setRecorder === 'function') {\n sessionHandler.setRecorder(recorder);\n }\n\n // Handle inbound audio — feed raw ulaw to session (each session converts as needed)\n mediaWs.onAudio((ulawAudio: Buffer, _timestamp: number) => {\n if (sessionHandler) {\n sessionHandler.feedAudio(ulawAudio);\n }\n if (recorder) {\n recorder.writeInbound(ulawToPcm16(ulawAudio));\n }\n });\n\n mediaWs.onClose(() => {\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\n // Start the session handler\n await sessionHandler.start(session, sessionTools);\n\n // Wait for the call to end\n await session.wait();\n\n // Stop the session handler\n await sessionHandler.stop();\n } catch (err) {\n console.error(`[ClawOpsAgent] Call session error:`, err);\n } finally {\n // Clean up MCP clients\n if (mcpClients.length > 0) {\n sessionTools.clearMcpTools();\n for (const c of mcpClients) {\n await c.disconnect();\n }\n }\n\n mediaWs.close();\n if (recorder) {\n recorder.stop();\n }\n\n // Emit call_end\n session._emit('call_end');\n session._markEnded();\n this._activeSessions.delete(session.callId);\n }\n },\n );\n }\n}\n","/**\n * OpenAI Realtime API session (speech-to-speech).\n *\n * Matches Python SDK's OpenAIRealtime implementation.\n */\n\nimport type { CallSession } from '../session.js';\nimport type { ToolRegistry } from '../tool.js';\nimport type { AudioRecorder } from '../recorder.js';\nimport type { Session } from './base.js';\nimport { ulawToPcm16 } from '../audio.js';\n\nconst OPENAI_REALTIME_URL = 'wss://api.openai.com/v1/realtime?model=';\n\nconst HANG_UP_TOOL = {\n type: 'function' as const,\n name: 'hang_up',\n description: 'End the phone call. Use when the conversation is finished or the caller says goodbye.',\n parameters: { type: 'object' as const, properties: {} as Record<string, unknown>, required: [] as string[] },\n};\n\nexport interface OpenAIRealtimeOptions {\n /** OpenAI API key. Falls back to OPENAI_API_KEY env var. */\n apiKey?: string;\n /** System prompt / instructions for the AI. */\n systemPrompt?: string;\n /** Model to use. Default: 'gpt-realtime-1.5' */\n model?: string;\n /** Voice ID. Default: 'marin' */\n voice?: string;\n /** Language code (BCP 47). Default: 'ko' */\n language?: string;\n /** VAD eagerness: 'low', 'medium', 'high'. Default: 'high' */\n eagerness?: string;\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 _eagerness: string;\n private _greeting: boolean;\n\n private _ws: import('ws').WebSocket | null = null;\n private _call: CallSession | null = null;\n private _tools: ToolRegistry | null = null;\n private _recorder: AudioRecorder | null = null;\n private _closed = false;\n\n // Truncation / barge-in tracking (matching Python SDK)\n private _lastAssistantItem: string | null = null;\n private _responseStartTs: number | null = null;\n private _sentAudioChunks = 0;\n private _audioRemainder: Buffer = Buffer.alloc(0);\n\n constructor(options: OpenAIRealtimeOptions = {}) {\n this._apiKey = options.apiKey ?? process.env['OPENAI_API_KEY'] ?? '';\n this._systemPrompt = options.systemPrompt ?? '';\n this._model = options.model ?? 'gpt-realtime-1.5';\n this._voice = options.voice ?? 'marin';\n this._language = options.language ?? 'ko';\n this._eagerness = options.eagerness ?? 'high';\n this._greeting = options.greeting ?? true;\n }\n\n /** Inject per-call ToolRegistry. */\n setToolRegistry(registry: ToolRegistry): void {\n this._tools = registry;\n }\n\n /** Inject per-call AudioRecorder. */\n setRecorder(recorder: AudioRecorder): void {\n this._recorder = recorder;\n }\n\n async start(callSession: CallSession, tools?: ToolRegistry): Promise<void> {\n this._call = callSession;\n if (tools) this._tools = tools;\n this._closed = false;\n this._lastAssistantItem = null;\n this._responseStartTs = null;\n this._sentAudioChunks = 0;\n this._audioRemainder = Buffer.alloc(0);\n\n if (!this._apiKey) {\n throw new Error('OpenAI API key is required. Set OPENAI_API_KEY or pass apiKey option.');\n }\n\n const { WebSocket } = await import('ws');\n const url = `${OPENAI_REALTIME_URL}${this._model}`;\n\n this._ws = new WebSocket(url, {\n headers: {\n Authorization: `Bearer ${this._apiKey}`,\n 'OpenAI-Beta': 'realtime=v1',\n },\n });\n\n return new Promise<void>((resolve, reject) => {\n const ws = this._ws!;\n\n ws.on('open', () => {\n this._sendSessionUpdate();\n\n // Send initial greeting if enabled (matching Python SDK)\n if (this._greeting) {\n this._send({ type: 'response.create' });\n }\n\n resolve();\n });\n\n ws.on('message', (data: Buffer | string) => {\n try {\n const msg = JSON.parse(data.toString()) as Record<string, unknown>;\n this._handleMessage(msg);\n } catch {\n // Ignore parse errors\n }\n });\n\n ws.on('close', () => {\n this._closed = true;\n });\n\n ws.on('error', (err: Error) => {\n if (!this._ws) {\n reject(err);\n }\n console.error('[OpenAIRealtime] WebSocket error:', err.message);\n });\n });\n }\n\n feedAudio(audio: Buffer): void {\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 if (this._ws) {\n this._ws.close();\n this._ws = null;\n }\n }\n\n private _sendSessionUpdate(): void {\n if (!this._ws || this._ws.readyState !== 1) return;\n\n // Build tool schemas: user tools + hang_up\n // OpenAI Realtime API uses flat tool format: { type, name, description, parameters }\n const toolSchemas = this._tools\n ? this._tools.toOpenAITools().map((t) => ({ type: 'function' as const, ...t.function }))\n : [];\n toolSchemas.push(HANG_UP_TOOL);\n\n this._send({\n type: 'session.update',\n session: {\n modalities: ['text', 'audio'],\n voice: this._voice,\n instructions: this._systemPrompt,\n input_audio_format: 'g711_ulaw',\n output_audio_format: 'g711_ulaw',\n input_audio_transcription: {\n model: 'gpt-4o-mini-transcribe',\n language: this._language,\n },\n input_audio_noise_reduction: { type: 'far_field' },\n turn_detection: {\n type: 'semantic_vad',\n interrupt_response: true,\n eagerness: this._eagerness,\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.audio.delta': {\n this._handleAudioDelta(msg);\n break;\n }\n case 'response.audio.done': {\n // Flush remaining audio with silence padding\n if (this._audioRemainder.length > 0) {\n const padded = Buffer.concat([\n this._audioRemainder,\n Buffer.alloc(160 - this._audioRemainder.length, 0xff),\n ]);\n if (this._call) {\n this._call.sendAudio(padded);\n }\n this._sentAudioChunks++;\n this._audioRemainder = Buffer.alloc(0);\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 (matching Python SDK: response.output_item.done)\n const item = msg['item'] as Record<string, unknown> | undefined;\n if (item && item['type'] === 'function_call') {\n this._handleToolCall(item);\n }\n break;\n }\n case 'conversation.item.input_audio_transcription.completed': {\n // User transcript\n if (this._call) {\n this._call._emit('transcript', 'user', (msg['transcript'] as string) ?? '');\n }\n break;\n }\n case 'response.audio_transcript.done': {\n // Assistant transcript\n if (this._call) {\n this._call._emit('transcript', 'assistant', (msg['transcript'] as string) ?? '');\n }\n break;\n }\n case 'error': {\n console.error('[OpenAIRealtime] API error:', msg['error']);\n break;\n }\n }\n }\n\n private _handleAudioDelta(msg: Record<string, unknown>): void {\n if (this._responseStartTs === null) {\n this._responseStartTs = Date.now();\n this._sentAudioChunks = 0;\n }\n if (msg['item_id']) {\n this._lastAssistantItem = msg['item_id'] as string;\n }\n\n const ulaw = Buffer.from(msg['delta'] as string, 'base64');\n\n if (this._recorder) {\n this._recorder.writeOutbound(ulawToPcm16(ulaw));\n }\n\n // Align to 160B (20ms at 8kHz ulaw) frames, matching Python SDK\n const combined = Buffer.concat([this._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 this._sentAudioChunks++;\n }\n\n this._audioRemainder = combined.subarray(fullEnd);\n }\n\n private _handleTruncation(): void {\n if (!this._lastAssistantItem || this._responseStartTs === null) {\n return;\n }\n\n // Calculate audio end based on sent chunks (160B = 20ms per ulaw chunk)\n const audioEndMs = Math.max(0, this._sentAudioChunks * 20);\n\n this._send({\n type: 'conversation.item.truncate',\n item_id: this._lastAssistantItem,\n content_index: 0,\n audio_end_ms: audioEndMs,\n });\n\n if (this._call) {\n this._call.clearAudio();\n }\n\n this._lastAssistantItem = null;\n this._responseStartTs = null;\n this._sentAudioChunks = 0;\n this._audioRemainder = Buffer.alloc(0);\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\n // Built-in hang_up tool\n if (funcName === 'hang_up') {\n if (this._call) {\n this._call.hangup();\n }\n return;\n }\n\n if (!this._tools || !this._tools.has(funcName)) {\n console.error(`[OpenAIRealtime] Unknown tool: ${funcName}`);\n return;\n }\n\n let result: unknown;\n try {\n const args = JSON.parse((item['arguments'] as string) ?? '{}') as Record<string, unknown>;\n result = await this._tools.call(funcName, args);\n } catch (err) {\n console.error(`[OpenAIRealtime] Tool call failed: ${funcName}:`, err);\n result = `Error: ${err}`;\n }\n\n this._send({\n type: 'conversation.item.create',\n item: {\n type: 'function_call_output',\n call_id: callId,\n output: typeof result === 'string' ? result : JSON.stringify(result),\n },\n });\n\n this._send({ type: 'response.create' });\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 * Matches Python SDK's GeminiRealtime 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 { pcm16ToUlaw, resamplePcm16, ulawToPcm16 } from '../audio.js';\n\nconst HANG_UP_TOOL = {\n name: 'hang_up',\n description: 'End the phone call. Use when the conversation is finished or the caller says goodbye.',\n parameters: { type: 'object', properties: {} },\n};\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(schema['items'] as Record<string, unknown>, defs, depth + 1);\n }\n\n // type이 없고 properties가 있으면 object로 추정\n if (!result['type'] && result['properties']) result['type'] = 'object';\n\n // type이 object인데 properties가 없으면 빈 properties 추가\n if (result['type'] === 'object' && !result['properties']) result['properties'] = {};\n\n return result;\n}\n\nexport interface GeminiRealtimeOptions {\n /** Google API key. Falls back to GOOGLE_API_KEY env var. */\n apiKey?: string;\n /** System prompt / instructions for the AI. */\n systemPrompt?: string;\n /** Model to use. Default: 'gemini-2.5-flash-native-audio-preview-12-2025' */\n model?: string;\n /** Voice name. Default: 'Kore' */\n voice?: string;\n /** Language code. Default: 'ko' */\n language?: string;\n /** Send initial greeting. Default: true */\n greeting?: boolean;\n /** Generation config overrides. */\n generationConfig?: Record<string, unknown>;\n}\n\nexport class GeminiRealtime implements Session {\n private _apiKey: string;\n private _systemPrompt: string;\n private _model: string;\n private _voice: string;\n private _language: string;\n private _greeting: boolean;\n private _generationConfig: Record<string, unknown> | undefined;\n\n private _ws: import('ws').WebSocket | null = null;\n private _call: CallSession | null = null;\n private _tools: ToolRegistry | null = null;\n private _recorder: AudioRecorder | null = null;\n private _closed = false;\n private _sentAudioChunks = 0;\n private _audioRemainder: Buffer = Buffer.alloc(0);\n\n constructor(options: GeminiRealtimeOptions = {}) {\n this._apiKey = options.apiKey ?? process.env['GOOGLE_API_KEY'] ?? '';\n this._systemPrompt = options.systemPrompt ?? '';\n this._model = options.model ?? 'gemini-2.5-flash-native-audio-preview-12-2025';\n this._voice = options.voice ?? 'Kore';\n this._language = options.language ?? 'ko';\n this._greeting = options.greeting ?? true;\n this._generationConfig = options.generationConfig;\n }\n\n /** Inject per-call ToolRegistry. */\n setToolRegistry(registry: ToolRegistry): void {\n this._tools = registry;\n }\n\n /** Inject per-call AudioRecorder. */\n setRecorder(recorder: AudioRecorder): void {\n this._recorder = recorder;\n }\n\n async start(callSession: CallSession, tools?: ToolRegistry): Promise<void> {\n this._call = callSession;\n if (tools) this._tools = tools;\n this._closed = false;\n this._sentAudioChunks = 0;\n this._audioRemainder = Buffer.alloc(0);\n\n if (!this._apiKey) {\n throw new Error('Google API key is required. Set GOOGLE_API_KEY or pass apiKey option.');\n }\n\n const { WebSocket } = await import('ws');\n const url = `wss://generativelanguage.googleapis.com/ws/google.ai.generativelanguage.v1beta.GenerativeService.BidiGenerateContent?key=${this._apiKey}`;\n\n this._ws = new WebSocket(url);\n\n return new Promise<void>((resolve, reject) => {\n const ws = this._ws!;\n\n ws.on('open', () => {\n this._sendSetup();\n // Wait for setupComplete before resolving\n this._waitSetupComplete().then(() => {\n if (this._greeting) {\n this._sendGreeting();\n }\n // Start receive loop\n this._receiveLoop();\n resolve();\n }).catch(reject);\n });\n\n ws.on('close', () => {\n this._closed = true;\n });\n\n ws.on('error', (err: Error) => {\n if (!this._ws) {\n reject(err);\n }\n console.error('[GeminiRealtime] WebSocket error:', err.message);\n });\n });\n }\n\n feedAudio(audio: Buffer): void {\n if (this._ws && this._ws.readyState === 1 && !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 this._ws.send(\n JSON.stringify({\n realtimeInput: {\n mediaChunks: [\n {\n mimeType: 'audio/pcm;rate=16000',\n data: pcm16k.toString('base64'),\n },\n ],\n },\n }),\n );\n }\n }\n\n async stop(): Promise<void> {\n this._closed = true;\n if (this._ws) {\n this._ws.close();\n this._ws = null;\n }\n }\n\n private _sendSetup(): void {\n if (!this._ws || this._ws.readyState !== 1) return;\n\n const setupConfig: Record<string, unknown> = {\n model: `models/${this._model}`,\n generationConfig: {\n responseModalities: ['AUDIO'],\n speechConfig: {\n voiceConfig: {\n prebuiltVoiceConfig: {\n voiceName: this._voice,\n },\n },\n },\n ...this._generationConfig,\n },\n realtimeInputConfig: {\n automaticActivityDetection: {\n disabled: false,\n },\n },\n };\n\n if (this._systemPrompt) {\n setupConfig['systemInstruction'] = {\n parts: [{ text: this._systemPrompt }],\n };\n }\n\n // Tools: user tools + hang_up (Gemini 호환 스키마로 변환)\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<string, unknown>,\n ),\n }))\n : [];\n toolDefs.push(HANG_UP_TOOL);\n setupConfig['tools'] = [{ functionDeclarations: toolDefs }];\n\n this._ws.send(JSON.stringify({ setup: setupConfig }));\n }\n\n private _waitSetupComplete(): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n if (!this._ws) {\n reject(new Error('WebSocket not connected'));\n return;\n }\n const onMessage = (data: Buffer | string) => {\n try {\n const msg = JSON.parse(data.toString()) as Record<string, unknown>;\n if ('setupComplete' in msg) {\n this._ws?.removeListener('message', onMessage);\n resolve();\n }\n } catch {\n // Ignore parse errors\n }\n };\n this._ws.on('message', onMessage);\n });\n }\n\n private _sendGreeting(): void {\n if (!this._ws || this._ws.readyState !== 1) return;\n this._ws.send(\n JSON.stringify({\n clientContent: {\n turns: [\n {\n role: 'user',\n parts: [{ text: '인사해 주세요.' }],\n },\n ],\n turnComplete: true,\n },\n }),\n );\n }\n\n private _receiveLoop(): void {\n if (!this._ws) return;\n this._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\n private _handleMessage(msg: Record<string, unknown>): void {\n if (!this._call) return;\n\n // Handle server content with audio\n const serverContent = msg['serverContent'] as Record<string, unknown> | undefined;\n if (serverContent) {\n const modelTurn = serverContent['modelTurn'] as Record<string, unknown> | undefined;\n if (modelTurn) {\n const parts = modelTurn['parts'] as Array<Record<string, unknown>> | undefined;\n if (parts) {\n for (const part of parts) {\n const inlineData = part['inlineData'] as Record<string, unknown> | undefined;\n if (inlineData && inlineData['data']) {\n const mimeType = (inlineData['mimeType'] as string) ?? '';\n if (mimeType.includes('audio')) {\n this._handleAudioData(inlineData['data'] as string);\n }\n }\n\n // Text transcript from model turn\n const text = part['text'] as string | undefined;\n if (text && this._call) {\n this._call._emit('transcript', 'assistant', text);\n }\n }\n }\n }\n\n // Turn complete - flush audio remainder\n if (serverContent['turnComplete']) {\n this._flushAudioRemainder();\n }\n\n // Barge-in (interrupt)\n if (serverContent['interrupted']) {\n if (this._call) {\n this._call.clearAudio();\n }\n this._sentAudioChunks = 0;\n this._audioRemainder = Buffer.alloc(0);\n }\n }\n\n // Input transcription (top-level field)\n const inputTranscription = msg['inputTranscription'] as Record<string, unknown> | undefined;\n if (inputTranscription) {\n const text = inputTranscription['text'] as string | undefined;\n if (text && this._call) {\n this._call._emit('transcript', 'user', text);\n }\n }\n\n // Output transcription (top-level field)\n const outputTranscription = msg['outputTranscription'] as Record<string, unknown> | undefined;\n if (outputTranscription) {\n const text = outputTranscription['text'] as string | undefined;\n if (text && this._call) {\n this._call._emit('transcript', 'assistant', text);\n }\n }\n\n // Handle tool calls\n const toolCall = msg['toolCall'] as Record<string, unknown> | undefined;\n if (toolCall) {\n this._handleToolCall(toolCall);\n }\n\n // Handle tool call cancellation\n if (msg['toolCallCancellation']) {\n // Logged but no action needed\n }\n }\n\n private _handleAudioData(b64Data: string): void {\n if (!this._call) return;\n\n const pcm24k = Buffer.from(b64Data, 'base64');\n if (this._recorder) {\n this._recorder.writeOutbound(resamplePcm16(pcm24k, 24000, 8000));\n }\n\n // PCM16 24kHz → PCM16 8kHz → G.711 ulaw\n const pcm8k = resamplePcm16(pcm24k, 24000, 8000);\n const ulaw = pcm16ToUlaw(pcm8k);\n\n // 160B frame alignment (160B = 20ms at 8kHz ulaw)\n const combined = Buffer.concat([this._audioRemainder, ulaw]);\n const chunkSize = 160;\n const fullEnd = Math.floor(combined.length / chunkSize) * chunkSize;\n for (let off = 0; off < fullEnd; off += chunkSize) {\n this._call.sendAudio(combined.subarray(off, off + chunkSize));\n this._sentAudioChunks++;\n }\n this._audioRemainder = combined.subarray(fullEnd);\n }\n\n private _flushAudioRemainder(): void {\n if (this._audioRemainder.length > 0 && this._call) {\n const padded = Buffer.concat([\n this._audioRemainder,\n Buffer.alloc(160 - this._audioRemainder.length, 0xff),\n ]);\n this._call.sendAudio(padded);\n this._sentAudioChunks++;\n this._audioRemainder = Buffer.alloc(0);\n }\n }\n\n private async _handleToolCall(toolCall: Record<string, unknown>): Promise<void> {\n const functionCalls = toolCall['functionCalls'] as Array<Record<string, unknown>> | undefined;\n if (!functionCalls) return;\n\n const responses: Array<Record<string, unknown>> = [];\n\n for (const fc of functionCalls) {\n const name = fc['name'] as string;\n const fcId = (fc['id'] as string) ?? '';\n const args = (fc['args'] as Record<string, unknown>) ?? {};\n\n // Built-in hang_up tool\n if (name === 'hang_up') {\n if (this._call) {\n this._call.hangup();\n }\n return;\n }\n\n if (!this._tools || !this._tools.has(name)) {\n console.error(`[GeminiRealtime] Unknown tool: ${name}`);\n responses.push({ id: fcId, name, response: { error: `Unknown tool: ${name}` } });\n continue;\n }\n\n try {\n const result = await this._tools.call(name, args);\n responses.push({\n id: fcId,\n name,\n response: { result: typeof result === 'string' ? result : JSON.stringify(result) },\n });\n } catch (err) {\n console.error(`[GeminiRealtime] Tool call error for ${name}:`, err);\n responses.push({\n id: fcId,\n name,\n response: { error: String(err) },\n });\n }\n }\n\n if (this._ws && this._ws.readyState === 1) {\n this._ws.send(\n JSON.stringify({\n toolResponse: {\n functionResponses: responses,\n },\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 type { AudioRecorder } from '../recorder.js';\nimport type { CallSession } from '../session.js';\nimport type { ToolRegistry } from '../tool.js';\nimport type {\n ConversationMessage,\n LLM,\n LLMChunk,\n Session,\n STT,\n TTS,\n} from './base.js';\n\nexport interface PipelineSessionOptions {\n stt: STT;\n llm: LLM;\n tts: TTS;\n /** System prompt for the LLM. */\n systemPrompt?: string;\n /** Send initial greeting. Default: true */\n greeting?: boolean;\n /** Language code. Default: 'ko' */\n language?: string;\n /** Tool registry for function calling. */\n toolRegistry?: ToolRegistry;\n /** Audio recorder for the session. */\n recorder?: AudioRecorder;\n /** LLM temperature. */\n temperature?: number;\n /** Max tokens for LLM generation. */\n maxTokens?: number;\n /** Sample rate for audio. Default: 8000 */\n sampleRate?: number;\n /** Whether to interrupt TTS when user starts speaking. Default: true */\n interruptOnSpeech?: boolean;\n}\n\nexport class PipelineSession implements Session {\n private _stt: STT;\n private _llm: LLM;\n private _tts: TTS;\n private _systemPrompt: string | undefined;\n private _greeting: boolean;\n private _language: string;\n private _temperature: number | undefined;\n private _maxTokens: number | undefined;\n private _sampleRate: number;\n private _interruptOnSpeech: boolean;\n\n private _callSession: CallSession | null = null;\n private _tools: ToolRegistry | null = null;\n private _recorder: AudioRecorder | null = null;\n private _conversation: ConversationMessage[] = [];\n private _audioBuffer: Buffer[] = [];\n private _running = false;\n private _speaking = false;\n\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 async start(callSession: CallSession, tools?: ToolRegistry): Promise<void> {\n this._callSession = callSession;\n this._tools = tools ?? null;\n this._running = true;\n this._conversation = [];\n\n if (this._systemPrompt) {\n this._conversation.push({\n role: 'system',\n content: this._systemPrompt,\n });\n }\n\n // Generate initial greeting if enabled\n if (this._greeting) {\n this._generateGreeting().catch((err) => {\n console.error('[PipelineSession] Greeting error:', err);\n });\n }\n\n // Start the STT listening loop\n this._runSttLoop().catch((err) => {\n console.error('[PipelineSession] STT loop error:', err);\n });\n }\n\n feedAudio(audio: Buffer): void {\n if (this._running) {\n this._audioBuffer.push(audio);\n }\n }\n\n async stop(): Promise<void> {\n this._running = false;\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 }\n\n if (event.type === 'final' && event.transcript.trim()) {\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 async _respond(): Promise<void> {\n // Run LLM generation (may include tool calls)\n let fullResponse = '';\n const textChunks: string[] = [];\n\n const llmStream = this._llm.generate(this._conversation, {\n tools: this._tools ?? undefined,\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._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 || !this._tools) return;\n\n const { id, name, arguments: argsStr } = chunk.toolCall;\n\n try {\n const args = JSON.parse(argsStr) as Record<string, unknown>;\n const result = await this._tools.call(name, args);\n\n this._conversation.push({\n role: 'assistant',\n content: '',\n // Tool call info stored in the message flow\n });\n this._conversation.push({\n role: 'tool',\n content: typeof result === 'string' ? result : JSON.stringify(result),\n tool_call_id: id,\n name,\n });\n\n // Re-generate after tool result\n let followUpText = '';\n const followUpStream = this._llm.generate(this._conversation, {\n tools: this._tools ?? undefined,\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 console.error(`[PipelineSession] Tool call error for ${name}:`, err);\n }\n }\n\n private async _synthesizeAndSend(text: string): Promise<void> {\n if (!this._callSession || !this._running) return;\n\n this._speaking = true;\n\n try {\n for await (const audioChunk of this._tts.synthesize(text, {\n sampleRate: this._sampleRate,\n })) {\n if (!this._running || !this._speaking) break;\n if (this._recorder) {\n const pcm8k = this._sampleRate !== 8000\n ? resamplePcm16(audioChunk, this._sampleRate, 8000)\n : audioChunk\n this._recorder.writeOutbound(pcm8k)\n }\n // Resample TTS output → 8kHz → ulaw, send in 160B frames\n const pcm8k = resamplePcm16(audioChunk, this._sampleRate, 8000);\n const ulaw = pcm16ToUlaw(pcm8k);\n for (let off = 0; off < ulaw.length; off += 160) {\n let chunk = ulaw.subarray(off, off + 160);\n if (chunk.length < 160) {\n chunk = Buffer.concat([chunk, Buffer.alloc(160 - chunk.length, 0xff)]);\n }\n this._callSession.sendAudio(chunk);\n }\n }\n } catch (err) {\n console.error('[PipelineSession] TTS error:', err);\n } finally {\n this._speaking = false;\n }\n }\n}\n","/**\n * Deepgram STT (Speech-to-Text) provider.\n */\n\nimport type { SpeechEvent, STT } from './base.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\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 console.error('[DeepgramSTT] WebSocket error:', err.message);\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\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 { TTS } from './base.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\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 console.error('[ElevenLabsTTS] WebSocket error:', err.message);\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\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 ws.send(JSON.stringify({ text: chunk }));\n }\n }\n } finally {\n // Send end-of-stream\n if (ws.readyState === 1) {\n ws.send(JSON.stringify({ text: '' }));\n }\n }\n })();\n\n // Yield audio chunks\n try {\n while (!done || audioQueue.length > 0) {\n if (audioQueue.length > 0) {\n yield audioQueue.shift()!;\n } else if (!done) {\n await new Promise<void>((resolve) => {\n resolveWait = resolve;\n });\n }\n }\n } finally {\n done = true;\n ws.close();\n await feedPromise.catch(() => {});\n }\n }\n}\n","/**\n * OpenAI LLM provider for pipeline-based voice agents.\n */\n\nimport type { ConversationMessage, LLM, LLMChunk } from './base.js';\nimport type { ToolRegistry } from '../tool.js';\n\nexport interface OpenAILLMOptions {\n /** OpenAI API key. Falls back to OPENAI_API_KEY env var. */\n apiKey?: string;\n /** Model to use. Default: 'gpt-4o-mini' */\n model?: string;\n /** Default temperature. Default: 0.8 */\n temperature?: number;\n /** Default max tokens. Default: 4096 */\n maxTokens?: number;\n}\n\nexport class OpenAILLM implements LLM {\n private _options: OpenAILLMOptions;\n\n constructor(options: OpenAILLMOptions = {}) {\n this._options = {\n model: 'gpt-4o-mini',\n temperature: 0.8,\n maxTokens: 4096,\n ...options,\n };\n }\n\n async *generate(\n messages: ConversationMessage[],\n options?: {\n tools?: ToolRegistry;\n temperature?: number;\n maxTokens?: number;\n },\n ): AsyncGenerator<LLMChunk> {\n const OpenAI = (await import('openai')).default;\n\n const client = new OpenAI({\n apiKey: this._options.apiKey ?? process.env['OPENAI_API_KEY'],\n });\n\n const requestParams: Record<string, unknown> = {\n model: this._options.model,\n messages: messages.map((m) => {\n const msg: Record<string, unknown> = { role: m.role, content: m.content };\n if (m.name) msg['name'] = m.name;\n if (m.tool_call_id) msg['tool_call_id'] = m.tool_call_id;\n return msg;\n }),\n stream: true,\n temperature: options?.temperature ?? this._options.temperature,\n max_tokens: options?.maxTokens ?? this._options.maxTokens,\n };\n\n if (options?.tools && options.tools.size > 0) {\n requestParams['tools'] = options.tools.toOpenAITools();\n }\n\n const stream = await client.chat.completions.create(\n requestParams as Parameters<typeof client.chat.completions.create>[0],\n );\n\n let currentToolCall: { id: string; name: string; arguments: string } | null = null;\n\n for await (const chunk of stream as AsyncIterable<Record<string, unknown>>) {\n const choices = chunk['choices'] as Array<Record<string, unknown>> | undefined;\n if (!choices || choices.length === 0) continue;\n\n const delta = choices[0]!['delta'] as Record<string, unknown> | undefined;\n if (!delta) continue;\n\n // Text content\n const content = delta['content'] as string | undefined;\n if (content) {\n yield { type: 'text', text: content };\n }\n\n // Tool calls\n const toolCalls = delta['tool_calls'] as Array<Record<string, unknown>> | undefined;\n if (toolCalls) {\n for (const tc of toolCalls) {\n const fn = tc['function'] as Record<string, unknown> | undefined;\n if (fn) {\n if (fn['name']) {\n // Start of a new tool call\n if (currentToolCall) {\n yield {\n type: 'tool_call',\n toolCall: {\n id: currentToolCall.id,\n name: currentToolCall.name,\n arguments: currentToolCall.arguments,\n },\n };\n }\n currentToolCall = {\n id: (tc['id'] as string) ?? '',\n name: fn['name'] as string,\n arguments: (fn['arguments'] as string) ?? '',\n };\n } else if (currentToolCall && fn['arguments']) {\n currentToolCall.arguments += fn['arguments'] as string;\n }\n }\n }\n }\n }\n\n // Emit final tool call if pending\n if (currentToolCall) {\n yield {\n type: 'tool_call',\n toolCall: {\n id: currentToolCall.id,\n name: currentToolCall.name,\n arguments: currentToolCall.arguments,\n },\n };\n }\n\n yield { type: 'done' };\n }\n}\n","/**\n * Anthropic LLM provider for pipeline-based voice agents.\n */\n\nimport type { ConversationMessage, LLM, LLMChunk } from './base.js';\nimport type { ToolRegistry } from '../tool.js';\n\nexport interface AnthropicLLMOptions {\n /** Anthropic API key. Falls back to ANTHROPIC_API_KEY env var. */\n apiKey?: string;\n /** Model to use. Default: 'claude-sonnet-4-6' */\n model?: string;\n /** Default temperature. Default: 0.8 */\n temperature?: number;\n /** Default max tokens. Default: 4096 */\n maxTokens?: number;\n}\n\nexport class AnthropicLLM implements LLM {\n private _options: AnthropicLLMOptions;\n\n constructor(options: AnthropicLLMOptions = {}) {\n this._options = {\n model: 'claude-sonnet-4-6',\n temperature: 0.8,\n maxTokens: 4096,\n ...options,\n };\n }\n\n async *generate(\n messages: ConversationMessage[],\n options?: {\n tools?: ToolRegistry;\n temperature?: number;\n maxTokens?: number;\n },\n ): AsyncGenerator<LLMChunk> {\n const AnthropicModule = await import('@anthropic-ai/sdk');\n const Anthropic = AnthropicModule.default;\n\n const client = new Anthropic({\n apiKey: this._options.apiKey ?? process.env['ANTHROPIC_API_KEY'],\n });\n\n // Separate system message from conversation\n let systemPrompt: string | undefined;\n const conversationMessages: Array<Record<string, unknown>> = [];\n\n for (const msg of messages) {\n if (msg.role === 'system') {\n systemPrompt = msg.content;\n } else {\n conversationMessages.push({\n role: msg.role === 'tool' ? 'user' : msg.role,\n content:\n msg.role === 'tool'\n ? [\n {\n type: 'tool_result',\n tool_use_id: msg.tool_call_id,\n content: msg.content,\n },\n ]\n : msg.content,\n });\n }\n }\n\n const requestParams: Record<string, unknown> = {\n model: this._options.model,\n messages: conversationMessages,\n max_tokens: options?.maxTokens ?? this._options.maxTokens,\n stream: true,\n };\n\n if (systemPrompt) {\n requestParams['system'] = systemPrompt;\n }\n if (options?.temperature ?? this._options.temperature) {\n requestParams['temperature'] = options?.temperature ?? this._options.temperature;\n }\n\n if (options?.tools && options.tools.size > 0) {\n const toolDefs = options.tools.toOpenAITools().map((t) => ({\n name: t.function.name,\n description: t.function.description,\n input_schema: t.function.parameters,\n }));\n requestParams['tools'] = toolDefs;\n }\n\n const stream = client.messages.stream(\n requestParams as Parameters<typeof client.messages.stream>[0],\n );\n\n let currentToolCall: { id: string; name: string; arguments: string } | null = null;\n\n for await (const event of stream as AsyncIterable<Record<string, unknown>>) {\n const eventType = event['type'] as string;\n\n switch (eventType) {\n case 'content_block_start': {\n const contentBlock = event['content_block'] as Record<string, unknown>;\n if (contentBlock?.['type'] === 'tool_use') {\n currentToolCall = {\n id: contentBlock['id'] as string,\n name: contentBlock['name'] as string,\n arguments: '',\n };\n }\n break;\n }\n case 'content_block_delta': {\n const delta = event['delta'] as Record<string, unknown>;\n if (delta?.['type'] === 'text_delta') {\n yield { type: 'text', text: delta['text'] as string };\n } else if (delta?.['type'] === 'input_json_delta' && currentToolCall) {\n currentToolCall.arguments += (delta['partial_json'] as string) ?? '';\n }\n break;\n }\n case 'content_block_stop': {\n if (currentToolCall) {\n yield {\n type: 'tool_call',\n toolCall: {\n id: currentToolCall.id,\n name: currentToolCall.name,\n arguments: currentToolCall.arguments,\n },\n };\n currentToolCall = null;\n }\n break;\n }\n case 'message_stop': {\n yield { type: 'done' };\n break;\n }\n }\n }\n }\n}\n","/**\n * Google Gemini LLM provider for pipeline-based voice agents.\n */\n\nimport type { ConversationMessage, LLM, LLMChunk } from './base.js';\nimport type { ToolRegistry } from '../tool.js';\n\nexport interface GeminiLLMOptions {\n /** Google API key. Falls back to GOOGLE_API_KEY env var. */\n apiKey?: string;\n /** Model to use. Default: 'gemini-2.5-flash' */\n model?: string;\n /** Default temperature. Default: 0.8 */\n temperature?: number;\n /** Default max tokens. Default: 4096 */\n maxTokens?: number;\n}\n\nexport class GeminiLLM implements LLM {\n private _options: GeminiLLMOptions;\n\n constructor(options: GeminiLLMOptions = {}) {\n this._options = {\n model: 'gemini-2.5-flash',\n temperature: 0.8,\n maxTokens: 4096,\n ...options,\n };\n }\n\n async *generate(\n messages: ConversationMessage[],\n options?: {\n tools?: ToolRegistry;\n temperature?: number;\n maxTokens?: number;\n },\n ): AsyncGenerator<LLMChunk> {\n const { GoogleGenAI } = await import('@google/genai');\n\n const client = new GoogleGenAI({\n apiKey: this._options.apiKey ?? process.env['GOOGLE_API_KEY'],\n });\n\n // Convert messages to Gemini format\n let systemInstruction: string | undefined;\n const contents: Array<Record<string, unknown>> = [];\n\n for (const msg of messages) {\n if (msg.role === 'system') {\n systemInstruction = msg.content;\n continue;\n }\n\n const role = msg.role === 'assistant' ? 'model' : 'user';\n contents.push({\n role,\n parts: [{ text: msg.content }],\n });\n }\n\n const requestConfig: Record<string, unknown> = {\n contents,\n };\n\n if (systemInstruction) {\n requestConfig['systemInstruction'] = { parts: [{ text: systemInstruction }] };\n }\n\n const generationConfig: Record<string, unknown> = {};\n if (options?.temperature ?? this._options.temperature) {\n generationConfig['temperature'] = options?.temperature ?? this._options.temperature;\n }\n if (options?.maxTokens ?? this._options.maxTokens) {\n generationConfig['maxOutputTokens'] = options?.maxTokens ?? this._options.maxTokens;\n }\n if (Object.keys(generationConfig).length > 0) {\n requestConfig['generationConfig'] = generationConfig;\n }\n\n if (options?.tools && options.tools.size > 0) {\n const toolDefs = options.tools.toOpenAITools().map((t) => ({\n name: t.function.name,\n description: t.function.description,\n parameters: t.function.parameters,\n }));\n requestConfig['tools'] = [{ functionDeclarations: toolDefs }];\n }\n\n const response = await client.models.generateContentStream({\n model: this._options.model!,\n ...requestConfig,\n });\n\n for await (const chunk of response) {\n const candidates = (chunk as Record<string, unknown>)['candidates'] as\n | Array<Record<string, unknown>>\n | undefined;\n if (!candidates || candidates.length === 0) continue;\n\n const content = candidates[0]?.['content'] as Record<string, unknown> | undefined;\n const parts = content?.['parts'] as Array<Record<string, unknown>> | undefined;\n if (!parts) continue;\n\n for (const part of parts) {\n if ('text' in part && part['text']) {\n yield { type: 'text', text: part['text'] as string };\n }\n\n if ('functionCall' in part && part['functionCall']) {\n const fc = part['functionCall'] as { name: string; args: Record<string, unknown> };\n yield {\n type: 'tool_call',\n toolCall: {\n id: `gemini_${Date.now()}`,\n name: fc.name,\n arguments: JSON.stringify(fc.args ?? {}),\n },\n };\n }\n }\n }\n\n yield { type: 'done' };\n }\n}\n","/**\n * OpenAI-compatible LLM provider (works with any OpenAI-compatible API).\n */\n\nimport type { ConversationMessage, LLM, LLMChunk } from './base.js';\nimport type { ToolRegistry } from '../tool.js';\n\nexport interface OpenAICompatLLMOptions {\n /** API key. */\n apiKey?: string;\n /** Base URL for the OpenAI-compatible API. */\n baseUrl: string;\n /** Model to use. */\n model: string;\n /** Default temperature. */\n temperature?: number;\n /** Default max tokens. */\n maxTokens?: number;\n /** Additional default headers. */\n defaultHeaders?: Record<string, string>;\n}\n\nexport class OpenAICompatLLM implements LLM {\n private _options: OpenAICompatLLMOptions;\n\n constructor(options: OpenAICompatLLMOptions) {\n this._options = options;\n }\n\n async *generate(\n messages: ConversationMessage[],\n options?: {\n tools?: ToolRegistry;\n temperature?: number;\n maxTokens?: number;\n },\n ): AsyncGenerator<LLMChunk> {\n const OpenAI = (await import('openai')).default;\n\n const client = new OpenAI({\n apiKey: this._options.apiKey ?? 'not-needed',\n baseURL: this._options.baseUrl,\n defaultHeaders: this._options.defaultHeaders,\n });\n\n const requestParams: Record<string, unknown> = {\n model: this._options.model,\n messages: messages.map((m) => {\n const msg: Record<string, unknown> = { role: m.role, content: m.content };\n if (m.name) msg['name'] = m.name;\n if (m.tool_call_id) msg['tool_call_id'] = m.tool_call_id;\n return msg;\n }),\n stream: true,\n temperature: options?.temperature ?? this._options.temperature,\n max_tokens: options?.maxTokens ?? this._options.maxTokens,\n };\n\n if (options?.tools && options.tools.size > 0) {\n requestParams['tools'] = options.tools.toOpenAITools();\n }\n\n const stream = await client.chat.completions.create(\n requestParams as Parameters<typeof client.chat.completions.create>[0],\n );\n\n let currentToolCall: { id: string; name: string; arguments: string } | null = null;\n\n for await (const chunk of stream as AsyncIterable<Record<string, unknown>>) {\n const choices = chunk['choices'] as Array<Record<string, unknown>> | undefined;\n if (!choices || choices.length === 0) continue;\n\n const delta = choices[0]!['delta'] as Record<string, unknown> | undefined;\n if (!delta) continue;\n\n const content = delta['content'] as string | undefined;\n if (content) {\n yield { type: 'text', text: content };\n }\n\n const toolCalls = delta['tool_calls'] as Array<Record<string, unknown>> | undefined;\n if (toolCalls) {\n for (const tc of toolCalls) {\n const fn = tc['function'] as Record<string, unknown> | undefined;\n if (fn) {\n if (fn['name']) {\n if (currentToolCall) {\n yield {\n type: 'tool_call',\n toolCall: {\n id: currentToolCall.id,\n name: currentToolCall.name,\n arguments: currentToolCall.arguments,\n },\n };\n }\n currentToolCall = {\n id: (tc['id'] as string) ?? '',\n name: fn['name'] as string,\n arguments: (fn['arguments'] as string) ?? '',\n };\n } else if (currentToolCall && fn['arguments']) {\n currentToolCall.arguments += fn['arguments'] as string;\n }\n }\n }\n }\n }\n\n if (currentToolCall) {\n yield {\n type: 'tool_call',\n toolCall: {\n id: currentToolCall.id,\n name: currentToolCall.name,\n arguments: currentToolCall.arguments,\n },\n };\n }\n\n yield { type: 'done' };\n }\n}\n","/**\n * Ollama LLM provider for pipeline-based voice agents.\n * Uses the OpenAI-compatible API that Ollama exposes.\n */\n\nimport type { ConversationMessage, LLM, LLMChunk } from './base.js';\nimport type { ToolRegistry } from '../tool.js';\nimport { OpenAICompatLLM } from './openai-compat-llm.js';\n\nexport interface OllamaLLMOptions {\n /** Ollama server URL. Falls back to OLLAMA_BASE_URL env var. Default: 'http://localhost:11434/v1' */\n baseUrl?: string;\n /** Model to use. Default: 'llama3.2' */\n model?: string;\n /** Default temperature. Default: 0.8 */\n temperature?: number;\n /** Default max tokens. Default: 4096 */\n maxTokens?: number;\n}\n\nexport class OllamaLLM implements LLM {\n private _inner: OpenAICompatLLM;\n\n constructor(options: OllamaLLMOptions = {}) {\n const baseUrl = options.baseUrl ?? process.env['OLLAMA_BASE_URL'] ?? 'http://localhost:11434/v1';\n this._inner = new OpenAICompatLLM({\n baseUrl: baseUrl.replace(/\\/$/, ''),\n model: options.model ?? 'llama3.2',\n apiKey: 'ollama',\n temperature: options.temperature ?? 0.8,\n maxTokens: options.maxTokens ?? 4096,\n });\n }\n\n async *generate(\n messages: ConversationMessage[],\n options?: {\n tools?: ToolRegistry;\n temperature?: number;\n maxTokens?: number;\n },\n ): AsyncGenerator<LLMChunk> {\n yield* this._inner.generate(messages, options);\n }\n}\n","import type { ConversationMessage, LLM, LLMChunk } from './base.js';\nimport type { ToolRegistry } from '../tool.js';\nimport { OpenAICompatLLM } from './openai-compat-llm.js';\n\nexport interface MistralLLMOptions {\n apiKey?: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n}\n\nexport class MistralLLM implements LLM {\n private _inner: OpenAICompatLLM;\n\n constructor(options: MistralLLMOptions = {}) {\n this._inner = new OpenAICompatLLM({\n apiKey: options.apiKey ?? process.env['MISTRAL_API_KEY'],\n baseUrl: 'https://api.mistral.ai/v1',\n model: options.model ?? 'mistral-small-latest',\n temperature: options.temperature,\n maxTokens: options.maxTokens,\n });\n }\n\n async *generate(\n messages: ConversationMessage[],\n options?: { tools?: ToolRegistry; temperature?: number; maxTokens?: number },\n ): AsyncGenerator<LLMChunk> {\n yield* this._inner.generate(messages, options);\n }\n}\n","import type { ConversationMessage, LLM, LLMChunk } from './base.js';\nimport type { ToolRegistry } from '../tool.js';\nimport { OpenAICompatLLM } from './openai-compat-llm.js';\n\nexport interface GroqLLMOptions {\n apiKey?: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n}\n\nexport class GroqLLM implements LLM {\n private _inner: OpenAICompatLLM;\n\n constructor(options: GroqLLMOptions = {}) {\n this._inner = new OpenAICompatLLM({\n apiKey: options.apiKey ?? process.env['GROQ_API_KEY'],\n baseUrl: 'https://api.groq.com/openai/v1',\n model: options.model ?? 'meta-llama/llama-4-scout-17b-16e-instruct',\n temperature: options.temperature,\n maxTokens: options.maxTokens,\n });\n }\n\n async *generate(\n messages: ConversationMessage[],\n options?: { tools?: ToolRegistry; temperature?: number; maxTokens?: number },\n ): AsyncGenerator<LLMChunk> {\n yield* this._inner.generate(messages, options);\n }\n}\n","import type { ConversationMessage, LLM, LLMChunk } from './base.js';\nimport type { ToolRegistry } from '../tool.js';\nimport { OpenAICompatLLM } from './openai-compat-llm.js';\n\nexport interface PerplexityLLMOptions {\n apiKey?: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n}\n\nexport class PerplexityLLM implements LLM {\n private _inner: OpenAICompatLLM;\n\n constructor(options: PerplexityLLMOptions = {}) {\n this._inner = new OpenAICompatLLM({\n apiKey: options.apiKey ?? process.env['PERPLEXITY_API_KEY'],\n baseUrl: 'https://api.perplexity.ai',\n model: options.model ?? 'sonar',\n temperature: options.temperature,\n maxTokens: options.maxTokens,\n });\n }\n\n async *generate(\n messages: ConversationMessage[],\n options?: { tools?: ToolRegistry; temperature?: number; maxTokens?: number },\n ): AsyncGenerator<LLMChunk> {\n yield* this._inner.generate(messages, options);\n }\n}\n","import type { ConversationMessage, LLM, LLMChunk } from './base.js';\nimport type { ToolRegistry } from '../tool.js';\nimport { OpenAICompatLLM } from './openai-compat-llm.js';\n\nexport interface TogetherLLMOptions {\n apiKey?: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n}\n\nexport class TogetherLLM implements LLM {\n private _inner: OpenAICompatLLM;\n\n constructor(options: TogetherLLMOptions = {}) {\n this._inner = new OpenAICompatLLM({\n apiKey: options.apiKey ?? process.env['TOGETHER_API_KEY'],\n baseUrl: 'https://api.together.xyz/v1',\n model: options.model ?? 'meta-llama/Llama-4-Scout-17B-16E-Instruct',\n temperature: options.temperature,\n maxTokens: options.maxTokens,\n });\n }\n\n async *generate(\n messages: ConversationMessage[],\n options?: { tools?: ToolRegistry; temperature?: number; maxTokens?: number },\n ): AsyncGenerator<LLMChunk> {\n yield* this._inner.generate(messages, options);\n }\n}\n","import type { ConversationMessage, LLM, LLMChunk } from './base.js';\nimport type { ToolRegistry } from '../tool.js';\nimport { OpenAICompatLLM } from './openai-compat-llm.js';\n\nexport interface FireworksLLMOptions {\n apiKey?: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n}\n\nexport class FireworksLLM implements LLM {\n private _inner: OpenAICompatLLM;\n\n constructor(options: FireworksLLMOptions = {}) {\n this._inner = new OpenAICompatLLM({\n apiKey: options.apiKey ?? process.env['FIREWORKS_API_KEY'],\n baseUrl: 'https://api.fireworks.ai/inference/v1',\n model: options.model ?? 'accounts/fireworks/models/llama4-scout-instruct-basic',\n temperature: options.temperature,\n maxTokens: options.maxTokens,\n });\n }\n\n async *generate(\n messages: ConversationMessage[],\n options?: { tools?: ToolRegistry; temperature?: number; maxTokens?: number },\n ): AsyncGenerator<LLMChunk> {\n yield* this._inner.generate(messages, options);\n }\n}\n","import type { ConversationMessage, LLM, LLMChunk } from './base.js';\nimport type { ToolRegistry } from '../tool.js';\nimport { OpenAICompatLLM } from './openai-compat-llm.js';\n\nexport interface DeepSeekLLMOptions {\n apiKey?: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n}\n\nexport class DeepSeekLLM implements LLM {\n private _inner: OpenAICompatLLM;\n\n constructor(options: DeepSeekLLMOptions = {}) {\n this._inner = new OpenAICompatLLM({\n apiKey: options.apiKey ?? process.env['DEEPSEEK_API_KEY'],\n baseUrl: 'https://api.deepseek.com',\n model: options.model ?? 'deepseek-chat',\n temperature: options.temperature,\n maxTokens: options.maxTokens,\n });\n }\n\n async *generate(\n messages: ConversationMessage[],\n options?: { tools?: ToolRegistry; temperature?: number; maxTokens?: number },\n ): AsyncGenerator<LLMChunk> {\n yield* this._inner.generate(messages, options);\n }\n}\n","import type { ConversationMessage, LLM, LLMChunk } from './base.js';\nimport type { ToolRegistry } from '../tool.js';\nimport { OpenAICompatLLM } from './openai-compat-llm.js';\n\nexport interface XaiLLMOptions {\n apiKey?: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n}\n\nexport class XaiLLM implements LLM {\n private _inner: OpenAICompatLLM;\n\n constructor(options: XaiLLMOptions = {}) {\n this._inner = new OpenAICompatLLM({\n apiKey: options.apiKey ?? process.env['XAI_API_KEY'],\n baseUrl: 'https://api.x.ai/v1',\n model: options.model ?? 'grok-4-1-fast',\n temperature: options.temperature,\n maxTokens: options.maxTokens,\n });\n }\n\n async *generate(\n messages: ConversationMessage[],\n options?: { tools?: ToolRegistry; temperature?: number; maxTokens?: number },\n ): AsyncGenerator<LLMChunk> {\n yield* this._inner.generate(messages, options);\n }\n}\n","/**\n * MCP server configuration for stdio-based servers.\n */\n\nexport interface MCPServerStdio {\n type: 'stdio';\n /** Command to execute. */\n command: string;\n /** Command arguments. */\n args?: string[];\n /** Environment variables. */\n env?: Record<string, string>;\n [key: string]: unknown;\n}\n\n/**\n * Create a stdio MCP server configuration.\n */\nexport function mcpServerStdio(options: {\n command: string;\n args?: string[];\n env?: Record<string, string>;\n}): MCPServerStdio {\n return {\n type: 'stdio',\n command: options.command,\n args: options.args,\n env: options.env,\n };\n}\n","/**\n * MCP server configuration for HTTP-based servers.\n */\n\nexport interface MCPServerHTTP {\n type: 'http';\n /** Server URL. */\n url: string;\n /** Additional headers to send with requests. */\n headers?: Record<string, string>;\n [key: string]: unknown;\n}\n\n/**\n * Create an HTTP MCP server configuration.\n */\nexport function mcpServerHTTP(options: {\n url: string;\n headers?: Record<string, string>;\n}): MCPServerHTTP {\n return {\n type: 'http',\n url: options.url,\n headers: options.headers,\n };\n}\n"]}
|