@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/retry.js
DELETED
|
@@ -1,270 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Retry logic and error handling for webhook processing.
|
|
3
|
-
*
|
|
4
|
-
* Provides exponential backoff with jitter for transient failures,
|
|
5
|
-
* dead-letter tracking for permanently failed events, and
|
|
6
|
-
* error classification utilities.
|
|
7
|
-
*/
|
|
8
|
-
import * as fs from "node:fs";
|
|
9
|
-
import * as path from "node:path";
|
|
10
|
-
import { logActivity } from "../activity/log.js";
|
|
11
|
-
// ── Retry with exponential backoff ───────────────────────────────────────────
|
|
12
|
-
/**
|
|
13
|
-
* Execute a function with retry logic.
|
|
14
|
-
* Retries on thrown errors, stops on success or exhaustion.
|
|
15
|
-
* Uses exponential backoff with jitter:
|
|
16
|
-
* delay = min(baseDelay × 2^(attempt-1), maxDelay) × random(0.5–1.5)
|
|
17
|
-
*/
|
|
18
|
-
export async function withWebhookRetry(fn, opts) {
|
|
19
|
-
const maxAttempts = opts?.maxAttempts ?? 3;
|
|
20
|
-
const baseDelay = opts?.baseDelayMs ?? 500;
|
|
21
|
-
const maxDelay = opts?.maxDelayMs ?? 10_000;
|
|
22
|
-
const label = opts?.label ?? "webhook";
|
|
23
|
-
const retryStart = performance.now();
|
|
24
|
-
let lastError;
|
|
25
|
-
let totalSleepMs = 0;
|
|
26
|
-
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
27
|
-
const attemptStart = performance.now();
|
|
28
|
-
try {
|
|
29
|
-
const result = await fn();
|
|
30
|
-
const attemptMs = performance.now() - attemptStart;
|
|
31
|
-
if (attempt > 1) {
|
|
32
|
-
const totalMs = performance.now() - retryStart;
|
|
33
|
-
logActivity({
|
|
34
|
-
source: "system",
|
|
35
|
-
summary: `[perf] ${label}: succeeded on attempt ${attempt}/${maxAttempts} — attempt:${attemptMs.toFixed(1)}ms, totalRetry:${totalMs.toFixed(1)}ms, totalSleep:${totalSleepMs.toFixed(0)}ms`,
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
return result;
|
|
39
|
-
}
|
|
40
|
-
catch (err) {
|
|
41
|
-
lastError = err;
|
|
42
|
-
const attemptMs = performance.now() - attemptStart;
|
|
43
|
-
const errMsg = err instanceof Error ? err.message : String(err);
|
|
44
|
-
const errKind = classifyError(err);
|
|
45
|
-
if (attempt < maxAttempts) {
|
|
46
|
-
const delay = Math.min(baseDelay * 2 ** (attempt - 1), maxDelay);
|
|
47
|
-
const jitter = delay * (0.5 + Math.random() * 0.5);
|
|
48
|
-
totalSleepMs += jitter;
|
|
49
|
-
logActivity({
|
|
50
|
-
source: "system",
|
|
51
|
-
summary: `${label}: attempt ${attempt}/${maxAttempts} failed (${errKind}, ${attemptMs.toFixed(1)}ms: ${errMsg}), retrying in ${Math.round(jitter)}ms`,
|
|
52
|
-
});
|
|
53
|
-
await new Promise((resolve) => setTimeout(resolve, jitter));
|
|
54
|
-
}
|
|
55
|
-
else {
|
|
56
|
-
const totalMs = performance.now() - retryStart;
|
|
57
|
-
logActivity({
|
|
58
|
-
source: "system",
|
|
59
|
-
summary: `[perf] ${label}: exhausted ${maxAttempts} attempts — total:${totalMs.toFixed(1)}ms, sleep:${totalSleepMs.toFixed(0)}ms, lastAttempt:${attemptMs.toFixed(1)}ms, error:${errKind}:${errMsg}`,
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
opts?.onExhausted?.(lastError, maxAttempts);
|
|
65
|
-
throw lastError;
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Classify an error for retry decisions.
|
|
69
|
-
* - Network errors, 429, 5xx → transient (retry)
|
|
70
|
-
* - 400, 404, validation → permanent (don't retry)
|
|
71
|
-
* - 401, 403 → auth (don't retry, flag for re-auth)
|
|
72
|
-
*/
|
|
73
|
-
export function classifyError(err) {
|
|
74
|
-
if (err instanceof Error) {
|
|
75
|
-
const msg = err.message.toLowerCase();
|
|
76
|
-
// Auth errors
|
|
77
|
-
if (msg.includes("unauthorized") || msg.includes("forbidden")) {
|
|
78
|
-
return "auth";
|
|
79
|
-
}
|
|
80
|
-
if (msg.includes("401") || msg.includes("403")) {
|
|
81
|
-
return "auth";
|
|
82
|
-
}
|
|
83
|
-
// Transient errors
|
|
84
|
-
if (msg.includes("timeout") ||
|
|
85
|
-
msg.includes("econnreset") ||
|
|
86
|
-
msg.includes("econnrefused") ||
|
|
87
|
-
msg.includes("socket hang up") ||
|
|
88
|
-
msg.includes("429") ||
|
|
89
|
-
msg.includes("rate limit") ||
|
|
90
|
-
msg.includes("503") ||
|
|
91
|
-
msg.includes("502") ||
|
|
92
|
-
msg.includes("504")) {
|
|
93
|
-
return "transient";
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
return "permanent";
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* Create a WebhookError from a caught exception.
|
|
100
|
-
*/
|
|
101
|
-
export function createWebhookError(err, provider, attempt) {
|
|
102
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
103
|
-
return {
|
|
104
|
-
kind: classifyError(err),
|
|
105
|
-
message,
|
|
106
|
-
provider,
|
|
107
|
-
timestamp: new Date().toISOString(),
|
|
108
|
-
attempt,
|
|
109
|
-
cause: err,
|
|
110
|
-
};
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* Dead-letter queue for failed webhook events.
|
|
114
|
-
* Stores events that exhausted all retries for manual inspection or replay.
|
|
115
|
-
* Optionally persists to a JSON file to survive process restarts.
|
|
116
|
-
*/
|
|
117
|
-
export class DeadLetterQueue {
|
|
118
|
-
entries = [];
|
|
119
|
-
maxSize;
|
|
120
|
-
filePath;
|
|
121
|
-
dirty = false;
|
|
122
|
-
/**
|
|
123
|
-
* @param maxSize Maximum entries to keep in the queue.
|
|
124
|
-
* @param filePath Optional file path for persistence. If provided, entries
|
|
125
|
-
* are loaded on construction and saved on mutation.
|
|
126
|
-
*/
|
|
127
|
-
constructor(maxSize = 100, filePath) {
|
|
128
|
-
this.maxSize = maxSize;
|
|
129
|
-
this.filePath = filePath ?? null;
|
|
130
|
-
if (this.filePath) {
|
|
131
|
-
this.loadFromFile();
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
/** Add a failed event to the dead-letter queue. */
|
|
135
|
-
add(entry) {
|
|
136
|
-
const dlEntry = {
|
|
137
|
-
...entry,
|
|
138
|
-
id: `dlq_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,
|
|
139
|
-
exhaustedAt: new Date().toISOString(),
|
|
140
|
-
};
|
|
141
|
-
this.entries.push(dlEntry);
|
|
142
|
-
// Evict oldest entries if over capacity
|
|
143
|
-
if (this.entries.length > this.maxSize) {
|
|
144
|
-
this.entries = this.entries.slice(-this.maxSize);
|
|
145
|
-
}
|
|
146
|
-
logActivity({
|
|
147
|
-
source: "system",
|
|
148
|
-
summary: `Dead-letter: ${entry.provider} event added (${entry.error.message})`,
|
|
149
|
-
});
|
|
150
|
-
this.persist();
|
|
151
|
-
}
|
|
152
|
-
/** Get all entries, optionally filtered by provider. */
|
|
153
|
-
list(provider) {
|
|
154
|
-
if (provider) {
|
|
155
|
-
return this.entries.filter((e) => e.provider === provider);
|
|
156
|
-
}
|
|
157
|
-
return [...this.entries];
|
|
158
|
-
}
|
|
159
|
-
/** Remove an entry by ID. Returns true if found. */
|
|
160
|
-
remove(id) {
|
|
161
|
-
const idx = this.entries.findIndex((e) => e.id === id);
|
|
162
|
-
if (idx === -1)
|
|
163
|
-
return false;
|
|
164
|
-
this.entries.splice(idx, 1);
|
|
165
|
-
this.persist();
|
|
166
|
-
return true;
|
|
167
|
-
}
|
|
168
|
-
/** Remove all entries, optionally for a specific provider. */
|
|
169
|
-
clear(provider) {
|
|
170
|
-
if (provider) {
|
|
171
|
-
const before = this.entries.length;
|
|
172
|
-
this.entries = this.entries.filter((e) => e.provider !== provider);
|
|
173
|
-
const removed = before - this.entries.length;
|
|
174
|
-
if (removed > 0)
|
|
175
|
-
this.persist();
|
|
176
|
-
return removed;
|
|
177
|
-
}
|
|
178
|
-
const count = this.entries.length;
|
|
179
|
-
this.entries = [];
|
|
180
|
-
if (count > 0)
|
|
181
|
-
this.persist();
|
|
182
|
-
return count;
|
|
183
|
-
}
|
|
184
|
-
/** Number of entries in the queue. */
|
|
185
|
-
get size() {
|
|
186
|
-
return this.entries.length;
|
|
187
|
-
}
|
|
188
|
-
/** Whether the queue has a file-backed persistence path configured. */
|
|
189
|
-
get persistent() {
|
|
190
|
-
return this.filePath !== null;
|
|
191
|
-
}
|
|
192
|
-
// ── File persistence ────────────────────────────────────────────────────────
|
|
193
|
-
/** Load entries from the persistence file. Silently skips if file doesn't exist. */
|
|
194
|
-
loadFromFile() {
|
|
195
|
-
if (!this.filePath)
|
|
196
|
-
return;
|
|
197
|
-
try {
|
|
198
|
-
const resolved = path.resolve(this.filePath);
|
|
199
|
-
if (!fs.existsSync(resolved))
|
|
200
|
-
return;
|
|
201
|
-
const content = fs.readFileSync(resolved, "utf-8");
|
|
202
|
-
const parsed = JSON.parse(content);
|
|
203
|
-
if (Array.isArray(parsed)) {
|
|
204
|
-
this.entries = parsed.slice(-this.maxSize);
|
|
205
|
-
logActivity({
|
|
206
|
-
source: "system",
|
|
207
|
-
summary: `DLQ: loaded ${this.entries.length} entries from ${this.filePath}`,
|
|
208
|
-
});
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
catch (err) {
|
|
212
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
213
|
-
logActivity({
|
|
214
|
-
source: "system",
|
|
215
|
-
summary: `DLQ: failed to load from ${this.filePath}: ${msg}`,
|
|
216
|
-
});
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
/** Persist current entries to the file. Debounced to avoid excessive writes. */
|
|
220
|
-
persist() {
|
|
221
|
-
if (!this.filePath)
|
|
222
|
-
return;
|
|
223
|
-
if (this.dirty)
|
|
224
|
-
return; // already scheduled
|
|
225
|
-
this.dirty = true;
|
|
226
|
-
// Debounce: write on next tick to batch rapid mutations
|
|
227
|
-
queueMicrotask(() => {
|
|
228
|
-
this.dirty = false;
|
|
229
|
-
this.writeToFile();
|
|
230
|
-
});
|
|
231
|
-
}
|
|
232
|
-
writeToFile() {
|
|
233
|
-
if (!this.filePath)
|
|
234
|
-
return;
|
|
235
|
-
try {
|
|
236
|
-
const resolved = path.resolve(this.filePath);
|
|
237
|
-
const dir = path.dirname(resolved);
|
|
238
|
-
if (!fs.existsSync(dir)) {
|
|
239
|
-
fs.mkdirSync(dir, { recursive: true });
|
|
240
|
-
}
|
|
241
|
-
// Exclude non-serializable `cause` from errors before writing
|
|
242
|
-
const serializable = this.entries.map((e) => ({
|
|
243
|
-
...e,
|
|
244
|
-
error: { ...e.error, cause: undefined },
|
|
245
|
-
}));
|
|
246
|
-
fs.writeFileSync(resolved, JSON.stringify(serializable, null, 2), "utf-8");
|
|
247
|
-
}
|
|
248
|
-
catch (err) {
|
|
249
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
250
|
-
logActivity({
|
|
251
|
-
source: "system",
|
|
252
|
-
summary: `DLQ: failed to persist to ${this.filePath}: ${msg}`,
|
|
253
|
-
});
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
// ── Retry-wrapped handler factory ────────────────────────────────────────────
|
|
258
|
-
/**
|
|
259
|
-
* Wrap a webhook handler with retry logic.
|
|
260
|
-
* Useful for handlers that call external APIs that may transiently fail.
|
|
261
|
-
*/
|
|
262
|
-
export function withRetryHandler(source, fn, retryOpts) {
|
|
263
|
-
return async (payload, ctx) => {
|
|
264
|
-
return withWebhookRetry(() => fn(payload, ctx), {
|
|
265
|
-
label: source,
|
|
266
|
-
...retryOpts,
|
|
267
|
-
});
|
|
268
|
-
};
|
|
269
|
-
}
|
|
270
|
-
//# sourceMappingURL=retry.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/webhooks/retry.ts"],"names":[],"mappings":"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"}
|
package/dist/webhooks/router.js
DELETED
|
@@ -1,290 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Webhook event routing and dispatching.
|
|
3
|
-
*
|
|
4
|
-
* Provides middleware composition, request validation, deduplication,
|
|
5
|
-
* event-type routing, and high-level request dispatching that ties
|
|
6
|
-
* together the registry, verification, and retry subsystems.
|
|
7
|
-
*/
|
|
8
|
-
import { logActivity } from "../activity/log.js";
|
|
9
|
-
import { getProvider, recordSuccess, recordFailure } from "./registry.js";
|
|
10
|
-
// ── Event envelope ───────────────────────────────────────────────────────────
|
|
11
|
-
/** Create a WebhookEvent envelope from a raw payload. */
|
|
12
|
-
export function createWebhookEvent(source, payload, opts) {
|
|
13
|
-
return {
|
|
14
|
-
source,
|
|
15
|
-
receivedAt: new Date().toISOString(),
|
|
16
|
-
payload,
|
|
17
|
-
eventType: opts?.eventType,
|
|
18
|
-
deliveryId: opts?.deliveryId,
|
|
19
|
-
};
|
|
20
|
-
}
|
|
21
|
-
// ── Core routing ─────────────────────────────────────────────────────────────
|
|
22
|
-
/**
|
|
23
|
-
* Route a webhook event through the registry.
|
|
24
|
-
* Looks up the provider by name, verifies the signature, and processes the payload.
|
|
25
|
-
*/
|
|
26
|
-
export async function routeWebhook(providerName, payload, verifyCtx, processorCtx) {
|
|
27
|
-
const provider = getProvider(providerName);
|
|
28
|
-
if (!provider) {
|
|
29
|
-
return {
|
|
30
|
-
handled: false,
|
|
31
|
-
message: `Unknown webhook provider: ${providerName}`,
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
// Verify signature if context is provided
|
|
35
|
-
if (verifyCtx) {
|
|
36
|
-
const valid = provider.verify(verifyCtx);
|
|
37
|
-
if (!valid) {
|
|
38
|
-
logActivity({
|
|
39
|
-
source: "system",
|
|
40
|
-
summary: `Webhook signature verification failed for ${providerName}`,
|
|
41
|
-
});
|
|
42
|
-
return { handled: false, message: "Invalid webhook signature" };
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
// Process the payload
|
|
46
|
-
try {
|
|
47
|
-
const result = await provider.process(payload, processorCtx);
|
|
48
|
-
if (result.handled) {
|
|
49
|
-
recordSuccess(providerName);
|
|
50
|
-
}
|
|
51
|
-
else {
|
|
52
|
-
recordFailure(providerName, result.message);
|
|
53
|
-
}
|
|
54
|
-
return result;
|
|
55
|
-
}
|
|
56
|
-
catch (err) {
|
|
57
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
58
|
-
recordFailure(providerName, msg);
|
|
59
|
-
logActivity({
|
|
60
|
-
source: "system",
|
|
61
|
-
summary: `Webhook processing error (${providerName}): ${msg}`,
|
|
62
|
-
});
|
|
63
|
-
return { handled: false, message: `Processing error: ${msg}` };
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
// ── Middleware composition ────────────────────────────────────────────────────
|
|
67
|
-
/**
|
|
68
|
-
* Compose multiple middleware functions into a single middleware.
|
|
69
|
-
* Middleware executes in order, each calling next() to continue the chain.
|
|
70
|
-
*/
|
|
71
|
-
export function composeMiddleware(...middlewares) {
|
|
72
|
-
return async (ctx, next) => {
|
|
73
|
-
let index = -1;
|
|
74
|
-
async function dispatch(i) {
|
|
75
|
-
if (i <= index)
|
|
76
|
-
throw new Error("next() called multiple times");
|
|
77
|
-
index = i;
|
|
78
|
-
if (i >= middlewares.length) {
|
|
79
|
-
return next();
|
|
80
|
-
}
|
|
81
|
-
return middlewares[i](ctx, () => dispatch(i + 1));
|
|
82
|
-
}
|
|
83
|
-
return dispatch(0);
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
// ── Request validation middleware ─────────────────────────────────────────────
|
|
87
|
-
/**
|
|
88
|
-
* Middleware that validates basic request properties.
|
|
89
|
-
* Rejects requests with wrong method, missing body, or missing required headers.
|
|
90
|
-
*/
|
|
91
|
-
export function validateRequest(opts) {
|
|
92
|
-
const methods = opts?.allowedMethods ?? ["POST"];
|
|
93
|
-
const required = opts?.requiredHeaders ?? [];
|
|
94
|
-
const minBody = opts?.minBodyLength ?? 1;
|
|
95
|
-
return async (ctx, next) => {
|
|
96
|
-
if (!methods.includes(ctx.method.toUpperCase())) {
|
|
97
|
-
return { handled: false, message: `Method ${ctx.method} not allowed` };
|
|
98
|
-
}
|
|
99
|
-
if (ctx.body.length < minBody) {
|
|
100
|
-
return { handled: false, message: "Empty request body" };
|
|
101
|
-
}
|
|
102
|
-
for (const header of required) {
|
|
103
|
-
if (!ctx.headers[header.toLowerCase()]) {
|
|
104
|
-
return {
|
|
105
|
-
handled: false,
|
|
106
|
-
message: `Missing required header: ${header}`,
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
return next();
|
|
111
|
-
};
|
|
112
|
-
}
|
|
113
|
-
// ── Deduplication middleware ──────────────────────────────────────────────────
|
|
114
|
-
/**
|
|
115
|
-
* Middleware that prevents duplicate webhook deliveries.
|
|
116
|
-
* Tracks delivery IDs extracted from headers and rejects events already seen.
|
|
117
|
-
* Uses a bounded LRU-style map with TTL expiration.
|
|
118
|
-
*/
|
|
119
|
-
export function deduplicateRequests(opts) {
|
|
120
|
-
const maxSize = opts?.maxSize ?? 1000;
|
|
121
|
-
const ttlMs = opts?.ttlMs ?? 300_000;
|
|
122
|
-
const idHeader = opts?.idHeader ?? "x-request-id";
|
|
123
|
-
const seen = new Map(); // deliveryId → timestamp
|
|
124
|
-
return async (ctx, next) => {
|
|
125
|
-
const deliveryId = ctx.headers[idHeader];
|
|
126
|
-
if (!deliveryId) {
|
|
127
|
-
// No delivery ID header — pass through (can't deduplicate)
|
|
128
|
-
return next();
|
|
129
|
-
}
|
|
130
|
-
// Evict expired entries when map grows large
|
|
131
|
-
if (seen.size >= maxSize) {
|
|
132
|
-
const now = Date.now();
|
|
133
|
-
for (const [id, ts] of seen) {
|
|
134
|
-
if (now - ts > ttlMs)
|
|
135
|
-
seen.delete(id);
|
|
136
|
-
}
|
|
137
|
-
// If still too large after eviction, drop oldest quarter
|
|
138
|
-
if (seen.size >= maxSize) {
|
|
139
|
-
const entries = [...seen.entries()];
|
|
140
|
-
const toDrop = Math.floor(maxSize / 4);
|
|
141
|
-
for (let i = 0; i < toDrop && i < entries.length; i++) {
|
|
142
|
-
seen.delete(entries[i][0]);
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
const now = Date.now();
|
|
147
|
-
const existingTs = seen.get(deliveryId);
|
|
148
|
-
if (existingTs !== undefined && now - existingTs < ttlMs) {
|
|
149
|
-
return {
|
|
150
|
-
handled: true,
|
|
151
|
-
message: `Duplicate delivery ignored: ${deliveryId}`,
|
|
152
|
-
};
|
|
153
|
-
}
|
|
154
|
-
seen.set(deliveryId, now);
|
|
155
|
-
return next();
|
|
156
|
-
};
|
|
157
|
-
}
|
|
158
|
-
// ── Rate-limiting middleware ──────────────────────────────────────────────────
|
|
159
|
-
/**
|
|
160
|
-
* Middleware that rate-limits webhook requests per provider.
|
|
161
|
-
* Uses a sliding-window counter.
|
|
162
|
-
*/
|
|
163
|
-
export function rateLimitRequests(opts) {
|
|
164
|
-
const maxReqs = opts?.maxRequests ?? 100;
|
|
165
|
-
const windowMs = opts?.windowMs ?? 60_000;
|
|
166
|
-
const windows = new Map(); // provider → timestamps
|
|
167
|
-
return async (ctx, next) => {
|
|
168
|
-
const now = Date.now();
|
|
169
|
-
const cutoff = now - windowMs;
|
|
170
|
-
let timestamps = windows.get(ctx.provider);
|
|
171
|
-
if (!timestamps) {
|
|
172
|
-
timestamps = [];
|
|
173
|
-
windows.set(ctx.provider, timestamps);
|
|
174
|
-
}
|
|
175
|
-
// Remove expired timestamps
|
|
176
|
-
while (timestamps.length > 0 && timestamps[0] < cutoff) {
|
|
177
|
-
timestamps.shift();
|
|
178
|
-
}
|
|
179
|
-
if (timestamps.length >= maxReqs) {
|
|
180
|
-
return {
|
|
181
|
-
handled: false,
|
|
182
|
-
message: `Rate limit exceeded for ${ctx.provider} (${maxReqs}/${windowMs}ms)`,
|
|
183
|
-
};
|
|
184
|
-
}
|
|
185
|
-
timestamps.push(now);
|
|
186
|
-
return next();
|
|
187
|
-
};
|
|
188
|
-
}
|
|
189
|
-
// ── High-level request routing ───────────────────────────────────────────────
|
|
190
|
-
/**
|
|
191
|
-
* Route an incoming HTTP-like request through the full webhook pipeline:
|
|
192
|
-
* 1. Look up provider
|
|
193
|
-
* 2. Run middleware chain
|
|
194
|
-
* 3. Verify signature
|
|
195
|
-
* 4. Process payload
|
|
196
|
-
*
|
|
197
|
-
* Higher-level alternative to routeWebhook() for HTTP server integrations.
|
|
198
|
-
*/
|
|
199
|
-
export async function routeWebhookRequest(ctx, opts) {
|
|
200
|
-
const provider = getProvider(ctx.provider);
|
|
201
|
-
if (!provider) {
|
|
202
|
-
return {
|
|
203
|
-
handled: false,
|
|
204
|
-
message: `Unknown webhook provider: ${ctx.provider}`,
|
|
205
|
-
};
|
|
206
|
-
}
|
|
207
|
-
const process = async () => {
|
|
208
|
-
// Verify signature if secret provided
|
|
209
|
-
if (opts?.secret) {
|
|
210
|
-
const sigHeader = opts.signatureHeader ?? "x-signature";
|
|
211
|
-
const verifyCtx = {
|
|
212
|
-
rawBody: ctx.body,
|
|
213
|
-
signature: ctx.headers[sigHeader] ?? "",
|
|
214
|
-
secret: opts.secret,
|
|
215
|
-
headers: ctx.headers,
|
|
216
|
-
url: ctx.url,
|
|
217
|
-
};
|
|
218
|
-
const valid = provider.verify(verifyCtx);
|
|
219
|
-
if (!valid) {
|
|
220
|
-
recordFailure(ctx.provider, "Signature verification failed");
|
|
221
|
-
logActivity({
|
|
222
|
-
source: "system",
|
|
223
|
-
summary: `Webhook signature verification failed for ${ctx.provider}`,
|
|
224
|
-
});
|
|
225
|
-
return { handled: false, message: "Invalid webhook signature" };
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
const payload = ctx.parsed ?? ctx.body;
|
|
229
|
-
const result = await provider.process(payload, opts?.processorCtx);
|
|
230
|
-
if (result.handled) {
|
|
231
|
-
recordSuccess(ctx.provider);
|
|
232
|
-
}
|
|
233
|
-
else {
|
|
234
|
-
recordFailure(ctx.provider, result.message);
|
|
235
|
-
}
|
|
236
|
-
return result;
|
|
237
|
-
};
|
|
238
|
-
// Apply middleware if provided
|
|
239
|
-
if (opts?.middleware && opts.middleware.length > 0) {
|
|
240
|
-
const composed = composeMiddleware(...opts.middleware);
|
|
241
|
-
return composed(ctx, process);
|
|
242
|
-
}
|
|
243
|
-
return process();
|
|
244
|
-
}
|
|
245
|
-
// ── Event-type router builder ────────────────────────────────────────────────
|
|
246
|
-
/**
|
|
247
|
-
* Build an event-routing processor from a map of event types to handlers.
|
|
248
|
-
* The typeExtractor pulls the event type string from the payload.
|
|
249
|
-
* Optionally provide a defaultHandler for unmatched event types.
|
|
250
|
-
*/
|
|
251
|
-
export function createEventRouter(opts) {
|
|
252
|
-
const { source, typeExtractor, handlers, defaultHandler } = opts;
|
|
253
|
-
// Import safeHandler inline to avoid circular dep — handlers.ts imports from router.ts
|
|
254
|
-
return async (payload, ctx) => {
|
|
255
|
-
try {
|
|
256
|
-
const eventType = typeExtractor(payload);
|
|
257
|
-
const handler = handlers[eventType];
|
|
258
|
-
if (!handler) {
|
|
259
|
-
if (defaultHandler) {
|
|
260
|
-
return defaultHandler(payload, ctx);
|
|
261
|
-
}
|
|
262
|
-
return {
|
|
263
|
-
handled: false,
|
|
264
|
-
message: `Unhandled ${source} event type: ${eventType}`,
|
|
265
|
-
};
|
|
266
|
-
}
|
|
267
|
-
return handler(payload, ctx);
|
|
268
|
-
}
|
|
269
|
-
catch (err) {
|
|
270
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
271
|
-
logActivity({
|
|
272
|
-
source: "system",
|
|
273
|
-
summary: `Webhook handler error (${source}): ${msg}`,
|
|
274
|
-
});
|
|
275
|
-
return { handled: false, message: `Handler error: ${msg}` };
|
|
276
|
-
}
|
|
277
|
-
};
|
|
278
|
-
}
|
|
279
|
-
// ── Event normalization ──────────────────────────────────────────────────────
|
|
280
|
-
/**
|
|
281
|
-
* Wrap a raw payload into a typed WebhookEvent envelope.
|
|
282
|
-
* Useful for handlers that want a normalized event shape.
|
|
283
|
-
*/
|
|
284
|
-
export function normalizeToEvent(source, payload, opts) {
|
|
285
|
-
return createWebhookEvent(source, payload, {
|
|
286
|
-
eventType: opts?.typeExtractor?.(payload),
|
|
287
|
-
deliveryId: opts?.idExtractor?.(payload),
|
|
288
|
-
});
|
|
289
|
-
}
|
|
290
|
-
//# sourceMappingURL=router.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/webhooks/router.ts"],"names":[],"mappings":"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"}
|