@openclaw/voice-call 2026.9.1-beta.1 → 2026.9.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/README.md +1 -1
- package/dist/api.js +2 -2
- package/dist/cli-DNq2qUU0.js +630 -0
- package/dist/config-DQwvsxeV.js +697 -0
- package/dist/doctor-contract-api.js +9 -6
- package/dist/{guarded-json-api-BmMfqKzQ.js → guarded-json-api-9je4i7qf.js} +10 -7
- package/dist/index.js +18 -582
- package/dist/{mock-Dv7KxYGt.js → mock-C57qj18W.js} +1 -1
- package/dist/{plivo-CNPyQgvw.js → plivo-BfKoYCMW.js} +2 -2
- package/dist/{realtime-handler-DYTBiNVr.js → realtime-handler-BYWqpZ6N.js} +67 -45
- package/dist/{response-generator-BCm6S1G6.js → response-generator-C0577tL-.js} +3 -3
- package/dist/runtime-api.js +2 -2
- package/dist/{runtime-entry-ptAKgGER.js → runtime-entry-gE2Yd4V8.js} +138 -766
- package/dist/runtime-entry.js +1 -1
- package/dist/setup-api.js +58 -38
- package/dist/{store-path-51_oC_xn.js → store-path-C_z9zKnA.js} +11 -21
- package/dist/{telnyx-DWpKHVeV.js → telnyx-rcjslHOP.js} +1 -1
- package/dist/{twilio-DUIVX0Eb.js → twilio-B100ALoj.js} +5 -4
- package/dist/{webhook-replay-FQrEGVSM.js → webhook-replay-CCQSoBNF.js} +1 -1
- package/node_modules/typebox/build/format/email.mjs +1 -1
- package/node_modules/typebox/build/format/idna/idn-hostname.mjs +19 -1
- package/node_modules/typebox/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +8 -6
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as CALL_RECORD_EVENT_META_MAX_ENTRIES, c as buildVoiceCallLegacyJsonlEventKey, f as parseVoiceCallRecordLine, h as resolveVoiceCallLegacyCallLogPath, i as CALL_RECORD_EVENT_CHUNKS_NAMESPACE, m as prepareVoiceCallRecordForStorage, n as CALL_RECORD_CHUNK_MAX_ENTRIES, o as MAX_CALL_RECORD_EVENTS, r as CALL_RECORD_EVENTS_NAMESPACE, s as RAW_CALL_RECORD_CHUNK_BYTES, t as resolveDefaultVoiceCallStoreDir } from "./store-path-
|
|
1
|
+
import { a as CALL_RECORD_EVENT_META_MAX_ENTRIES, c as buildVoiceCallLegacyJsonlEventKey, f as parseVoiceCallRecordLine, h as resolveVoiceCallLegacyCallLogPath, i as CALL_RECORD_EVENT_CHUNKS_NAMESPACE, m as prepareVoiceCallRecordForStorage, n as CALL_RECORD_CHUNK_MAX_ENTRIES, o as MAX_CALL_RECORD_EVENTS, r as CALL_RECORD_EVENTS_NAMESPACE, s as RAW_CALL_RECORD_CHUNK_BYTES, t as resolveDefaultVoiceCallStoreDir } from "./store-path-C_z9zKnA.js";
|
|
2
2
|
import { normalizeAgentId } from "openclaw/plugin-sdk/routing";
|
|
3
3
|
import { asOptionalRecord } from "openclaw/plugin-sdk/string-coerce-runtime";
|
|
4
4
|
import path from "node:path";
|
|
@@ -61,10 +61,13 @@ function describeVoiceCallSchemaMigration(migration) {
|
|
|
61
61
|
case "agent-databases-composite-primary-key": return "agent database registry primary key -> agent_id,path";
|
|
62
62
|
case "agent-databases-relative-paths-v9": return "agent database registry paths -> state-relative paths";
|
|
63
63
|
case "audit-events-v2": return "audit event ledger -> versioned message lifecycle schema";
|
|
64
|
-
case "commitments-retirement-v7": return "retired commitments storage ->
|
|
64
|
+
case "commitments-retirement-v7": return "retired commitments storage -> discarded rows, table, and indexes";
|
|
65
65
|
case "state-table-retirement-v10": return "retired shared-state tables -> removed tables and indexes";
|
|
66
66
|
case "state-table-retirement-v11": return "retired skill curator tables -> removed tables and indexes";
|
|
67
67
|
case "singleton-state-foldin-v12": return "singleton state tables -> shared configuration state";
|
|
68
|
+
case "state-consolidation-v13": return "cron jobs and subagent runs -> canonical JSON storage";
|
|
69
|
+
case "creator-namespace-v14": return "cron creators -> explicit principal namespaces";
|
|
70
|
+
case "conversation-binding-targets-v15": return "conversation bindings -> exact target keys without agent/session projections";
|
|
68
71
|
case "worker-placement-execution-mode-v8": return "cloud worker placements -> execution-mode claims";
|
|
69
72
|
case "operator-approvals-system-agent": return "operator approvals -> OpenClaw system changes";
|
|
70
73
|
case "session-watch-cursor-provenance-v4": return "session watch cursors -> provenance column";
|
|
@@ -72,7 +75,6 @@ function describeVoiceCallSchemaMigration(migration) {
|
|
|
72
75
|
}
|
|
73
76
|
return migration.kind;
|
|
74
77
|
}
|
|
75
|
-
/** Return true when a path exists and is a file. */
|
|
76
78
|
/** Build the plugin state key for one migrated event chunk. */
|
|
77
79
|
function buildChunkKey(eventKey, index) {
|
|
78
80
|
return `${eventKey}:chunk:${String(index).padStart(4, "0")}`;
|
|
@@ -142,7 +144,6 @@ async function readLegacyCallRecords(filePath) {
|
|
|
142
144
|
warnings
|
|
143
145
|
};
|
|
144
146
|
}
|
|
145
|
-
/** Archive the legacy JSONL source after a complete migration. */
|
|
146
147
|
/** Select newest missing records that fit remaining plugin state capacity. */
|
|
147
148
|
async function selectEntriesForImport(params) {
|
|
148
149
|
const existingEventKeys = new Set((await params.eventStore.entries()).map((entry) => entry.key));
|
|
@@ -190,7 +191,8 @@ const stateMigrations = [{
|
|
|
190
191
|
label: "Voice Call call log",
|
|
191
192
|
async detectLegacyState(params) {
|
|
192
193
|
const { detectOpenClawStateDatabaseSchemaMigrations } = await import("openclaw/plugin-sdk/doctor-repair-runtime");
|
|
193
|
-
const
|
|
194
|
+
const storePath = resolveVoiceCallStorePath(params);
|
|
195
|
+
const { entries } = await readLegacyCallRecords(resolveVoiceCallLegacyCallLogPath(storePath));
|
|
194
196
|
const schemaMigrations = detectOpenClawStateDatabaseSchemaMigrations({ env: resolveVoiceCallStateDatabaseEnv(params) });
|
|
195
197
|
if (entries.length === 0 && schemaMigrations.length === 0) return null;
|
|
196
198
|
return { preview: [...schemaMigrations.map((migration) => `- Voice Call SQLite schema: ${describeVoiceCallSchemaMigration(migration)}`), ...entries.length > 0 ? [`- Voice Call call log: ${entries.length} ${entries.length === 1 ? "record" : "records"} -> plugin state (${CALL_RECORD_EVENTS_NAMESPACE})`] : []] };
|
|
@@ -199,7 +201,8 @@ const stateMigrations = [{
|
|
|
199
201
|
const { detectOpenClawStateDatabaseSchemaMigrations, repairOpenClawStateDatabaseSchema } = await import("openclaw/plugin-sdk/doctor-repair-runtime");
|
|
200
202
|
const changes = [];
|
|
201
203
|
const warnings = [];
|
|
202
|
-
const
|
|
204
|
+
const storePath = resolveVoiceCallStorePath(params);
|
|
205
|
+
const filePath = resolveVoiceCallLegacyCallLogPath(storePath);
|
|
203
206
|
const { entries, warnings: readWarnings } = await readLegacyCallRecords(filePath);
|
|
204
207
|
warnings.push(...readWarnings);
|
|
205
208
|
const stateDatabaseEnv = resolveVoiceCallStateDatabaseEnv(params);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { fetchWithSsrFGuard } from "./runtime-api.js";
|
|
2
2
|
import "./api.js";
|
|
3
|
-
import { n as normalizeProxyIp, s as getHeader } from "./runtime-entry-
|
|
4
|
-
import { n as reserveWebhookReplay, t as createWebhookReplayCache } from "./webhook-replay-
|
|
3
|
+
import { n as normalizeProxyIp, s as getHeader } from "./runtime-entry-gE2Yd4V8.js";
|
|
4
|
+
import { n as reserveWebhookReplay, t as createWebhookReplayCache } from "./webhook-replay-CCQSoBNF.js";
|
|
5
5
|
import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
|
|
6
6
|
import { isLoopbackHost } from "openclaw/plugin-sdk/gateway-runtime";
|
|
7
7
|
import { normalizeLowercaseStringOrEmpty, normalizeStringEntries } from "openclaw/plugin-sdk/string-coerce-runtime";
|
|
@@ -30,7 +30,8 @@ function createSkippedVerificationReplayKey(provider, ctx) {
|
|
|
30
30
|
function validateTwilioSignature(authToken, signature, url, params) {
|
|
31
31
|
if (!signature) return false;
|
|
32
32
|
const dataToSign = buildTwilioDataToSign(url, params);
|
|
33
|
-
|
|
33
|
+
const expectedSignature = crypto.createHmac("sha1", authToken).update(dataToSign).digest("base64");
|
|
34
|
+
return safeEqualSecret(signature, expectedSignature);
|
|
34
35
|
}
|
|
35
36
|
function buildTwilioDataToSign(url, params) {
|
|
36
37
|
let dataToSign = url;
|
|
@@ -283,7 +284,7 @@ function verifyTelnyxWebhook(ctx, publicKey, options) {
|
|
|
283
284
|
ok: false,
|
|
284
285
|
reason: "Invalid signature"
|
|
285
286
|
};
|
|
286
|
-
const maxSkewMs = options?.maxSkewMs ??
|
|
287
|
+
const maxSkewMs = options?.maxSkewMs ?? 3e5;
|
|
287
288
|
const eventTimeMs = eventTimeSec * 1e3;
|
|
288
289
|
if (Math.abs(Date.now() - eventTimeMs) > maxSkewMs) return {
|
|
289
290
|
ok: false,
|
|
@@ -388,7 +389,9 @@ function createPlivoV3ReplayKey(params) {
|
|
|
388
389
|
}
|
|
389
390
|
function validatePlivoV2Signature(params) {
|
|
390
391
|
const baseUrl = getBaseUrlNoQuery(params.url);
|
|
391
|
-
|
|
392
|
+
const expected = normalizeSignatureBase64(crypto.createHmac("sha256", params.authToken).update(baseUrl + params.nonce).digest("base64"));
|
|
393
|
+
const provided = normalizeSignatureBase64(params.signature);
|
|
394
|
+
return safeEqualSecret(expected, provided);
|
|
392
395
|
}
|
|
393
396
|
function toParamMapFromSearchParams(sp) {
|
|
394
397
|
const map = {};
|
|
@@ -536,8 +539,8 @@ function verifyPlivoWebhook(ctx, authToken, options) {
|
|
|
536
539
|
}
|
|
537
540
|
//#endregion
|
|
538
541
|
//#region extensions/voice-call/src/providers/shared/response-body.ts
|
|
539
|
-
const PROVIDER_JSON_RESPONSE_MAX_BYTES =
|
|
540
|
-
const PROVIDER_ERROR_RESPONSE_MAX_BYTES =
|
|
542
|
+
const PROVIDER_JSON_RESPONSE_MAX_BYTES = 1048576;
|
|
543
|
+
const PROVIDER_ERROR_RESPONSE_MAX_BYTES = 8192;
|
|
541
544
|
const TRUNCATED_SUFFIX = "... [truncated]";
|
|
542
545
|
async function cancelProviderResponseBody(response) {
|
|
543
546
|
await response.body?.cancel().catch(() => void 0);
|