@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,214 +0,0 @@
1
- /**
2
- * Webhook configuration management.
3
- *
4
- * Loads, validates, and resolves webhook provider configurations.
5
- * Secrets can reference environment variables or be provided as literals.
6
- * Configuration can be loaded from a file or constructed programmatically.
7
- */
8
- import * as fs from "node:fs";
9
- import * as path from "node:path";
10
- import { logActivity } from "../activity/log.js";
11
- import { createLogger } from "../utils/logger.js";
12
- import { getProvider, listProviders } from "./registry.js";
13
- const log = createLogger("webhooks.config");
14
- // ── In-memory config store ───────────────────────────────────────────────────
15
- let systemConfig = { providers: {} };
16
- /** Get the current webhook system configuration. */
17
- export function getConfig() {
18
- return systemConfig;
19
- }
20
- /** Replace the entire system configuration. */
21
- export function setConfig(config) {
22
- systemConfig = config;
23
- }
24
- // ── Provider config CRUD ─────────────────────────────────────────────────────
25
- /** Get configuration for a specific provider. */
26
- export function getProviderConfig(name) {
27
- return systemConfig.providers[name];
28
- }
29
- /** Set configuration for a specific provider. Merges with existing config. */
30
- export function setProviderConfig(config) {
31
- const existing = systemConfig.providers[config.name];
32
- systemConfig.providers[config.name] = existing
33
- ? { ...existing, ...config }
34
- : config;
35
- }
36
- /**
37
- * Set multiple provider configs in one call.
38
- * Avoids repeated object spread overhead when configuring all providers at startup.
39
- */
40
- export function setProviderConfigs(configs) {
41
- const start = performance.now();
42
- for (const config of configs) {
43
- setProviderConfig(config);
44
- }
45
- const ms = performance.now() - start;
46
- // Use debug log instead of logActivity to avoid polluting the insight engine
47
- // with routine startup perf data (was causing feedback loop — DASH-70)
48
- if (ms > 5) {
49
- log.debug(`setProviderConfigs took ${ms.toFixed(1)}ms for ${configs.length} providers`);
50
- }
51
- }
52
- /** Remove configuration for a provider. */
53
- export function removeProviderConfig(name) {
54
- if (!(name in systemConfig.providers))
55
- return false;
56
- delete systemConfig.providers[name];
57
- return true;
58
- }
59
- /** List all configured provider names. */
60
- export function listConfiguredProviders() {
61
- return Object.keys(systemConfig.providers);
62
- }
63
- // ── Secret resolution ────────────────────────────────────────────────────────
64
- /**
65
- * Resolve a secret value. If the value looks like an environment variable
66
- * name (all uppercase, underscores, digits), read from process.env.
67
- * Otherwise, treat it as a literal secret.
68
- */
69
- export function resolveSecret(secretRef) {
70
- // Env var pattern: all uppercase letters, digits, underscores
71
- if (/^[A-Z][A-Z0-9_]*$/.test(secretRef)) {
72
- return process.env[secretRef];
73
- }
74
- return secretRef;
75
- }
76
- /**
77
- * Get the resolved secret for a provider.
78
- * Returns undefined if no secret is configured or the env var is not set.
79
- */
80
- export function getProviderSecret(name) {
81
- const config = systemConfig.providers[name];
82
- if (!config?.secret)
83
- return undefined;
84
- return resolveSecret(config.secret);
85
- }
86
- // ── Retry config resolution ──────────────────────────────────────────────────
87
- /**
88
- * Get the effective retry options for a provider.
89
- * Provider-specific config overrides system defaults.
90
- */
91
- export function getProviderRetryOpts(name) {
92
- const defaults = systemConfig.defaults?.retry ?? {};
93
- const providerOpts = systemConfig.providers[name]?.retry ?? {};
94
- return { ...defaults, ...providerOpts };
95
- }
96
- // ── Provider status ──────────────────────────────────────────────────────────
97
- /** Check if a provider is enabled in the configuration. */
98
- export function isProviderEnabled(name) {
99
- const config = systemConfig.providers[name];
100
- if (!config)
101
- return true; // Unconfigured providers default to enabled
102
- return config.enabled !== false;
103
- }
104
- /**
105
- * Validate the configuration for a specific provider.
106
- * Returns a list of issues found.
107
- */
108
- export function validateProviderConfig(name) {
109
- const issues = [];
110
- const config = systemConfig.providers[name];
111
- if (!config) {
112
- issues.push(`No configuration found for provider "${name}"`);
113
- return issues;
114
- }
115
- if (config.secret) {
116
- const resolved = resolveSecret(config.secret);
117
- if (!resolved) {
118
- issues.push(`Secret for "${name}" references env var "${config.secret}" which is not set`);
119
- }
120
- }
121
- if (!getProvider(name)) {
122
- issues.push(`Provider "${name}" is configured but not registered in the registry`);
123
- }
124
- return issues;
125
- }
126
- /**
127
- * Validate the entire system configuration.
128
- * Returns a map of provider name → issues.
129
- */
130
- export function validateConfig() {
131
- const result = {};
132
- for (const name of Object.keys(systemConfig.providers)) {
133
- const issues = validateProviderConfig(name);
134
- if (issues.length > 0) {
135
- result[name] = issues;
136
- }
137
- }
138
- // Check for registered providers missing configuration
139
- for (const name of listProviders()) {
140
- if (!systemConfig.providers[name]) {
141
- result[name] = [
142
- `Provider "${name}" is registered but has no configuration`,
143
- ];
144
- }
145
- }
146
- return result;
147
- }
148
- // ── File-based config loading ────────────────────────────────────────────────
149
- /**
150
- * Load webhook configuration from a JSON file.
151
- * Returns true if the file was loaded successfully.
152
- */
153
- export function loadConfigFromFile(filePath) {
154
- const start = performance.now();
155
- try {
156
- const resolved = path.resolve(filePath);
157
- const readStart = performance.now();
158
- const content = fs.readFileSync(resolved, "utf-8");
159
- const readMs = performance.now() - readStart;
160
- const parseStart = performance.now();
161
- const parsed = JSON.parse(content);
162
- const parseMs = performance.now() - parseStart;
163
- if (!parsed.providers || typeof parsed.providers !== "object") {
164
- logActivity({
165
- source: "system",
166
- summary: `Webhook config file missing "providers" object: ${filePath}`,
167
- });
168
- return false;
169
- }
170
- systemConfig = parsed;
171
- const totalMs = performance.now() - start;
172
- logActivity({
173
- source: "system",
174
- summary: `Loaded webhook config from ${filePath} (${Object.keys(parsed.providers).length} providers, read:${readMs.toFixed(1)}ms, parse:${parseMs.toFixed(1)}ms, total:${totalMs.toFixed(1)}ms)`,
175
- });
176
- return true;
177
- }
178
- catch (err) {
179
- const msg = err instanceof Error ? err.message : String(err);
180
- logActivity({
181
- source: "system",
182
- summary: `Failed to load webhook config from ${filePath}: ${msg}`,
183
- });
184
- return false;
185
- }
186
- }
187
- /**
188
- * Save the current webhook configuration to a JSON file.
189
- * Secrets that reference env vars are saved as-is (the reference, not the resolved value).
190
- */
191
- export function saveConfigToFile(filePath) {
192
- try {
193
- const resolved = path.resolve(filePath);
194
- const dir = path.dirname(resolved);
195
- if (!fs.existsSync(dir)) {
196
- fs.mkdirSync(dir, { recursive: true });
197
- }
198
- fs.writeFileSync(resolved, JSON.stringify(systemConfig, null, 2), "utf-8");
199
- logActivity({
200
- source: "system",
201
- summary: `Saved webhook config to ${filePath}`,
202
- });
203
- return true;
204
- }
205
- catch (err) {
206
- const msg = err instanceof Error ? err.message : String(err);
207
- logActivity({
208
- source: "system",
209
- summary: `Failed to save webhook config to ${filePath}: ${msg}`,
210
- });
211
- return false;
212
- }
213
- }
214
- //# sourceMappingURL=config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/webhooks/config.ts"],"names":[],"mappings":"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"}
@@ -1,132 +0,0 @@
1
- /**
2
- * Webhook event log — ring buffer of recent webhook events for debugging.
3
- *
4
- * Tracks the last N webhook events (successes and failures) with timing data,
5
- * provider info, and error details. Useful for debugging webhook integrations
6
- * without needing to dig through activity logs.
7
- *
8
- * Usage:
9
- * import { logWebhookEvent, getRecentEvents } from "./event-log.js";
10
- * logWebhookEvent({ provider: "slack-events", eventType: "message", ... });
11
- * const recent = getRecentEvents({ provider: "slack-events", limit: 10 });
12
- */
13
- // ── Ring buffer ──────────────────────────────────────────────────────────────
14
- const DEFAULT_MAX_SIZE = 500;
15
- let maxSize = DEFAULT_MAX_SIZE;
16
- let buffer = [];
17
- /** Configure the maximum number of entries to keep. */
18
- export function setEventLogMaxSize(size) {
19
- maxSize = Math.max(10, size);
20
- if (buffer.length > maxSize) {
21
- buffer = buffer.slice(-maxSize);
22
- }
23
- }
24
- /** Get current max size. */
25
- export function getEventLogMaxSize() {
26
- return maxSize;
27
- }
28
- // ── Logging ──────────────────────────────────────────────────────────────────
29
- /**
30
- * Record a webhook event in the log.
31
- * Automatically generates an ID and trims the buffer if over capacity.
32
- */
33
- export function logWebhookEvent(entry) {
34
- const full = {
35
- ...entry,
36
- id: `evt_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,
37
- };
38
- buffer.push(full);
39
- if (buffer.length > maxSize) {
40
- buffer = buffer.slice(-maxSize);
41
- }
42
- return full;
43
- }
44
- /**
45
- * Create a timing wrapper that records start time and returns a function
46
- * to finalize the log entry with duration and result.
47
- *
48
- * Usage:
49
- * const finish = startEventTimer("slack-events", { eventType: "message" });
50
- * // ... process webhook ...
51
- * finish({ success: true, message: "OK" });
52
- */
53
- export function startEventTimer(provider, meta) {
54
- const startTime = performance.now();
55
- const receivedAt = new Date().toISOString();
56
- return (result) => {
57
- const durationMs = Math.round((performance.now() - startTime) * 100) / 100;
58
- return logWebhookEvent({
59
- provider,
60
- eventType: meta?.eventType,
61
- deliveryId: meta?.deliveryId,
62
- signatureValid: meta?.signatureValid,
63
- receivedAt,
64
- durationMs,
65
- ...result,
66
- });
67
- };
68
- }
69
- // ── Querying ─────────────────────────────────────────────────────────────────
70
- /** Get recent webhook events, most recent first. */
71
- export function getRecentEvents(filter) {
72
- let entries = [...buffer];
73
- if (filter?.provider) {
74
- entries = entries.filter((e) => e.provider === filter.provider);
75
- }
76
- if (filter?.success !== undefined) {
77
- entries = entries.filter((e) => e.success === filter.success);
78
- }
79
- if (filter?.since) {
80
- entries = entries.filter((e) => e.receivedAt >= filter.since);
81
- }
82
- // Most recent first
83
- entries.reverse();
84
- const limit = filter?.limit ?? 50;
85
- return entries.slice(0, limit);
86
- }
87
- /** Get a summary of the event log. */
88
- export function getEventLogSummary() {
89
- const byProvider = {};
90
- let totalMs = 0;
91
- for (const entry of buffer) {
92
- totalMs += entry.durationMs;
93
- if (!byProvider[entry.provider]) {
94
- byProvider[entry.provider] = { count: 0, failures: 0, totalMs: 0 };
95
- }
96
- byProvider[entry.provider].count++;
97
- byProvider[entry.provider].totalMs += entry.durationMs;
98
- if (!entry.success) {
99
- byProvider[entry.provider].failures++;
100
- }
101
- }
102
- const successes = buffer.filter((e) => e.success).length;
103
- const providerSummary = {};
104
- for (const [name, stats] of Object.entries(byProvider)) {
105
- providerSummary[name] = {
106
- count: stats.count,
107
- failures: stats.failures,
108
- avgDurationMs: stats.count > 0 ? Math.round((stats.totalMs / stats.count) * 100) / 100 : 0,
109
- };
110
- }
111
- return {
112
- total: buffer.length,
113
- successes,
114
- failures: buffer.length - successes,
115
- avgDurationMs: buffer.length > 0 ? Math.round((totalMs / buffer.length) * 100) / 100 : 0,
116
- byProvider: providerSummary,
117
- oldestEntry: buffer.length > 0 ? buffer[0].receivedAt : null,
118
- newestEntry: buffer.length > 0 ? buffer[buffer.length - 1].receivedAt : null,
119
- };
120
- }
121
- /** Clear the event log. Optionally filter by provider. */
122
- export function clearEventLog(provider) {
123
- if (provider) {
124
- const before = buffer.length;
125
- buffer = buffer.filter((e) => e.provider !== provider);
126
- return before - buffer.length;
127
- }
128
- const count = buffer.length;
129
- buffer = [];
130
- return count;
131
- }
132
- //# sourceMappingURL=event-log.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"event-log.js","sourceRoot":"","sources":["../../src/webhooks/event-log.ts"],"names":[],"mappings":"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"}
@@ -1,103 +0,0 @@
1
- /**
2
- * Abstract WebhookHandler base class.
3
- *
4
- * Provides a class-based API on top of the existing interface-based webhook system.
5
- * Subclasses implement `verify()` and `handle()`, getting automatic registration,
6
- * retry logic, safe error handling, and activity logging for free.
7
- *
8
- * Usage:
9
- * class MyHandler extends WebhookHandler {
10
- * constructor() {
11
- * super({
12
- * name: "my-service",
13
- * signatureHeader: "x-my-signature",
14
- * secretEnvVar: "MY_WEBHOOK_SECRET",
15
- * });
16
- * }
17
- * verify(ctx) { ... }
18
- * protected handle(payload, ctx) { ... }
19
- * }
20
- */
21
- import { logActivity } from "../activity/log.js";
22
- import { registerProvider } from "./registry.js";
23
- import { withWebhookRetry } from "./retry.js";
24
- // ── Base class ───────────────────────────────────────────────────────────────
25
- /**
26
- * Abstract base class for webhook handlers.
27
- * Implements WebhookProvider and auto-registers with the webhook registry.
28
- *
29
- * Subclasses must implement:
30
- * - `verify(ctx)` — Validate the webhook signature
31
- * - `handle(payload, ctx)` — Process the webhook payload
32
- *
33
- * The base class provides:
34
- * - Auto-registration with the webhook registry
35
- * - Safe error wrapping (process() never throws)
36
- * - Optional retry logic with exponential backoff
37
- * - Secret resolution from environment variables
38
- * - Activity logging
39
- */
40
- export class WebhookHandler {
41
- name;
42
- path;
43
- signatureHeader;
44
- timestampHeader;
45
- secretEnvVar;
46
- algorithm;
47
- retryOpts;
48
- constructor(config) {
49
- this.name = config.name;
50
- this.path = config.path ?? `/api/webhooks/${config.name}`;
51
- this.signatureHeader = config.signatureHeader ?? "x-signature";
52
- this.timestampHeader = config.timestampHeader;
53
- this.secretEnvVar = config.secretEnvVar;
54
- this.algorithm = config.algorithm ?? "custom";
55
- this.retryOpts = config.retry ?? {};
56
- if (config.autoRegister !== false) {
57
- registerProvider(this);
58
- }
59
- }
60
- /**
61
- * Process a webhook payload with error handling and optional retry.
62
- * This is the WebhookProvider.process() implementation — callers use this.
63
- * Never throws.
64
- */
65
- async process(payload, ctx) {
66
- try {
67
- const maxAttempts = this.retryOpts.maxAttempts ?? 1;
68
- if (maxAttempts > 1) {
69
- return await withWebhookRetry(() => this.handle(payload, ctx), {
70
- label: this.name,
71
- ...this.retryOpts,
72
- });
73
- }
74
- return await this.handle(payload, ctx);
75
- }
76
- catch (err) {
77
- const msg = err instanceof Error ? err.message : String(err);
78
- logActivity({
79
- source: "system",
80
- summary: `Webhook handler error (${this.name}): ${msg}`,
81
- });
82
- return { handled: false, message: `Handler error: ${msg}` };
83
- }
84
- }
85
- /**
86
- * Resolve the webhook secret from the configured environment variable.
87
- * Returns undefined if no env var is configured or the var is not set.
88
- */
89
- getSecret() {
90
- if (this.secretEnvVar) {
91
- return process.env[this.secretEnvVar];
92
- }
93
- return undefined;
94
- }
95
- /**
96
- * Register this handler with the webhook registry.
97
- * Called automatically on construction unless autoRegister is false.
98
- */
99
- register() {
100
- registerProvider(this);
101
- }
102
- }
103
- //# sourceMappingURL=handler.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/webhooks/handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AA+B9C,gFAAgF;AAEhF;;;;;;;;;;;;;;GAcG;AACH,MAAM,OAAgB,cAAc;IACzB,IAAI,CAAS;IACb,IAAI,CAAS;IACb,eAAe,CAAS;IACxB,eAAe,CAAU;IACzB,YAAY,CAAU;IACtB,SAAS,CAAqB;IAC9B,SAAS,CAAmB;IAErC,YAAY,MAA4B;QACtC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,iBAAiB,MAAM,CAAC,IAAI,EAAE,CAAC;QAC1D,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,IAAI,aAAa,CAAC;QAC/D,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;QAC9C,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;QACxC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,QAAQ,CAAC;QAC9C,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;QAEpC,IAAI,MAAM,CAAC,YAAY,KAAK,KAAK,EAAE,CAAC;YAClC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAiBD;;;;OAIG;IACH,KAAK,CAAC,OAAO,CACX,OAAgB,EAChB,GAA6B;QAE7B,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,IAAI,CAAC,CAAC;YAEpD,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;gBACpB,OAAO,MAAM,gBAAgB,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE;oBAC7D,KAAK,EAAE,IAAI,CAAC,IAAI;oBAChB,GAAG,IAAI,CAAC,SAAS;iBAClB,CAAC,CAAC;YACL,CAAC;YAED,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACzC,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,IAAI,CAAC,IAAI,MAAM,GAAG,EAAE;aACxD,CAAC,CAAC;YACH,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,kBAAkB,GAAG,EAAE,EAAE,CAAC;QAC9D,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,SAAS;QACP,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACxC,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;OAGG;IACH,QAAQ;QACN,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;CACF"}