@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.
@@ -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 = normalizeWebhookLikePath(servePath);
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, deepMergeDefined as c, resolveVoiceCallConfig as i, normalizeVoiceCallConfig as n, resolveVoiceCallSessionKey as o, resolveTwilioAuthToken as r, validateProviderConfig as s, VoiceCallConfigSchema as t };
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-jaA6vOZ2.js";
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-B8fUMehO.js";
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-jaA6vOZ2.js";
4
- import { c as getTailscaleSelfInfo, l as setupTailscaleExposureRoute, o as resolveWebhookExposureStatus, p as resolveUserPath, s as cleanupTailscaleExposureRoute, t as createVoiceCallRuntime } from "./runtime-entry-B8fUMehO.js";
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-BPPFhsJ7.js";
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-B8fUMehO.js";
2
- import { a as reconstructWebhookUrl, o as verifyPlivoWebhook, t as guardedJsonApiRequest } from "./guarded-json-api-DHj6sSuY.js";
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-jaA6vOZ2.js";
2
- import { f as resolveVoiceResponseModel } from "./runtime-entry-B8fUMehO.js";
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, c as deepMergeDefined, i as resolveVoiceCallConfig, n as normalizeVoiceCallConfig, o as resolveVoiceCallSessionKey, r as resolveTwilioAuthToken, s as validateProviderConfig } from "./config-jaA6vOZ2.js";
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-D5yL0gt3.js");
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-COPVE0cj.js");
3201
+ telnyxProviderPromise ??= import("./telnyx-CYS_IihO.js");
3202
3202
  return telnyxProviderPromise;
3203
3203
  }
3204
3204
  function loadTwilioProvider() {
3205
- twilioProviderPromise ??= import("./twilio-BD7lW2wp.js");
3205
+ twilioProviderPromise ??= import("./twilio-Bn1ta3tQ.js");
3206
3206
  return twilioProviderPromise;
3207
3207
  }
3208
3208
  function loadPlivoProvider() {
3209
- plivoProviderPromise ??= import("./plivo-14MWaE98.js");
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-ChN5De4P.js");
3221
+ realtimeHandlerPromise ??= import("./realtime-handler-rYbJUshl.js");
3222
3222
  return realtimeHandlerPromise;
3223
3223
  }
3224
3224
  function resolveVoiceCallConsultSessionKey(call) {
@@ -1,2 +1,2 @@
1
- import { t as createVoiceCallRuntime } from "./runtime-entry-B8fUMehO.js";
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-BPPFhsJ7.js";
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-DHj6sSuY.js";
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-B8fUMehO.js";
4
- import { c as verifyTwilioWebhook, i as readProviderJsonResponseText, n as cancelProviderResponseBody, r as readProviderErrorResponseSnippet, t as guardedJsonApiRequest } from "./guarded-json-api-DHj6sSuY.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-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";
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@openclaw/voice-call",
3
- "version": "2026.6.10",
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.10",
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.10"
17
+ "openclaw": ">=2026.6.11"
18
18
  },
19
19
  "peerDependenciesMeta": {
20
20
  "openclaw": {
@@ -2,6 +2,7 @@
2
2
  "id": "voice-call",
3
3
  "name": "Voice Call",
4
4
  "description": "OpenClaw voice-call plugin for Twilio, Telnyx, and Plivo phone calls.",
5
+ "skills": ["./skills"],
5
6
  "commandAliases": [{ "name": "voicecall" }],
6
7
  "activation": {
7
8
  "onStartup": true,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/voice-call",
3
- "version": "2026.6.10",
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.10"
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.10"
34
+ "pluginApi": ">=2026.6.11"
35
35
  },
36
36
  "build": {
37
- "openclawVersion": "2026.6.10"
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).