@teamlearners/clawops 0.30.0 → 0.32.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/dist/agent/index.cjs +143 -74
- package/dist/agent/index.cjs.map +1 -1
- package/dist/agent/index.d.cts +15 -2
- package/dist/agent/index.d.ts +15 -2
- package/dist/agent/index.js +73 -4
- package/dist/agent/index.js.map +1 -1
- package/dist/agent/livekit/index.cjs +8 -8
- package/dist/agent/livekit/index.d.cts +1 -1
- package/dist/agent/livekit/index.d.ts +1 -1
- package/dist/agent/livekit/index.js +1 -1
- package/dist/{base-Cje1TDJi.d.cts → base-B6S9WQRN.d.cts} +21 -0
- package/dist/{base-Cje1TDJi.d.ts → base-B6S9WQRN.d.ts} +21 -0
- package/dist/{chunk-WKGTY7QT.js → chunk-4YLSDMLL.js} +10 -4
- package/dist/chunk-4YLSDMLL.js.map +1 -0
- package/dist/{chunk-IGFGK3XZ.cjs → chunk-HKXRJRAW.cjs} +3 -3
- package/dist/{chunk-IGFGK3XZ.cjs.map → chunk-HKXRJRAW.cjs.map} +1 -1
- package/dist/{chunk-622J6BJ5.js → chunk-MXJ2LM6R.js} +3 -3
- package/dist/{chunk-622J6BJ5.js.map → chunk-MXJ2LM6R.js.map} +1 -1
- package/dist/{chunk-XAOA3XFQ.cjs → chunk-QD2ZY4UP.cjs} +10 -4
- package/dist/chunk-QD2ZY4UP.cjs.map +1 -0
- package/dist/index.cjs +35 -35
- package/dist/index.js +2 -2
- package/package.json +1 -1
- package/dist/chunk-WKGTY7QT.js.map +0 -1
- package/dist/chunk-XAOA3XFQ.cjs.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkQD2ZY4UP_cjs = require('../../chunk-QD2ZY4UP.cjs');
|
|
4
4
|
|
|
5
5
|
// src/agent/livekit/io.ts
|
|
6
6
|
var SAMPLE_RATE = 8e3;
|
|
@@ -62,7 +62,7 @@ async function loadClawOpsIO() {
|
|
|
62
62
|
if (this._closed || !this._controller || ulaw.length === 0) return;
|
|
63
63
|
const samples = new Int16Array(ulaw.length);
|
|
64
64
|
for (let i = 0; i < ulaw.length; i++) {
|
|
65
|
-
samples[i] =
|
|
65
|
+
samples[i] = chunkQD2ZY4UP_cjs.DECODE_TABLE[ulaw[i]];
|
|
66
66
|
}
|
|
67
67
|
const frame = new AudioFrame(samples, SAMPLE_RATE, 1, samples.length);
|
|
68
68
|
try {
|
|
@@ -131,7 +131,7 @@ async function loadClawOpsIO() {
|
|
|
131
131
|
}
|
|
132
132
|
this._pushedDurationMs += frame.samplesPerChannel / frame.sampleRate * 1e3;
|
|
133
133
|
const pcm = Buffer.from(frame.data.buffer, frame.data.byteOffset, frame.data.byteLength);
|
|
134
|
-
const encoded =
|
|
134
|
+
const encoded = chunkQD2ZY4UP_cjs.pcm16ToUlaw(pcm);
|
|
135
135
|
const ulaw = this._tail.length === 0 ? encoded : Buffer.concat([this._tail, encoded]);
|
|
136
136
|
let off = 0;
|
|
137
137
|
while (off + FRAME_BYTES <= ulaw.length) {
|
|
@@ -242,7 +242,7 @@ function createClawOpsPhoneTools(llm, options) {
|
|
|
242
242
|
};
|
|
243
243
|
const exclude = options.excludeNames ?? /* @__PURE__ */ new Set();
|
|
244
244
|
const ignoreFlag = llm.ToolFlag?.IGNORE_ON_ENTER;
|
|
245
|
-
const schemas =
|
|
245
|
+
const schemas = chunkQD2ZY4UP_cjs.getBuiltinToolSchemas(options.enabled, "chat");
|
|
246
246
|
const tools = [];
|
|
247
247
|
for (const schema of schemas) {
|
|
248
248
|
const { name, description, parameters } = schema.function;
|
|
@@ -255,7 +255,7 @@ function createClawOpsPhoneTools(llm, options) {
|
|
|
255
255
|
// raw JSON schema (agents-js 가 JSONSchema7 을 그대로 받는다).
|
|
256
256
|
flags: IGNORE_ON_ENTER_TOOLS.has(name) ? ignoreFlag : void 0,
|
|
257
257
|
// raw schema tool 의 execute 는 파싱된 args 를 그대로 받는다.
|
|
258
|
-
execute: async (args) => await
|
|
258
|
+
execute: async (args) => await chunkQD2ZY4UP_cjs.executeBuiltinTool(name, args ?? {}, requireCall()) ?? ""
|
|
259
259
|
})
|
|
260
260
|
);
|
|
261
261
|
}
|
|
@@ -284,7 +284,7 @@ var LiveKitSession = class {
|
|
|
284
284
|
_userToolCtx = null;
|
|
285
285
|
_toolRegistry = null;
|
|
286
286
|
_builtinTools = null;
|
|
287
|
-
_log =
|
|
287
|
+
_log = chunkQD2ZY4UP_cjs.NOOP_LOGGER;
|
|
288
288
|
// 동적 로드한 agents-js 네임스페이스 (boot 시 캐시).
|
|
289
289
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
290
290
|
_llm = null;
|
|
@@ -322,7 +322,7 @@ var LiveKitSession = class {
|
|
|
322
322
|
this._output.setCall(callSession);
|
|
323
323
|
this._target = callSession;
|
|
324
324
|
await this._applyTools(callSession);
|
|
325
|
-
|
|
325
|
+
chunkQD2ZY4UP_cjs.attachBuffered(prev, callSession);
|
|
326
326
|
}
|
|
327
327
|
feedAudio(audio, _timestamp) {
|
|
328
328
|
this._input?.pushUlaw(audio);
|
|
@@ -348,7 +348,7 @@ var LiveKitSession = class {
|
|
|
348
348
|
]);
|
|
349
349
|
this._llm = agents.llm;
|
|
350
350
|
const { ClawOpsAudioInput, ClawOpsAudioOutput } = io;
|
|
351
|
-
const target = call ?? new
|
|
351
|
+
const target = call ?? new chunkQD2ZY4UP_cjs.BufferingCall();
|
|
352
352
|
const [session, agent] = await this._create(call);
|
|
353
353
|
this._validate(session, agent);
|
|
354
354
|
const input = new ClawOpsAudioInput();
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Logger } from 'pino';
|
|
2
|
-
import { C as CallSession, S as Session, b as ToolRegistry, B as BuiltinTool, c as SessionTelemetry } from '../../base-
|
|
2
|
+
import { C as CallSession, S as Session, b as ToolRegistry, B as BuiltinTool, c as SessionTelemetry } from '../../base-B6S9WQRN.cjs';
|
|
3
3
|
import 'zod';
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Logger } from 'pino';
|
|
2
|
-
import { C as CallSession, S as Session, b as ToolRegistry, B as BuiltinTool, c as SessionTelemetry } from '../../base-
|
|
2
|
+
import { C as CallSession, S as Session, b as ToolRegistry, B as BuiltinTool, c as SessionTelemetry } from '../../base-B6S9WQRN.js';
|
|
3
3
|
import 'zod';
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getBuiltinToolSchemas, executeBuiltinTool, NOOP_LOGGER, attachBuffered, BufferingCall, pcm16ToUlaw, DECODE_TABLE } from '../../chunk-
|
|
1
|
+
import { getBuiltinToolSchemas, executeBuiltinTool, NOOP_LOGGER, attachBuffered, BufferingCall, pcm16ToUlaw, DECODE_TABLE } from '../../chunk-4YLSDMLL.js';
|
|
2
2
|
|
|
3
3
|
// src/agent/livekit/io.ts
|
|
4
4
|
var SAMPLE_RATE = 8e3;
|
|
@@ -130,6 +130,7 @@ declare class CallSession {
|
|
|
130
130
|
readonly metadata: Record<string, unknown>;
|
|
131
131
|
private _status;
|
|
132
132
|
private _endedStatus;
|
|
133
|
+
private _endedDuration;
|
|
133
134
|
private _sendAudioFn;
|
|
134
135
|
private _clearAudioFn;
|
|
135
136
|
private _hangupFn;
|
|
@@ -172,7 +173,16 @@ declare class CallSession {
|
|
|
172
173
|
* 이 값이나 `call_failed` 이벤트로 판단한다.
|
|
173
174
|
*/
|
|
174
175
|
get endedStatus(): string | null;
|
|
176
|
+
/**
|
|
177
|
+
* 서버가 확정한 통화 시간(초). 통화가 끝나기 전에는 `null`.
|
|
178
|
+
*
|
|
179
|
+
* ⚠️ `duration` 과 다르다 — 그쪽은 SDK 가 로컬 시계로 재는 **경과 시간**이라 통화 중에도
|
|
180
|
+
* 읽히고, 세션이 붙기 전후의 오차를 포함한다. 기록·정산에 쓸 값은 이쪽이다.
|
|
181
|
+
*/
|
|
182
|
+
get endedDuration(): number | null;
|
|
175
183
|
get duration(): number;
|
|
184
|
+
/** @internal 서버가 통보한 통화 시간을 확정한다. */
|
|
185
|
+
_setEndedDuration(seconds: number): void;
|
|
176
186
|
get metrics(): Readonly<CallMetrics>;
|
|
177
187
|
recordFirstResponse(): void;
|
|
178
188
|
recordTurn(): void;
|
|
@@ -207,6 +217,16 @@ declare class CallSession {
|
|
|
207
217
|
* directly to a SIP endpoint without going through the PSTN carrier. Requires the
|
|
208
218
|
* account to have an active `sip_trunk` add-on; otherwise the transfer fails and
|
|
209
219
|
* the call continues with the AI (result `{ status: 'failed', ... }`).
|
|
220
|
+
*
|
|
221
|
+
* 전환받는 쪽에 표시되는 발신번호는 기본이 **계정 보유번호**(인바운드면 착신 070)다.
|
|
222
|
+
*
|
|
223
|
+
* `callerIdMode: 'original'` 은 인바운드 통화의 **원 발신자 번호를 승계하려는 선호**다.
|
|
224
|
+
* 승계할 수 없는 통화(KCT 직결 인입이 아니거나 국내 번호로 정규화되지 않는 발신번호)면
|
|
225
|
+
* 조용히 계정 보유번호로 내려앉고 **전환은 그대로 성사된다**.
|
|
226
|
+
*
|
|
227
|
+
* `callerId` 는 번호를 직접 주는 **지시**라 성격이 다르다. 허용 범위(계정 보유번호 또는
|
|
228
|
+
* KCT 직결 인입의 원 발신자)를 벗어나면 전환 자체가 실패한다. 둘 다 주면 `callerId` 가
|
|
229
|
+
* 이기고 `callerIdMode` 는 무시된다 — 우선순위 판단은 서버가 한다.
|
|
210
230
|
*/
|
|
211
231
|
transfer(to: string, options?: {
|
|
212
232
|
destinationType?: 'pstn' | 'sip';
|
|
@@ -216,6 +236,7 @@ declare class CallSession {
|
|
|
216
236
|
whisper?: string;
|
|
217
237
|
context?: Record<string, unknown>;
|
|
218
238
|
callerId?: string;
|
|
239
|
+
callerIdMode?: 'account' | 'original';
|
|
219
240
|
timeout?: number;
|
|
220
241
|
}): Promise<Record<string, unknown>>;
|
|
221
242
|
/** Register an event handler. */
|
|
@@ -130,6 +130,7 @@ declare class CallSession {
|
|
|
130
130
|
readonly metadata: Record<string, unknown>;
|
|
131
131
|
private _status;
|
|
132
132
|
private _endedStatus;
|
|
133
|
+
private _endedDuration;
|
|
133
134
|
private _sendAudioFn;
|
|
134
135
|
private _clearAudioFn;
|
|
135
136
|
private _hangupFn;
|
|
@@ -172,7 +173,16 @@ declare class CallSession {
|
|
|
172
173
|
* 이 값이나 `call_failed` 이벤트로 판단한다.
|
|
173
174
|
*/
|
|
174
175
|
get endedStatus(): string | null;
|
|
176
|
+
/**
|
|
177
|
+
* 서버가 확정한 통화 시간(초). 통화가 끝나기 전에는 `null`.
|
|
178
|
+
*
|
|
179
|
+
* ⚠️ `duration` 과 다르다 — 그쪽은 SDK 가 로컬 시계로 재는 **경과 시간**이라 통화 중에도
|
|
180
|
+
* 읽히고, 세션이 붙기 전후의 오차를 포함한다. 기록·정산에 쓸 값은 이쪽이다.
|
|
181
|
+
*/
|
|
182
|
+
get endedDuration(): number | null;
|
|
175
183
|
get duration(): number;
|
|
184
|
+
/** @internal 서버가 통보한 통화 시간을 확정한다. */
|
|
185
|
+
_setEndedDuration(seconds: number): void;
|
|
176
186
|
get metrics(): Readonly<CallMetrics>;
|
|
177
187
|
recordFirstResponse(): void;
|
|
178
188
|
recordTurn(): void;
|
|
@@ -207,6 +217,16 @@ declare class CallSession {
|
|
|
207
217
|
* directly to a SIP endpoint without going through the PSTN carrier. Requires the
|
|
208
218
|
* account to have an active `sip_trunk` add-on; otherwise the transfer fails and
|
|
209
219
|
* the call continues with the AI (result `{ status: 'failed', ... }`).
|
|
220
|
+
*
|
|
221
|
+
* 전환받는 쪽에 표시되는 발신번호는 기본이 **계정 보유번호**(인바운드면 착신 070)다.
|
|
222
|
+
*
|
|
223
|
+
* `callerIdMode: 'original'` 은 인바운드 통화의 **원 발신자 번호를 승계하려는 선호**다.
|
|
224
|
+
* 승계할 수 없는 통화(KCT 직결 인입이 아니거나 국내 번호로 정규화되지 않는 발신번호)면
|
|
225
|
+
* 조용히 계정 보유번호로 내려앉고 **전환은 그대로 성사된다**.
|
|
226
|
+
*
|
|
227
|
+
* `callerId` 는 번호를 직접 주는 **지시**라 성격이 다르다. 허용 범위(계정 보유번호 또는
|
|
228
|
+
* KCT 직결 인입의 원 발신자)를 벗어나면 전환 자체가 실패한다. 둘 다 주면 `callerId` 가
|
|
229
|
+
* 이기고 `callerIdMode` 는 무시된다 — 우선순위 판단은 서버가 한다.
|
|
210
230
|
*/
|
|
211
231
|
transfer(to: string, options?: {
|
|
212
232
|
destinationType?: 'pstn' | 'sip';
|
|
@@ -216,6 +236,7 @@ declare class CallSession {
|
|
|
216
236
|
whisper?: string;
|
|
217
237
|
context?: Record<string, unknown>;
|
|
218
238
|
callerId?: string;
|
|
239
|
+
callerIdMode?: 'account' | 'original';
|
|
219
240
|
timeout?: number;
|
|
220
241
|
}): Promise<Record<string, unknown>>;
|
|
221
242
|
/** Register an event handler. */
|
|
@@ -380,6 +380,7 @@ function resolveBuiltinTools(value) {
|
|
|
380
380
|
}
|
|
381
381
|
|
|
382
382
|
// src/agent/pipeline/builtin-tool-schemas.ts
|
|
383
|
+
var log = createAgentLogger();
|
|
383
384
|
var HANG_UP = {
|
|
384
385
|
name: "hang_up",
|
|
385
386
|
description: "End the phone call. Use when the conversation is finished or the caller says goodbye.",
|
|
@@ -423,7 +424,8 @@ var TRANSFER_CALL = {
|
|
|
423
424
|
mode: { type: "string", enum: ["blind", "warm"], description: "blind: direct transfer (default), warm: play whisper to target first" },
|
|
424
425
|
after_transfer: { type: "string", enum: ["terminate", "return"], description: "terminate: end AI session (default), return: AI resumes after transfer ends" },
|
|
425
426
|
whisper: { type: "string", description: "Message to speak to transfer target before connecting customer (warm mode only)" },
|
|
426
|
-
|
|
427
|
+
caller_id_mode: { type: "string", 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." },
|
|
428
|
+
caller_id: { type: "string", 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 \u2014 use caller_id_mode unless a specific number is required." },
|
|
427
429
|
timeout: { type: "integer", description: "Seconds to wait for transfer target to answer (default 30)" }
|
|
428
430
|
},
|
|
429
431
|
required: ["to"]
|
|
@@ -515,8 +517,12 @@ async function executeBuiltinTool(funcName, args, call) {
|
|
|
515
517
|
afterTransfer: args["after_transfer"] ?? void 0,
|
|
516
518
|
whisper: args["whisper"] ?? void 0,
|
|
517
519
|
callerId: args["caller_id"] ?? void 0,
|
|
520
|
+
callerIdMode: args["caller_id_mode"] ?? void 0,
|
|
518
521
|
timeout: args["timeout"] ?? void 0
|
|
519
|
-
|
|
522
|
+
// 결과를 안 기다리므로 실패가 통째로 조용하다 — 모델은 "시작됨" 을 받고, 예외는
|
|
523
|
+
// 프로미스 안에 갇힌다. 최소한 로그에는 남긴다.
|
|
524
|
+
}).catch((e) => {
|
|
525
|
+
log.error({ err: e }, "transfer_call \uB3C4\uAD6C\uAC00 \uAC74 \uC804\uD658\uC774 \uC2E4\uD328\uD588\uB2E4");
|
|
520
526
|
});
|
|
521
527
|
return JSON.stringify({ status: "transfer_initiated" });
|
|
522
528
|
} catch (e) {
|
|
@@ -607,5 +613,5 @@ function attachBuffered(prev, next) {
|
|
|
607
613
|
}
|
|
608
614
|
|
|
609
615
|
export { BUILTIN_TOOL_NAMES, BufferingCall, BuiltinTool, CALL_NOT_READY_RESULT, DECODE_TABLE, NOOP_LOGGER, applyUlawGain, attachBuffered, createAgentLogger, createPipelineLogger, executeBuiltinTool, getBuiltinToolSchemas, isBuiltinTool, pcm16ToUlaw, resamplePcm16, resolveBuiltinTools, ulawToPcm16 };
|
|
610
|
-
//# sourceMappingURL=chunk-
|
|
611
|
-
//# sourceMappingURL=chunk-
|
|
616
|
+
//# sourceMappingURL=chunk-4YLSDMLL.js.map
|
|
617
|
+
//# sourceMappingURL=chunk-4YLSDMLL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/agent/audio.ts","../src/agent/logger.ts","../src/agent/builtin-tool.ts","../src/agent/pipeline/builtin-tool-schemas.ts","../src/agent/pipeline/buffering-call.ts"],"names":["BuiltinTool"],"mappings":";;;AAIA,IAAM,KAAA,GAAQ,GAAA;AACd,IAAM,KAAA,GAAQ,KAAA;AAGd,IAAM,YAAA,GAAkC;AAAA,EACtC,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxD,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxD,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxD,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAS,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxD,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxD,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxD,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxD,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxD,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxD,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAS,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,EAAS,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,EAAS,EAAA;AAAA,EAAS,CAAA;AAAA,EAC5D,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxD,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxD,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxD,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAS,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAS,GAAA;AAAA,EAAQ,GAAA;AAAA,EACxD,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EACxD,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EACxD,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;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,EAAS,EAAA;AAAA,EAAQ,EAAA;AAAA,EAAQ,EAAA;AAAA,EAAQ,EAAA;AAAA,EAAQ,EAAA;AAAA,EACxD,EAAA;AAAA,EAAQ,EAAA;AAAA,EAAQ,EAAA;AAAA,EAAQ,EAAA;AAAA,EAAQ,EAAA;AAAA,EAAQ,EAAA;AAAA,EAAS,CAAA;AAAA,EAAQ;AAC/D;AAEA,SAAS,iBAAiB,MAAA,EAAwB;AAChD,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,SAAS,CAAA,EAAG;AACd,IAAA,IAAA,GAAO,GAAA;AACP,IAAA,MAAA,GAAS,CAAC,MAAA;AAAA,EACZ;AACA,EAAA,IAAI,SAAS,KAAA,EAAO;AAClB,IAAA,MAAA,GAAS,KAAA;AAAA,EACX;AACA,EAAA,MAAA,IAAU,KAAA;AAEV,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,MAAM,SAAA,GAAY,CAAC,KAAA,EAAQ,IAAA,EAAQ,MAAQ,IAAA,EAAQ,IAAA,EAAQ,KAAQ,GAAM,CAAA;AACzE,EAAA,KAAA,MAAW,UAAU,SAAA,EAAW;AAC9B,IAAA,IAAI,UAAU,MAAA,EAAQ;AACpB,MAAA;AAAA,IACF;AACA,IAAA,QAAA,IAAY,CAAA;AAAA,EACd;AAEA,EAAA,MAAM,QAAA,GAAY,MAAA,IAAW,QAAA,GAAW,CAAA,GAAM,EAAA;AAC9C,EAAA,OAAO,EAAE,IAAA,GAAQ,QAAA,IAAY,CAAA,GAAK,QAAA,CAAA,GAAY,GAAA;AAChD;AAKO,SAAS,YAAY,GAAA,EAAqB;AAC/C,EAAA,IAAI,CAAC,GAAA,CAAI,MAAA,EAAQ,OAAO,MAAA,CAAO,MAAM,CAAC,CAAA;AACtC,EAAA,MAAM,QAAA,GAAW,IAAI,MAAA,IAAU,CAAA;AAC/B,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA;AACjC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,EAAU,CAAA,EAAA,EAAK;AACjC,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,WAAA,CAAY,CAAA,GAAI,CAAC,CAAA;AACpC,IAAA,GAAA,CAAI,CAAC,CAAA,GAAI,gBAAA,CAAiB,MAAM,CAAA;AAAA,EAClC;AACA,EAAA,OAAO,GAAA;AACT;AAKO,SAAS,YAAY,IAAA,EAAsB;AAChD,EAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAQ,OAAO,MAAA,CAAO,MAAM,CAAC,CAAA;AACvC,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,SAAS,CAAC,CAAA;AACxC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,GAAA,CAAI,aAAa,YAAA,CAAa,IAAA,CAAK,CAAC,CAAE,CAAA,EAAI,IAAI,CAAC,CAAA;AAAA,EACjD;AACA,EAAA,OAAO,GAAA;AACT;AAMO,SAAS,cAAA,CAAe,KAAa,IAAA,EAAsB;AAChE,EAAA,IAAI,CAAC,GAAA,CAAI,MAAA,EAAQ,OAAO,MAAA,CAAO,MAAM,CAAC,CAAA;AACtC,EAAA,IAAI,IAAA,KAAS,GAAK,OAAO,GAAA;AACzB,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,IAAK,OAAO,CAAA,EAAG;AACtC,IAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,EACrD;AACA,EAAA,MAAM,QAAA,GAAW,IAAI,MAAA,IAAU,CAAA;AAC/B,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,KAAA,CAAM,QAAA,GAAW,CAAC,CAAA;AACrC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,EAAU,CAAA,EAAA,EAAK;AACjC,IAAA,IAAI,KAAA,GAAQ,KAAK,KAAA,CAAM,GAAA,CAAI,YAAY,CAAA,GAAI,CAAC,IAAI,IAAI,CAAA;AACpD,IAAA,IAAI,KAAA,GAAQ,OAAO,KAAA,GAAQ,KAAA;AAAA,SAAA,IAClB,KAAA,GAAQ,QAAQ,KAAA,GAAQ,MAAA;AACjC,IAAA,GAAA,CAAI,YAAA,CAAa,KAAA,EAAO,CAAA,GAAI,CAAC,CAAA;AAAA,EAC/B;AACA,EAAA,OAAO,GAAA;AACT;AAKO,SAAS,aAAA,CAAc,MAAc,IAAA,EAAsB;AAChE,EAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAQ,OAAO,MAAA,CAAO,MAAM,CAAC,CAAA;AACvC,EAAA,IAAI,IAAA,KAAS,GAAK,OAAO,IAAA;AACzB,EAAA,OAAO,YAAY,cAAA,CAAe,WAAA,CAAY,IAAI,CAAA,EAAG,IAAI,CAAC,CAAA;AAC5D;AAKO,SAAS,aAAA,CAAc,GAAA,EAAa,QAAA,EAAkB,MAAA,EAAwB;AACnF,EAAA,IAAI,QAAA,KAAa,MAAA,IAAU,CAAC,GAAA,CAAI,QAAQ,OAAO,GAAA;AAE/C,EAAA,MAAM,QAAA,GAAW,IAAI,MAAA,IAAU,CAAA;AAC/B,EAAA,MAAM,QAAQ,QAAA,GAAW,MAAA;AACzB,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,KAAK,CAAA;AAC1C,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AAEnC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,EAAQ,CAAA,EAAA,EAAK;AAC/B,IAAA,MAAM,SAAS,CAAA,GAAI,KAAA;AACnB,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAC7B,IAAA,MAAM,OAAO,MAAA,GAAS,GAAA;AAEtB,IAAA,IAAI,GAAA;AACJ,IAAA,IAAI,GAAA,GAAM,IAAI,QAAA,EAAU;AACtB,MAAA,GAAA,GAAM,GAAA,CAAI,WAAA,CAAY,GAAA,GAAM,CAAC,CAAA,IAAK,CAAA,GAAI,IAAA,CAAA,GAAQ,GAAA,CAAI,WAAA,CAAA,CAAa,GAAA,GAAM,CAAA,IAAK,CAAC,CAAA,GAAI,IAAA;AAAA,IACjF,CAAA,MAAO;AACL,MAAA,GAAA,GAAM,GAAA,CAAI,WAAA,CAAY,GAAA,GAAM,CAAC,CAAA;AAAA,IAC/B;AACA,IAAA,GAAA,CAAI,aAAa,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,EAAG,IAAI,CAAC,CAAA;AAAA,EACzC;AAEA,EAAA,OAAO,GAAA;AACT;AC1IA,IAAM,cAAA,GAAiB,IAAA,CAAK,EAAE,IAAA,EAAM,iBAAiB,CAAA;AAG9C,IAAM,WAAA,GAAc,IAAA,CAAK,EAAE,KAAA,EAAO,UAAU;AAM5C,SAAS,kBAAkB,UAAA,EAA6B;AAC7D,EAAA,OAAO,UAAA,IAAc,cAAA;AACvB;AAMO,SAAS,qBAAqB,MAAA,EAAwB;AAC3D,EAAA,OAAO,MAAA,CAAO,KAAA,CAAM,EAAE,MAAA,EAAQ,YAAY,CAAA;AAC5C;;;AC1BO,IAAK,WAAA,qBAAAA,YAAAA,KAAL;AAEL,EAAAA,aAAA,SAAA,CAAA,GAAU,SAAA;AAEV,EAAAA,aAAA,cAAA,CAAA,GAAe,cAAA;AAEf,EAAAA,aAAA,WAAA,CAAA,GAAY,WAAA;AAEZ,EAAAA,aAAA,eAAA,CAAA,GAAgB,eAAA;AAGhB,EAAAA,aAAA,KAAA,CAAA,GAAM,KAAA;AAEN,EAAAA,aAAA,MAAA,CAAA,GAAO,MAAA;AAbG,EAAA,OAAAA,YAAAA;AAAA,CAAA,EAAA,WAAA,IAAA,EAAA;AAgBZ,IAAM,gBAAA,uBAAuB,GAAA,CAAI;AAAA,EAC/B,SAAA;AAAA,EACA,cAAA;AAAA,EACA,WAAA;AAAA,EACA,eAAA;AACF,CAAC,CAAA;AAEM,SAAS,oBACd,KAAA,EACkB;AAClB,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,IAAI,UAAU,KAAA,YAAiB;AAC7B,MAAA,OAAO,IAAI,IAAI,gBAAgB,CAAA;AAAA,IACjC;AACA,IAAA,IAAI,UAAU,MAAA,aAAkB;AAC9B,MAAA,2BAAW,GAAA,EAAI;AAAA,IACjB;AACA,IAAA,uBAAO,IAAI,GAAA,CAAI,CAAC,KAAK,CAAC,CAAA;AAAA,EACxB;AACA,EAAA,OAAO,IAAI,GAAA,CAAI,KAAA,CAAM,MAAA,CAAO,CAAC,MAAM,gBAAA,CAAiB,GAAA,CAAI,CAAC,CAAC,CAAC,CAAA;AAC7D;;;AC7BA,IAAM,MAAM,iBAAA,EAAkB;AAI9B,IAAM,OAAA,GAAU;AAAA,EACd,IAAA,EAAM,SAAA;AAAA,EACN,WAAA,EACE,uFAAA;AAAA,EACF,YAAY,EAAE,IAAA,EAAM,QAAA,EAAmB,UAAA,EAAY,EAAC;AACtD,CAAA;AAEA,IAAM,YAAA,GAAe;AAAA,EACnB,IAAA,EAAM,cAAA;AAAA,EACN,WAAA,EACE,0SAAA;AAAA,EACF,UAAA,EAAY;AAAA,IACV,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,UAAA,EAAY,EAAE,IAAA,EAAM,SAAA,EAAoB,aAAa,oDAAA,EAAa;AAAA,MAClE,aAAA,EAAe,EAAE,IAAA,EAAM,QAAA,EAAmB,aAAa,oDAAA,EAAkB;AAAA,MACzE,OAAA,EAAS,EAAE,IAAA,EAAM,SAAA,EAAoB,aAAa,iEAAA;AAAqB,KACzE;AAAA,IACA,QAAA,EAAU,CAAC,YAAY;AAAA;AAE3B,CAAA;AAEA,IAAM,SAAA,GAAY;AAAA,EAChB,IAAA,EAAM,WAAA;AAAA,EACN,WAAA,EAAa,gLAAA;AAAA,EACb,UAAA,EAAY;AAAA,IACV,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EACE;AAAA;AACJ,KACF;AAAA,IACA,QAAA,EAAU,CAAC,QAAQ;AAAA;AAEvB,CAAA;AAEA,IAAM,aAAA,GAAgB;AAAA,EACpB,IAAA,EAAM,eAAA;AAAA,EACN,WAAA,EACE,mKAAA;AAAA,EACF,UAAA,EAAY;AAAA,IACV,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,EAAA,EAAI,EAAE,IAAA,EAAM,QAAA,EAAmB,aAAa,2IAAA,EAA4I;AAAA,MACxL,gBAAA,EAAkB,EAAE,IAAA,EAAM,QAAA,EAAmB,IAAA,EAAM,CAAC,MAAA,EAAQ,KAAK,CAAA,EAAG,WAAA,EAAa,6GAAA,EAA8G;AAAA,MAC/L,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAmB,IAAA,EAAM,CAAC,OAAA,EAAS,MAAM,CAAA,EAAG,WAAA,EAAa,sEAAA,EAAuE;AAAA,MAC9I,cAAA,EAAgB,EAAE,IAAA,EAAM,QAAA,EAAmB,IAAA,EAAM,CAAC,WAAA,EAAa,QAAQ,CAAA,EAAG,WAAA,EAAa,6EAAA,EAA8E;AAAA,MACrK,OAAA,EAAS,EAAE,IAAA,EAAM,QAAA,EAAmB,aAAa,iFAAA,EAAkF;AAAA,MACnI,cAAA,EAAgB,EAAE,IAAA,EAAM,QAAA,EAAmB,IAAA,EAAM,CAAC,SAAA,EAAW,UAAU,CAAA,EAAG,WAAA,EAAa,qOAAA,EAAsO;AAAA,MAC7T,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAmB,aAAa,oNAAA,EAAgN;AAAA,MACnQ,OAAA,EAAS,EAAE,IAAA,EAAM,SAAA,EAAoB,aAAa,4DAAA;AAA6D,KACjH;AAAA,IACA,QAAA,EAAU,CAAC,IAAI;AAAA;AAEnB,CAAA;AAIA,IAAM,QAAA,uBAAe,GAAA,CAAgC;AAAA,EACnD,0BAAsB,OAAO,CAAA;AAAA,EAC7B,oCAA2B,YAAY,CAAA;AAAA,EACvC,8BAAwB,SAAS,CAAA;AAAA,EACjC,sCAA4B,aAAa;AAC3C,CAAC,CAAA;AAEM,IAAM,qBAAkC,IAAI,GAAA;AAAA,EACjD,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,EAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI;AACjD;AAGO,IAAM,qBAAA,GACX;AAIF,SAAS,kBAAkB,MAAA,EAAgD;AACzE,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,UAAA;AAAA,IACN,QAAA,EAAU;AAAA,MACR,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,YAAY,MAAA,CAAO;AAAA;AACrB,GACF;AACF;AAEA,SAAS,WAAW,MAAA,EAAgD;AAClE,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,UAAA;AAAA,IACN,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,aAAa,MAAA,CAAO,WAAA;AAAA,IACpB,YAAY,MAAA,CAAO;AAAA,GACrB;AACF;AAEA,SAAS,SAAS,MAAA,EAAgD;AAChE,EAAA,OAAO;AAAA,IACL,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,aAAa,MAAA,CAAO,WAAA;AAAA,IACpB,YAAY,MAAA,CAAO;AAAA,GACrB;AACF;AAEA,IAAM,UAAA,GAAa;AAAA,EACjB,IAAA,EAAM,iBAAA;AAAA,EACN,QAAA,EAAU,UAAA;AAAA,EACV,MAAA,EAAQ;AACV,CAAA;AAKO,SAAS,qBAAA,CACd,cACA,GAAA,EACgC;AAChC,EAAA,MAAM,SAAA,GAAY,WAAW,GAAG,CAAA;AAChC,EAAA,MAAM,SAAyC,EAAC;AAChD,EAAA,KAAA,MAAW,CAAC,QAAA,EAAU,MAAM,CAAA,IAAK,QAAA,EAAU;AACzC,IAAA,IAAI,YAAA,KAAiB,IAAA,IAAQ,YAAA,CAAa,GAAA,CAAI,QAAQ,CAAA,EAAG;AACvD,MAAA,MAAA,CAAO,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA;AAAA,IAC/B;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAUO,SAAS,cAAc,IAAA,EAAuB;AACnD,EAAA,OAAO,kBAAA,CAAmB,IAAI,IAAI,CAAA;AACpC;AAEA,eAAsB,kBAAA,CACpB,QAAA,EACA,IAAA,EACA,IAAA,EACwB;AACxB,EAAA,IAAI,aAAa,SAAA,EAAW;AAC1B,IAAA,MAAM,KAAK,MAAA,EAAO;AAClB,IAAA,OAAO,EAAA;AAAA,EACT;AACA,EAAA,IAAI,aAAa,cAAA,EAAgB;AAC/B,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,WAAA,CAAY;AAAA,QACpC,SAAA,EAAY,IAAA,CAAK,YAAY,CAAA,IAAgB,CAAA;AAAA,QAC7C,WAAA,EAAc,IAAA,CAAK,eAAe,CAAA,IAAgB,GAAA;AAAA,QAClD,OAAA,EAAU,IAAA,CAAK,SAAS,CAAA,IAAgB;AAAA,OACzC,CAAA;AACD,MAAA,OAAO,MAAA,IAAU,wDAAA;AAAA,IACnB,SAAS,CAAA,EAAG;AACV,MAAA,OAAO,UAAU,CAAC,CAAA,CAAA;AAAA,IACpB;AAAA,EACF;AACA,EAAA,IAAI,aAAa,WAAA,EAAa;AAC5B,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,gBAAA,CAAkB,IAAA,CAAK,QAAQ,KAAgB,EAAE,CAAA;AAC5D,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,CAAA,EAAG;AACV,MAAA,OAAO,UAAU,CAAC,CAAA,CAAA;AAAA,IACpB;AAAA,EACF;AACA,EAAA,IAAI,aAAa,eAAA,EAAiB;AAChC,IAAA,IAAI;AAIF,MAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA,EAAa;AAAA,QAClC,eAAA,EAAkB,IAAA,CAAK,kBAAkB,CAAA,IAAwB,KAAA,CAAA;AAAA,QACjE,IAAA,EAAO,IAAA,CAAK,MAAM,CAAA,IAA0B,KAAA,CAAA;AAAA,QAC5C,aAAA,EAAgB,IAAA,CAAK,gBAAgB,CAAA,IAAgC,KAAA,CAAA;AAAA,QACrE,OAAA,EAAS,IAAA,CAAK,SAAS,CAAA,IAAe,KAAA,CAAA;AAAA,QACtC,QAAA,EAAU,IAAA,CAAK,WAAW,CAAA,IAAe,KAAA,CAAA;AAAA,QACzC,YAAA,EAAe,IAAA,CAAK,gBAAgB,CAAA,IAAgC,KAAA,CAAA;AAAA,QACpE,OAAA,EAAS,IAAA,CAAK,SAAS,CAAA,IAAe,KAAA;AAAA;AAAA;AAAA,OAGvC,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,KAAe;AACvB,QAAA,GAAA,CAAI,KAAA,CAAM,EAAE,GAAA,EAAK,CAAA,IAAK,qFAA8B,CAAA;AAAA,MACtD,CAAC,CAAA;AACD,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,EAAE,MAAA,EAAQ,sBAAsB,CAAA;AAAA,IACxD,SAAS,CAAA,EAAG;AACV,MAAA,OAAO,UAAU,CAAC,CAAA,CAAA;AAAA,IACpB;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;;;ACrMA,IAAM,cAAN,MAAkB;AAAA,EAChB,cAAA,GAAuB;AAAA,EAAC;AAAA,EACxB,eAAA,GAAwB;AAAA,EAAC;AAAA,EACzB,eAAA,GAAwB;AAAA,EAAC;AAC3B,CAAA;AAEO,IAAM,gBAAN,MAAoB;AAAA,EACjB,UAAoB,EAAC;AAAA,EACrB,iBAAyC,EAAC;AAAA,EACzC,OAAA,GAAU,IAAI,WAAA,EAAY;AAAA,EAEnC,MAAM,UAAU,KAAA,EAA8B;AAC5C,IAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAA,EACzB;AAAA;AAAA,EAGA,UAAA,GAAmB;AACjB,IAAA,IAAA,CAAK,UAAU,EAAC;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS,IAAA,EAAuB;AAC9B,IAAA,IAAA,CAAK,eAAe,IAAI,CAAA;AAAA,EAC1B;AAAA,EAEA,MAAM,QAAQ,IAAA,EAAgC;AAC5C,IAAA,IAAA,CAAK,eAAe,IAAI,CAAA;AAAA,EAC1B;AAAA,EAEQ,eAAe,IAAA,EAAuB;AAC5C,IAAA,IAAI,SAAA,GAAY,GAAA;AAChB,IAAA,IAAI,KAAK,MAAA,GAAS,CAAA,IAAK,OAAO,IAAA,CAAK,CAAC,MAAM,QAAA,EAAU;AAClD,MAAA,SAAA,GAAY,KAAK,CAAC,CAAA;AAAA,IACpB;AACA,IAAA,IAAA,CAAK,eAAe,SAAS,CAAA,GAAA,CAAK,KAAK,cAAA,CAAe,SAAS,KAAK,CAAA,IAAK,CAAA;AAAA,EAC3E;AAAA,EAEA,cAAA,GAAuB;AAAA,EAAC;AAAA,EACxB,eAAA,GAAwB;AAAA,EAAC;AAAA,EACzB,mBAAA,GAA4B;AAAA,EAAC;AAAA,EAC7B,aAAA,GAAsB;AAAA,EAAC;AAAA,EAEvB,WAAA,GAAwB;AACtB,IAAA,MAAM,MAAM,IAAA,CAAK,OAAA;AACjB,IAAA,IAAA,CAAK,UAAU,EAAC;AAChB,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,kBAAA,GAA6C;AAC3C,IAAA,MAAM,MAAM,IAAA,CAAK,cAAA;AACjB,IAAA,IAAA,CAAK,iBAAiB,EAAC;AACvB,IAAA,OAAO,GAAA;AAAA,EACT;AACF;AAYO,SAAS,cAAA,CACd,MACA,IAAA,EACS;AACT,EAAA,IAAI,EAAE,gBAAgB,aAAA,CAAA,EAAgB;AACpC,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,GAAU,KAAK,WAAA,EAAY;AACjC,EAAA,MAAM,OAAA,GAAU,QAAQ,MAAA,GAAS,CAAA;AACjC,EAAA,MAAM,MAAA,GAAU,KAA6B,MAAA,IAAU,GAAA;AAEvD,EAAA,IAAI,OAAA,EAAS;AAEX,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN,CAAA,gCAAA,EAAmC,MAAM,CAAA,GAAA,EAAA,CACjC,OAAA,CAAQ,MAAA,CAAO,MAAA,EAAO,GAAI,QAAA,EAAY,QAAA,EAAU,CAAA,iBAAA,EACnC,OAAA,CAAQ,MAAM,CAAA,iBAAA;AAAA,KACrC;AAAA,EACF;AACA,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,EACtB;AAEA,EAAA,MAAM,OAAA,GAAU,KAAK,kBAAA,EAAmB;AACxC,EAAA,IAAI,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,SAAS,CAAA,EAAG;AAEnC,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN,mDAAmD,MAAM,CAAA,QAAA,EAAW,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA;AAAA,KAC7F;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT","file":"chunk-4YLSDMLL.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 * 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';\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 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"]}
|
|
@@ -151,7 +151,7 @@ function makeStatusError(status, body, headers, request) {
|
|
|
151
151
|
}
|
|
152
152
|
|
|
153
153
|
// src/version.ts
|
|
154
|
-
var VERSION = "0.
|
|
154
|
+
var VERSION = "0.32.0" ;
|
|
155
155
|
|
|
156
156
|
// src/constants.ts
|
|
157
157
|
var DEFAULT_BASE_URL = "https://api.claw-ops.com";
|
|
@@ -184,5 +184,5 @@ exports.ServiceUnavailableError = ServiceUnavailableError;
|
|
|
184
184
|
exports.UnprocessableEntityError = UnprocessableEntityError;
|
|
185
185
|
exports.VERSION = VERSION;
|
|
186
186
|
exports.makeStatusError = makeStatusError;
|
|
187
|
-
//# sourceMappingURL=chunk-
|
|
188
|
-
//# sourceMappingURL=chunk-
|
|
187
|
+
//# sourceMappingURL=chunk-HKXRJRAW.cjs.map
|
|
188
|
+
//# sourceMappingURL=chunk-HKXRJRAW.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/error.ts","../src/version.ts","../src/constants.ts"],"names":[],"mappings":"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","file":"chunk-IGFGK3XZ.cjs","sourcesContent":["export class ClawOpsError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ClawOpsError';\n }\n}\n\nexport class APIError extends ClawOpsError {\n readonly request: { method: string; url: string };\n\n constructor(message: string, request: { method: string; url: string }) {\n super(message);\n this.name = 'APIError';\n this.request = request;\n }\n}\n\nexport class APIStatusError extends APIError {\n readonly status: number;\n readonly body: unknown;\n readonly headers: Headers | undefined;\n\n constructor(\n message: string,\n response: { status: number; headers?: Headers },\n body: unknown,\n request: { method: string; url: string },\n ) {\n super(message, request);\n this.name = 'APIStatusError';\n this.status = response.status;\n this.body = body;\n this.headers = response.headers;\n }\n}\n\nexport class BadRequestError extends APIStatusError {\n override readonly status = 400 as const;\n constructor(\n message: string,\n response: { status: number; headers?: Headers },\n body: unknown,\n request: { method: string; url: string },\n ) {\n super(message, response, body, request);\n this.name = 'BadRequestError';\n }\n}\n\nexport class AuthenticationError extends APIStatusError {\n override readonly status = 401 as const;\n constructor(\n message: string,\n response: { status: number; headers?: Headers },\n body: unknown,\n request: { method: string; url: string },\n ) {\n super(message, response, body, request);\n this.name = 'AuthenticationError';\n }\n}\n\nexport class PermissionDeniedError extends APIStatusError {\n override readonly status = 403 as const;\n constructor(\n message: string,\n response: { status: number; headers?: Headers },\n body: unknown,\n request: { method: string; url: string },\n ) {\n super(message, response, body, request);\n this.name = 'PermissionDeniedError';\n }\n}\n\nexport class NotFoundError extends APIStatusError {\n override readonly status = 404 as const;\n constructor(\n message: string,\n response: { status: number; headers?: Headers },\n body: unknown,\n request: { method: string; url: string },\n ) {\n super(message, response, body, request);\n this.name = 'NotFoundError';\n }\n}\n\nexport class ConflictError extends APIStatusError {\n override readonly status = 409 as const;\n constructor(\n message: string,\n response: { status: number; headers?: Headers },\n body: unknown,\n request: { method: string; url: string },\n ) {\n super(message, response, body, request);\n this.name = 'ConflictError';\n }\n}\n\nexport class UnprocessableEntityError extends APIStatusError {\n override readonly status = 422 as const;\n constructor(\n message: string,\n response: { status: number; headers?: Headers },\n body: unknown,\n request: { method: string; url: string },\n ) {\n super(message, response, body, request);\n this.name = 'UnprocessableEntityError';\n }\n}\n\n/**\n * HTTP 429 Too Many Requests.\n *\n * 동시 통화 한도 초과 등 일시적 제한. SDK는 자동 재시도(최대 2회, 지수 backoff)를 수행한다.\n * 즉각 피드백이 필요하면 client 생성 시 maxRetries: 0으로 재시도를 비활성화하라.\n */\nexport class RateLimitError extends APIStatusError {\n override readonly status = 429 as const;\n constructor(\n message: string,\n response: { status: number; headers?: Headers },\n body: unknown,\n request: { method: string; url: string },\n ) {\n super(message, response, body, request);\n this.name = 'RateLimitError';\n }\n}\n\nexport class InternalServerError extends APIStatusError {\n override readonly status = 500 as const;\n constructor(\n message: string,\n response: { status: number; headers?: Headers },\n body: unknown,\n request: { method: string; url: string },\n ) {\n super(message, response, body, request);\n this.name = 'InternalServerError';\n }\n}\n\nexport class ServiceUnavailableError extends APIStatusError {\n override readonly status = 503 as const;\n constructor(\n message: string,\n response: { status: number; headers?: Headers },\n body: unknown,\n request: { method: string; url: string },\n ) {\n super(message, response, body, request);\n this.name = 'ServiceUnavailableError';\n }\n}\n\nexport class APIConnectionError extends APIError {\n constructor(request: { method: string; url: string }, message = 'Connection error.') {\n super(message, request);\n this.name = 'APIConnectionError';\n }\n}\n\nexport class APITimeoutError extends APIConnectionError {\n constructor(request: { method: string; url: string }) {\n super(request, 'Request timed out.');\n this.name = 'APITimeoutError';\n }\n}\n\nexport class APIResponseValidationError extends APIError {\n readonly status: number;\n\n constructor(response: { status: number }, request: { method: string; url: string }) {\n super('API response validation failed.', request);\n this.name = 'APIResponseValidationError';\n this.status = response.status;\n }\n}\n\nexport class AgentError extends ClawOpsError {\n constructor(message: string) {\n super(message);\n this.name = 'AgentError';\n }\n}\n\nexport class AgentConnectionError extends AgentError {\n constructor(message = 'Agent WebSocket connection failed.') {\n super(message);\n this.name = 'AgentConnectionError';\n }\n}\n\nconst STATUS_CODE_TO_ERROR: Record<\n number,\n new (\n message: string,\n response: { status: number; headers?: Headers },\n body: unknown,\n request: { method: string; url: string },\n ) => APIStatusError\n> = {\n 400: BadRequestError,\n 401: AuthenticationError,\n 403: PermissionDeniedError,\n 404: NotFoundError,\n 409: ConflictError,\n 422: UnprocessableEntityError,\n 429: RateLimitError,\n 500: InternalServerError,\n 503: ServiceUnavailableError,\n};\n\nexport function makeStatusError(\n status: number,\n body: unknown,\n headers: Headers | undefined,\n request: { method: string; url: string },\n): APIStatusError {\n let message = '';\n if (body && typeof body === 'object' && 'error' in body) {\n message = (body as { error: string }).error;\n } else {\n message = `HTTP ${status}`;\n }\n\n const ErrorClass = STATUS_CODE_TO_ERROR[status];\n if (ErrorClass) {\n return new ErrorClass(message, { status, headers }, body, request);\n }\n if (status >= 500) {\n return new InternalServerError(message, { status, headers }, body, request);\n }\n return new APIStatusError(message, { status, headers }, body, request);\n}\n","declare const __PKG_VERSION__: string;\n\nexport const VERSION: string = typeof __PKG_VERSION__ !== 'undefined'\n ? __PKG_VERSION__\n : 'dev';\n","export const DEFAULT_BASE_URL = 'https://api.claw-ops.com';\nexport const DEFAULT_MAX_RETRIES = 2;\nexport const DEFAULT_TIMEOUT = 600_000; // ms\nexport const INITIAL_RETRY_DELAY = 500; // ms\nexport const MAX_RETRY_DELAY = 8_000; // ms\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/error.ts","../src/version.ts","../src/constants.ts"],"names":[],"mappings":"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","file":"chunk-HKXRJRAW.cjs","sourcesContent":["export class ClawOpsError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ClawOpsError';\n }\n}\n\nexport class APIError extends ClawOpsError {\n readonly request: { method: string; url: string };\n\n constructor(message: string, request: { method: string; url: string }) {\n super(message);\n this.name = 'APIError';\n this.request = request;\n }\n}\n\nexport class APIStatusError extends APIError {\n readonly status: number;\n readonly body: unknown;\n readonly headers: Headers | undefined;\n\n constructor(\n message: string,\n response: { status: number; headers?: Headers },\n body: unknown,\n request: { method: string; url: string },\n ) {\n super(message, request);\n this.name = 'APIStatusError';\n this.status = response.status;\n this.body = body;\n this.headers = response.headers;\n }\n}\n\nexport class BadRequestError extends APIStatusError {\n override readonly status = 400 as const;\n constructor(\n message: string,\n response: { status: number; headers?: Headers },\n body: unknown,\n request: { method: string; url: string },\n ) {\n super(message, response, body, request);\n this.name = 'BadRequestError';\n }\n}\n\nexport class AuthenticationError extends APIStatusError {\n override readonly status = 401 as const;\n constructor(\n message: string,\n response: { status: number; headers?: Headers },\n body: unknown,\n request: { method: string; url: string },\n ) {\n super(message, response, body, request);\n this.name = 'AuthenticationError';\n }\n}\n\nexport class PermissionDeniedError extends APIStatusError {\n override readonly status = 403 as const;\n constructor(\n message: string,\n response: { status: number; headers?: Headers },\n body: unknown,\n request: { method: string; url: string },\n ) {\n super(message, response, body, request);\n this.name = 'PermissionDeniedError';\n }\n}\n\nexport class NotFoundError extends APIStatusError {\n override readonly status = 404 as const;\n constructor(\n message: string,\n response: { status: number; headers?: Headers },\n body: unknown,\n request: { method: string; url: string },\n ) {\n super(message, response, body, request);\n this.name = 'NotFoundError';\n }\n}\n\nexport class ConflictError extends APIStatusError {\n override readonly status = 409 as const;\n constructor(\n message: string,\n response: { status: number; headers?: Headers },\n body: unknown,\n request: { method: string; url: string },\n ) {\n super(message, response, body, request);\n this.name = 'ConflictError';\n }\n}\n\nexport class UnprocessableEntityError extends APIStatusError {\n override readonly status = 422 as const;\n constructor(\n message: string,\n response: { status: number; headers?: Headers },\n body: unknown,\n request: { method: string; url: string },\n ) {\n super(message, response, body, request);\n this.name = 'UnprocessableEntityError';\n }\n}\n\n/**\n * HTTP 429 Too Many Requests.\n *\n * 동시 통화 한도 초과 등 일시적 제한. SDK는 자동 재시도(최대 2회, 지수 backoff)를 수행한다.\n * 즉각 피드백이 필요하면 client 생성 시 maxRetries: 0으로 재시도를 비활성화하라.\n */\nexport class RateLimitError extends APIStatusError {\n override readonly status = 429 as const;\n constructor(\n message: string,\n response: { status: number; headers?: Headers },\n body: unknown,\n request: { method: string; url: string },\n ) {\n super(message, response, body, request);\n this.name = 'RateLimitError';\n }\n}\n\nexport class InternalServerError extends APIStatusError {\n override readonly status = 500 as const;\n constructor(\n message: string,\n response: { status: number; headers?: Headers },\n body: unknown,\n request: { method: string; url: string },\n ) {\n super(message, response, body, request);\n this.name = 'InternalServerError';\n }\n}\n\nexport class ServiceUnavailableError extends APIStatusError {\n override readonly status = 503 as const;\n constructor(\n message: string,\n response: { status: number; headers?: Headers },\n body: unknown,\n request: { method: string; url: string },\n ) {\n super(message, response, body, request);\n this.name = 'ServiceUnavailableError';\n }\n}\n\nexport class APIConnectionError extends APIError {\n constructor(request: { method: string; url: string }, message = 'Connection error.') {\n super(message, request);\n this.name = 'APIConnectionError';\n }\n}\n\nexport class APITimeoutError extends APIConnectionError {\n constructor(request: { method: string; url: string }) {\n super(request, 'Request timed out.');\n this.name = 'APITimeoutError';\n }\n}\n\nexport class APIResponseValidationError extends APIError {\n readonly status: number;\n\n constructor(response: { status: number }, request: { method: string; url: string }) {\n super('API response validation failed.', request);\n this.name = 'APIResponseValidationError';\n this.status = response.status;\n }\n}\n\nexport class AgentError extends ClawOpsError {\n constructor(message: string) {\n super(message);\n this.name = 'AgentError';\n }\n}\n\nexport class AgentConnectionError extends AgentError {\n constructor(message = 'Agent WebSocket connection failed.') {\n super(message);\n this.name = 'AgentConnectionError';\n }\n}\n\nconst STATUS_CODE_TO_ERROR: Record<\n number,\n new (\n message: string,\n response: { status: number; headers?: Headers },\n body: unknown,\n request: { method: string; url: string },\n ) => APIStatusError\n> = {\n 400: BadRequestError,\n 401: AuthenticationError,\n 403: PermissionDeniedError,\n 404: NotFoundError,\n 409: ConflictError,\n 422: UnprocessableEntityError,\n 429: RateLimitError,\n 500: InternalServerError,\n 503: ServiceUnavailableError,\n};\n\nexport function makeStatusError(\n status: number,\n body: unknown,\n headers: Headers | undefined,\n request: { method: string; url: string },\n): APIStatusError {\n let message = '';\n if (body && typeof body === 'object' && 'error' in body) {\n message = (body as { error: string }).error;\n } else {\n message = `HTTP ${status}`;\n }\n\n const ErrorClass = STATUS_CODE_TO_ERROR[status];\n if (ErrorClass) {\n return new ErrorClass(message, { status, headers }, body, request);\n }\n if (status >= 500) {\n return new InternalServerError(message, { status, headers }, body, request);\n }\n return new APIStatusError(message, { status, headers }, body, request);\n}\n","declare const __PKG_VERSION__: string;\n\nexport const VERSION: string = typeof __PKG_VERSION__ !== 'undefined'\n ? __PKG_VERSION__\n : 'dev';\n","export const DEFAULT_BASE_URL = 'https://api.claw-ops.com';\nexport const DEFAULT_MAX_RETRIES = 2;\nexport const DEFAULT_TIMEOUT = 600_000; // ms\nexport const INITIAL_RETRY_DELAY = 500; // ms\nexport const MAX_RETRY_DELAY = 8_000; // ms\n"]}
|
|
@@ -149,7 +149,7 @@ function makeStatusError(status, body, headers, request) {
|
|
|
149
149
|
}
|
|
150
150
|
|
|
151
151
|
// src/version.ts
|
|
152
|
-
var VERSION = "0.
|
|
152
|
+
var VERSION = "0.32.0" ;
|
|
153
153
|
|
|
154
154
|
// src/constants.ts
|
|
155
155
|
var DEFAULT_BASE_URL = "https://api.claw-ops.com";
|
|
@@ -159,5 +159,5 @@ var INITIAL_RETRY_DELAY = 500;
|
|
|
159
159
|
var MAX_RETRY_DELAY = 8e3;
|
|
160
160
|
|
|
161
161
|
export { APIConnectionError, APIError, APIResponseValidationError, APIStatusError, APITimeoutError, AgentConnectionError, AgentError, AuthenticationError, BadRequestError, ClawOpsError, ConflictError, DEFAULT_BASE_URL, DEFAULT_MAX_RETRIES, DEFAULT_TIMEOUT, INITIAL_RETRY_DELAY, InternalServerError, MAX_RETRY_DELAY, NotFoundError, PermissionDeniedError, RateLimitError, ServiceUnavailableError, UnprocessableEntityError, VERSION, makeStatusError };
|
|
162
|
-
//# sourceMappingURL=chunk-
|
|
163
|
-
//# sourceMappingURL=chunk-
|
|
162
|
+
//# sourceMappingURL=chunk-MXJ2LM6R.js.map
|
|
163
|
+
//# sourceMappingURL=chunk-MXJ2LM6R.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/error.ts","../src/version.ts","../src/constants.ts"],"names":[],"mappings":"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","file":"chunk-622J6BJ5.js","sourcesContent":["export class ClawOpsError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ClawOpsError';\n }\n}\n\nexport class APIError extends ClawOpsError {\n readonly request: { method: string; url: string };\n\n constructor(message: string, request: { method: string; url: string }) {\n super(message);\n this.name = 'APIError';\n this.request = request;\n }\n}\n\nexport class APIStatusError extends APIError {\n readonly status: number;\n readonly body: unknown;\n readonly headers: Headers | undefined;\n\n constructor(\n message: string,\n response: { status: number; headers?: Headers },\n body: unknown,\n request: { method: string; url: string },\n ) {\n super(message, request);\n this.name = 'APIStatusError';\n this.status = response.status;\n this.body = body;\n this.headers = response.headers;\n }\n}\n\nexport class BadRequestError extends APIStatusError {\n override readonly status = 400 as const;\n constructor(\n message: string,\n response: { status: number; headers?: Headers },\n body: unknown,\n request: { method: string; url: string },\n ) {\n super(message, response, body, request);\n this.name = 'BadRequestError';\n }\n}\n\nexport class AuthenticationError extends APIStatusError {\n override readonly status = 401 as const;\n constructor(\n message: string,\n response: { status: number; headers?: Headers },\n body: unknown,\n request: { method: string; url: string },\n ) {\n super(message, response, body, request);\n this.name = 'AuthenticationError';\n }\n}\n\nexport class PermissionDeniedError extends APIStatusError {\n override readonly status = 403 as const;\n constructor(\n message: string,\n response: { status: number; headers?: Headers },\n body: unknown,\n request: { method: string; url: string },\n ) {\n super(message, response, body, request);\n this.name = 'PermissionDeniedError';\n }\n}\n\nexport class NotFoundError extends APIStatusError {\n override readonly status = 404 as const;\n constructor(\n message: string,\n response: { status: number; headers?: Headers },\n body: unknown,\n request: { method: string; url: string },\n ) {\n super(message, response, body, request);\n this.name = 'NotFoundError';\n }\n}\n\nexport class ConflictError extends APIStatusError {\n override readonly status = 409 as const;\n constructor(\n message: string,\n response: { status: number; headers?: Headers },\n body: unknown,\n request: { method: string; url: string },\n ) {\n super(message, response, body, request);\n this.name = 'ConflictError';\n }\n}\n\nexport class UnprocessableEntityError extends APIStatusError {\n override readonly status = 422 as const;\n constructor(\n message: string,\n response: { status: number; headers?: Headers },\n body: unknown,\n request: { method: string; url: string },\n ) {\n super(message, response, body, request);\n this.name = 'UnprocessableEntityError';\n }\n}\n\n/**\n * HTTP 429 Too Many Requests.\n *\n * 동시 통화 한도 초과 등 일시적 제한. SDK는 자동 재시도(최대 2회, 지수 backoff)를 수행한다.\n * 즉각 피드백이 필요하면 client 생성 시 maxRetries: 0으로 재시도를 비활성화하라.\n */\nexport class RateLimitError extends APIStatusError {\n override readonly status = 429 as const;\n constructor(\n message: string,\n response: { status: number; headers?: Headers },\n body: unknown,\n request: { method: string; url: string },\n ) {\n super(message, response, body, request);\n this.name = 'RateLimitError';\n }\n}\n\nexport class InternalServerError extends APIStatusError {\n override readonly status = 500 as const;\n constructor(\n message: string,\n response: { status: number; headers?: Headers },\n body: unknown,\n request: { method: string; url: string },\n ) {\n super(message, response, body, request);\n this.name = 'InternalServerError';\n }\n}\n\nexport class ServiceUnavailableError extends APIStatusError {\n override readonly status = 503 as const;\n constructor(\n message: string,\n response: { status: number; headers?: Headers },\n body: unknown,\n request: { method: string; url: string },\n ) {\n super(message, response, body, request);\n this.name = 'ServiceUnavailableError';\n }\n}\n\nexport class APIConnectionError extends APIError {\n constructor(request: { method: string; url: string }, message = 'Connection error.') {\n super(message, request);\n this.name = 'APIConnectionError';\n }\n}\n\nexport class APITimeoutError extends APIConnectionError {\n constructor(request: { method: string; url: string }) {\n super(request, 'Request timed out.');\n this.name = 'APITimeoutError';\n }\n}\n\nexport class APIResponseValidationError extends APIError {\n readonly status: number;\n\n constructor(response: { status: number }, request: { method: string; url: string }) {\n super('API response validation failed.', request);\n this.name = 'APIResponseValidationError';\n this.status = response.status;\n }\n}\n\nexport class AgentError extends ClawOpsError {\n constructor(message: string) {\n super(message);\n this.name = 'AgentError';\n }\n}\n\nexport class AgentConnectionError extends AgentError {\n constructor(message = 'Agent WebSocket connection failed.') {\n super(message);\n this.name = 'AgentConnectionError';\n }\n}\n\nconst STATUS_CODE_TO_ERROR: Record<\n number,\n new (\n message: string,\n response: { status: number; headers?: Headers },\n body: unknown,\n request: { method: string; url: string },\n ) => APIStatusError\n> = {\n 400: BadRequestError,\n 401: AuthenticationError,\n 403: PermissionDeniedError,\n 404: NotFoundError,\n 409: ConflictError,\n 422: UnprocessableEntityError,\n 429: RateLimitError,\n 500: InternalServerError,\n 503: ServiceUnavailableError,\n};\n\nexport function makeStatusError(\n status: number,\n body: unknown,\n headers: Headers | undefined,\n request: { method: string; url: string },\n): APIStatusError {\n let message = '';\n if (body && typeof body === 'object' && 'error' in body) {\n message = (body as { error: string }).error;\n } else {\n message = `HTTP ${status}`;\n }\n\n const ErrorClass = STATUS_CODE_TO_ERROR[status];\n if (ErrorClass) {\n return new ErrorClass(message, { status, headers }, body, request);\n }\n if (status >= 500) {\n return new InternalServerError(message, { status, headers }, body, request);\n }\n return new APIStatusError(message, { status, headers }, body, request);\n}\n","declare const __PKG_VERSION__: string;\n\nexport const VERSION: string = typeof __PKG_VERSION__ !== 'undefined'\n ? __PKG_VERSION__\n : 'dev';\n","export const DEFAULT_BASE_URL = 'https://api.claw-ops.com';\nexport const DEFAULT_MAX_RETRIES = 2;\nexport const DEFAULT_TIMEOUT = 600_000; // ms\nexport const INITIAL_RETRY_DELAY = 500; // ms\nexport const MAX_RETRY_DELAY = 8_000; // ms\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/error.ts","../src/version.ts","../src/constants.ts"],"names":[],"mappings":"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","file":"chunk-MXJ2LM6R.js","sourcesContent":["export class ClawOpsError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ClawOpsError';\n }\n}\n\nexport class APIError extends ClawOpsError {\n readonly request: { method: string; url: string };\n\n constructor(message: string, request: { method: string; url: string }) {\n super(message);\n this.name = 'APIError';\n this.request = request;\n }\n}\n\nexport class APIStatusError extends APIError {\n readonly status: number;\n readonly body: unknown;\n readonly headers: Headers | undefined;\n\n constructor(\n message: string,\n response: { status: number; headers?: Headers },\n body: unknown,\n request: { method: string; url: string },\n ) {\n super(message, request);\n this.name = 'APIStatusError';\n this.status = response.status;\n this.body = body;\n this.headers = response.headers;\n }\n}\n\nexport class BadRequestError extends APIStatusError {\n override readonly status = 400 as const;\n constructor(\n message: string,\n response: { status: number; headers?: Headers },\n body: unknown,\n request: { method: string; url: string },\n ) {\n super(message, response, body, request);\n this.name = 'BadRequestError';\n }\n}\n\nexport class AuthenticationError extends APIStatusError {\n override readonly status = 401 as const;\n constructor(\n message: string,\n response: { status: number; headers?: Headers },\n body: unknown,\n request: { method: string; url: string },\n ) {\n super(message, response, body, request);\n this.name = 'AuthenticationError';\n }\n}\n\nexport class PermissionDeniedError extends APIStatusError {\n override readonly status = 403 as const;\n constructor(\n message: string,\n response: { status: number; headers?: Headers },\n body: unknown,\n request: { method: string; url: string },\n ) {\n super(message, response, body, request);\n this.name = 'PermissionDeniedError';\n }\n}\n\nexport class NotFoundError extends APIStatusError {\n override readonly status = 404 as const;\n constructor(\n message: string,\n response: { status: number; headers?: Headers },\n body: unknown,\n request: { method: string; url: string },\n ) {\n super(message, response, body, request);\n this.name = 'NotFoundError';\n }\n}\n\nexport class ConflictError extends APIStatusError {\n override readonly status = 409 as const;\n constructor(\n message: string,\n response: { status: number; headers?: Headers },\n body: unknown,\n request: { method: string; url: string },\n ) {\n super(message, response, body, request);\n this.name = 'ConflictError';\n }\n}\n\nexport class UnprocessableEntityError extends APIStatusError {\n override readonly status = 422 as const;\n constructor(\n message: string,\n response: { status: number; headers?: Headers },\n body: unknown,\n request: { method: string; url: string },\n ) {\n super(message, response, body, request);\n this.name = 'UnprocessableEntityError';\n }\n}\n\n/**\n * HTTP 429 Too Many Requests.\n *\n * 동시 통화 한도 초과 등 일시적 제한. SDK는 자동 재시도(최대 2회, 지수 backoff)를 수행한다.\n * 즉각 피드백이 필요하면 client 생성 시 maxRetries: 0으로 재시도를 비활성화하라.\n */\nexport class RateLimitError extends APIStatusError {\n override readonly status = 429 as const;\n constructor(\n message: string,\n response: { status: number; headers?: Headers },\n body: unknown,\n request: { method: string; url: string },\n ) {\n super(message, response, body, request);\n this.name = 'RateLimitError';\n }\n}\n\nexport class InternalServerError extends APIStatusError {\n override readonly status = 500 as const;\n constructor(\n message: string,\n response: { status: number; headers?: Headers },\n body: unknown,\n request: { method: string; url: string },\n ) {\n super(message, response, body, request);\n this.name = 'InternalServerError';\n }\n}\n\nexport class ServiceUnavailableError extends APIStatusError {\n override readonly status = 503 as const;\n constructor(\n message: string,\n response: { status: number; headers?: Headers },\n body: unknown,\n request: { method: string; url: string },\n ) {\n super(message, response, body, request);\n this.name = 'ServiceUnavailableError';\n }\n}\n\nexport class APIConnectionError extends APIError {\n constructor(request: { method: string; url: string }, message = 'Connection error.') {\n super(message, request);\n this.name = 'APIConnectionError';\n }\n}\n\nexport class APITimeoutError extends APIConnectionError {\n constructor(request: { method: string; url: string }) {\n super(request, 'Request timed out.');\n this.name = 'APITimeoutError';\n }\n}\n\nexport class APIResponseValidationError extends APIError {\n readonly status: number;\n\n constructor(response: { status: number }, request: { method: string; url: string }) {\n super('API response validation failed.', request);\n this.name = 'APIResponseValidationError';\n this.status = response.status;\n }\n}\n\nexport class AgentError extends ClawOpsError {\n constructor(message: string) {\n super(message);\n this.name = 'AgentError';\n }\n}\n\nexport class AgentConnectionError extends AgentError {\n constructor(message = 'Agent WebSocket connection failed.') {\n super(message);\n this.name = 'AgentConnectionError';\n }\n}\n\nconst STATUS_CODE_TO_ERROR: Record<\n number,\n new (\n message: string,\n response: { status: number; headers?: Headers },\n body: unknown,\n request: { method: string; url: string },\n ) => APIStatusError\n> = {\n 400: BadRequestError,\n 401: AuthenticationError,\n 403: PermissionDeniedError,\n 404: NotFoundError,\n 409: ConflictError,\n 422: UnprocessableEntityError,\n 429: RateLimitError,\n 500: InternalServerError,\n 503: ServiceUnavailableError,\n};\n\nexport function makeStatusError(\n status: number,\n body: unknown,\n headers: Headers | undefined,\n request: { method: string; url: string },\n): APIStatusError {\n let message = '';\n if (body && typeof body === 'object' && 'error' in body) {\n message = (body as { error: string }).error;\n } else {\n message = `HTTP ${status}`;\n }\n\n const ErrorClass = STATUS_CODE_TO_ERROR[status];\n if (ErrorClass) {\n return new ErrorClass(message, { status, headers }, body, request);\n }\n if (status >= 500) {\n return new InternalServerError(message, { status, headers }, body, request);\n }\n return new APIStatusError(message, { status, headers }, body, request);\n}\n","declare const __PKG_VERSION__: string;\n\nexport const VERSION: string = typeof __PKG_VERSION__ !== 'undefined'\n ? __PKG_VERSION__\n : 'dev';\n","export const DEFAULT_BASE_URL = 'https://api.claw-ops.com';\nexport const DEFAULT_MAX_RETRIES = 2;\nexport const DEFAULT_TIMEOUT = 600_000; // ms\nexport const INITIAL_RETRY_DELAY = 500; // ms\nexport const MAX_RETRY_DELAY = 8_000; // ms\n"]}
|
|
@@ -386,6 +386,7 @@ function resolveBuiltinTools(value) {
|
|
|
386
386
|
}
|
|
387
387
|
|
|
388
388
|
// src/agent/pipeline/builtin-tool-schemas.ts
|
|
389
|
+
var log = createAgentLogger();
|
|
389
390
|
var HANG_UP = {
|
|
390
391
|
name: "hang_up",
|
|
391
392
|
description: "End the phone call. Use when the conversation is finished or the caller says goodbye.",
|
|
@@ -429,7 +430,8 @@ var TRANSFER_CALL = {
|
|
|
429
430
|
mode: { type: "string", enum: ["blind", "warm"], description: "blind: direct transfer (default), warm: play whisper to target first" },
|
|
430
431
|
after_transfer: { type: "string", enum: ["terminate", "return"], description: "terminate: end AI session (default), return: AI resumes after transfer ends" },
|
|
431
432
|
whisper: { type: "string", description: "Message to speak to transfer target before connecting customer (warm mode only)" },
|
|
432
|
-
|
|
433
|
+
caller_id_mode: { type: "string", 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." },
|
|
434
|
+
caller_id: { type: "string", 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 \u2014 use caller_id_mode unless a specific number is required." },
|
|
433
435
|
timeout: { type: "integer", description: "Seconds to wait for transfer target to answer (default 30)" }
|
|
434
436
|
},
|
|
435
437
|
required: ["to"]
|
|
@@ -521,8 +523,12 @@ async function executeBuiltinTool(funcName, args, call) {
|
|
|
521
523
|
afterTransfer: args["after_transfer"] ?? void 0,
|
|
522
524
|
whisper: args["whisper"] ?? void 0,
|
|
523
525
|
callerId: args["caller_id"] ?? void 0,
|
|
526
|
+
callerIdMode: args["caller_id_mode"] ?? void 0,
|
|
524
527
|
timeout: args["timeout"] ?? void 0
|
|
525
|
-
|
|
528
|
+
// 결과를 안 기다리므로 실패가 통째로 조용하다 — 모델은 "시작됨" 을 받고, 예외는
|
|
529
|
+
// 프로미스 안에 갇힌다. 최소한 로그에는 남긴다.
|
|
530
|
+
}).catch((e) => {
|
|
531
|
+
log.error({ err: e }, "transfer_call \uB3C4\uAD6C\uAC00 \uAC74 \uC804\uD658\uC774 \uC2E4\uD328\uD588\uB2E4");
|
|
526
532
|
});
|
|
527
533
|
return JSON.stringify({ status: "transfer_initiated" });
|
|
528
534
|
} catch (e) {
|
|
@@ -629,5 +635,5 @@ exports.pcm16ToUlaw = pcm16ToUlaw;
|
|
|
629
635
|
exports.resamplePcm16 = resamplePcm16;
|
|
630
636
|
exports.resolveBuiltinTools = resolveBuiltinTools;
|
|
631
637
|
exports.ulawToPcm16 = ulawToPcm16;
|
|
632
|
-
//# sourceMappingURL=chunk-
|
|
633
|
-
//# sourceMappingURL=chunk-
|
|
638
|
+
//# sourceMappingURL=chunk-QD2ZY4UP.cjs.map
|
|
639
|
+
//# sourceMappingURL=chunk-QD2ZY4UP.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/agent/audio.ts","../src/agent/logger.ts","../src/agent/builtin-tool.ts","../src/agent/pipeline/builtin-tool-schemas.ts","../src/agent/pipeline/buffering-call.ts"],"names":["pino","BuiltinTool"],"mappings":"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EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAS,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxD,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAS,GAAA;AAAA,EAAQ,GAAA;AAAA,EACxD,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EACxD,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EACxD,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EAAQ,GAAA;AAAA,EACxD,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","file":"chunk-QD2ZY4UP.cjs","sourcesContent":["/**\n * Audio codec utilities: PCM16 <-> ulaw conversion and resampling.\n */\n\nconst _BIAS = 0x84;\nconst _CLIP = 32635;\n\n// prettier-ignore\nconst DECODE_TABLE: readonly number[] = [\n -32124, -31100, -30076, -29052, -28028, -27004, -25980, -24956,\n -23932, -22908, -21884, -20860, -19836, -18812, -17788, -16764,\n -15996, -15484, -14972, -14460, -13948, -13436, -12924, -12412,\n -11900, -11388, -10876, -10364, -9852, -9340, -8828, -8316,\n -7932, -7676, -7420, -7164, -6908, -6652, -6396, -6140,\n -5884, -5628, -5372, -5116, -4860, -4604, -4348, -4092,\n -3900, -3772, -3644, -3516, -3388, -3260, -3132, -3004,\n -2876, -2748, -2620, -2492, -2364, -2236, -2108, -1980,\n -1884, -1820, -1756, -1692, -1628, -1564, -1500, -1436,\n -1372, -1308, -1244, -1180, -1116, -1052, -988, -924,\n -876, -844, -812, -780, -748, -716, -684, -652,\n -620, -588, -556, -524, -492, -460, -428, -396,\n -372, -356, -340, -324, -308, -292, -276, -260,\n -244, -228, -212, -196, -180, -164, -148, -132,\n -120, -112, -104, -96, -88, -80, -72, -64,\n -56, -48, -40, -32, -24, -16, -8, 0,\n 32124, 31100, 30076, 29052, 28028, 27004, 25980, 24956,\n 23932, 22908, 21884, 20860, 19836, 18812, 17788, 16764,\n 15996, 15484, 14972, 14460, 13948, 13436, 12924, 12412,\n 11900, 11388, 10876, 10364, 9852, 9340, 8828, 8316,\n 7932, 7676, 7420, 7164, 6908, 6652, 6396, 6140,\n 5884, 5628, 5372, 5116, 4860, 4604, 4348, 4092,\n 3900, 3772, 3644, 3516, 3388, 3260, 3132, 3004,\n 2876, 2748, 2620, 2492, 2364, 2236, 2108, 1980,\n 1884, 1820, 1756, 1692, 1628, 1564, 1500, 1436,\n 1372, 1308, 1244, 1180, 1116, 1052, 988, 924,\n 876, 844, 812, 780, 748, 716, 684, 652,\n 620, 588, 556, 524, 492, 460, 428, 396,\n 372, 356, 340, 324, 308, 292, 276, 260,\n 244, 228, 212, 196, 180, 164, 148, 132,\n 120, 112, 104, 96, 88, 80, 72, 64,\n 56, 48, 40, 32, 24, 16, 8, 0,\n];\n\nfunction encodeUlawSample(sample: number): number {\n let sign = 0;\n if (sample < 0) {\n sign = 0x80;\n sample = -sample;\n }\n if (sample > _CLIP) {\n sample = _CLIP;\n }\n sample += _BIAS;\n\n let exponent = 7;\n const expValues = [0x4000, 0x2000, 0x1000, 0x0800, 0x0400, 0x0200, 0x0100];\n for (const expVal of expValues) {\n if (sample >= expVal) {\n break;\n }\n exponent -= 1;\n }\n\n const mantissa = (sample >> (exponent + 3)) & 0x0f;\n return ~(sign | (exponent << 4) | mantissa) & 0xff;\n}\n\n/**\n * Convert PCM16 little-endian audio to ulaw.\n */\nexport function pcm16ToUlaw(pcm: Buffer): Buffer {\n if (!pcm.length) return Buffer.alloc(0);\n const nSamples = pcm.length >> 1;\n const out = Buffer.alloc(nSamples);\n for (let i = 0; i < nSamples; i++) {\n const sample = pcm.readInt16LE(i * 2);\n out[i] = encodeUlawSample(sample);\n }\n return out;\n}\n\n/**\n * Convert ulaw audio to PCM16 little-endian.\n */\nexport function ulawToPcm16(ulaw: Buffer): Buffer {\n if (!ulaw.length) return Buffer.alloc(0);\n const out = Buffer.alloc(ulaw.length * 2);\n for (let i = 0; i < ulaw.length; i++) {\n out.writeInt16LE(DECODE_TABLE[ulaw[i]!]!, i * 2);\n }\n return out;\n}\n\n/**\n * Apply multiplicative gain to PCM16 little-endian audio.\n * gain=1.0 is pass-through, 0 is mute, 2.0 is 2x amplification (clipped to int16 range).\n */\nexport function applyPcm16Gain(pcm: Buffer, gain: number): Buffer {\n if (!pcm.length) return Buffer.alloc(0);\n if (gain === 1.0) return pcm;\n if (!Number.isFinite(gain) || gain < 0) {\n throw new Error('gain must be a finite number >= 0');\n }\n const nSamples = pcm.length >> 1;\n const out = Buffer.alloc(nSamples * 2);\n for (let i = 0; i < nSamples; i++) {\n let value = Math.round(pcm.readInt16LE(i * 2) * gain);\n if (value > 32767) value = 32767;\n else if (value < -32768) value = -32768;\n out.writeInt16LE(value, i * 2);\n }\n return out;\n}\n\n/**\n * Apply multiplicative gain to G.711 mu-law audio.\n */\nexport function applyUlawGain(ulaw: Buffer, gain: number): Buffer {\n if (!ulaw.length) return Buffer.alloc(0);\n if (gain === 1.0) return ulaw;\n return pcm16ToUlaw(applyPcm16Gain(ulawToPcm16(ulaw), gain));\n}\n\n/**\n * Resample PCM16 audio using linear interpolation.\n */\nexport function resamplePcm16(pcm: Buffer, fromRate: number, toRate: number): Buffer {\n if (fromRate === toRate || !pcm.length) return pcm;\n\n const nSamples = pcm.length >> 1;\n const ratio = fromRate / toRate;\n const outLen = Math.floor(nSamples / ratio);\n const out = Buffer.alloc(outLen * 2);\n\n for (let i = 0; i < outLen; i++) {\n const srcPos = i * ratio;\n const idx = Math.floor(srcPos);\n const frac = srcPos - idx;\n\n let val: number;\n if (idx + 1 < nSamples) {\n val = pcm.readInt16LE(idx * 2) * (1 - frac) + pcm.readInt16LE((idx + 1) * 2) * frac;\n } else {\n val = pcm.readInt16LE(idx * 2);\n }\n out.writeInt16LE(Math.round(val), i * 2);\n }\n\n return out;\n}\n\nexport { DECODE_TABLE };\n","/**\n * Logger factory for the ClawOps agent module.\n *\n * Provides a 2-level hierarchy matching the Python SDK:\n * - clawops.agent (core: agent, session, control-ws, media-ws, recorder, mcp, realtime)\n * - clawops.agent.pipeline (pipeline: pipeline-session, stt, tts)\n */\n\nimport pino from 'pino';\nimport type { Logger } from 'pino';\n\nconst DEFAULT_LOGGER = pino({ name: 'clawops.agent' });\n\n/** A silent logger that discards all output. */\nexport const NOOP_LOGGER = pino({ level: 'silent' });\n\n/**\n * Create or return an agent-level logger.\n * If no user logger is provided, returns the default pino instance.\n */\nexport function createAgentLogger(userLogger?: Logger): Logger {\n return userLogger ?? DEFAULT_LOGGER;\n}\n\n/**\n * Create a pipeline child logger from a parent agent logger.\n * Adds `{ module: 'pipeline' }` to all log entries.\n */\nexport function createPipelineLogger(parent: Logger): Logger {\n return parent.child({ module: 'pipeline' });\n}\n\nexport type { Logger };\n","/**\n * 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';\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 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"]}
|