@openclaw/voice-call 2026.6.10 → 2026.6.11
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/{config-jaA6vOZ2.js → config-BKDAAd8j.js} +11 -9
- package/dist/{config-compat-BPPFhsJ7.js → config-compat-qDCcKTUt.js} +1 -1
- package/dist/{guarded-json-api-DHj6sSuY.js → guarded-json-api-BXeBxB7w.js} +1 -1
- package/dist/index.js +3 -3
- package/dist/{plivo-14MWaE98.js → plivo-CPxvHw8k.js} +2 -2
- package/dist/{realtime-handler-ChN5De4P.js → realtime-handler-rYbJUshl.js} +1 -7
- package/dist/{response-generator-D5yL0gt3.js → response-generator-DBzGujH_.js} +2 -2
- package/dist/{runtime-entry-B8fUMehO.js → runtime-entry-DIAae7sB.js} +6 -6
- package/dist/runtime-entry.js +1 -1
- package/dist/setup-api.js +1 -1
- package/dist/{telnyx-COPVE0cj.js → telnyx-CYS_IihO.js} +1 -1
- package/dist/{twilio-BD7lW2wp.js → twilio-Bn1ta3tQ.js} +2 -2
- package/npm-shrinkwrap.json +3 -3
- package/openclaw.plugin.json +1 -0
- package/package.json +6 -5
- package/skills/voice-call/SKILL.md +45 -0
|
@@ -22,6 +22,15 @@ function deepMergeDefined(base, override) {
|
|
|
22
22
|
return result;
|
|
23
23
|
}
|
|
24
24
|
//#endregion
|
|
25
|
+
//#region extensions/voice-call/src/path-utils.ts
|
|
26
|
+
function normalizePath(pathname) {
|
|
27
|
+
const trimmed = pathname.trim();
|
|
28
|
+
if (!trimmed) return "/";
|
|
29
|
+
const prefixed = trimmed.startsWith("/") ? trimmed : `/${trimmed}`;
|
|
30
|
+
if (prefixed === "/") return prefixed;
|
|
31
|
+
return prefixed.endsWith("/") ? prefixed.slice(0, -1) : prefixed;
|
|
32
|
+
}
|
|
33
|
+
//#endregion
|
|
25
34
|
//#region extensions/voice-call/src/realtime-defaults.ts
|
|
26
35
|
/** Baseline instructions that keep realtime calls brief and route deep work to agent consult. */
|
|
27
36
|
const DEFAULT_VOICE_CALL_REALTIME_INSTRUCTIONS = `You are OpenClaw's phone-call realtime voice interface. Keep spoken replies brief and natural. When a question needs deeper reasoning, current information, or tools, call ${REALTIME_VOICE_AGENT_CONSULT_TOOL_NAME} before answering.`;
|
|
@@ -412,15 +421,8 @@ const DEFAULT_VOICE_CALL_CONFIG = VoiceCallConfigSchema.parse({});
|
|
|
412
421
|
function cloneDefaultVoiceCallConfig() {
|
|
413
422
|
return structuredClone(DEFAULT_VOICE_CALL_CONFIG);
|
|
414
423
|
}
|
|
415
|
-
function normalizeWebhookLikePath(pathname) {
|
|
416
|
-
const trimmed = pathname.trim();
|
|
417
|
-
if (!trimmed) return "/";
|
|
418
|
-
const prefixed = trimmed.startsWith("/") ? trimmed : `/${trimmed}`;
|
|
419
|
-
if (prefixed === "/") return prefixed;
|
|
420
|
-
return prefixed.endsWith("/") ? prefixed.slice(0, -1) : prefixed;
|
|
421
|
-
}
|
|
422
424
|
function defaultRealtimeStreamPathForServePath(servePath) {
|
|
423
|
-
const normalized =
|
|
425
|
+
const normalized = normalizePath(servePath);
|
|
424
426
|
if (normalized.endsWith("/webhook")) return `${normalized.slice(0, -8)}/stream/realtime`;
|
|
425
427
|
if (normalized === "/") return "/voice/stream/realtime";
|
|
426
428
|
return `${normalized}/stream/realtime`;
|
|
@@ -614,4 +616,4 @@ function validateProviderConfig(config) {
|
|
|
614
616
|
};
|
|
615
617
|
}
|
|
616
618
|
//#endregion
|
|
617
|
-
export { resolveVoiceCallEffectiveConfig as a,
|
|
619
|
+
export { resolveVoiceCallEffectiveConfig as a, normalizePath as c, resolveVoiceCallConfig as i, deepMergeDefined as l, normalizeVoiceCallConfig as n, resolveVoiceCallSessionKey as o, resolveTwilioAuthToken as r, validateProviderConfig as s, VoiceCallConfigSchema as t };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as VoiceCallConfigSchema } from "./config-
|
|
1
|
+
import { t as VoiceCallConfigSchema } from "./config-BKDAAd8j.js";
|
|
2
2
|
import { asOptionalRecord, readStringField } from "openclaw/plugin-sdk/string-coerce-runtime";
|
|
3
3
|
//#region extensions/voice-call/src/config-compat.ts
|
|
4
4
|
/** Version where legacy voice-call config shape support is removed. */
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { fetchWithSsrFGuard } from "./runtime-api.js";
|
|
2
2
|
import "./api.js";
|
|
3
|
-
import { a as getHeader } from "./runtime-entry-
|
|
3
|
+
import { a as getHeader } from "./runtime-entry-DIAae7sB.js";
|
|
4
4
|
import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
|
|
5
5
|
import { isLoopbackHost } from "openclaw/plugin-sdk/gateway-runtime";
|
|
6
6
|
import { isFutureDateTimestampMs, resolveExpiresAtMsFromDurationMs } from "openclaw/plugin-sdk/number-runtime";
|
package/dist/index.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { definePluginEntry, sleep } from "./runtime-api.js";
|
|
2
2
|
import "./api.js";
|
|
3
|
-
import { i as resolveVoiceCallConfig, s as validateProviderConfig } from "./config-
|
|
4
|
-
import { c as getTailscaleSelfInfo, l as setupTailscaleExposureRoute, o as resolveWebhookExposureStatus, p as resolveUserPath, s as cleanupTailscaleExposureRoute, t as createVoiceCallRuntime } from "./runtime-entry-
|
|
3
|
+
import { i as resolveVoiceCallConfig, s as validateProviderConfig } from "./config-BKDAAd8j.js";
|
|
4
|
+
import { c as getTailscaleSelfInfo, l as setupTailscaleExposureRoute, o as resolveWebhookExposureStatus, p as resolveUserPath, s as cleanupTailscaleExposureRoute, t as createVoiceCallRuntime } from "./runtime-entry-DIAae7sB.js";
|
|
5
5
|
import { c as getCallHistoryFromStore, m as setVoiceCallStateRuntime } from "./store-8M2m4Isq.js";
|
|
6
|
-
import { i as parseVoiceCallPluginConfig, r as normalizeVoiceCallLegacyConfigInput, t as formatVoiceCallLegacyConfigWarnings } from "./config-compat-
|
|
6
|
+
import { i as parseVoiceCallPluginConfig, r as normalizeVoiceCallLegacyConfigInput, t as formatVoiceCallLegacyConfigWarnings } from "./config-compat-qDCcKTUt.js";
|
|
7
7
|
import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
|
|
8
8
|
import { ErrorCodes, callGatewayFromCli, errorShape } from "openclaw/plugin-sdk/gateway-runtime";
|
|
9
9
|
import { MAX_TCP_PORT, MAX_TIMER_TIMEOUT_MS, addTimerTimeoutGraceMs, clampTimerTimeoutMs, parseStrictNonNegativeInteger, resolveTimerTimeoutMs, timestampMsToIsoString } from "openclaw/plugin-sdk/number-runtime";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { a as getHeader, m as escapeXml } from "./runtime-entry-
|
|
2
|
-
import { a as reconstructWebhookUrl, o as verifyPlivoWebhook, t as guardedJsonApiRequest } from "./guarded-json-api-
|
|
1
|
+
import { a as getHeader, m as escapeXml } from "./runtime-entry-DIAae7sB.js";
|
|
2
|
+
import { a as reconstructWebhookUrl, o as verifyPlivoWebhook, t as guardedJsonApiRequest } from "./guarded-json-api-BXeBxB7w.js";
|
|
3
3
|
import { normalizeLowercaseStringOrEmpty, normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
|
|
4
4
|
import crypto from "node:crypto";
|
|
5
5
|
//#region extensions/voice-call/src/providers/plivo.ts
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { c as normalizePath } from "./config-BKDAAd8j.js";
|
|
1
2
|
import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
|
|
2
3
|
import { isFutureDateTimestampMs, resolveExpiresAtMsFromDurationMs } from "openclaw/plugin-sdk/number-runtime";
|
|
3
4
|
import { createSubsystemLogger } from "openclaw/plugin-sdk/runtime-env";
|
|
@@ -335,13 +336,6 @@ const MAX_PARTIAL_USER_TRANSCRIPT_CHARS = 1200;
|
|
|
335
336
|
const RECENT_FINAL_USER_TRANSCRIPT_TTL_MS = 2e3;
|
|
336
337
|
const BARGE_IN_REQUIRED_LOUD_CHUNKS = 2;
|
|
337
338
|
const logger = createSubsystemLogger("voice-call/realtime");
|
|
338
|
-
function normalizePath(pathname) {
|
|
339
|
-
const trimmed = pathname.trim();
|
|
340
|
-
if (!trimmed) return "/";
|
|
341
|
-
const prefixed = trimmed.startsWith("/") ? trimmed : `/${trimmed}`;
|
|
342
|
-
if (prefixed === "/") return prefixed;
|
|
343
|
-
return prefixed.endsWith("/") ? prefixed.slice(0, -1) : prefixed;
|
|
344
|
-
}
|
|
345
339
|
function buildGreetingInstructions(baseInstructions, greeting) {
|
|
346
340
|
const trimmedGreeting = greeting?.trim();
|
|
347
341
|
if (!trimmedGreeting) return;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { o as resolveVoiceCallSessionKey } from "./config-
|
|
2
|
-
import { f as resolveVoiceResponseModel } from "./runtime-entry-
|
|
1
|
+
import { o as resolveVoiceCallSessionKey } from "./config-BKDAAd8j.js";
|
|
2
|
+
import { f as resolveVoiceResponseModel } from "./runtime-entry-DIAae7sB.js";
|
|
3
3
|
import { isRecord, normalizeLowercaseStringOrEmpty, normalizeStringEntries } from "openclaw/plugin-sdk/string-coerce-runtime";
|
|
4
4
|
import crypto from "node:crypto";
|
|
5
5
|
import { applyModelOverrideToSessionEntry } from "openclaw/plugin-sdk/model-session-runtime";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { isBlockedHostnameOrIp, isRequestBodyLimitError, readRequestBodyWithLimit, requestBodyErrorToText } from "./runtime-api.js";
|
|
2
2
|
import "./api.js";
|
|
3
|
-
import { a as resolveVoiceCallEffectiveConfig,
|
|
3
|
+
import { a as resolveVoiceCallEffectiveConfig, i as resolveVoiceCallConfig, l as deepMergeDefined, n as normalizeVoiceCallConfig, o as resolveVoiceCallSessionKey, r as resolveTwilioAuthToken, s as validateProviderConfig } from "./config-BKDAAd8j.js";
|
|
4
4
|
import { c as getCallHistoryFromStore, d as persistCallRecord, h as TerminalStates, l as loadActiveCallsFromStore, m as setVoiceCallStateRuntime } from "./store-8M2m4Isq.js";
|
|
5
5
|
import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
|
|
6
6
|
import { isLoopbackHost } from "openclaw/plugin-sdk/gateway-runtime";
|
|
@@ -2510,7 +2510,7 @@ function loadRealtimeTranscriptionRuntime() {
|
|
|
2510
2510
|
return realtimeTranscriptionRuntimePromise;
|
|
2511
2511
|
}
|
|
2512
2512
|
function loadResponseGeneratorModule() {
|
|
2513
|
-
responseGeneratorModulePromise ??= import("./response-generator-
|
|
2513
|
+
responseGeneratorModulePromise ??= import("./response-generator-DBzGujH_.js");
|
|
2514
2514
|
return responseGeneratorModulePromise;
|
|
2515
2515
|
}
|
|
2516
2516
|
function sanitizeTranscriptForLog(value) {
|
|
@@ -3198,15 +3198,15 @@ let mockProviderPromise;
|
|
|
3198
3198
|
let realtimeVoiceRuntimePromise;
|
|
3199
3199
|
let realtimeHandlerPromise;
|
|
3200
3200
|
function loadTelnyxProvider() {
|
|
3201
|
-
telnyxProviderPromise ??= import("./telnyx-
|
|
3201
|
+
telnyxProviderPromise ??= import("./telnyx-CYS_IihO.js");
|
|
3202
3202
|
return telnyxProviderPromise;
|
|
3203
3203
|
}
|
|
3204
3204
|
function loadTwilioProvider() {
|
|
3205
|
-
twilioProviderPromise ??= import("./twilio-
|
|
3205
|
+
twilioProviderPromise ??= import("./twilio-Bn1ta3tQ.js");
|
|
3206
3206
|
return twilioProviderPromise;
|
|
3207
3207
|
}
|
|
3208
3208
|
function loadPlivoProvider() {
|
|
3209
|
-
plivoProviderPromise ??= import("./plivo-
|
|
3209
|
+
plivoProviderPromise ??= import("./plivo-CPxvHw8k.js");
|
|
3210
3210
|
return plivoProviderPromise;
|
|
3211
3211
|
}
|
|
3212
3212
|
function loadMockProvider() {
|
|
@@ -3218,7 +3218,7 @@ function loadRealtimeVoiceRuntime() {
|
|
|
3218
3218
|
return realtimeVoiceRuntimePromise;
|
|
3219
3219
|
}
|
|
3220
3220
|
function loadRealtimeHandler() {
|
|
3221
|
-
realtimeHandlerPromise ??= import("./realtime-handler-
|
|
3221
|
+
realtimeHandlerPromise ??= import("./realtime-handler-rYbJUshl.js");
|
|
3222
3222
|
return realtimeHandlerPromise;
|
|
3223
3223
|
}
|
|
3224
3224
|
function resolveVoiceCallConsultSessionKey(call) {
|
package/dist/runtime-entry.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as createVoiceCallRuntime } from "./runtime-entry-
|
|
1
|
+
import { t as createVoiceCallRuntime } from "./runtime-entry-DIAae7sB.js";
|
|
2
2
|
export { createVoiceCallRuntime };
|
package/dist/setup-api.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as migrateVoiceCallLegacyConfigInput } from "./config-compat-
|
|
1
|
+
import { n as migrateVoiceCallLegacyConfigInput } from "./config-compat-qDCcKTUt.js";
|
|
2
2
|
import { isRecord } from "openclaw/plugin-sdk/string-coerce-runtime";
|
|
3
3
|
import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
|
|
4
4
|
//#region extensions/voice-call/setup-api.ts
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { s as verifyTelnyxWebhook, t as guardedJsonApiRequest } from "./guarded-json-api-
|
|
1
|
+
import { s as verifyTelnyxWebhook, t as guardedJsonApiRequest } from "./guarded-json-api-BXeBxB7w.js";
|
|
2
2
|
import crypto from "node:crypto";
|
|
3
3
|
//#region extensions/voice-call/src/providers/telnyx.ts
|
|
4
4
|
function normalizeTelnyxDirection(direction) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { fetchWithSsrFGuard } from "./runtime-api.js";
|
|
2
2
|
import "./api.js";
|
|
3
|
-
import { a as getHeader, d as chunkAudio, h as mapVoiceToPolly, i as normalizeProviderStatus, m as escapeXml, n as isProviderStatusTerminal, r as mapProviderStatusToEndReason } from "./runtime-entry-
|
|
4
|
-
import { c as verifyTwilioWebhook, i as readProviderJsonResponseText, n as cancelProviderResponseBody, r as readProviderErrorResponseSnippet, t as guardedJsonApiRequest } from "./guarded-json-api-
|
|
3
|
+
import { a as getHeader, d as chunkAudio, h as mapVoiceToPolly, i as normalizeProviderStatus, m as escapeXml, n as isProviderStatusTerminal, r as mapProviderStatusToEndReason } from "./runtime-entry-DIAae7sB.js";
|
|
4
|
+
import { c as verifyTwilioWebhook, i as readProviderJsonResponseText, n as cancelProviderResponseBody, r as readProviderErrorResponseSnippet, t as guardedJsonApiRequest } from "./guarded-json-api-BXeBxB7w.js";
|
|
5
5
|
import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
|
|
6
6
|
import crypto from "node:crypto";
|
|
7
7
|
import { safeEqualSecret } from "openclaw/plugin-sdk/security-runtime";
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openclaw/voice-call",
|
|
3
|
-
"version": "2026.6.
|
|
3
|
+
"version": "2026.6.11",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@openclaw/voice-call",
|
|
9
|
-
"version": "2026.6.
|
|
9
|
+
"version": "2026.6.11",
|
|
10
10
|
"dependencies": {
|
|
11
11
|
"commander": "14.0.3",
|
|
12
12
|
"typebox": "1.1.39",
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"zod": "4.4.3"
|
|
15
15
|
},
|
|
16
16
|
"peerDependencies": {
|
|
17
|
-
"openclaw": ">=2026.6.
|
|
17
|
+
"openclaw": ">=2026.6.11"
|
|
18
18
|
},
|
|
19
19
|
"peerDependenciesMeta": {
|
|
20
20
|
"openclaw": {
|
package/openclaw.plugin.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openclaw/voice-call",
|
|
3
|
-
"version": "2026.6.
|
|
3
|
+
"version": "2026.6.11",
|
|
4
4
|
"description": "OpenClaw voice-call plugin for Twilio, Telnyx, and Plivo phone calls.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"zod": "4.4.3"
|
|
15
15
|
},
|
|
16
16
|
"peerDependencies": {
|
|
17
|
-
"openclaw": ">=2026.6.
|
|
17
|
+
"openclaw": ">=2026.6.11"
|
|
18
18
|
},
|
|
19
19
|
"peerDependenciesMeta": {
|
|
20
20
|
"openclaw": {
|
|
@@ -31,10 +31,10 @@
|
|
|
31
31
|
"minHostVersion": ">=2026.4.10"
|
|
32
32
|
},
|
|
33
33
|
"compat": {
|
|
34
|
-
"pluginApi": ">=2026.6.
|
|
34
|
+
"pluginApi": ">=2026.6.11"
|
|
35
35
|
},
|
|
36
36
|
"build": {
|
|
37
|
-
"openclawVersion": "2026.6.
|
|
37
|
+
"openclawVersion": "2026.6.11"
|
|
38
38
|
},
|
|
39
39
|
"release": {
|
|
40
40
|
"publishToClawHub": true,
|
|
@@ -48,7 +48,8 @@
|
|
|
48
48
|
"dist/**",
|
|
49
49
|
"openclaw.plugin.json",
|
|
50
50
|
"npm-shrinkwrap.json",
|
|
51
|
-
"README.md"
|
|
51
|
+
"README.md",
|
|
52
|
+
"skills/**"
|
|
52
53
|
],
|
|
53
54
|
"bundledDependencies": [
|
|
54
55
|
"commander",
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: voice-call
|
|
3
|
+
description: "Start voice calls via the OpenClaw voice-call plugin."
|
|
4
|
+
metadata:
|
|
5
|
+
{
|
|
6
|
+
"openclaw":
|
|
7
|
+
{
|
|
8
|
+
"emoji": "📞",
|
|
9
|
+
"skillKey": "voice-call",
|
|
10
|
+
"requires": { "config": ["plugins.entries.voice-call.enabled"] },
|
|
11
|
+
},
|
|
12
|
+
}
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# Voice Call
|
|
16
|
+
|
|
17
|
+
Use the voice-call plugin to start or inspect calls (Twilio, Telnyx, Plivo, or mock).
|
|
18
|
+
|
|
19
|
+
## CLI
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
openclaw voicecall call --to "+15555550123" --message "Hello from OpenClaw"
|
|
23
|
+
openclaw voicecall status --call-id <id>
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Tool
|
|
27
|
+
|
|
28
|
+
Use `voice_call` for agent-initiated calls.
|
|
29
|
+
|
|
30
|
+
Actions:
|
|
31
|
+
|
|
32
|
+
- `initiate_call` (message, to?, mode?)
|
|
33
|
+
- `continue_call` (callId, message)
|
|
34
|
+
- `speak_to_user` (callId, message)
|
|
35
|
+
- `end_call` (callId)
|
|
36
|
+
- `get_status` (callId)
|
|
37
|
+
|
|
38
|
+
Notes:
|
|
39
|
+
|
|
40
|
+
- Requires the voice-call plugin to be enabled.
|
|
41
|
+
- Plugin config lives under `plugins.entries.voice-call.config`.
|
|
42
|
+
- Twilio config: `provider: "twilio"` + `twilio.accountSid/authToken` + `fromNumber`.
|
|
43
|
+
- Telnyx config: `provider: "telnyx"` + `telnyx.apiKey/connectionId` + `fromNumber`.
|
|
44
|
+
- Plivo config: `provider: "plivo"` + `plivo.authId/authToken` + `fromNumber`.
|
|
45
|
+
- Dev fallback: `provider: "mock"` (no network).
|