@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,55 +0,0 @@
1
- /**
2
- * Adapter that wraps legacy NotificationChannel (alert-based)
3
- * into the SmartChannel interface (context-based).
4
- *
5
- * This allows existing email, SMS, and webhook channels to work
6
- * with the smart notification engine without rewriting them.
7
- */
8
- /** Map smart priority to alert severity for the legacy interface. */
9
- function priorityToSeverity(priority) {
10
- return priority === "critical" || priority === "high" ? "critical" : "warning";
11
- }
12
- /** Build a minimal Alert from a NotificationContext for legacy channels. */
13
- function contextToAlert(ctx, priority) {
14
- const severity = priorityToSeverity(priority);
15
- return {
16
- id: `smart-${ctx.source}-${Date.now()}`,
17
- thresholdId: ctx.eventType,
18
- checkName: ctx.source,
19
- metric: ctx.eventType,
20
- severity,
21
- state: "firing",
22
- value: 0,
23
- threshold: 0,
24
- message: ctx.payload["message"] ?? `[${ctx.source}] ${ctx.eventType}`,
25
- firedAt: ctx.timestamp,
26
- };
27
- }
28
- /**
29
- * Wraps a legacy NotificationChannel as a SmartChannel.
30
- *
31
- * Usage:
32
- * ```ts
33
- * const legacyEmail = new EmailChannel(config);
34
- * const smartEmail = new LegacyChannelAdapter(legacyEmail, "normal");
35
- * engine.registerChannel(smartEmail);
36
- * ```
37
- */
38
- export class LegacyChannelAdapter {
39
- inner;
40
- name;
41
- get enabled() {
42
- return this.inner.enabled;
43
- }
44
- minPriority;
45
- constructor(inner, minPriority = "normal") {
46
- this.inner = inner;
47
- this.name = inner.name;
48
- this.minPriority = minPriority;
49
- }
50
- async send(ctx, priority) {
51
- const alert = contextToAlert(ctx, priority);
52
- return this.inner.send(alert);
53
- }
54
- }
55
- //# sourceMappingURL=adapter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/notifications/channels/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,qEAAqE;AACrE,SAAS,kBAAkB,CAAC,QAA8B;IACxD,OAAO,QAAQ,KAAK,UAAU,IAAI,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;AACjF,CAAC;AAED,4EAA4E;AAC5E,SAAS,cAAc,CAAC,GAAwB,EAAE,QAA8B;IAC9E,MAAM,QAAQ,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC9C,OAAO;QACL,EAAE,EAAE,SAAS,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE;QACvC,WAAW,EAAE,GAAG,CAAC,SAAS;QAC1B,SAAS,EAAE,GAAG,CAAC,MAAM;QACrB,MAAM,EAAE,GAAG,CAAC,SAAS;QACrB,QAAQ;QACR,KAAK,EAAE,QAAQ;QACf,KAAK,EAAE,CAAC;QACR,SAAS,EAAE,CAAC;QACZ,OAAO,EAAG,GAAG,CAAC,OAAO,CAAC,SAAS,CAAY,IAAI,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,SAAS,EAAE;QACjF,OAAO,EAAE,GAAG,CAAC,SAAS;KACvB,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,OAAO,oBAAoB;IAQrB;IAPD,IAAI,CAAS;IACtB,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;IAC5B,CAAC;IACQ,WAAW,CAAuB;IAE3C,YACU,KAA0B,EAClC,cAAoC,QAAQ;QADpC,UAAK,GAAL,KAAK,CAAqB;QAGlC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QACvB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAwB,EAAE,QAA8B;QACjE,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;CACF"}
@@ -1,6 +0,0 @@
1
- /**
2
- * Smart notification channel exports.
3
- */
4
- export { LegacyChannelAdapter } from "./adapter.js";
5
- export { LogChannel } from "./log.js";
6
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/notifications/channels/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC"}
@@ -1,29 +0,0 @@
1
- /**
2
- * Log channel — writes notifications to the structured logger.
3
- *
4
- * Useful as a default/fallback channel, for development, and for
5
- * maintaining an audit trail of all dispatched notifications.
6
- */
7
- import { createLogger } from "../../utils/logger.js";
8
- const logger = createLogger("notifications.log-channel");
9
- export class LogChannel {
10
- name = "log";
11
- enabled = true;
12
- minPriority;
13
- constructor(minPriority = "low") {
14
- this.minPriority = minPriority;
15
- }
16
- async send(ctx, priority) {
17
- logger.info("notification dispatched", {
18
- priority,
19
- source: ctx.source,
20
- eventType: ctx.eventType,
21
- gear: ctx.gear,
22
- tags: ctx.tags,
23
- actor: ctx.actor,
24
- message: ctx.payload["message"],
25
- });
26
- return true;
27
- }
28
- }
29
- //# sourceMappingURL=log.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"log.js","sourceRoot":"","sources":["../../../src/notifications/channels/log.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAGrD,MAAM,MAAM,GAAG,YAAY,CAAC,2BAA2B,CAAC,CAAC;AAEzD,MAAM,OAAO,UAAU;IACZ,IAAI,GAAG,KAAK,CAAC;IACtB,OAAO,GAAG,IAAI,CAAC;IACN,WAAW,CAAuB;IAE3C,YAAY,cAAoC,KAAK;QACnD,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAwB,EAAE,QAA8B;QACjE,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE;YACrC,QAAQ;YACR,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC;SAChC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
@@ -1,72 +0,0 @@
1
- /**
2
- * Email notification channel.
3
- *
4
- * Sends alert notifications via HTTP POST to an email service endpoint.
5
- * Designed to work with Resend, SendGrid, or any REST-based email API.
6
- */
7
- import { createLogger } from "../utils/logger.js";
8
- const log = createLogger("notifications.email");
9
- export class EmailChannel {
10
- name = "email";
11
- enabled;
12
- config;
13
- constructor(config) {
14
- this.config = config;
15
- this.enabled = config.enabled ?? true;
16
- }
17
- async send(alert) {
18
- const subject = `[${alert.severity.toUpperCase()}] ${alert.message}`;
19
- const body = formatAlertEmail(alert);
20
- log.info("sending email notification", {
21
- alertId: alert.id,
22
- severity: alert.severity,
23
- recipients: this.config.to.length,
24
- subject,
25
- });
26
- try {
27
- const res = await fetch(this.config.endpoint, {
28
- method: "POST",
29
- headers: {
30
- "Content-Type": "application/json",
31
- Authorization: `Bearer ${this.config.apiKey}`,
32
- },
33
- body: JSON.stringify({
34
- from: this.config.from,
35
- to: this.config.to,
36
- subject,
37
- html: body,
38
- }),
39
- });
40
- if (res.ok) {
41
- log.info("email sent successfully", { alertId: alert.id, status: res.status });
42
- }
43
- else {
44
- log.error("email API returned error", { alertId: alert.id, status: res.status, statusText: res.statusText });
45
- }
46
- return res.ok;
47
- }
48
- catch (err) {
49
- log.error("email send failed with exception", { alertId: alert.id, error: String(err) });
50
- return false;
51
- }
52
- }
53
- }
54
- function formatAlertEmail(alert) {
55
- const stateColor = alert.severity === "critical" ? "#dc2626" : "#f59e0b";
56
- return `
57
- <div style="font-family: sans-serif; max-width: 600px; margin: 0 auto;">
58
- <div style="background: ${stateColor}; color: white; padding: 16px; border-radius: 8px 8px 0 0;">
59
- <h2 style="margin: 0;">${alert.severity.toUpperCase()} Alert</h2>
60
- </div>
61
- <div style="border: 1px solid #e5e7eb; border-top: none; padding: 16px; border-radius: 0 0 8px 8px;">
62
- <p><strong>Check:</strong> ${alert.checkName}</p>
63
- <p><strong>Metric:</strong> ${alert.metric}</p>
64
- <p><strong>Value:</strong> ${alert.value} (threshold: ${alert.threshold})</p>
65
- <p><strong>Message:</strong> ${alert.message}</p>
66
- <p><strong>State:</strong> ${alert.state}</p>
67
- <p><strong>Fired at:</strong> ${alert.firedAt}</p>
68
- <p style="color: #6b7280; font-size: 12px;">Alert ID: ${alert.id}</p>
69
- </div>
70
- </div>`.trim();
71
- }
72
- //# sourceMappingURL=email.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"email.js","sourceRoot":"","sources":["../../src/notifications/email.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,GAAG,GAAG,YAAY,CAAC,qBAAqB,CAAC,CAAC;AAehD,MAAM,OAAO,YAAY;IACd,IAAI,GAAG,OAAO,CAAC;IACxB,OAAO,CAAU;IACT,MAAM,CAAqB;IAEnC,YAAY,MAA0B;QACpC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAY;QACrB,MAAM,OAAO,GAAG,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;QACrE,MAAM,IAAI,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAErC,GAAG,CAAC,IAAI,CAAC,4BAA4B,EAAE;YACrC,OAAO,EAAE,KAAK,CAAC,EAAE;YACjB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM;YACjC,OAAO;SACR,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;gBAC5C,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;iBAC9C;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;oBACtB,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE;oBAClB,OAAO;oBACP,IAAI,EAAE,IAAI;iBACX,CAAC;aACH,CAAC,CAAC;YACH,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;gBACX,GAAG,CAAC,IAAI,CAAC,yBAAyB,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;YACjF,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,KAAK,CAAC,0BAA0B,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;YAC/G,CAAC;YACD,OAAO,GAAG,CAAC,EAAE,CAAC;QAChB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,KAAK,CAAC,kCAAkC,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACzF,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF;AAED,SAAS,gBAAgB,CAAC,KAAY;IACpC,MAAM,UAAU,GACd,KAAK,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IACxD,OAAO;;4BAEmB,UAAU;6BACT,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE;;;iCAGxB,KAAK,CAAC,SAAS;kCACd,KAAK,CAAC,MAAM;iCACb,KAAK,CAAC,KAAK,gBAAgB,KAAK,CAAC,SAAS;mCACxC,KAAK,CAAC,OAAO;iCACf,KAAK,CAAC,KAAK;oCACR,KAAK,CAAC,OAAO;4DACW,KAAK,CAAC,EAAE;;OAE7D,CAAC,IAAI,EAAE,CAAC;AACf,CAAC"}
@@ -1,198 +0,0 @@
1
- /**
2
- * Smart notification engine.
3
- *
4
- * Evaluates notification rules against event context,
5
- * resolves priority and channels, and dispatches through
6
- * registered smart channels with cooldown tracking.
7
- */
8
- import { createLogger } from "../utils/logger.js";
9
- import { PRIORITY_ORDER } from "./types.js";
10
- const log = createLogger("notifications.engine");
11
- // ─── Condition evaluation ───────────────────────────────────────────────────
12
- /** Resolve a dot-separated field path from a NotificationContext. */
13
- function resolveField(ctx, field) {
14
- const parts = field.split(".");
15
- let current = ctx;
16
- for (const part of parts) {
17
- if (current == null || typeof current !== "object")
18
- return undefined;
19
- current = current[part];
20
- }
21
- return current;
22
- }
23
- /** Evaluate a single condition against a context. */
24
- export function evaluateCondition(ctx, condition) {
25
- const actual = resolveField(ctx, condition.field);
26
- switch (condition.operator) {
27
- case "eq":
28
- return actual === condition.value;
29
- case "neq":
30
- return actual !== condition.value;
31
- case "in":
32
- return Array.isArray(condition.value) && condition.value.includes(actual);
33
- case "not_in":
34
- return Array.isArray(condition.value) && !condition.value.includes(actual);
35
- case "contains":
36
- return Array.isArray(actual) && actual.includes(condition.value);
37
- case "gt":
38
- return typeof actual === "number" && typeof condition.value === "number" && actual > condition.value;
39
- case "lt":
40
- return typeof actual === "number" && typeof condition.value === "number" && actual < condition.value;
41
- case "exists":
42
- return condition.value ? actual !== undefined : actual === undefined;
43
- default:
44
- return false;
45
- }
46
- }
47
- /** Check if all conditions of a rule match the context. */
48
- export function matchRule(ctx, rule) {
49
- if (!rule.enabled)
50
- return false;
51
- return rule.conditions.every((c) => evaluateCondition(ctx, c));
52
- }
53
- // ─── Priority derivation ────────────────────────────────────────────────────
54
- /** Derive a default priority from context when no rule overrides it. */
55
- export function derivePriority(ctx) {
56
- if (ctx.gear === "crisis")
57
- return "critical";
58
- if (ctx.tags.includes("critical"))
59
- return "critical";
60
- if (ctx.tags.includes("high"))
61
- return "high";
62
- if (ctx.tags.includes("low"))
63
- return "low";
64
- return "normal";
65
- }
66
- // ─── Engine ─────────────────────────────────────────────────────────────────
67
- export class NotificationEngine {
68
- rules = [];
69
- channels = new Map();
70
- /** Tracks last send time per cooldown key (ruleId:source). */
71
- cooldowns = new Map();
72
- /** Add or replace a rule. */
73
- addRule(rule) {
74
- const idx = this.rules.findIndex((r) => r.id === rule.id);
75
- if (idx >= 0) {
76
- this.rules[idx] = rule;
77
- }
78
- else {
79
- this.rules.push(rule);
80
- }
81
- // Keep sorted by weight descending so highest-weight rules evaluate first.
82
- this.rules.sort((a, b) => b.weight - a.weight);
83
- }
84
- /** Remove a rule by id. */
85
- removeRule(id) {
86
- this.rules = this.rules.filter((r) => r.id !== id);
87
- }
88
- /** Get all registered rules. */
89
- getRules() {
90
- return this.rules;
91
- }
92
- /** Register a smart channel. */
93
- registerChannel(channel) {
94
- this.channels.set(channel.name, channel);
95
- }
96
- /** Unregister a channel by name. */
97
- unregisterChannel(name) {
98
- this.channels.delete(name);
99
- }
100
- /** Evaluate all rules against a context and return the result. */
101
- evaluate(ctx) {
102
- const matchedRules = [];
103
- const now = Date.now();
104
- for (const rule of this.rules) {
105
- if (!matchRule(ctx, rule))
106
- continue;
107
- // Cooldown check
108
- if (rule.action.cooldownSeconds) {
109
- const key = `${rule.id}:${ctx.source}`;
110
- const lastSent = this.cooldowns.get(key);
111
- if (lastSent && now - lastSent < rule.action.cooldownSeconds * 1000) {
112
- log.debug("rule skipped by cooldown", { ruleId: rule.id, source: ctx.source });
113
- continue;
114
- }
115
- }
116
- matchedRules.push(rule);
117
- if (rule.terminal)
118
- break;
119
- }
120
- // Resolve priority: highest from matched rules, falling back to context-derived
121
- let priority = derivePriority(ctx);
122
- for (const rule of matchedRules) {
123
- if (rule.action.priority && PRIORITY_ORDER[rule.action.priority] > PRIORITY_ORDER[priority]) {
124
- priority = rule.action.priority;
125
- }
126
- }
127
- // Collect channels from matched rules (deduplicated)
128
- const channelSet = new Set();
129
- for (const rule of matchedRules) {
130
- for (const ch of rule.action.channels) {
131
- channelSet.add(ch);
132
- }
133
- }
134
- const channels = [...channelSet];
135
- return {
136
- context: ctx,
137
- matchedRules,
138
- priority,
139
- channels,
140
- shouldDeliver: matchedRules.length > 0,
141
- };
142
- }
143
- /** Evaluate and dispatch a notification. Returns per-channel success map. */
144
- async dispatch(ctx) {
145
- const result = this.evaluate(ctx);
146
- const outcomes = {};
147
- if (!result.shouldDeliver) {
148
- log.debug("no rules matched, skipping dispatch", { source: ctx.source, eventType: ctx.eventType });
149
- return outcomes;
150
- }
151
- log.info("dispatching notification", {
152
- matchedRules: result.matchedRules.length,
153
- priority: result.priority,
154
- channels: result.channels,
155
- eventType: ctx.eventType,
156
- });
157
- const now = Date.now();
158
- // Update cooldowns for matched rules
159
- for (const rule of result.matchedRules) {
160
- if (rule.action.cooldownSeconds) {
161
- this.cooldowns.set(`${rule.id}:${ctx.source}`, now);
162
- }
163
- }
164
- // Dispatch to each resolved channel
165
- const sends = result.channels.map(async (chName) => {
166
- const channel = this.channels.get(chName);
167
- if (!channel || !channel.enabled) {
168
- log.warn("channel unavailable or disabled", { channel: chName });
169
- outcomes[chName] = false;
170
- return;
171
- }
172
- // Check channel's minimum priority
173
- if (PRIORITY_ORDER[result.priority] < PRIORITY_ORDER[channel.minPriority]) {
174
- log.debug("notification below channel min priority", {
175
- channel: chName,
176
- priority: result.priority,
177
- minPriority: channel.minPriority,
178
- });
179
- outcomes[chName] = false;
180
- return;
181
- }
182
- try {
183
- outcomes[chName] = await channel.send(ctx, result.priority);
184
- }
185
- catch (err) {
186
- log.error("channel send failed", { channel: chName, error: String(err) });
187
- outcomes[chName] = false;
188
- }
189
- });
190
- await Promise.allSettled(sends);
191
- return outcomes;
192
- }
193
- /** Clear all cooldown state (useful for testing). */
194
- clearCooldowns() {
195
- this.cooldowns.clear();
196
- }
197
- }
198
- //# sourceMappingURL=engine.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/notifications/engine.ts"],"names":[],"mappings":"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"}
@@ -1,24 +0,0 @@
1
- /**
2
- * Notification system — legacy alert channels + smart rule-based engine.
3
- *
4
- * Two layers:
5
- * - Legacy: NotificationDispatcher broadcasts Alert objects to channels
6
- * - Smart: NotificationEngine evaluates rules against context, routes to SmartChannels
7
- *
8
- * LegacyChannelAdapter bridges them — existing email/SMS/webhook channels
9
- * work with both layers without rewriting.
10
- */
11
- // ─── Legacy alert-based dispatch ─────────────────────────────────────────────
12
- export { NotificationDispatcher } from "./channel.js";
13
- // ─── Concrete channels (legacy interface) ────────────────────────────────────
14
- export { EmailChannel } from "./email.js";
15
- export { SmsChannel } from "./sms.js";
16
- export { WebhookChannel } from "./webhook.js";
17
- export { PhoneChannel } from "./phone.js";
18
- // ─── Smart rule-based engine ─────────────────────────────────────────────────
19
- export { NotificationEngine, evaluateCondition, matchRule, derivePriority, } from "./engine.js";
20
- export { PRIORITY_ORDER } from "./types.js";
21
- // ─── Smart channel adapters ──────────────────────────────────────────────────
22
- export { LegacyChannelAdapter } from "./channels/adapter.js";
23
- export { LogChannel } from "./channels/log.js";
24
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/notifications/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,gFAAgF;AAChF,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAGtD,gFAAgF;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG1C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAGtC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAG9C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,gFAAgF;AAChF,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,SAAS,EACT,cAAc,GACf,MAAM,aAAa,CAAC;AAarB,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C,gFAAgF;AAChF,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC"}
@@ -1,48 +0,0 @@
1
- /**
2
- * Phone (voice call) notification channel.
3
- *
4
- * Places a Twilio voice call for critical alerts using the existing
5
- * makeCall() function. Designed for last-resort escalation only.
6
- */
7
- import { getInstanceName } from "../instance.js";
8
- import { makeCall } from "../twilio/call.js";
9
- import { createLogger } from "../utils/logger.js";
10
- const log = createLogger("notifications.phone");
11
- export class PhoneChannel {
12
- name = "phone";
13
- enabled;
14
- constructor(opts) {
15
- this.enabled = opts?.enabled ?? true;
16
- }
17
- async send(alert) {
18
- const message = formatAlertVoice(alert);
19
- log.info("placing critical alert voice call", {
20
- alertId: alert.id,
21
- severity: alert.severity,
22
- checkName: alert.checkName,
23
- });
24
- const result = await makeCall({ message });
25
- if (result.ok) {
26
- log.info("voice call initiated", { alertId: alert.id, sid: result.sid });
27
- }
28
- else {
29
- log.error("voice call failed", { alertId: alert.id, error: result.message });
30
- }
31
- return result.ok;
32
- }
33
- }
34
- function formatAlertVoice(alert) {
35
- // Parse dollar amounts from the detail string for richer speech
36
- const remainingMatch = alert.message.match(/\$(\d+\.?\d*)\s+remaining/);
37
- const remaining = remainingMatch ? remainingMatch[1] : null;
38
- const parts = [
39
- `${getInstanceName()} critical alert.`,
40
- `${alert.checkName.replace(/_/g, " ")} at ${alert.value} percent used.`,
41
- ];
42
- if (remaining) {
43
- parts.push(`Only $${remaining} remaining.`);
44
- }
45
- parts.push(`Please take action immediately.`);
46
- return parts.join(" ");
47
- }
48
- //# sourceMappingURL=phone.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"phone.js","sourceRoot":"","sources":["../../src/notifications/phone.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,GAAG,GAAG,YAAY,CAAC,qBAAqB,CAAC,CAAC;AAEhD,MAAM,OAAO,YAAY;IACd,IAAI,GAAG,OAAO,CAAC;IACxB,OAAO,CAAU;IAEjB,YAAY,IAA4B;QACtC,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,OAAO,IAAI,IAAI,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAY;QACrB,MAAM,OAAO,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAExC,GAAG,CAAC,IAAI,CAAC,mCAAmC,EAAE;YAC5C,OAAO,EAAE,KAAK,CAAC,EAAE;YACjB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,SAAS,EAAE,KAAK,CAAC,SAAS;SAC3B,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QAE3C,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;YACd,GAAG,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;QAC3E,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,KAAK,CAAC,mBAAmB,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/E,CAAC;QAED,OAAO,MAAM,CAAC,EAAE,CAAC;IACnB,CAAC;CACF;AAED,SAAS,gBAAgB,CAAC,KAAY;IACpC,gEAAgE;IAChE,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;IACxE,MAAM,SAAS,GAAG,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAE5D,MAAM,KAAK,GAAG;QACZ,GAAG,eAAe,EAAE,kBAAkB;QACtC,GAAG,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,KAAK,CAAC,KAAK,gBAAgB;KACxE,CAAC;IAEF,IAAI,SAAS,EAAE,CAAC;QACd,KAAK,CAAC,IAAI,CAAC,SAAS,SAAS,aAAa,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IAE9C,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC"}
@@ -1,65 +0,0 @@
1
- /**
2
- * SMS notification channel.
3
- *
4
- * Sends alert notifications via Twilio SMS API.
5
- */
6
- import { getInstanceName } from "../instance.js";
7
- import { createLogger } from "../utils/logger.js";
8
- const log = createLogger("notifications.sms");
9
- export class SmsChannel {
10
- name = "sms";
11
- enabled;
12
- config;
13
- constructor(config) {
14
- this.config = config;
15
- this.enabled = config.enabled ?? true;
16
- }
17
- async send(alert) {
18
- const message = formatAlertSms(alert);
19
- const url = `https://api.twilio.com/2010-04-01/Accounts/${this.config.accountSid}/Messages.json`;
20
- const auth = Buffer.from(`${this.config.accountSid}:${this.config.authToken}`).toString("base64");
21
- log.info("sending SMS notification", {
22
- alertId: alert.id,
23
- severity: alert.severity,
24
- recipientCount: this.config.to.length,
25
- });
26
- const results = await Promise.allSettled(this.config.to.map(async (to) => {
27
- log.debug("sending SMS to recipient", { alertId: alert.id, to });
28
- const body = new URLSearchParams({
29
- From: this.config.from,
30
- To: to,
31
- Body: message,
32
- });
33
- const res = await fetch(url, {
34
- method: "POST",
35
- headers: {
36
- Authorization: `Basic ${auth}`,
37
- "Content-Type": "application/x-www-form-urlencoded",
38
- },
39
- body: body.toString(),
40
- });
41
- if (res.ok) {
42
- log.info("SMS sent successfully", { alertId: alert.id, to });
43
- }
44
- else {
45
- log.error("Twilio SMS API error", { alertId: alert.id, to, status: res.status });
46
- }
47
- return res.ok;
48
- }));
49
- const anySuccess = results.some((r) => r.status === "fulfilled" && r.value === true);
50
- if (!anySuccess) {
51
- log.warn("all SMS sends failed", { alertId: alert.id, recipientCount: this.config.to.length });
52
- }
53
- return anySuccess;
54
- }
55
- }
56
- function formatAlertSms(alert) {
57
- const icon = alert.severity === "critical" ? "🚨" : "⚠️";
58
- return [
59
- `${icon} ${getInstanceName()} ${alert.severity.toUpperCase()}`,
60
- `${alert.checkName}: ${alert.message}`,
61
- `Value: ${alert.value} (limit: ${alert.threshold})`,
62
- `At: ${alert.firedAt}`,
63
- ].join("\n");
64
- }
65
- //# sourceMappingURL=sms.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sms.js","sourceRoot":"","sources":["../../src/notifications/sms.ts"],"names":[],"mappings":"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"}
@@ -1,14 +0,0 @@
1
- /**
2
- * Smart notification system types.
3
- *
4
- * Defines rule-based notification routing with priority,
5
- * context awareness, and channel preferences.
6
- */
7
- /** Priority ordering for comparison. */
8
- export const PRIORITY_ORDER = {
9
- critical: 4,
10
- high: 3,
11
- normal: 2,
12
- low: 1,
13
- };
14
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/notifications/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,wCAAwC;AACxC,MAAM,CAAC,MAAM,cAAc,GAAyC;IAClE,QAAQ,EAAE,CAAC;IACX,IAAI,EAAE,CAAC;IACP,MAAM,EAAE,CAAC;IACT,GAAG,EAAE,CAAC;CACP,CAAC"}
@@ -1,65 +0,0 @@
1
- /**
2
- * Webhook notification channel.
3
- *
4
- * Sends alert notifications as JSON payloads to configurable HTTP endpoints.
5
- * Compatible with Slack incoming webhooks, Discord webhooks, or custom endpoints.
6
- */
7
- export class WebhookChannel {
8
- name = "webhook";
9
- enabled;
10
- config;
11
- constructor(config) {
12
- this.config = config;
13
- this.enabled = config.enabled ?? true;
14
- }
15
- async send(alert) {
16
- const payload = {
17
- event: "alert",
18
- timestamp: new Date().toISOString(),
19
- alert: {
20
- id: alert.id,
21
- checkName: alert.checkName,
22
- metric: alert.metric,
23
- severity: alert.severity,
24
- state: alert.state,
25
- value: alert.value,
26
- threshold: alert.threshold,
27
- message: alert.message,
28
- firedAt: alert.firedAt,
29
- acknowledgedAt: alert.acknowledgedAt,
30
- resolvedAt: alert.resolvedAt,
31
- },
32
- };
33
- const headers = {
34
- "Content-Type": "application/json",
35
- ...this.config.headers,
36
- };
37
- if (this.config.secret) {
38
- const signature = await this.sign(JSON.stringify(payload));
39
- headers["X-Signature-256"] = signature;
40
- }
41
- try {
42
- const controller = new AbortController();
43
- const timeout = setTimeout(() => controller.abort(), this.config.timeoutMs ?? 10_000);
44
- const res = await fetch(this.config.url, {
45
- method: "POST",
46
- headers,
47
- body: JSON.stringify(payload),
48
- signal: controller.signal,
49
- });
50
- clearTimeout(timeout);
51
- return res.ok;
52
- }
53
- catch {
54
- return false;
55
- }
56
- }
57
- async sign(payload) {
58
- const { createHmac } = await import("node:crypto");
59
- return ("sha256=" +
60
- createHmac("sha256", this.config.secret)
61
- .update(payload)
62
- .digest("hex"));
63
- }
64
- }
65
- //# sourceMappingURL=webhook.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../src/notifications/webhook.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAiBH,MAAM,OAAO,cAAc;IAChB,IAAI,GAAG,SAAS,CAAC;IAC1B,OAAO,CAAU;IACT,MAAM,CAAuB;IAErC,YAAY,MAA4B;QACtC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAY;QACrB,MAAM,OAAO,GAAG;YACd,KAAK,EAAE,OAAO;YACd,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,KAAK,EAAE;gBACL,EAAE,EAAE,KAAK,CAAC,EAAE;gBACZ,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,cAAc,EAAE,KAAK,CAAC,cAAc;gBACpC,UAAU,EAAE,KAAK,CAAC,UAAU;aAC7B;SACF,CAAC;QAEF,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;YAClC,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO;SACvB,CAAC;QAEF,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACvB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;YAC3D,OAAO,CAAC,iBAAiB,CAAC,GAAG,SAAS,CAAC;QACzC,CAAC;QAED,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;YACzC,MAAM,OAAO,GAAG,UAAU,CACxB,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EACxB,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,MAAM,CAChC,CAAC;YAEF,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE;gBACvC,MAAM,EAAE,MAAM;gBACd,OAAO;gBACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;gBAC7B,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;YAEH,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,OAAO,GAAG,CAAC,EAAE,CAAC;QAChB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,IAAI,CAAC,OAAe;QAChC,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QACnD,OAAO,CACL,SAAS;YACT,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,MAAO,CAAC;iBACtC,MAAM,CAAC,OAAO,CAAC;iBACf,MAAM,CAAC,KAAK,CAAC,CACjB,CAAC;IACJ,CAAC;CACF"}