@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.
Files changed (137) hide show
  1. package/dist/adapters/openai.d.ts +106 -0
  2. package/dist/adapters/openai.d.ts.map +1 -0
  3. package/dist/adapters/openai.js +185 -0
  4. package/dist/adapters/openai.js.map +1 -0
  5. package/dist/client.d.ts +74 -0
  6. package/dist/client.d.ts.map +1 -0
  7. package/dist/client.js +293 -0
  8. package/dist/client.js.map +1 -0
  9. package/dist/errors/index.d.ts +179 -0
  10. package/dist/errors/index.d.ts.map +1 -0
  11. package/dist/errors/index.js +319 -0
  12. package/dist/errors/index.js.map +1 -0
  13. package/dist/index.d.ts +38 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +76 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/live/index.d.ts +9 -0
  18. package/dist/live/index.d.ts.map +1 -0
  19. package/dist/live/index.js +16 -0
  20. package/dist/live/index.js.map +1 -0
  21. package/dist/live/live-call.d.ts +48 -0
  22. package/dist/live/live-call.d.ts.map +1 -0
  23. package/dist/live/live-call.js +148 -0
  24. package/dist/live/live-call.js.map +1 -0
  25. package/dist/live/live-chat.d.ts +71 -0
  26. package/dist/live/live-chat.d.ts.map +1 -0
  27. package/dist/live/live-chat.js +95 -0
  28. package/dist/live/live-chat.js.map +1 -0
  29. package/dist/live/live-execution.d.ts +55 -0
  30. package/dist/live/live-execution.d.ts.map +1 -0
  31. package/dist/live/live-execution.js +170 -0
  32. package/dist/live/live-execution.js.map +1 -0
  33. package/dist/live/typed-emitter.d.ts +15 -0
  34. package/dist/live/typed-emitter.d.ts.map +1 -0
  35. package/dist/live/typed-emitter.js +40 -0
  36. package/dist/live/typed-emitter.js.map +1 -0
  37. package/dist/live/types.d.ts +24 -0
  38. package/dist/live/types.d.ts.map +1 -0
  39. package/dist/live/types.js +6 -0
  40. package/dist/live/types.js.map +1 -0
  41. package/dist/modules/agents.d.ts +378 -0
  42. package/dist/modules/agents.d.ts.map +1 -0
  43. package/dist/modules/agents.js +259 -0
  44. package/dist/modules/agents.js.map +1 -0
  45. package/dist/modules/alerts.d.ts +43 -0
  46. package/dist/modules/alerts.d.ts.map +1 -0
  47. package/dist/modules/alerts.js +56 -0
  48. package/dist/modules/alerts.js.map +1 -0
  49. package/dist/modules/audio.d.ts +47 -0
  50. package/dist/modules/audio.d.ts.map +1 -0
  51. package/dist/modules/audio.js +75 -0
  52. package/dist/modules/audio.js.map +1 -0
  53. package/dist/modules/auth.d.ts +76 -0
  54. package/dist/modules/auth.d.ts.map +1 -0
  55. package/dist/modules/auth.js +59 -0
  56. package/dist/modules/auth.js.map +1 -0
  57. package/dist/modules/calls.d.ts +825 -0
  58. package/dist/modules/calls.d.ts.map +1 -0
  59. package/dist/modules/calls.js +398 -0
  60. package/dist/modules/calls.js.map +1 -0
  61. package/dist/modules/chat.d.ts +165 -0
  62. package/dist/modules/chat.d.ts.map +1 -0
  63. package/dist/modules/chat.js +169 -0
  64. package/dist/modules/chat.js.map +1 -0
  65. package/dist/modules/health.d.ts +45 -0
  66. package/dist/modules/health.d.ts.map +1 -0
  67. package/dist/modules/health.js +22 -0
  68. package/dist/modules/health.js.map +1 -0
  69. package/dist/modules/knowledge.d.ts +202 -0
  70. package/dist/modules/knowledge.d.ts.map +1 -0
  71. package/dist/modules/knowledge.js +147 -0
  72. package/dist/modules/knowledge.js.map +1 -0
  73. package/dist/modules/mcp.d.ts +140 -0
  74. package/dist/modules/mcp.d.ts.map +1 -0
  75. package/dist/modules/mcp.js +110 -0
  76. package/dist/modules/mcp.js.map +1 -0
  77. package/dist/modules/memory.d.ts +163 -0
  78. package/dist/modules/memory.d.ts.map +1 -0
  79. package/dist/modules/memory.js +208 -0
  80. package/dist/modules/memory.js.map +1 -0
  81. package/dist/modules/personas.d.ts +168 -0
  82. package/dist/modules/personas.d.ts.map +1 -0
  83. package/dist/modules/personas.js +106 -0
  84. package/dist/modules/personas.js.map +1 -0
  85. package/dist/modules/prompts.d.ts +128 -0
  86. package/dist/modules/prompts.d.ts.map +1 -0
  87. package/dist/modules/prompts.js +93 -0
  88. package/dist/modules/prompts.js.map +1 -0
  89. package/dist/modules/scenarios.d.ts +294 -0
  90. package/dist/modules/scenarios.d.ts.map +1 -0
  91. package/dist/modules/scenarios.js +349 -0
  92. package/dist/modules/scenarios.js.map +1 -0
  93. package/dist/modules/scorecard.d.ts +642 -0
  94. package/dist/modules/scorecard.d.ts.map +1 -0
  95. package/dist/modules/scorecard.js +327 -0
  96. package/dist/modules/scorecard.js.map +1 -0
  97. package/dist/modules/tools.d.ts +222 -0
  98. package/dist/modules/tools.d.ts.map +1 -0
  99. package/dist/modules/tools.js +302 -0
  100. package/dist/modules/tools.js.map +1 -0
  101. package/dist/modules/toolsets.d.ts +173 -0
  102. package/dist/modules/toolsets.d.ts.map +1 -0
  103. package/dist/modules/toolsets.js +216 -0
  104. package/dist/modules/toolsets.js.map +1 -0
  105. package/dist/modules/transcript.d.ts +60 -0
  106. package/dist/modules/transcript.d.ts.map +1 -0
  107. package/dist/modules/transcript.js +69 -0
  108. package/dist/modules/transcript.js.map +1 -0
  109. package/dist/modules/workspace.d.ts +48 -0
  110. package/dist/modules/workspace.d.ts.map +1 -0
  111. package/dist/modules/workspace.js +49 -0
  112. package/dist/modules/workspace.js.map +1 -0
  113. package/dist/types/api.d.ts +8 -0
  114. package/dist/types/api.d.ts.map +1 -0
  115. package/dist/types/api.js +25 -0
  116. package/dist/types/api.js.map +1 -0
  117. package/dist/types/config.d.ts +70 -0
  118. package/dist/types/config.d.ts.map +1 -0
  119. package/dist/types/config.js +3 -0
  120. package/dist/types/config.js.map +1 -0
  121. package/dist/types/memory.d.ts +243 -0
  122. package/dist/types/memory.d.ts.map +1 -0
  123. package/dist/types/memory.js +9 -0
  124. package/dist/types/memory.js.map +1 -0
  125. package/dist/types/tool-calls.d.ts +61 -0
  126. package/dist/types/tool-calls.d.ts.map +1 -0
  127. package/dist/types/tool-calls.js +9 -0
  128. package/dist/types/tool-calls.js.map +1 -0
  129. package/dist/types/tools.d.ts +321 -0
  130. package/dist/types/tools.d.ts.map +1 -0
  131. package/dist/types/tools.js +9 -0
  132. package/dist/types/tools.js.map +1 -0
  133. package/dist/types/toolsets.d.ts +149 -0
  134. package/dist/types/toolsets.d.ts.map +1 -0
  135. package/dist/types/toolsets.js +8 -0
  136. package/dist/types/toolsets.js.map +1 -0
  137. 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