@chanl-ai/sdk 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/openai.d.ts +106 -0
- package/dist/adapters/openai.d.ts.map +1 -0
- package/dist/adapters/openai.js +185 -0
- package/dist/adapters/openai.js.map +1 -0
- package/dist/client.d.ts +74 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +293 -0
- package/dist/client.js.map +1 -0
- package/dist/errors/index.d.ts +179 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +319 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/index.d.ts +38 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +76 -0
- package/dist/index.js.map +1 -0
- package/dist/live/index.d.ts +9 -0
- package/dist/live/index.d.ts.map +1 -0
- package/dist/live/index.js +16 -0
- package/dist/live/index.js.map +1 -0
- package/dist/live/live-call.d.ts +48 -0
- package/dist/live/live-call.d.ts.map +1 -0
- package/dist/live/live-call.js +148 -0
- package/dist/live/live-call.js.map +1 -0
- package/dist/live/live-chat.d.ts +71 -0
- package/dist/live/live-chat.d.ts.map +1 -0
- package/dist/live/live-chat.js +95 -0
- package/dist/live/live-chat.js.map +1 -0
- package/dist/live/live-execution.d.ts +55 -0
- package/dist/live/live-execution.d.ts.map +1 -0
- package/dist/live/live-execution.js +170 -0
- package/dist/live/live-execution.js.map +1 -0
- package/dist/live/typed-emitter.d.ts +15 -0
- package/dist/live/typed-emitter.d.ts.map +1 -0
- package/dist/live/typed-emitter.js +40 -0
- package/dist/live/typed-emitter.js.map +1 -0
- package/dist/live/types.d.ts +24 -0
- package/dist/live/types.d.ts.map +1 -0
- package/dist/live/types.js +6 -0
- package/dist/live/types.js.map +1 -0
- package/dist/modules/agents.d.ts +378 -0
- package/dist/modules/agents.d.ts.map +1 -0
- package/dist/modules/agents.js +259 -0
- package/dist/modules/agents.js.map +1 -0
- package/dist/modules/alerts.d.ts +43 -0
- package/dist/modules/alerts.d.ts.map +1 -0
- package/dist/modules/alerts.js +56 -0
- package/dist/modules/alerts.js.map +1 -0
- package/dist/modules/audio.d.ts +47 -0
- package/dist/modules/audio.d.ts.map +1 -0
- package/dist/modules/audio.js +75 -0
- package/dist/modules/audio.js.map +1 -0
- package/dist/modules/auth.d.ts +76 -0
- package/dist/modules/auth.d.ts.map +1 -0
- package/dist/modules/auth.js +59 -0
- package/dist/modules/auth.js.map +1 -0
- package/dist/modules/calls.d.ts +825 -0
- package/dist/modules/calls.d.ts.map +1 -0
- package/dist/modules/calls.js +398 -0
- package/dist/modules/calls.js.map +1 -0
- package/dist/modules/chat.d.ts +165 -0
- package/dist/modules/chat.d.ts.map +1 -0
- package/dist/modules/chat.js +169 -0
- package/dist/modules/chat.js.map +1 -0
- package/dist/modules/health.d.ts +45 -0
- package/dist/modules/health.d.ts.map +1 -0
- package/dist/modules/health.js +22 -0
- package/dist/modules/health.js.map +1 -0
- package/dist/modules/knowledge.d.ts +202 -0
- package/dist/modules/knowledge.d.ts.map +1 -0
- package/dist/modules/knowledge.js +147 -0
- package/dist/modules/knowledge.js.map +1 -0
- package/dist/modules/mcp.d.ts +140 -0
- package/dist/modules/mcp.d.ts.map +1 -0
- package/dist/modules/mcp.js +110 -0
- package/dist/modules/mcp.js.map +1 -0
- package/dist/modules/memory.d.ts +163 -0
- package/dist/modules/memory.d.ts.map +1 -0
- package/dist/modules/memory.js +208 -0
- package/dist/modules/memory.js.map +1 -0
- package/dist/modules/personas.d.ts +168 -0
- package/dist/modules/personas.d.ts.map +1 -0
- package/dist/modules/personas.js +106 -0
- package/dist/modules/personas.js.map +1 -0
- package/dist/modules/prompts.d.ts +128 -0
- package/dist/modules/prompts.d.ts.map +1 -0
- package/dist/modules/prompts.js +93 -0
- package/dist/modules/prompts.js.map +1 -0
- package/dist/modules/scenarios.d.ts +294 -0
- package/dist/modules/scenarios.d.ts.map +1 -0
- package/dist/modules/scenarios.js +349 -0
- package/dist/modules/scenarios.js.map +1 -0
- package/dist/modules/scorecard.d.ts +642 -0
- package/dist/modules/scorecard.d.ts.map +1 -0
- package/dist/modules/scorecard.js +327 -0
- package/dist/modules/scorecard.js.map +1 -0
- package/dist/modules/tools.d.ts +222 -0
- package/dist/modules/tools.d.ts.map +1 -0
- package/dist/modules/tools.js +302 -0
- package/dist/modules/tools.js.map +1 -0
- package/dist/modules/toolsets.d.ts +173 -0
- package/dist/modules/toolsets.d.ts.map +1 -0
- package/dist/modules/toolsets.js +216 -0
- package/dist/modules/toolsets.js.map +1 -0
- package/dist/modules/transcript.d.ts +60 -0
- package/dist/modules/transcript.d.ts.map +1 -0
- package/dist/modules/transcript.js +69 -0
- package/dist/modules/transcript.js.map +1 -0
- package/dist/modules/workspace.d.ts +48 -0
- package/dist/modules/workspace.d.ts.map +1 -0
- package/dist/modules/workspace.js +49 -0
- package/dist/modules/workspace.js.map +1 -0
- package/dist/types/api.d.ts +8 -0
- package/dist/types/api.d.ts.map +1 -0
- package/dist/types/api.js +25 -0
- package/dist/types/api.js.map +1 -0
- package/dist/types/config.d.ts +70 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +3 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/memory.d.ts +243 -0
- package/dist/types/memory.d.ts.map +1 -0
- package/dist/types/memory.js +9 -0
- package/dist/types/memory.js.map +1 -0
- package/dist/types/tool-calls.d.ts +61 -0
- package/dist/types/tool-calls.d.ts.map +1 -0
- package/dist/types/tool-calls.js +9 -0
- package/dist/types/tool-calls.js.map +1 -0
- package/dist/types/tools.d.ts +321 -0
- package/dist/types/tools.d.ts.map +1 -0
- package/dist/types/tools.js +9 -0
- package/dist/types/tools.js.map +1 -0
- package/dist/types/toolsets.d.ts +149 -0
- package/dist/types/toolsets.d.ts.map +1 -0
- package/dist/types/toolsets.js +8 -0
- package/dist/types/toolsets.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { TypedEventEmitter } from './typed-emitter';
|
|
2
|
+
export type { LiveOptions } from './types';
|
|
3
|
+
export { LiveCall } from './live-call';
|
|
4
|
+
export type { LiveCallEvents } from './live-call';
|
|
5
|
+
export { LiveExecution } from './live-execution';
|
|
6
|
+
export type { LiveExecutionEvents, ExecutionStepEvent } from './live-execution';
|
|
7
|
+
export { LiveChat } from './live-chat';
|
|
8
|
+
export type { LiveChatEvents, LiveChatSendOptions } from './live-chat';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/live/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAGpD,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAG3C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAGhF,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,YAAY,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LiveChat = exports.LiveExecution = exports.LiveCall = exports.TypedEventEmitter = void 0;
|
|
4
|
+
// Base
|
|
5
|
+
var typed_emitter_1 = require("./typed-emitter");
|
|
6
|
+
Object.defineProperty(exports, "TypedEventEmitter", { enumerable: true, get: function () { return typed_emitter_1.TypedEventEmitter; } });
|
|
7
|
+
// LiveCall
|
|
8
|
+
var live_call_1 = require("./live-call");
|
|
9
|
+
Object.defineProperty(exports, "LiveCall", { enumerable: true, get: function () { return live_call_1.LiveCall; } });
|
|
10
|
+
// LiveExecution
|
|
11
|
+
var live_execution_1 = require("./live-execution");
|
|
12
|
+
Object.defineProperty(exports, "LiveExecution", { enumerable: true, get: function () { return live_execution_1.LiveExecution; } });
|
|
13
|
+
// LiveChat
|
|
14
|
+
var live_chat_1 = require("./live-chat");
|
|
15
|
+
Object.defineProperty(exports, "LiveChat", { enumerable: true, get: function () { return live_chat_1.LiveChat; } });
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/live/index.ts"],"names":[],"mappings":";;;AAAA,OAAO;AACP,iDAAoD;AAA3C,kHAAA,iBAAiB,OAAA;AAK1B,WAAW;AACX,yCAAuC;AAA9B,qGAAA,QAAQ,OAAA;AAGjB,gBAAgB;AAChB,mDAAiD;AAAxC,+GAAA,aAAa,OAAA;AAGtB,WAAW;AACX,yCAAuC;AAA9B,qGAAA,QAAQ,OAAA"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { TypedEventEmitter } from './typed-emitter';
|
|
2
|
+
import type { TranscriptSegment, LiveOptions } from './types';
|
|
3
|
+
import type { ChanlSDK } from '../client';
|
|
4
|
+
import type { Call, CallScorecardResult } from '../modules/calls';
|
|
5
|
+
export type LiveCallEvents = {
|
|
6
|
+
'status': (status: string, call: Call) => void;
|
|
7
|
+
'transcript': (segment: TranscriptSegment) => void;
|
|
8
|
+
'ended': (summary: {
|
|
9
|
+
status: string;
|
|
10
|
+
duration: number;
|
|
11
|
+
}) => void;
|
|
12
|
+
'scorecard': (results: CallScorecardResult[]) => void;
|
|
13
|
+
'error': (error: Error) => void;
|
|
14
|
+
'timeout': () => void;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Live voice call monitor.
|
|
18
|
+
*
|
|
19
|
+
* Polls call status and transcript, emitting typed events as data arrives.
|
|
20
|
+
* Automatically fetches scorecard results when the call reaches a terminal state.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```typescript
|
|
24
|
+
* const live = await sdk.calls.start(wsId, { agentId, phone });
|
|
25
|
+
* live.on('status', (s) => console.log('Status:', s));
|
|
26
|
+
* live.on('transcript', (seg) => console.log(`${seg.speaker}: ${seg.text}`));
|
|
27
|
+
* live.on('ended', (sum) => console.log(`Done: ${sum.status}`));
|
|
28
|
+
* live.on('scorecard', (r) => console.log('Score:', r[0]?.overallScore));
|
|
29
|
+
* await live.completed;
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export declare class LiveCall extends TypedEventEmitter<LiveCallEvents> {
|
|
33
|
+
private sdk;
|
|
34
|
+
readonly callId: string;
|
|
35
|
+
/** Resolves when monitoring ends (terminal status, timeout, or stop). */
|
|
36
|
+
readonly completed: Promise<void>;
|
|
37
|
+
private _resolveCompleted;
|
|
38
|
+
private abortController;
|
|
39
|
+
private pollInterval;
|
|
40
|
+
private maxPolls;
|
|
41
|
+
constructor(sdk: ChanlSDK, callId: string, options?: LiveOptions);
|
|
42
|
+
/** Stop monitoring. The call itself continues in the background. */
|
|
43
|
+
stop(): void;
|
|
44
|
+
private poll;
|
|
45
|
+
private fetchScorecard;
|
|
46
|
+
private sleep;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=live-call.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-call.d.ts","sourceRoot":"","sources":["../../src/live/live-call.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,KAAK,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAElE,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IACnD,YAAY,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACnD,OAAO,EAAO,CAAC,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACtE,WAAW,EAAG,CAAC,OAAO,EAAE,mBAAmB,EAAE,KAAK,IAAI,CAAC;IACvD,OAAO,EAAO,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACrC,SAAS,EAAK,MAAM,IAAI,CAAC;CAC1B,CAAC;AAMF;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,QAAS,SAAQ,iBAAiB,CAAC,cAAc,CAAC;IAW3D,OAAO,CAAC,GAAG;IAVb,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,yEAAyE;IACzE,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAElC,OAAO,CAAC,iBAAiB,CAAc;IACvC,OAAO,CAAC,eAAe,CAAyB;IAChD,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAS;gBAGf,GAAG,EAAE,QAAQ,EACrB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,WAAW;IAkBvB,oEAAoE;IACpE,IAAI,IAAI,IAAI;YAQE,IAAI;YAsEJ,cAAc;IAqB5B,OAAO,CAAC,KAAK;CAad"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LiveCall = void 0;
|
|
4
|
+
const typed_emitter_1 = require("./typed-emitter");
|
|
5
|
+
const TERMINAL_CALL_STATUSES = new Set([
|
|
6
|
+
'ended', 'completed', 'failed', 'no-answer', 'busy', 'cancelled',
|
|
7
|
+
]);
|
|
8
|
+
/**
|
|
9
|
+
* Live voice call monitor.
|
|
10
|
+
*
|
|
11
|
+
* Polls call status and transcript, emitting typed events as data arrives.
|
|
12
|
+
* Automatically fetches scorecard results when the call reaches a terminal state.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* const live = await sdk.calls.start(wsId, { agentId, phone });
|
|
17
|
+
* live.on('status', (s) => console.log('Status:', s));
|
|
18
|
+
* live.on('transcript', (seg) => console.log(`${seg.speaker}: ${seg.text}`));
|
|
19
|
+
* live.on('ended', (sum) => console.log(`Done: ${sum.status}`));
|
|
20
|
+
* live.on('scorecard', (r) => console.log('Score:', r[0]?.overallScore));
|
|
21
|
+
* await live.completed;
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
class LiveCall extends typed_emitter_1.TypedEventEmitter {
|
|
25
|
+
constructor(sdk, callId, options) {
|
|
26
|
+
super();
|
|
27
|
+
this.sdk = sdk;
|
|
28
|
+
this.abortController = new AbortController();
|
|
29
|
+
this.callId = callId;
|
|
30
|
+
this.pollInterval = options?.pollInterval ?? 2000;
|
|
31
|
+
this.maxPolls = options?.maxPolls ?? 150;
|
|
32
|
+
this.completed = new Promise((resolve) => {
|
|
33
|
+
this._resolveCompleted = resolve;
|
|
34
|
+
});
|
|
35
|
+
if (options?.signal) {
|
|
36
|
+
options.signal.addEventListener('abort', () => this.abortController.abort(), { once: true });
|
|
37
|
+
}
|
|
38
|
+
void this.poll();
|
|
39
|
+
}
|
|
40
|
+
/** Stop monitoring. The call itself continues in the background. */
|
|
41
|
+
stop() {
|
|
42
|
+
this.abortController.abort();
|
|
43
|
+
}
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
// Internal polling
|
|
46
|
+
// ---------------------------------------------------------------------------
|
|
47
|
+
async poll() {
|
|
48
|
+
let seenSegmentCount = 0;
|
|
49
|
+
const startTime = Date.now();
|
|
50
|
+
try {
|
|
51
|
+
for (let i = 0; i < this.maxPolls; i++) {
|
|
52
|
+
if (this.abortController.signal.aborted)
|
|
53
|
+
return;
|
|
54
|
+
// --- Call status ---
|
|
55
|
+
try {
|
|
56
|
+
const callResponse = await this.sdk.calls.get(this.callId);
|
|
57
|
+
if (callResponse.success && callResponse.data) {
|
|
58
|
+
// Defensive: SDK may or may not have single-key-unwrapped the response
|
|
59
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
60
|
+
const raw = callResponse.data;
|
|
61
|
+
const call = raw.call || raw;
|
|
62
|
+
const status = call.status || 'unknown';
|
|
63
|
+
this.emit('status', status, call);
|
|
64
|
+
if (TERMINAL_CALL_STATUSES.has(status)) {
|
|
65
|
+
const duration = Math.floor((Date.now() - startTime) / 1000);
|
|
66
|
+
this.emit('ended', { status, duration });
|
|
67
|
+
await this.fetchScorecard();
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
this.emit('error', err instanceof Error ? err : new Error(String(err)));
|
|
74
|
+
}
|
|
75
|
+
// --- Transcript segments ---
|
|
76
|
+
try {
|
|
77
|
+
const txResponse = await this.sdk.calls.getTranscript(this.callId);
|
|
78
|
+
if (txResponse.success && txResponse.data) {
|
|
79
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
80
|
+
const raw = txResponse.data;
|
|
81
|
+
const transcript = raw.transcript || raw;
|
|
82
|
+
if (transcript?.segments && transcript.segments.length > seenSegmentCount) {
|
|
83
|
+
const newSegs = transcript.segments.slice(seenSegmentCount);
|
|
84
|
+
for (const seg of newSegs) {
|
|
85
|
+
this.emit('transcript', {
|
|
86
|
+
speaker: seg.speaker,
|
|
87
|
+
text: seg.text,
|
|
88
|
+
start: seg.start,
|
|
89
|
+
end: seg.end,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
seenSegmentCount = transcript.segments.length;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
// Transcript not available yet — normal during early call stages
|
|
98
|
+
}
|
|
99
|
+
await this.sleep(this.pollInterval);
|
|
100
|
+
}
|
|
101
|
+
// Max polls exhausted
|
|
102
|
+
this.emit('timeout');
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
this.emit('error', err instanceof Error ? err : new Error(String(err)));
|
|
106
|
+
}
|
|
107
|
+
finally {
|
|
108
|
+
this._resolveCompleted();
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
async fetchScorecard() {
|
|
112
|
+
for (let i = 0; i < 10; i++) {
|
|
113
|
+
if (this.abortController.signal.aborted)
|
|
114
|
+
return;
|
|
115
|
+
try {
|
|
116
|
+
const response = await this.sdk.calls.getScorecard(this.callId);
|
|
117
|
+
if (response.success && response.data) {
|
|
118
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
119
|
+
const raw = response.data;
|
|
120
|
+
const results = Array.isArray(raw) ? raw : raw.results || [];
|
|
121
|
+
if (results.length > 0) {
|
|
122
|
+
this.emit('scorecard', results);
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
// Scorecard may not be ready yet
|
|
129
|
+
}
|
|
130
|
+
await this.sleep(2000);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
sleep(ms) {
|
|
134
|
+
return new Promise((resolve) => {
|
|
135
|
+
const onAbort = () => {
|
|
136
|
+
clearTimeout(timeout);
|
|
137
|
+
resolve();
|
|
138
|
+
};
|
|
139
|
+
const timeout = setTimeout(() => {
|
|
140
|
+
this.abortController.signal.removeEventListener('abort', onAbort);
|
|
141
|
+
resolve();
|
|
142
|
+
}, ms);
|
|
143
|
+
this.abortController.signal.addEventListener('abort', onAbort, { once: true });
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
exports.LiveCall = LiveCall;
|
|
148
|
+
//# sourceMappingURL=live-call.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-call.js","sourceRoot":"","sources":["../../src/live/live-call.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { TypedEventEmitter } from './typed-emitter';
|
|
2
|
+
import type { ChanlSDK } from '../client';
|
|
3
|
+
import type { ChatSessionResponse, ChatMessageResponse } from '../modules/chat';
|
|
4
|
+
export type LiveChatEvents = {
|
|
5
|
+
'message': (message: ChatMessageResponse) => void;
|
|
6
|
+
'delta': (text: string) => void;
|
|
7
|
+
'ended': () => void;
|
|
8
|
+
'error': (error: Error) => void;
|
|
9
|
+
};
|
|
10
|
+
export interface LiveChatSendOptions {
|
|
11
|
+
/** Enable streaming — text arrives via `delta` events / `onChunk` callback */
|
|
12
|
+
stream?: boolean;
|
|
13
|
+
/** Per-message callback for streaming text chunks */
|
|
14
|
+
onChunk?: (delta: string) => void;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Live chat session wrapper.
|
|
18
|
+
*
|
|
19
|
+
* Wraps an active chat session, emitting typed events for messages and
|
|
20
|
+
* session lifecycle. Unlike LiveCall/LiveExecution, this is not polling-based —
|
|
21
|
+
* events fire in response to explicit `send()` and `end()` calls.
|
|
22
|
+
*
|
|
23
|
+
* @example Non-streaming
|
|
24
|
+
* ```typescript
|
|
25
|
+
* const chat = await sdk.chat.session(wsId, agentId);
|
|
26
|
+
* const reply = await chat.send('Hello!');
|
|
27
|
+
* console.log(reply.message);
|
|
28
|
+
* await chat.end();
|
|
29
|
+
* ```
|
|
30
|
+
*
|
|
31
|
+
* @example Streaming with event listener
|
|
32
|
+
* ```typescript
|
|
33
|
+
* const chat = await sdk.chat.session(wsId, agentId);
|
|
34
|
+
* chat.on('delta', (text) => process.stdout.write(text));
|
|
35
|
+
* const reply = await chat.send('Hello!', { stream: true });
|
|
36
|
+
* await chat.end();
|
|
37
|
+
* ```
|
|
38
|
+
*
|
|
39
|
+
* @example Streaming with callback
|
|
40
|
+
* ```typescript
|
|
41
|
+
* const chat = await sdk.chat.session(wsId, agentId);
|
|
42
|
+
* const reply = await chat.send('Hello!', {
|
|
43
|
+
* stream: true,
|
|
44
|
+
* onChunk: (delta) => process.stdout.write(delta),
|
|
45
|
+
* });
|
|
46
|
+
* await chat.end();
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
export declare class LiveChat extends TypedEventEmitter<LiveChatEvents> {
|
|
50
|
+
private sdk;
|
|
51
|
+
readonly sessionId: string;
|
|
52
|
+
readonly agentName: string | undefined;
|
|
53
|
+
constructor(sdk: ChanlSDK, sessionData: ChatSessionResponse);
|
|
54
|
+
/**
|
|
55
|
+
* Send a message and receive the agent's response.
|
|
56
|
+
*
|
|
57
|
+
* With `{ stream: true }`, text arrives incrementally via the `delta`
|
|
58
|
+
* event and optional `onChunk` callback. The returned promise resolves
|
|
59
|
+
* with the complete response after the stream finishes.
|
|
60
|
+
*
|
|
61
|
+
* Without streaming (default), waits for the full response including
|
|
62
|
+
* tool calls and usage metadata.
|
|
63
|
+
*/
|
|
64
|
+
send(text: string, options?: LiveChatSendOptions): Promise<ChatMessageResponse>;
|
|
65
|
+
/**
|
|
66
|
+
* End the chat session. Emits an `ended` event.
|
|
67
|
+
*/
|
|
68
|
+
end(): Promise<void>;
|
|
69
|
+
private sendStreaming;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=live-chat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-chat.d.ts","sourceRoot":"","sources":["../../src/live/live-chat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,KAAK,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEhF,MAAM,MAAM,cAAc,GAAG;IAC3B,SAAS,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,IAAI,CAAC;IAClD,OAAO,EAAI,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,OAAO,EAAI,MAAM,IAAI,CAAC;IACtB,OAAO,EAAI,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACnC,CAAC;AAEF,MAAM,WAAW,mBAAmB;IAClC,8EAA8E;IAC9E,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,qDAAqD;IACrD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,qBAAa,QAAS,SAAQ,iBAAiB,CAAC,cAAc,CAAC;IAK3D,OAAO,CAAC,GAAG;IAJb,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;gBAG7B,GAAG,EAAE,QAAQ,EACrB,WAAW,EAAE,mBAAmB;IAOlC;;;;;;;;;OASG;IACG,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAiBrF;;OAEG;IACG,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;YASZ,aAAa;CAmB5B"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LiveChat = void 0;
|
|
4
|
+
const typed_emitter_1 = require("./typed-emitter");
|
|
5
|
+
/**
|
|
6
|
+
* Live chat session wrapper.
|
|
7
|
+
*
|
|
8
|
+
* Wraps an active chat session, emitting typed events for messages and
|
|
9
|
+
* session lifecycle. Unlike LiveCall/LiveExecution, this is not polling-based —
|
|
10
|
+
* events fire in response to explicit `send()` and `end()` calls.
|
|
11
|
+
*
|
|
12
|
+
* @example Non-streaming
|
|
13
|
+
* ```typescript
|
|
14
|
+
* const chat = await sdk.chat.session(wsId, agentId);
|
|
15
|
+
* const reply = await chat.send('Hello!');
|
|
16
|
+
* console.log(reply.message);
|
|
17
|
+
* await chat.end();
|
|
18
|
+
* ```
|
|
19
|
+
*
|
|
20
|
+
* @example Streaming with event listener
|
|
21
|
+
* ```typescript
|
|
22
|
+
* const chat = await sdk.chat.session(wsId, agentId);
|
|
23
|
+
* chat.on('delta', (text) => process.stdout.write(text));
|
|
24
|
+
* const reply = await chat.send('Hello!', { stream: true });
|
|
25
|
+
* await chat.end();
|
|
26
|
+
* ```
|
|
27
|
+
*
|
|
28
|
+
* @example Streaming with callback
|
|
29
|
+
* ```typescript
|
|
30
|
+
* const chat = await sdk.chat.session(wsId, agentId);
|
|
31
|
+
* const reply = await chat.send('Hello!', {
|
|
32
|
+
* stream: true,
|
|
33
|
+
* onChunk: (delta) => process.stdout.write(delta),
|
|
34
|
+
* });
|
|
35
|
+
* await chat.end();
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
class LiveChat extends typed_emitter_1.TypedEventEmitter {
|
|
39
|
+
constructor(sdk, sessionData) {
|
|
40
|
+
super();
|
|
41
|
+
this.sdk = sdk;
|
|
42
|
+
this.sessionId = sessionData.interactionId || sessionData.sessionId;
|
|
43
|
+
this.agentName = sessionData.agentName;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Send a message and receive the agent's response.
|
|
47
|
+
*
|
|
48
|
+
* With `{ stream: true }`, text arrives incrementally via the `delta`
|
|
49
|
+
* event and optional `onChunk` callback. The returned promise resolves
|
|
50
|
+
* with the complete response after the stream finishes.
|
|
51
|
+
*
|
|
52
|
+
* Without streaming (default), waits for the full response including
|
|
53
|
+
* tool calls and usage metadata.
|
|
54
|
+
*/
|
|
55
|
+
async send(text, options) {
|
|
56
|
+
if (options?.stream) {
|
|
57
|
+
return this.sendStreaming(text, options);
|
|
58
|
+
}
|
|
59
|
+
const response = await this.sdk.chat.sendMessage(this.sessionId, text);
|
|
60
|
+
if (!response.success || !response.data) {
|
|
61
|
+
const error = new Error(response.message || 'Failed to send message');
|
|
62
|
+
this.emit('error', error);
|
|
63
|
+
throw error;
|
|
64
|
+
}
|
|
65
|
+
this.emit('message', response.data);
|
|
66
|
+
return response.data;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* End the chat session. Emits an `ended` event.
|
|
70
|
+
*/
|
|
71
|
+
async end() {
|
|
72
|
+
try {
|
|
73
|
+
await this.sdk.chat.endSession(this.sessionId);
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
// Best-effort cleanup
|
|
77
|
+
}
|
|
78
|
+
this.emit('ended');
|
|
79
|
+
}
|
|
80
|
+
async sendStreaming(text, options) {
|
|
81
|
+
const response = await this.sdk.chat.streamMessage(this.sessionId, text, (delta) => {
|
|
82
|
+
this.emit('delta', delta);
|
|
83
|
+
options.onChunk?.(delta);
|
|
84
|
+
});
|
|
85
|
+
if (!response.success || !response.data) {
|
|
86
|
+
const error = new Error(response.message || 'Failed to send message');
|
|
87
|
+
this.emit('error', error);
|
|
88
|
+
throw error;
|
|
89
|
+
}
|
|
90
|
+
this.emit('message', response.data);
|
|
91
|
+
return response.data;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
exports.LiveChat = LiveChat;
|
|
95
|
+
//# sourceMappingURL=live-chat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-chat.js","sourceRoot":"","sources":["../../src/live/live-chat.ts"],"names":[],"mappings":";;;AAAA,mDAAoD;AAkBpD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,MAAa,QAAS,SAAQ,iCAAiC;IAI7D,YACU,GAAa,EACrB,WAAgC;QAEhC,KAAK,EAAE,CAAC;QAHA,QAAG,GAAH,GAAG,CAAU;QAIrB,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,aAAa,IAAI,WAAW,CAAC,SAAS,CAAC;QACpE,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC;IACzC,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,IAAI,CAAC,IAAY,EAAE,OAA6B;QACpD,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC3C,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAEvE,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,IAAI,wBAAwB,CAAC,CAAC;YACtE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC1B,MAAM,KAAK,CAAC;QACd,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QACpC,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG;QACP,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACjD,CAAC;QAAC,MAAM,CAAC;YACP,sBAAsB;QACxB,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrB,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,IAAY,EAAE,OAA4B;QACpE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAChD,IAAI,CAAC,SAAS,EACd,IAAI,EACJ,CAAC,KAAa,EAAE,EAAE;YAChB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC1B,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC,CACF,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,IAAI,wBAAwB,CAAC,CAAC;YACtE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC1B,MAAM,KAAK,CAAC;QACd,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QACpC,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;CACF;AAvED,4BAuEC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { TypedEventEmitter } from './typed-emitter';
|
|
2
|
+
import type { TranscriptSegment, LiveOptions } from './types';
|
|
3
|
+
import type { ChanlSDK } from '../client';
|
|
4
|
+
import type { ScenarioExecution } from '../modules/scenarios';
|
|
5
|
+
import type { CallScorecardResult } from '../modules/calls';
|
|
6
|
+
import type { ToolCall } from '../types/tool-calls';
|
|
7
|
+
export type { ScenarioExecution };
|
|
8
|
+
export interface ExecutionStepEvent {
|
|
9
|
+
index: number;
|
|
10
|
+
stepId: string;
|
|
11
|
+
status: string;
|
|
12
|
+
response: string | undefined;
|
|
13
|
+
toolCalls: ToolCall[];
|
|
14
|
+
}
|
|
15
|
+
export type LiveExecutionEvents = {
|
|
16
|
+
'status': (status: string, execution: ScenarioExecution) => void;
|
|
17
|
+
'step': (step: ExecutionStepEvent) => void;
|
|
18
|
+
'transcript': (segment: TranscriptSegment) => void;
|
|
19
|
+
'completed': (execution: ScenarioExecution) => void;
|
|
20
|
+
'scorecard': (results: CallScorecardResult[]) => void;
|
|
21
|
+
'error': (error: Error) => void;
|
|
22
|
+
'timeout': () => void;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Live scenario execution monitor.
|
|
26
|
+
*
|
|
27
|
+
* Polls execution status and emits typed events. For voice scenarios,
|
|
28
|
+
* also polls the associated call's transcript and scorecard.
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```typescript
|
|
32
|
+
* const live = await sdk.scenarios.runLive(wsId, scenarioId, { agentId });
|
|
33
|
+
* live.on('step', (s) => console.log(`Step ${s.index}: ${s.status}`));
|
|
34
|
+
* live.on('transcript', (seg) => console.log(`${seg.speaker}: ${seg.text}`));
|
|
35
|
+
* live.on('completed', (exec) => console.log('Score:', exec.overallScore));
|
|
36
|
+
* await live.completed;
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
export declare class LiveExecution extends TypedEventEmitter<LiveExecutionEvents> {
|
|
40
|
+
private sdk;
|
|
41
|
+
readonly executionId: string;
|
|
42
|
+
/** Resolves when monitoring ends (terminal status, timeout, or stop). */
|
|
43
|
+
readonly completed: Promise<void>;
|
|
44
|
+
private _resolveCompleted;
|
|
45
|
+
private abortController;
|
|
46
|
+
private pollInterval;
|
|
47
|
+
private maxPolls;
|
|
48
|
+
constructor(sdk: ChanlSDK, executionId: string, options?: LiveOptions);
|
|
49
|
+
/** Stop monitoring. The execution itself continues in the background. */
|
|
50
|
+
stop(): void;
|
|
51
|
+
private poll;
|
|
52
|
+
private fetchScorecard;
|
|
53
|
+
private sleep;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=live-execution.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-execution.d.ts","sourceRoot":"","sources":["../../src/live/live-execution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAGpD,YAAY,EAAE,iBAAiB,EAAE,CAAC;AAElC,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,SAAS,EAAE,QAAQ,EAAE,CAAC;CACvB;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,EAAM,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACrE,MAAM,EAAQ,CAAC,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACjD,YAAY,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACnD,WAAW,EAAG,CAAC,SAAS,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACrD,WAAW,EAAG,CAAC,OAAO,EAAE,mBAAmB,EAAE,KAAK,IAAI,CAAC;IACvD,OAAO,EAAO,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACrC,SAAS,EAAK,MAAM,IAAI,CAAC;CAC1B,CAAC;AAMF;;;;;;;;;;;;;;GAcG;AACH,qBAAa,aAAc,SAAQ,iBAAiB,CAAC,mBAAmB,CAAC;IAWrE,OAAO,CAAC,GAAG;IAVb,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,yEAAyE;IACzE,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAElC,OAAO,CAAC,iBAAiB,CAAc;IACvC,OAAO,CAAC,eAAe,CAAyB;IAChD,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAS;gBAGf,GAAG,EAAE,QAAQ,EACrB,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,WAAW;IAkBvB,yEAAyE;IACzE,IAAI,IAAI,IAAI;YAQE,IAAI;YAgGJ,cAAc;IAqB5B,OAAO,CAAC,KAAK;CAad"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LiveExecution = void 0;
|
|
4
|
+
const typed_emitter_1 = require("./typed-emitter");
|
|
5
|
+
const TERMINAL_EXECUTION_STATUSES = new Set([
|
|
6
|
+
'completed', 'failed', 'timeout', 'cancelled',
|
|
7
|
+
]);
|
|
8
|
+
/**
|
|
9
|
+
* Live scenario execution monitor.
|
|
10
|
+
*
|
|
11
|
+
* Polls execution status and emits typed events. For voice scenarios,
|
|
12
|
+
* also polls the associated call's transcript and scorecard.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* const live = await sdk.scenarios.runLive(wsId, scenarioId, { agentId });
|
|
17
|
+
* live.on('step', (s) => console.log(`Step ${s.index}: ${s.status}`));
|
|
18
|
+
* live.on('transcript', (seg) => console.log(`${seg.speaker}: ${seg.text}`));
|
|
19
|
+
* live.on('completed', (exec) => console.log('Score:', exec.overallScore));
|
|
20
|
+
* await live.completed;
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
class LiveExecution extends typed_emitter_1.TypedEventEmitter {
|
|
24
|
+
constructor(sdk, executionId, options) {
|
|
25
|
+
super();
|
|
26
|
+
this.sdk = sdk;
|
|
27
|
+
this.abortController = new AbortController();
|
|
28
|
+
this.executionId = executionId;
|
|
29
|
+
this.pollInterval = options?.pollInterval ?? 2000;
|
|
30
|
+
this.maxPolls = options?.maxPolls ?? 150;
|
|
31
|
+
this.completed = new Promise((resolve) => {
|
|
32
|
+
this._resolveCompleted = resolve;
|
|
33
|
+
});
|
|
34
|
+
if (options?.signal) {
|
|
35
|
+
options.signal.addEventListener('abort', () => this.abortController.abort(), { once: true });
|
|
36
|
+
}
|
|
37
|
+
void this.poll();
|
|
38
|
+
}
|
|
39
|
+
/** Stop monitoring. The execution itself continues in the background. */
|
|
40
|
+
stop() {
|
|
41
|
+
this.abortController.abort();
|
|
42
|
+
}
|
|
43
|
+
// ---------------------------------------------------------------------------
|
|
44
|
+
// Internal polling
|
|
45
|
+
// ---------------------------------------------------------------------------
|
|
46
|
+
async poll() {
|
|
47
|
+
let lastStepCount = 0;
|
|
48
|
+
let seenSegmentCount = 0;
|
|
49
|
+
let callId;
|
|
50
|
+
try {
|
|
51
|
+
for (let i = 0; i < this.maxPolls; i++) {
|
|
52
|
+
if (this.abortController.signal.aborted)
|
|
53
|
+
return;
|
|
54
|
+
// --- Execution status ---
|
|
55
|
+
try {
|
|
56
|
+
const response = await this.sdk.scenarios.getExecution(this.executionId);
|
|
57
|
+
if (!response.success || !response.data)
|
|
58
|
+
continue;
|
|
59
|
+
const { execution } = response.data;
|
|
60
|
+
const status = execution.status;
|
|
61
|
+
const stepCount = execution.stepResults?.length ?? 0;
|
|
62
|
+
// Discover call ID for voice scenarios
|
|
63
|
+
if (!callId && execution.callDetails?.callId) {
|
|
64
|
+
callId = execution.callDetails.callId;
|
|
65
|
+
}
|
|
66
|
+
this.emit('status', status, execution);
|
|
67
|
+
// Emit new step results
|
|
68
|
+
if (stepCount > lastStepCount && execution.stepResults) {
|
|
69
|
+
const newSteps = execution.stepResults.slice(lastStepCount);
|
|
70
|
+
for (let idx = 0; idx < newSteps.length; idx++) {
|
|
71
|
+
const step = newSteps[idx];
|
|
72
|
+
this.emit('step', {
|
|
73
|
+
index: lastStepCount + idx,
|
|
74
|
+
stepId: step.stepId,
|
|
75
|
+
status: step.status,
|
|
76
|
+
response: step.actualResponse,
|
|
77
|
+
toolCalls: step.toolCalls ?? [],
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
lastStepCount = stepCount;
|
|
81
|
+
}
|
|
82
|
+
// Terminal status
|
|
83
|
+
if (TERMINAL_EXECUTION_STATUSES.has(status)) {
|
|
84
|
+
this.emit('completed', execution);
|
|
85
|
+
// Voice scenarios: fetch scorecard from the associated call
|
|
86
|
+
if (callId) {
|
|
87
|
+
await this.fetchScorecard(callId);
|
|
88
|
+
}
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
this.emit('error', err instanceof Error ? err : new Error(String(err)));
|
|
94
|
+
}
|
|
95
|
+
// --- Transcript (voice scenarios only) ---
|
|
96
|
+
if (callId) {
|
|
97
|
+
try {
|
|
98
|
+
const txResponse = await this.sdk.calls.getTranscript(callId);
|
|
99
|
+
if (txResponse.success && txResponse.data) {
|
|
100
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
101
|
+
const raw = txResponse.data;
|
|
102
|
+
const transcript = raw.transcript || raw;
|
|
103
|
+
if (transcript?.segments && transcript.segments.length > seenSegmentCount) {
|
|
104
|
+
const newSegs = transcript.segments.slice(seenSegmentCount);
|
|
105
|
+
for (const seg of newSegs) {
|
|
106
|
+
this.emit('transcript', {
|
|
107
|
+
speaker: seg.speaker,
|
|
108
|
+
text: seg.text,
|
|
109
|
+
start: seg.start,
|
|
110
|
+
end: seg.end,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
seenSegmentCount = transcript.segments.length;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
// Transcript not available yet — normal
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
await this.sleep(this.pollInterval);
|
|
122
|
+
}
|
|
123
|
+
// Max polls exhausted
|
|
124
|
+
this.emit('timeout');
|
|
125
|
+
}
|
|
126
|
+
catch (err) {
|
|
127
|
+
this.emit('error', err instanceof Error ? err : new Error(String(err)));
|
|
128
|
+
}
|
|
129
|
+
finally {
|
|
130
|
+
this._resolveCompleted();
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
async fetchScorecard(callId) {
|
|
134
|
+
for (let i = 0; i < 10; i++) {
|
|
135
|
+
if (this.abortController.signal.aborted)
|
|
136
|
+
return;
|
|
137
|
+
try {
|
|
138
|
+
const response = await this.sdk.calls.getScorecard(callId);
|
|
139
|
+
if (response.success && response.data) {
|
|
140
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
141
|
+
const raw = response.data;
|
|
142
|
+
const results = Array.isArray(raw) ? raw : raw.results || [];
|
|
143
|
+
if (results.length > 0) {
|
|
144
|
+
this.emit('scorecard', results);
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
// Scorecard may not be ready yet
|
|
151
|
+
}
|
|
152
|
+
await this.sleep(2000);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
sleep(ms) {
|
|
156
|
+
return new Promise((resolve) => {
|
|
157
|
+
const onAbort = () => {
|
|
158
|
+
clearTimeout(timeout);
|
|
159
|
+
resolve();
|
|
160
|
+
};
|
|
161
|
+
const timeout = setTimeout(() => {
|
|
162
|
+
this.abortController.signal.removeEventListener('abort', onAbort);
|
|
163
|
+
resolve();
|
|
164
|
+
}, ms);
|
|
165
|
+
this.abortController.signal.addEventListener('abort', onAbort, { once: true });
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
exports.LiveExecution = LiveExecution;
|
|
170
|
+
//# sourceMappingURL=live-execution.js.map
|