@runcore-sh/runcore 0.4.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dictionary.json +2 -2
- package/dist/activity/log.js +2 -2
- package/dist/activity/log.js.map +1 -1
- package/dist/agents/governed-spawn.d.ts.map +1 -1
- package/dist/cli.js +101 -11
- package/dist/cli.js.map +1 -1
- package/dist/extensions/cache.d.ts +57 -0
- package/dist/extensions/cache.d.ts.map +1 -0
- package/dist/extensions/cache.js +173 -0
- package/dist/extensions/cache.js.map +1 -0
- package/dist/extensions/client.d.ts +55 -0
- package/dist/extensions/client.d.ts.map +1 -0
- package/dist/extensions/client.js +120 -0
- package/dist/extensions/client.js.map +1 -0
- package/dist/extensions/index.d.ts +13 -0
- package/dist/extensions/index.d.ts.map +1 -0
- package/dist/extensions/index.js +12 -0
- package/dist/extensions/index.js.map +1 -0
- package/dist/extensions/loader.d.ts +50 -0
- package/dist/extensions/loader.d.ts.map +1 -0
- package/dist/extensions/loader.js +166 -0
- package/dist/extensions/loader.js.map +1 -0
- package/dist/extensions/manifest.d.ts +38 -0
- package/dist/extensions/manifest.d.ts.map +1 -0
- package/dist/extensions/manifest.js +17 -0
- package/dist/extensions/manifest.js.map +1 -0
- package/dist/extensions/stubs.d.ts +27 -0
- package/dist/extensions/stubs.d.ts.map +1 -0
- package/dist/extensions/stubs.js +45 -0
- package/dist/extensions/stubs.js.map +1 -0
- package/dist/lib/audit.js +2 -2
- package/dist/lib/audit.js.map +1 -1
- package/dist/lib/brain-migrate.d.ts +21 -0
- package/dist/lib/brain-migrate.d.ts.map +1 -0
- package/dist/lib/brain-migrate.js +137 -0
- package/dist/lib/brain-migrate.js.map +1 -0
- package/dist/lib/paths.d.ts +27 -0
- package/dist/lib/paths.d.ts.map +1 -1
- package/dist/lib/paths.js +65 -0
- package/dist/lib/paths.js.map +1 -1
- package/dist/llm/call-log.d.ts +40 -0
- package/dist/llm/call-log.d.ts.map +1 -0
- package/dist/llm/call-log.js +35 -0
- package/dist/llm/call-log.js.map +1 -0
- package/dist/llm/complete.d.ts +6 -0
- package/dist/llm/complete.d.ts.map +1 -1
- package/dist/llm/complete.js +27 -0
- package/dist/llm/complete.js.map +1 -1
- package/dist/mcp-server.js +118 -2
- package/dist/mcp-server.js.map +1 -1
- package/dist/memory/file-backed.d.ts +4 -0
- package/dist/memory/file-backed.d.ts.map +1 -1
- package/dist/memory/file-backed.js +4 -0
- package/dist/memory/file-backed.js.map +1 -1
- package/dist/memory/vector-index.d.ts +4 -12
- package/dist/memory/vector-index.d.ts.map +1 -1
- package/dist/memory/vector-index.js +11 -93
- package/dist/memory/vector-index.js.map +1 -1
- package/dist/search/brain-docs.d.ts +17 -7
- package/dist/search/brain-docs.d.ts.map +1 -1
- package/dist/search/brain-docs.js +170 -52
- package/dist/search/brain-docs.js.map +1 -1
- package/dist/search/brain-rag.d.ts +45 -0
- package/dist/search/brain-rag.d.ts.map +1 -0
- package/dist/search/brain-rag.js +275 -0
- package/dist/search/brain-rag.js.map +1 -0
- package/dist/search/chunker.d.ts +24 -0
- package/dist/search/chunker.d.ts.map +1 -0
- package/dist/search/chunker.js +95 -0
- package/dist/search/chunker.js.map +1 -0
- package/dist/search/embedder.d.ts +16 -0
- package/dist/search/embedder.d.ts.map +1 -0
- package/dist/search/embedder.js +108 -0
- package/dist/search/embedder.js.map +1 -0
- package/dist/search/file-watcher.d.ts +11 -0
- package/dist/search/file-watcher.d.ts.map +1 -0
- package/dist/search/file-watcher.js +86 -0
- package/dist/search/file-watcher.js.map +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +814 -472
- package/dist/server.js.map +1 -1
- package/dist/sessions/store.d.ts +9 -0
- package/dist/sessions/store.d.ts.map +1 -1
- package/dist/sessions/store.js.map +1 -1
- package/dist/settings.d.ts +26 -0
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js +78 -2
- package/dist/settings.js.map +1 -1
- package/dist/tracing/init.d.ts +1 -1
- package/dist/tracing/init.d.ts.map +1 -1
- package/dist/utils/logger.js +2 -2
- package/dist/utils/logger.js.map +1 -1
- package/module-tiers.json +164 -0
- package/package.json +9 -13
- package/public/avatar/cache/1184385ec5522b57.mp4 +0 -0
- package/public/avatar/cache/1f15f6a1ebd7e439.mp4 +0 -0
- package/public/avatar/cache/2c7e47ff0bdeb8d1.mp4 +0 -0
- package/public/avatar/cache/5f308566f7abb8f2.mp4 +0 -0
- package/public/avatar/cache/62f9cfba848d724e.mp4 +0 -0
- package/public/avatar/cache/6d64e657e6bf2aab.mp4 +0 -0
- package/public/avatar/cache/763ad0349e0b6f26.mp4 +0 -0
- package/public/avatar/cache/81a516cfd461b2b9.mp4 +0 -0
- package/public/avatar/cache/9366de15fd6910ca.mp4 +0 -0
- package/public/avatar/cache/ade41a846b283895.mp4 +0 -0
- package/public/avatar/cache/b6066e5c65383eec.mp4 +0 -0
- package/public/avatar/cache/edadb75d37891fc7.mp4 +0 -0
- package/public/avatar/cache/f0ae159640621dd9.mp4 +0 -0
- package/public/avatar/cache/fc2e5419adf29d96.mp4 +0 -0
- package/public/index.html +379 -59
- package/dist/agents/autonomous.js +0 -749
- package/dist/agents/autonomous.js.map +0 -1
- package/dist/agents/commit.js +0 -113
- package/dist/agents/commit.js.map +0 -1
- package/dist/agents/continue.js +0 -158
- package/dist/agents/continue.js.map +0 -1
- package/dist/agents/cooldown.js +0 -397
- package/dist/agents/cooldown.js.map +0 -1
- package/dist/agents/dedup-guard.js +0 -131
- package/dist/agents/dedup-guard.js.map +0 -1
- package/dist/agents/feed.js +0 -176
- package/dist/agents/feed.js.map +0 -1
- package/dist/agents/governance.js +0 -292
- package/dist/agents/governance.js.map +0 -1
- package/dist/agents/governed-spawn.js +0 -192
- package/dist/agents/governed-spawn.js.map +0 -1
- package/dist/agents/heartbeat.js +0 -324
- package/dist/agents/heartbeat.js.map +0 -1
- package/dist/agents/instance-manager.js +0 -850
- package/dist/agents/instance-manager.js.map +0 -1
- package/dist/agents/issue-reporter.js +0 -123
- package/dist/agents/issue-reporter.js.map +0 -1
- package/dist/agents/issues.js +0 -141
- package/dist/agents/issues.js.map +0 -1
- package/dist/agents/locks.js +0 -234
- package/dist/agents/locks.js.map +0 -1
- package/dist/agents/memory.js +0 -93
- package/dist/agents/memory.js.map +0 -1
- package/dist/agents/monitor.js +0 -235
- package/dist/agents/monitor.js.map +0 -1
- package/dist/agents/orchestration.js +0 -715
- package/dist/agents/orchestration.js.map +0 -1
- package/dist/agents/recover.js +0 -166
- package/dist/agents/recover.js.map +0 -1
- package/dist/agents/reflection.js +0 -199
- package/dist/agents/reflection.js.map +0 -1
- package/dist/agents/runtime/bus.js +0 -174
- package/dist/agents/runtime/bus.js.map +0 -1
- package/dist/agents/runtime/config.js +0 -101
- package/dist/agents/runtime/config.js.map +0 -1
- package/dist/agents/runtime/driver.js +0 -214
- package/dist/agents/runtime/driver.js.map +0 -1
- package/dist/agents/runtime/errors.js +0 -40
- package/dist/agents/runtime/errors.js.map +0 -1
- package/dist/agents/runtime/index.js +0 -54
- package/dist/agents/runtime/index.js.map +0 -1
- package/dist/agents/runtime/lifecycle.js +0 -116
- package/dist/agents/runtime/lifecycle.js.map +0 -1
- package/dist/agents/runtime/manager.js +0 -948
- package/dist/agents/runtime/manager.js.map +0 -1
- package/dist/agents/runtime/registry.js +0 -195
- package/dist/agents/runtime/registry.js.map +0 -1
- package/dist/agents/runtime/resources.js +0 -146
- package/dist/agents/runtime/resources.js.map +0 -1
- package/dist/agents/runtime/types.js +0 -24
- package/dist/agents/runtime/types.js.map +0 -1
- package/dist/agents/spawn-policy.js +0 -202
- package/dist/agents/spawn-policy.js.map +0 -1
- package/dist/agents/spawn.js +0 -970
- package/dist/agents/spawn.js.map +0 -1
- package/dist/agents/triage.js +0 -81
- package/dist/agents/triage.js.map +0 -1
- package/dist/agents/workflow.js +0 -543
- package/dist/agents/workflow.js.map +0 -1
- package/dist/avatar/client.js +0 -172
- package/dist/avatar/client.js.map +0 -1
- package/dist/avatar/sidecar.js +0 -125
- package/dist/avatar/sidecar.js.map +0 -1
- package/dist/browser/sessions.js +0 -122
- package/dist/browser/sessions.js.map +0 -1
- package/dist/capabilities/definitions/browser.js +0 -242
- package/dist/capabilities/definitions/browser.js.map +0 -1
- package/dist/channels/whatsapp.js +0 -200
- package/dist/channels/whatsapp.js.map +0 -1
- package/dist/credentials/store.js +0 -189
- package/dist/credentials/store.js.map +0 -1
- package/dist/files/deep-index.js +0 -337
- package/dist/files/deep-index.js.map +0 -1
- package/dist/files/extract.js +0 -33
- package/dist/files/extract.js.map +0 -1
- package/dist/files/gdrive.js +0 -246
- package/dist/files/gdrive.js.map +0 -1
- package/dist/github/client.js +0 -408
- package/dist/github/client.js.map +0 -1
- package/dist/github/commit-analysis.js +0 -276
- package/dist/github/commit-analysis.js.map +0 -1
- package/dist/github/contributor-stats.js +0 -119
- package/dist/github/contributor-stats.js.map +0 -1
- package/dist/github/issue-sla.js +0 -220
- package/dist/github/issue-sla.js.map +0 -1
- package/dist/github/issue-triage.js +0 -286
- package/dist/github/issue-triage.js.map +0 -1
- package/dist/github/pr-readiness.js +0 -197
- package/dist/github/pr-readiness.js.map +0 -1
- package/dist/github/pr-review.js +0 -410
- package/dist/github/pr-review.js.map +0 -1
- package/dist/github/release-notes.js +0 -227
- package/dist/github/release-notes.js.map +0 -1
- package/dist/github/repo-health.js +0 -303
- package/dist/github/repo-health.js.map +0 -1
- package/dist/github/retry.js +0 -117
- package/dist/github/retry.js.map +0 -1
- package/dist/github/types.js +0 -8
- package/dist/github/types.js.map +0 -1
- package/dist/github/webhooks.js +0 -153
- package/dist/github/webhooks.js.map +0 -1
- package/dist/google/auth.js +0 -325
- package/dist/google/auth.js.map +0 -1
- package/dist/google/calendar-timer.js +0 -91
- package/dist/google/calendar-timer.js.map +0 -1
- package/dist/google/calendar.js +0 -270
- package/dist/google/calendar.js.map +0 -1
- package/dist/google/docs.js +0 -309
- package/dist/google/docs.js.map +0 -1
- package/dist/google/gmail-send.js +0 -219
- package/dist/google/gmail-send.js.map +0 -1
- package/dist/google/gmail-timer.js +0 -223
- package/dist/google/gmail-timer.js.map +0 -1
- package/dist/google/gmail.js +0 -470
- package/dist/google/gmail.js.map +0 -1
- package/dist/google/plugin.js +0 -169
- package/dist/google/plugin.js.map +0 -1
- package/dist/google/tasks-timer.js +0 -107
- package/dist/google/tasks-timer.js.map +0 -1
- package/dist/google/tasks.js +0 -331
- package/dist/google/tasks.js.map +0 -1
- package/dist/google/temporal.js +0 -176
- package/dist/google/temporal.js.map +0 -1
- package/dist/integrations/gate.js +0 -100
- package/dist/integrations/gate.js.map +0 -1
- package/dist/integrations/github.js +0 -331
- package/dist/integrations/github.js.map +0 -1
- package/dist/integrations/google-tasks.js +0 -432
- package/dist/integrations/google-tasks.js.map +0 -1
- package/dist/mdns.js +0 -110
- package/dist/mdns.js.map +0 -1
- package/dist/notifications/channel.js +0 -83
- package/dist/notifications/channel.js.map +0 -1
- package/dist/notifications/channels/adapter.js +0 -55
- package/dist/notifications/channels/adapter.js.map +0 -1
- package/dist/notifications/channels/index.js +0 -6
- package/dist/notifications/channels/index.js.map +0 -1
- package/dist/notifications/channels/log.js +0 -29
- package/dist/notifications/channels/log.js.map +0 -1
- package/dist/notifications/email.js +0 -72
- package/dist/notifications/email.js.map +0 -1
- package/dist/notifications/engine.js +0 -198
- package/dist/notifications/engine.js.map +0 -1
- package/dist/notifications/index.js +0 -24
- package/dist/notifications/index.js.map +0 -1
- package/dist/notifications/phone.js +0 -48
- package/dist/notifications/phone.js.map +0 -1
- package/dist/notifications/sms.js +0 -65
- package/dist/notifications/sms.js.map +0 -1
- package/dist/notifications/types.js +0 -14
- package/dist/notifications/types.js.map +0 -1
- package/dist/notifications/webhook.js +0 -65
- package/dist/notifications/webhook.js.map +0 -1
- package/dist/resend/inbox.js +0 -199
- package/dist/resend/inbox.js.map +0 -1
- package/dist/resend/webhooks.js +0 -244
- package/dist/resend/webhooks.js.map +0 -1
- package/dist/search/browse.js +0 -225
- package/dist/search/browse.js.map +0 -1
- package/dist/search/perplexity.js +0 -41
- package/dist/search/perplexity.js.map +0 -1
- package/dist/slack/channels.js +0 -277
- package/dist/slack/channels.js.map +0 -1
- package/dist/slack/client.js +0 -468
- package/dist/slack/client.js.map +0 -1
- package/dist/slack/retry.js +0 -100
- package/dist/slack/retry.js.map +0 -1
- package/dist/slack/types.js +0 -52
- package/dist/slack/types.js.map +0 -1
- package/dist/slack/webhooks.js +0 -285
- package/dist/slack/webhooks.js.map +0 -1
- package/dist/stt/client.js +0 -66
- package/dist/stt/client.js.map +0 -1
- package/dist/stt/sidecar.js +0 -115
- package/dist/stt/sidecar.js.map +0 -1
- package/dist/tracing/bridge.js +0 -70
- package/dist/tracing/bridge.js.map +0 -1
- package/dist/tracing/correlation.js +0 -49
- package/dist/tracing/correlation.js.map +0 -1
- package/dist/tracing/index.js +0 -18
- package/dist/tracing/index.js.map +0 -1
- package/dist/tracing/init.js +0 -81
- package/dist/tracing/init.js.map +0 -1
- package/dist/tracing/instrument.js +0 -145
- package/dist/tracing/instrument.js.map +0 -1
- package/dist/tracing/middleware.js +0 -69
- package/dist/tracing/middleware.js.map +0 -1
- package/dist/tracing/tracer.js +0 -327
- package/dist/tracing/tracer.js.map +0 -1
- package/dist/tts/client.js +0 -48
- package/dist/tts/client.js.map +0 -1
- package/dist/tts/sidecar.js +0 -148
- package/dist/tts/sidecar.js.map +0 -1
- package/dist/twilio/call.js +0 -79
- package/dist/twilio/call.js.map +0 -1
- package/dist/vault/matcher.js +0 -197
- package/dist/vault/matcher.js.map +0 -1
- package/dist/vault/personal.js +0 -163
- package/dist/vault/personal.js.map +0 -1
- package/dist/vault/policy.js +0 -159
- package/dist/vault/policy.js.map +0 -1
- package/dist/vault/store.js +0 -122
- package/dist/vault/store.js.map +0 -1
- package/dist/vault/transfer.js +0 -188
- package/dist/vault/transfer.js.map +0 -1
- package/dist/volumes/index.js +0 -2
- package/dist/volumes/index.js.map +0 -1
- package/dist/volumes/manager.js +0 -462
- package/dist/volumes/manager.js.map +0 -1
- package/dist/volumes/types.js +0 -8
- package/dist/volumes/types.js.map +0 -1
- package/dist/webhooks/config.js +0 -214
- package/dist/webhooks/config.js.map +0 -1
- package/dist/webhooks/event-log.js +0 -132
- package/dist/webhooks/event-log.js.map +0 -1
- package/dist/webhooks/handler.js +0 -103
- package/dist/webhooks/handler.js.map +0 -1
- package/dist/webhooks/handlers.js +0 -231
- package/dist/webhooks/handlers.js.map +0 -1
- package/dist/webhooks/index.js +0 -33
- package/dist/webhooks/index.js.map +0 -1
- package/dist/webhooks/mount.js +0 -400
- package/dist/webhooks/mount.js.map +0 -1
- package/dist/webhooks/registry.js +0 -143
- package/dist/webhooks/registry.js.map +0 -1
- package/dist/webhooks/relay.js +0 -53
- package/dist/webhooks/relay.js.map +0 -1
- package/dist/webhooks/retry.js +0 -270
- package/dist/webhooks/retry.js.map +0 -1
- package/dist/webhooks/router.js +0 -290
- package/dist/webhooks/router.js.map +0 -1
- package/dist/webhooks/twilio.js +0 -129
- package/dist/webhooks/twilio.js.map +0 -1
- package/dist/webhooks/types.js +0 -8
- package/dist/webhooks/types.js.map +0 -1
- package/dist/webhooks/verify.js +0 -154
- package/dist/webhooks/verify.js.map +0 -1
|
@@ -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 +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"}
|