@teamlearners/clawops 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +313 -0
- package/dist/agent/index.cjs +2668 -0
- package/dist/agent/index.cjs.map +1 -0
- package/dist/agent/index.d.cts +821 -0
- package/dist/agent/index.d.ts +821 -0
- package/dist/agent/index.js +2613 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/chunk-JNSHMKDI.cjs +175 -0
- package/dist/chunk-JNSHMKDI.cjs.map +1 -0
- package/dist/chunk-UKAT24I6.js +152 -0
- package/dist/chunk-UKAT24I6.js.map +1 -0
- package/dist/index.cjs +601 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +549 -0
- package/dist/index.d.ts +549 -0
- package/dist/index.js +523 -0
- package/dist/index.js.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +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"],"mappings":"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,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,EAAQ,GAAA;AAAA,EACxD,GAAA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","file":"index.js","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 agentId: string;\n /** Override control WS path. Default: /v1/agent/control */\n path?: string;\n}\n\nexport interface ControlEventData {\n call_id: string;\n from_number?: string;\n to_number?: string;\n account_id?: string;\n direction?: 'inbound' | 'outbound';\n media_ws_url?: string;\n metadata?: Record<string, unknown>;\n reason?: string;\n}\n\nexport interface ControlEvent {\n event: string;\n data: ControlEventData;\n}\n\ntype ControlEventHandler = (event: ControlEvent) => void | Promise<void>;\n\nconst DEFAULT_PATH = '/v1/agent/control';\nconst INITIAL_RECONNECT_DELAY = 1000;\nconst MAX_RECONNECT_DELAY = 30000;\n\n/**\n * Build the full control WebSocket URL from options.\n */\nexport function buildControlWsUrl(options: ControlWsOptions): string {\n const base = options.baseUrl.replace(/^http/, 'ws').replace(/\\/$/, '');\n const path = options.path ?? DEFAULT_PATH;\n return `${base}${path}?api_key=${encodeURIComponent(options.apiKey)}&agent_id=${encodeURIComponent(options.agentId)}`;\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 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\nimport type { WebSocket as WsType } from 'ws';\n\nexport interface MediaStartEvent {\n streamSid: string;\n callSid: string;\n accountSid: string;\n tracks: string[];\n customParameters: Record<string, string>;\n mediaFormat: {\n encoding: string;\n sampleRate: number;\n channels: number;\n };\n}\n\nexport interface MediaEvent {\n track: string;\n chunk: string;\n timestamp: string;\n}\n\n/**\n * Parse a 'start' event payload from the media WebSocket.\n */\nexport function parseStartEvent(data: Record<string, unknown>): MediaStartEvent {\n const start = data['start'] as Record<string, unknown>;\n return {\n streamSid: (start['streamSid'] ?? data['streamSid'] ?? '') as string,\n callSid: (start['callSid'] ?? '') as string,\n accountSid: (start['accountSid'] ?? '') as string,\n tracks: (start['tracks'] ?? []) as string[],\n customParameters: (start['customParameters'] ?? {}) as Record<string, string>,\n mediaFormat: (start['mediaFormat'] ?? {\n encoding: 'audio/x-mulaw',\n sampleRate: 8000,\n channels: 1,\n }) as MediaStartEvent['mediaFormat'],\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 track: (media['track'] ?? 'inbound') as string,\n chunk: (media['chunk'] ?? media['payload'] ?? '') as string,\n timestamp: (media['timestamp'] ?? '') as string,\n };\n}\n\n/**\n * Build a media response message to send audio back.\n */\nexport function buildMediaResponse(streamSid: string, payload: string): string {\n return JSON.stringify({\n event: 'media',\n streamSid,\n media: {\n payload,\n },\n });\n}\n\nexport class MediaWebSocket {\n private _ws: WsType | null = null;\n private _streamSid: string | null = null;\n private _audioQueue: string[] = [];\n private _sendLoopRunning = false;\n private _closed = false;\n private _onAudio: ((audio: Buffer) => void) | null = null;\n private _onStart: ((event: MediaStartEvent) => void) | null = null;\n private _onClose: (() => void) | null = null;\n private _markSeq = 0;\n private _markResolves: Map<string, () => void> = new Map();\n\n /** Set the handler for inbound audio data. */\n onAudio(handler: (audio: Buffer) => 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. */\n async connect(url: string): Promise<void> {\n const { WebSocket } = await import('ws');\n\n return new Promise<void>((resolve, reject) => {\n const ws = new WebSocket(url);\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._streamSid && this._ws.readyState === 1) {\n this._ws.send(\n JSON.stringify({\n event: 'clear',\n streamSid: this._streamSid,\n }),\n );\n }\n }\n\n /** Send a mark event and return a promise that resolves when the mark is acknowledged. */\n sendMark(): Promise<void> {\n const label = `mark_${++this._markSeq}`;\n return new Promise<void>((resolve) => {\n this._markResolves.set(label, resolve);\n if (this._ws && this._streamSid && this._ws.readyState === 1) {\n this._ws.send(\n JSON.stringify({\n event: 'mark',\n streamSid: this._streamSid,\n mark: { name: label },\n }),\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 // Resolve any pending marks\n for (const resolve of this._markResolves.values()) {\n resolve();\n }\n this._markResolves.clear();\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 this._streamSid = startEvt.streamSid;\n if (this._onStart) {\n this._onStart(startEvt);\n }\n break;\n }\n case 'media': {\n const mediaEvt = parseMediaEvent(msg);\n if (mediaEvt.track === 'inbound' && this._onAudio) {\n const audioBuf = Buffer.from(mediaEvt.chunk, 'base64');\n this._onAudio(audioBuf);\n }\n break;\n }\n case 'mark': {\n const mark = msg['mark'] as Record<string, unknown> | undefined;\n const name = mark?.['name'] as string | undefined;\n if (name && this._markResolves.has(name)) {\n this._markResolves.get(name)!();\n this._markResolves.delete(name);\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 if (this._streamSid) {\n this._ws.send(buildMediaResponse(this._streamSid, payload));\n }\n }\n\n setTimeout(loop, 20);\n };\n\n loop();\n }\n}\n","/**\n * AudioRecorder writes inbound and outbound audio to a WAV file.\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nconst WAV_SAMPLE_RATE = 8000;\nconst WAV_CHANNELS = 1;\nconst WAV_BITS_PER_SAMPLE = 16;\n\n/**\n * Generate a WAV file header for the given data size.\n */\nfunction makeWavHeader(dataSize: number): Buffer {\n const header = Buffer.alloc(44);\n const byteRate = WAV_SAMPLE_RATE * WAV_CHANNELS * (WAV_BITS_PER_SAMPLE / 8);\n const blockAlign = WAV_CHANNELS * (WAV_BITS_PER_SAMPLE / 8);\n\n // RIFF header\n header.write('RIFF', 0);\n header.writeUInt32LE(36 + dataSize, 4);\n header.write('WAVE', 8);\n\n // fmt sub-chunk\n header.write('fmt ', 12);\n header.writeUInt32LE(16, 16); // Sub-chunk size\n header.writeUInt16LE(1, 20); // PCM format\n header.writeUInt16LE(WAV_CHANNELS, 22);\n header.writeUInt32LE(WAV_SAMPLE_RATE, 24);\n header.writeUInt32LE(byteRate, 28);\n header.writeUInt16LE(blockAlign, 32);\n header.writeUInt16LE(WAV_BITS_PER_SAMPLE, 34);\n\n // data sub-chunk\n header.write('data', 36);\n header.writeUInt32LE(dataSize, 40);\n\n return header;\n}\n\nexport interface RecorderOptions {\n /** Output directory for recordings. */\n outputDir: string;\n /** Sample rate of audio data. Default: 8000 */\n sampleRate?: number;\n}\n\nexport class AudioRecorder {\n private readonly _outputDir: string;\n private readonly _sampleRate: number;\n private _inboundChunks: Buffer[] = [];\n private _outboundChunks: Buffer[] = [];\n private _callId: string | null = null;\n private _started = false;\n\n constructor(options: RecorderOptions) {\n this._outputDir = options.outputDir;\n this._sampleRate = options.sampleRate ?? WAV_SAMPLE_RATE;\n }\n\n /** Start recording for a call. */\n start(callId: string): void {\n this._callId = callId;\n this._inboundChunks = [];\n this._outboundChunks = [];\n this._started = true;\n\n // Ensure output directory exists\n if (!fs.existsSync(this._outputDir)) {\n fs.mkdirSync(this._outputDir, { recursive: true });\n }\n }\n\n /** Write inbound (caller) PCM16 audio. */\n writeInbound(pcm: Buffer): void {\n if (this._started) {\n this._inboundChunks.push(Buffer.from(pcm));\n }\n }\n\n /** Write raw outbound (agent) PCM16 audio. */\n writeRawOutbound(pcm: Buffer): void {\n if (this._started) {\n this._outboundChunks.push(Buffer.from(pcm));\n }\n }\n\n /** Stop recording and write WAV files to disk. Returns file paths. */\n stop(): { inbound?: string; outbound?: string } {\n if (!this._started || !this._callId) {\n return {};\n }\n\n this._started = false;\n const result: { inbound?: string; outbound?: string } = {};\n\n if (this._inboundChunks.length > 0) {\n const inboundPath = path.join(this._outputDir, `${this._callId}_inbound.wav`);\n this._writeWav(inboundPath, this._inboundChunks);\n result.inbound = inboundPath;\n }\n\n if (this._outboundChunks.length > 0) {\n const outboundPath = path.join(this._outputDir, `${this._callId}_outbound.wav`);\n this._writeWav(outboundPath, this._outboundChunks);\n result.outbound = outboundPath;\n }\n\n this._inboundChunks = [];\n this._outboundChunks = [];\n\n return result;\n }\n\n private _writeWav(filePath: string, chunks: Buffer[]): void {\n const pcmData = Buffer.concat(chunks);\n const header = makeWavHeader(pcmData.length);\n const fd = fs.openSync(filePath, 'w');\n fs.writeSync(fd, header);\n fs.writeSync(fd, pcmData);\n fs.closeSync(fd);\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';\nexport type SessionEventType = 'ended' | 'dtmf' | 'speech';\n\nexport interface SessionEvent {\n type: SessionEventType;\n data?: unknown;\n}\n\ntype SessionEventHandler = (event: SessionEvent) => 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<SessionEventType, 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: SessionEventType, 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._emit({ type: 'ended' });\n this._resolveEnded();\n }\n\n /** Emit an event to registered handlers. */\n _emit(event: SessionEvent): void {\n const handlers = this._handlers.get(event.type);\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(`[CallSession] Error in ${event.type} handler:`, err);\n });\n }\n } catch (err) {\n console.error(`[CallSession] Error in ${event.type} 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 { pcm16ToUlaw, resamplePcm16, 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 } from './mcp/stdio.js';\nimport type { MCPServerHTTP } from './mcp/http.js';\nimport { MediaWebSocket } from './media-ws.js';\nimport { AudioRecorder } from './recorder.js';\nimport { CallSession } from './session.js';\nimport type { CallDirection } 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.incoming'\n | 'call.ended'\n | 'call.outbound_ready'\n | 'call.ringing'\n | 'call.failed';\n\ntype AgentEventHandler = (session: CallSession) => void | Promise<void>;\n\nexport interface ClawOpsAgentOptions {\n /** ClawOps API key. Falls back to CLAWOPS_API_KEY env var. */\n apiKey?: string;\n /** Agent ID. Falls back to CLAWOPS_AGENT_ID env var. */\n agentId?: string;\n /** API base URL. */\n baseUrl?: string;\n /** Session factory: returns the session handler for each call. */\n session?: Session | (() => Session);\n /** Recording output directory. If set, calls are recorded. */\n recordingDir?: string;\n /** MCP server configurations. */\n mcpServers?: Record<string, MCPServerStdio | MCPServerHTTP>;\n /** Tracing configuration. */\n tracing?: TracingConfig;\n}\n\nexport class ClawOpsAgent {\n private _apiKey: string;\n private _agentId: string;\n private _baseUrl: string;\n private _sessionFactory: (() => Session) | null = null;\n private _tools: ToolRegistry = new ToolRegistry();\n private _handlers: Map<AgentEventType, AgentEventHandler[]> = new Map();\n private _controlWs: ControlWebSocket | null = null;\n private _mcpClient: MCPClient | null = null;\n private _recordingDir: string | null;\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._agentId = options.agentId ?? process.env['CLAWOPS_AGENT_ID'] ?? '';\n this._baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;\n this._recordingDir = options.recordingDir ?? null;\n\n if (options.session) {\n if (typeof options.session === 'function') {\n this._sessionFactory = options.session as () => Session;\n } else {\n const sessionInstance = options.session;\n this._sessionFactory = () => sessionInstance;\n }\n }\n\n // Configure MCP\n if (options.mcpServers) {\n this._mcpClient = new MCPClient();\n for (const [name, config] of Object.entries(options.mcpServers)) {\n this._mcpClient.addServer(name, config);\n }\n }\n\n // Configure tracing\n if (options.tracing) {\n setTracingConfig(options.tracing);\n }\n }\n\n /** Register a function tool. */\n tool(tool: FunctionTool): this {\n this._tools.register(tool);\n return this;\n }\n\n /** Register an event handler. */\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._agentId) {\n throw new AgentError('Agent ID is required. Set CLAWOPS_AGENT_ID or pass agentId option.');\n }\n\n // Connect MCP and register tools\n if (this._mcpClient) {\n try {\n const mcpTools = await this._mcpClient.connect();\n this._tools.registerMcpTools(mcpTools);\n } catch (err) {\n console.error('[ClawOpsAgent] MCP connection error:', err);\n }\n }\n\n // Connect control WebSocket\n this._controlWs = new ControlWebSocket({\n baseUrl: this._baseUrl,\n apiKey: this._apiKey,\n agentId: this._agentId,\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\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 // Close control WebSocket\n if (this._controlWs) {\n this._controlWs.close();\n this._controlWs = null;\n }\n\n // End active sessions\n for (const session of this._activeSessions.values()) {\n session._markEnded();\n }\n this._activeSessions.clear();\n\n // Disconnect MCP\n if (this._mcpClient) {\n await this._mcpClient.disconnect();\n this._tools.clearMcpTools();\n }\n }\n\n /**\n * Initiate an outbound call.\n */\n call(options: {\n to: string;\n from: string;\n metadata?: Record<string, unknown>;\n }): void {\n if (!this._controlWs) {\n throw new AgentError('Agent is not connected. Call connect() first.');\n }\n\n this._controlWs.send({\n action: 'call.create',\n data: {\n to_number: options.to,\n from_number: options.from,\n metadata: options.metadata,\n },\n });\n }\n\n private _handleIncoming(event: ControlEvent): void {\n const data = event.data;\n const session = new CallSession({\n callId: data.call_id,\n fromNumber: data.from_number ?? '',\n toNumber: data.to_number ?? '',\n accountId: data.account_id ?? '',\n direction: (data.direction as CallDirection) ?? 'inbound',\n metadata: data.metadata,\n });\n\n this._activeSessions.set(data.call_id, session);\n this._emitEvent('call.incoming', session);\n\n // Start the call session handler\n if (data.media_ws_url) {\n this._startCallSession(session, data.media_ws_url).catch((err) => {\n console.error(`[ClawOpsAgent] Error in call session ${data.call_id}:`, err);\n });\n }\n }\n\n private _handleEnded(event: ControlEvent): void {\n const session = this._activeSessions.get(event.data.call_id);\n if (session) {\n session._markEnded();\n this._activeSessions.delete(event.data.call_id);\n this._emitEvent('call.ended', session);\n }\n }\n\n private _handleOutboundReady(event: ControlEvent): void {\n const data = event.data;\n const session = new CallSession({\n callId: data.call_id,\n fromNumber: data.from_number ?? '',\n toNumber: data.to_number ?? '',\n accountId: data.account_id ?? '',\n direction: 'outbound',\n metadata: data.metadata,\n });\n\n this._activeSessions.set(data.call_id, session);\n this._emitEvent('call.outbound_ready', session);\n\n if (data.media_ws_url) {\n this._startCallSession(session, data.media_ws_url).catch((err) => {\n console.error(`[ClawOpsAgent] Error in call session ${data.call_id}:`, err);\n });\n }\n }\n\n private _handleRinging(event: ControlEvent): void {\n const session = this._activeSessions.get(event.data.call_id);\n if (session) {\n this._emitEvent('call.ringing', session);\n }\n }\n\n private _handleFailed(event: ControlEvent): void {\n const session = this._activeSessions.get(event.data.call_id);\n if (session) {\n session._markEnded();\n this._activeSessions.delete(event.data.call_id);\n this._emitEvent('call.failed', session);\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._agentId,\n },\n async () => {\n // Fork tools for this session\n const sessionTools = this._tools.fork();\n\n // Set up recorder if configured\n let recorder: AudioRecorder | null = null;\n if (this._recordingDir) {\n recorder = new AudioRecorder({ outputDir: this._recordingDir });\n recorder.start(session.callId);\n }\n\n // Connect media WebSocket\n const mediaWs = new MediaWebSocket();\n\n // Bind transport functions to session\n session._bindTransport(\n (audio: Buffer) => {\n // Convert PCM16 to ulaw for telephony\n const ulaw = pcm16ToUlaw(audio);\n mediaWs.sendAudio(ulaw.toString('base64'));\n if (recorder) {\n recorder.writeRawOutbound(audio);\n }\n },\n () => {\n mediaWs.sendClear();\n },\n () => {\n mediaWs.close();\n },\n );\n\n // Get or create session handler\n const sessionHandler = this._sessionFactory ? this._sessionFactory() : null;\n\n // Handle inbound audio\n mediaWs.onAudio((ulawAudio: Buffer) => {\n // Convert ulaw to PCM16\n const pcm = ulawToPcm16(ulawAudio);\n if (recorder) {\n recorder.writeInbound(pcm);\n }\n if (sessionHandler) {\n // Resample from 8kHz to 16kHz for most STT/realtime APIs\n const resampled = resamplePcm16(pcm, 8000, 16000);\n sessionHandler.feedAudio(resampled);\n }\n });\n\n mediaWs.onClose(() => {\n if (recorder) {\n recorder.stop();\n }\n session._markEnded();\n });\n\n try {\n await mediaWs.connect(mediaWsUrl);\n\n // Start the session handler\n if (sessionHandler) {\n await sessionHandler.start(session, sessionTools);\n }\n\n // Wait for the call to end\n await session.wait();\n\n // Stop the session handler\n if (sessionHandler) {\n await sessionHandler.stop();\n }\n } catch (err) {\n console.error(`[ClawOpsAgent] Call session error:`, err);\n } finally {\n mediaWs.close();\n if (recorder) {\n recorder.stop();\n }\n }\n },\n );\n }\n\n private _emitEvent(event: AgentEventType, session: CallSession): void {\n const handlers = this._handlers.get(event);\n if (handlers) {\n for (const handler of handlers) {\n try {\n const result = handler(session);\n if (result && typeof result.catch === 'function') {\n result.catch((err: unknown) => {\n console.error(`[ClawOpsAgent] Error in ${event} handler:`, err);\n });\n }\n } catch (err) {\n console.error(`[ClawOpsAgent] Error in ${event} handler:`, err);\n }\n }\n }\n }\n}\n","/**\n * OpenAI Realtime API session (speech-to-speech).\n */\n\nimport type { CallSession } from '../session.js';\nimport type { ToolRegistry } from '../tool.js';\nimport type { Session } from './base.js';\n\nexport interface OpenAIRealtimeOptions {\n /** OpenAI API key. Falls back to OPENAI_API_KEY env var. */\n apiKey?: string;\n /** Model to use. Default: 'gpt-4o-realtime-preview' */\n model?: string;\n /** Voice ID. Default: 'alloy' */\n voice?: string;\n /** System prompt / instructions. */\n instructions?: string;\n /** Input audio format. Default: 'pcm16' */\n inputAudioFormat?: string;\n /** Output audio format. Default: 'pcm16' */\n outputAudioFormat?: string;\n /** Temperature for generation. */\n temperature?: number;\n /** Turn detection config. Set to null to disable. */\n turnDetection?: Record<string, unknown> | null;\n}\n\nexport class OpenAIRealtime implements Session {\n private _options: Required<\n Pick<OpenAIRealtimeOptions, 'model' | 'voice' | 'inputAudioFormat' | 'outputAudioFormat'>\n > &\n OpenAIRealtimeOptions;\n private _ws: import('ws').WebSocket | null = null;\n private _callSession: CallSession | null = null;\n private _tools: ToolRegistry | null = null;\n private _closed = false;\n\n constructor(options: OpenAIRealtimeOptions = {}) {\n this._options = {\n model: 'gpt-4o-realtime-preview',\n voice: 'alloy',\n inputAudioFormat: 'pcm16',\n outputAudioFormat: 'pcm16',\n ...options,\n };\n }\n\n async start(callSession: CallSession, tools?: ToolRegistry): Promise<void> {\n this._callSession = callSession;\n this._tools = tools ?? null;\n this._closed = false;\n\n const apiKey = this._options.apiKey ?? process.env['OPENAI_API_KEY'];\n if (!apiKey) {\n throw new Error('OpenAI API key is required');\n }\n\n const { WebSocket } = await import('ws');\n const url = `wss://api.openai.com/v1/realtime?model=${this._options.model}`;\n\n this._ws = new WebSocket(url, {\n headers: {\n Authorization: `Bearer ${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 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 this._ws.send(\n JSON.stringify({\n type: 'input_audio_buffer.append',\n audio: audio.toString('base64'),\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 _sendSessionUpdate(): void {\n if (!this._ws || this._ws.readyState !== 1) return;\n\n const sessionConfig: Record<string, unknown> = {\n modalities: ['text', 'audio'],\n voice: this._options.voice,\n input_audio_format: this._options.inputAudioFormat,\n output_audio_format: this._options.outputAudioFormat,\n };\n\n if (this._options.instructions) {\n sessionConfig['instructions'] = this._options.instructions;\n }\n if (this._options.temperature !== undefined) {\n sessionConfig['temperature'] = this._options.temperature;\n }\n if (this._options.turnDetection !== undefined) {\n sessionConfig['turn_detection'] = this._options.turnDetection;\n }\n if (this._tools && this._tools.size > 0) {\n sessionConfig['tools'] = this._tools.toOpenAITools().map((t) => t.function);\n }\n\n this._ws.send(\n JSON.stringify({\n type: 'session.update',\n session: sessionConfig,\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 const delta = msg['delta'] as string;\n if (delta && this._callSession) {\n const audio = Buffer.from(delta, 'base64');\n this._callSession.sendAudio(audio);\n }\n break;\n }\n case 'response.audio.done': {\n // Audio stream complete for this response\n break;\n }\n case 'response.function_call_arguments.done': {\n this._handleFunctionCall(msg);\n break;\n }\n case 'input_audio_buffer.speech_started': {\n // User started speaking - clear any outbound audio\n if (this._callSession) {\n this._callSession.clearAudio();\n }\n break;\n }\n case 'error': {\n console.error('[OpenAIRealtime] API error:', msg['error']);\n break;\n }\n }\n }\n\n private async _handleFunctionCall(msg: Record<string, unknown>): Promise<void> {\n const name = msg['name'] as string;\n const callId = msg['call_id'] as string;\n const argsStr = msg['arguments'] as string;\n\n if (!this._tools || !this._tools.has(name)) {\n console.error(`[OpenAIRealtime] Unknown tool: ${name}`);\n return;\n }\n\n try {\n const args = JSON.parse(argsStr) as Record<string, unknown>;\n const result = await this._tools.call(name, args);\n\n if (this._ws && this._ws.readyState === 1) {\n this._ws.send(\n JSON.stringify({\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\n // Trigger a new response after tool output\n this._ws.send(JSON.stringify({ type: 'response.create' }));\n }\n } catch (err) {\n console.error(`[OpenAIRealtime] Tool call error for ${name}:`, err);\n }\n }\n}\n","/**\n * Google Gemini Realtime API session (speech-to-speech).\n */\n\nimport type { CallSession } from '../session.js';\nimport type { ToolRegistry } from '../tool.js';\nimport type { Session } from './base.js';\n\nexport interface GeminiRealtimeOptions {\n /** Google API key. Falls back to GOOGLE_API_KEY env var. */\n apiKey?: string;\n /** Model to use. Default: 'gemini-2.0-flash-exp' */\n model?: string;\n /** Voice name. */\n voice?: string;\n /** System instruction. */\n systemInstruction?: string;\n /** Generation config overrides. */\n generationConfig?: Record<string, unknown>;\n}\n\nexport class GeminiRealtime implements Session {\n private _options: Required<Pick<GeminiRealtimeOptions, 'model'>> & GeminiRealtimeOptions;\n private _ws: import('ws').WebSocket | null = null;\n private _callSession: CallSession | null = null;\n private _tools: ToolRegistry | null = null;\n private _closed = false;\n\n constructor(options: GeminiRealtimeOptions = {}) {\n this._options = {\n model: 'gemini-2.0-flash-exp',\n ...options,\n };\n }\n\n async start(callSession: CallSession, tools?: ToolRegistry): Promise<void> {\n this._callSession = callSession;\n this._tools = tools ?? null;\n this._closed = false;\n\n const apiKey = this._options.apiKey ?? process.env['GOOGLE_API_KEY'];\n if (!apiKey) {\n throw new Error('Google API key is required');\n }\n\n const { WebSocket } = await import('ws');\n const model = this._options.model;\n const url = `wss://generativelanguage.googleapis.com/ws/google.ai.generativelanguage.v1beta.GenerativeService.BidiGenerateContent?key=${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 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('[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 this._ws.send(\n JSON.stringify({\n realtimeInput: {\n mediaChunks: [\n {\n mimeType: 'audio/pcm;rate=16000',\n data: audio.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._options.model}`,\n generationConfig: {\n responseModalities: ['AUDIO'],\n speechConfig: {\n voiceConfig: {\n prebuiltVoiceConfig: {\n voiceName: this._options.voice ?? 'Aoede',\n },\n },\n },\n ...this._options.generationConfig,\n },\n };\n\n if (this._options.systemInstruction) {\n setupConfig['systemInstruction'] = {\n parts: [{ text: this._options.systemInstruction }],\n };\n }\n\n if (this._tools && this._tools.size > 0) {\n const toolDefs = this._tools.toOpenAITools().map((t) => ({\n name: t.function.name,\n description: t.function.description,\n parameters: t.function.parameters,\n }));\n setupConfig['tools'] = [{ functionDeclarations: toolDefs }];\n }\n\n this._ws.send(JSON.stringify({ setup: setupConfig }));\n }\n\n private _handleMessage(msg: Record<string, unknown>): void {\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'] && this._callSession) {\n const audio = Buffer.from(inlineData['data'] as string, 'base64');\n this._callSession.sendAudio(audio);\n }\n }\n }\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\n private async _handleToolCall(toolCall: Record<string, unknown>): Promise<void> {\n const functionCalls = toolCall['functionCalls'] as Array<Record<string, unknown>> | undefined;\n if (!functionCalls || !this._tools) 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 args = (fc['args'] as Record<string, unknown>) ?? {};\n\n try {\n const result = await this._tools.call(name, args);\n responses.push({\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 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 type { CallSession } from '../session.js';\nimport type { ToolRegistry } from '../tool.js';\nimport type {\n ConversationMessage,\n LLM,\n LLMChunk,\n Session,\n SpeechEvent,\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 /** 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 _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 _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._temperature = options.temperature;\n this._maxTokens = options.maxTokens;\n this._sampleRate = options.sampleRate ?? 8000;\n this._interruptOnSpeech = options.interruptOnSpeech ?? true;\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 // 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 yield this._audioBuffer.shift()!;\n } else {\n // Wait a bit before checking again\n await new Promise((resolve) => setTimeout(resolve, 20));\n }\n }\n }\n\n private async _handleUserSpeech(transcript: string): Promise<void> {\n this._conversation.push({ role: 'user', content: transcript });\n\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 this._callSession.sendAudio(audioChunk);\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-2' */\n model?: string;\n /** Language code. Default: 'ko' */\n language?: string;\n /** Enable interim results. Default: true */\n interimResults?: boolean;\n /** Enable punctuation. Default: true */\n punctuate?: boolean;\n /** Enable smart formatting. Default: true */\n smartFormat?: boolean;\n /** Encoding. Default: 'linear16' */\n encoding?: string;\n /** Sample rate. Default: 8000 */\n sampleRate?: number;\n /** Number of channels. Default: 1 */\n channels?: number;\n}\n\nexport class DeepgramSTT implements STT {\n private _options: DeepgramSTTOptions;\n\n constructor(options: DeepgramSTTOptions = {}) {\n this._options = {\n model: 'nova-2',\n language: 'ko',\n interimResults: true,\n punctuate: true,\n smartFormat: true,\n encoding: 'linear16',\n sampleRate: 8000,\n channels: 1,\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 smart_format: String(this._options.smartFormat),\n encoding: this._options.encoding!,\n sample_rate: String(sampleRate),\n channels: String(this._options.channels),\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: '21m00Tcm4TlvDq8ikWAM' (Rachel) */\n voiceId?: string;\n /** Model ID. Default: 'eleven_multilingual_v2' */\n modelId?: string;\n /** Output format. Default: 'pcm_16000' */\n outputFormat?: string;\n /** Stability. Default: 0.5 */\n stability?: number;\n /** Similarity boost. Default: 0.75 */\n similarityBoost?: number;\n /** Style. Default: 0 */\n style?: number;\n /** Use speaker boost. Default: true */\n useSpeakerBoost?: boolean;\n}\n\nexport class ElevenLabsTTS implements TTS {\n private _options: ElevenLabsTTSOptions;\n\n constructor(options: ElevenLabsTTSOptions = {}) {\n this._options = {\n voiceId: '21m00Tcm4TlvDq8ikWAM',\n modelId: 'eleven_multilingual_v2',\n outputFormat: 'pcm_16000',\n stability: 0.5,\n similarityBoost: 0.75,\n style: 0,\n useSpeakerBoost: true,\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.modelId,\n voice_settings: {\n stability: this._options.stability,\n similarity_boost: this._options.similarityBoost,\n style: this._options.style,\n use_speaker_boost: this._options.useSpeakerBoost,\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.modelId}&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 style: this._options.style,\n use_speaker_boost: this._options.useSpeakerBoost,\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' */\n model?: string;\n /** Default temperature. */\n temperature?: number;\n /** Default max tokens. */\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',\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-20250514' */\n model?: string;\n /** Default temperature. */\n temperature?: number;\n /** Default max tokens. Default: 1024 */\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-20250514',\n maxTokens: 1024,\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.0-flash' */\n model?: string;\n /** Default temperature. */\n temperature?: number;\n /** Default max tokens. */\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.0-flash',\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. Default: 'http://localhost:11434' */\n baseUrl?: string;\n /** Model to use. Default: 'llama3.1' */\n model?: string;\n /** Default temperature. */\n temperature?: number;\n /** Default max tokens. */\n maxTokens?: number;\n}\n\nexport class OllamaLLM implements LLM {\n private _inner: OpenAICompatLLM;\n\n constructor(options: OllamaLLMOptions = {}) {\n const baseUrl = (options.baseUrl ?? 'http://localhost:11434').replace(/\\/$/, '');\n this._inner = new OpenAICompatLLM({\n baseUrl: `${baseUrl}/v1`,\n model: options.model ?? 'llama3.1',\n apiKey: 'ollama',\n temperature: options.temperature,\n maxTokens: options.maxTokens,\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"]}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/error.ts
|
|
4
|
+
var ClawOpsError = class extends Error {
|
|
5
|
+
constructor(message) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.name = "ClawOpsError";
|
|
8
|
+
}
|
|
9
|
+
};
|
|
10
|
+
var APIError = class extends ClawOpsError {
|
|
11
|
+
request;
|
|
12
|
+
constructor(message, request) {
|
|
13
|
+
super(message);
|
|
14
|
+
this.name = "APIError";
|
|
15
|
+
this.request = request;
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
var APIStatusError = class extends APIError {
|
|
19
|
+
status;
|
|
20
|
+
body;
|
|
21
|
+
headers;
|
|
22
|
+
constructor(message, response, body, request) {
|
|
23
|
+
super(message, request);
|
|
24
|
+
this.name = "APIStatusError";
|
|
25
|
+
this.status = response.status;
|
|
26
|
+
this.body = body;
|
|
27
|
+
this.headers = response.headers;
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
var BadRequestError = class extends APIStatusError {
|
|
31
|
+
status = 400;
|
|
32
|
+
constructor(message, response, body, request) {
|
|
33
|
+
super(message, response, body, request);
|
|
34
|
+
this.name = "BadRequestError";
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
var AuthenticationError = class extends APIStatusError {
|
|
38
|
+
status = 401;
|
|
39
|
+
constructor(message, response, body, request) {
|
|
40
|
+
super(message, response, body, request);
|
|
41
|
+
this.name = "AuthenticationError";
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
var PermissionDeniedError = class extends APIStatusError {
|
|
45
|
+
status = 403;
|
|
46
|
+
constructor(message, response, body, request) {
|
|
47
|
+
super(message, response, body, request);
|
|
48
|
+
this.name = "PermissionDeniedError";
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
var NotFoundError = class extends APIStatusError {
|
|
52
|
+
status = 404;
|
|
53
|
+
constructor(message, response, body, request) {
|
|
54
|
+
super(message, response, body, request);
|
|
55
|
+
this.name = "NotFoundError";
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
var ConflictError = class extends APIStatusError {
|
|
59
|
+
status = 409;
|
|
60
|
+
constructor(message, response, body, request) {
|
|
61
|
+
super(message, response, body, request);
|
|
62
|
+
this.name = "ConflictError";
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
var UnprocessableEntityError = class extends APIStatusError {
|
|
66
|
+
status = 422;
|
|
67
|
+
constructor(message, response, body, request) {
|
|
68
|
+
super(message, response, body, request);
|
|
69
|
+
this.name = "UnprocessableEntityError";
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
var InternalServerError = class extends APIStatusError {
|
|
73
|
+
status = 500;
|
|
74
|
+
constructor(message, response, body, request) {
|
|
75
|
+
super(message, response, body, request);
|
|
76
|
+
this.name = "InternalServerError";
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
var ServiceUnavailableError = class extends APIStatusError {
|
|
80
|
+
status = 503;
|
|
81
|
+
constructor(message, response, body, request) {
|
|
82
|
+
super(message, response, body, request);
|
|
83
|
+
this.name = "ServiceUnavailableError";
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
var APIConnectionError = class extends APIError {
|
|
87
|
+
constructor(request, message = "Connection error.") {
|
|
88
|
+
super(message, request);
|
|
89
|
+
this.name = "APIConnectionError";
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
var APITimeoutError = class extends APIConnectionError {
|
|
93
|
+
constructor(request) {
|
|
94
|
+
super(request, "Request timed out.");
|
|
95
|
+
this.name = "APITimeoutError";
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
var APIResponseValidationError = class extends APIError {
|
|
99
|
+
status;
|
|
100
|
+
constructor(response, request) {
|
|
101
|
+
super("API response validation failed.", request);
|
|
102
|
+
this.name = "APIResponseValidationError";
|
|
103
|
+
this.status = response.status;
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
var AgentError = class extends ClawOpsError {
|
|
107
|
+
constructor(message) {
|
|
108
|
+
super(message);
|
|
109
|
+
this.name = "AgentError";
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
var AgentConnectionError = class extends AgentError {
|
|
113
|
+
constructor(message = "Agent WebSocket connection failed.") {
|
|
114
|
+
super(message);
|
|
115
|
+
this.name = "AgentConnectionError";
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
var STATUS_CODE_TO_ERROR = {
|
|
119
|
+
400: BadRequestError,
|
|
120
|
+
401: AuthenticationError,
|
|
121
|
+
403: PermissionDeniedError,
|
|
122
|
+
404: NotFoundError,
|
|
123
|
+
409: ConflictError,
|
|
124
|
+
422: UnprocessableEntityError,
|
|
125
|
+
500: InternalServerError,
|
|
126
|
+
503: ServiceUnavailableError
|
|
127
|
+
};
|
|
128
|
+
function makeStatusError(status, body, headers, request) {
|
|
129
|
+
let message = "";
|
|
130
|
+
if (body && typeof body === "object" && "error" in body) {
|
|
131
|
+
message = body.error;
|
|
132
|
+
} else {
|
|
133
|
+
message = `HTTP ${status}`;
|
|
134
|
+
}
|
|
135
|
+
const ErrorClass = STATUS_CODE_TO_ERROR[status];
|
|
136
|
+
if (ErrorClass) {
|
|
137
|
+
return new ErrorClass(message, { status, headers }, body, request);
|
|
138
|
+
}
|
|
139
|
+
if (status >= 500) {
|
|
140
|
+
return new InternalServerError(message, { status, headers }, body, request);
|
|
141
|
+
}
|
|
142
|
+
return new APIStatusError(message, { status, headers }, body, request);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// src/constants.ts
|
|
146
|
+
var DEFAULT_BASE_URL = "https://api.claw-ops.com";
|
|
147
|
+
var DEFAULT_MAX_RETRIES = 2;
|
|
148
|
+
var DEFAULT_TIMEOUT = 6e5;
|
|
149
|
+
var INITIAL_RETRY_DELAY = 500;
|
|
150
|
+
var MAX_RETRY_DELAY = 8e3;
|
|
151
|
+
|
|
152
|
+
exports.APIConnectionError = APIConnectionError;
|
|
153
|
+
exports.APIError = APIError;
|
|
154
|
+
exports.APIResponseValidationError = APIResponseValidationError;
|
|
155
|
+
exports.APIStatusError = APIStatusError;
|
|
156
|
+
exports.APITimeoutError = APITimeoutError;
|
|
157
|
+
exports.AgentConnectionError = AgentConnectionError;
|
|
158
|
+
exports.AgentError = AgentError;
|
|
159
|
+
exports.AuthenticationError = AuthenticationError;
|
|
160
|
+
exports.BadRequestError = BadRequestError;
|
|
161
|
+
exports.ClawOpsError = ClawOpsError;
|
|
162
|
+
exports.ConflictError = ConflictError;
|
|
163
|
+
exports.DEFAULT_BASE_URL = DEFAULT_BASE_URL;
|
|
164
|
+
exports.DEFAULT_MAX_RETRIES = DEFAULT_MAX_RETRIES;
|
|
165
|
+
exports.DEFAULT_TIMEOUT = DEFAULT_TIMEOUT;
|
|
166
|
+
exports.INITIAL_RETRY_DELAY = INITIAL_RETRY_DELAY;
|
|
167
|
+
exports.InternalServerError = InternalServerError;
|
|
168
|
+
exports.MAX_RETRY_DELAY = MAX_RETRY_DELAY;
|
|
169
|
+
exports.NotFoundError = NotFoundError;
|
|
170
|
+
exports.PermissionDeniedError = PermissionDeniedError;
|
|
171
|
+
exports.ServiceUnavailableError = ServiceUnavailableError;
|
|
172
|
+
exports.UnprocessableEntityError = UnprocessableEntityError;
|
|
173
|
+
exports.makeStatusError = makeStatusError;
|
|
174
|
+
//# sourceMappingURL=chunk-JNSHMKDI.cjs.map
|
|
175
|
+
//# sourceMappingURL=chunk-JNSHMKDI.cjs.map
|