@guava-ai/guava-sdk 0.23.0 → 0.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -3
- package/bin/example-runner.ts +138 -11
- package/dist/bin/example-runner.d.ts +23 -6
- package/dist/bin/example-runner.js +112 -9
- package/dist/bin/example-runner.js.map +1 -1
- package/dist/examples/{example.test.js → agent-testing.test.js} +2 -2
- package/dist/examples/agent-testing.test.js.map +1 -0
- package/dist/examples/help-desk.js +22 -8
- package/dist/examples/help-desk.js.map +1 -1
- package/dist/examples/multiple-agents.d.ts +1 -0
- package/dist/examples/multiple-agents.js +52 -0
- package/dist/examples/multiple-agents.js.map +1 -0
- package/dist/examples/property-insurance.js +14 -3
- package/dist/examples/property-insurance.js.map +1 -1
- package/dist/examples/restaurant-waitlist.js +9 -1
- package/dist/examples/restaurant-waitlist.js.map +1 -1
- package/dist/examples/scheduling-outbound.js +5 -6
- package/dist/examples/scheduling-outbound.js.map +1 -1
- package/dist/src/action-item.d.ts +4 -4
- package/dist/src/action-item.js +1 -1
- package/dist/src/action-item.js.map +1 -1
- package/dist/src/agent.d.ts +31 -11
- package/dist/src/agent.js +278 -135
- package/dist/src/agent.js.map +1 -1
- package/dist/src/call.d.ts +12 -1
- package/dist/src/call.js +87 -24
- package/dist/src/call.js.map +1 -1
- package/dist/src/client.d.ts +3 -0
- package/dist/src/client.js +6 -0
- package/dist/src/client.js.map +1 -1
- package/dist/src/commands.d.ts +37 -9
- package/dist/src/commands.js +13 -3
- package/dist/src/commands.js.map +1 -1
- package/dist/src/events.d.ts +28 -1
- package/dist/src/events.js +10 -2
- package/dist/src/events.js.map +1 -1
- package/dist/src/example-utils.d.ts +2 -0
- package/dist/src/example-utils.js +115 -0
- package/dist/src/example-utils.js.map +1 -0
- package/dist/src/health.d.ts +35 -0
- package/dist/src/health.js +99 -0
- package/dist/src/health.js.map +1 -0
- package/dist/src/helpers/index.d.ts +1 -0
- package/dist/src/helpers/index.js +9 -0
- package/dist/src/helpers/index.js.map +1 -0
- package/dist/src/helpers/llm.d.ts +43 -1
- package/dist/src/helpers/llm.js +247 -0
- package/dist/src/helpers/llm.js.map +1 -1
- package/dist/src/helpers/server-rag.d.ts +25 -0
- package/dist/src/helpers/server-rag.js +119 -0
- package/dist/src/helpers/server-rag.js.map +1 -0
- package/dist/src/index.d.ts +3 -1
- package/dist/src/index.js +4 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/runner.d.ts +10 -0
- package/dist/src/runner.js +101 -0
- package/dist/src/runner.js.map +1 -0
- package/dist/src/socket/protocol.d.ts +4 -4
- package/dist/src/testing/mocks.d.ts +6 -0
- package/dist/src/testing/mocks.js +12 -0
- package/dist/src/testing/mocks.js.map +1 -1
- package/dist/src/testing/session.d.ts +7 -0
- package/dist/src/testing/session.js +3 -22
- package/dist/src/testing/session.js.map +1 -1
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/examples/{example.test.ts → agent-testing.test.ts} +1 -1
- package/examples/help-desk.ts +21 -12
- package/examples/multiple-agents.ts +18 -0
- package/examples/property-insurance.ts +15 -3
- package/examples/restaurant-waitlist.ts +10 -1
- package/examples/scheduling-outbound.ts +5 -6
- package/package.json +9 -1
- package/src/action-item.ts +1 -1
- package/src/agent.ts +273 -147
- package/src/call.ts +115 -24
- package/src/client.ts +7 -0
- package/src/commands.ts +16 -2
- package/src/events.ts +11 -1
- package/src/example-utils.ts +87 -0
- package/src/health.ts +120 -0
- package/src/helpers/index.ts +2 -0
- package/src/helpers/llm.ts +170 -1
- package/src/helpers/server-rag.ts +132 -0
- package/src/index.ts +3 -1
- package/src/runner.ts +39 -0
- package/src/testing/mocks.ts +17 -0
- package/src/testing/session.ts +2 -22
- package/src/version.ts +1 -1
- package/dist/examples/example.test.js.map +0 -1
- /package/dist/examples/{example.test.d.ts → agent-testing.test.d.ts} +0 -0
package/dist/src/helpers/llm.js
CHANGED
|
@@ -1,7 +1,80 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
|
|
19
|
+
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
|
|
20
|
+
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
|
|
21
|
+
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
|
|
22
|
+
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
|
|
23
|
+
var _, done = false;
|
|
24
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
25
|
+
var context = {};
|
|
26
|
+
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
|
|
27
|
+
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
|
|
28
|
+
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
|
|
29
|
+
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
|
|
30
|
+
if (kind === "accessor") {
|
|
31
|
+
if (result === void 0) continue;
|
|
32
|
+
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
|
|
33
|
+
if (_ = accept(result.get)) descriptor.get = _;
|
|
34
|
+
if (_ = accept(result.set)) descriptor.set = _;
|
|
35
|
+
if (_ = accept(result.init)) initializers.unshift(_);
|
|
36
|
+
}
|
|
37
|
+
else if (_ = accept(result)) {
|
|
38
|
+
if (kind === "field") initializers.unshift(_);
|
|
39
|
+
else descriptor[key] = _;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (target) Object.defineProperty(target, contextIn.name, descriptor);
|
|
43
|
+
done = true;
|
|
44
|
+
};
|
|
45
|
+
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
|
|
46
|
+
var useValue = arguments.length > 2;
|
|
47
|
+
for (var i = 0; i < initializers.length; i++) {
|
|
48
|
+
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
|
|
49
|
+
}
|
|
50
|
+
return useValue ? value : void 0;
|
|
51
|
+
};
|
|
52
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
53
|
+
var ownKeys = function(o) {
|
|
54
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
55
|
+
var ar = [];
|
|
56
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
57
|
+
return ar;
|
|
58
|
+
};
|
|
59
|
+
return ownKeys(o);
|
|
60
|
+
};
|
|
61
|
+
return function (mod) {
|
|
62
|
+
if (mod && mod.__esModule) return mod;
|
|
63
|
+
var result = {};
|
|
64
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
65
|
+
__setModuleDefault(result, mod);
|
|
66
|
+
return result;
|
|
67
|
+
};
|
|
68
|
+
})();
|
|
2
69
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
70
|
+
exports.IntentRecognizer = exports.DatetimeFilter = exports._filterSchema = exports.DocumentQA = void 0;
|
|
3
71
|
exports._generate = _generate;
|
|
72
|
+
exports._makeIntentSchema = _makeIntentSchema;
|
|
73
|
+
const z = __importStar(require("zod"));
|
|
74
|
+
const client_ts_1 = require("../client.js");
|
|
75
|
+
const telemetry_ts_1 = require("../telemetry.js");
|
|
4
76
|
const utils_ts_1 = require("../utils.js");
|
|
77
|
+
const server_rag_ts_1 = require("./server-rag.js");
|
|
5
78
|
async function _generate(client, prompt, jsonSchema) {
|
|
6
79
|
const url = new URL("v1/llm/generate", client.getHttpBase());
|
|
7
80
|
const body = { prompt };
|
|
@@ -11,7 +84,181 @@ async function _generate(client, prompt, jsonSchema) {
|
|
|
11
84
|
method: "POST",
|
|
12
85
|
headers: { ...(await client.headers()), "Content-Type": "application/json" },
|
|
13
86
|
body: JSON.stringify(body),
|
|
87
|
+
signal: AbortSignal.timeout(60_000),
|
|
14
88
|
});
|
|
15
89
|
return (await response.json()).text;
|
|
16
90
|
}
|
|
91
|
+
let DocumentQA = (() => {
|
|
92
|
+
let _classDecorators = [telemetry_ts_1.telemetryClient.trackClass()];
|
|
93
|
+
let _classDescriptor;
|
|
94
|
+
let _classExtraInitializers = [];
|
|
95
|
+
let _classThis;
|
|
96
|
+
var DocumentQA = class {
|
|
97
|
+
static { _classThis = this; }
|
|
98
|
+
static {
|
|
99
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
100
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
101
|
+
DocumentQA = _classThis = _classDescriptor.value;
|
|
102
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
103
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
104
|
+
}
|
|
105
|
+
_rag;
|
|
106
|
+
_instructions;
|
|
107
|
+
_initialized;
|
|
108
|
+
constructor({ documents, ids, instructions, namespace, } = {}) {
|
|
109
|
+
this._rag = new server_rag_ts_1.ServerRAG(new client_ts_1.Client(), { namespace });
|
|
110
|
+
this._instructions = instructions;
|
|
111
|
+
if (documents !== undefined) {
|
|
112
|
+
const docs = typeof documents === "string" ? [documents] : documents;
|
|
113
|
+
this._initialized = this._rag.reconcile(docs, ids);
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
this._initialized = Promise.resolve();
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
async upsertDocument(key, text) {
|
|
120
|
+
await this._initialized;
|
|
121
|
+
await this._rag.upsertDocument(key, text);
|
|
122
|
+
}
|
|
123
|
+
async addDocument(text) {
|
|
124
|
+
await this._initialized;
|
|
125
|
+
await this._rag.addDocument(text);
|
|
126
|
+
}
|
|
127
|
+
async deleteDocument(key) {
|
|
128
|
+
await this._initialized;
|
|
129
|
+
await this._rag.removeDocument(key);
|
|
130
|
+
}
|
|
131
|
+
async clear() {
|
|
132
|
+
await this._initialized;
|
|
133
|
+
await this._rag.clear();
|
|
134
|
+
}
|
|
135
|
+
async ask(question) {
|
|
136
|
+
await this._initialized;
|
|
137
|
+
const trackedKeys = this._rag.trackedKeys;
|
|
138
|
+
return this._rag.ask(question, {
|
|
139
|
+
documentKeys: trackedKeys.size > 0 ? [...trackedKeys] : undefined,
|
|
140
|
+
instructions: this._instructions,
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
return DocumentQA = _classThis;
|
|
145
|
+
})();
|
|
146
|
+
exports.DocumentQA = DocumentQA;
|
|
147
|
+
exports._filterSchema = z.object({
|
|
148
|
+
matching_appointments: z.array(z.string()),
|
|
149
|
+
other_appointments: z.array(z.string()),
|
|
150
|
+
});
|
|
151
|
+
let DatetimeFilter = (() => {
|
|
152
|
+
let _classDecorators = [telemetry_ts_1.telemetryClient.trackClass()];
|
|
153
|
+
let _classDescriptor;
|
|
154
|
+
let _classExtraInitializers = [];
|
|
155
|
+
let _classThis;
|
|
156
|
+
var DatetimeFilter = class {
|
|
157
|
+
static { _classThis = this; }
|
|
158
|
+
static {
|
|
159
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
160
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
161
|
+
DatetimeFilter = _classThis = _classDescriptor.value;
|
|
162
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
163
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
164
|
+
}
|
|
165
|
+
_client;
|
|
166
|
+
_slotsStr;
|
|
167
|
+
constructor(sourceList) {
|
|
168
|
+
this._client = new client_ts_1.Client();
|
|
169
|
+
this._slotsStr = sourceList.join("\n");
|
|
170
|
+
}
|
|
171
|
+
async filter(query, { maxResults = 5 } = {}) {
|
|
172
|
+
const today = new Date().toLocaleDateString("en-US", {
|
|
173
|
+
month: "long",
|
|
174
|
+
day: "numeric",
|
|
175
|
+
year: "numeric",
|
|
176
|
+
});
|
|
177
|
+
const prompt = `Return datetime slots from the list that match the query.
|
|
178
|
+
If none match, return close alternatives in other_appointments instead.
|
|
179
|
+
Never return datetimes that are not in the list.
|
|
180
|
+
|
|
181
|
+
Query: <query>${query}</query>
|
|
182
|
+
Today's Date: ${today}
|
|
183
|
+
Available slots:
|
|
184
|
+
${this._slotsStr}
|
|
185
|
+
|
|
186
|
+
Return at most ${maxResults} items per list.`;
|
|
187
|
+
const text = await _generate(this._client, prompt, z.toJSONSchema(exports._filterSchema));
|
|
188
|
+
const result = exports._filterSchema.parse(JSON.parse(text));
|
|
189
|
+
return [
|
|
190
|
+
result.matching_appointments.slice(0, maxResults),
|
|
191
|
+
result.other_appointments.slice(0, maxResults),
|
|
192
|
+
];
|
|
193
|
+
}
|
|
194
|
+
};
|
|
195
|
+
return DatetimeFilter = _classThis;
|
|
196
|
+
})();
|
|
197
|
+
exports.DatetimeFilter = DatetimeFilter;
|
|
198
|
+
function _makeIntentSchema(choiceList) {
|
|
199
|
+
return z
|
|
200
|
+
.object({
|
|
201
|
+
possible_matches: z
|
|
202
|
+
.array(z.enum(choiceList))
|
|
203
|
+
.describe("Choices that could match the caller's intent, ordered by likelihood. Include all plausible matches."),
|
|
204
|
+
})
|
|
205
|
+
.meta({ title: "ChoiceModel" });
|
|
206
|
+
}
|
|
207
|
+
let IntentRecognizer = (() => {
|
|
208
|
+
let _classDecorators = [telemetry_ts_1.telemetryClient.trackClass()];
|
|
209
|
+
let _classDescriptor;
|
|
210
|
+
let _classExtraInitializers = [];
|
|
211
|
+
let _classThis;
|
|
212
|
+
var IntentRecognizer = class {
|
|
213
|
+
static { _classThis = this; }
|
|
214
|
+
static {
|
|
215
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
216
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
217
|
+
IntentRecognizer = _classThis = _classDescriptor.value;
|
|
218
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
219
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
220
|
+
}
|
|
221
|
+
_client;
|
|
222
|
+
_intentChoices;
|
|
223
|
+
_schema;
|
|
224
|
+
constructor(intentChoices) {
|
|
225
|
+
this._client = new client_ts_1.Client();
|
|
226
|
+
this._intentChoices = intentChoices;
|
|
227
|
+
const choiceList = Array.isArray(intentChoices) ? intentChoices : Object.keys(intentChoices);
|
|
228
|
+
this._schema = _makeIntentSchema(choiceList);
|
|
229
|
+
}
|
|
230
|
+
async classify(intent) {
|
|
231
|
+
const choiceList = Array.isArray(this._intentChoices)
|
|
232
|
+
? this._intentChoices
|
|
233
|
+
: Object.keys(this._intentChoices);
|
|
234
|
+
let prompt = `Classify the intent below into the most appropriate choice(s) from the list.
|
|
235
|
+
|
|
236
|
+
Intent: <intent>${intent}</intent>
|
|
237
|
+
Available Choices: ${JSON.stringify(choiceList)}
|
|
238
|
+
|
|
239
|
+
Rules:
|
|
240
|
+
- Default to returning a single choice — the one that best matches the intent.
|
|
241
|
+
- Only return additional choices when the intent is genuinely ambiguous: a reasonable person reading it would be unable to decide which category it belongs to. Thematic overlap or partial relevance is NOT enough — do not include weakly or tangentially related choices.
|
|
242
|
+
- Order matches by likelihood (most likely first).
|
|
243
|
+
- If no choice plausibly matches, return an empty list.`;
|
|
244
|
+
if (!Array.isArray(this._intentChoices)) {
|
|
245
|
+
const descriptionString = Object.entries(this._intentChoices)
|
|
246
|
+
.map(([key, val]) => `${key}: ${val}`)
|
|
247
|
+
.join("\n ");
|
|
248
|
+
prompt += `\n\nDetailed descriptions of each choice:\n ${descriptionString}`;
|
|
249
|
+
}
|
|
250
|
+
const text = await _generate(this._client, prompt, z.toJSONSchema(this._schema));
|
|
251
|
+
const { possible_matches: keys } = this._schema.parse(JSON.parse(text));
|
|
252
|
+
if (!keys.length)
|
|
253
|
+
return null;
|
|
254
|
+
if (!Array.isArray(this._intentChoices)) {
|
|
255
|
+
const choices = this._intentChoices;
|
|
256
|
+
return keys.map((k) => ({ key: k, description: choices[k] }));
|
|
257
|
+
}
|
|
258
|
+
return keys.map((k) => ({ key: k }));
|
|
259
|
+
}
|
|
260
|
+
};
|
|
261
|
+
return IntentRecognizer = _classThis;
|
|
262
|
+
})();
|
|
263
|
+
exports.IntentRecognizer = IntentRecognizer;
|
|
17
264
|
//# sourceMappingURL=llm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"llm.js","sourceRoot":"","sources":["../../../src/helpers/llm.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"llm.js","sourceRoot":"","sources":["../../../src/helpers/llm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Client } from "../client.ts";
|
|
2
|
+
export declare function _contentKey(text: string): string;
|
|
3
|
+
export declare function _prefixedKey(namespace: string | undefined, key: string): string;
|
|
4
|
+
export declare class ServerRAG {
|
|
5
|
+
private readonly _client;
|
|
6
|
+
private readonly _namespace;
|
|
7
|
+
readonly trackedKeys: Set<string>;
|
|
8
|
+
constructor(client: Client, { namespace }?: {
|
|
9
|
+
namespace?: string;
|
|
10
|
+
});
|
|
11
|
+
uploadDocument(key: string, text: string): Promise<void>;
|
|
12
|
+
deleteDocument(key: string): Promise<void>;
|
|
13
|
+
listDocuments(): Promise<{
|
|
14
|
+
key: string;
|
|
15
|
+
}[]>;
|
|
16
|
+
ask(question: string, { documentKeys, instructions }?: {
|
|
17
|
+
documentKeys?: string[];
|
|
18
|
+
instructions?: string;
|
|
19
|
+
}): Promise<string>;
|
|
20
|
+
reconcile(documents: string[], ids?: string[]): Promise<void>;
|
|
21
|
+
upsertDocument(key: string, text: string): Promise<void>;
|
|
22
|
+
addDocument(text: string): Promise<void>;
|
|
23
|
+
removeDocument(key: string): Promise<void>;
|
|
24
|
+
clear(): Promise<void>;
|
|
25
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ServerRAG = void 0;
|
|
4
|
+
exports._contentKey = _contentKey;
|
|
5
|
+
exports._prefixedKey = _prefixedKey;
|
|
6
|
+
const node_crypto_1 = require("node:crypto");
|
|
7
|
+
const utils_ts_1 = require("../utils.js");
|
|
8
|
+
function _contentKey(text) {
|
|
9
|
+
return (0, node_crypto_1.createHash)("sha256").update(text).digest("hex").slice(0, 16);
|
|
10
|
+
}
|
|
11
|
+
function _prefixedKey(namespace, key) {
|
|
12
|
+
return namespace ? `${namespace}.${key}` : key;
|
|
13
|
+
}
|
|
14
|
+
class ServerRAG {
|
|
15
|
+
_client;
|
|
16
|
+
_namespace;
|
|
17
|
+
trackedKeys = new Set();
|
|
18
|
+
constructor(client, { namespace } = {}) {
|
|
19
|
+
this._client = client;
|
|
20
|
+
this._namespace = namespace;
|
|
21
|
+
}
|
|
22
|
+
async uploadDocument(key, text) {
|
|
23
|
+
const url = new URL("v1/rag/documents", this._client.getHttpBase());
|
|
24
|
+
await (0, utils_ts_1.fetchOrThrow)(url, {
|
|
25
|
+
method: "POST",
|
|
26
|
+
headers: { ...(await this._client.headers()), "Content-Type": "application/json" },
|
|
27
|
+
body: JSON.stringify({ key, text }),
|
|
28
|
+
signal: AbortSignal.timeout(60_000),
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
async deleteDocument(key) {
|
|
32
|
+
const url = new URL(`v1/rag/documents/${key}`, this._client.getHttpBase());
|
|
33
|
+
await (0, utils_ts_1.fetchOrThrow)(url, {
|
|
34
|
+
method: "DELETE",
|
|
35
|
+
headers: await this._client.headers(),
|
|
36
|
+
signal: AbortSignal.timeout(30_000),
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
async listDocuments() {
|
|
40
|
+
const url = new URL("v1/rag/documents", this._client.getHttpBase());
|
|
41
|
+
const response = await (0, utils_ts_1.fetchOrThrow)(url, {
|
|
42
|
+
headers: await this._client.headers(),
|
|
43
|
+
signal: AbortSignal.timeout(30_000),
|
|
44
|
+
});
|
|
45
|
+
return (await response.json());
|
|
46
|
+
}
|
|
47
|
+
async ask(question, { documentKeys, instructions } = {}) {
|
|
48
|
+
const url = new URL("v1/rag/ask", this._client.getHttpBase());
|
|
49
|
+
const payload = { question };
|
|
50
|
+
if (documentKeys !== undefined)
|
|
51
|
+
payload.document_keys = documentKeys;
|
|
52
|
+
if (instructions !== undefined)
|
|
53
|
+
payload.instructions = instructions;
|
|
54
|
+
const response = await (0, utils_ts_1.fetchOrThrow)(url, {
|
|
55
|
+
method: "POST",
|
|
56
|
+
headers: { ...(await this._client.headers()), "Content-Type": "application/json" },
|
|
57
|
+
body: JSON.stringify(payload),
|
|
58
|
+
signal: AbortSignal.timeout(120_000),
|
|
59
|
+
});
|
|
60
|
+
const result = (await response.json());
|
|
61
|
+
if (result.warning)
|
|
62
|
+
console.warn(`Guava RAG: ${result.warning}`);
|
|
63
|
+
return result.answer;
|
|
64
|
+
}
|
|
65
|
+
async reconcile(documents, ids) {
|
|
66
|
+
if (ids !== undefined && ids.length !== documents.length) {
|
|
67
|
+
throw new Error(`ids length (${ids.length}) must match documents length (${documents.length})`);
|
|
68
|
+
}
|
|
69
|
+
const desired = new Map();
|
|
70
|
+
if (ids !== undefined) {
|
|
71
|
+
for (let i = 0; i < documents.length; i++) {
|
|
72
|
+
desired.set(_prefixedKey(this._namespace, ids[i]), documents[i]);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
for (const doc of documents) {
|
|
77
|
+
desired.set(_prefixedKey(this._namespace, _contentKey(doc)), doc);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
const existing = await this.listDocuments();
|
|
81
|
+
const existingKeys = new Set(existing.map((d) => d.key));
|
|
82
|
+
const scopedKeys = this._namespace
|
|
83
|
+
? new Set([...existingKeys].filter((k) => k.startsWith(`${this._namespace}.`)))
|
|
84
|
+
: existingKeys;
|
|
85
|
+
for (const [key, doc] of desired) {
|
|
86
|
+
if (ids !== undefined || !existingKeys.has(key)) {
|
|
87
|
+
await this.uploadDocument(key, doc);
|
|
88
|
+
}
|
|
89
|
+
this.trackedKeys.add(key);
|
|
90
|
+
}
|
|
91
|
+
const stale = [...scopedKeys].filter((k) => !desired.has(k));
|
|
92
|
+
for (const key of stale) {
|
|
93
|
+
await this.deleteDocument(key);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
async upsertDocument(key, text) {
|
|
97
|
+
const fullKey = _prefixedKey(this._namespace, key);
|
|
98
|
+
await this.uploadDocument(fullKey, text);
|
|
99
|
+
this.trackedKeys.add(fullKey);
|
|
100
|
+
}
|
|
101
|
+
async addDocument(text) {
|
|
102
|
+
const fullKey = _prefixedKey(this._namespace, _contentKey(text));
|
|
103
|
+
await this.uploadDocument(fullKey, text);
|
|
104
|
+
this.trackedKeys.add(fullKey);
|
|
105
|
+
}
|
|
106
|
+
async removeDocument(key) {
|
|
107
|
+
const fullKey = _prefixedKey(this._namespace, key);
|
|
108
|
+
await this.deleteDocument(fullKey);
|
|
109
|
+
this.trackedKeys.delete(fullKey);
|
|
110
|
+
}
|
|
111
|
+
async clear() {
|
|
112
|
+
for (const key of this.trackedKeys) {
|
|
113
|
+
await this.deleteDocument(key);
|
|
114
|
+
}
|
|
115
|
+
this.trackedKeys.clear();
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
exports.ServerRAG = ServerRAG;
|
|
119
|
+
//# sourceMappingURL=server-rag.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-rag.js","sourceRoot":"","sources":["../../../src/helpers/server-rag.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
export { Client, type InboundConnection } from "./client.ts";
|
|
2
|
+
export { Runner } from "./runner.ts";
|
|
2
3
|
export type { SmsMessage } from "./sms.ts";
|
|
3
4
|
export { CallController, type TaskObjective } from "./call-controller.ts";
|
|
4
5
|
export { Say, Field } from "./action-item.ts";
|
|
5
6
|
export { Logger, getConsoleLogger, getDefaultLogger } from "./logging.ts";
|
|
6
7
|
export { Agent, CallInfo } from "./agent.ts";
|
|
7
|
-
export { Call } from "./call.ts";
|
|
8
|
+
export { Call, DEFAULT_REACH_PERSON_OUTCOMES } from "./call.ts";
|
|
9
|
+
export type { ReachPersonOutcome } from "./call.ts";
|
|
8
10
|
export type { BotSessionEnded, TerminationReason, DTMFPressedEvent, DTMFDigit } from "./events.ts";
|
|
9
11
|
export { TestSession } from "./testing/session.ts";
|
|
10
12
|
export { MockCall } from "./testing/mocks.ts";
|
package/dist/src/index.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.MockCall = exports.TestSession = exports.Call = exports.Agent = exports.getDefaultLogger = exports.getConsoleLogger = exports.Field = exports.Say = exports.CallController = exports.Client = void 0;
|
|
3
|
+
exports.MockCall = exports.TestSession = exports.DEFAULT_REACH_PERSON_OUTCOMES = exports.Call = exports.Agent = exports.getDefaultLogger = exports.getConsoleLogger = exports.Field = exports.Say = exports.CallController = exports.Runner = exports.Client = void 0;
|
|
4
4
|
var client_ts_1 = require("./client.js");
|
|
5
5
|
Object.defineProperty(exports, "Client", { enumerable: true, get: function () { return client_ts_1.Client; } });
|
|
6
|
+
var runner_ts_1 = require("./runner.js");
|
|
7
|
+
Object.defineProperty(exports, "Runner", { enumerable: true, get: function () { return runner_ts_1.Runner; } });
|
|
6
8
|
var call_controller_ts_1 = require("./call-controller.js");
|
|
7
9
|
Object.defineProperty(exports, "CallController", { enumerable: true, get: function () { return call_controller_ts_1.CallController; } });
|
|
8
10
|
var action_item_ts_1 = require("./action-item.js");
|
|
@@ -15,6 +17,7 @@ var agent_ts_1 = require("./agent.js");
|
|
|
15
17
|
Object.defineProperty(exports, "Agent", { enumerable: true, get: function () { return agent_ts_1.Agent; } });
|
|
16
18
|
var call_ts_1 = require("./call.js");
|
|
17
19
|
Object.defineProperty(exports, "Call", { enumerable: true, get: function () { return call_ts_1.Call; } });
|
|
20
|
+
Object.defineProperty(exports, "DEFAULT_REACH_PERSON_OUTCOMES", { enumerable: true, get: function () { return call_ts_1.DEFAULT_REACH_PERSON_OUTCOMES; } });
|
|
18
21
|
var session_ts_1 = require("./testing/session.js");
|
|
19
22
|
Object.defineProperty(exports, "TestSession", { enumerable: true, get: function () { return session_ts_1.TestSession; } });
|
|
20
23
|
var mocks_ts_1 = require("./testing/mocks.js");
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,yCAA6D;AAApD,mGAAA,MAAM,OAAA;AAEf,2DAA0E;AAAjE,oHAAA,cAAc,OAAA;AACvB,mDAA8C;AAArC,qGAAA,GAAG,OAAA;AAAE,uGAAA,KAAK,OAAA;AACnB,2CAA0E;AAAzD,8GAAA,gBAAgB,OAAA;AAAE,8GAAA,gBAAgB,OAAA;AACnD,uCAA6C;AAApC,iGAAA,KAAK,OAAA;AACd,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,yCAA6D;AAApD,mGAAA,MAAM,OAAA;AACf,yCAAqC;AAA5B,mGAAA,MAAM,OAAA;AAEf,2DAA0E;AAAjE,oHAAA,cAAc,OAAA;AACvB,mDAA8C;AAArC,qGAAA,GAAG,OAAA;AAAE,uGAAA,KAAK,OAAA;AACnB,2CAA0E;AAAzD,8GAAA,gBAAgB,OAAA;AAAE,8GAAA,gBAAgB,OAAA;AACnD,uCAA6C;AAApC,iGAAA,KAAK,OAAA;AACd,qCAAgE;AAAvD,+FAAA,IAAI,OAAA;AAAE,wHAAA,6BAA6B,OAAA;AAG5C,mDAAmD;AAA1C,yGAAA,WAAW,OAAA;AACpB,+CAA8C;AAArC,oGAAA,QAAQ,OAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Agent } from "./agent.ts";
|
|
2
|
+
export declare class Runner {
|
|
3
|
+
private _healthCtx;
|
|
4
|
+
private _tasks;
|
|
5
|
+
listenPhone(agent: Agent, agentNumber: string): this;
|
|
6
|
+
listenWebrtc(agent: Agent, webrtcCode?: string): this;
|
|
7
|
+
listenSip(agent: Agent, sipCode: string): this;
|
|
8
|
+
attachCampaign(agent: Agent, campaignCode: string): this;
|
|
9
|
+
run(): Promise<void>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
|
|
3
|
+
if (value !== null && value !== void 0) {
|
|
4
|
+
if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
|
|
5
|
+
var dispose, inner;
|
|
6
|
+
if (async) {
|
|
7
|
+
if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
|
|
8
|
+
dispose = value[Symbol.asyncDispose];
|
|
9
|
+
}
|
|
10
|
+
if (dispose === void 0) {
|
|
11
|
+
if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
|
|
12
|
+
dispose = value[Symbol.dispose];
|
|
13
|
+
if (async) inner = dispose;
|
|
14
|
+
}
|
|
15
|
+
if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
|
|
16
|
+
if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
|
|
17
|
+
env.stack.push({ value: value, dispose: dispose, async: async });
|
|
18
|
+
}
|
|
19
|
+
else if (async) {
|
|
20
|
+
env.stack.push({ async: true });
|
|
21
|
+
}
|
|
22
|
+
return value;
|
|
23
|
+
};
|
|
24
|
+
var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
|
|
25
|
+
return function (env) {
|
|
26
|
+
function fail(e) {
|
|
27
|
+
env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
|
|
28
|
+
env.hasError = true;
|
|
29
|
+
}
|
|
30
|
+
var r, s = 0;
|
|
31
|
+
function next() {
|
|
32
|
+
while (r = env.stack.pop()) {
|
|
33
|
+
try {
|
|
34
|
+
if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
|
|
35
|
+
if (r.dispose) {
|
|
36
|
+
var result = r.dispose.call(r.value);
|
|
37
|
+
if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
|
|
38
|
+
}
|
|
39
|
+
else s |= 1;
|
|
40
|
+
}
|
|
41
|
+
catch (e) {
|
|
42
|
+
fail(e);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
|
|
46
|
+
if (env.hasError) throw env.error;
|
|
47
|
+
}
|
|
48
|
+
return next();
|
|
49
|
+
};
|
|
50
|
+
})(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
|
51
|
+
var e = new Error(message);
|
|
52
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
53
|
+
});
|
|
54
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
55
|
+
exports.Runner = void 0;
|
|
56
|
+
const health_ts_1 = require("./health.js");
|
|
57
|
+
class Runner {
|
|
58
|
+
_healthCtx = new health_ts_1.MultiHealthContext();
|
|
59
|
+
_tasks = [];
|
|
60
|
+
listenPhone(agent, agentNumber) {
|
|
61
|
+
const ctx = this._healthCtx.createCtx();
|
|
62
|
+
this._tasks.push(() => agent._listenInbound(ctx, { agent_number: agentNumber }));
|
|
63
|
+
return this;
|
|
64
|
+
}
|
|
65
|
+
listenWebrtc(agent, webrtcCode) {
|
|
66
|
+
const ctx = this._healthCtx.createCtx();
|
|
67
|
+
this._tasks.push(async () => {
|
|
68
|
+
const code = webrtcCode ?? (await agent._client.createWebrtcAgent(3600));
|
|
69
|
+
return agent._listenInbound(ctx, { webrtc_code: code });
|
|
70
|
+
});
|
|
71
|
+
return this;
|
|
72
|
+
}
|
|
73
|
+
listenSip(agent, sipCode) {
|
|
74
|
+
const ctx = this._healthCtx.createCtx();
|
|
75
|
+
this._tasks.push(() => agent._listenInbound(ctx, { sip_code: sipCode }));
|
|
76
|
+
return this;
|
|
77
|
+
}
|
|
78
|
+
attachCampaign(agent, campaignCode) {
|
|
79
|
+
const ctx = this._healthCtx.createCtx();
|
|
80
|
+
this._tasks.push(() => agent._serveCampaign(ctx, campaignCode));
|
|
81
|
+
return this;
|
|
82
|
+
}
|
|
83
|
+
async run() {
|
|
84
|
+
const env_1 = { stack: [], error: void 0, hasError: false };
|
|
85
|
+
try {
|
|
86
|
+
const _server = __addDisposableResource(env_1, await (0, health_ts_1.getHealthServer)(this._healthCtx), true);
|
|
87
|
+
await Promise.all(this._tasks.map((task) => task()));
|
|
88
|
+
}
|
|
89
|
+
catch (e_1) {
|
|
90
|
+
env_1.error = e_1;
|
|
91
|
+
env_1.hasError = true;
|
|
92
|
+
}
|
|
93
|
+
finally {
|
|
94
|
+
const result_1 = __disposeResources(env_1);
|
|
95
|
+
if (result_1)
|
|
96
|
+
await result_1;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
exports.Runner = Runner;
|
|
101
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/runner.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,2CAAkE;AAElE,MAAa,MAAM;IACT,UAAU,GAAG,IAAI,8BAAkB,EAAE,CAAC;IACtC,MAAM,GAA+B,EAAE,CAAC;IAEhD,WAAW,CAAC,KAAY,EAAE,WAAmB;QAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;QACxC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;QACjF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,YAAY,CAAC,KAAY,EAAE,UAAmB;QAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;QACxC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;YAC1B,MAAM,IAAI,GAAG,UAAU,IAAI,CAAC,MAAM,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;YACzE,OAAO,KAAK,CAAC,cAAc,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAED,SAAS,CAAC,KAAY,EAAE,OAAe;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;QACxC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;QACzE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,cAAc,CAAC,KAAY,EAAE,YAAoB;QAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;QACxC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC;QAChE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,GAAG;;;YACP,MAAY,OAAO,kCAAG,MAAM,IAAA,2BAAe,EAAC,IAAI,CAAC,UAAU,CAAC,OAAA,CAAC;YAC7D,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;;;;;;;;;;;KACtD;CACF;AAnCD,wBAmCC"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
export declare const CloseReason: z.ZodEnum<{
|
|
3
3
|
unknown: "unknown";
|
|
4
|
-
done: "done";
|
|
5
4
|
"authentication-failure": "authentication-failure";
|
|
6
5
|
"state-lost": "state-lost";
|
|
6
|
+
done: "done";
|
|
7
7
|
other: "other";
|
|
8
8
|
"server-error": "server-error";
|
|
9
9
|
"reconnection-failed": "reconnection-failed";
|
|
@@ -27,9 +27,9 @@ export declare const GuavaClose: z.ZodObject<{
|
|
|
27
27
|
message_type: z.ZodLiteral<"close">;
|
|
28
28
|
reason: z.ZodEnum<{
|
|
29
29
|
unknown: "unknown";
|
|
30
|
-
done: "done";
|
|
31
30
|
"authentication-failure": "authentication-failure";
|
|
32
31
|
"state-lost": "state-lost";
|
|
32
|
+
done: "done";
|
|
33
33
|
other: "other";
|
|
34
34
|
"server-error": "server-error";
|
|
35
35
|
"reconnection-failed": "reconnection-failed";
|
|
@@ -69,9 +69,9 @@ export declare const GuavaClientMessage: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
69
69
|
message_type: z.ZodLiteral<"close">;
|
|
70
70
|
reason: z.ZodEnum<{
|
|
71
71
|
unknown: "unknown";
|
|
72
|
-
done: "done";
|
|
73
72
|
"authentication-failure": "authentication-failure";
|
|
74
73
|
"state-lost": "state-lost";
|
|
74
|
+
done: "done";
|
|
75
75
|
other: "other";
|
|
76
76
|
"server-error": "server-error";
|
|
77
77
|
"reconnection-failed": "reconnection-failed";
|
|
@@ -101,9 +101,9 @@ export declare const GuavaServerMessage: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
101
101
|
message_type: z.ZodLiteral<"close">;
|
|
102
102
|
reason: z.ZodEnum<{
|
|
103
103
|
unknown: "unknown";
|
|
104
|
-
done: "done";
|
|
105
104
|
"authentication-failure": "authentication-failure";
|
|
106
105
|
"state-lost": "state-lost";
|
|
106
|
+
done: "done";
|
|
107
107
|
other: "other";
|
|
108
108
|
"server-error": "server-error";
|
|
109
109
|
"reconnection-failed": "reconnection-failed";
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import { Call } from "../call.ts";
|
|
2
|
+
import type { CallInfo } from "../socket/call-info.ts";
|
|
2
3
|
import type { Command } from "../commands.ts";
|
|
3
4
|
export declare class MockCall extends Call {
|
|
5
|
+
constructor(args?: {
|
|
6
|
+
callId?: string;
|
|
7
|
+
callInfo?: CallInfo;
|
|
8
|
+
variables?: Record<string, any>;
|
|
9
|
+
});
|
|
4
10
|
get commands(): Command[];
|
|
5
11
|
setField(fieldName: string, fieldValue: unknown): void;
|
|
6
12
|
}
|