@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.
Files changed (351) hide show
  1. package/dictionary.json +2 -2
  2. package/dist/activity/log.js +2 -2
  3. package/dist/activity/log.js.map +1 -1
  4. package/dist/agents/governed-spawn.d.ts.map +1 -1
  5. package/dist/cli.js +101 -11
  6. package/dist/cli.js.map +1 -1
  7. package/dist/extensions/cache.d.ts +57 -0
  8. package/dist/extensions/cache.d.ts.map +1 -0
  9. package/dist/extensions/cache.js +173 -0
  10. package/dist/extensions/cache.js.map +1 -0
  11. package/dist/extensions/client.d.ts +55 -0
  12. package/dist/extensions/client.d.ts.map +1 -0
  13. package/dist/extensions/client.js +120 -0
  14. package/dist/extensions/client.js.map +1 -0
  15. package/dist/extensions/index.d.ts +13 -0
  16. package/dist/extensions/index.d.ts.map +1 -0
  17. package/dist/extensions/index.js +12 -0
  18. package/dist/extensions/index.js.map +1 -0
  19. package/dist/extensions/loader.d.ts +50 -0
  20. package/dist/extensions/loader.d.ts.map +1 -0
  21. package/dist/extensions/loader.js +166 -0
  22. package/dist/extensions/loader.js.map +1 -0
  23. package/dist/extensions/manifest.d.ts +38 -0
  24. package/dist/extensions/manifest.d.ts.map +1 -0
  25. package/dist/extensions/manifest.js +17 -0
  26. package/dist/extensions/manifest.js.map +1 -0
  27. package/dist/extensions/stubs.d.ts +27 -0
  28. package/dist/extensions/stubs.d.ts.map +1 -0
  29. package/dist/extensions/stubs.js +45 -0
  30. package/dist/extensions/stubs.js.map +1 -0
  31. package/dist/lib/audit.js +2 -2
  32. package/dist/lib/audit.js.map +1 -1
  33. package/dist/lib/brain-migrate.d.ts +21 -0
  34. package/dist/lib/brain-migrate.d.ts.map +1 -0
  35. package/dist/lib/brain-migrate.js +137 -0
  36. package/dist/lib/brain-migrate.js.map +1 -0
  37. package/dist/lib/paths.d.ts +27 -0
  38. package/dist/lib/paths.d.ts.map +1 -1
  39. package/dist/lib/paths.js +65 -0
  40. package/dist/lib/paths.js.map +1 -1
  41. package/dist/llm/call-log.d.ts +40 -0
  42. package/dist/llm/call-log.d.ts.map +1 -0
  43. package/dist/llm/call-log.js +35 -0
  44. package/dist/llm/call-log.js.map +1 -0
  45. package/dist/llm/complete.d.ts +6 -0
  46. package/dist/llm/complete.d.ts.map +1 -1
  47. package/dist/llm/complete.js +27 -0
  48. package/dist/llm/complete.js.map +1 -1
  49. package/dist/mcp-server.js +118 -2
  50. package/dist/mcp-server.js.map +1 -1
  51. package/dist/memory/file-backed.d.ts +4 -0
  52. package/dist/memory/file-backed.d.ts.map +1 -1
  53. package/dist/memory/file-backed.js +4 -0
  54. package/dist/memory/file-backed.js.map +1 -1
  55. package/dist/memory/vector-index.d.ts +4 -12
  56. package/dist/memory/vector-index.d.ts.map +1 -1
  57. package/dist/memory/vector-index.js +11 -93
  58. package/dist/memory/vector-index.js.map +1 -1
  59. package/dist/search/brain-docs.d.ts +17 -7
  60. package/dist/search/brain-docs.d.ts.map +1 -1
  61. package/dist/search/brain-docs.js +170 -52
  62. package/dist/search/brain-docs.js.map +1 -1
  63. package/dist/search/brain-rag.d.ts +45 -0
  64. package/dist/search/brain-rag.d.ts.map +1 -0
  65. package/dist/search/brain-rag.js +275 -0
  66. package/dist/search/brain-rag.js.map +1 -0
  67. package/dist/search/chunker.d.ts +24 -0
  68. package/dist/search/chunker.d.ts.map +1 -0
  69. package/dist/search/chunker.js +95 -0
  70. package/dist/search/chunker.js.map +1 -0
  71. package/dist/search/embedder.d.ts +16 -0
  72. package/dist/search/embedder.d.ts.map +1 -0
  73. package/dist/search/embedder.js +108 -0
  74. package/dist/search/embedder.js.map +1 -0
  75. package/dist/search/file-watcher.d.ts +11 -0
  76. package/dist/search/file-watcher.d.ts.map +1 -0
  77. package/dist/search/file-watcher.js +86 -0
  78. package/dist/search/file-watcher.js.map +1 -0
  79. package/dist/server.d.ts.map +1 -1
  80. package/dist/server.js +814 -472
  81. package/dist/server.js.map +1 -1
  82. package/dist/sessions/store.d.ts +9 -0
  83. package/dist/sessions/store.d.ts.map +1 -1
  84. package/dist/sessions/store.js.map +1 -1
  85. package/dist/settings.d.ts +26 -0
  86. package/dist/settings.d.ts.map +1 -1
  87. package/dist/settings.js +78 -2
  88. package/dist/settings.js.map +1 -1
  89. package/dist/tracing/init.d.ts +1 -1
  90. package/dist/tracing/init.d.ts.map +1 -1
  91. package/dist/utils/logger.js +2 -2
  92. package/dist/utils/logger.js.map +1 -1
  93. package/module-tiers.json +164 -0
  94. package/package.json +9 -13
  95. package/public/avatar/cache/1184385ec5522b57.mp4 +0 -0
  96. package/public/avatar/cache/1f15f6a1ebd7e439.mp4 +0 -0
  97. package/public/avatar/cache/2c7e47ff0bdeb8d1.mp4 +0 -0
  98. package/public/avatar/cache/5f308566f7abb8f2.mp4 +0 -0
  99. package/public/avatar/cache/62f9cfba848d724e.mp4 +0 -0
  100. package/public/avatar/cache/6d64e657e6bf2aab.mp4 +0 -0
  101. package/public/avatar/cache/763ad0349e0b6f26.mp4 +0 -0
  102. package/public/avatar/cache/81a516cfd461b2b9.mp4 +0 -0
  103. package/public/avatar/cache/9366de15fd6910ca.mp4 +0 -0
  104. package/public/avatar/cache/ade41a846b283895.mp4 +0 -0
  105. package/public/avatar/cache/b6066e5c65383eec.mp4 +0 -0
  106. package/public/avatar/cache/edadb75d37891fc7.mp4 +0 -0
  107. package/public/avatar/cache/f0ae159640621dd9.mp4 +0 -0
  108. package/public/avatar/cache/fc2e5419adf29d96.mp4 +0 -0
  109. package/public/index.html +379 -59
  110. package/dist/agents/autonomous.js +0 -749
  111. package/dist/agents/autonomous.js.map +0 -1
  112. package/dist/agents/commit.js +0 -113
  113. package/dist/agents/commit.js.map +0 -1
  114. package/dist/agents/continue.js +0 -158
  115. package/dist/agents/continue.js.map +0 -1
  116. package/dist/agents/cooldown.js +0 -397
  117. package/dist/agents/cooldown.js.map +0 -1
  118. package/dist/agents/dedup-guard.js +0 -131
  119. package/dist/agents/dedup-guard.js.map +0 -1
  120. package/dist/agents/feed.js +0 -176
  121. package/dist/agents/feed.js.map +0 -1
  122. package/dist/agents/governance.js +0 -292
  123. package/dist/agents/governance.js.map +0 -1
  124. package/dist/agents/governed-spawn.js +0 -192
  125. package/dist/agents/governed-spawn.js.map +0 -1
  126. package/dist/agents/heartbeat.js +0 -324
  127. package/dist/agents/heartbeat.js.map +0 -1
  128. package/dist/agents/instance-manager.js +0 -850
  129. package/dist/agents/instance-manager.js.map +0 -1
  130. package/dist/agents/issue-reporter.js +0 -123
  131. package/dist/agents/issue-reporter.js.map +0 -1
  132. package/dist/agents/issues.js +0 -141
  133. package/dist/agents/issues.js.map +0 -1
  134. package/dist/agents/locks.js +0 -234
  135. package/dist/agents/locks.js.map +0 -1
  136. package/dist/agents/memory.js +0 -93
  137. package/dist/agents/memory.js.map +0 -1
  138. package/dist/agents/monitor.js +0 -235
  139. package/dist/agents/monitor.js.map +0 -1
  140. package/dist/agents/orchestration.js +0 -715
  141. package/dist/agents/orchestration.js.map +0 -1
  142. package/dist/agents/recover.js +0 -166
  143. package/dist/agents/recover.js.map +0 -1
  144. package/dist/agents/reflection.js +0 -199
  145. package/dist/agents/reflection.js.map +0 -1
  146. package/dist/agents/runtime/bus.js +0 -174
  147. package/dist/agents/runtime/bus.js.map +0 -1
  148. package/dist/agents/runtime/config.js +0 -101
  149. package/dist/agents/runtime/config.js.map +0 -1
  150. package/dist/agents/runtime/driver.js +0 -214
  151. package/dist/agents/runtime/driver.js.map +0 -1
  152. package/dist/agents/runtime/errors.js +0 -40
  153. package/dist/agents/runtime/errors.js.map +0 -1
  154. package/dist/agents/runtime/index.js +0 -54
  155. package/dist/agents/runtime/index.js.map +0 -1
  156. package/dist/agents/runtime/lifecycle.js +0 -116
  157. package/dist/agents/runtime/lifecycle.js.map +0 -1
  158. package/dist/agents/runtime/manager.js +0 -948
  159. package/dist/agents/runtime/manager.js.map +0 -1
  160. package/dist/agents/runtime/registry.js +0 -195
  161. package/dist/agents/runtime/registry.js.map +0 -1
  162. package/dist/agents/runtime/resources.js +0 -146
  163. package/dist/agents/runtime/resources.js.map +0 -1
  164. package/dist/agents/runtime/types.js +0 -24
  165. package/dist/agents/runtime/types.js.map +0 -1
  166. package/dist/agents/spawn-policy.js +0 -202
  167. package/dist/agents/spawn-policy.js.map +0 -1
  168. package/dist/agents/spawn.js +0 -970
  169. package/dist/agents/spawn.js.map +0 -1
  170. package/dist/agents/triage.js +0 -81
  171. package/dist/agents/triage.js.map +0 -1
  172. package/dist/agents/workflow.js +0 -543
  173. package/dist/agents/workflow.js.map +0 -1
  174. package/dist/avatar/client.js +0 -172
  175. package/dist/avatar/client.js.map +0 -1
  176. package/dist/avatar/sidecar.js +0 -125
  177. package/dist/avatar/sidecar.js.map +0 -1
  178. package/dist/browser/sessions.js +0 -122
  179. package/dist/browser/sessions.js.map +0 -1
  180. package/dist/capabilities/definitions/browser.js +0 -242
  181. package/dist/capabilities/definitions/browser.js.map +0 -1
  182. package/dist/channels/whatsapp.js +0 -200
  183. package/dist/channels/whatsapp.js.map +0 -1
  184. package/dist/credentials/store.js +0 -189
  185. package/dist/credentials/store.js.map +0 -1
  186. package/dist/files/deep-index.js +0 -337
  187. package/dist/files/deep-index.js.map +0 -1
  188. package/dist/files/extract.js +0 -33
  189. package/dist/files/extract.js.map +0 -1
  190. package/dist/files/gdrive.js +0 -246
  191. package/dist/files/gdrive.js.map +0 -1
  192. package/dist/github/client.js +0 -408
  193. package/dist/github/client.js.map +0 -1
  194. package/dist/github/commit-analysis.js +0 -276
  195. package/dist/github/commit-analysis.js.map +0 -1
  196. package/dist/github/contributor-stats.js +0 -119
  197. package/dist/github/contributor-stats.js.map +0 -1
  198. package/dist/github/issue-sla.js +0 -220
  199. package/dist/github/issue-sla.js.map +0 -1
  200. package/dist/github/issue-triage.js +0 -286
  201. package/dist/github/issue-triage.js.map +0 -1
  202. package/dist/github/pr-readiness.js +0 -197
  203. package/dist/github/pr-readiness.js.map +0 -1
  204. package/dist/github/pr-review.js +0 -410
  205. package/dist/github/pr-review.js.map +0 -1
  206. package/dist/github/release-notes.js +0 -227
  207. package/dist/github/release-notes.js.map +0 -1
  208. package/dist/github/repo-health.js +0 -303
  209. package/dist/github/repo-health.js.map +0 -1
  210. package/dist/github/retry.js +0 -117
  211. package/dist/github/retry.js.map +0 -1
  212. package/dist/github/types.js +0 -8
  213. package/dist/github/types.js.map +0 -1
  214. package/dist/github/webhooks.js +0 -153
  215. package/dist/github/webhooks.js.map +0 -1
  216. package/dist/google/auth.js +0 -325
  217. package/dist/google/auth.js.map +0 -1
  218. package/dist/google/calendar-timer.js +0 -91
  219. package/dist/google/calendar-timer.js.map +0 -1
  220. package/dist/google/calendar.js +0 -270
  221. package/dist/google/calendar.js.map +0 -1
  222. package/dist/google/docs.js +0 -309
  223. package/dist/google/docs.js.map +0 -1
  224. package/dist/google/gmail-send.js +0 -219
  225. package/dist/google/gmail-send.js.map +0 -1
  226. package/dist/google/gmail-timer.js +0 -223
  227. package/dist/google/gmail-timer.js.map +0 -1
  228. package/dist/google/gmail.js +0 -470
  229. package/dist/google/gmail.js.map +0 -1
  230. package/dist/google/plugin.js +0 -169
  231. package/dist/google/plugin.js.map +0 -1
  232. package/dist/google/tasks-timer.js +0 -107
  233. package/dist/google/tasks-timer.js.map +0 -1
  234. package/dist/google/tasks.js +0 -331
  235. package/dist/google/tasks.js.map +0 -1
  236. package/dist/google/temporal.js +0 -176
  237. package/dist/google/temporal.js.map +0 -1
  238. package/dist/integrations/gate.js +0 -100
  239. package/dist/integrations/gate.js.map +0 -1
  240. package/dist/integrations/github.js +0 -331
  241. package/dist/integrations/github.js.map +0 -1
  242. package/dist/integrations/google-tasks.js +0 -432
  243. package/dist/integrations/google-tasks.js.map +0 -1
  244. package/dist/mdns.js +0 -110
  245. package/dist/mdns.js.map +0 -1
  246. package/dist/notifications/channel.js +0 -83
  247. package/dist/notifications/channel.js.map +0 -1
  248. package/dist/notifications/channels/adapter.js +0 -55
  249. package/dist/notifications/channels/adapter.js.map +0 -1
  250. package/dist/notifications/channels/index.js +0 -6
  251. package/dist/notifications/channels/index.js.map +0 -1
  252. package/dist/notifications/channels/log.js +0 -29
  253. package/dist/notifications/channels/log.js.map +0 -1
  254. package/dist/notifications/email.js +0 -72
  255. package/dist/notifications/email.js.map +0 -1
  256. package/dist/notifications/engine.js +0 -198
  257. package/dist/notifications/engine.js.map +0 -1
  258. package/dist/notifications/index.js +0 -24
  259. package/dist/notifications/index.js.map +0 -1
  260. package/dist/notifications/phone.js +0 -48
  261. package/dist/notifications/phone.js.map +0 -1
  262. package/dist/notifications/sms.js +0 -65
  263. package/dist/notifications/sms.js.map +0 -1
  264. package/dist/notifications/types.js +0 -14
  265. package/dist/notifications/types.js.map +0 -1
  266. package/dist/notifications/webhook.js +0 -65
  267. package/dist/notifications/webhook.js.map +0 -1
  268. package/dist/resend/inbox.js +0 -199
  269. package/dist/resend/inbox.js.map +0 -1
  270. package/dist/resend/webhooks.js +0 -244
  271. package/dist/resend/webhooks.js.map +0 -1
  272. package/dist/search/browse.js +0 -225
  273. package/dist/search/browse.js.map +0 -1
  274. package/dist/search/perplexity.js +0 -41
  275. package/dist/search/perplexity.js.map +0 -1
  276. package/dist/slack/channels.js +0 -277
  277. package/dist/slack/channels.js.map +0 -1
  278. package/dist/slack/client.js +0 -468
  279. package/dist/slack/client.js.map +0 -1
  280. package/dist/slack/retry.js +0 -100
  281. package/dist/slack/retry.js.map +0 -1
  282. package/dist/slack/types.js +0 -52
  283. package/dist/slack/types.js.map +0 -1
  284. package/dist/slack/webhooks.js +0 -285
  285. package/dist/slack/webhooks.js.map +0 -1
  286. package/dist/stt/client.js +0 -66
  287. package/dist/stt/client.js.map +0 -1
  288. package/dist/stt/sidecar.js +0 -115
  289. package/dist/stt/sidecar.js.map +0 -1
  290. package/dist/tracing/bridge.js +0 -70
  291. package/dist/tracing/bridge.js.map +0 -1
  292. package/dist/tracing/correlation.js +0 -49
  293. package/dist/tracing/correlation.js.map +0 -1
  294. package/dist/tracing/index.js +0 -18
  295. package/dist/tracing/index.js.map +0 -1
  296. package/dist/tracing/init.js +0 -81
  297. package/dist/tracing/init.js.map +0 -1
  298. package/dist/tracing/instrument.js +0 -145
  299. package/dist/tracing/instrument.js.map +0 -1
  300. package/dist/tracing/middleware.js +0 -69
  301. package/dist/tracing/middleware.js.map +0 -1
  302. package/dist/tracing/tracer.js +0 -327
  303. package/dist/tracing/tracer.js.map +0 -1
  304. package/dist/tts/client.js +0 -48
  305. package/dist/tts/client.js.map +0 -1
  306. package/dist/tts/sidecar.js +0 -148
  307. package/dist/tts/sidecar.js.map +0 -1
  308. package/dist/twilio/call.js +0 -79
  309. package/dist/twilio/call.js.map +0 -1
  310. package/dist/vault/matcher.js +0 -197
  311. package/dist/vault/matcher.js.map +0 -1
  312. package/dist/vault/personal.js +0 -163
  313. package/dist/vault/personal.js.map +0 -1
  314. package/dist/vault/policy.js +0 -159
  315. package/dist/vault/policy.js.map +0 -1
  316. package/dist/vault/store.js +0 -122
  317. package/dist/vault/store.js.map +0 -1
  318. package/dist/vault/transfer.js +0 -188
  319. package/dist/vault/transfer.js.map +0 -1
  320. package/dist/volumes/index.js +0 -2
  321. package/dist/volumes/index.js.map +0 -1
  322. package/dist/volumes/manager.js +0 -462
  323. package/dist/volumes/manager.js.map +0 -1
  324. package/dist/volumes/types.js +0 -8
  325. package/dist/volumes/types.js.map +0 -1
  326. package/dist/webhooks/config.js +0 -214
  327. package/dist/webhooks/config.js.map +0 -1
  328. package/dist/webhooks/event-log.js +0 -132
  329. package/dist/webhooks/event-log.js.map +0 -1
  330. package/dist/webhooks/handler.js +0 -103
  331. package/dist/webhooks/handler.js.map +0 -1
  332. package/dist/webhooks/handlers.js +0 -231
  333. package/dist/webhooks/handlers.js.map +0 -1
  334. package/dist/webhooks/index.js +0 -33
  335. package/dist/webhooks/index.js.map +0 -1
  336. package/dist/webhooks/mount.js +0 -400
  337. package/dist/webhooks/mount.js.map +0 -1
  338. package/dist/webhooks/registry.js +0 -143
  339. package/dist/webhooks/registry.js.map +0 -1
  340. package/dist/webhooks/relay.js +0 -53
  341. package/dist/webhooks/relay.js.map +0 -1
  342. package/dist/webhooks/retry.js +0 -270
  343. package/dist/webhooks/retry.js.map +0 -1
  344. package/dist/webhooks/router.js +0 -290
  345. package/dist/webhooks/router.js.map +0 -1
  346. package/dist/webhooks/twilio.js +0 -129
  347. package/dist/webhooks/twilio.js.map +0 -1
  348. package/dist/webhooks/types.js +0 -8
  349. package/dist/webhooks/types.js.map +0 -1
  350. package/dist/webhooks/verify.js +0 -154
  351. package/dist/webhooks/verify.js.map +0 -1
@@ -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":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD,gFAAgF;AAEhF;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,EAAoB,EACpB,IAA4C;IAE5C,MAAM,WAAW,GAAG,IAAI,EAAE,WAAW,IAAI,CAAC,CAAC;IAC3C,MAAM,SAAS,GAAG,IAAI,EAAE,WAAW,IAAI,GAAG,CAAC;IAC3C,MAAM,QAAQ,GAAG,IAAI,EAAE,UAAU,IAAI,MAAM,CAAC;IAC5C,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,SAAS,CAAC;IACvC,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IACrC,IAAI,SAAkB,CAAC;IACvB,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;QACxD,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QACvC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,EAAE,EAAE,CAAC;YAC1B,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,YAAY,CAAC;YACnD,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;gBAChB,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC;gBAC/C,WAAW,CAAC;oBACV,MAAM,EAAE,QAAQ;oBAChB,OAAO,EAAE,UAAU,KAAK,0BAA0B,OAAO,IAAI,WAAW,cAAc,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;iBAC5L,CAAC,CAAC;YACL,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,SAAS,GAAG,GAAG,CAAC;YAChB,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,YAAY,CAAC;YACnD,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAChE,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;YAEnC,IAAI,OAAO,GAAG,WAAW,EAAE,CAAC;gBAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;gBACjE,MAAM,MAAM,GAAG,KAAK,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC;gBACnD,YAAY,IAAI,MAAM,CAAC;gBACvB,WAAW,CAAC;oBACV,MAAM,EAAE,QAAQ;oBAChB,OAAO,EAAE,GAAG,KAAK,aAAa,OAAO,IAAI,WAAW,YAAY,OAAO,KAAK,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,MAAM,kBAAkB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI;iBACtJ,CAAC,CAAC;gBACH,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;YAC9D,CAAC;iBAAM,CAAC;gBACN,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC;gBAC/C,WAAW,CAAC;oBACV,MAAM,EAAE,QAAQ;oBAChB,OAAO,EAAE,UAAU,KAAK,eAAe,WAAW,qBAAqB,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,OAAO,IAAI,MAAM,EAAE;iBACrM,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,EAAE,WAAW,EAAE,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAC5C,MAAM,SAAS,CAAC;AAClB,CAAC;AAiBD;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,GAAY;IACxC,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QAEtC,cAAc;QACd,IAAI,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YAC9D,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/C,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,mBAAmB;QACnB,IACE,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC;YACvB,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC;YAC1B,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC;YAC5B,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YAC9B,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;YACnB,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC;YAC1B,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;YACnB,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;YACnB,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,EACnB,CAAC;YACD,OAAO,WAAW,CAAC;QACrB,CAAC;IACH,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,GAAY,EACZ,QAAgB,EAChB,OAAgB;IAEhB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjE,OAAO;QACL,IAAI,EAAE,aAAa,CAAC,GAAG,CAAC;QACxB,OAAO;QACP,QAAQ;QACR,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,OAAO;QACP,KAAK,EAAE,GAAG;KACX,CAAC;AACJ,CAAC;AAeD;;;;GAIG;AACH,MAAM,OAAO,eAAe;IAClB,OAAO,GAAsB,EAAE,CAAC;IAChC,OAAO,CAAS;IAChB,QAAQ,CAAgB;IACxB,KAAK,GAAG,KAAK,CAAC;IAEtB;;;;OAIG;IACH,YAAY,OAAO,GAAG,GAAG,EAAE,QAAiB;QAC1C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,QAAQ,IAAI,IAAI,CAAC;QAEjC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,CAAC;IACH,CAAC;IAED,mDAAmD;IACnD,GAAG,CAAC,KAAkD;QACpD,MAAM,OAAO,GAAoB;YAC/B,GAAG,KAAK;YACR,EAAE,EAAE,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;YACjE,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACtC,CAAC;QAEF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAE3B,wCAAwC;QACxC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YACvC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnD,CAAC;QAED,WAAW,CAAC;YACV,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE,gBAAgB,KAAK,CAAC,QAAQ,iBAAiB,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG;SAC/E,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;IAED,wDAAwD;IACxD,IAAI,CAAC,QAAiB;QACpB,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;QAC7D,CAAC;QACD,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAED,oDAAoD;IACpD,MAAM,CAAC,EAAU;QACf,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACvD,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QAC7B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC5B,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IAED,8DAA8D;IAC9D,KAAK,CAAC,QAAiB;QACrB,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YACnC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;YACnE,MAAM,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YAC7C,IAAI,OAAO,GAAG,CAAC;gBAAE,IAAI,CAAC,OAAO,EAAE,CAAC;YAChC,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QAClC,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAClB,IAAI,KAAK,GAAG,CAAC;YAAE,IAAI,CAAC,OAAO,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,sCAAsC;IACtC,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,uEAAuE;IACvE,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC;IAChC,CAAC;IAED,+EAA+E;IAE/E,oFAAoF;IAC5E,YAAY;QAClB,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC3B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC7C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;gBAAE,OAAO;YAErC,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACnD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACnC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC3C,WAAW,CAAC;oBACV,MAAM,EAAE,QAAQ;oBAChB,OAAO,EAAE,eAAe,IAAI,CAAC,OAAO,CAAC,MAAM,iBAAiB,IAAI,CAAC,QAAQ,EAAE;iBAC5E,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,WAAW,CAAC;gBACV,MAAM,EAAE,QAAQ;gBAChB,OAAO,EAAE,4BAA4B,IAAI,CAAC,QAAQ,KAAK,GAAG,EAAE;aAC7D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,gFAAgF;IACxE,OAAO;QACb,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC3B,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO,CAAC,oBAAoB;QAC5C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAElB,wDAAwD;QACxD,cAAc,CAAC,GAAG,EAAE;YAClB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;YACnB,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,WAAW;QACjB,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC3B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACzC,CAAC;YACD,8DAA8D;YAC9D,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC5C,GAAG,CAAC;gBACJ,KAAK,EAAE,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE;aACxC,CAAC,CAAC,CAAC;YACJ,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAC7E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,WAAW,CAAC;gBACV,MAAM,EAAE,QAAQ;gBAChB,OAAO,EAAE,6BAA6B,IAAI,CAAC,QAAQ,KAAK,GAAG,EAAE;aAC9D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CACF;AAED,gFAAgF;AAEhF;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC9B,MAAc,EACd,EAG2B,EAC3B,SAA0D;IAK1D,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE;QAC5B,OAAO,gBAAgB,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE;YAC9C,KAAK,EAAE,MAAM;YACb,GAAG,SAAS;SACb,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
@@ -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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"}