@openclaw/voice-call 2026.5.2-beta.2 → 2026.5.3-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api.js +2 -0
- package/dist/call-status-CXldV5o8.js +32 -0
- package/dist/cli-metadata.js +12 -0
- package/dist/config-7w04YpHh.js +548 -0
- package/dist/config-compat-B0me39_4.js +129 -0
- package/dist/guarded-json-api-Btx5EE4w.js +591 -0
- package/dist/http-headers-BrnxBasF.js +10 -0
- package/dist/index.js +1284 -0
- package/dist/mock-CeKvfVEd.js +135 -0
- package/dist/plivo-B-a7KFoT.js +393 -0
- package/dist/realtime-handler-B63CIDP2.js +325 -0
- package/dist/realtime-transcription.runtime-B2h70y2W.js +2 -0
- package/dist/realtime-voice.runtime-Bkh4nvLn.js +2 -0
- package/dist/response-generator-BrcmwDZU.js +182 -0
- package/dist/response-model-CyF5K80p.js +12 -0
- package/dist/runtime-api.js +6 -0
- package/dist/runtime-entry-88ytYAQa.js +3119 -0
- package/dist/runtime-entry.js +2 -0
- package/dist/setup-api.js +37 -0
- package/dist/telnyx-jjBE8boz.js +260 -0
- package/dist/twilio-1OqbcXLL.js +676 -0
- package/dist/voice-mapping-BYDGdWGx.js +40 -0
- package/package.json +14 -6
- package/api.ts +0 -16
- package/cli-metadata.ts +0 -10
- package/config-api.ts +0 -12
- package/index.test.ts +0 -943
- package/index.ts +0 -794
- package/runtime-api.ts +0 -20
- package/runtime-entry.ts +0 -1
- package/setup-api.ts +0 -47
- package/src/allowlist.test.ts +0 -18
- package/src/allowlist.ts +0 -19
- package/src/cli.ts +0 -845
- package/src/config-compat.test.ts +0 -120
- package/src/config-compat.ts +0 -227
- package/src/config.test.ts +0 -479
- package/src/config.ts +0 -808
- package/src/core-bridge.ts +0 -14
- package/src/deep-merge.test.ts +0 -40
- package/src/deep-merge.ts +0 -23
- package/src/gateway-continue-operation.ts +0 -200
- package/src/http-headers.test.ts +0 -16
- package/src/http-headers.ts +0 -15
- package/src/manager/context.ts +0 -42
- package/src/manager/events.test.ts +0 -581
- package/src/manager/events.ts +0 -288
- package/src/manager/lifecycle.ts +0 -53
- package/src/manager/lookup.test.ts +0 -52
- package/src/manager/lookup.ts +0 -35
- package/src/manager/outbound.test.ts +0 -528
- package/src/manager/outbound.ts +0 -486
- package/src/manager/state.ts +0 -48
- package/src/manager/store.ts +0 -106
- package/src/manager/timers.test.ts +0 -129
- package/src/manager/timers.ts +0 -113
- package/src/manager/twiml.test.ts +0 -13
- package/src/manager/twiml.ts +0 -17
- package/src/manager.closed-loop.test.ts +0 -236
- package/src/manager.inbound-allowlist.test.ts +0 -188
- package/src/manager.notify.test.ts +0 -377
- package/src/manager.restore.test.ts +0 -183
- package/src/manager.test-harness.ts +0 -127
- package/src/manager.ts +0 -392
- package/src/media-stream.test.ts +0 -768
- package/src/media-stream.ts +0 -708
- package/src/providers/base.ts +0 -97
- package/src/providers/mock.test.ts +0 -78
- package/src/providers/mock.ts +0 -185
- package/src/providers/plivo.test.ts +0 -93
- package/src/providers/plivo.ts +0 -601
- package/src/providers/shared/call-status.test.ts +0 -24
- package/src/providers/shared/call-status.ts +0 -24
- package/src/providers/shared/guarded-json-api.test.ts +0 -106
- package/src/providers/shared/guarded-json-api.ts +0 -42
- package/src/providers/telnyx.test.ts +0 -340
- package/src/providers/telnyx.ts +0 -394
- package/src/providers/twilio/api.test.ts +0 -145
- package/src/providers/twilio/api.ts +0 -93
- package/src/providers/twilio/twiml-policy.test.ts +0 -84
- package/src/providers/twilio/twiml-policy.ts +0 -87
- package/src/providers/twilio/webhook.ts +0 -34
- package/src/providers/twilio.test.ts +0 -591
- package/src/providers/twilio.ts +0 -861
- package/src/providers/twilio.types.ts +0 -17
- package/src/realtime-defaults.ts +0 -3
- package/src/realtime-fast-context.test.ts +0 -88
- package/src/realtime-fast-context.ts +0 -165
- package/src/realtime-transcription.runtime.ts +0 -4
- package/src/realtime-voice.runtime.ts +0 -5
- package/src/response-generator.test.ts +0 -321
- package/src/response-generator.ts +0 -318
- package/src/response-model.test.ts +0 -71
- package/src/response-model.ts +0 -23
- package/src/runtime.test.ts +0 -536
- package/src/runtime.ts +0 -510
- package/src/telephony-audio.test.ts +0 -61
- package/src/telephony-audio.ts +0 -12
- package/src/telephony-tts.test.ts +0 -196
- package/src/telephony-tts.ts +0 -235
- package/src/test-fixtures.ts +0 -73
- package/src/tts-provider-voice.test.ts +0 -34
- package/src/tts-provider-voice.ts +0 -21
- package/src/tunnel.test.ts +0 -166
- package/src/tunnel.ts +0 -314
- package/src/types.ts +0 -291
- package/src/utils.test.ts +0 -17
- package/src/utils.ts +0 -14
- package/src/voice-mapping.test.ts +0 -34
- package/src/voice-mapping.ts +0 -68
- package/src/webhook/realtime-handler.test.ts +0 -598
- package/src/webhook/realtime-handler.ts +0 -485
- package/src/webhook/stale-call-reaper.test.ts +0 -88
- package/src/webhook/stale-call-reaper.ts +0 -38
- package/src/webhook/tailscale.test.ts +0 -214
- package/src/webhook/tailscale.ts +0 -129
- package/src/webhook-exposure.test.ts +0 -33
- package/src/webhook-exposure.ts +0 -84
- package/src/webhook-security.test.ts +0 -770
- package/src/webhook-security.ts +0 -994
- package/src/webhook.hangup-once.lifecycle.test.ts +0 -135
- package/src/webhook.test.ts +0 -1470
- package/src/webhook.ts +0 -908
- package/src/webhook.types.ts +0 -5
- package/src/websocket-test-support.ts +0 -72
- package/tsconfig.json +0 -16
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { t as VoiceCallConfigSchema } from "./config-7w04YpHh.js";
|
|
2
|
+
import { asOptionalRecord, readStringField } from "openclaw/plugin-sdk/text-runtime";
|
|
3
|
+
//#region extensions/voice-call/src/config-compat.ts
|
|
4
|
+
const VOICE_CALL_LEGACY_CONFIG_REMOVAL_VERSION = "2026.6.0";
|
|
5
|
+
const asObject = asOptionalRecord;
|
|
6
|
+
const getString = readStringField;
|
|
7
|
+
function getNumber(obj, key) {
|
|
8
|
+
const value = obj?.[key];
|
|
9
|
+
return typeof value === "number" ? value : void 0;
|
|
10
|
+
}
|
|
11
|
+
function mergeProviderConfig(providersValue, providerId, compatValues) {
|
|
12
|
+
if (Object.keys(compatValues).length === 0) return asObject(providersValue);
|
|
13
|
+
const providers = asObject(providersValue) ?? {};
|
|
14
|
+
const existing = asObject(providers[providerId]) ?? {};
|
|
15
|
+
return {
|
|
16
|
+
...providers,
|
|
17
|
+
[providerId]: {
|
|
18
|
+
...existing,
|
|
19
|
+
...compatValues
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function collectVoiceCallLegacyConfigIssues(value) {
|
|
24
|
+
const raw = asObject(value) ?? {};
|
|
25
|
+
const twilio = asObject(raw.twilio);
|
|
26
|
+
const streaming = asObject(raw.streaming);
|
|
27
|
+
const issues = [];
|
|
28
|
+
if (raw.provider === "log") issues.push({
|
|
29
|
+
path: "provider",
|
|
30
|
+
replacement: "provider",
|
|
31
|
+
message: "Replace provider \"log\" with \"mock\"."
|
|
32
|
+
});
|
|
33
|
+
if (typeof twilio?.from === "string") issues.push({
|
|
34
|
+
path: "twilio.from",
|
|
35
|
+
replacement: "fromNumber",
|
|
36
|
+
message: "Move twilio.from to fromNumber."
|
|
37
|
+
});
|
|
38
|
+
if (typeof streaming?.sttProvider === "string") issues.push({
|
|
39
|
+
path: "streaming.sttProvider",
|
|
40
|
+
replacement: "streaming.provider",
|
|
41
|
+
message: "Move streaming.sttProvider to streaming.provider."
|
|
42
|
+
});
|
|
43
|
+
if (typeof streaming?.openaiApiKey === "string") issues.push({
|
|
44
|
+
path: "streaming.openaiApiKey",
|
|
45
|
+
replacement: "streaming.providers.openai.apiKey",
|
|
46
|
+
message: "Move streaming.openaiApiKey to streaming.providers.openai.apiKey."
|
|
47
|
+
});
|
|
48
|
+
if (typeof streaming?.sttModel === "string") issues.push({
|
|
49
|
+
path: "streaming.sttModel",
|
|
50
|
+
replacement: "streaming.providers.openai.model",
|
|
51
|
+
message: "Move streaming.sttModel to streaming.providers.openai.model."
|
|
52
|
+
});
|
|
53
|
+
if (typeof streaming?.silenceDurationMs === "number") issues.push({
|
|
54
|
+
path: "streaming.silenceDurationMs",
|
|
55
|
+
replacement: "streaming.providers.openai.silenceDurationMs",
|
|
56
|
+
message: "Move streaming.silenceDurationMs to streaming.providers.openai.silenceDurationMs."
|
|
57
|
+
});
|
|
58
|
+
if (typeof streaming?.vadThreshold === "number") issues.push({
|
|
59
|
+
path: "streaming.vadThreshold",
|
|
60
|
+
replacement: "streaming.providers.openai.vadThreshold",
|
|
61
|
+
message: "Move streaming.vadThreshold to streaming.providers.openai.vadThreshold."
|
|
62
|
+
});
|
|
63
|
+
return issues;
|
|
64
|
+
}
|
|
65
|
+
function formatVoiceCallLegacyConfigWarnings(params) {
|
|
66
|
+
const issues = collectVoiceCallLegacyConfigIssues(params.value);
|
|
67
|
+
if (issues.length === 0) return [];
|
|
68
|
+
return [`[voice-call] legacy config keys detected under ${params.configPathPrefix}; runtime loading will not rewrite them, and support for the legacy shape will be removed in ${VOICE_CALL_LEGACY_CONFIG_REMOVAL_VERSION}. Run "${params.doctorFixCommand}".`, ...issues.map((issue) => `[voice-call] ${params.configPathPrefix}.${issue.path}: ${issue.message}`)];
|
|
69
|
+
}
|
|
70
|
+
function migrateVoiceCallLegacyConfigInput(params) {
|
|
71
|
+
const raw = asObject(params.value) ?? {};
|
|
72
|
+
const twilio = asObject(raw.twilio);
|
|
73
|
+
const streaming = asObject(raw.streaming);
|
|
74
|
+
const configPathPrefix = params.configPathPrefix ?? "plugins.entries.voice-call.config";
|
|
75
|
+
const issues = collectVoiceCallLegacyConfigIssues(raw);
|
|
76
|
+
const legacyStreamingOpenAICompat = {};
|
|
77
|
+
const streamingOpenAIApiKey = getString(streaming, "openaiApiKey");
|
|
78
|
+
if (streamingOpenAIApiKey) legacyStreamingOpenAICompat.apiKey = streamingOpenAIApiKey;
|
|
79
|
+
const streamingSttModel = getString(streaming, "sttModel");
|
|
80
|
+
if (streamingSttModel) legacyStreamingOpenAICompat.model = streamingSttModel;
|
|
81
|
+
const streamingSilenceDurationMs = getNumber(streaming, "silenceDurationMs");
|
|
82
|
+
if (streamingSilenceDurationMs !== void 0) legacyStreamingOpenAICompat.silenceDurationMs = streamingSilenceDurationMs;
|
|
83
|
+
const streamingVadThreshold = getNumber(streaming, "vadThreshold");
|
|
84
|
+
if (streamingVadThreshold !== void 0) legacyStreamingOpenAICompat.vadThreshold = streamingVadThreshold;
|
|
85
|
+
const streamingProvider = getString(streaming, "provider");
|
|
86
|
+
const legacyStreamingProvider = getString(streaming, "sttProvider");
|
|
87
|
+
const normalizedStreaming = streaming ? {
|
|
88
|
+
...streaming,
|
|
89
|
+
provider: streamingProvider ?? legacyStreamingProvider,
|
|
90
|
+
providers: mergeProviderConfig(streaming.providers, "openai", legacyStreamingOpenAICompat)
|
|
91
|
+
} : void 0;
|
|
92
|
+
if (normalizedStreaming) {
|
|
93
|
+
delete normalizedStreaming.sttProvider;
|
|
94
|
+
delete normalizedStreaming.openaiApiKey;
|
|
95
|
+
delete normalizedStreaming.sttModel;
|
|
96
|
+
delete normalizedStreaming.silenceDurationMs;
|
|
97
|
+
delete normalizedStreaming.vadThreshold;
|
|
98
|
+
}
|
|
99
|
+
const normalizedTwilio = twilio ? { ...twilio } : void 0;
|
|
100
|
+
if (normalizedTwilio) delete normalizedTwilio.from;
|
|
101
|
+
const config = {
|
|
102
|
+
...raw,
|
|
103
|
+
provider: raw.provider === "log" ? "mock" : raw.provider,
|
|
104
|
+
fromNumber: raw.fromNumber ?? (typeof twilio?.from === "string" ? twilio.from : void 0),
|
|
105
|
+
twilio: normalizedTwilio,
|
|
106
|
+
streaming: normalizedStreaming
|
|
107
|
+
};
|
|
108
|
+
const changes = [];
|
|
109
|
+
if (raw.provider === "log") changes.push(`Moved ${configPathPrefix}.provider "log" → "mock".`);
|
|
110
|
+
if (typeof twilio?.from === "string" && typeof raw.fromNumber !== "string") changes.push(`Moved ${configPathPrefix}.twilio.from → ${configPathPrefix}.fromNumber.`);
|
|
111
|
+
if (typeof streaming?.sttProvider === "string") changes.push(`Moved ${configPathPrefix}.streaming.sttProvider → ${configPathPrefix}.streaming.provider.`);
|
|
112
|
+
if (typeof streaming?.openaiApiKey === "string") changes.push(`Moved ${configPathPrefix}.streaming.openaiApiKey → ${configPathPrefix}.streaming.providers.openai.apiKey.`);
|
|
113
|
+
if (typeof streaming?.sttModel === "string") changes.push(`Moved ${configPathPrefix}.streaming.sttModel → ${configPathPrefix}.streaming.providers.openai.model.`);
|
|
114
|
+
if (typeof streaming?.silenceDurationMs === "number") changes.push(`Moved ${configPathPrefix}.streaming.silenceDurationMs → ${configPathPrefix}.streaming.providers.openai.silenceDurationMs.`);
|
|
115
|
+
if (typeof streaming?.vadThreshold === "number") changes.push(`Moved ${configPathPrefix}.streaming.vadThreshold → ${configPathPrefix}.streaming.providers.openai.vadThreshold.`);
|
|
116
|
+
return {
|
|
117
|
+
config,
|
|
118
|
+
changes,
|
|
119
|
+
issues
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
function normalizeVoiceCallLegacyConfigInput(value) {
|
|
123
|
+
return migrateVoiceCallLegacyConfigInput({ value }).config;
|
|
124
|
+
}
|
|
125
|
+
function parseVoiceCallPluginConfig(value) {
|
|
126
|
+
return VoiceCallConfigSchema.parse(normalizeVoiceCallLegacyConfigInput(value));
|
|
127
|
+
}
|
|
128
|
+
//#endregion
|
|
129
|
+
export { parseVoiceCallPluginConfig as i, migrateVoiceCallLegacyConfigInput as n, normalizeVoiceCallLegacyConfigInput as r, formatVoiceCallLegacyConfigWarnings as t };
|