@mattral/notifier 1.2.0 → 1.2.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.
@@ -0,0 +1,14 @@
1
+ import type { Notifier, NotificationPayload } from "./notifier.js";
2
+ /**
3
+ * Fans a single alert out to multiple notifiers (e.g. both a generic
4
+ * webhook and Slack), isolating failures between them: one notifier
5
+ * throwing doesn't stop the others from being attempted. Aggregates any
6
+ * failures into a single thrown error so the caller still knows something
7
+ * went wrong, without needing to inspect settled-promise results itself.
8
+ */
9
+ export declare class CompositeNotifier implements Notifier {
10
+ private readonly notifiers;
11
+ constructor(notifiers: readonly Notifier[]);
12
+ notify(payload: NotificationPayload): Promise<void>;
13
+ }
14
+ //# sourceMappingURL=composite-notifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composite-notifier.d.ts","sourceRoot":"","sources":["../src/composite-notifier.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEnE;;;;;;GAMG;AACH,qBAAa,iBAAkB,YAAW,QAAQ;IAChD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAsB;gBAEpC,SAAS,EAAE,SAAS,QAAQ,EAAE;IAIpC,MAAM,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;CAQ1D"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Fans a single alert out to multiple notifiers (e.g. both a generic
3
+ * webhook and Slack), isolating failures between them: one notifier
4
+ * throwing doesn't stop the others from being attempted. Aggregates any
5
+ * failures into a single thrown error so the caller still knows something
6
+ * went wrong, without needing to inspect settled-promise results itself.
7
+ */
8
+ export class CompositeNotifier {
9
+ notifiers;
10
+ constructor(notifiers) {
11
+ this.notifiers = notifiers;
12
+ }
13
+ async notify(payload) {
14
+ const results = await Promise.allSettled(this.notifiers.map((n) => n.notify(payload)));
15
+ const failures = results.filter((r) => r.status === "rejected");
16
+ if (failures.length > 0) {
17
+ const messages = failures.map((f) => (f.reason instanceof Error ? f.reason.message : String(f.reason)));
18
+ throw new Error(`${failures.length}/${this.notifiers.length} notifier(s) failed: ${messages.join("; ")}`);
19
+ }
20
+ }
21
+ }
22
+ //# sourceMappingURL=composite-notifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composite-notifier.js","sourceRoot":"","sources":["../src/composite-notifier.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,OAAO,iBAAiB;IACX,SAAS,CAAsB;IAEhD,YAAY,SAA8B;QACxC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAA4B;QACvC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACvF,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAA8B,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC;QAC5F,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACxG,MAAM,IAAI,KAAK,CAAC,GAAG,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,wBAAwB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5G,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,13 @@
1
+ import type { Notifier } from "./notifier.js";
2
+ export interface NotifierOptions {
3
+ webhookUrl?: string;
4
+ slackWebhookUrl?: string;
5
+ }
6
+ /**
7
+ * Builds the right `Notifier` (or a `CompositeNotifier` combining both)
8
+ * from CLI-style options. Returns `null` when neither is configured, so
9
+ * callers can skip the notify step entirely rather than holding onto a
10
+ * notifier that does nothing.
11
+ */
12
+ export declare function createNotifier(options: NotifierOptions): Notifier | null;
13
+ //# sourceMappingURL=create-notifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-notifier.d.ts","sourceRoot":"","sources":["../src/create-notifier.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAK9C,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,eAAe,GAAG,QAAQ,GAAG,IAAI,CAQxE"}
@@ -0,0 +1,22 @@
1
+ import { WebhookNotifier } from "./webhook-notifier.js";
2
+ import { SlackNotifier } from "./slack-notifier.js";
3
+ import { CompositeNotifier } from "./composite-notifier.js";
4
+ /**
5
+ * Builds the right `Notifier` (or a `CompositeNotifier` combining both)
6
+ * from CLI-style options. Returns `null` when neither is configured, so
7
+ * callers can skip the notify step entirely rather than holding onto a
8
+ * notifier that does nothing.
9
+ */
10
+ export function createNotifier(options) {
11
+ const notifiers = [];
12
+ if (options.webhookUrl)
13
+ notifiers.push(new WebhookNotifier({ url: options.webhookUrl }));
14
+ if (options.slackWebhookUrl)
15
+ notifiers.push(new SlackNotifier({ webhookUrl: options.slackWebhookUrl }));
16
+ if (notifiers.length === 0)
17
+ return null;
18
+ if (notifiers.length === 1)
19
+ return notifiers[0];
20
+ return new CompositeNotifier(notifiers);
21
+ }
22
+ //# sourceMappingURL=create-notifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-notifier.js","sourceRoot":"","sources":["../src/create-notifier.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAO5D;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,OAAwB;IACrD,MAAM,SAAS,GAAe,EAAE,CAAC;IACjC,IAAI,OAAO,CAAC,UAAU;QAAE,SAAS,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IACzF,IAAI,OAAO,CAAC,eAAe;QAAE,SAAS,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;IAExG,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACxC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC,CAAC,CAAa,CAAC;IAC5D,OAAO,IAAI,iBAAiB,CAAC,SAAS,CAAC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,6 @@
1
+ export * from "./notifier.js";
2
+ export * from "./webhook-notifier.js";
3
+ export * from "./slack-notifier.js";
4
+ export * from "./composite-notifier.js";
5
+ export * from "./create-notifier.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ export * from "./notifier.js";
2
+ export * from "./webhook-notifier.js";
3
+ export * from "./slack-notifier.js";
4
+ export * from "./composite-notifier.js";
5
+ export * from "./create-notifier.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { Alert, Server } from "@mattral/core";
2
+ export interface NotificationPayload {
3
+ alert: Alert;
4
+ /** Only ever used for its id/name here — see WebhookNotifier/SlackNotifier, which never forward the full Server (transport config may carry secrets in env/headers). */
5
+ server: Server;
6
+ }
7
+ /** Something that can deliver a single alert notification. Implementations should throw on delivery failure rather than swallow it — see CompositeNotifier for how multiple notifiers' failures get isolated from each other. */
8
+ export interface Notifier {
9
+ notify(payload: NotificationPayload): Promise<void>;
10
+ }
11
+ //# sourceMappingURL=notifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifier.d.ts","sourceRoot":"","sources":["../src/notifier.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,KAAK,CAAC;IACb,wKAAwK;IACxK,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,iOAAiO;AACjO,MAAM,WAAW,QAAQ;IACvB,MAAM,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACrD"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=notifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifier.js","sourceRoot":"","sources":["../src/notifier.ts"],"names":[],"mappings":""}
@@ -0,0 +1,20 @@
1
+ import type { Notifier, NotificationPayload } from "./notifier.js";
2
+ export interface SlackNotifierOptions {
3
+ webhookUrl: string;
4
+ /** Injectable for testing; defaults to the global fetch. */
5
+ fetchImpl?: typeof fetch;
6
+ }
7
+ /**
8
+ * Formats an alert as a Slack incoming-webhook message
9
+ * (https://api.slack.com/messaging/webhooks — a plain `{text}` POST, no
10
+ * Slack app/bot token required). Only sends the server's name, for the
11
+ * same reason `WebhookNotifier` only sends `{id, name}` — see its
12
+ * docstring.
13
+ */
14
+ export declare class SlackNotifier implements Notifier {
15
+ private readonly webhookUrl;
16
+ private readonly fetchImpl;
17
+ constructor(options: SlackNotifierOptions);
18
+ notify({ alert, server }: NotificationPayload): Promise<void>;
19
+ }
20
+ //# sourceMappingURL=slack-notifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack-notifier.d.ts","sourceRoot":"","sources":["../src/slack-notifier.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEnE,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,4DAA4D;IAC5D,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAQD;;;;;;GAMG;AACH,qBAAa,aAAc,YAAW,QAAQ;IAC5C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;gBAE7B,OAAO,EAAE,oBAAoB;IAKnC,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;CAcpE"}
@@ -0,0 +1,34 @@
1
+ const SEVERITY_EMOJI = {
2
+ info: "ℹ️",
3
+ warning: "⚠️",
4
+ critical: "🔴"
5
+ };
6
+ /**
7
+ * Formats an alert as a Slack incoming-webhook message
8
+ * (https://api.slack.com/messaging/webhooks — a plain `{text}` POST, no
9
+ * Slack app/bot token required). Only sends the server's name, for the
10
+ * same reason `WebhookNotifier` only sends `{id, name}` — see its
11
+ * docstring.
12
+ */
13
+ export class SlackNotifier {
14
+ webhookUrl;
15
+ fetchImpl;
16
+ constructor(options) {
17
+ this.webhookUrl = options.webhookUrl;
18
+ this.fetchImpl = options.fetchImpl ?? fetch;
19
+ }
20
+ async notify({ alert, server }) {
21
+ const emoji = SEVERITY_EMOJI[alert.severity];
22
+ const status = alert.resolvedAt ? "resolved" : "triggered";
23
+ const text = `${emoji} *${server.name}* — ${alert.message} _(${alert.kind}, ${status})_`;
24
+ const response = await this.fetchImpl(this.webhookUrl, {
25
+ method: "POST",
26
+ headers: { "Content-Type": "application/json" },
27
+ body: JSON.stringify({ text })
28
+ });
29
+ if (!response.ok) {
30
+ throw new Error(`Slack webhook POST failed: ${response.status} ${response.statusText}`);
31
+ }
32
+ }
33
+ }
34
+ //# sourceMappingURL=slack-notifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack-notifier.js","sourceRoot":"","sources":["../src/slack-notifier.ts"],"names":[],"mappings":"AASA,MAAM,cAAc,GAAkC;IACpD,IAAI,EAAE,IAAI;IACV,OAAO,EAAE,IAAI;IACb,QAAQ,EAAE,IAAI;CACf,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,OAAO,aAAa;IACP,UAAU,CAAS;IACnB,SAAS,CAAe;IAEzC,YAAY,OAA6B;QACvC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QACrC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,EAAuB;QACjD,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC;QAC3D,MAAM,IAAI,GAAG,GAAG,KAAK,KAAK,MAAM,CAAC,IAAI,OAAO,KAAK,CAAC,OAAO,MAAM,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC;QAEzF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE;YACrD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC;SAC/B,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,8BAA8B,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QAC1F,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,24 @@
1
+ import type { Notifier, NotificationPayload } from "./notifier.js";
2
+ export interface WebhookNotifierOptions {
3
+ url: string;
4
+ /** Extra headers, e.g. an auth token for a private receiver. */
5
+ headers?: Record<string, string>;
6
+ /** Injectable for testing; defaults to the global fetch. */
7
+ fetchImpl?: typeof fetch;
8
+ }
9
+ /**
10
+ * Sends a generic JSON POST for every alert — the escape hatch for any
11
+ * receiver that isn't Slack specifically (PagerDuty, a custom internal
12
+ * endpoint, etc). Only ever sends `{id, name}` for the server, never the
13
+ * full `Server` object — its `transport` may carry secrets in `env` or
14
+ * `headers`, and a webhook receiver is a third party by definition. See
15
+ * docs/decisions/0010-alerting-notifier-design.md.
16
+ */
17
+ export declare class WebhookNotifier implements Notifier {
18
+ private readonly url;
19
+ private readonly fetchImpl;
20
+ private readonly headers;
21
+ constructor(options: WebhookNotifierOptions);
22
+ notify({ alert, server }: NotificationPayload): Promise<void>;
23
+ }
24
+ //# sourceMappingURL=webhook-notifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook-notifier.d.ts","sourceRoot":"","sources":["../src/webhook-notifier.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEnE,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,gEAAgE;IAChE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,4DAA4D;IAC5D,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAED;;;;;;;GAOG;AACH,qBAAa,eAAgB,YAAW,QAAQ;IAC9C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;IACzC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;gBAErC,OAAO,EAAE,sBAAsB;IAMrC,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;CAcpE"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Sends a generic JSON POST for every alert — the escape hatch for any
3
+ * receiver that isn't Slack specifically (PagerDuty, a custom internal
4
+ * endpoint, etc). Only ever sends `{id, name}` for the server, never the
5
+ * full `Server` object — its `transport` may carry secrets in `env` or
6
+ * `headers`, and a webhook receiver is a third party by definition. See
7
+ * docs/decisions/0010-alerting-notifier-design.md.
8
+ */
9
+ export class WebhookNotifier {
10
+ url;
11
+ fetchImpl;
12
+ headers;
13
+ constructor(options) {
14
+ this.url = options.url;
15
+ this.fetchImpl = options.fetchImpl ?? fetch;
16
+ this.headers = options.headers ?? {};
17
+ }
18
+ async notify({ alert, server }) {
19
+ const response = await this.fetchImpl(this.url, {
20
+ method: "POST",
21
+ headers: { "Content-Type": "application/json", ...this.headers },
22
+ body: JSON.stringify({
23
+ event: "mcp-reliable.alert",
24
+ alert,
25
+ server: { id: server.id, name: server.name }
26
+ })
27
+ });
28
+ if (!response.ok) {
29
+ throw new Error(`Webhook POST to ${this.url} failed: ${response.status} ${response.statusText}`);
30
+ }
31
+ }
32
+ }
33
+ //# sourceMappingURL=webhook-notifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook-notifier.js","sourceRoot":"","sources":["../src/webhook-notifier.ts"],"names":[],"mappings":"AAUA;;;;;;;GAOG;AACH,MAAM,OAAO,eAAe;IACT,GAAG,CAAS;IACZ,SAAS,CAAe;IACxB,OAAO,CAAyB;IAEjD,YAAY,OAA+B;QACzC,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC;QAC5C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,EAAuB;QACjD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE;YAC9C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE;YAChE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK,EAAE,oBAAoB;gBAC3B,KAAK;gBACL,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE;aAC7C,CAAC;SACH,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,CAAC,GAAG,YAAY,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QACnG,CAAC;IACH,CAAC;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mattral/notifier",
3
- "version": "1.2.0",
3
+ "version": "1.2.1",
4
4
  "description": "Webhook and Slack delivery for mcp-reliable alerts",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -40,10 +40,11 @@
40
40
  },
41
41
  "scripts": {
42
42
  "build": "tsc -b",
43
- "clean": "rimraf dist *.tsbuildinfo"
43
+ "clean": "rimraf dist *.tsbuildinfo",
44
+ "prepublishOnly": "npm run build"
44
45
  },
45
46
  "dependencies": {
46
- "@mattral/core": "^1.0.0"
47
+ "@mattral/core": "^1.2.1"
47
48
  },
48
49
  "devDependencies": {
49
50
  "rimraf": "^6.0.1",