@runcore-sh/runcore 0.4.0 → 0.5.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/dictionary.json +2 -2
- package/dist/activity/log.js +2 -2
- package/dist/activity/log.js.map +1 -1
- package/dist/agents/governed-spawn.d.ts.map +1 -1
- package/dist/cli.js +101 -11
- package/dist/cli.js.map +1 -1
- package/dist/extensions/cache.d.ts +57 -0
- package/dist/extensions/cache.d.ts.map +1 -0
- package/dist/extensions/cache.js +173 -0
- package/dist/extensions/cache.js.map +1 -0
- package/dist/extensions/client.d.ts +55 -0
- package/dist/extensions/client.d.ts.map +1 -0
- package/dist/extensions/client.js +120 -0
- package/dist/extensions/client.js.map +1 -0
- package/dist/extensions/index.d.ts +13 -0
- package/dist/extensions/index.d.ts.map +1 -0
- package/dist/extensions/index.js +12 -0
- package/dist/extensions/index.js.map +1 -0
- package/dist/extensions/loader.d.ts +50 -0
- package/dist/extensions/loader.d.ts.map +1 -0
- package/dist/extensions/loader.js +166 -0
- package/dist/extensions/loader.js.map +1 -0
- package/dist/extensions/manifest.d.ts +38 -0
- package/dist/extensions/manifest.d.ts.map +1 -0
- package/dist/extensions/manifest.js +17 -0
- package/dist/extensions/manifest.js.map +1 -0
- package/dist/extensions/stubs.d.ts +27 -0
- package/dist/extensions/stubs.d.ts.map +1 -0
- package/dist/extensions/stubs.js +45 -0
- package/dist/extensions/stubs.js.map +1 -0
- package/dist/lib/audit.js +2 -2
- package/dist/lib/audit.js.map +1 -1
- package/dist/lib/brain-migrate.d.ts +21 -0
- package/dist/lib/brain-migrate.d.ts.map +1 -0
- package/dist/lib/brain-migrate.js +137 -0
- package/dist/lib/brain-migrate.js.map +1 -0
- package/dist/lib/paths.d.ts +27 -0
- package/dist/lib/paths.d.ts.map +1 -1
- package/dist/lib/paths.js +65 -0
- package/dist/lib/paths.js.map +1 -1
- package/dist/llm/call-log.d.ts +40 -0
- package/dist/llm/call-log.d.ts.map +1 -0
- package/dist/llm/call-log.js +35 -0
- package/dist/llm/call-log.js.map +1 -0
- package/dist/llm/complete.d.ts +6 -0
- package/dist/llm/complete.d.ts.map +1 -1
- package/dist/llm/complete.js +27 -0
- package/dist/llm/complete.js.map +1 -1
- package/dist/mcp-server.js +118 -2
- package/dist/mcp-server.js.map +1 -1
- package/dist/memory/file-backed.d.ts +4 -0
- package/dist/memory/file-backed.d.ts.map +1 -1
- package/dist/memory/file-backed.js +4 -0
- package/dist/memory/file-backed.js.map +1 -1
- package/dist/memory/vector-index.d.ts +4 -12
- package/dist/memory/vector-index.d.ts.map +1 -1
- package/dist/memory/vector-index.js +11 -93
- package/dist/memory/vector-index.js.map +1 -1
- package/dist/search/brain-docs.d.ts +17 -7
- package/dist/search/brain-docs.d.ts.map +1 -1
- package/dist/search/brain-docs.js +170 -52
- package/dist/search/brain-docs.js.map +1 -1
- package/dist/search/brain-rag.d.ts +45 -0
- package/dist/search/brain-rag.d.ts.map +1 -0
- package/dist/search/brain-rag.js +275 -0
- package/dist/search/brain-rag.js.map +1 -0
- package/dist/search/chunker.d.ts +24 -0
- package/dist/search/chunker.d.ts.map +1 -0
- package/dist/search/chunker.js +95 -0
- package/dist/search/chunker.js.map +1 -0
- package/dist/search/embedder.d.ts +16 -0
- package/dist/search/embedder.d.ts.map +1 -0
- package/dist/search/embedder.js +108 -0
- package/dist/search/embedder.js.map +1 -0
- package/dist/search/file-watcher.d.ts +11 -0
- package/dist/search/file-watcher.d.ts.map +1 -0
- package/dist/search/file-watcher.js +86 -0
- package/dist/search/file-watcher.js.map +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +814 -472
- package/dist/server.js.map +1 -1
- package/dist/sessions/store.d.ts +9 -0
- package/dist/sessions/store.d.ts.map +1 -1
- package/dist/sessions/store.js.map +1 -1
- package/dist/settings.d.ts +26 -0
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js +78 -2
- package/dist/settings.js.map +1 -1
- package/dist/tracing/init.d.ts +1 -1
- package/dist/tracing/init.d.ts.map +1 -1
- package/dist/utils/logger.js +2 -2
- package/dist/utils/logger.js.map +1 -1
- package/module-tiers.json +164 -0
- package/package.json +9 -13
- package/public/avatar/cache/1184385ec5522b57.mp4 +0 -0
- package/public/avatar/cache/1f15f6a1ebd7e439.mp4 +0 -0
- package/public/avatar/cache/2c7e47ff0bdeb8d1.mp4 +0 -0
- package/public/avatar/cache/5f308566f7abb8f2.mp4 +0 -0
- package/public/avatar/cache/62f9cfba848d724e.mp4 +0 -0
- package/public/avatar/cache/6d64e657e6bf2aab.mp4 +0 -0
- package/public/avatar/cache/763ad0349e0b6f26.mp4 +0 -0
- package/public/avatar/cache/81a516cfd461b2b9.mp4 +0 -0
- package/public/avatar/cache/9366de15fd6910ca.mp4 +0 -0
- package/public/avatar/cache/ade41a846b283895.mp4 +0 -0
- package/public/avatar/cache/b6066e5c65383eec.mp4 +0 -0
- package/public/avatar/cache/edadb75d37891fc7.mp4 +0 -0
- package/public/avatar/cache/f0ae159640621dd9.mp4 +0 -0
- package/public/avatar/cache/fc2e5419adf29d96.mp4 +0 -0
- package/public/index.html +379 -59
- package/dist/agents/autonomous.js +0 -749
- package/dist/agents/autonomous.js.map +0 -1
- package/dist/agents/commit.js +0 -113
- package/dist/agents/commit.js.map +0 -1
- package/dist/agents/continue.js +0 -158
- package/dist/agents/continue.js.map +0 -1
- package/dist/agents/cooldown.js +0 -397
- package/dist/agents/cooldown.js.map +0 -1
- package/dist/agents/dedup-guard.js +0 -131
- package/dist/agents/dedup-guard.js.map +0 -1
- package/dist/agents/feed.js +0 -176
- package/dist/agents/feed.js.map +0 -1
- package/dist/agents/governance.js +0 -292
- package/dist/agents/governance.js.map +0 -1
- package/dist/agents/governed-spawn.js +0 -192
- package/dist/agents/governed-spawn.js.map +0 -1
- package/dist/agents/heartbeat.js +0 -324
- package/dist/agents/heartbeat.js.map +0 -1
- package/dist/agents/instance-manager.js +0 -850
- package/dist/agents/instance-manager.js.map +0 -1
- package/dist/agents/issue-reporter.js +0 -123
- package/dist/agents/issue-reporter.js.map +0 -1
- package/dist/agents/issues.js +0 -141
- package/dist/agents/issues.js.map +0 -1
- package/dist/agents/locks.js +0 -234
- package/dist/agents/locks.js.map +0 -1
- package/dist/agents/memory.js +0 -93
- package/dist/agents/memory.js.map +0 -1
- package/dist/agents/monitor.js +0 -235
- package/dist/agents/monitor.js.map +0 -1
- package/dist/agents/orchestration.js +0 -715
- package/dist/agents/orchestration.js.map +0 -1
- package/dist/agents/recover.js +0 -166
- package/dist/agents/recover.js.map +0 -1
- package/dist/agents/reflection.js +0 -199
- package/dist/agents/reflection.js.map +0 -1
- package/dist/agents/runtime/bus.js +0 -174
- package/dist/agents/runtime/bus.js.map +0 -1
- package/dist/agents/runtime/config.js +0 -101
- package/dist/agents/runtime/config.js.map +0 -1
- package/dist/agents/runtime/driver.js +0 -214
- package/dist/agents/runtime/driver.js.map +0 -1
- package/dist/agents/runtime/errors.js +0 -40
- package/dist/agents/runtime/errors.js.map +0 -1
- package/dist/agents/runtime/index.js +0 -54
- package/dist/agents/runtime/index.js.map +0 -1
- package/dist/agents/runtime/lifecycle.js +0 -116
- package/dist/agents/runtime/lifecycle.js.map +0 -1
- package/dist/agents/runtime/manager.js +0 -948
- package/dist/agents/runtime/manager.js.map +0 -1
- package/dist/agents/runtime/registry.js +0 -195
- package/dist/agents/runtime/registry.js.map +0 -1
- package/dist/agents/runtime/resources.js +0 -146
- package/dist/agents/runtime/resources.js.map +0 -1
- package/dist/agents/runtime/types.js +0 -24
- package/dist/agents/runtime/types.js.map +0 -1
- package/dist/agents/spawn-policy.js +0 -202
- package/dist/agents/spawn-policy.js.map +0 -1
- package/dist/agents/spawn.js +0 -970
- package/dist/agents/spawn.js.map +0 -1
- package/dist/agents/triage.js +0 -81
- package/dist/agents/triage.js.map +0 -1
- package/dist/agents/workflow.js +0 -543
- package/dist/agents/workflow.js.map +0 -1
- package/dist/avatar/client.js +0 -172
- package/dist/avatar/client.js.map +0 -1
- package/dist/avatar/sidecar.js +0 -125
- package/dist/avatar/sidecar.js.map +0 -1
- package/dist/browser/sessions.js +0 -122
- package/dist/browser/sessions.js.map +0 -1
- package/dist/capabilities/definitions/browser.js +0 -242
- package/dist/capabilities/definitions/browser.js.map +0 -1
- package/dist/channels/whatsapp.js +0 -200
- package/dist/channels/whatsapp.js.map +0 -1
- package/dist/credentials/store.js +0 -189
- package/dist/credentials/store.js.map +0 -1
- package/dist/files/deep-index.js +0 -337
- package/dist/files/deep-index.js.map +0 -1
- package/dist/files/extract.js +0 -33
- package/dist/files/extract.js.map +0 -1
- package/dist/files/gdrive.js +0 -246
- package/dist/files/gdrive.js.map +0 -1
- package/dist/github/client.js +0 -408
- package/dist/github/client.js.map +0 -1
- package/dist/github/commit-analysis.js +0 -276
- package/dist/github/commit-analysis.js.map +0 -1
- package/dist/github/contributor-stats.js +0 -119
- package/dist/github/contributor-stats.js.map +0 -1
- package/dist/github/issue-sla.js +0 -220
- package/dist/github/issue-sla.js.map +0 -1
- package/dist/github/issue-triage.js +0 -286
- package/dist/github/issue-triage.js.map +0 -1
- package/dist/github/pr-readiness.js +0 -197
- package/dist/github/pr-readiness.js.map +0 -1
- package/dist/github/pr-review.js +0 -410
- package/dist/github/pr-review.js.map +0 -1
- package/dist/github/release-notes.js +0 -227
- package/dist/github/release-notes.js.map +0 -1
- package/dist/github/repo-health.js +0 -303
- package/dist/github/repo-health.js.map +0 -1
- package/dist/github/retry.js +0 -117
- package/dist/github/retry.js.map +0 -1
- package/dist/github/types.js +0 -8
- package/dist/github/types.js.map +0 -1
- package/dist/github/webhooks.js +0 -153
- package/dist/github/webhooks.js.map +0 -1
- package/dist/google/auth.js +0 -325
- package/dist/google/auth.js.map +0 -1
- package/dist/google/calendar-timer.js +0 -91
- package/dist/google/calendar-timer.js.map +0 -1
- package/dist/google/calendar.js +0 -270
- package/dist/google/calendar.js.map +0 -1
- package/dist/google/docs.js +0 -309
- package/dist/google/docs.js.map +0 -1
- package/dist/google/gmail-send.js +0 -219
- package/dist/google/gmail-send.js.map +0 -1
- package/dist/google/gmail-timer.js +0 -223
- package/dist/google/gmail-timer.js.map +0 -1
- package/dist/google/gmail.js +0 -470
- package/dist/google/gmail.js.map +0 -1
- package/dist/google/plugin.js +0 -169
- package/dist/google/plugin.js.map +0 -1
- package/dist/google/tasks-timer.js +0 -107
- package/dist/google/tasks-timer.js.map +0 -1
- package/dist/google/tasks.js +0 -331
- package/dist/google/tasks.js.map +0 -1
- package/dist/google/temporal.js +0 -176
- package/dist/google/temporal.js.map +0 -1
- package/dist/integrations/gate.js +0 -100
- package/dist/integrations/gate.js.map +0 -1
- package/dist/integrations/github.js +0 -331
- package/dist/integrations/github.js.map +0 -1
- package/dist/integrations/google-tasks.js +0 -432
- package/dist/integrations/google-tasks.js.map +0 -1
- package/dist/mdns.js +0 -110
- package/dist/mdns.js.map +0 -1
- package/dist/notifications/channel.js +0 -83
- package/dist/notifications/channel.js.map +0 -1
- package/dist/notifications/channels/adapter.js +0 -55
- package/dist/notifications/channels/adapter.js.map +0 -1
- package/dist/notifications/channels/index.js +0 -6
- package/dist/notifications/channels/index.js.map +0 -1
- package/dist/notifications/channels/log.js +0 -29
- package/dist/notifications/channels/log.js.map +0 -1
- package/dist/notifications/email.js +0 -72
- package/dist/notifications/email.js.map +0 -1
- package/dist/notifications/engine.js +0 -198
- package/dist/notifications/engine.js.map +0 -1
- package/dist/notifications/index.js +0 -24
- package/dist/notifications/index.js.map +0 -1
- package/dist/notifications/phone.js +0 -48
- package/dist/notifications/phone.js.map +0 -1
- package/dist/notifications/sms.js +0 -65
- package/dist/notifications/sms.js.map +0 -1
- package/dist/notifications/types.js +0 -14
- package/dist/notifications/types.js.map +0 -1
- package/dist/notifications/webhook.js +0 -65
- package/dist/notifications/webhook.js.map +0 -1
- package/dist/resend/inbox.js +0 -199
- package/dist/resend/inbox.js.map +0 -1
- package/dist/resend/webhooks.js +0 -244
- package/dist/resend/webhooks.js.map +0 -1
- package/dist/search/browse.js +0 -225
- package/dist/search/browse.js.map +0 -1
- package/dist/search/perplexity.js +0 -41
- package/dist/search/perplexity.js.map +0 -1
- package/dist/slack/channels.js +0 -277
- package/dist/slack/channels.js.map +0 -1
- package/dist/slack/client.js +0 -468
- package/dist/slack/client.js.map +0 -1
- package/dist/slack/retry.js +0 -100
- package/dist/slack/retry.js.map +0 -1
- package/dist/slack/types.js +0 -52
- package/dist/slack/types.js.map +0 -1
- package/dist/slack/webhooks.js +0 -285
- package/dist/slack/webhooks.js.map +0 -1
- package/dist/stt/client.js +0 -66
- package/dist/stt/client.js.map +0 -1
- package/dist/stt/sidecar.js +0 -115
- package/dist/stt/sidecar.js.map +0 -1
- package/dist/tracing/bridge.js +0 -70
- package/dist/tracing/bridge.js.map +0 -1
- package/dist/tracing/correlation.js +0 -49
- package/dist/tracing/correlation.js.map +0 -1
- package/dist/tracing/index.js +0 -18
- package/dist/tracing/index.js.map +0 -1
- package/dist/tracing/init.js +0 -81
- package/dist/tracing/init.js.map +0 -1
- package/dist/tracing/instrument.js +0 -145
- package/dist/tracing/instrument.js.map +0 -1
- package/dist/tracing/middleware.js +0 -69
- package/dist/tracing/middleware.js.map +0 -1
- package/dist/tracing/tracer.js +0 -327
- package/dist/tracing/tracer.js.map +0 -1
- package/dist/tts/client.js +0 -48
- package/dist/tts/client.js.map +0 -1
- package/dist/tts/sidecar.js +0 -148
- package/dist/tts/sidecar.js.map +0 -1
- package/dist/twilio/call.js +0 -79
- package/dist/twilio/call.js.map +0 -1
- package/dist/vault/matcher.js +0 -197
- package/dist/vault/matcher.js.map +0 -1
- package/dist/vault/personal.js +0 -163
- package/dist/vault/personal.js.map +0 -1
- package/dist/vault/policy.js +0 -159
- package/dist/vault/policy.js.map +0 -1
- package/dist/vault/store.js +0 -122
- package/dist/vault/store.js.map +0 -1
- package/dist/vault/transfer.js +0 -188
- package/dist/vault/transfer.js.map +0 -1
- package/dist/volumes/index.js +0 -2
- package/dist/volumes/index.js.map +0 -1
- package/dist/volumes/manager.js +0 -462
- package/dist/volumes/manager.js.map +0 -1
- package/dist/volumes/types.js +0 -8
- package/dist/volumes/types.js.map +0 -1
- package/dist/webhooks/config.js +0 -214
- package/dist/webhooks/config.js.map +0 -1
- package/dist/webhooks/event-log.js +0 -132
- package/dist/webhooks/event-log.js.map +0 -1
- package/dist/webhooks/handler.js +0 -103
- package/dist/webhooks/handler.js.map +0 -1
- package/dist/webhooks/handlers.js +0 -231
- package/dist/webhooks/handlers.js.map +0 -1
- package/dist/webhooks/index.js +0 -33
- package/dist/webhooks/index.js.map +0 -1
- package/dist/webhooks/mount.js +0 -400
- package/dist/webhooks/mount.js.map +0 -1
- package/dist/webhooks/registry.js +0 -143
- package/dist/webhooks/registry.js.map +0 -1
- package/dist/webhooks/relay.js +0 -53
- package/dist/webhooks/relay.js.map +0 -1
- package/dist/webhooks/retry.js +0 -270
- package/dist/webhooks/retry.js.map +0 -1
- package/dist/webhooks/router.js +0 -290
- package/dist/webhooks/router.js.map +0 -1
- package/dist/webhooks/twilio.js +0 -129
- package/dist/webhooks/twilio.js.map +0 -1
- package/dist/webhooks/types.js +0 -8
- package/dist/webhooks/types.js.map +0 -1
- package/dist/webhooks/verify.js +0 -154
- package/dist/webhooks/verify.js.map +0 -1
package/dist/webhooks/twilio.js
DELETED
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Twilio webhook signature verification and WhatsApp message processing.
|
|
3
|
-
* Follows src/slack/webhooks.ts + src/linear/webhooks.ts patterns.
|
|
4
|
-
*
|
|
5
|
-
* Webhook setup: Configure in Twilio Console → Messaging → WhatsApp sandbox/sender.
|
|
6
|
-
* URL: https://<your-domain>/api/twilio/whatsapp
|
|
7
|
-
* Method: POST
|
|
8
|
-
*
|
|
9
|
-
* Twilio sends:
|
|
10
|
-
* - X-Twilio-Signature: HMAC-SHA1 of URL + sorted POST params
|
|
11
|
-
* - POST body: URL-encoded form data (From, To, Body, MessageSid, etc.)
|
|
12
|
-
*/
|
|
13
|
-
import { logActivity } from "../activity/log.js";
|
|
14
|
-
import { getClient } from "../channels/whatsapp.js";
|
|
15
|
-
import { hmacSha1Base64, timingSafeCompare } from "./registry.js";
|
|
16
|
-
import { createTwilioStyleProvider, safeHandler } from "./handlers.js";
|
|
17
|
-
// ── Signature verification ───────────────────────────────────────────────────
|
|
18
|
-
/**
|
|
19
|
-
* Verify a Twilio webhook signature.
|
|
20
|
-
* https://www.twilio.com/docs/usage/security#validating-requests
|
|
21
|
-
*
|
|
22
|
-
* Twilio signs requests with HMAC-SHA1:
|
|
23
|
-
* 1. Start with the full webhook URL
|
|
24
|
-
* 2. Sort POST params alphabetically by key
|
|
25
|
-
* 3. Append each key+value (no separators)
|
|
26
|
-
* 4. HMAC-SHA1 the result with the auth token
|
|
27
|
-
* 5. Base64-encode the digest
|
|
28
|
-
*
|
|
29
|
-
* Uses generic signature helpers from webhooks/registry.
|
|
30
|
-
*/
|
|
31
|
-
export function verifySignature(url, params, signature, authToken) {
|
|
32
|
-
// Build the data string: URL + sorted params concatenated
|
|
33
|
-
const sortedKeys = Object.keys(params).sort();
|
|
34
|
-
let data = url;
|
|
35
|
-
for (const key of sortedKeys) {
|
|
36
|
-
data += key + params[key];
|
|
37
|
-
}
|
|
38
|
-
const expected = hmacSha1Base64(data, authToken);
|
|
39
|
-
return timingSafeCompare(signature, expected);
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Parse URL-encoded form body into a key-value record.
|
|
43
|
-
*/
|
|
44
|
-
export function parseFormBody(body) {
|
|
45
|
-
const params = {};
|
|
46
|
-
const pairs = body.split("&");
|
|
47
|
-
for (const pair of pairs) {
|
|
48
|
-
const eqIdx = pair.indexOf("=");
|
|
49
|
-
if (eqIdx === -1)
|
|
50
|
-
continue;
|
|
51
|
-
const key = decodeURIComponent(pair.slice(0, eqIdx).replace(/\+/g, " "));
|
|
52
|
-
const value = decodeURIComponent(pair.slice(eqIdx + 1).replace(/\+/g, " "));
|
|
53
|
-
params[key] = value;
|
|
54
|
-
}
|
|
55
|
-
return params;
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Strip the "whatsapp:" prefix from a Twilio WhatsApp number.
|
|
59
|
-
*/
|
|
60
|
-
function stripWhatsAppPrefix(number) {
|
|
61
|
-
return number.replace(/^whatsapp:/, "");
|
|
62
|
-
}
|
|
63
|
-
// ── Message processing ───────────────────────────────────────────────────────
|
|
64
|
-
/**
|
|
65
|
-
* Process an incoming WhatsApp message from Twilio.
|
|
66
|
-
* Stores in message history and updates contacts.
|
|
67
|
-
* Returns structured result, never throws.
|
|
68
|
-
*/
|
|
69
|
-
export async function processIncomingMessage(payload) {
|
|
70
|
-
const from = stripWhatsAppPrefix(payload.From);
|
|
71
|
-
const to = stripWhatsAppPrefix(payload.To);
|
|
72
|
-
const body = payload.Body?.trim() ?? "";
|
|
73
|
-
if (!body) {
|
|
74
|
-
return { handled: true, message: "Empty message, skipped" };
|
|
75
|
-
}
|
|
76
|
-
logActivity({
|
|
77
|
-
source: "whatsapp",
|
|
78
|
-
summary: `WhatsApp from ${from}: "${body.slice(0, 80)}"`,
|
|
79
|
-
detail: `sid=${payload.MessageSid} profileName=${payload.ProfileName ?? "unknown"}`,
|
|
80
|
-
});
|
|
81
|
-
// Store inbound message in history
|
|
82
|
-
const client = getClient();
|
|
83
|
-
if (client) {
|
|
84
|
-
await client.appendHistory({
|
|
85
|
-
sid: payload.MessageSid,
|
|
86
|
-
from,
|
|
87
|
-
to,
|
|
88
|
-
body,
|
|
89
|
-
direction: "inbound",
|
|
90
|
-
timestamp: new Date().toISOString(),
|
|
91
|
-
});
|
|
92
|
-
// Update contact with sender info
|
|
93
|
-
await client.upsertContact({
|
|
94
|
-
phone: from,
|
|
95
|
-
name: payload.ProfileName,
|
|
96
|
-
lastMessageAt: new Date().toISOString(),
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
return { handled: true, message: `Received from ${from}: "${body.slice(0, 40)}"` };
|
|
100
|
-
}
|
|
101
|
-
/**
|
|
102
|
-
* Generate an empty TwiML response (acknowledge receipt without replying).
|
|
103
|
-
* Twilio requires a valid TwiML response to avoid retries.
|
|
104
|
-
*/
|
|
105
|
-
export function emptyTwimlResponse() {
|
|
106
|
-
return "<?xml version=\"1.0\" encoding=\"UTF-8\"?><Response></Response>";
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* Generate a TwiML response with a reply message.
|
|
110
|
-
*/
|
|
111
|
-
export function replyTwiml(message) {
|
|
112
|
-
// Escape XML entities to prevent injection
|
|
113
|
-
const escaped = message
|
|
114
|
-
.replace(/&/g, "&")
|
|
115
|
-
.replace(/</g, "<")
|
|
116
|
-
.replace(/>/g, ">")
|
|
117
|
-
.replace(/"/g, """)
|
|
118
|
-
.replace(/'/g, "'");
|
|
119
|
-
return `<?xml version="1.0" encoding="UTF-8"?><Response><Message>${escaped}</Message></Response>`;
|
|
120
|
-
}
|
|
121
|
-
// ── Registry integration ────────────────────────────────────────────────────
|
|
122
|
-
/** Twilio/WhatsApp webhook provider (deferred registration). */
|
|
123
|
-
export const twilioProvider = createTwilioStyleProvider({
|
|
124
|
-
name: "twilio",
|
|
125
|
-
process: safeHandler("twilio", async (payload) => {
|
|
126
|
-
return processIncomingMessage(payload);
|
|
127
|
-
}),
|
|
128
|
-
});
|
|
129
|
-
//# sourceMappingURL=twilio.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"twilio.js","sourceRoot":"","sources":["../../src/webhooks/twilio.ts"],"names":[],"mappings":"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"}
|
package/dist/webhooks/types.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/webhooks/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
package/dist/webhooks/verify.js
DELETED
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Signature verification utilities for webhooks.
|
|
3
|
-
*
|
|
4
|
-
* Provides cryptographic primitives and timing-safe comparison
|
|
5
|
-
* used by all webhook providers for request authentication.
|
|
6
|
-
*/
|
|
7
|
-
import * as crypto from "node:crypto";
|
|
8
|
-
// ── HMAC digest helpers ──────────────────────────────────────────────────────
|
|
9
|
-
/**
|
|
10
|
-
* HMAC-SHA256 hex digest. Used by Linear and similar services.
|
|
11
|
-
*/
|
|
12
|
-
export function hmacSha256Hex(data, secret) {
|
|
13
|
-
return crypto.createHmac("sha256", secret).update(data).digest("hex");
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* HMAC-SHA256 base64 digest.
|
|
17
|
-
*/
|
|
18
|
-
export function hmacSha256Base64(data, secret) {
|
|
19
|
-
return crypto.createHmac("sha256", secret).update(data).digest("base64");
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* HMAC-SHA1 base64 digest. Used by Twilio.
|
|
23
|
-
*/
|
|
24
|
-
export function hmacSha1Base64(data, secret) {
|
|
25
|
-
return crypto.createHmac("sha1", secret).update(data).digest("base64");
|
|
26
|
-
}
|
|
27
|
-
// ── Comparison & freshness ───────────────────────────────────────────────────
|
|
28
|
-
/**
|
|
29
|
-
* Timing-safe string comparison. Returns false on length mismatch.
|
|
30
|
-
*/
|
|
31
|
-
export function timingSafeCompare(a, b) {
|
|
32
|
-
try {
|
|
33
|
-
return crypto.timingSafeEqual(Buffer.from(a), Buffer.from(b));
|
|
34
|
-
}
|
|
35
|
-
catch {
|
|
36
|
-
return false; // Different lengths
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Check that a timestamp is within an acceptable window (replay attack prevention).
|
|
41
|
-
* @param timestamp Unix timestamp in seconds
|
|
42
|
-
* @param maxAgeSeconds Maximum age allowed. Default: 300 (5 minutes).
|
|
43
|
-
*/
|
|
44
|
-
export function isTimestampFresh(timestamp, maxAgeSeconds = 300) {
|
|
45
|
-
if (isNaN(timestamp))
|
|
46
|
-
return false;
|
|
47
|
-
const now = Math.floor(Date.now() / 1000);
|
|
48
|
-
return Math.abs(now - timestamp) <= maxAgeSeconds;
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Verify an HMAC-SHA256 hex signature (Linear-style).
|
|
52
|
-
* Compares `HMAC-SHA256(rawBody, secret)` against the provided signature.
|
|
53
|
-
*/
|
|
54
|
-
export function verifyHmacSha256Hex(ctx) {
|
|
55
|
-
const expected = hmacSha256Hex(ctx.rawBody, ctx.secret);
|
|
56
|
-
return timingSafeCompare(ctx.signature, expected);
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Verify an HMAC-SHA256 base64 signature.
|
|
60
|
-
* Optionally strips a "sha256=" prefix (GitHub-style).
|
|
61
|
-
*/
|
|
62
|
-
export function verifyHmacSha256Base64(ctx, stripPrefix = false) {
|
|
63
|
-
const sig = stripPrefix
|
|
64
|
-
? ctx.signature.replace(/^sha256=/, "")
|
|
65
|
-
: ctx.signature;
|
|
66
|
-
const expected = hmacSha256Base64(ctx.rawBody, ctx.secret);
|
|
67
|
-
return timingSafeCompare(sig, expected);
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* Verify a Slack v0 signature.
|
|
71
|
-
* Format: `v0={HMAC-SHA256("v0:{timestamp}:{body}", secret)}`
|
|
72
|
-
* Also validates timestamp freshness.
|
|
73
|
-
*/
|
|
74
|
-
export function verifySlackV0(ctx, maxAgeSeconds = 300) {
|
|
75
|
-
const timestamp = ctx.headers?.["timestamp"] ?? "";
|
|
76
|
-
const ts = parseInt(timestamp, 10);
|
|
77
|
-
if (!isTimestampFresh(ts, maxAgeSeconds))
|
|
78
|
-
return false;
|
|
79
|
-
const baseString = `v0:${timestamp}:${ctx.rawBody}`;
|
|
80
|
-
const computed = `v0=${hmacSha256Hex(baseString, ctx.secret)}`;
|
|
81
|
-
return timingSafeCompare(ctx.signature, computed);
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Verify a Svix-style signature (used by Resend).
|
|
85
|
-
* Secret is base64-encoded (with optional "whsec_" prefix).
|
|
86
|
-
* Sign string: "{svix-id}.{svix-timestamp}.{rawBody}"
|
|
87
|
-
* HMAC-SHA256, base64-encoded result. Multiple comma-separated sigs in header (v1,... prefix).
|
|
88
|
-
* Any match = valid. Also checks timestamp freshness.
|
|
89
|
-
*/
|
|
90
|
-
export function verifySvix(ctx, maxAgeSeconds = 300) {
|
|
91
|
-
const svixId = ctx.headers?.["svix-id"] ?? "";
|
|
92
|
-
const svixTimestamp = ctx.headers?.["svix-timestamp"] ?? "";
|
|
93
|
-
const svixSignature = ctx.signature; // svix-signature header value
|
|
94
|
-
if (!svixId || !svixTimestamp || !svixSignature)
|
|
95
|
-
return false;
|
|
96
|
-
// Check timestamp freshness
|
|
97
|
-
const ts = parseInt(svixTimestamp, 10);
|
|
98
|
-
if (!isTimestampFresh(ts, maxAgeSeconds))
|
|
99
|
-
return false;
|
|
100
|
-
// Decode secret: strip "whsec_" prefix if present, then base64-decode
|
|
101
|
-
let secretKey;
|
|
102
|
-
try {
|
|
103
|
-
const rawSecret = ctx.secret.startsWith("whsec_")
|
|
104
|
-
? ctx.secret.slice(6)
|
|
105
|
-
: ctx.secret;
|
|
106
|
-
secretKey = Buffer.from(rawSecret, "base64");
|
|
107
|
-
}
|
|
108
|
-
catch {
|
|
109
|
-
return false;
|
|
110
|
-
}
|
|
111
|
-
// Compute expected signature
|
|
112
|
-
const signPayload = `${svixId}.${svixTimestamp}.${ctx.rawBody}`;
|
|
113
|
-
const expected = crypto
|
|
114
|
-
.createHmac("sha256", secretKey)
|
|
115
|
-
.update(signPayload)
|
|
116
|
-
.digest("base64");
|
|
117
|
-
// Compare against each comma-separated signature (strip "v1," prefix)
|
|
118
|
-
const signatures = svixSignature.split(" ");
|
|
119
|
-
for (const sig of signatures) {
|
|
120
|
-
const parts = sig.split(",");
|
|
121
|
-
// Format: "v1,<base64>" — we only support v1
|
|
122
|
-
for (const part of parts) {
|
|
123
|
-
const trimmed = part.trim();
|
|
124
|
-
if (trimmed.startsWith("v1,")) {
|
|
125
|
-
const candidate = trimmed.slice(3);
|
|
126
|
-
if (timingSafeCompare(candidate, expected))
|
|
127
|
-
return true;
|
|
128
|
-
}
|
|
129
|
-
else if (parts.length === 2 && parts[0] === "v1") {
|
|
130
|
-
// "v1,<base64>" split by comma gives ["v1", "<base64>"]
|
|
131
|
-
if (timingSafeCompare(parts[1], expected))
|
|
132
|
-
return true;
|
|
133
|
-
break;
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
return false;
|
|
138
|
-
}
|
|
139
|
-
/**
|
|
140
|
-
* Verify a Twilio signature.
|
|
141
|
-
* HMAC-SHA1 of URL + sorted POST params, base64 encoded.
|
|
142
|
-
*/
|
|
143
|
-
export function verifyTwilio(ctx) {
|
|
144
|
-
if (!ctx.url || !ctx.params)
|
|
145
|
-
return false;
|
|
146
|
-
const sortedKeys = Object.keys(ctx.params).sort();
|
|
147
|
-
let data = ctx.url;
|
|
148
|
-
for (const key of sortedKeys) {
|
|
149
|
-
data += key + ctx.params[key];
|
|
150
|
-
}
|
|
151
|
-
const expected = hmacSha1Base64(data, ctx.secret);
|
|
152
|
-
return timingSafeCompare(ctx.signature, expected);
|
|
153
|
-
}
|
|
154
|
-
//# sourceMappingURL=verify.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/webhooks/verify.ts"],"names":[],"mappings":"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"}
|