@guava-ai/guava-sdk 0.43.0 → 0.44.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 +3 -3
- package/bin/example-runner.ts +4 -0
- package/dist/bin/example-runner.js +4 -0
- package/dist/bin/example-runner.js.map +1 -1
- package/dist/examples/warm-transfer.d.ts +1 -0
- package/dist/examples/warm-transfer.js +111 -0
- package/dist/examples/warm-transfer.js.map +1 -0
- package/dist/src/agent.d.ts +5 -2
- package/dist/src/agent.js +114 -108
- package/dist/src/agent.js.map +1 -1
- package/dist/src/call.d.ts +82 -37
- package/dist/src/call.js +227 -91
- package/dist/src/call.js.map +1 -1
- package/dist/src/commands.d.ts +36 -0
- package/dist/src/commands.js +17 -1
- package/dist/src/commands.js.map +1 -1
- package/dist/src/events.d.ts +12 -0
- package/dist/src/events.js +7 -1
- package/dist/src/events.js.map +1 -1
- package/dist/src/index.d.ts +2 -2
- package/dist/src/index.js +3 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/runner.js +12 -2
- package/dist/src/runner.js.map +1 -1
- package/dist/src/utils.d.ts +12 -0
- package/dist/src/utils.js +43 -1
- package/dist/src/utils.js.map +1 -1
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/examples/README.md +1 -0
- package/examples/warm-transfer.ts +90 -0
- package/package.json +1 -1
- package/src/agent.ts +105 -45
- package/src/call.ts +207 -111
- package/src/commands.ts +22 -0
- package/src/events.ts +8 -0
- package/src/index.ts +2 -1
- package/src/runner.ts +11 -2
- package/src/utils.ts +48 -1
- package/src/version.ts +1 -1
package/dist/src/events.js
CHANGED
|
@@ -33,7 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.InboundTunnelEvent = exports.GuavaEvent = exports.EscalateEvent = exports.AgentDTMFSentEvent = exports.DTMFPressedEvent = exports.DTMF_DIGITS = exports.ExecuteActionEvent = exports.ActionRequestEvent = exports.ChoiceQueryEvent = exports.BotSessionEnded = exports.OutboundCallFailed = exports.OutboundCallConnected = exports.TaskCompletedEvent = exports.ActionItemCompletedEvent = exports.IntentEvent = exports.AgentQuestionEvent = exports.WarningEvent = exports.ErrorEvent = exports.AgentSpeechEvent = exports.CallerSpeechEvent = exports.InboundCallEvent = exports.SessionStartedEvent = void 0;
|
|
36
|
+
exports.InboundTunnelEvent = exports.GuavaEvent = exports.EscalateEvent = exports.WebRTCMessageEvent = exports.AgentDTMFSentEvent = exports.DTMFPressedEvent = exports.DTMF_DIGITS = exports.ExecuteActionEvent = exports.ActionRequestEvent = exports.ChoiceQueryEvent = exports.BotSessionEnded = exports.OutboundCallFailed = exports.OutboundCallConnected = exports.TaskCompletedEvent = exports.ActionItemCompletedEvent = exports.IntentEvent = exports.AgentQuestionEvent = exports.WarningEvent = exports.ErrorEvent = exports.AgentSpeechEvent = exports.CallerSpeechEvent = exports.InboundCallEvent = exports.SessionStartedEvent = void 0;
|
|
37
37
|
exports.decodeEventDict = decodeEventDict;
|
|
38
38
|
exports.decodeEvent = decodeEvent;
|
|
39
39
|
const z = __importStar(require("zod"));
|
|
@@ -157,6 +157,11 @@ exports.AgentDTMFSentEvent = z.object({
|
|
|
157
157
|
digits: z.array(z.enum(exports.DTMF_DIGITS)),
|
|
158
158
|
requested_by: z.enum(["agent", "developer"]).default("agent"),
|
|
159
159
|
});
|
|
160
|
+
/** A message sent by a connected WebRTC client. */
|
|
161
|
+
exports.WebRTCMessageEvent = z.object({
|
|
162
|
+
event_type: z.literal("webrtc-message"),
|
|
163
|
+
payload: z.record(z.string(), z.json()).default({}),
|
|
164
|
+
});
|
|
160
165
|
exports.EscalateEvent = z.object({
|
|
161
166
|
event_type: z.literal("escalate"),
|
|
162
167
|
requested_by: z.enum(["human", "agent"]).default("human"),
|
|
@@ -181,6 +186,7 @@ exports.GuavaEvent = z.discriminatedUnion("event_type", [
|
|
|
181
186
|
exports.EscalateEvent,
|
|
182
187
|
exports.DTMFPressedEvent,
|
|
183
188
|
exports.AgentDTMFSentEvent,
|
|
189
|
+
exports.WebRTCMessageEvent,
|
|
184
190
|
]);
|
|
185
191
|
const _KNOWN_EVENT_TYPES = new Set(exports.GuavaEvent.options.map((schema) => schema.shape.event_type.value));
|
|
186
192
|
function decodeEventDict(data) {
|
package/dist/src/events.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/events.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/events.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -8,9 +8,9 @@ export { Logger, getConsoleLogger, getDefaultLogger } from "./logging.ts";
|
|
|
8
8
|
export { Agent, CallInfo } from "./agent.ts";
|
|
9
9
|
export { SIPCallInfo } from "./socket/call-info.ts";
|
|
10
10
|
export { SipUri } from "./sip.ts";
|
|
11
|
-
export { Call, DEFAULT_REACH_PERSON_OUTCOMES } from "./call.ts";
|
|
11
|
+
export { BaseCall, Call, RemoteCall, DEFAULT_REACH_PERSON_OUTCOMES } from "./call.ts";
|
|
12
12
|
export type { ReachPersonOutcome } from "./call.ts";
|
|
13
13
|
export type { SpeedPreset, Language } from "./commands.ts";
|
|
14
|
-
export type { BotSessionEnded, TerminationReason, DTMFPressedEvent, AgentDTMFSentEvent, DTMFDigit, OutboundCallFailed, } from "./events.ts";
|
|
14
|
+
export type { BotSessionEnded, TerminationReason, DTMFPressedEvent, AgentDTMFSentEvent, DTMFDigit, OutboundCallFailed, WebRTCMessageEvent, } from "./events.ts";
|
|
15
15
|
export { TestSession } from "./testing/session.ts";
|
|
16
16
|
export { MockCall } from "./testing/mocks.ts";
|
package/dist/src/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.MockCall = exports.TestSession = exports.DEFAULT_REACH_PERSON_OUTCOMES = exports.Call = exports.SipUri = exports.SIPCallInfo = exports.Agent = exports.getDefaultLogger = exports.getConsoleLogger = exports.Field = exports.Say = exports.Campaign = exports.Runner = exports.Client = void 0;
|
|
3
|
+
exports.MockCall = exports.TestSession = exports.DEFAULT_REACH_PERSON_OUTCOMES = exports.RemoteCall = exports.Call = exports.BaseCall = exports.SipUri = exports.SIPCallInfo = exports.Agent = exports.getDefaultLogger = exports.getConsoleLogger = exports.Field = exports.Say = exports.Campaign = 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
6
|
var runner_ts_1 = require("./runner.js");
|
|
@@ -20,7 +20,9 @@ Object.defineProperty(exports, "SIPCallInfo", { enumerable: true, get: function
|
|
|
20
20
|
var sip_ts_1 = require("./sip.js");
|
|
21
21
|
Object.defineProperty(exports, "SipUri", { enumerable: true, get: function () { return sip_ts_1.SipUri; } });
|
|
22
22
|
var call_ts_1 = require("./call.js");
|
|
23
|
+
Object.defineProperty(exports, "BaseCall", { enumerable: true, get: function () { return call_ts_1.BaseCall; } });
|
|
23
24
|
Object.defineProperty(exports, "Call", { enumerable: true, get: function () { return call_ts_1.Call; } });
|
|
25
|
+
Object.defineProperty(exports, "RemoteCall", { enumerable: true, get: function () { return call_ts_1.RemoteCall; } });
|
|
24
26
|
Object.defineProperty(exports, "DEFAULT_REACH_PERSON_OUTCOMES", { enumerable: true, get: function () { return call_ts_1.DEFAULT_REACH_PERSON_OUTCOMES; } });
|
|
25
27
|
var session_ts_1 = require("./testing/session.js");
|
|
26
28
|
Object.defineProperty(exports, "TestSession", { enumerable: true, get: function () { return session_ts_1.TestSession; } });
|
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;AACf,yCAAqC;AAA5B,mGAAA,MAAM,OAAA;AAEf,+CAA0C;AAAjC,wGAAA,QAAQ,OAAA;AAQjB,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,sDAAoD;AAA3C,2GAAA,WAAW,OAAA;AACpB,mCAAkC;AAAzB,gGAAA,MAAM,OAAA;AACf,
|
|
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,+CAA0C;AAAjC,wGAAA,QAAQ,OAAA;AAQjB,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,sDAAoD;AAA3C,2GAAA,WAAW,OAAA;AACpB,mCAAkC;AAAzB,gGAAA,MAAM,OAAA;AACf,qCAAsF;AAA7E,mGAAA,QAAQ,OAAA;AAAE,+FAAA,IAAI,OAAA;AAAE,qGAAA,UAAU,OAAA;AAAE,wHAAA,6BAA6B,OAAA;AAYlE,mDAAmD;AAA1C,yGAAA,WAAW,OAAA;AACpB,+CAA8C;AAArC,oGAAA,QAAQ,OAAA"}
|
package/dist/src/runner.js
CHANGED
|
@@ -69,7 +69,10 @@ class Runner {
|
|
|
69
69
|
listenWebrtc(agent, webrtcCode) {
|
|
70
70
|
const ctx = this._healthCtx.createCtx();
|
|
71
71
|
this._tasks.push(async () => {
|
|
72
|
-
|
|
72
|
+
// Unlike the Python SDK, code creation happens here to prevent Runner.listen_webrtc from becoming async.
|
|
73
|
+
if (!webrtcCode)
|
|
74
|
+
this._logger.info("No WebRTC code provided. Creating a temporary one.");
|
|
75
|
+
const code = webrtcCode || (await agent._client.createWebrtcAgent(3600));
|
|
73
76
|
return agent._listenInbound(ctx, { webrtc_code: code }, {}, this._drainController.signal);
|
|
74
77
|
});
|
|
75
78
|
return this;
|
|
@@ -94,8 +97,15 @@ class Runner {
|
|
|
94
97
|
this._drainController.abort();
|
|
95
98
|
})
|
|
96
99
|
: utils_ts_1.nullDisposable, false);
|
|
97
|
-
|
|
100
|
+
// Wait for every task, so one failing doesn't tear down signal handling and
|
|
101
|
+
// the health server while others are still draining.
|
|
102
|
+
const results = await Promise.allSettled(this._tasks.map((task) => task()));
|
|
98
103
|
this._logger.info("All tasks done.");
|
|
104
|
+
const errors = results.flatMap((r) => (r.status === "rejected" ? [r.reason] : []));
|
|
105
|
+
if (errors.length === 1)
|
|
106
|
+
throw errors[0];
|
|
107
|
+
if (errors.length > 1)
|
|
108
|
+
throw new AggregateError(errors, `${errors.length} runner tasks failed.`);
|
|
99
109
|
}
|
|
100
110
|
catch (e_1) {
|
|
101
111
|
env_1.error = e_1;
|
package/dist/src/runner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/runner.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,2CAAkE;AAClE,yCAAsD;AACtD,6CAA6D;AAU7D,MAAa,MAAM;IACT,UAAU,GAAG,IAAI,8BAAkB,EAAE,CAAC;IACtC,MAAM,GAA+B,EAAE,CAAC;IACxC,gBAAgB,GAAoB,IAAI,eAAe,EAAE,CAAC;IAC1D,OAAO,GAAW,IAAA,6BAAgB,GAAE,CAAC;IAE7C,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,CACpB,KAAK,CAAC,cAAc,CAAC,GAAG,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAC3F,CAAC;QACF,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,EAAE,EAAE,EAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAC5F,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,CACpB,KAAK,CAAC,cAAc,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CACnF,CAAC;QACF,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,EAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9F,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,EAAE,aAAa,GAAG,IAAI,KAAiB,EAAE;;;YACjD,MAAY,OAAO,kCAAG,MAAM,IAAA,2BAAe,EAAC,IAAI,CAAC,UAAU,CAAC,OAAA,CAAC;YAC7D,MAAM,CAAC,kCAAG,aAAa;gBACrB,CAAC,CAAC,IAAA,mBAAQ,EAAC,CAAC,MAAM,EAAE,EAAE;oBAClB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,MAAM,oDAAoD,CAAC,CAAC;oBAC1F,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;gBAChC,CAAC,CAAC;gBACJ,CAAC,CAAC,yBAAc,QAAA,CAAC;YACnB,MAAM,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/runner.ts"],"names":[],"mappings":"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"}
|
package/dist/src/utils.d.ts
CHANGED
|
@@ -4,7 +4,19 @@ export declare function getCliConfigPath(): string;
|
|
|
4
4
|
export declare function getBaseUrl(): string;
|
|
5
5
|
export declare function sleep(ms: number): Promise<void>;
|
|
6
6
|
export declare function fetchOrThrow(input: RequestInfo | URL, init?: RequestInit): Promise<Response>;
|
|
7
|
+
/**
|
|
8
|
+
* POST that retries network errors and retryable statuses, throwing on a final
|
|
9
|
+
* error status. A single Idempotency-Key is sent with every attempt so the
|
|
10
|
+
* server can drop duplicates.
|
|
11
|
+
*
|
|
12
|
+
* @param retries - Number of retries after the first attempt.
|
|
13
|
+
*/
|
|
14
|
+
export declare function idempotentPost(input: string | URL, init?: Omit<RequestInit, "method">, retries?: number): Promise<Response>;
|
|
7
15
|
/** A Disposable whose disposal does nothing. Useful as a conditional no-op. */
|
|
8
16
|
export declare const nullDisposable: Disposable;
|
|
17
|
+
/**
|
|
18
|
+
* Run `listener` when `signal` aborts, or immediately if it already has.
|
|
19
|
+
* Dispose to unregister.
|
|
20
|
+
*/
|
|
9
21
|
export declare function onAbort(signal: AbortSignal, listener: () => void): Disposable;
|
|
10
22
|
export declare function onSignal(handler: (signal: "SIGINT" | "SIGTERM") => void): Disposable;
|
package/dist/src/utils.js
CHANGED
|
@@ -39,6 +39,7 @@ exports.getCliConfigPath = getCliConfigPath;
|
|
|
39
39
|
exports.getBaseUrl = getBaseUrl;
|
|
40
40
|
exports.sleep = sleep;
|
|
41
41
|
exports.fetchOrThrow = fetchOrThrow;
|
|
42
|
+
exports.idempotentPost = idempotentPost;
|
|
42
43
|
exports.onAbort = onAbort;
|
|
43
44
|
exports.onSignal = onSignal;
|
|
44
45
|
const fs = __importStar(require("node:fs"));
|
|
@@ -100,10 +101,51 @@ async function fetchOrThrow(input, init) {
|
|
|
100
101
|
}
|
|
101
102
|
return res;
|
|
102
103
|
}
|
|
104
|
+
/**
|
|
105
|
+
* Whether `e` is a fetch network failure. Bad input (e.g. an invalid URL) is
|
|
106
|
+
* also a TypeError, but with a different message. Avoids `instanceof`, since
|
|
107
|
+
* fetch errors can come from another realm (e.g. under Jest).
|
|
108
|
+
*/
|
|
109
|
+
function isNetworkError(e) {
|
|
110
|
+
const { name, message } = (e ?? {});
|
|
111
|
+
return name === "TypeError" && message === "fetch failed";
|
|
112
|
+
}
|
|
113
|
+
const RETRYABLE_STATUS_CODES = new Set([408, 409, 429, 500, 502, 503, 504]);
|
|
114
|
+
const RETRY_DELAYS_MS = [0, 500, 1000, 2000, 5000];
|
|
115
|
+
/**
|
|
116
|
+
* POST that retries network errors and retryable statuses, throwing on a final
|
|
117
|
+
* error status. A single Idempotency-Key is sent with every attempt so the
|
|
118
|
+
* server can drop duplicates.
|
|
119
|
+
*
|
|
120
|
+
* @param retries - Number of retries after the first attempt.
|
|
121
|
+
*/
|
|
122
|
+
async function idempotentPost(input, init = {}, retries = 3) {
|
|
123
|
+
const headers = new Headers(init.headers);
|
|
124
|
+
if (!headers.has("Idempotency-Key"))
|
|
125
|
+
headers.set("Idempotency-Key", crypto.randomUUID());
|
|
126
|
+
for (let attempt = 0;; attempt++) {
|
|
127
|
+
try {
|
|
128
|
+
return await fetchOrThrow(input, { ...init, method: "POST", headers });
|
|
129
|
+
}
|
|
130
|
+
catch (e) {
|
|
131
|
+
const retryable = isNetworkError(e) || (e instanceof HttpStatusError && RETRYABLE_STATUS_CODES.has(e.status));
|
|
132
|
+
if (attempt === retries || !retryable)
|
|
133
|
+
throw e;
|
|
134
|
+
}
|
|
135
|
+
await sleep(RETRY_DELAYS_MS[Math.min(attempt, RETRY_DELAYS_MS.length - 1)]);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
103
138
|
/** A Disposable whose disposal does nothing. Useful as a conditional no-op. */
|
|
104
139
|
exports.nullDisposable = { [Symbol.dispose]() { } };
|
|
140
|
+
/**
|
|
141
|
+
* Run `listener` when `signal` aborts, or immediately if it already has.
|
|
142
|
+
* Dispose to unregister.
|
|
143
|
+
*/
|
|
105
144
|
function onAbort(signal, listener) {
|
|
106
|
-
signal.
|
|
145
|
+
if (signal.aborted) {
|
|
146
|
+
listener();
|
|
147
|
+
return exports.nullDisposable;
|
|
148
|
+
}
|
|
107
149
|
signal.addEventListener("abort", listener, { once: true });
|
|
108
150
|
return {
|
|
109
151
|
[Symbol.dispose]() {
|
package/dist/src/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,oDAUC;AAED,4CAEC;AAED,gCAWC;AAcD,sBAEC;AAED,oCAaC;
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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"}
|
package/dist/src/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const SDK_VERSION = "0.
|
|
1
|
+
export declare const SDK_VERSION = "0.44.0";
|
package/dist/src/version.js
CHANGED
package/examples/README.md
CHANGED
|
@@ -8,3 +8,4 @@
|
|
|
8
8
|
- [restaurant-waitlist.ts](./restaurant-waitlist.ts) - Inbound call agent for a restaurant that collects caller name, party size, and phone number to add callers to a waitlist using a structured task.
|
|
9
9
|
- [scheduling-outbound.ts](./scheduling-outbound.ts) - Outbound call agent for a dental office that uses `reachPerson` to confirm contact availability, then schedules appointments using a searchable calendar-slot field backed by `DatetimeFilter`.
|
|
10
10
|
- [slow-speech.ts](./slow-speech.ts) - Minimal inbound agent that sets `speechSpeed` so the agent speaks at a slower pace, with a simple `onQuestion` handler.
|
|
11
|
+
- [warm-transfer.ts](./warm-transfer.ts) - Inbound agent that collects the caller's reason, then has a second agent call a rep to brief them; once the rep is ready, `RemoteCall` transfers the original call and the outbound call into a shared conference.
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import crypto from "node:crypto";
|
|
2
|
+
import { Command } from "commander";
|
|
3
|
+
import * as guava from "@guava-ai/guava-sdk";
|
|
4
|
+
import { getAgentNumber } from "@guava-ai/guava-sdk/example-utils";
|
|
5
|
+
|
|
6
|
+
let agentNumber: string;
|
|
7
|
+
let transferDestination: string;
|
|
8
|
+
|
|
9
|
+
const agent = new guava.Agent({
|
|
10
|
+
name: "Nova",
|
|
11
|
+
organization: "Acme Corp",
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
agent.onCallStart(async (call: guava.Call) => {
|
|
15
|
+
await call.setTask({
|
|
16
|
+
taskId: "collect_reason",
|
|
17
|
+
checklist: [guava.Field({ key: "reason_for_calling", fieldType: "text" })],
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
agent.onTaskComplete("collect_reason", async (call: guava.Call) => {
|
|
22
|
+
await call.setTask({
|
|
23
|
+
taskId: "stall_customer",
|
|
24
|
+
objective: `Inform the caller that you're checking if a customer service
|
|
25
|
+
representative is ready to help them. Stay with the caller on the
|
|
26
|
+
line until the expert notifies you that the representative is ready.`,
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
// Generate a random conference ID that will be eventually used to join the two calls.
|
|
30
|
+
const conferenceId = crypto.randomBytes(10).toString("hex");
|
|
31
|
+
|
|
32
|
+
// Place the outbound call in the background, so this handler doesn't block until it
|
|
33
|
+
// ends. Pass this call's ID so the outbound call can transfer it later.
|
|
34
|
+
outboundAgent
|
|
35
|
+
.callPhone(agentNumber, transferDestination, {
|
|
36
|
+
conference_id: conferenceId,
|
|
37
|
+
original_call_id: call.id,
|
|
38
|
+
call_reason: await call.getField("reason_for_calling"),
|
|
39
|
+
})
|
|
40
|
+
.catch((err) => console.error("Outbound call failed:", err));
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
const outboundAgent = new guava.Agent({
|
|
44
|
+
name: "Nova",
|
|
45
|
+
organization: "Acme Corp",
|
|
46
|
+
purpose:
|
|
47
|
+
"You are an outbound calling agent. You talk to customer service representatives on behalf of callers and brief them before a warm transfer.",
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
outboundAgent.onCallStart(async (call: guava.Call) => {
|
|
51
|
+
await call.setTask({
|
|
52
|
+
taskId: "confirm_ready",
|
|
53
|
+
objective: `A caller is calling about ${await call.getVariable("call_reason")}. You are not talking to the caller - you are talking to a customer service representative.`,
|
|
54
|
+
checklist: [
|
|
55
|
+
"Inform the customer service agent of the caller's reason for calling.",
|
|
56
|
+
"Determine if the service agent is ready for a transfer.",
|
|
57
|
+
],
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
outboundAgent.onTaskComplete("confirm_ready", async (call: guava.Call) => {
|
|
62
|
+
const conferenceId = await call.getVariable("conference_id");
|
|
63
|
+
const otherCall = new guava.RemoteCall(await call.getVariable("original_call_id"));
|
|
64
|
+
|
|
65
|
+
// Join the two calls.
|
|
66
|
+
const destination = `conference:${conferenceId}`;
|
|
67
|
+
await otherCall.transfer(destination, "The customer service representative is ready.");
|
|
68
|
+
await call.transfer(
|
|
69
|
+
destination,
|
|
70
|
+
"Transfer to the caller. Tell the rep that you are 'Patching in the caller.'",
|
|
71
|
+
);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
export async function run(prog: string, args: string[]) {
|
|
75
|
+
const program = new Command()
|
|
76
|
+
.name(prog)
|
|
77
|
+
.showHelpAfterError()
|
|
78
|
+
.requiredOption("--transfer-destination <phone_number>", "Number to warm transfer callers to.")
|
|
79
|
+
.option(
|
|
80
|
+
"--agent-number <phone_number>",
|
|
81
|
+
"Number to listen on. Defaults to GUAVA_AGENT_NUMBER or your account's number.",
|
|
82
|
+
)
|
|
83
|
+
.action(async (options: { transferDestination: string; agentNumber?: string }) => {
|
|
84
|
+
transferDestination = options.transferDestination;
|
|
85
|
+
agentNumber = options.agentNumber ?? (await getAgentNumber());
|
|
86
|
+
await agent.listenPhone(agentNumber);
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
await program.parseAsync(args, { from: "user" });
|
|
90
|
+
}
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@guava-ai/guava-sdk",
|
|
3
3
|
"description": "The official TypeScript SDK for building Guava voice agents.",
|
|
4
4
|
"homepage": "https://docs.goguava.ai/typescript-sdk/",
|
|
5
|
-
"version": "0.
|
|
5
|
+
"version": "0.44.0",
|
|
6
6
|
"type": "commonjs",
|
|
7
7
|
"main": "dist/src/index.js",
|
|
8
8
|
"types": "dist/src/index.d.ts",
|