@runcore-sh/runcore 0.4.0 → 0.5.0

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 +168 -20
  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,231 +0,0 @@
1
- /**
2
- * Common webhook handler patterns.
3
- * Provides safe-execution wrappers, logging, provider factory helpers,
4
- * and reusable building blocks for processing webhook events.
5
- */
6
- import * as crypto from "node:crypto";
7
- import { logActivity } from "../activity/log.js";
8
- import { registerProvider } from "./registry.js";
9
- import { hmacSha256Hex, hmacSha256Base64, hmacSha1Base64, timingSafeCompare, isTimestampFresh, } from "./verify.js";
10
- import { createWebhookEvent } from "./router.js";
11
- // ── Safe execution wrapper ───────────────────────────────────────────────────
12
- /**
13
- * Wrap a webhook handler so it never throws.
14
- * Catches errors and returns a structured WebhookResult instead.
15
- */
16
- export function safeHandler(source, fn) {
17
- return async (payload, ctx) => {
18
- try {
19
- return await fn(payload, ctx);
20
- }
21
- catch (err) {
22
- const msg = err instanceof Error ? err.message : String(err);
23
- logActivity({
24
- source: "system",
25
- summary: `Webhook handler error (${source}): ${msg}`,
26
- });
27
- return { handled: false, message: `Handler error: ${msg}` };
28
- }
29
- };
30
- }
31
- // ── Event router builder (re-exported from router.ts) ────────────────────────
32
- export { createEventRouter } from "./router.js";
33
- // ── Provider factory helpers ─────────────────────────────────────────────────
34
- /**
35
- * Create a provider that uses HMAC-SHA256 hex signature verification (without registering).
36
- * Used by services like Linear and GitHub.
37
- * Call registerProvider/registerProviders separately to complete registration.
38
- */
39
- export function createHmacSha256HexProvider(opts) {
40
- return {
41
- name: opts.name,
42
- verify(ctx) {
43
- const sig = opts.stripPrefix
44
- ? ctx.signature.replace(/^sha256=/, "")
45
- : ctx.signature;
46
- const expected = hmacSha256Hex(ctx.rawBody, ctx.secret);
47
- return timingSafeCompare(sig, expected);
48
- },
49
- process: opts.process,
50
- };
51
- }
52
- /**
53
- * Create and register a provider that uses HMAC-SHA256 hex signature verification.
54
- * Used by services like Linear and GitHub.
55
- * @deprecated Use createHmacSha256HexProvider + registerProviders for batch registration.
56
- */
57
- export function registerHmacSha256HexProvider(opts) {
58
- const provider = createHmacSha256HexProvider(opts);
59
- registerProvider(provider);
60
- return provider;
61
- }
62
- /**
63
- * Create a provider that uses HMAC-SHA256 base64 signature verification (without registering).
64
- */
65
- export function createHmacSha256Base64Provider(opts) {
66
- return {
67
- name: opts.name,
68
- verify(ctx) {
69
- const sig = opts.stripPrefix
70
- ? ctx.signature.replace(/^sha256=/, "")
71
- : ctx.signature;
72
- const expected = hmacSha256Base64(ctx.rawBody, ctx.secret);
73
- return timingSafeCompare(sig, expected);
74
- },
75
- process: opts.process,
76
- };
77
- }
78
- /**
79
- * Create and register a provider that uses HMAC-SHA256 base64 signature verification.
80
- * @deprecated Use createHmacSha256Base64Provider + registerProviders for batch registration.
81
- */
82
- export function registerHmacSha256Base64Provider(opts) {
83
- const provider = createHmacSha256Base64Provider(opts);
84
- registerProvider(provider);
85
- return provider;
86
- }
87
- /**
88
- * Create a provider that uses Slack's v0 signature scheme (without registering).
89
- * v0={HMAC-SHA256 of "v0:{timestamp}:{body}"} with timestamp freshness check.
90
- */
91
- export function createSlackStyleProvider(opts) {
92
- return {
93
- name: opts.name,
94
- verify(ctx) {
95
- const timestamp = ctx.headers?.["timestamp"] ?? "";
96
- const ts = parseInt(timestamp, 10);
97
- if (!isTimestampFresh(ts, opts.maxAgeSeconds ?? 300))
98
- return false;
99
- const baseString = `v0:${timestamp}:${ctx.rawBody}`;
100
- const computed = `v0=${hmacSha256Hex(baseString, ctx.secret)}`;
101
- return timingSafeCompare(ctx.signature, computed);
102
- },
103
- process: opts.process,
104
- };
105
- }
106
- /**
107
- * Create and register a provider that uses Slack's v0 signature scheme.
108
- * @deprecated Use createSlackStyleProvider + registerProviders for batch registration.
109
- */
110
- export function registerSlackStyleProvider(opts) {
111
- const provider = createSlackStyleProvider(opts);
112
- registerProvider(provider);
113
- return provider;
114
- }
115
- /**
116
- * Create a provider that uses Twilio's signature scheme (without registering).
117
- * HMAC-SHA1 of URL + sorted POST params, base64 encoded.
118
- */
119
- export function createTwilioStyleProvider(opts) {
120
- return {
121
- name: opts.name,
122
- verify(ctx) {
123
- if (!ctx.url || !ctx.params)
124
- return false;
125
- const sortedKeys = Object.keys(ctx.params).sort();
126
- let data = ctx.url;
127
- for (const key of sortedKeys) {
128
- data += key + ctx.params[key];
129
- }
130
- const expected = hmacSha1Base64(data, ctx.secret);
131
- return timingSafeCompare(ctx.signature, expected);
132
- },
133
- process: opts.process,
134
- };
135
- }
136
- /**
137
- * Create and register a provider that uses Twilio's signature scheme.
138
- * @deprecated Use createTwilioStyleProvider + registerProviders for batch registration.
139
- */
140
- export function registerTwilioStyleProvider(opts) {
141
- const provider = createTwilioStyleProvider(opts);
142
- registerProvider(provider);
143
- return provider;
144
- }
145
- /**
146
- * Create a provider that uses Svix-style signature verification (without registering).
147
- * Used by Resend and other Svix-powered webhook services.
148
- * HMAC-SHA256 of "{svix-id}.{svix-timestamp}.{rawBody}" with base64-decoded secret.
149
- */
150
- export function createSvixStyleProvider(opts) {
151
- return {
152
- name: opts.name,
153
- verify(ctx) {
154
- const svixId = ctx.headers?.["svix-id"] ?? "";
155
- const svixTimestamp = ctx.headers?.["svix-timestamp"] ?? "";
156
- const svixSignature = ctx.signature; // svix-signature header value
157
- if (!svixId || !svixTimestamp || !svixSignature)
158
- return false;
159
- // Check timestamp freshness
160
- const ts = parseInt(svixTimestamp, 10);
161
- if (!isTimestampFresh(ts, opts.maxAgeSeconds ?? 300))
162
- return false;
163
- // Decode secret: strip "whsec_" prefix if present, then base64-decode
164
- let secretKey;
165
- try {
166
- const rawSecret = ctx.secret.startsWith("whsec_")
167
- ? ctx.secret.slice(6)
168
- : ctx.secret;
169
- secretKey = Buffer.from(rawSecret, "base64");
170
- }
171
- catch {
172
- return false;
173
- }
174
- // Compute expected signature
175
- const signPayload = `${svixId}.${svixTimestamp}.${ctx.rawBody}`;
176
- const computed = crypto
177
- .createHmac("sha256", secretKey)
178
- .update(signPayload)
179
- .digest("base64");
180
- // Compare against each space-separated signature group ("v1,<base64>")
181
- const sigGroups = svixSignature.split(" ");
182
- for (const group of sigGroups) {
183
- const commaIdx = group.indexOf(",");
184
- if (commaIdx === -1)
185
- continue;
186
- const version = group.slice(0, commaIdx);
187
- const candidate = group.slice(commaIdx + 1);
188
- if (version === "v1" && timingSafeCompare(candidate, computed)) {
189
- return true;
190
- }
191
- }
192
- return false;
193
- },
194
- process: opts.process,
195
- };
196
- }
197
- // ── Re-export from retry.ts for backward compatibility ───────────────────────
198
- export { withRetryHandler } from "./retry.js";
199
- // ── Logging helper ───────────────────────────────────────────────────────────
200
- /**
201
- * Log a webhook event and delegate to a handler.
202
- * Adds structured logging before and after processing.
203
- */
204
- export function withLogging(source, fn) {
205
- return async (payload, ctx) => {
206
- logActivity({
207
- source: "system",
208
- summary: `Webhook received: ${source}`,
209
- });
210
- const result = await fn(payload, ctx);
211
- if (!result.handled) {
212
- logActivity({
213
- source: "system",
214
- summary: `Webhook not handled (${source}): ${result.message}`,
215
- });
216
- }
217
- return result;
218
- };
219
- }
220
- // ── Event normalization ──────────────────────────────────────────────────────
221
- /**
222
- * Wrap a raw payload into a typed WebhookEvent envelope.
223
- * Useful for handlers that want a normalized event shape.
224
- */
225
- export function normalizeToEvent(source, payload, opts) {
226
- return createWebhookEvent(source, payload, {
227
- eventType: opts?.typeExtractor?.(payload),
228
- deliveryId: opts?.idExtractor?.(payload),
229
- });
230
- }
231
- //# sourceMappingURL=handlers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../src/webhooks/handlers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAQjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAMjD,gFAAgF;AAEhF;;;GAGG;AACH,MAAM,UAAU,WAAW,CACzB,MAAc,EACd,EAG2B;IAK3B,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE;QAC5B,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAChC,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,0BAA0B,MAAM,MAAM,GAAG,EAAE;aACrD,CAAC,CAAC;YACH,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,kBAAkB,GAAG,EAAE,EAAE,CAAC;QAC9D,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,gFAAgF;AAEhF,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,gFAAgF;AAEhF;;;;GAIG;AACH,MAAM,UAAU,2BAA2B,CAAC,IAQ3C;IACC,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,MAAM,CAAC,GAAkB;YACvB,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW;gBAC1B,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;gBACvC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC;YAClB,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;YACxD,OAAO,iBAAiB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,EAAE,IAAI,CAAC,OAAO;KACtB,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,6BAA6B,CAAC,IAO7C;IACC,MAAM,QAAQ,GAAG,2BAA2B,CAAC,IAAI,CAAC,CAAC;IACnD,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC3B,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,8BAA8B,CAAC,IAO9C;IACC,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,MAAM,CAAC,GAAkB;YACvB,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW;gBAC1B,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;gBACvC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC;YAClB,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;YAC3D,OAAO,iBAAiB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,EAAE,IAAI,CAAC,OAAO;KACtB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gCAAgC,CAAC,IAOhD;IACC,MAAM,QAAQ,GAAG,8BAA8B,CAAC,IAAI,CAAC,CAAC;IACtD,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC3B,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAC,IAOxC;IACC,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,MAAM,CAAC,GAAkB;YACvB,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;YACnD,MAAM,EAAE,GAAG,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YACnC,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,IAAI,CAAC,aAAa,IAAI,GAAG,CAAC;gBAAE,OAAO,KAAK,CAAC;YAEnE,MAAM,UAAU,GAAG,MAAM,SAAS,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YACpD,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAC/D,OAAO,iBAAiB,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QACpD,CAAC;QACD,OAAO,EAAE,IAAI,CAAC,OAAO;KACtB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CAAC,IAO1C;IACC,MAAM,QAAQ,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAC;IAChD,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC3B,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,IAMzC;IACC,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,MAAM,CAAC,GAAkB;YACvB,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM;gBAAE,OAAO,KAAK,CAAC;YAE1C,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;YAClD,IAAI,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC;YACnB,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;gBAC7B,IAAI,IAAI,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAChC,CAAC;YACD,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;YAClD,OAAO,iBAAiB,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QACpD,CAAC;QACD,OAAO,EAAE,IAAI,CAAC,OAAO;KACtB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,2BAA2B,CAAC,IAM3C;IACC,MAAM,QAAQ,GAAG,yBAAyB,CAAC,IAAI,CAAC,CAAC;IACjD,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC3B,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAOvC;IACC,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,MAAM,CAAC,GAAkB;YACvB,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;YAC9C,MAAM,aAAa,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;YAC5D,MAAM,aAAa,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,8BAA8B;YAEnE,IAAI,CAAC,MAAM,IAAI,CAAC,aAAa,IAAI,CAAC,aAAa;gBAAE,OAAO,KAAK,CAAC;YAE9D,4BAA4B;YAC5B,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;YACvC,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,IAAI,CAAC,aAAa,IAAI,GAAG,CAAC;gBAAE,OAAO,KAAK,CAAC;YAEnE,sEAAsE;YACtE,IAAI,SAAiB,CAAC;YACtB,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC;oBAC/C,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;oBACrB,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;gBACf,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAC/C,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,KAAK,CAAC;YACf,CAAC;YAED,6BAA6B;YAC7B,MAAM,WAAW,GAAG,GAAG,MAAM,IAAI,aAAa,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAChE,MAAM,QAAQ,GAAG,MAAM;iBACpB,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC;iBAC/B,MAAM,CAAC,WAAW,CAAC;iBACnB,MAAM,CAAC,QAAQ,CAAC,CAAC;YAEpB,uEAAuE;YACvE,MAAM,SAAS,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC3C,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;gBAC9B,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBACpC,IAAI,QAAQ,KAAK,CAAC,CAAC;oBAAE,SAAS;gBAC9B,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;gBACzC,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;gBAC5C,IAAI,OAAO,KAAK,IAAI,IAAI,iBAAiB,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,CAAC;oBAC/D,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;YAED,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,EAAE,IAAI,CAAC,OAAO;KACtB,CAAC;AACJ,CAAC;AAED,gFAAgF;AAEhF,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9C,gFAAgF;AAEhF;;;GAGG;AACH,MAAM,UAAU,WAAW,CACzB,MAAc,EACd,EAG2B;IAK3B,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE;QAC5B,WAAW,CAAC;YACV,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE,qBAAqB,MAAM,EAAE;SACvC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAEtC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,WAAW,CAAC;gBACV,MAAM,EAAE,QAAQ;gBAChB,OAAO,EAAE,wBAAwB,MAAM,MAAM,MAAM,CAAC,OAAO,EAAE;aAC9D,CAAC,CAAC;QACL,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC;AAED,gFAAgF;AAEhF;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC9B,MAAc,EACd,OAAU,EACV,IAGC;IAED,OAAO,kBAAkB,CAAC,MAAM,EAAE,OAAO,EAAE;QACzC,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,OAAO,CAAC;QACzC,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,OAAO,CAAC;KACzC,CAAC,CAAC;AACL,CAAC"}
@@ -1,33 +0,0 @@
1
- /**
2
- * Webhook system — generic registry, handlers, and provider integrations.
3
- *
4
- * Usage:
5
- * import { routeWebhook, listProviders } from "./webhooks/index.js";
6
- *
7
- * Providers export objects for deferred batch registration via registerProviders():
8
- * import { githubProvider } from "../github/webhooks.js";
9
- * import { slackEventsProvider, ... } from "../slack/webhooks.js";
10
- * import { twilioProvider } from "./twilio.js";
11
- * registerProviders([githubProvider, ...slackProviders, twilioProvider]);
12
- */
13
- // ── Registry ─────────────────────────────────────────────────────────────────
14
- export { registerProvider, registerProviders, getProvider, listProviders, removeProvider, recordSuccess, recordFailure, getProviderStats, getAllProviderStats, resetProviderStats, getProviderHealth, getAllProviderHealth, } from "./registry.js";
15
- // ── Signature verification ───────────────────────────────────────────────────
16
- export { hmacSha256Hex, hmacSha256Base64, hmacSha1Base64, timingSafeCompare, isTimestampFresh, verifyHmacSha256Hex, verifyHmacSha256Base64, verifySlackV0, verifySvix, verifyTwilio, } from "./verify.js";
17
- // ── Routing & dispatching ────────────────────────────────────────────────────
18
- export { routeWebhook, routeWebhookRequest, composeMiddleware, validateRequest, deduplicateRequests, rateLimitRequests, createWebhookEvent, createEventRouter, normalizeToEvent, } from "./router.js";
19
- // ── Retry & error handling ───────────────────────────────────────────────────
20
- export { withWebhookRetry, classifyError, createWebhookError, DeadLetterQueue, withRetryHandler, } from "./retry.js";
21
- // ── Configuration management ─────────────────────────────────────────────────
22
- export { getConfig, setConfig, getProviderConfig, setProviderConfig, setProviderConfigs, removeProviderConfig, listConfiguredProviders, resolveSecret, getProviderSecret, getProviderRetryOpts, isProviderEnabled, validateProviderConfig, validateConfig, loadConfigFromFile, saveConfigToFile, } from "./config.js";
23
- // ── Handler utilities ────────────────────────────────────────────────────────
24
- export { safeHandler, createHmacSha256HexProvider, createHmacSha256Base64Provider, createSlackStyleProvider, createTwilioStyleProvider, createSvixStyleProvider, registerHmacSha256HexProvider, registerHmacSha256Base64Provider, registerSlackStyleProvider, registerTwilioStyleProvider, withLogging, } from "./handlers.js";
25
- // ── Base class ──────────────────────────────────────────────────────────────
26
- export { WebhookHandler } from "./handler.js";
27
- // ── Route mounting & admin ──────────────────────────────────────────────────
28
- export { mountWebhookAdmin, createWebhookRoute, verifyWebhookRequest, processVerifiedWebhook, getDeadLetterQueue, } from "./mount.js";
29
- // ── Relay verification ──────────────────────────────────────────────────────
30
- export { verifyRelaySignature } from "./relay.js";
31
- // ── Event log (debugging) ────────────────────────────────────────────────────
32
- export { logWebhookEvent, startEventTimer, getRecentEvents, getEventLogSummary, clearEventLog, setEventLogMaxSize, getEventLogMaxSize, } from "./event-log.js";
33
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/webhooks/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAsBH,gFAAgF;AAEhF,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,WAAW,EACX,aAAa,EACb,cAAc,EACd,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,eAAe,CAAC;AAEvB,gFAAgF;AAEhF,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,EACtB,aAAa,EACb,UAAU,EACV,YAAY,GACb,MAAM,aAAa,CAAC;AAErB,gFAAgF;AAEhF,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,aAAa,CAAC;AAErB,gFAAgF;AAEhF,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,gBAAgB,GACjB,MAAM,YAAY,CAAC;AAIpB,gFAAgF;AAEhF,OAAO,EACL,SAAS,EACT,SAAS,EACT,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,uBAAuB,EACvB,aAAa,EACb,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,EACjB,sBAAsB,EACtB,cAAc,EACd,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,aAAa,CAAC;AAErB,gFAAgF;AAEhF,OAAO,EACL,WAAW,EACX,2BAA2B,EAC3B,8BAA8B,EAC9B,wBAAwB,EACxB,yBAAyB,EACzB,uBAAuB,EACvB,6BAA6B,EAC7B,gCAAgC,EAChC,0BAA0B,EAC1B,2BAA2B,EAC3B,WAAW,GACZ,MAAM,eAAe,CAAC;AAEvB,+EAA+E;AAE/E,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAG9C,+EAA+E;AAE/E,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,YAAY,CAAC;AAIpB,+EAA+E;AAE/E,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAGlD,gFAAgF;AAEhF,OAAO,EACL,eAAe,EACf,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,aAAa,EACb,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,gBAAgB,CAAC"}