@openclaw/voice-call 2026.10.10 → 2026.11.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.setup/{carrier-api-BgJdQC-e.mjs → carrier-api-C8icuJ0G.mjs} +8 -5
- package/dist/.setup/{cli-CI9QzIaT.mjs → cli-B4FxOsgU.mjs} +11 -7
- package/dist/.setup/{config-BxESUUSm.mjs → config-BdbTQCSh.mjs} +15 -8
- package/dist/.setup/{mock-BO3pptb-.mjs → mock-rySvj-G6.mjs} +3 -2
- package/dist/.setup/{plivo-C5cLYAup.mjs → plivo-DHzGXxW2.mjs} +5 -4
- package/dist/.setup/{realtime-handler-B2JJ-8wv.mjs → realtime-handler-Bziu0nfs.mjs} +16 -9
- package/dist/.setup/{realtime-transcription.runtime-DIBopS1D.mjs → realtime-transcription.runtime-CbJAs5t_.mjs} +2 -1
- package/dist/.setup/{realtime-voice.runtime-S9H9Y0Cp.mjs → realtime-voice.runtime-MZjylF3n.mjs} +2 -1
- package/dist/.setup/{response-generator-B2nVYBf_.mjs → response-generator-CZJCHbml.mjs} +7 -4
- package/dist/.setup/{runtime-entry-CKPPin7r.mjs → runtime-entry-Cy51Uayg.mjs} +114 -56
- package/dist/.setup/{state-retention-api-y5WYfZsQ.mjs → state-retention-api-ONgqE-_V.mjs} +13 -7
- package/dist/.setup/{store-path-Bn3bLr8y.mjs → store-path-Cfwff6j7.mjs} +4 -2
- package/dist/.setup/{telnyx-ZopMHuZl.mjs → telnyx-ChcIdKAa.mjs} +3 -2
- package/dist/.setup/{twilio-BGLnhzpD.mjs → twilio-CrPMFGbz.mjs} +36 -17
- package/dist/.setup/{twilio-region-DVg9p6JJ.mjs → twilio-region-wBOx-8sz.mjs} +2 -1
- package/dist/.setup/{voice-mapping-CvuJ1B50.mjs → voice-mapping-1lzFmzOF.mjs} +2 -1
- package/dist/.setup/{webhook-replay-B0Eo3Ll5.mjs → webhook-replay-B7RJNWNG.mjs} +2 -1
- package/dist/cli-metadata.js +2 -1
- package/dist/cli-output-mode.js +2 -1
- package/dist/doctor-contract-api.js +4 -3
- package/dist/index.js +13 -8
- package/dist/runtime-entry.js +2 -1
- package/dist/setup-api.js +4 -2
- package/dist/state-retention-api.js +2 -1
- package/package.json +4 -4
- package/dist/.source-module-urls/8b7cb5a3dc0f034090cbbda318ba348c0d48853d04f0e3b500529cf7666abe03.json +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { a as mapProviderStatusToEndReason, c as getHeader, h as generateDtmfRedirectTwiml, i as isProviderStatusTerminal, o as normalizeProviderStatus } from "./runtime-entry-
|
|
2
|
-
import { n as requireSupportedTwilioApiHostname, r as resolveTwilioApiBaseUrl } from "./twilio-region-
|
|
3
|
-
import { n as mapVoiceToPolly, t as escapeXml } from "./voice-mapping-
|
|
4
|
-
import { a as verifyTwilioWebhook, t as createCarrierApi } from "./carrier-api-
|
|
1
|
+
import { a as mapProviderStatusToEndReason, c as getHeader, h as generateDtmfRedirectTwiml, i as isProviderStatusTerminal, o as normalizeProviderStatus } from "./runtime-entry-Cy51Uayg.mjs";
|
|
2
|
+
import { n as requireSupportedTwilioApiHostname, r as resolveTwilioApiBaseUrl } from "./twilio-region-wBOx-8sz.mjs";
|
|
3
|
+
import { n as mapVoiceToPolly, t as escapeXml } from "./voice-mapping-1lzFmzOF.mjs";
|
|
4
|
+
import { a as verifyTwilioWebhook, t as createCarrierApi } from "./carrier-api-C8icuJ0G.mjs";
|
|
5
5
|
import { asNullableObjectRecord, normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
|
|
6
6
|
import { sleepWithAbort } from "openclaw/plugin-sdk/runtime-env";
|
|
7
7
|
import crypto from "node:crypto";
|
|
@@ -9,7 +9,7 @@ import { safeParseJson } from "openclaw/plugin-sdk/text-utility-runtime";
|
|
|
9
9
|
import { safeEqualSecret } from "openclaw/plugin-sdk/security-runtime";
|
|
10
10
|
import { retryAsync } from "openclaw/plugin-sdk/retry-runtime";
|
|
11
11
|
import { raceWithTimeout } from "openclaw/plugin-sdk/time-runtime";
|
|
12
|
-
|
|
12
|
+
//#region extensions/voice-call/src/providers/twilio/api.ts
|
|
13
13
|
var TwilioApiError = class extends Error {
|
|
14
14
|
constructor(httpStatus, responseText) {
|
|
15
15
|
const parsed = asNullableObjectRecord(safeParseJson(responseText));
|
|
@@ -43,9 +43,21 @@ function createTwilioApi(params) {
|
|
|
43
43
|
})
|
|
44
44
|
};
|
|
45
45
|
}
|
|
46
|
-
|
|
46
|
+
//#endregion
|
|
47
|
+
//#region extensions/voice-call/src/providers/twilio.ts
|
|
47
48
|
const TWILIO_CALL_NOT_IN_PROGRESS_CODE = 21220;
|
|
48
49
|
const TWILIO_CALL_UPDATE_RETRY_DELAYS_MS = [250, 750];
|
|
50
|
+
function buildSpeechGather(webhookUrl, language, turnToken) {
|
|
51
|
+
const actionUrl = new URL(webhookUrl);
|
|
52
|
+
if (turnToken) actionUrl.searchParams.set("turnToken", turnToken);
|
|
53
|
+
const locale = language || "en-US";
|
|
54
|
+
const redirectUrl = new URL(actionUrl);
|
|
55
|
+
redirectUrl.searchParams.set("flow", "listen");
|
|
56
|
+
redirectUrl.searchParams.set("gatherToken", crypto.randomUUID());
|
|
57
|
+
redirectUrl.searchParams.set("language", locale);
|
|
58
|
+
return `<Gather input="speech" speechTimeout="auto" timeout="120" language="${escapeXml(locale)}" action="${escapeXml(actionUrl.toString())}" method="POST"></Gather>
|
|
59
|
+
<Redirect method="POST">${escapeXml(redirectUrl.toString())}</Redirect>`;
|
|
60
|
+
}
|
|
49
61
|
function createTwilioRequestDedupeKey(ctx, verifiedRequestKey) {
|
|
50
62
|
if (verifiedRequestKey) return verifiedRequestKey;
|
|
51
63
|
const signature = getHeader(ctx.headers, "x-twilio-signature") ?? "";
|
|
@@ -170,12 +182,13 @@ var TwilioProvider = class TwilioProvider {
|
|
|
170
182
|
const callIdFromQuery = normalizeOptionalString(ctx.query?.callId);
|
|
171
183
|
const turnTokenFromQuery = normalizeOptionalString(ctx.query?.turnToken);
|
|
172
184
|
const dedupeKey = createTwilioRequestDedupeKey(ctx, options?.verifiedRequestKey);
|
|
173
|
-
|
|
185
|
+
let event = this.normalizeEvent(params, {
|
|
174
186
|
callIdOverride: callIdFromQuery,
|
|
175
187
|
dedupeKey,
|
|
176
188
|
turnToken: turnTokenFromQuery,
|
|
177
189
|
amdCallback: normalizeOptionalString(ctx.query?.type) === "amd"
|
|
178
190
|
});
|
|
191
|
+
if (ctx.query?.flow === "listen" && event?.type === "call.answered") event = null;
|
|
179
192
|
if (event?.direction === "inbound" && event.type !== "call.ended" && event.providerCallId && this.currentPublicUrl && !this.callWebhookUrls.has(event.providerCallId)) this.callWebhookUrls.set(event.providerCallId, this.currentPublicUrl);
|
|
180
193
|
return {
|
|
181
194
|
events: event ? [event] : [],
|
|
@@ -296,6 +309,13 @@ var TwilioProvider = class TwilioProvider {
|
|
|
296
309
|
return storedTwiml;
|
|
297
310
|
}
|
|
298
311
|
if (isStatusCallback) return TwilioProvider.EMPTY_TWIML;
|
|
312
|
+
if (ctx.query?.flow === "listen") {
|
|
313
|
+
const webhookUrl = callSid ? this.callWebhookUrls.get(callSid) : void 0;
|
|
314
|
+
if (!webhookUrl) return TwilioProvider.EMPTY_TWIML;
|
|
315
|
+
return `<?xml version="1.0" encoding="UTF-8"?><Response>
|
|
316
|
+
${buildSpeechGather(webhookUrl, normalizeOptionalString(ctx.query?.language), normalizeOptionalString(ctx.query?.turnToken))}
|
|
317
|
+
</Response>`;
|
|
318
|
+
}
|
|
299
319
|
if (direction === "inbound") {
|
|
300
320
|
if (this.callStreamMap.size > 0) return TwilioProvider.QUEUE_TWIML;
|
|
301
321
|
} else if (!(callId && direction?.startsWith("outbound")) && callStatus !== "in-progress") return TwilioProvider.EMPTY_TWIML;
|
|
@@ -421,12 +441,14 @@ var TwilioProvider = class TwilioProvider {
|
|
|
421
441
|
}
|
|
422
442
|
const webhookUrl = this.requireCallWebhookUrl(input.providerCallId);
|
|
423
443
|
console.warn("[voice-call] Using TwiML <Say> fallback - telephony TTS not configured or media stream not active");
|
|
444
|
+
const pollyVoice = mapVoiceToPolly(input.voice);
|
|
445
|
+
const gather = input.listenAfterPlayback ? buildSpeechGather(webhookUrl, input.locale, input.turnToken) : `<Gather input="speech" speechTimeout="auto" action="${escapeXml(webhookUrl)}" method="POST">
|
|
446
|
+
<Say>.</Say>
|
|
447
|
+
</Gather>`;
|
|
424
448
|
const twiml = `<?xml version="1.0" encoding="UTF-8"?>
|
|
425
449
|
<Response>
|
|
426
|
-
<Say voice="${
|
|
427
|
-
|
|
428
|
-
<Say>.</Say>
|
|
429
|
-
</Gather>
|
|
450
|
+
<Say voice="${pollyVoice}" language="${input.locale || "en-US"}">${escapeXml(input.text)}</Say>
|
|
451
|
+
${gather}
|
|
430
452
|
</Response>`;
|
|
431
453
|
await this.updateLiveCallTwiml(input.providerCallId, twiml, "playTts");
|
|
432
454
|
}
|
|
@@ -484,12 +506,8 @@ var TwilioProvider = class TwilioProvider {
|
|
|
484
506
|
});
|
|
485
507
|
}
|
|
486
508
|
async startListening(input) {
|
|
487
|
-
const
|
|
488
|
-
|
|
489
|
-
const twiml = `<?xml version="1.0" encoding="UTF-8"?>
|
|
490
|
-
<Response>
|
|
491
|
-
<Gather input="speech" speechTimeout="auto" language="${input.language || "en-US"}" action="${escapeXml(actionUrl.toString())}" method="POST">
|
|
492
|
-
</Gather>
|
|
509
|
+
const twiml = `<?xml version="1.0" encoding="UTF-8"?><Response>
|
|
510
|
+
${buildSpeechGather(this.requireCallWebhookUrl(input.providerCallId), input.language, input.turnToken)}
|
|
493
511
|
</Response>`;
|
|
494
512
|
await this.updateLiveCallTwiml(input.providerCallId, twiml, "startListening");
|
|
495
513
|
}
|
|
@@ -500,4 +518,5 @@ var TwilioProvider = class TwilioProvider {
|
|
|
500
518
|
}
|
|
501
519
|
async stopListening(_input) {}
|
|
502
520
|
};
|
|
521
|
+
//#endregion
|
|
503
522
|
export { TwilioProvider };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
//#region extensions/voice-call/src/providers/twilio-region.ts
|
|
2
2
|
const TWILIO_REGIONS = [
|
|
3
3
|
"us1",
|
|
4
4
|
"ie1",
|
|
@@ -18,4 +18,5 @@ function requireSupportedTwilioApiHostname(baseUrl) {
|
|
|
18
18
|
if (!TWILIO_API_HOSTNAMES.has(hostname)) throw new Error(`Unsupported Twilio API hostname: ${hostname}`);
|
|
19
19
|
return hostname;
|
|
20
20
|
}
|
|
21
|
+
//#endregion
|
|
21
22
|
export { requireSupportedTwilioApiHostname as n, resolveTwilioApiBaseUrl as r, TWILIO_REGIONS as t };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { normalizeLowercaseStringOrEmpty } from "openclaw/plugin-sdk/string-coerce-runtime";
|
|
2
|
-
|
|
2
|
+
//#region extensions/voice-call/src/voice-mapping.ts
|
|
3
3
|
function escapeXml(text) {
|
|
4
4
|
return text.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");
|
|
5
5
|
}
|
|
@@ -17,4 +17,5 @@ function mapVoiceToPolly(voice) {
|
|
|
17
17
|
if (voice.startsWith("Polly.") || voice.startsWith("Google.")) return voice;
|
|
18
18
|
return OPENAI_TO_POLLY_MAP.get(normalizeLowercaseStringOrEmpty(voice)) ?? DEFAULT_POLLY_VOICE;
|
|
19
19
|
}
|
|
20
|
+
//#endregion
|
|
20
21
|
export { mapVoiceToPolly as n, escapeXml as t };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { isFutureDateTimestampMs, resolveExpiresAtMsFromDurationMs } from "openclaw/plugin-sdk/number-runtime";
|
|
2
2
|
import { pruneMapToMaxSize } from "openclaw/plugin-sdk/collection-runtime";
|
|
3
|
-
|
|
3
|
+
//#region extensions/voice-call/src/webhook-replay.ts
|
|
4
4
|
const REPLAY_WINDOW_MS = 6e5;
|
|
5
5
|
const REPLAY_CACHE_MAX_ENTRIES = 1e4;
|
|
6
6
|
const REPLAY_CACHE_PRUNE_INTERVAL = 64;
|
|
@@ -39,4 +39,5 @@ function reserveWebhookReplay(cache, replayKey) {
|
|
|
39
39
|
}
|
|
40
40
|
};
|
|
41
41
|
}
|
|
42
|
+
//#endregion
|
|
42
43
|
export { reserveWebhookReplay as n, createWebhookReplayCache as t };
|
package/dist/cli-metadata.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { VOICE_CALL_CLI_DESCRIPTOR } from "./cli-output-mode.js";
|
|
2
2
|
import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
|
|
3
|
-
|
|
3
|
+
//#region extensions/voice-call/cli-metadata.ts
|
|
4
4
|
var cli_metadata_default = definePluginEntry({
|
|
5
5
|
id: "voice-call",
|
|
6
6
|
name: "Voice Call",
|
|
@@ -12,4 +12,5 @@ var cli_metadata_default = definePluginEntry({
|
|
|
12
12
|
});
|
|
13
13
|
}
|
|
14
14
|
});
|
|
15
|
+
//#endregion
|
|
15
16
|
export { cli_metadata_default as default };
|
package/dist/cli-output-mode.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { getRootOptionAwareCommandPath } from "openclaw/plugin-sdk/cli-argv";
|
|
2
|
-
|
|
2
|
+
//#region extensions/voice-call/cli-output-mode.ts
|
|
3
3
|
const MACHINE_OUTPUT_COMMANDS = /* @__PURE__ */ new Set([
|
|
4
4
|
"call",
|
|
5
5
|
"continue",
|
|
@@ -24,4 +24,5 @@ const VOICE_CALL_CLI_DESCRIPTOR = {
|
|
|
24
24
|
hasSubcommands: true,
|
|
25
25
|
machineOutput: isVoiceCallMachineOutput
|
|
26
26
|
};
|
|
27
|
+
//#endregion
|
|
27
28
|
export { VOICE_CALL_CLI_DESCRIPTOR };
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { n as stateMigrations$1 } from "./.setup/state-retention-api-
|
|
2
|
-
import { n as resolveVoiceCallStorePath } from "./.setup/store-path-
|
|
1
|
+
import { n as stateMigrations$1 } from "./.setup/state-retention-api-ONgqE-_V.mjs";
|
|
2
|
+
import { n as resolveVoiceCallStorePath } from "./.setup/store-path-Cfwff6j7.mjs";
|
|
3
3
|
import { normalizeAgentId } from "openclaw/plugin-sdk/routing";
|
|
4
4
|
import { asOptionalRecord } from "openclaw/plugin-sdk/string-coerce-runtime";
|
|
5
5
|
import { existsSync } from "node:fs";
|
|
6
|
-
|
|
6
|
+
//#region extensions/voice-call/doctor-contract-api.ts
|
|
7
7
|
/** Return Voice Call agents whose templated core session stores need migration. */
|
|
8
8
|
function resolveSessionStoreAgentIds(params) {
|
|
9
9
|
const agentIds = /* @__PURE__ */ new Set();
|
|
@@ -84,4 +84,5 @@ const stateMigrations = [...stateMigrations$1, {
|
|
|
84
84
|
};
|
|
85
85
|
}
|
|
86
86
|
}];
|
|
87
|
+
//#endregion
|
|
87
88
|
export { resolveSessionStoreAgentIds, stateMigrations };
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { definePluginEntry } from "./api.js";
|
|
2
2
|
import { VOICE_CALL_CLI_DESCRIPTOR } from "./cli-output-mode.js";
|
|
3
|
-
import { g as CallBriefSchema, i as resolveVoiceCallConfig, t as VoiceCallConfigSchema, u as validateProviderConfig } from "./.setup/config-
|
|
4
|
-
import { C as TerminalStates, t as createVoiceCallRuntime } from "./.setup/runtime-entry-
|
|
3
|
+
import { g as CallBriefSchema, i as resolveVoiceCallConfig, t as VoiceCallConfigSchema, u as validateProviderConfig } from "./.setup/config-BdbTQCSh.mjs";
|
|
4
|
+
import { C as TerminalStates, t as createVoiceCallRuntime } from "./.setup/runtime-entry-Cy51Uayg.mjs";
|
|
5
5
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
6
6
|
import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
|
|
7
7
|
import { ErrorCodes, errorShape } from "openclaw/plugin-sdk/gateway-runtime";
|
|
@@ -13,7 +13,7 @@ import { jsonResult } from "openclaw/plugin-sdk/tool-results";
|
|
|
13
13
|
import { resolveTimerTimeoutMs, timestampMsToIsoString } from "openclaw/plugin-sdk/number-runtime";
|
|
14
14
|
import { randomUUID } from "node:crypto";
|
|
15
15
|
import { Type } from "typebox";
|
|
16
|
-
|
|
16
|
+
//#region extensions/voice-call/src/command-service.ts
|
|
17
17
|
var VoiceCallCommandInputError = class extends Error {};
|
|
18
18
|
function toVoiceCallStatus(call) {
|
|
19
19
|
return {
|
|
@@ -160,7 +160,8 @@ function createVoiceCallCommandService(ensureRuntime) {
|
|
|
160
160
|
}
|
|
161
161
|
};
|
|
162
162
|
}
|
|
163
|
-
|
|
163
|
+
//#endregion
|
|
164
|
+
//#region extensions/voice-call/src/gateway-continue-operation.ts
|
|
164
165
|
const VOICE_CALL_CONTINUE_OPERATION_BUFFER_MS = 3e4;
|
|
165
166
|
const VOICE_CALL_CONTINUE_OPERATION_CLEANUP_MS = 3e5;
|
|
166
167
|
/** Create a process-local operation store for gateway continue-call polling. */
|
|
@@ -221,7 +222,8 @@ function createVoiceCallContinueOperationStore(params) {
|
|
|
221
222
|
read
|
|
222
223
|
};
|
|
223
224
|
}
|
|
224
|
-
|
|
225
|
+
//#endregion
|
|
226
|
+
//#region extensions/voice-call/src/tool-call-scope.ts
|
|
225
227
|
async function resolveActiveVoiceCallToolScope(params) {
|
|
226
228
|
if (!isRecord(params.binding)) return;
|
|
227
229
|
const binding = params.binding;
|
|
@@ -242,7 +244,8 @@ async function resolveActiveVoiceCallToolScope(params) {
|
|
|
242
244
|
}
|
|
243
245
|
};
|
|
244
246
|
}
|
|
245
|
-
|
|
247
|
+
//#endregion
|
|
248
|
+
//#region extensions/voice-call/src/tool-schema.ts
|
|
246
249
|
const VoiceCallBriefToolSchema = Type.Object({
|
|
247
250
|
task: Type.Optional(Type.String({ maxLength: 2e3 })),
|
|
248
251
|
context: Type.Optional(Type.String({ maxLength: 4e3 })),
|
|
@@ -308,7 +311,8 @@ const VoiceCallToolSchema = Type.Union([
|
|
|
308
311
|
dtmfSequence: Type.Optional(Type.String({ description: "DTMF digits to play before connect" }))
|
|
309
312
|
})
|
|
310
313
|
]);
|
|
311
|
-
|
|
314
|
+
//#endregion
|
|
315
|
+
//#region extensions/voice-call/index.ts
|
|
312
316
|
const VOICE_CALL_WRITE_METHOD_SCOPE = { scope: "operator.write" };
|
|
313
317
|
const VOICE_CALL_READ_METHOD_SCOPE = { scope: "operator.read" };
|
|
314
318
|
const voiceCallConfigSchema = { parse(value) {
|
|
@@ -564,7 +568,7 @@ var voice_call_default = definePluginEntry({
|
|
|
564
568
|
};
|
|
565
569
|
});
|
|
566
570
|
api.registerCli(async ({ program }) => {
|
|
567
|
-
const { registerVoiceCallCli } = await import("./.setup/cli-
|
|
571
|
+
const { registerVoiceCallCli } = await import("./.setup/cli-B4FxOsgU.mjs");
|
|
568
572
|
registerVoiceCallCli({
|
|
569
573
|
program,
|
|
570
574
|
config,
|
|
@@ -625,4 +629,5 @@ var voice_call_default = definePluginEntry({
|
|
|
625
629
|
});
|
|
626
630
|
}
|
|
627
631
|
});
|
|
632
|
+
//#endregion
|
|
628
633
|
export { voice_call_default as default };
|
package/dist/runtime-entry.js
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
import { t as createVoiceCallRuntime } from "./.setup/runtime-entry-Cy51Uayg.mjs";
|
|
2
|
+
export { createVoiceCallRuntime };
|
package/dist/setup-api.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { asFiniteNumber, asOptionalRecord, isRecord, readStringField } from "openclaw/plugin-sdk/string-coerce-runtime";
|
|
2
2
|
import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
|
|
3
|
-
|
|
3
|
+
//#region extensions/voice-call/src/config-migration.ts
|
|
4
4
|
/** Migrate legacy voice-call config input to the current canonical shape. */
|
|
5
5
|
function migrateVoiceCallLegacyConfigInput(params) {
|
|
6
6
|
const raw = asOptionalRecord(params.value) ?? {};
|
|
@@ -97,7 +97,8 @@ function migrateVoiceCallLegacyConfigInput(params) {
|
|
|
97
97
|
changes
|
|
98
98
|
};
|
|
99
99
|
}
|
|
100
|
-
|
|
100
|
+
//#endregion
|
|
101
|
+
//#region extensions/voice-call/setup-api.ts
|
|
101
102
|
/** Migrate voice-call plugin config inside the full OpenClaw config object. */
|
|
102
103
|
function migrateVoiceCallPluginConfig(config) {
|
|
103
104
|
const rawVoiceCallConfig = config.plugins?.entries?.["voice-call"]?.config;
|
|
@@ -132,4 +133,5 @@ var setup_api_default = definePluginEntry({
|
|
|
132
133
|
api.registerConfigMigration(migrateVoiceCallPluginConfig);
|
|
133
134
|
}
|
|
134
135
|
});
|
|
136
|
+
//#endregion
|
|
135
137
|
export { setup_api_default as default };
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
import { n as stateMigrations, t as packageName } from "./.setup/state-retention-api-ONgqE-_V.mjs";
|
|
2
|
+
export { packageName, stateMigrations };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openclaw/voice-call",
|
|
3
|
-
"version": "2026.
|
|
3
|
+
"version": "2026.11.2",
|
|
4
4
|
"description": "OpenClaw voice-call plugin for Twilio, Telnyx, and Plivo phone calls.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"zod": "4.6.5"
|
|
13
13
|
},
|
|
14
14
|
"peerDependencies": {
|
|
15
|
-
"openclaw": ">=2026.
|
|
15
|
+
"openclaw": ">=2026.11.2"
|
|
16
16
|
},
|
|
17
17
|
"peerDependenciesMeta": {
|
|
18
18
|
"openclaw": {
|
|
@@ -31,10 +31,10 @@
|
|
|
31
31
|
"minHostVersion": ">=2026.4.10"
|
|
32
32
|
},
|
|
33
33
|
"compat": {
|
|
34
|
-
"pluginApi": ">=2026.
|
|
34
|
+
"pluginApi": ">=2026.11.2"
|
|
35
35
|
},
|
|
36
36
|
"build": {
|
|
37
|
-
"openclawVersion": "2026.
|
|
37
|
+
"openclawVersion": "2026.11.2"
|
|
38
38
|
},
|
|
39
39
|
"release": {
|
|
40
40
|
"publishToClawHub": true,
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"entries":[{"output":"api.js","source":"extensions/voice-call/api.ts"},{"output":"cli-metadata.js","source":"extensions/voice-call/cli-metadata.ts"},{"output":"cli-output-mode.js","source":"extensions/voice-call/cli-output-mode.ts"},{"output":"doctor-contract-api.js","source":"extensions/voice-call/doctor-contract-api.ts"},{"output":"index.js","source":"extensions/voice-call/index.ts"},{"output":"runtime-entry.js","source":"extensions/voice-call/runtime-entry.ts"},{"output":"setup-api.js","source":"extensions/voice-call/setup-api.ts"},{"output":"state-retention-api.js","source":"extensions/voice-call/state-retention-api.ts"}],"chunks":[{"output":".setup/carrier-api-BgJdQC-e.mjs","sha256":"0679f0975984683213db413bae39a877398a203054109341386cbfa39f79b660","facadeSource":null,"sources":["extensions/voice-call/src/providers/shared/carrier-api.ts","extensions/voice-call/src/providers/shared/guarded-json-api.ts","extensions/voice-call/src/webhook-security.ts"]},{"output":".setup/cli-CI9QzIaT.mjs","sha256":"61b67428f29dc388fcc8aa13e7c5c701a78f777fe92544b96e92ada3d53f2be2","facadeSource":"extensions/voice-call/src/cli.ts","sources":["extensions/voice-call/src/cli-call-log.ts","extensions/voice-call/src/cli-command-io.ts","extensions/voice-call/src/cli-gateway-call.ts","extensions/voice-call/src/cli.ts"]},{"output":".setup/config-BxESUUSm.mjs","sha256":"a305f2c4b33953d35178a4136fc8ed511f8705be46283ccfd9e50f345db09d14","facadeSource":null,"sources":["extensions/voice-call/src/allowlist.ts","extensions/voice-call/src/call-brief-schema.ts","extensions/voice-call/src/config.ts","extensions/voice-call/src/errand-config.ts","extensions/voice-call/src/realtime-call-control.ts","extensions/voice-call/src/realtime-defaults.ts","extensions/voice-call/src/tailscale-config.ts"]},{"output":".setup/mock-BO3pptb-.mjs","sha256":"aea175a24a92c7cfb22192a741ddfe0f87cd038834d06b51c2e07c14be3c6efd","facadeSource":"extensions/voice-call/src/providers/mock.ts","sources":["extensions/voice-call/src/providers/mock.ts"]},{"output":".setup/plivo-C5cLYAup.mjs","sha256":"cd6285e05de4f1d4d5a901744c42683894d319cc81a771ca03f9a8a6b8a8ee98","facadeSource":"extensions/voice-call/src/providers/plivo.ts","sources":["extensions/voice-call/src/providers/plivo.ts"]},{"output":".setup/realtime-handler-B2JJ-8wv.mjs","sha256":"1331ca118bd88cbbdb954034f550ffcf0d153932afa9589d8aaf37f5a094326e","facadeSource":"extensions/voice-call/src/webhook/realtime-handler.ts","sources":["extensions/voice-call/src/webhook/realtime-audio-pacer.ts","extensions/voice-call/src/webhook/realtime-call-playback.ts","extensions/voice-call/src/webhook/realtime-call-session-control.ts","extensions/voice-call/src/webhook/realtime-handler.ts","extensions/voice-call/src/webhook/realtime-host-speech.ts","extensions/voice-call/src/webhook/realtime-transcript-text.ts","extensions/voice-call/src/webhook/stream-frame-adapter.ts"]},{"output":".setup/realtime-transcription.runtime-DIBopS1D.mjs","sha256":"bb90d344ce8109aef1b05a93e5b8e4633430112c282a351939d70267a29fa6fe","facadeSource":"extensions/voice-call/src/realtime-transcription.runtime.ts","sources":[]},{"output":".setup/realtime-voice.runtime-S9H9Y0Cp.mjs","sha256":"4cea62311759072afbc3c69890e815583aa2d083c980a4d00f9d79b7cd82578b","facadeSource":"extensions/voice-call/src/realtime-voice.runtime.ts","sources":[]},{"output":".setup/response-generator-B2nVYBf_.mjs","sha256":"2be7c9be73d45032c4ff427bd985e64355eb6d0cdad61d94b4436d1e17d21379","facadeSource":"extensions/voice-call/src/response-generator.ts","sources":["extensions/voice-call/src/response-generator.ts"]},{"output":".setup/runtime-entry-CKPPin7r.mjs","sha256":"7ff6f42620bec8ceb04cc9aadd13953d7300fabed3dd367feebb5221b4ef7968","facadeSource":null,"sources":["extensions/voice-call/src/bounded-child-output.ts","extensions/voice-call/src/call-brief.ts","extensions/voice-call/src/call-delivery-runtime.ts","extensions/voice-call/src/call-delivery.ts","extensions/voice-call/src/http-headers.ts","extensions/voice-call/src/manager.ts","extensions/voice-call/src/manager/callbacks.ts","extensions/voice-call/src/manager/events.ts","extensions/voice-call/src/manager/lifecycle.ts","extensions/voice-call/src/manager/lookup.ts","extensions/voice-call/src/manager/mutations.ts","extensions/voice-call/src/manager/outbound.ts","extensions/voice-call/src/manager/replay-keys.ts","extensions/voice-call/src/manager/state.ts","extensions/voice-call/src/manager/store.ts","extensions/voice-call/src/manager/timer-delays.ts","extensions/voice-call/src/manager/timers.ts","extensions/voice-call/src/manager/twiml.ts","extensions/voice-call/src/manager/voicemail.ts","extensions/voice-call/src/media-base64.ts","extensions/voice-call/src/media-stream.ts","extensions/voice-call/src/providers/shared/call-status.ts","extensions/voice-call/src/proxy-ip.ts","extensions/voice-call/src/realtime-agent-context.ts","extensions/voice-call/src/resolve-call-agent-id.ts","extensions/voice-call/src/response-model.ts","extensions/voice-call/src/runtime-state.ts","extensions/voice-call/src/runtime.ts","extensions/voice-call/src/telephony-tts.ts","extensions/voice-call/src/tts-provider-voice.ts","extensions/voice-call/src/tunnel.ts","extensions/voice-call/src/types.ts","extensions/voice-call/src/webhook-exposure.ts","extensions/voice-call/src/webhook.ts","extensions/voice-call/src/webhook/realtime-inbound-admission.ts","extensions/voice-call/src/webhook/stale-call-reaper.ts","extensions/voice-call/src/webhook/stream-disconnect-grace.ts","extensions/voice-call/src/webhook/tailscale.ts","extensions/voice-call/src/webhook/talk-event-metadata.ts"]},{"output":".setup/state-retention-api-y5WYfZsQ.mjs","sha256":"cfc69c145776d112998e5cde7e3b56075f34510be5bef4531c3dd619f457a5f1","facadeSource":null,"sources":["extensions/voice-call/state-retention-api.ts","packages/normalization-core/src/record-coerce.ts","src/config/channel-config-normalization.ts","src/plugin-sdk/legacy-webhook-listener-migration.ts"]},{"output":".setup/store-path-Bn3bLr8y.mjs","sha256":"dc1261a6452ae6aaa5a33c75b61ea9533dcdbb0ebbb9e8fd620947b5ba68ced5","facadeSource":null,"sources":["extensions/voice-call/src/store-path.ts","extensions/voice-call/src/utils.ts"]},{"output":".setup/telnyx-ZopMHuZl.mjs","sha256":"d2b3dd31af8c8983d37a7f2a7eee99493e261122beda599180eed966dd8a7e7f","facadeSource":"extensions/voice-call/src/providers/telnyx.ts","sources":["extensions/voice-call/src/providers/telnyx.ts"]},{"output":".setup/twilio-BGLnhzpD.mjs","sha256":"afc63bdf9ac2926d499598d076624de4f96cd8168950850e4e63518b7e07ab1d","facadeSource":"extensions/voice-call/src/providers/twilio.ts","sources":["extensions/voice-call/src/providers/twilio.ts","extensions/voice-call/src/providers/twilio/api.ts"]},{"output":".setup/twilio-region-DVg9p6JJ.mjs","sha256":"a36a57185d5ebd7eb17c1cf1e2287917041752a0e82a124bfcca106741421408","facadeSource":null,"sources":["extensions/voice-call/src/providers/twilio-region.ts"]},{"output":".setup/voice-mapping-CvuJ1B50.mjs","sha256":"f33a9ea08d5b47b37068f86ac2ee18272153a2b88993c55b2427dda4b59e920f","facadeSource":null,"sources":["extensions/voice-call/src/voice-mapping.ts"]},{"output":".setup/webhook-replay-B0Eo3Ll5.mjs","sha256":"6bca54aa91e865ea21dbfb0cbabd5aef8aaacc590d176368664165c6afe163c9","facadeSource":null,"sources":["extensions/voice-call/src/webhook-replay.ts"]},{"output":"api.js","sha256":"52defeb38678cdd3504b7035eb0ac836d4ed388afdcf64a08dde425d26900a23","facadeSource":"extensions/voice-call/api.ts","sources":[]},{"output":"cli-metadata.js","sha256":"6297cf60fdb7c3bc39a5e1df54507a7cd9a5f3980cc5991f763571e3e6ce646d","facadeSource":"extensions/voice-call/cli-metadata.ts","sources":["extensions/voice-call/cli-metadata.ts"]},{"output":"cli-output-mode.js","sha256":"5e86fdf507ce50d45e2d16f6222fc7675bc8b05628861f60a90a9e3bd341ed4b","facadeSource":"extensions/voice-call/cli-output-mode.ts","sources":["extensions/voice-call/cli-output-mode.ts"]},{"output":"doctor-contract-api.js","sha256":"c240861961e94772a94299b9756c4b5a0b1e9517c0efd9c802307ad57f7d18e7","facadeSource":"extensions/voice-call/doctor-contract-api.ts","sources":["extensions/voice-call/doctor-contract-api.ts"]},{"output":"index.js","sha256":"f9597f42d1a71423b7e1a9c347d3134427354bbfb3456087f683a95ee1e616b9","facadeSource":"extensions/voice-call/index.ts","sources":["extensions/voice-call/index.ts","extensions/voice-call/src/command-service.ts","extensions/voice-call/src/gateway-continue-operation.ts","extensions/voice-call/src/tool-call-scope.ts","extensions/voice-call/src/tool-schema.ts"]},{"output":"runtime-entry.js","sha256":"343bd9daa7b09efb7780d925a9a886c6428477073227b781dd9e20c072f340d8","facadeSource":"extensions/voice-call/runtime-entry.ts","sources":[]},{"output":"setup-api.js","sha256":"2e10015955e9835a4b9f3cfe81d52f8d6ad49e36f3271f2bf96d57d0453d1873","facadeSource":"extensions/voice-call/setup-api.ts","sources":["extensions/voice-call/setup-api.ts","extensions/voice-call/src/config-migration.ts"]},{"output":"state-retention-api.js","sha256":"fca80a410dd68fe8f46cc0afecc1cfdc4db0319c61523d7f491307badad42658","facadeSource":"extensions/voice-call/state-retention-api.ts","sources":[]}],"unrenderedSources":["extensions/voice-call/api.ts","extensions/voice-call/runtime-entry.ts","extensions/voice-call/src/realtime-transcription.runtime.ts","extensions/voice-call/src/realtime-voice.runtime.ts"]}
|