@teamlearners/clawops 0.38.0 → 0.39.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +36 -0
- package/dist/agent/index.cjs +77 -77
- package/dist/agent/index.js +4 -4
- package/dist/agent/livekit/index.cjs +9 -9
- package/dist/agent/livekit/index.js +2 -2
- package/dist/{chunk-VYGIWHRU.js → chunk-54GBFYZT.js} +2 -2
- package/dist/chunk-54GBFYZT.js.map +1 -0
- package/dist/chunk-FI2WH67N.cjs +8 -0
- package/dist/{chunk-NXCYAYFT.cjs.map → chunk-FI2WH67N.cjs.map} +1 -1
- package/dist/chunk-NDFDYCFM.js +6 -0
- package/dist/{chunk-J7UIB4EA.js.map → chunk-NDFDYCFM.js.map} +1 -1
- package/dist/{chunk-IYSPOOKH.cjs → chunk-OBGKLTIN.cjs} +2 -2
- package/dist/chunk-OBGKLTIN.cjs.map +1 -0
- package/dist/{chunk-ASQU6NA2.cjs → chunk-UOUNMCXE.cjs} +4 -4
- package/dist/{chunk-ASQU6NA2.cjs.map → chunk-UOUNMCXE.cjs.map} +1 -1
- package/dist/{chunk-EO25KTL4.js → chunk-W4XFMJFU.js} +3 -3
- package/dist/{chunk-EO25KTL4.js.map → chunk-W4XFMJFU.js.map} +1 -1
- package/dist/{client-ZOgpzAPe.d.cts → client-B_GblPxW.d.cts} +157 -10
- package/dist/{client-ZOgpzAPe.d.ts → client-B_GblPxW.d.ts} +157 -10
- package/dist/index.cjs +98 -40
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +70 -13
- package/dist/index.js.map +1 -1
- package/dist/solapi/index.cjs +7 -7
- package/dist/solapi/index.d.cts +2 -2
- package/dist/solapi/index.d.ts +2 -2
- package/dist/solapi/index.js +2 -2
- package/package.json +1 -1
- package/dist/chunk-IYSPOOKH.cjs.map +0 -1
- package/dist/chunk-J7UIB4EA.js +0 -6
- package/dist/chunk-NXCYAYFT.cjs +0 -8
- package/dist/chunk-VYGIWHRU.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/agent/audio.ts","../src/agent/logger.ts","../src/agent/telemetry.ts","../src/agent/session.ts","../src/agent/builtin-tool.ts","../src/agent/pipeline/builtin-tool-schemas.ts","../src/agent/pipeline/buffering-call.ts"],"names":["digit","BuiltinTool"],"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":"chunk-EO25KTL4.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 * Apply multiplicative gain to PCM16 little-endian audio.\n * gain=1.0 is pass-through, 0 is mute, 2.0 is 2x amplification (clipped to int16 range).\n */\nexport function applyPcm16Gain(pcm: Buffer, gain: number): Buffer {\n if (!pcm.length) return Buffer.alloc(0);\n if (gain === 1.0) return pcm;\n if (!Number.isFinite(gain) || gain < 0) {\n throw new Error('gain must be a finite number >= 0');\n }\n const nSamples = pcm.length >> 1;\n const out = Buffer.alloc(nSamples * 2);\n for (let i = 0; i < nSamples; i++) {\n let value = Math.round(pcm.readInt16LE(i * 2) * gain);\n if (value > 32767) value = 32767;\n else if (value < -32768) value = -32768;\n out.writeInt16LE(value, i * 2);\n }\n return out;\n}\n\n/**\n * Apply multiplicative gain to G.711 mu-law audio.\n */\nexport function applyUlawGain(ulaw: Buffer, gain: number): Buffer {\n if (!ulaw.length) return Buffer.alloc(0);\n if (gain === 1.0) return ulaw;\n return pcm16ToUlaw(applyPcm16Gain(ulawToPcm16(ulaw), gain));\n}\n\n/**\n * Resample PCM16 audio using linear interpolation.\n */\nexport function resamplePcm16(pcm: Buffer, fromRate: number, toRate: number): Buffer {\n if (fromRate === toRate || !pcm.length) return pcm;\n\n const nSamples = pcm.length >> 1;\n const ratio = fromRate / toRate;\n const outLen = Math.floor(nSamples / ratio);\n const out = Buffer.alloc(outLen * 2);\n\n for (let i = 0; i < outLen; i++) {\n const srcPos = i * ratio;\n const idx = Math.floor(srcPos);\n const frac = srcPos - idx;\n\n let val: number;\n if (idx + 1 < nSamples) {\n val = pcm.readInt16LE(idx * 2) * (1 - frac) + pcm.readInt16LE((idx + 1) * 2) * frac;\n } else {\n val = pcm.readInt16LE(idx * 2);\n }\n out.writeInt16LE(Math.round(val), i * 2);\n }\n\n return out;\n}\n\nexport { DECODE_TABLE };\n","/**\n * Logger factory for the ClawOps agent module.\n *\n * Provides a 2-level hierarchy matching the Python SDK:\n * - clawops.agent (core: agent, session, control-ws, media-ws, recorder, mcp, realtime)\n * - clawops.agent.pipeline (pipeline: pipeline-session, stt, tts)\n */\n\nimport pino from 'pino';\nimport type { Logger } from 'pino';\n\nconst DEFAULT_LOGGER = pino({ name: 'clawops.agent' });\n\n/** A silent logger that discards all output. */\nexport const NOOP_LOGGER = pino({ level: 'silent' });\n\n/**\n * Create or return an agent-level logger.\n * If no user logger is provided, returns the default pino instance.\n */\nexport function createAgentLogger(userLogger?: Logger): Logger {\n return userLogger ?? DEFAULT_LOGGER;\n}\n\n/**\n * Create a pipeline child logger from a parent agent logger.\n * Adds `{ module: 'pipeline' }` to all log entries.\n */\nexport function createPipelineLogger(parent: Logger): Logger {\n return parent.child({ module: 'pipeline' });\n}\n\nexport type { Logger };\n","/**\n * Call telemetry types and helpers for reporting SDK info,\n * session configuration, and call performance metrics.\n */\n\nimport os from 'os';\nimport { VERSION } from '../version.js';\n\nexport interface SdkInfo {\n name: string;\n version: string;\n runtime: string;\n os: string;\n}\n\nexport interface ProviderInfo {\n provider: string;\n model: string;\n}\n\nexport interface SessionTelemetry {\n sessionType: string;\n llm: ProviderInfo | null;\n stt: ProviderInfo | null;\n tts: ProviderInfo | null;\n voice: string | null;\n language: string;\n greetingEnabled: boolean;\n recordingEnabled: boolean;\n toolCount: number;\n mcpServerCount: number;\n builtinTools: string[];\n}\n\nexport interface CallMetrics {\n firstResponseMs: number | null;\n turnCount: number;\n toolCallCount: number;\n toolErrorCount: number;\n bargeInCount: number;\n endReason: string | null;\n errors: Array<{ type: string; message: string }>;\n}\n\nconst MAX_ERRORS = 20;\nconst MAX_ERROR_MESSAGE_LENGTH = 200;\n\nexport function getSdkInfo(): SdkInfo {\n return {\n name: 'clawops-node',\n version: VERSION,\n runtime: `node/${process.versions.node}`,\n os: `${process.platform}/${os.arch()}`,\n };\n}\n\nexport function createCallMetrics(): CallMetrics {\n return {\n firstResponseMs: null,\n turnCount: 0,\n toolCallCount: 0,\n toolErrorCount: 0,\n bargeInCount: 0,\n endReason: null,\n errors: [],\n };\n}\n\nexport function addMetricError(metrics: CallMetrics, err: Error): void {\n metrics.toolErrorCount++;\n if (metrics.errors.length < MAX_ERRORS) {\n metrics.errors.push({\n type: err.name || 'Error',\n message: (err.message || '').slice(0, MAX_ERROR_MESSAGE_LENGTH),\n });\n }\n}\n","/**\n * CallSession represents an active phone call and provides methods to\n * send audio, hang up, and listen for lifecycle events.\n */\n\nimport type { Logger } from 'pino';\nimport { NOOP_LOGGER } from './logger.js';\nimport { type CallMetrics, createCallMetrics, addMetricError } from './telemetry.js';\n\nexport type CallDirection = 'inbound' | 'outbound';\nexport type CallStatus = 'ringing' | 'active' | 'ended';\n\n/**\n * Session event handler: receives (call, ...args) like the Python SDK.\n * For example, 'transcript' events pass (call, role, text).\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype SessionEventHandler = (...args: any[]) => void | Promise<void>;\n\nexport interface SendAudioFn {\n (audio: Buffer): void;\n}\n\nexport interface ClearAudioFn {\n (): void;\n}\n\nexport interface HangupFn {\n (): void | Promise<void>;\n}\n\nexport interface SendDtmfFn {\n (digit: string): Promise<void>;\n}\n\nexport interface TransferFn {\n (params: Record<string, unknown>): Promise<Record<string, unknown>>;\n}\n\n/**\n * `collectDtmf` 가 이미 돌고 있는데 또 불렸다.\n *\n * 실시간 모델은 도구를 **중복으로 호출한다** — 앞 호출이 아직 자리를 기다리는 동안 같은\n * 도구를 한 번 더 낸다(2026-09-03 실통화에서 관측). 이걸 맨 `Error` 로 던지면 도구 래퍼가\n * `\"Error: ...\"` 로 감싸 모델에게 돌려주고, 모델은 뭔가 고장난 줄 알고 **그 뒤로 도구를\n * 다시 부르지 않는다.** 그러면 발신자가 누르는 키는 아무도 받지 않는다.\n *\n * `Error` 를 상속하므로 기존에 이걸 잡던 코드는 그대로 돈다. 도구 경로만 이 타입을 따로\n * 잡아 \"고장\"이 아니라 \"기다리라\"는 뜻으로 옮긴다.\n */\nexport class DtmfCollectorBusyError extends Error {\n constructor(message = '이미 DTMF 수집 중입니다') {\n super(message);\n this.name = 'DtmfCollectorBusyError';\n }\n}\n\nexport class CallSession {\n readonly callId: string;\n readonly fromNumber: string;\n readonly toNumber: string;\n readonly accountId: string;\n readonly direction: CallDirection;\n readonly startTime: Date;\n readonly metadata: Record<string, unknown>;\n\n private _status: CallStatus;\n private _endedStatus: string | null = null;\n private _endedDuration: number | null = null;\n private _sendAudioFn: SendAudioFn | null = null;\n private _clearAudioFn: ClearAudioFn | null = null;\n private _hangupFn: HangupFn | null = null;\n /** @internal */ _sendDtmfFn: SendDtmfFn | null = null;\n /** @internal */ _transferFn: TransferFn | null = null;\n /** @internal */ _isTransportConnected: (() => boolean) | null = null;\n /**\n * @internal Media WS playout 마커 훅. LiveKit(`ClawOpsAudioOutput`)이 재생 완료\n * 판정(mark echo)과 barge-in 절단 위치 계산에 쓴다. 다른 세션 타입은 읽지 않는다.\n * prewarm 중(BufferingCall)에는 바인딩되지 않아 null 이다.\n */\n /** @internal */ _sendMark: ((name: string) => void) | null = null;\n /** @internal */ _waitForMark: ((name: string, timeoutMs: number) => Promise<void>) | null = null;\n /** @internal */ _flushTransport: (() => Promise<void>) | null = null;\n private _dtmfCollectorActive = false;\n private _dtmfResolvers: ((digit: string) => void)[] = [];\n private _dtmfBuffer: string[] = [];\n private _log: Logger = NOOP_LOGGER;\n private _handlers: Map<string, SessionEventHandler[]> = new Map();\n private _endedPromise: Promise<void>;\n private _resolveEnded!: () => void;\n private _metrics: CallMetrics = createCallMetrics();\n private _firstResponseSent = false;\n\n constructor(options: {\n callId: string;\n fromNumber: string;\n toNumber: string;\n accountId: string;\n direction: CallDirection;\n metadata?: Record<string, unknown>;\n }) {\n this.callId = options.callId;\n this.fromNumber = options.fromNumber;\n this.toNumber = options.toNumber;\n this.accountId = options.accountId;\n this.direction = options.direction;\n this.metadata = options.metadata ?? {};\n this._status = 'ringing';\n this.startTime = new Date();\n\n this._endedPromise = new Promise<void>((resolve) => {\n this._resolveEnded = resolve;\n });\n }\n\n setLogger(logger: Logger): void {\n this._log = logger;\n }\n\n get status(): CallStatus {\n return this._status;\n }\n\n /**\n * 서버가 통보한 최종 종료 상태. 통화가 끝나기 전에는 null.\n *\n * `completed`(성사) / `no-answer`(벨은 울렸으나 무응답) / `busy`(통화중) /\n * `rejected`(수신 거절) / `canceled`(응답 전 발신 측 취소) / `failed`(시스템·망 오류).\n * `status` 는 SDK 내부 수명주기(ringing→active→ended)이므로 통화 성사 여부는\n * 이 값이나 `call_failed` 이벤트로 판단한다.\n */\n get endedStatus(): string | null {\n return this._endedStatus;\n }\n\n /**\n * 서버가 확정한 통화 시간(초). 통화가 끝나기 전에는 `null`.\n *\n * ⚠️ `duration` 과 다르다 — 그쪽은 SDK 가 로컬 시계로 재는 **경과 시간**이라 통화 중에도\n * 읽히고, 세션이 붙기 전후의 오차를 포함한다. 기록·정산에 쓸 값은 이쪽이다.\n */\n get endedDuration(): number | null {\n return this._endedDuration;\n }\n\n get duration(): number {\n return (Date.now() - this.startTime.getTime()) / 1000;\n }\n\n /** @internal 서버가 통보한 통화 시간을 확정한다. */\n _setEndedDuration(seconds: number): void {\n this._endedDuration = seconds;\n }\n\n get metrics(): Readonly<CallMetrics> { return this._metrics; }\n\n recordFirstResponse(): void {\n if (!this._firstResponseSent) {\n this._firstResponseSent = true;\n this._metrics.firstResponseMs = Date.now() - this.startTime.getTime();\n }\n }\n recordTurn(): void { this._metrics.turnCount++; }\n recordToolCall(): void { this._metrics.toolCallCount++; }\n recordToolError(err: Error): void { addMetricError(this._metrics, err); }\n recordBargeIn(): void { this._metrics.bargeInCount++; }\n recordEndReason(reason: string): void { this._metrics.endReason = reason; }\n\n /** Bind transport functions (called internally by the agent). */\n _bindTransport(\n send: SendAudioFn,\n clear: ClearAudioFn,\n hangup: HangupFn,\n sendDtmf?: SendDtmfFn,\n isConnected?: () => boolean,\n ): void {\n this._sendAudioFn = send;\n this._clearAudioFn = clear;\n this._hangupFn = hangup;\n if (sendDtmf) this._sendDtmfFn = sendDtmf;\n if (isConnected) this._isTransportConnected = isConnected;\n this._status = 'active';\n }\n\n /**\n * Send G.711 μ-law audio (8kHz, mono) to the caller.\n *\n * NOT PCM16. The transport applies μ-law gain and forwards the bytes as-is,\n * so PCM16 input is reinterpreted as μ-law and plays as noise. Convert first.\n */\n sendAudio(audio: Buffer): void {\n if (this._sendAudioFn) {\n this._sendAudioFn(audio);\n }\n }\n\n /** Clear any queued outbound audio. */\n clearAudio(): void {\n if (this._clearAudioFn) {\n this._clearAudioFn();\n }\n }\n\n /** Hang up the call, waiting for pending audio to finish. */\n async hangup(): Promise<void> {\n if (this._hangupFn) {\n await this._hangupFn();\n }\n }\n\n /** @internal Route a received DTMF digit to an active collector or buffer. */\n _routeDtmf(digit: string): void {\n if (this._dtmfCollectorActive && this._dtmfResolvers.length > 0) {\n const resolve = this._dtmfResolvers.shift()!;\n resolve(digit);\n } else {\n // Buffer the digit — collector may not be active yet (tool call timing)\n this._dtmfBuffer.push(digit);\n }\n }\n\n /**\n * Collect DTMF digits from the caller.\n *\n * `timeout` 은 **자리 사이** 대기다(inter-digit). `<Gather>` 를 비롯한 IVR 관행과 같은\n * 의미이고, 자리가 들어올 때마다 다시 시작한다.\n *\n * `maxWait` 는 그 관행이 만드는 최악을 막는 **전체 상한**이다(기본 30초). 자리마다\n * 리셋되는 타이머만 있으면 수집 하나가 최대 `maxDigits × timeout` 동안 산다 —\n * 11자리·5초면 **55초**이고, 그동안 모델은 이 도구에 붙들려 아무 말도 못 한다.\n * `null` 을 주면 상한 없이 종전대로 돈다.\n *\n * ⚠️ **수집값을 로그에 쓰지 않는다.** 키패드로 받는 값은 카드번호·주민번호일 수 있고,\n * 실제로 그런 구성이 있다. `secure` 와 무관하게 **자릿수만** 남긴다 — 이 옵션은 호환을\n * 위해 남아 있을 뿐 로깅을 좌우하지 않는다.\n */\n async collectDtmf(options: {\n maxDigits: number;\n finishOnKey?: string;\n timeout?: number;\n secure?: boolean;\n maxWait?: number | null;\n }): Promise<string> {\n if (this._dtmfCollectorActive) {\n throw new DtmfCollectorBusyError();\n }\n\n const { maxDigits, finishOnKey = '#', timeout = 5, maxWait = 30 } = options;\n this._dtmfCollectorActive = true;\n // Don't clear buffer — digits may have arrived before tool call was processed\n const collected: string[] = [];\n const deadline = maxWait === null ? null : Date.now() + maxWait * 1000;\n\n try {\n while (collected.length < maxDigits) {\n // Drain the buffer first\n if (this._dtmfBuffer.length > 0) {\n const digit = this._dtmfBuffer.shift()!;\n if (digit === finishOnKey) break;\n collected.push(digit);\n continue;\n }\n\n let waitMs = timeout * 1000;\n if (deadline !== null) {\n // 남은 예산이 자리 간 대기보다 짧으면 그만큼만 기다린다. 0 이하면 전체 상한에\n // 닿은 것이라 지금까지 모인 값으로 확정한다.\n waitMs = Math.min(waitMs, deadline - Date.now());\n if (waitMs <= 0) break;\n }\n\n // ⚠️ 진 쪽 타이머를 **반드시 지운다.** Promise.race 는 진 promise 를 취소하지\n // 않으므로, clear 하지 않으면 자리마다 타이머가 하나씩 살아남아 최대 timeout\n // 초 동안 이벤트 루프를 붙잡는다(통화가 끝나도 프로세스가 안 죽는다).\n let timer: ReturnType<typeof setTimeout> | undefined;\n const digit = await Promise.race([\n new Promise<string>((resolve) => {\n this._dtmfResolvers.push(resolve);\n }),\n new Promise<null>((resolve) => {\n timer = setTimeout(() => resolve(null), waitMs);\n }),\n ]).finally(() => {\n if (timer !== undefined) clearTimeout(timer);\n });\n\n if (digit === null) break; // timeout\n if (digit === finishOnKey) break;\n collected.push(digit);\n }\n } finally {\n this._dtmfCollectorActive = false;\n this._dtmfResolvers = [];\n this._dtmfBuffer = [];\n }\n\n const result = collected.join('');\n this._log.info('DTMF collected: %d digits', result.length);\n return result;\n }\n\n /** Send a sequence of DTMF digits. */\n async sendDtmfSequence(digits: string): Promise<void> {\n if (!this._sendDtmfFn) {\n throw new Error('DTMF 전송 함수가 바인딩되지 않았습니다');\n }\n for (const ch of digits) {\n if (this._isTransportConnected && !this._isTransportConnected()) {\n throw new Error('DTMF 전송 중 연결이 끊어졌습니다');\n }\n if (ch === 'w') {\n await new Promise((r) => setTimeout(r, 500));\n } else if (ch === 'W') {\n await new Promise((r) => setTimeout(r, 1000));\n } else if ('0123456789*#'.includes(ch)) {\n if (this._sendDtmfFn) {\n await this._sendDtmfFn(ch);\n }\n } else {\n throw new Error(`유효하지 않은 DTMF 문자: ${ch}`);\n }\n }\n }\n\n /**\n * Transfer the call to a phone number or SIP endpoint.\n *\n * destinationType='pstn' (default): `to` is a phone number dialed via carrier.\n * destinationType='sip': `to` is a SIP URI (e.g. `sip:user@host`) connected\n * directly to a SIP endpoint without going through the PSTN carrier. Requires the\n * account to have an active `sip_trunk` add-on; otherwise the transfer fails and\n * the call continues with the AI (result `{ status: 'failed', ... }`).\n *\n * 전환받는 쪽에 표시되는 발신번호는 기본이 **계정 보유번호**(인바운드면 착신 070)다.\n *\n * `callerIdMode: 'original'` 은 인바운드 통화의 **원 발신자 번호를 승계하려는 선호**다.\n * 승계할 수 없는 통화(KCT 직결 인입이 아니거나 국내 번호로 정규화되지 않는 발신번호)면\n * 조용히 계정 보유번호로 내려앉고 **전환은 그대로 성사된다**.\n *\n * `callerId` 는 번호를 직접 주는 **지시**라 성격이 다르다. 허용 범위(계정 보유번호 또는\n * KCT 직결 인입의 원 발신자)를 벗어나면 전환 자체가 실패한다. 둘 다 주면 `callerId` 가\n * 이기고 `callerIdMode` 는 무시된다 — 우선순위 판단은 서버가 한다.\n */\n async transfer(\n to: string,\n options?: {\n destinationType?: 'pstn' | 'sip';\n mode?: 'blind' | 'warm';\n afterTransfer?: 'terminate' | 'return';\n holdMedia?: string;\n whisper?: string;\n context?: Record<string, unknown>;\n callerId?: string;\n callerIdMode?: 'account' | 'original';\n timeout?: number;\n },\n ): Promise<Record<string, unknown>> {\n if (!this._transferFn) {\n throw new Error('transfer not available');\n }\n // 서버는 'original' 만 특별 취급하고 나머지 값은 조용히 무시한다. 오타를 그대로\n // 흘려보내면 아무 에러 없이 계정 번호가 나가고, 개발자는 켰다고 믿는다 — 여기서 막는다.\n const callerIdMode = options?.callerIdMode;\n if (callerIdMode !== undefined && callerIdMode !== 'account' && callerIdMode !== 'original') {\n throw new Error(\n `callerIdMode must be 'account' or 'original', got ${JSON.stringify(callerIdMode)}`,\n );\n }\n return this._transferFn({\n to,\n destinationType: options?.destinationType ?? 'pstn',\n mode: options?.mode ?? 'blind',\n afterTransfer: options?.afterTransfer ?? 'terminate',\n holdMedia: options?.holdMedia ?? 'ringback',\n whisper: options?.whisper ?? null,\n context: options?.context ?? null,\n callerId: options?.callerId ?? null,\n timeout: options?.timeout ?? 30,\n // 안 주면 키를 붙이지 않는다 — 구 서버와 기존 동작을 그대로 둔다(additive).\n ...(callerIdMode !== undefined ? { callerIdMode } : {}),\n });\n }\n\n /** Register an event handler. */\n on(event: string, handler: SessionEventHandler): void {\n let list = this._handlers.get(event);\n if (!list) {\n list = [];\n this._handlers.set(event, list);\n }\n list.push(handler);\n }\n\n /** Wait for the call to end. */\n async wait(): Promise<void> {\n return this._endedPromise;\n }\n\n /**\n * Mark the session as ended (called internally).\n *\n * @param status 서버가 통보한 최종 상태(completed/no-answer/busy/rejected/canceled/\n * failed). 주어지면 `endedStatus` 로 확정한다 — 상대가 받지 않은 통화를 성사된 통화와\n * 구분하기 위함이다. 생략하면 미디어 세션 정리 경로에서의 호출이므로, 아직 종료 전일\n * 때만 'completed' 로 채우고 이미 확정된 서버 상태는 덮어쓰지 않는다.\n */\n _markEnded(status?: string): void {\n if (status !== undefined) {\n this._endedStatus = status;\n } else if (this._status !== 'ended') {\n this._endedStatus = 'completed';\n }\n this._status = 'ended';\n this._resolveEnded();\n }\n\n /** Emit an event to registered handlers. Matches Python SDK: _emit(event, ...args) */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n _emit(event: string, ...args: any[]): void {\n const handlers = this._handlers.get(event);\n if (handlers) {\n for (const handler of handlers) {\n try {\n const result = handler(this, ...args);\n if (result && typeof result.catch === 'function') {\n result.catch((err: unknown) => {\n this._log.error({ err }, 'CallSession handler error: %s', event);\n });\n }\n } catch (err) {\n this._log.error({ err }, 'CallSession handler error: %s', event);\n }\n }\n }\n }\n}\n","/**\n * Built-in tool definitions and selection constants.\n */\n\nexport enum BuiltinTool {\n /** 전화 종료 도구. AI가 대화 완료 시 통화를 종료합니다. */\n HANG_UP = 'hang_up',\n /** DTMF 수집 도구. 사용자의 키패드 입력을 수집합니다. */\n COLLECT_DTMF = 'collect_dtmf',\n /** DTMF 전송 도구. ARS 탐색이나 내선번호 입력에 사용합니다. */\n SEND_DTMF = 'send_dtmf',\n /** 통화 전환 도구. 현재 통화를 다른 번호로 전환합니다. */\n TRANSFER_CALL = 'transfer_call',\n\n /** 모든 내장 도구를 활성화합니다. (기본값) */\n ALL = 'all',\n /** 모든 내장 도구를 비활성화합니다. */\n NONE = 'none',\n}\n\nconst INDIVIDUAL_TOOLS = new Set([\n BuiltinTool.HANG_UP,\n BuiltinTool.COLLECT_DTMF,\n BuiltinTool.SEND_DTMF,\n BuiltinTool.TRANSFER_CALL,\n]);\n\nexport function resolveBuiltinTools(\n value: BuiltinTool | BuiltinTool[],\n): Set<BuiltinTool> {\n if (typeof value === 'string') {\n if (value === BuiltinTool.ALL) {\n return new Set(INDIVIDUAL_TOOLS);\n }\n if (value === BuiltinTool.NONE) {\n return new Set();\n }\n return new Set([value]);\n }\n return new Set(value.filter((t) => INDIVIDUAL_TOOLS.has(t)));\n}\n","/**\n * Built-in tool 스키마 정의, 포맷 변환, 실행 헬퍼.\n *\n * 모든 세션(PipelineSession, OpenAIRealtime, GeminiRealtime)이 공통으로 사용하는\n * 내장 도구 스키마를 한 곳에서 관리한다.\n */\n\nimport { BuiltinTool } from '../builtin-tool.js';\nimport { createAgentLogger } from '../logger.js';\nimport type { CallSession } from '../session.js';\nimport { DtmfCollectorBusyError } from '../session.js';\n\nconst log = createAgentLogger();\n\n// ── 정규 스키마 (neutral 포맷) ──────────────────────────────────────\n\nconst HANG_UP = {\n name: 'hang_up',\n description:\n 'End the phone call. Use when the conversation is finished or the caller says goodbye.',\n parameters: { type: 'object' as const, properties: {} as Record<string, unknown> },\n} as const;\n\nconst COLLECT_DTMF = {\n name: 'collect_dtmf',\n description:\n '사용자로부터 DTMF(전화 키패드) 입력을 수집합니다. 반드시 사용자에게 무엇을 입력해야 하는지 안내한 후 호출하세요.',\n parameters: {\n type: 'object' as const,\n properties: {\n max_digits: { type: 'integer' as const, description: '수집할 최대 자릿수' },\n finish_on_key: { type: 'string' as const, description: '입력 종료 키 (기본: #)' },\n timeout: { type: 'integer' as const, description: '입력 대기 시간(초, 기본: 5)' },\n },\n required: ['max_digits'] as string[],\n },\n} as const;\n\nconst SEND_DTMF = {\n name: 'send_dtmf',\n description: 'DTMF 신호를 전송합니다. ARS 메뉴 탐색이나 내선번호 입력 시 사용합니다.',\n parameters: {\n type: 'object' as const,\n properties: {\n digits: {\n type: 'string' as const,\n description:\n \"전송할 번호 (0-9, *, #). 'w'는 500ms 대기, 'W'는 1000ms 대기. 예: '1', '1234#', '1w2'\",\n },\n },\n required: ['digits'] as string[],\n },\n} as const;\n\nconst TRANSFER_CALL = {\n name: 'transfer_call',\n description:\n 'Transfer the current call to another phone number or SIP endpoint. Use for blind transfer (direct handoff) or warm transfer (with whisper message to the target).',\n parameters: {\n type: 'object' as const,\n properties: {\n to: { type: 'string' as const, description: \"Transfer destination. A phone number when destination_type is 'pstn', or a SIP URI (e.g. 'sip:user@host') when destination_type is 'sip'.\" },\n destination_type: { type: 'string' as const, enum: ['pstn', 'sip'], description: 'pstn: dial a phone number via carrier (default). sip: connect directly to a SIP endpoint (no carrier/PSTN).' },\n mode: { type: 'string' as const, enum: ['blind', 'warm'], description: 'blind: direct transfer (default), warm: play whisper to target first' },\n after_transfer: { type: 'string' as const, enum: ['terminate', 'return'], description: 'terminate: end AI session (default), return: AI resumes after transfer ends' },\n whisper: { type: 'string' as const, description: 'Message to speak to transfer target before connecting customer (warm mode only)' },\n caller_id_mode: { type: 'string' as const, enum: ['account', 'original'], description: \"What the transfer target sees as the caller. account: the account's own number (default). original: prefer the inbound caller's number, falling back to the account number when it cannot be inherited. Prefer this over caller_id.\" },\n caller_id: { type: 'string' as const, description: 'Exact caller ID for the transfer leg. Must be a number the account owns, or the original inbound caller. Anything else fails the transfer outright — use caller_id_mode unless a specific number is required.' },\n timeout: { type: 'integer' as const, description: 'Seconds to wait for transfer target to answer (default 30)' },\n },\n required: ['to'] as string[],\n },\n} as const;\n\ntype NeutralSchema = typeof HANG_UP | typeof COLLECT_DTMF | typeof SEND_DTMF | typeof TRANSFER_CALL;\n\nconst TOOL_MAP = new Map<BuiltinTool, NeutralSchema>([\n [BuiltinTool.HANG_UP, HANG_UP],\n [BuiltinTool.COLLECT_DTMF, COLLECT_DTMF],\n [BuiltinTool.SEND_DTMF, SEND_DTMF],\n [BuiltinTool.TRANSFER_CALL, TRANSFER_CALL],\n]);\n\nexport const BUILTIN_TOOL_NAMES: Set<string> = new Set(\n Array.from(TOOL_MAP.values()).map((s) => s.name),\n);\n\n/** prewarm 창에서 통화 제어 도구가 호출됐을 때 모델에 돌려주는 결과. */\nexport const CALL_NOT_READY_RESULT =\n '통화가 아직 연결되지 않았습니다(발신 호출음 단계). 상대가 전화를 받은 뒤에 다시 시도하세요.';\n\n// ── 포맷 변환 ───────────────────────────────────────────────────────\n\nfunction toChatCompletions(schema: NeutralSchema): Record<string, unknown> {\n return {\n type: 'function',\n function: {\n name: schema.name,\n description: schema.description,\n parameters: schema.parameters,\n },\n };\n}\n\nfunction toRealtime(schema: NeutralSchema): Record<string, unknown> {\n return {\n type: 'function',\n name: schema.name,\n description: schema.description,\n parameters: schema.parameters,\n };\n}\n\nfunction toGemini(schema: NeutralSchema): Record<string, unknown> {\n return {\n name: schema.name,\n description: schema.description,\n parameters: schema.parameters,\n };\n}\n\nconst CONVERTERS = {\n chat: toChatCompletions,\n realtime: toRealtime,\n gemini: toGemini,\n} as const;\n\n/**\n * 활성화된 builtin tool 스키마를 요청한 포맷으로 반환.\n */\nexport function getBuiltinToolSchemas(\n builtinTools: Set<BuiltinTool> | null,\n fmt: 'chat' | 'realtime' | 'gemini',\n): Array<Record<string, unknown>> {\n const converter = CONVERTERS[fmt];\n const result: Array<Record<string, unknown>> = [];\n for (const [toolEnum, schema] of TOOL_MAP) {\n if (builtinTools === null || builtinTools.has(toolEnum)) {\n result.push(converter(schema));\n }\n }\n return result;\n}\n\n// ── 공통 실행 헬퍼 ──────────────────────────────────────────────────\n\n/**\n * Builtin tool을 실행하고 결과 문자열을 반환한다.\n *\n * `funcName`이 builtin tool이 아니면 `null`을 반환한다.\n * `hang_up`의 경우 빈 문자열 `\"\"`을 반환한다 (호출자가 종료 처리).\n */\nexport function isBuiltinTool(name: string): boolean {\n return BUILTIN_TOOL_NAMES.has(name);\n}\n\nexport async function executeBuiltinTool(\n funcName: string,\n args: Record<string, unknown>,\n call: CallSession,\n): Promise<string | null> {\n if (funcName === 'hang_up') {\n await call.hangup();\n return '';\n }\n if (funcName === 'collect_dtmf') {\n try {\n const result = await call.collectDtmf({\n maxDigits: (args['max_digits'] as number) ?? 4,\n finishOnKey: (args['finish_on_key'] as string) ?? '#',\n timeout: (args['timeout'] as number) ?? 5,\n });\n return result || '(타임아웃 - 입력 없음)';\n } catch (e) {\n // 중복 호출은 고장이 아니다 — \"Error\" 로 돌려주면 모델이 도구가 망가진 줄 알고 다시\n // 부르지 않고, 그때부터 발신자가 누르는 키는 아무도 받지 않는다.\n if (e instanceof DtmfCollectorBusyError) {\n return '(이미 입력을 받는 중입니다. 결과를 기다리세요.)';\n }\n return `Error: ${e}`;\n }\n }\n if (funcName === 'send_dtmf') {\n try {\n await call.sendDtmfSequence((args['digits'] as string) ?? '');\n return 'sent';\n } catch (e) {\n return `Error: ${e}`;\n }\n }\n if (funcName === 'transfer_call') {\n try {\n // Fire-and-forget: transfer 요청만 보내고 즉시 반환.\n // call-engine이 transfer 시작 시 media WS를 닫으므로,\n // 결과를 await하면 LLM 세션이 먼저 종료된다.\n call.transfer(args['to'] as string, {\n destinationType: (args['destination_type'] as 'pstn' | 'sip') ?? undefined,\n mode: (args['mode'] as 'blind' | 'warm') ?? undefined,\n afterTransfer: (args['after_transfer'] as 'terminate' | 'return') ?? undefined,\n whisper: args['whisper'] as string ?? undefined,\n callerId: args['caller_id'] as string ?? undefined,\n callerIdMode: (args['caller_id_mode'] as 'account' | 'original') ?? undefined,\n timeout: args['timeout'] as number ?? undefined,\n // 결과를 안 기다리므로 실패가 통째로 조용하다 — 모델은 \"시작됨\" 을 받고, 예외는\n // 프로미스 안에 갇힌다. 최소한 로그에는 남긴다.\n }).catch((e: unknown) => {\n log.error({ err: e }, 'transfer_call 도구가 건 전환이 실패했다');\n });\n return JSON.stringify({ status: 'transfer_initiated' });\n } catch (e) {\n return `Error: ${e}`;\n }\n }\n return null;\n}\n","/**\n * prewarm 단계에서 사용되는 CallSession stub.\n *\n * Session 구현체가 sendAudio() 를 호출하면 메모리 버퍼에 누적한다.\n * attach() 시점에 drainBuffer() 로 꺼내 실제 CallSession 에 flush.\n *\n * Python SDK 의 `_BufferingCall` mirror.\n */\n\nimport type { CallSession } from '../session.js';\n\nclass MetricsStub {\n recordToolCall(): void {}\n recordInterrupt(): void {}\n recordToolError(): void {}\n}\n\nexport class BufferingCall {\n private _buffer: Buffer[] = [];\n private _droppedEvents: Record<string, number> = {};\n readonly metrics = new MetricsStub();\n\n async sendAudio(chunk: Buffer): Promise<void> {\n this._buffer.push(chunk);\n }\n\n /** clearAudio 도 prewarm 동안엔 no-op (드물긴 하지만 안전하게). */\n clearAudio(): void {\n this._buffer = [];\n }\n\n /**\n * transcript 등 lifecycle 이벤트는 prewarm 동안 무시한다. silent drop 은 디버깅이\n * 어려우므로 event name 별 카운터로 누적하고 attachBuffered() 시 한 번에 로깅한다.\n */\n _emit(...args: unknown[]): void {\n this._recordDropped(args);\n }\n\n async emit(...args: unknown[]): Promise<void> {\n this._recordDropped(args);\n }\n\n private _recordDropped(args: unknown[]): void {\n let eventName = '?';\n if (args.length > 0 && typeof args[0] === 'string') {\n eventName = args[0];\n }\n this._droppedEvents[eventName] = (this._droppedEvents[eventName] ?? 0) + 1;\n }\n\n recordToolCall(): void {}\n recordToolError(): void {}\n recordFirstResponse(): void {}\n recordBargeIn(): void {}\n\n drainBuffer(): Buffer[] {\n const out = this._buffer;\n this._buffer = [];\n return out;\n }\n\n drainDroppedEvents(): Record<string, number> {\n const out = this._droppedEvents;\n this._droppedEvents = {};\n return out;\n }\n}\n\n/**\n * prewarm → attach 전환 시 BufferingCall 에 쌓인 audio chunk 를 실제\n * CallSession 으로 flush 하는 공통 헬퍼. OpenAI / Gemini / PipelineSession\n * attach() 가 동일 패턴이므로 한 곳에서 관리한다.\n *\n * 반환값: 한 개 이상의 chunk 를 drain 했으면 true. drain 시 PREWARM-T first-audio\n * 마커를 한 번 emit 한다. drained 가 비어 있으면 false 를 반환하여 호출자(Session)\n * 가 첫 실시간 audio.delta 송출 시 logFirstRealtimeAudio() 로 한 번만 마커를 찍을\n * 수 있게 한다.\n */\nexport function attachBuffered(\n prev: BufferingCall | CallSession | null,\n next: CallSession,\n): boolean {\n if (!(prev instanceof BufferingCall)) {\n return false;\n }\n\n const drained = prev.drainBuffer();\n const flushed = drained.length > 0;\n const callId = (next as { callId?: string }).callId ?? '?';\n\n if (flushed) {\n // eslint-disable-next-line no-console\n console.info(\n `[PREWARM-T] first-audio call_id=${callId} ` +\n `t=${(process.hrtime.bigint() / 1_000_000n).toString()} ` +\n `buffered_chunks=${drained.length} source=prebuffer`,\n );\n }\n for (const chunk of drained) {\n next.sendAudio(chunk);\n }\n\n const dropped = prev.drainDroppedEvents();\n if (Object.keys(dropped).length > 0) {\n // eslint-disable-next-line no-console\n console.info(\n `[PREWARM] dropped events during prewarm call_id=${callId} events=${JSON.stringify(dropped)}`,\n );\n }\n return flushed;\n}\n\n/**\n * prewarm prebuffer 가 비어 있던 케이스에서 첫 실시간 audio chunk 송출 시 호출.\n * 호출자(Session)는 attachBuffered() 반환값과 자체 플래그로 한 번만 호출하도록\n * 가드해야 한다.\n */\nexport function logFirstRealtimeAudio(call: { callId?: string } | null): void {\n const callId = call?.callId ?? '?';\n // eslint-disable-next-line no-console\n console.info(\n `[PREWARM-T] first-audio call_id=${callId} ` +\n `t=${(process.hrtime.bigint() / 1_000_000n).toString()} ` +\n `buffered_chunks=0 source=realtime`,\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/agent/audio.ts","../src/agent/logger.ts","../src/agent/telemetry.ts","../src/agent/session.ts","../src/agent/builtin-tool.ts","../src/agent/pipeline/builtin-tool-schemas.ts","../src/agent/pipeline/buffering-call.ts"],"names":["digit","BuiltinTool"],"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":"chunk-W4XFMJFU.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 * Apply multiplicative gain to PCM16 little-endian audio.\n * gain=1.0 is pass-through, 0 is mute, 2.0 is 2x amplification (clipped to int16 range).\n */\nexport function applyPcm16Gain(pcm: Buffer, gain: number): Buffer {\n if (!pcm.length) return Buffer.alloc(0);\n if (gain === 1.0) return pcm;\n if (!Number.isFinite(gain) || gain < 0) {\n throw new Error('gain must be a finite number >= 0');\n }\n const nSamples = pcm.length >> 1;\n const out = Buffer.alloc(nSamples * 2);\n for (let i = 0; i < nSamples; i++) {\n let value = Math.round(pcm.readInt16LE(i * 2) * gain);\n if (value > 32767) value = 32767;\n else if (value < -32768) value = -32768;\n out.writeInt16LE(value, i * 2);\n }\n return out;\n}\n\n/**\n * Apply multiplicative gain to G.711 mu-law audio.\n */\nexport function applyUlawGain(ulaw: Buffer, gain: number): Buffer {\n if (!ulaw.length) return Buffer.alloc(0);\n if (gain === 1.0) return ulaw;\n return pcm16ToUlaw(applyPcm16Gain(ulawToPcm16(ulaw), gain));\n}\n\n/**\n * Resample PCM16 audio using linear interpolation.\n */\nexport function resamplePcm16(pcm: Buffer, fromRate: number, toRate: number): Buffer {\n if (fromRate === toRate || !pcm.length) return pcm;\n\n const nSamples = pcm.length >> 1;\n const ratio = fromRate / toRate;\n const outLen = Math.floor(nSamples / ratio);\n const out = Buffer.alloc(outLen * 2);\n\n for (let i = 0; i < outLen; i++) {\n const srcPos = i * ratio;\n const idx = Math.floor(srcPos);\n const frac = srcPos - idx;\n\n let val: number;\n if (idx + 1 < nSamples) {\n val = pcm.readInt16LE(idx * 2) * (1 - frac) + pcm.readInt16LE((idx + 1) * 2) * frac;\n } else {\n val = pcm.readInt16LE(idx * 2);\n }\n out.writeInt16LE(Math.round(val), i * 2);\n }\n\n return out;\n}\n\nexport { DECODE_TABLE };\n","/**\n * Logger factory for the ClawOps agent module.\n *\n * Provides a 2-level hierarchy matching the Python SDK:\n * - clawops.agent (core: agent, session, control-ws, media-ws, recorder, mcp, realtime)\n * - clawops.agent.pipeline (pipeline: pipeline-session, stt, tts)\n */\n\nimport pino from 'pino';\nimport type { Logger } from 'pino';\n\nconst DEFAULT_LOGGER = pino({ name: 'clawops.agent' });\n\n/** A silent logger that discards all output. */\nexport const NOOP_LOGGER = pino({ level: 'silent' });\n\n/**\n * Create or return an agent-level logger.\n * If no user logger is provided, returns the default pino instance.\n */\nexport function createAgentLogger(userLogger?: Logger): Logger {\n return userLogger ?? DEFAULT_LOGGER;\n}\n\n/**\n * Create a pipeline child logger from a parent agent logger.\n * Adds `{ module: 'pipeline' }` to all log entries.\n */\nexport function createPipelineLogger(parent: Logger): Logger {\n return parent.child({ module: 'pipeline' });\n}\n\nexport type { Logger };\n","/**\n * Call telemetry types and helpers for reporting SDK info,\n * session configuration, and call performance metrics.\n */\n\nimport os from 'os';\nimport { VERSION } from '../version.js';\n\nexport interface SdkInfo {\n name: string;\n version: string;\n runtime: string;\n os: string;\n}\n\nexport interface ProviderInfo {\n provider: string;\n model: string;\n}\n\nexport interface SessionTelemetry {\n sessionType: string;\n llm: ProviderInfo | null;\n stt: ProviderInfo | null;\n tts: ProviderInfo | null;\n voice: string | null;\n language: string;\n greetingEnabled: boolean;\n recordingEnabled: boolean;\n toolCount: number;\n mcpServerCount: number;\n builtinTools: string[];\n}\n\nexport interface CallMetrics {\n firstResponseMs: number | null;\n turnCount: number;\n toolCallCount: number;\n toolErrorCount: number;\n bargeInCount: number;\n endReason: string | null;\n errors: Array<{ type: string; message: string }>;\n}\n\nconst MAX_ERRORS = 20;\nconst MAX_ERROR_MESSAGE_LENGTH = 200;\n\nexport function getSdkInfo(): SdkInfo {\n return {\n name: 'clawops-node',\n version: VERSION,\n runtime: `node/${process.versions.node}`,\n os: `${process.platform}/${os.arch()}`,\n };\n}\n\nexport function createCallMetrics(): CallMetrics {\n return {\n firstResponseMs: null,\n turnCount: 0,\n toolCallCount: 0,\n toolErrorCount: 0,\n bargeInCount: 0,\n endReason: null,\n errors: [],\n };\n}\n\nexport function addMetricError(metrics: CallMetrics, err: Error): void {\n metrics.toolErrorCount++;\n if (metrics.errors.length < MAX_ERRORS) {\n metrics.errors.push({\n type: err.name || 'Error',\n message: (err.message || '').slice(0, MAX_ERROR_MESSAGE_LENGTH),\n });\n }\n}\n","/**\n * CallSession represents an active phone call and provides methods to\n * send audio, hang up, and listen for lifecycle events.\n */\n\nimport type { Logger } from 'pino';\nimport { NOOP_LOGGER } from './logger.js';\nimport { type CallMetrics, createCallMetrics, addMetricError } from './telemetry.js';\n\nexport type CallDirection = 'inbound' | 'outbound';\nexport type CallStatus = 'ringing' | 'active' | 'ended';\n\n/**\n * Session event handler: receives (call, ...args) like the Python SDK.\n * For example, 'transcript' events pass (call, role, text).\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype SessionEventHandler = (...args: any[]) => void | Promise<void>;\n\nexport interface SendAudioFn {\n (audio: Buffer): void;\n}\n\nexport interface ClearAudioFn {\n (): void;\n}\n\nexport interface HangupFn {\n (): void | Promise<void>;\n}\n\nexport interface SendDtmfFn {\n (digit: string): Promise<void>;\n}\n\nexport interface TransferFn {\n (params: Record<string, unknown>): Promise<Record<string, unknown>>;\n}\n\n/**\n * `collectDtmf` 가 이미 돌고 있는데 또 불렸다.\n *\n * 실시간 모델은 도구를 **중복으로 호출한다** — 앞 호출이 아직 자리를 기다리는 동안 같은\n * 도구를 한 번 더 낸다(2026-09-03 실통화에서 관측). 이걸 맨 `Error` 로 던지면 도구 래퍼가\n * `\"Error: ...\"` 로 감싸 모델에게 돌려주고, 모델은 뭔가 고장난 줄 알고 **그 뒤로 도구를\n * 다시 부르지 않는다.** 그러면 발신자가 누르는 키는 아무도 받지 않는다.\n *\n * `Error` 를 상속하므로 기존에 이걸 잡던 코드는 그대로 돈다. 도구 경로만 이 타입을 따로\n * 잡아 \"고장\"이 아니라 \"기다리라\"는 뜻으로 옮긴다.\n */\nexport class DtmfCollectorBusyError extends Error {\n constructor(message = '이미 DTMF 수집 중입니다') {\n super(message);\n this.name = 'DtmfCollectorBusyError';\n }\n}\n\nexport class CallSession {\n readonly callId: string;\n readonly fromNumber: string;\n readonly toNumber: string;\n readonly accountId: string;\n readonly direction: CallDirection;\n readonly startTime: Date;\n readonly metadata: Record<string, unknown>;\n\n private _status: CallStatus;\n private _endedStatus: string | null = null;\n private _endedDuration: number | null = null;\n private _sendAudioFn: SendAudioFn | null = null;\n private _clearAudioFn: ClearAudioFn | null = null;\n private _hangupFn: HangupFn | null = null;\n /** @internal */ _sendDtmfFn: SendDtmfFn | null = null;\n /** @internal */ _transferFn: TransferFn | null = null;\n /** @internal */ _isTransportConnected: (() => boolean) | null = null;\n /**\n * @internal Media WS playout 마커 훅. LiveKit(`ClawOpsAudioOutput`)이 재생 완료\n * 판정(mark echo)과 barge-in 절단 위치 계산에 쓴다. 다른 세션 타입은 읽지 않는다.\n * prewarm 중(BufferingCall)에는 바인딩되지 않아 null 이다.\n */\n /** @internal */ _sendMark: ((name: string) => void) | null = null;\n /** @internal */ _waitForMark: ((name: string, timeoutMs: number) => Promise<void>) | null = null;\n /** @internal */ _flushTransport: (() => Promise<void>) | null = null;\n private _dtmfCollectorActive = false;\n private _dtmfResolvers: ((digit: string) => void)[] = [];\n private _dtmfBuffer: string[] = [];\n private _log: Logger = NOOP_LOGGER;\n private _handlers: Map<string, SessionEventHandler[]> = new Map();\n private _endedPromise: Promise<void>;\n private _resolveEnded!: () => void;\n private _metrics: CallMetrics = createCallMetrics();\n private _firstResponseSent = false;\n\n constructor(options: {\n callId: string;\n fromNumber: string;\n toNumber: string;\n accountId: string;\n direction: CallDirection;\n metadata?: Record<string, unknown>;\n }) {\n this.callId = options.callId;\n this.fromNumber = options.fromNumber;\n this.toNumber = options.toNumber;\n this.accountId = options.accountId;\n this.direction = options.direction;\n this.metadata = options.metadata ?? {};\n this._status = 'ringing';\n this.startTime = new Date();\n\n this._endedPromise = new Promise<void>((resolve) => {\n this._resolveEnded = resolve;\n });\n }\n\n setLogger(logger: Logger): void {\n this._log = logger;\n }\n\n get status(): CallStatus {\n return this._status;\n }\n\n /**\n * 서버가 통보한 최종 종료 상태. 통화가 끝나기 전에는 null.\n *\n * `completed`(성사) / `no-answer`(벨은 울렸으나 무응답) / `busy`(통화중) /\n * `rejected`(수신 거절) / `canceled`(응답 전 발신 측 취소) / `failed`(시스템·망 오류).\n * `status` 는 SDK 내부 수명주기(ringing→active→ended)이므로 통화 성사 여부는\n * 이 값이나 `call_failed` 이벤트로 판단한다.\n */\n get endedStatus(): string | null {\n return this._endedStatus;\n }\n\n /**\n * 서버가 확정한 통화 시간(초). 통화가 끝나기 전에는 `null`.\n *\n * ⚠️ `duration` 과 다르다 — 그쪽은 SDK 가 로컬 시계로 재는 **경과 시간**이라 통화 중에도\n * 읽히고, 세션이 붙기 전후의 오차를 포함한다. 기록·정산에 쓸 값은 이쪽이다.\n */\n get endedDuration(): number | null {\n return this._endedDuration;\n }\n\n get duration(): number {\n return (Date.now() - this.startTime.getTime()) / 1000;\n }\n\n /** @internal 서버가 통보한 통화 시간을 확정한다. */\n _setEndedDuration(seconds: number): void {\n this._endedDuration = seconds;\n }\n\n get metrics(): Readonly<CallMetrics> { return this._metrics; }\n\n recordFirstResponse(): void {\n if (!this._firstResponseSent) {\n this._firstResponseSent = true;\n this._metrics.firstResponseMs = Date.now() - this.startTime.getTime();\n }\n }\n recordTurn(): void { this._metrics.turnCount++; }\n recordToolCall(): void { this._metrics.toolCallCount++; }\n recordToolError(err: Error): void { addMetricError(this._metrics, err); }\n recordBargeIn(): void { this._metrics.bargeInCount++; }\n recordEndReason(reason: string): void { this._metrics.endReason = reason; }\n\n /** Bind transport functions (called internally by the agent). */\n _bindTransport(\n send: SendAudioFn,\n clear: ClearAudioFn,\n hangup: HangupFn,\n sendDtmf?: SendDtmfFn,\n isConnected?: () => boolean,\n ): void {\n this._sendAudioFn = send;\n this._clearAudioFn = clear;\n this._hangupFn = hangup;\n if (sendDtmf) this._sendDtmfFn = sendDtmf;\n if (isConnected) this._isTransportConnected = isConnected;\n this._status = 'active';\n }\n\n /**\n * Send G.711 μ-law audio (8kHz, mono) to the caller.\n *\n * NOT PCM16. The transport applies μ-law gain and forwards the bytes as-is,\n * so PCM16 input is reinterpreted as μ-law and plays as noise. Convert first.\n */\n sendAudio(audio: Buffer): void {\n if (this._sendAudioFn) {\n this._sendAudioFn(audio);\n }\n }\n\n /** Clear any queued outbound audio. */\n clearAudio(): void {\n if (this._clearAudioFn) {\n this._clearAudioFn();\n }\n }\n\n /** Hang up the call, waiting for pending audio to finish. */\n async hangup(): Promise<void> {\n if (this._hangupFn) {\n await this._hangupFn();\n }\n }\n\n /** @internal Route a received DTMF digit to an active collector or buffer. */\n _routeDtmf(digit: string): void {\n if (this._dtmfCollectorActive && this._dtmfResolvers.length > 0) {\n const resolve = this._dtmfResolvers.shift()!;\n resolve(digit);\n } else {\n // Buffer the digit — collector may not be active yet (tool call timing)\n this._dtmfBuffer.push(digit);\n }\n }\n\n /**\n * Collect DTMF digits from the caller.\n *\n * `timeout` 은 **자리 사이** 대기다(inter-digit). `<Gather>` 를 비롯한 IVR 관행과 같은\n * 의미이고, 자리가 들어올 때마다 다시 시작한다.\n *\n * `maxWait` 는 그 관행이 만드는 최악을 막는 **전체 상한**이다(기본 30초). 자리마다\n * 리셋되는 타이머만 있으면 수집 하나가 최대 `maxDigits × timeout` 동안 산다 —\n * 11자리·5초면 **55초**이고, 그동안 모델은 이 도구에 붙들려 아무 말도 못 한다.\n * `null` 을 주면 상한 없이 종전대로 돈다.\n *\n * ⚠️ **수집값을 로그에 쓰지 않는다.** 키패드로 받는 값은 카드번호·주민번호일 수 있고,\n * 실제로 그런 구성이 있다. `secure` 와 무관하게 **자릿수만** 남긴다 — 이 옵션은 호환을\n * 위해 남아 있을 뿐 로깅을 좌우하지 않는다.\n */\n async collectDtmf(options: {\n maxDigits: number;\n finishOnKey?: string;\n timeout?: number;\n secure?: boolean;\n maxWait?: number | null;\n }): Promise<string> {\n if (this._dtmfCollectorActive) {\n throw new DtmfCollectorBusyError();\n }\n\n const { maxDigits, finishOnKey = '#', timeout = 5, maxWait = 30 } = options;\n this._dtmfCollectorActive = true;\n // Don't clear buffer — digits may have arrived before tool call was processed\n const collected: string[] = [];\n const deadline = maxWait === null ? null : Date.now() + maxWait * 1000;\n\n try {\n while (collected.length < maxDigits) {\n // Drain the buffer first\n if (this._dtmfBuffer.length > 0) {\n const digit = this._dtmfBuffer.shift()!;\n if (digit === finishOnKey) break;\n collected.push(digit);\n continue;\n }\n\n let waitMs = timeout * 1000;\n if (deadline !== null) {\n // 남은 예산이 자리 간 대기보다 짧으면 그만큼만 기다린다. 0 이하면 전체 상한에\n // 닿은 것이라 지금까지 모인 값으로 확정한다.\n waitMs = Math.min(waitMs, deadline - Date.now());\n if (waitMs <= 0) break;\n }\n\n // ⚠️ 진 쪽 타이머를 **반드시 지운다.** Promise.race 는 진 promise 를 취소하지\n // 않으므로, clear 하지 않으면 자리마다 타이머가 하나씩 살아남아 최대 timeout\n // 초 동안 이벤트 루프를 붙잡는다(통화가 끝나도 프로세스가 안 죽는다).\n let timer: ReturnType<typeof setTimeout> | undefined;\n const digit = await Promise.race([\n new Promise<string>((resolve) => {\n this._dtmfResolvers.push(resolve);\n }),\n new Promise<null>((resolve) => {\n timer = setTimeout(() => resolve(null), waitMs);\n }),\n ]).finally(() => {\n if (timer !== undefined) clearTimeout(timer);\n });\n\n if (digit === null) break; // timeout\n if (digit === finishOnKey) break;\n collected.push(digit);\n }\n } finally {\n this._dtmfCollectorActive = false;\n this._dtmfResolvers = [];\n this._dtmfBuffer = [];\n }\n\n const result = collected.join('');\n this._log.info('DTMF collected: %d digits', result.length);\n return result;\n }\n\n /** Send a sequence of DTMF digits. */\n async sendDtmfSequence(digits: string): Promise<void> {\n if (!this._sendDtmfFn) {\n throw new Error('DTMF 전송 함수가 바인딩되지 않았습니다');\n }\n for (const ch of digits) {\n if (this._isTransportConnected && !this._isTransportConnected()) {\n throw new Error('DTMF 전송 중 연결이 끊어졌습니다');\n }\n if (ch === 'w') {\n await new Promise((r) => setTimeout(r, 500));\n } else if (ch === 'W') {\n await new Promise((r) => setTimeout(r, 1000));\n } else if ('0123456789*#'.includes(ch)) {\n if (this._sendDtmfFn) {\n await this._sendDtmfFn(ch);\n }\n } else {\n throw new Error(`유효하지 않은 DTMF 문자: ${ch}`);\n }\n }\n }\n\n /**\n * Transfer the call to a phone number or SIP endpoint.\n *\n * destinationType='pstn' (default): `to` is a phone number dialed via carrier.\n * destinationType='sip': `to` is a SIP URI (e.g. `sip:user@host`) connected\n * directly to a SIP endpoint without going through the PSTN carrier. Requires the\n * account to have an active `sip_trunk` add-on; otherwise the transfer fails and\n * the call continues with the AI (result `{ status: 'failed', ... }`).\n *\n * 전환받는 쪽에 표시되는 발신번호는 기본이 **계정 보유번호**(인바운드면 착신 070)다.\n *\n * `callerIdMode: 'original'` 은 인바운드 통화의 **원 발신자 번호를 승계하려는 선호**다.\n * 승계할 수 없는 통화(KCT 직결 인입이 아니거나 국내 번호로 정규화되지 않는 발신번호)면\n * 조용히 계정 보유번호로 내려앉고 **전환은 그대로 성사된다**.\n *\n * `callerId` 는 번호를 직접 주는 **지시**라 성격이 다르다. 허용 범위(계정 보유번호 또는\n * KCT 직결 인입의 원 발신자)를 벗어나면 전환 자체가 실패한다. 둘 다 주면 `callerId` 가\n * 이기고 `callerIdMode` 는 무시된다 — 우선순위 판단은 서버가 한다.\n */\n async transfer(\n to: string,\n options?: {\n destinationType?: 'pstn' | 'sip';\n mode?: 'blind' | 'warm';\n afterTransfer?: 'terminate' | 'return';\n holdMedia?: string;\n whisper?: string;\n context?: Record<string, unknown>;\n callerId?: string;\n callerIdMode?: 'account' | 'original';\n timeout?: number;\n },\n ): Promise<Record<string, unknown>> {\n if (!this._transferFn) {\n throw new Error('transfer not available');\n }\n // 서버는 'original' 만 특별 취급하고 나머지 값은 조용히 무시한다. 오타를 그대로\n // 흘려보내면 아무 에러 없이 계정 번호가 나가고, 개발자는 켰다고 믿는다 — 여기서 막는다.\n const callerIdMode = options?.callerIdMode;\n if (callerIdMode !== undefined && callerIdMode !== 'account' && callerIdMode !== 'original') {\n throw new Error(\n `callerIdMode must be 'account' or 'original', got ${JSON.stringify(callerIdMode)}`,\n );\n }\n return this._transferFn({\n to,\n destinationType: options?.destinationType ?? 'pstn',\n mode: options?.mode ?? 'blind',\n afterTransfer: options?.afterTransfer ?? 'terminate',\n holdMedia: options?.holdMedia ?? 'ringback',\n whisper: options?.whisper ?? null,\n context: options?.context ?? null,\n callerId: options?.callerId ?? null,\n timeout: options?.timeout ?? 30,\n // 안 주면 키를 붙이지 않는다 — 구 서버와 기존 동작을 그대로 둔다(additive).\n ...(callerIdMode !== undefined ? { callerIdMode } : {}),\n });\n }\n\n /** Register an event handler. */\n on(event: string, handler: SessionEventHandler): void {\n let list = this._handlers.get(event);\n if (!list) {\n list = [];\n this._handlers.set(event, list);\n }\n list.push(handler);\n }\n\n /** Wait for the call to end. */\n async wait(): Promise<void> {\n return this._endedPromise;\n }\n\n /**\n * Mark the session as ended (called internally).\n *\n * @param status 서버가 통보한 최종 상태(completed/no-answer/busy/rejected/canceled/\n * failed). 주어지면 `endedStatus` 로 확정한다 — 상대가 받지 않은 통화를 성사된 통화와\n * 구분하기 위함이다. 생략하면 미디어 세션 정리 경로에서의 호출이므로, 아직 종료 전일\n * 때만 'completed' 로 채우고 이미 확정된 서버 상태는 덮어쓰지 않는다.\n */\n _markEnded(status?: string): void {\n if (status !== undefined) {\n this._endedStatus = status;\n } else if (this._status !== 'ended') {\n this._endedStatus = 'completed';\n }\n this._status = 'ended';\n this._resolveEnded();\n }\n\n /** Emit an event to registered handlers. Matches Python SDK: _emit(event, ...args) */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n _emit(event: string, ...args: any[]): void {\n const handlers = this._handlers.get(event);\n if (handlers) {\n for (const handler of handlers) {\n try {\n const result = handler(this, ...args);\n if (result && typeof result.catch === 'function') {\n result.catch((err: unknown) => {\n this._log.error({ err }, 'CallSession handler error: %s', event);\n });\n }\n } catch (err) {\n this._log.error({ err }, 'CallSession handler error: %s', event);\n }\n }\n }\n }\n}\n","/**\n * Built-in tool definitions and selection constants.\n */\n\nexport enum BuiltinTool {\n /** 전화 종료 도구. AI가 대화 완료 시 통화를 종료합니다. */\n HANG_UP = 'hang_up',\n /** DTMF 수집 도구. 사용자의 키패드 입력을 수집합니다. */\n COLLECT_DTMF = 'collect_dtmf',\n /** DTMF 전송 도구. ARS 탐색이나 내선번호 입력에 사용합니다. */\n SEND_DTMF = 'send_dtmf',\n /** 통화 전환 도구. 현재 통화를 다른 번호로 전환합니다. */\n TRANSFER_CALL = 'transfer_call',\n\n /** 모든 내장 도구를 활성화합니다. (기본값) */\n ALL = 'all',\n /** 모든 내장 도구를 비활성화합니다. */\n NONE = 'none',\n}\n\nconst INDIVIDUAL_TOOLS = new Set([\n BuiltinTool.HANG_UP,\n BuiltinTool.COLLECT_DTMF,\n BuiltinTool.SEND_DTMF,\n BuiltinTool.TRANSFER_CALL,\n]);\n\nexport function resolveBuiltinTools(\n value: BuiltinTool | BuiltinTool[],\n): Set<BuiltinTool> {\n if (typeof value === 'string') {\n if (value === BuiltinTool.ALL) {\n return new Set(INDIVIDUAL_TOOLS);\n }\n if (value === BuiltinTool.NONE) {\n return new Set();\n }\n return new Set([value]);\n }\n return new Set(value.filter((t) => INDIVIDUAL_TOOLS.has(t)));\n}\n","/**\n * Built-in tool 스키마 정의, 포맷 변환, 실행 헬퍼.\n *\n * 모든 세션(PipelineSession, OpenAIRealtime, GeminiRealtime)이 공통으로 사용하는\n * 내장 도구 스키마를 한 곳에서 관리한다.\n */\n\nimport { BuiltinTool } from '../builtin-tool.js';\nimport { createAgentLogger } from '../logger.js';\nimport type { CallSession } from '../session.js';\nimport { DtmfCollectorBusyError } from '../session.js';\n\nconst log = createAgentLogger();\n\n// ── 정규 스키마 (neutral 포맷) ──────────────────────────────────────\n\nconst HANG_UP = {\n name: 'hang_up',\n description:\n 'End the phone call. Use when the conversation is finished or the caller says goodbye.',\n parameters: { type: 'object' as const, properties: {} as Record<string, unknown> },\n} as const;\n\nconst COLLECT_DTMF = {\n name: 'collect_dtmf',\n description:\n '사용자로부터 DTMF(전화 키패드) 입력을 수집합니다. 반드시 사용자에게 무엇을 입력해야 하는지 안내한 후 호출하세요.',\n parameters: {\n type: 'object' as const,\n properties: {\n max_digits: { type: 'integer' as const, description: '수집할 최대 자릿수' },\n finish_on_key: { type: 'string' as const, description: '입력 종료 키 (기본: #)' },\n timeout: { type: 'integer' as const, description: '입력 대기 시간(초, 기본: 5)' },\n },\n required: ['max_digits'] as string[],\n },\n} as const;\n\nconst SEND_DTMF = {\n name: 'send_dtmf',\n description: 'DTMF 신호를 전송합니다. ARS 메뉴 탐색이나 내선번호 입력 시 사용합니다.',\n parameters: {\n type: 'object' as const,\n properties: {\n digits: {\n type: 'string' as const,\n description:\n \"전송할 번호 (0-9, *, #). 'w'는 500ms 대기, 'W'는 1000ms 대기. 예: '1', '1234#', '1w2'\",\n },\n },\n required: ['digits'] as string[],\n },\n} as const;\n\nconst TRANSFER_CALL = {\n name: 'transfer_call',\n description:\n 'Transfer the current call to another phone number or SIP endpoint. Use for blind transfer (direct handoff) or warm transfer (with whisper message to the target).',\n parameters: {\n type: 'object' as const,\n properties: {\n to: { type: 'string' as const, description: \"Transfer destination. A phone number when destination_type is 'pstn', or a SIP URI (e.g. 'sip:user@host') when destination_type is 'sip'.\" },\n destination_type: { type: 'string' as const, enum: ['pstn', 'sip'], description: 'pstn: dial a phone number via carrier (default). sip: connect directly to a SIP endpoint (no carrier/PSTN).' },\n mode: { type: 'string' as const, enum: ['blind', 'warm'], description: 'blind: direct transfer (default), warm: play whisper to target first' },\n after_transfer: { type: 'string' as const, enum: ['terminate', 'return'], description: 'terminate: end AI session (default), return: AI resumes after transfer ends' },\n whisper: { type: 'string' as const, description: 'Message to speak to transfer target before connecting customer (warm mode only)' },\n caller_id_mode: { type: 'string' as const, enum: ['account', 'original'], description: \"What the transfer target sees as the caller. account: the account's own number (default). original: prefer the inbound caller's number, falling back to the account number when it cannot be inherited. Prefer this over caller_id.\" },\n caller_id: { type: 'string' as const, description: 'Exact caller ID for the transfer leg. Must be a number the account owns, or the original inbound caller. Anything else fails the transfer outright — use caller_id_mode unless a specific number is required.' },\n timeout: { type: 'integer' as const, description: 'Seconds to wait for transfer target to answer (default 30)' },\n },\n required: ['to'] as string[],\n },\n} as const;\n\ntype NeutralSchema = typeof HANG_UP | typeof COLLECT_DTMF | typeof SEND_DTMF | typeof TRANSFER_CALL;\n\nconst TOOL_MAP = new Map<BuiltinTool, NeutralSchema>([\n [BuiltinTool.HANG_UP, HANG_UP],\n [BuiltinTool.COLLECT_DTMF, COLLECT_DTMF],\n [BuiltinTool.SEND_DTMF, SEND_DTMF],\n [BuiltinTool.TRANSFER_CALL, TRANSFER_CALL],\n]);\n\nexport const BUILTIN_TOOL_NAMES: Set<string> = new Set(\n Array.from(TOOL_MAP.values()).map((s) => s.name),\n);\n\n/** prewarm 창에서 통화 제어 도구가 호출됐을 때 모델에 돌려주는 결과. */\nexport const CALL_NOT_READY_RESULT =\n '통화가 아직 연결되지 않았습니다(발신 호출음 단계). 상대가 전화를 받은 뒤에 다시 시도하세요.';\n\n// ── 포맷 변환 ───────────────────────────────────────────────────────\n\nfunction toChatCompletions(schema: NeutralSchema): Record<string, unknown> {\n return {\n type: 'function',\n function: {\n name: schema.name,\n description: schema.description,\n parameters: schema.parameters,\n },\n };\n}\n\nfunction toRealtime(schema: NeutralSchema): Record<string, unknown> {\n return {\n type: 'function',\n name: schema.name,\n description: schema.description,\n parameters: schema.parameters,\n };\n}\n\nfunction toGemini(schema: NeutralSchema): Record<string, unknown> {\n return {\n name: schema.name,\n description: schema.description,\n parameters: schema.parameters,\n };\n}\n\nconst CONVERTERS = {\n chat: toChatCompletions,\n realtime: toRealtime,\n gemini: toGemini,\n} as const;\n\n/**\n * 활성화된 builtin tool 스키마를 요청한 포맷으로 반환.\n */\nexport function getBuiltinToolSchemas(\n builtinTools: Set<BuiltinTool> | null,\n fmt: 'chat' | 'realtime' | 'gemini',\n): Array<Record<string, unknown>> {\n const converter = CONVERTERS[fmt];\n const result: Array<Record<string, unknown>> = [];\n for (const [toolEnum, schema] of TOOL_MAP) {\n if (builtinTools === null || builtinTools.has(toolEnum)) {\n result.push(converter(schema));\n }\n }\n return result;\n}\n\n// ── 공통 실행 헬퍼 ──────────────────────────────────────────────────\n\n/**\n * Builtin tool을 실행하고 결과 문자열을 반환한다.\n *\n * `funcName`이 builtin tool이 아니면 `null`을 반환한다.\n * `hang_up`의 경우 빈 문자열 `\"\"`을 반환한다 (호출자가 종료 처리).\n */\nexport function isBuiltinTool(name: string): boolean {\n return BUILTIN_TOOL_NAMES.has(name);\n}\n\nexport async function executeBuiltinTool(\n funcName: string,\n args: Record<string, unknown>,\n call: CallSession,\n): Promise<string | null> {\n if (funcName === 'hang_up') {\n await call.hangup();\n return '';\n }\n if (funcName === 'collect_dtmf') {\n try {\n const result = await call.collectDtmf({\n maxDigits: (args['max_digits'] as number) ?? 4,\n finishOnKey: (args['finish_on_key'] as string) ?? '#',\n timeout: (args['timeout'] as number) ?? 5,\n });\n return result || '(타임아웃 - 입력 없음)';\n } catch (e) {\n // 중복 호출은 고장이 아니다 — \"Error\" 로 돌려주면 모델이 도구가 망가진 줄 알고 다시\n // 부르지 않고, 그때부터 발신자가 누르는 키는 아무도 받지 않는다.\n if (e instanceof DtmfCollectorBusyError) {\n return '(이미 입력을 받는 중입니다. 결과를 기다리세요.)';\n }\n return `Error: ${e}`;\n }\n }\n if (funcName === 'send_dtmf') {\n try {\n await call.sendDtmfSequence((args['digits'] as string) ?? '');\n return 'sent';\n } catch (e) {\n return `Error: ${e}`;\n }\n }\n if (funcName === 'transfer_call') {\n try {\n // Fire-and-forget: transfer 요청만 보내고 즉시 반환.\n // call-engine이 transfer 시작 시 media WS를 닫으므로,\n // 결과를 await하면 LLM 세션이 먼저 종료된다.\n call.transfer(args['to'] as string, {\n destinationType: (args['destination_type'] as 'pstn' | 'sip') ?? undefined,\n mode: (args['mode'] as 'blind' | 'warm') ?? undefined,\n afterTransfer: (args['after_transfer'] as 'terminate' | 'return') ?? undefined,\n whisper: args['whisper'] as string ?? undefined,\n callerId: args['caller_id'] as string ?? undefined,\n callerIdMode: (args['caller_id_mode'] as 'account' | 'original') ?? undefined,\n timeout: args['timeout'] as number ?? undefined,\n // 결과를 안 기다리므로 실패가 통째로 조용하다 — 모델은 \"시작됨\" 을 받고, 예외는\n // 프로미스 안에 갇힌다. 최소한 로그에는 남긴다.\n }).catch((e: unknown) => {\n log.error({ err: e }, 'transfer_call 도구가 건 전환이 실패했다');\n });\n return JSON.stringify({ status: 'transfer_initiated' });\n } catch (e) {\n return `Error: ${e}`;\n }\n }\n return null;\n}\n","/**\n * prewarm 단계에서 사용되는 CallSession stub.\n *\n * Session 구현체가 sendAudio() 를 호출하면 메모리 버퍼에 누적한다.\n * attach() 시점에 drainBuffer() 로 꺼내 실제 CallSession 에 flush.\n *\n * Python SDK 의 `_BufferingCall` mirror.\n */\n\nimport type { CallSession } from '../session.js';\n\nclass MetricsStub {\n recordToolCall(): void {}\n recordInterrupt(): void {}\n recordToolError(): void {}\n}\n\nexport class BufferingCall {\n private _buffer: Buffer[] = [];\n private _droppedEvents: Record<string, number> = {};\n readonly metrics = new MetricsStub();\n\n async sendAudio(chunk: Buffer): Promise<void> {\n this._buffer.push(chunk);\n }\n\n /** clearAudio 도 prewarm 동안엔 no-op (드물긴 하지만 안전하게). */\n clearAudio(): void {\n this._buffer = [];\n }\n\n /**\n * transcript 등 lifecycle 이벤트는 prewarm 동안 무시한다. silent drop 은 디버깅이\n * 어려우므로 event name 별 카운터로 누적하고 attachBuffered() 시 한 번에 로깅한다.\n */\n _emit(...args: unknown[]): void {\n this._recordDropped(args);\n }\n\n async emit(...args: unknown[]): Promise<void> {\n this._recordDropped(args);\n }\n\n private _recordDropped(args: unknown[]): void {\n let eventName = '?';\n if (args.length > 0 && typeof args[0] === 'string') {\n eventName = args[0];\n }\n this._droppedEvents[eventName] = (this._droppedEvents[eventName] ?? 0) + 1;\n }\n\n recordToolCall(): void {}\n recordToolError(): void {}\n recordFirstResponse(): void {}\n recordBargeIn(): void {}\n\n drainBuffer(): Buffer[] {\n const out = this._buffer;\n this._buffer = [];\n return out;\n }\n\n drainDroppedEvents(): Record<string, number> {\n const out = this._droppedEvents;\n this._droppedEvents = {};\n return out;\n }\n}\n\n/**\n * prewarm → attach 전환 시 BufferingCall 에 쌓인 audio chunk 를 실제\n * CallSession 으로 flush 하는 공통 헬퍼. OpenAI / Gemini / PipelineSession\n * attach() 가 동일 패턴이므로 한 곳에서 관리한다.\n *\n * 반환값: 한 개 이상의 chunk 를 drain 했으면 true. drain 시 PREWARM-T first-audio\n * 마커를 한 번 emit 한다. drained 가 비어 있으면 false 를 반환하여 호출자(Session)\n * 가 첫 실시간 audio.delta 송출 시 logFirstRealtimeAudio() 로 한 번만 마커를 찍을\n * 수 있게 한다.\n */\nexport function attachBuffered(\n prev: BufferingCall | CallSession | null,\n next: CallSession,\n): boolean {\n if (!(prev instanceof BufferingCall)) {\n return false;\n }\n\n const drained = prev.drainBuffer();\n const flushed = drained.length > 0;\n const callId = (next as { callId?: string }).callId ?? '?';\n\n if (flushed) {\n // eslint-disable-next-line no-console\n console.info(\n `[PREWARM-T] first-audio call_id=${callId} ` +\n `t=${(process.hrtime.bigint() / 1_000_000n).toString()} ` +\n `buffered_chunks=${drained.length} source=prebuffer`,\n );\n }\n for (const chunk of drained) {\n next.sendAudio(chunk);\n }\n\n const dropped = prev.drainDroppedEvents();\n if (Object.keys(dropped).length > 0) {\n // eslint-disable-next-line no-console\n console.info(\n `[PREWARM] dropped events during prewarm call_id=${callId} events=${JSON.stringify(dropped)}`,\n );\n }\n return flushed;\n}\n\n/**\n * prewarm prebuffer 가 비어 있던 케이스에서 첫 실시간 audio chunk 송출 시 호출.\n * 호출자(Session)는 attachBuffered() 반환값과 자체 플래그로 한 번만 호출하도록\n * 가드해야 한다.\n */\nexport function logFirstRealtimeAudio(call: { callId?: string } | null): void {\n const callId = call?.callId ?? '?';\n // eslint-disable-next-line no-console\n console.info(\n `[PREWARM-T] first-audio call_id=${callId} ` +\n `t=${(process.hrtime.bigint() / 1_000_000n).toString()} ` +\n `buffered_chunks=0 source=realtime`,\n );\n}\n"]}
|
|
@@ -1042,6 +1042,81 @@ declare const KakaoTemplateSchema: z.ZodObject<{
|
|
|
1042
1042
|
updatedAt: z.ZodString;
|
|
1043
1043
|
}, z.ZodTypeAny, "passthrough">>;
|
|
1044
1044
|
type KakaoTemplate = z.infer<typeof KakaoTemplateSchema>;
|
|
1045
|
+
/**
|
|
1046
|
+
* 브랜드 메시지 말풍선 유형. **이 값이 단가를 정한다** — 텍스트형이 가장 싸고
|
|
1047
|
+
* 와이드리스트·캐러셀·커머스가 가장 비싸다.
|
|
1048
|
+
*
|
|
1049
|
+
* `MessageType` 과 같은 이유로 열어 둔 유니온이다.
|
|
1050
|
+
*/
|
|
1051
|
+
type BrandBubbleType = 'TEXT' | 'IMAGE' | 'WIDE' | 'WIDE_ITEM_LIST' | 'CAROUSEL_FEED' | 'COMMERCE' | 'CAROUSEL_COMMERCE' | (string & {});
|
|
1052
|
+
/**
|
|
1053
|
+
* 브랜드 메시지 템플릿.
|
|
1054
|
+
*
|
|
1055
|
+
* ⭐ **알림톡과 달리 검수가 없다** — `status`·`dormant`·`sendable` 이 없는 이유이고,
|
|
1056
|
+
* 목록에 있으면 곧 발송할 수 있다.
|
|
1057
|
+
*/
|
|
1058
|
+
declare const KakaoBrandTemplateSchema: z.ZodObject<{
|
|
1059
|
+
/** ClawOps 템플릿 리소스 ID. 발송의 `brand.templateId` 에 이 값을 쓴다. */
|
|
1060
|
+
id: z.ZodString;
|
|
1061
|
+
/** ClawOps 채널 리소스 ID. 발송의 `brand.channelId` 와 같은 값이다. */
|
|
1062
|
+
channelId: z.ZodString;
|
|
1063
|
+
name: z.ZodString;
|
|
1064
|
+
chatBubbleType: z.ZodType<BrandBubbleType>;
|
|
1065
|
+
/**
|
|
1066
|
+
* 말풍선 본문.
|
|
1067
|
+
*
|
|
1068
|
+
* ⚠️ **유형에 따라 `null` 이다.** 본문이 담기는 자리가 유형마다 달라 `TEXT`·`IMAGE`·
|
|
1069
|
+
* `WIDE` 에만 채워진다 — 나머지는 헤더·카드·상품명이 그 자리를 대신한다.
|
|
1070
|
+
*/
|
|
1071
|
+
content: z.ZodNullable<z.ZodString>;
|
|
1072
|
+
/** 와이드리스트형의 머리말. 다른 유형에서는 `null`. */
|
|
1073
|
+
header: z.ZodNullable<z.ZodString>;
|
|
1074
|
+
/** 발송 시 `brand.variables` 에 모두 채워야 하는 변수 이름. */
|
|
1075
|
+
variables: z.ZodArray<z.ZodString, "many">;
|
|
1076
|
+
createdAt: z.ZodString;
|
|
1077
|
+
updatedAt: z.ZodString;
|
|
1078
|
+
}, "passthrough", z.ZodTypeAny, z.objectOutputType<{
|
|
1079
|
+
/** ClawOps 템플릿 리소스 ID. 발송의 `brand.templateId` 에 이 값을 쓴다. */
|
|
1080
|
+
id: z.ZodString;
|
|
1081
|
+
/** ClawOps 채널 리소스 ID. 발송의 `brand.channelId` 와 같은 값이다. */
|
|
1082
|
+
channelId: z.ZodString;
|
|
1083
|
+
name: z.ZodString;
|
|
1084
|
+
chatBubbleType: z.ZodType<BrandBubbleType>;
|
|
1085
|
+
/**
|
|
1086
|
+
* 말풍선 본문.
|
|
1087
|
+
*
|
|
1088
|
+
* ⚠️ **유형에 따라 `null` 이다.** 본문이 담기는 자리가 유형마다 달라 `TEXT`·`IMAGE`·
|
|
1089
|
+
* `WIDE` 에만 채워진다 — 나머지는 헤더·카드·상품명이 그 자리를 대신한다.
|
|
1090
|
+
*/
|
|
1091
|
+
content: z.ZodNullable<z.ZodString>;
|
|
1092
|
+
/** 와이드리스트형의 머리말. 다른 유형에서는 `null`. */
|
|
1093
|
+
header: z.ZodNullable<z.ZodString>;
|
|
1094
|
+
/** 발송 시 `brand.variables` 에 모두 채워야 하는 변수 이름. */
|
|
1095
|
+
variables: z.ZodArray<z.ZodString, "many">;
|
|
1096
|
+
createdAt: z.ZodString;
|
|
1097
|
+
updatedAt: z.ZodString;
|
|
1098
|
+
}, z.ZodTypeAny, "passthrough">, z.objectInputType<{
|
|
1099
|
+
/** ClawOps 템플릿 리소스 ID. 발송의 `brand.templateId` 에 이 값을 쓴다. */
|
|
1100
|
+
id: z.ZodString;
|
|
1101
|
+
/** ClawOps 채널 리소스 ID. 발송의 `brand.channelId` 와 같은 값이다. */
|
|
1102
|
+
channelId: z.ZodString;
|
|
1103
|
+
name: z.ZodString;
|
|
1104
|
+
chatBubbleType: z.ZodType<BrandBubbleType>;
|
|
1105
|
+
/**
|
|
1106
|
+
* 말풍선 본문.
|
|
1107
|
+
*
|
|
1108
|
+
* ⚠️ **유형에 따라 `null` 이다.** 본문이 담기는 자리가 유형마다 달라 `TEXT`·`IMAGE`·
|
|
1109
|
+
* `WIDE` 에만 채워진다 — 나머지는 헤더·카드·상품명이 그 자리를 대신한다.
|
|
1110
|
+
*/
|
|
1111
|
+
content: z.ZodNullable<z.ZodString>;
|
|
1112
|
+
/** 와이드리스트형의 머리말. 다른 유형에서는 `null`. */
|
|
1113
|
+
header: z.ZodNullable<z.ZodString>;
|
|
1114
|
+
/** 발송 시 `brand.variables` 에 모두 채워야 하는 변수 이름. */
|
|
1115
|
+
variables: z.ZodArray<z.ZodString, "many">;
|
|
1116
|
+
createdAt: z.ZodString;
|
|
1117
|
+
updatedAt: z.ZodString;
|
|
1118
|
+
}, z.ZodTypeAny, "passthrough">>;
|
|
1119
|
+
type KakaoBrandTemplate = z.infer<typeof KakaoBrandTemplateSchema>;
|
|
1045
1120
|
/** 채널 업종 카테고리. **열린 집합이므로 코드에 하드코딩하지 말 것** — 이 응답이 정본이다. */
|
|
1046
1121
|
declare const KakaoChannelCategorySchema: z.ZodObject<{
|
|
1047
1122
|
/** 채널 연결의 `categoryCode` 에 그대로 보내는 값. */
|
|
@@ -1213,6 +1288,13 @@ interface KakaoTemplateListParams {
|
|
|
1213
1288
|
page?: number;
|
|
1214
1289
|
pageSize?: number;
|
|
1215
1290
|
}
|
|
1291
|
+
/** 브랜드 메시지 템플릿 목록. 알림톡과 같은 축(채널 필수)이다. */
|
|
1292
|
+
interface KakaoBrandTemplateListParams {
|
|
1293
|
+
/** ClawOps 채널 리소스 ID. **필수다** — 없으면 `400` 이다. */
|
|
1294
|
+
channelId: string;
|
|
1295
|
+
page?: number;
|
|
1296
|
+
pageSize?: number;
|
|
1297
|
+
}
|
|
1216
1298
|
|
|
1217
1299
|
type RequestOptions$1 = {
|
|
1218
1300
|
extraHeaders?: Record<string, string>;
|
|
@@ -1288,14 +1370,28 @@ declare class KakaoTemplates extends APIResource {
|
|
|
1288
1370
|
*/
|
|
1289
1371
|
list(params: KakaoTemplateListParams, options?: RequestOptions$1): Promise<Page<KakaoTemplate>>;
|
|
1290
1372
|
}
|
|
1373
|
+
declare class KakaoBrandTemplates extends APIResource {
|
|
1374
|
+
/**
|
|
1375
|
+
* 한 채널의 브랜드 메시지 템플릿 목록.
|
|
1376
|
+
*
|
|
1377
|
+
* 응답의 `data[].id` 를 발송의 `brand.templateId` 로, `data[].channelId` 를
|
|
1378
|
+
* `brand.channelId` 로 쓴다. `variables` 의 모든 항목을 `brand.variables` 에 채워야 한다.
|
|
1379
|
+
*
|
|
1380
|
+
* ⭐ **알림톡과 달리 검수가 없어** `sendable` 같은 칸이 없다 — 목록에 있으면 곧 보낼 수 있다.
|
|
1381
|
+
*/
|
|
1382
|
+
list(params: KakaoBrandTemplateListParams, options?: RequestOptions$1): Promise<Page<KakaoBrandTemplate>>;
|
|
1383
|
+
}
|
|
1291
1384
|
/**
|
|
1292
|
-
* 카카오
|
|
1385
|
+
* 카카오 알림톡·브랜드 메시지 관련 리소스.
|
|
1293
1386
|
*
|
|
1294
|
-
* 발송 자체는 `client.messages.create({ kakao: … })`
|
|
1387
|
+
* 발송 자체는 `client.messages.create({ kakao: … })` 또는 `({ brand: … })` 다 —
|
|
1388
|
+
* 여기서 얻은 채널·템플릿 ID 를 그대로 쓴다.
|
|
1295
1389
|
*/
|
|
1296
1390
|
declare class Kakao extends APIResource {
|
|
1297
1391
|
get channels(): KakaoChannels;
|
|
1298
1392
|
get templates(): KakaoTemplates;
|
|
1393
|
+
/** 브랜드 메시지 템플릿. 알림톡 템플릿(`templates`)과 **다른 표**다. */
|
|
1394
|
+
get brandTemplates(): KakaoBrandTemplates;
|
|
1299
1395
|
/**
|
|
1300
1396
|
* 채널 연결 시 지정할 업종 카테고리 목록.
|
|
1301
1397
|
*
|
|
@@ -1426,6 +1522,7 @@ interface TextMessageCreateParams extends MessageCreateBaseParams {
|
|
|
1426
1522
|
/** MMS 첨부 (최대 3개). jpg·jpeg·png·bmp, 장당 300KB 이하. */
|
|
1427
1523
|
mediaUrl?: string[];
|
|
1428
1524
|
kakao?: never;
|
|
1525
|
+
brand?: never;
|
|
1429
1526
|
fallback?: never;
|
|
1430
1527
|
}
|
|
1431
1528
|
/** 알림톡 템플릿 지정. 구조(본문·버튼·아이템·강조)는 검수된 템플릿이 정하고, 요청은 값만 채운다. */
|
|
@@ -1464,6 +1561,7 @@ interface KakaoFallbackParams {
|
|
|
1464
1561
|
*/
|
|
1465
1562
|
interface KakaoMessageCreateParams extends MessageCreateBaseParams {
|
|
1466
1563
|
kakao: KakaoSendParams;
|
|
1564
|
+
brand?: never;
|
|
1467
1565
|
fallback?: KakaoFallbackParams;
|
|
1468
1566
|
/** `kakao` 를 실으면 알림톡이다. 명시할 필요가 없고, 명시한다면 `'ata'` 뿐이다. */
|
|
1469
1567
|
type?: 'ata';
|
|
@@ -1471,12 +1569,49 @@ interface KakaoMessageCreateParams extends MessageCreateBaseParams {
|
|
|
1471
1569
|
subject?: never;
|
|
1472
1570
|
mediaUrl?: never;
|
|
1473
1571
|
}
|
|
1572
|
+
/** 브랜드 메시지 템플릿 지정. 구조(본문·버튼·이미지)는 등록한 템플릿이 정한다. */
|
|
1573
|
+
interface BrandSendParams {
|
|
1574
|
+
/** `kakao.channels.list()` 의 `data[].id` (ClawOps 리소스 ID). */
|
|
1575
|
+
channelId: string;
|
|
1576
|
+
/**
|
|
1577
|
+
* `kakao.brandTemplates.list()` 의 `data[].id` (ClawOps 리소스 ID).
|
|
1578
|
+
*/
|
|
1579
|
+
templateId: string;
|
|
1580
|
+
/**
|
|
1581
|
+
* 템플릿 변수. 키는 `고객명` 과 `#{고객명}` 을 모두 받는다.
|
|
1582
|
+
*
|
|
1583
|
+
* 채워야 할 이름은 `kakao.brandTemplates.list()` 응답의 `variables` 가 알려준다.
|
|
1584
|
+
*/
|
|
1585
|
+
variables?: Record<string, string>;
|
|
1586
|
+
}
|
|
1587
|
+
/**
|
|
1588
|
+
* 카카오 브랜드 메시지 발송 파라미터.
|
|
1589
|
+
*
|
|
1590
|
+
* 채널을 **추가한 친구**에게 나가는 광고성 메시지다. 알림톡과 갈리는 점 둘:
|
|
1591
|
+
*
|
|
1592
|
+
* - **야간에 못 보낸다.** 20:50~08:00(KST)은 `422 kakao_brand_night_blocked` 다.
|
|
1593
|
+
* - **대체발송이 없다.** `fallback` 을 실으면 `400 kakao_fallback_not_allowed` 라서
|
|
1594
|
+
* 타입에서도 막는다.
|
|
1595
|
+
*
|
|
1596
|
+
* `(광고)` 표기와 수신거부 안내는 카카오가 붙이므로 본문에 넣지 않는다.
|
|
1597
|
+
*/
|
|
1598
|
+
interface BrandMessageCreateParams extends MessageCreateBaseParams {
|
|
1599
|
+
brand: BrandSendParams;
|
|
1600
|
+
/** `brand` 를 실으면 브랜드 메시지다. 명시할 필요가 없고, 명시한다면 `'bms'` 뿐이다. */
|
|
1601
|
+
type?: 'bms';
|
|
1602
|
+
body?: never;
|
|
1603
|
+
subject?: never;
|
|
1604
|
+
mediaUrl?: never;
|
|
1605
|
+
kakao?: never;
|
|
1606
|
+
fallback?: never;
|
|
1607
|
+
}
|
|
1474
1608
|
/**
|
|
1475
|
-
* 발송 파라미터.
|
|
1609
|
+
* 발송 파라미터. 문자·알림톡·브랜드 메시지는 **서로 배타적**이다 — 서버 규칙이 그렇고,
|
|
1610
|
+
* 섞으면 컴파일 에러다.
|
|
1476
1611
|
*/
|
|
1477
|
-
type MessageCreateParams = TextMessageCreateParams | KakaoMessageCreateParams;
|
|
1612
|
+
type MessageCreateParams = TextMessageCreateParams | KakaoMessageCreateParams | BrandMessageCreateParams;
|
|
1478
1613
|
interface MessageListParams {
|
|
1479
|
-
type?: TextMessageType | 'ata';
|
|
1614
|
+
type?: TextMessageType | 'ata' | 'bms';
|
|
1480
1615
|
status?: 'queued' | 'sent' | 'failed' | 'received';
|
|
1481
1616
|
/** 발신 또는 수신 번호. 하이픈 유무를 모두 매칭한다. */
|
|
1482
1617
|
number?: string;
|
|
@@ -1486,10 +1621,10 @@ interface MessageListParams {
|
|
|
1486
1621
|
|
|
1487
1622
|
declare class Messages extends APIResource {
|
|
1488
1623
|
/**
|
|
1489
|
-
* 문자(SMS/LMS/MMS) 또는 카카오
|
|
1624
|
+
* 문자(SMS/LMS/MMS) 또는 카카오 알림톡·브랜드 메시지를 발송합니다.
|
|
1490
1625
|
*
|
|
1491
|
-
*
|
|
1492
|
-
* 실을 수 없습니다(본문은
|
|
1626
|
+
* 셋은 배타적입니다 — `kakao` 를 실으면 알림톡, `brand` 를 실으면 브랜드 메시지이고,
|
|
1627
|
+
* 이때 `body`·`subject`·`mediaUrl` 은 실을 수 없습니다(본문은 템플릿이 정합니다).
|
|
1493
1628
|
*
|
|
1494
1629
|
* ```ts
|
|
1495
1630
|
* // 문자
|
|
@@ -1502,6 +1637,14 @@ declare class Messages extends APIResource {
|
|
|
1502
1637
|
* kakao: { channelId, templateId, variables: { 고객명: '홍길동' } },
|
|
1503
1638
|
* fallback: { body: '주문이 접수되었습니다.' },
|
|
1504
1639
|
* });
|
|
1640
|
+
*
|
|
1641
|
+
* // 브랜드 메시지 — 채널을 추가한 친구에게 나가는 광고성 메시지
|
|
1642
|
+
* // ⚠️ 야간 제한과 대체발송 없음 — 제약은 `BrandMessageCreateParams` 참고.
|
|
1643
|
+
* await client.messages.create({
|
|
1644
|
+
* to: '010…',
|
|
1645
|
+
* from: '070…',
|
|
1646
|
+
* brand: { channelId, templateId, variables: { 고객명: '홍길동' } },
|
|
1647
|
+
* });
|
|
1505
1648
|
* ```
|
|
1506
1649
|
*/
|
|
1507
1650
|
create(params: MessageCreateParams, options?: {
|
|
@@ -1912,7 +2055,11 @@ declare class AccountContext {
|
|
|
1912
2055
|
* 그렇게 보내므로 SDK 가 임의로 정규화하지 않는다. 열린 유니온이라 목록에 없는 코드도
|
|
1913
2056
|
* 그대로 실린다(자동완성만 돕는다).
|
|
1914
2057
|
*/
|
|
1915
|
-
type ClawOpsErrorCode = 'invalid_phone' | 'invalid_type' | 'invalid_input' | 'from_not_registered' | 'body_too_long' | 'sms_no_subject' | 'sms_no_media' | 'lms_no_media' | 'too_many_media' | 'invalid_media_ext' | 'media_download_failed' | 'type_not_supported' | 'messaging_blocked' | 'recipient_blocked' | 'quota_exceeded' | 'override_quota_exceeded' | 'no_active_subscription' | 'kakao_required' | 'kakao_type_conflict' | 'kakao_body_not_allowed' | 'kakao_subject_not_allowed' | 'kakao_media_not_allowed' | 'kakao_channel_not_found' | 'kakao_template_not_found' | 'kakao_template_not_approved' | 'kakao_template_dormant' | 'kakao_variable_missing' | 'kakao_variable_unknown' | 'kakao_send_failed' | 'kakao_unavailable' | 'invalid_fallback_type' | '
|
|
2058
|
+
type ClawOpsErrorCode = 'invalid_phone' | 'invalid_type' | 'invalid_input' | 'from_not_registered' | 'body_too_long' | 'sms_no_subject' | 'sms_no_media' | 'lms_no_media' | 'too_many_media' | 'invalid_media_ext' | 'media_download_failed' | 'type_not_supported' | 'messaging_blocked' | 'recipient_blocked' | 'quota_exceeded' | 'override_quota_exceeded' | 'no_active_subscription' | 'kakao_required' | 'kakao_type_conflict' | 'kakao_body_not_allowed' | 'kakao_subject_not_allowed' | 'kakao_media_not_allowed' | 'kakao_channel_not_found' | 'kakao_template_not_found' | 'kakao_template_not_approved' | 'kakao_template_dormant' | 'kakao_variable_missing' | 'kakao_variable_unknown' | 'kakao_send_failed' | 'kakao_unavailable' | 'invalid_fallback_type' | 'kakao_brand_required' | 'kakao_brand_template_not_found'
|
|
2059
|
+
/** 광고성이라 20:50~08:00(KST)에는 접수되지 않는다. 하루 11시간 동안 나오므로 재시도 스케줄링이 이 분기에 달린다. */
|
|
2060
|
+
| 'kakao_brand_night_blocked'
|
|
2061
|
+
/** 브랜드는 대체발송이 없다 — `fallback` 을 실으면 이 코드다. */
|
|
2062
|
+
| 'kakao_fallback_not_allowed' | 'KAKAO_TOKEN_INVALID' | 'KAKAO_CHANNEL_ALREADY_LINKED' | 'KAKAO_CHANNEL_REJECTED' | 'KAKAO_RATE_LIMITED' | 'KAKAO_PROVIDER_UNAVAILABLE' | 'VALIDATION' | 'NOT_FOUND' | (string & {});
|
|
1916
2063
|
declare class ClawOpsError extends Error {
|
|
1917
2064
|
constructor(message: string);
|
|
1918
2065
|
}
|
|
@@ -2116,4 +2263,4 @@ declare class ClawOps extends APIClient {
|
|
|
2116
2263
|
accounts(accountId: string): AccountContext;
|
|
2117
2264
|
}
|
|
2118
2265
|
|
|
2119
|
-
export { type
|
|
2266
|
+
export { type KakaoTemplateListParams as $, APIClient as A, BadRequestError as B, type Call as C, type CallListParams as D, type CallUpdateParams as E, Calls as F, ClawOps as G, ClawOpsError as H, type ClawOpsErrorCode as I, type ClawOpsOptions as J, ConflictError as K, InternalServerError as L, Kakao as M, type KakaoBrandTemplate as N, type KakaoBrandTemplateListParams as O, KakaoBrandTemplates as P, type KakaoChannel as Q, type KakaoChannelCategory as R, type KakaoChannelCategoryList as S, type KakaoChannelConnectParams as T, type KakaoChannelListParams as U, type KakaoChannelStatus as V, KakaoChannels as W, type KakaoFallbackParams as X, type KakaoMessageCreateParams as Y, type KakaoSendParams as Z, type KakaoTemplate as _, type APIClientOptions as a, KakaoTemplates as a0, type KakaoTokenRequest as a1, type KakaoTokenRequestParams as a2, type Message as a3, type MessageCreateParams as a4, type MessageListParams as a5, Messages as a6, NotFoundError as a7, type NumberCreateParams as a8, type NumberListItem as a9, type NumberUpdateParams as aa, type NumberUpdateResponse as ab, Numbers as ac, Page as ad, PermissionDeniedError as ae, type PhoneNumber as af, RateLimitError as ag, type RecordingDownload as ah, Recordings as ai, type RoutingType as aj, ServiceUnavailableError as ak, type SipCredential as al, SipCredentials as am, type SipEndpoint as an, SipEndpoints as ao, SolapiBridgeError as ap, type TextMessageCreateParams as aq, UnprocessableEntityError as ar, type WebhookLog as as, WebhookLogs as at, WebhookVerificationError as au, Webhooks as av, APIConnectionError as b, APIError as c, APIResponseValidationError as d, APIStatusError as e, APITimeoutError as f, AccountContext as g, AgentConnectionError as h, AgentError as i, type AssignmentLink as j, type AssignmentLinkAssignment as k, type AssignmentLinkCreateResponse as l, type AssignmentLinkStatus as m, AssignmentLinks as n, AuthenticationError as o, type BlockedChannel as p, type BlockedRecipient as q, type BlockedRecipientSource as r, type BlockedRecipientStatus as s, BlockedRecipients as t, type BrandBubbleType as u, type BrandMessageCreateParams as v, type BrandSendParams as w, type CallContextParam as x, type CallControlResponse as y, type CallCreateParams as z };
|