@shield-agent/kya 0.33.6 → 0.34.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.cursor-plugin/plugin.json +1 -1
- package/.mcp.json +1 -1
- package/README.md +22 -5
- package/amp/settings.example.json +1 -1
- package/assets/screenshot-features.json +17 -0
- package/claude/claude_desktop_config.example.json +1 -1
- package/cline/cline_mcp_settings.example.json +1 -1
- package/copilot/mcp-config.example.json +1 -1
- package/dist/alerts/config.d.ts +22 -0
- package/dist/alerts/config.d.ts.map +1 -0
- package/dist/alerts/config.js +59 -0
- package/dist/alerts/config.js.map +1 -0
- package/dist/alerts/constants.d.ts +5 -0
- package/dist/alerts/constants.d.ts.map +1 -0
- package/dist/alerts/constants.js +5 -0
- package/dist/alerts/constants.js.map +1 -0
- package/dist/alerts/desktop.d.ts +19 -0
- package/dist/alerts/desktop.d.ts.map +1 -0
- package/dist/alerts/desktop.js +57 -0
- package/dist/alerts/desktop.js.map +1 -0
- package/dist/alerts/incident-alert.d.ts +42 -0
- package/dist/alerts/incident-alert.d.ts.map +1 -0
- package/dist/alerts/incident-alert.js +84 -0
- package/dist/alerts/incident-alert.js.map +1 -0
- package/dist/alerts/scan.d.ts +37 -0
- package/dist/alerts/scan.d.ts.map +1 -0
- package/dist/alerts/scan.js +188 -0
- package/dist/alerts/scan.js.map +1 -0
- package/dist/alerts/state.d.ts +55 -0
- package/dist/alerts/state.d.ts.map +1 -0
- package/dist/alerts/state.js +178 -0
- package/dist/alerts/state.js.map +1 -0
- package/dist/alerts/triage-input.d.ts +36 -0
- package/dist/alerts/triage-input.d.ts.map +1 -0
- package/dist/alerts/triage-input.js +159 -0
- package/dist/alerts/triage-input.js.map +1 -0
- package/dist/alerts/triage-model.d.ts +42 -0
- package/dist/alerts/triage-model.d.ts.map +1 -0
- package/dist/alerts/triage-model.js +126 -0
- package/dist/alerts/triage-model.js.map +1 -0
- package/dist/alerts/triage-prompt.d.ts +23 -0
- package/dist/alerts/triage-prompt.d.ts.map +1 -0
- package/dist/alerts/triage-prompt.js +53 -0
- package/dist/alerts/triage-prompt.js.map +1 -0
- package/dist/alerts/triage-schema.json +52 -0
- package/dist/alerts/triage-setup.d.ts +73 -0
- package/dist/alerts/triage-setup.d.ts.map +1 -0
- package/dist/alerts/triage-setup.js +280 -0
- package/dist/alerts/triage-setup.js.map +1 -0
- package/dist/alerts/triage-status.d.ts +26 -0
- package/dist/alerts/triage-status.d.ts.map +1 -0
- package/dist/alerts/triage-status.js +61 -0
- package/dist/alerts/triage-status.js.map +1 -0
- package/dist/alerts/triage-tokenizer.d.ts +29 -0
- package/dist/alerts/triage-tokenizer.d.ts.map +1 -0
- package/dist/alerts/triage-tokenizer.js +82 -0
- package/dist/alerts/triage-tokenizer.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +14 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/alerts.d.ts +16 -0
- package/dist/commands/alerts.d.ts.map +1 -0
- package/dist/commands/alerts.js +112 -0
- package/dist/commands/alerts.js.map +1 -0
- package/dist/commands/notify-flush.d.ts.map +1 -1
- package/dist/commands/notify-flush.js +3 -0
- package/dist/commands/notify-flush.js.map +1 -1
- package/dist/commands/receipt-serve.d.ts +1 -1
- package/dist/commands/receipt-serve.d.ts.map +1 -1
- package/dist/commands/receipt-serve.js +3 -2
- package/dist/commands/receipt-serve.js.map +1 -1
- package/dist/investigate/detectors.d.ts +6 -0
- package/dist/investigate/detectors.d.ts.map +1 -1
- package/dist/investigate/detectors.js +10 -0
- package/dist/investigate/detectors.js.map +1 -1
- package/dist/notify/dispatch.d.ts +1 -1
- package/dist/notify/dispatch.d.ts.map +1 -1
- package/dist/notify/dispatch.js +4 -1
- package/dist/notify/dispatch.js.map +1 -1
- package/dist/notify/incident-templates.d.ts +23 -0
- package/dist/notify/incident-templates.d.ts.map +1 -0
- package/dist/notify/incident-templates.js +128 -0
- package/dist/notify/incident-templates.js.map +1 -0
- package/dist/notify/index.d.ts +12 -0
- package/dist/notify/index.d.ts.map +1 -1
- package/dist/notify/index.js +50 -3
- package/dist/notify/index.js.map +1 -1
- package/dist/notify/templates.d.ts +6 -0
- package/dist/notify/templates.d.ts.map +1 -1
- package/dist/notify/templates.js +12 -2
- package/dist/notify/templates.js.map +1 -1
- package/dist/receipt/live-server.d.ts +4 -0
- package/dist/receipt/live-server.d.ts.map +1 -1
- package/dist/receipt/live-server.js +48 -0
- package/dist/receipt/live-server.js.map +1 -1
- package/dist/receipt/render-receipt.d.ts +3 -0
- package/dist/receipt/render-receipt.d.ts.map +1 -1
- package/dist/receipt/render-receipt.js +28 -1
- package/dist/receipt/render-receipt.js.map +1 -1
- package/dist/trail.d.ts +6 -0
- package/dist/trail.d.ts.map +1 -1
- package/dist/trail.js +11 -0
- package/dist/trail.js.map +1 -1
- package/droid/README.md +1 -1
- package/droid/mcp.example.json +1 -1
- package/gemini/settings.example.json +1 -1
- package/grok/README.md +2 -2
- package/kilo/kilo.example.json +1 -1
- package/kimi/mcp.example.json +1 -1
- package/kiro/mcp.example.json +1 -1
- package/manifest.json +1 -1
- package/mastracode/mcp.example.json +1 -1
- package/mcp.json +1 -1
- package/openai/codex.config.example.toml +1 -1
- package/opencode/opencode.example.json +1 -1
- package/package.json +1 -1
- package/qwen/settings.example.json +1 -1
- package/server.json +2 -2
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-receiver payload shapes for the `incident.opened` event (slack / teams / linear / jira / generic).
|
|
3
|
+
* Input is an IncidentAlert (see alerts/incident-alert.ts): already redacted, clipped and free of
|
|
4
|
+
* raw args, hashes, paths, session ids and home folders. Cards carry no buttons: chat is a
|
|
5
|
+
* notify channel, never an approval path.
|
|
6
|
+
*/
|
|
7
|
+
import { ADVISORY_LINE, INCIDENT_EVENT, INCIDENT_KIND } from "../alerts/constants.js";
|
|
8
|
+
import { breakAutolinks, teamsText } from "./templates.js";
|
|
9
|
+
const CONTROL_CHARS = /[\u0000-\u001f\u007f-\u009f\u2028\u2029\u200b-\u200f\u202a-\u202e\u2066-\u2069]/g;
|
|
10
|
+
function slackEntities(value) {
|
|
11
|
+
return value.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Slack mrkdwn escaping (Slack's rule): & < > become entities, so an agent-written string cannot form
|
|
15
|
+
* <!channel>, <!here>, <@user> or <url|text>. Then bare URLs and domains are broken (see breakAutolinks),
|
|
16
|
+
* because Slack auto-links them. Used on every string that an agent can influence.
|
|
17
|
+
*/
|
|
18
|
+
export function slackEscape(value) {
|
|
19
|
+
return slackEntities(breakAutolinks(value.replace(CONTROL_CHARS, " ")));
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Markdown / wiki escaping for Linear and Jira descriptions: control characters become a space, the
|
|
23
|
+
* characters that make links, mentions, images, macros, bold or headings get a backslash, and bare
|
|
24
|
+
* URLs and domains are broken (see breakAutolinks) so they do not auto-link.
|
|
25
|
+
*/
|
|
26
|
+
export function mdEscape(value) {
|
|
27
|
+
return breakAutolinks(value.replace(CONTROL_CHARS, " "))
|
|
28
|
+
.replace(/[\\`*_{}[\]()<>#+!|~&@]/g, "\\$&");
|
|
29
|
+
}
|
|
30
|
+
function facts(a) {
|
|
31
|
+
const out = [
|
|
32
|
+
["severity", a.severity],
|
|
33
|
+
["detectors", a.detectorIds.join(", ") || "-"],
|
|
34
|
+
["findings", String(a.findingCount)],
|
|
35
|
+
];
|
|
36
|
+
if (a.counts)
|
|
37
|
+
out.push(["verdicts", `allow ${a.counts.allow}, hold ${a.counts.hold}, deny ${a.counts.deny}`]);
|
|
38
|
+
if (a.triage) {
|
|
39
|
+
const t = a.triage;
|
|
40
|
+
const pct = (p) => `${Math.round(p * 100)}%`;
|
|
41
|
+
out.push(["triage", `${t.category.id} ${pct(t.category.p)}, urgency ${t.urgency.id}, action ${t.action.id}, harmless ${pct(t.benign)} (local model ${t.model}, advisory)`]);
|
|
42
|
+
}
|
|
43
|
+
if (a.tools.length > 0)
|
|
44
|
+
out.push(["tools", a.tools.join(", ")]);
|
|
45
|
+
if (a.firstTs)
|
|
46
|
+
out.push(["first", a.firstTs, true]);
|
|
47
|
+
if (a.lastTs)
|
|
48
|
+
out.push(["last", a.lastTs, true]);
|
|
49
|
+
return out;
|
|
50
|
+
}
|
|
51
|
+
function descriptionLines(a) {
|
|
52
|
+
const lines = facts(a).map(([k, v, gen]) => `${k}: ${gen ? v : mdEscape(v)}`);
|
|
53
|
+
for (const s of a.summaries)
|
|
54
|
+
lines.push(`summary: ${mdEscape(s)}`);
|
|
55
|
+
if (a.fix)
|
|
56
|
+
lines.push(`fix: ${mdEscape(a.fix)}`);
|
|
57
|
+
lines.push(ADVISORY_LINE);
|
|
58
|
+
return lines;
|
|
59
|
+
}
|
|
60
|
+
export function buildIncidentSlackPayload(a) {
|
|
61
|
+
const blocks = [
|
|
62
|
+
{ type: "header", text: { type: "plain_text", text: a.title.slice(0, 150) } },
|
|
63
|
+
{ type: "section", fields: facts(a).map(([k, v, gen]) => ({ type: "mrkdwn", text: `*${k}*\n${gen ? slackEntities(v) : slackEscape(v)}` })) },
|
|
64
|
+
];
|
|
65
|
+
if (a.summaries.length > 0) {
|
|
66
|
+
blocks.push({ type: "section", text: { type: "mrkdwn", text: a.summaries.map((s) => `- ${slackEscape(s)}`).join("\n") } });
|
|
67
|
+
}
|
|
68
|
+
if (a.fix)
|
|
69
|
+
blocks.push({ type: "section", text: { type: "mrkdwn", text: `*fix*\n${slackEscape(a.fix)}` } });
|
|
70
|
+
blocks.push({ type: "context", elements: [{ type: "mrkdwn", text: ADVISORY_LINE }] });
|
|
71
|
+
return { text: slackEscape(`${a.title} (${a.severity})`), blocks };
|
|
72
|
+
}
|
|
73
|
+
export function buildIncidentTeamsPayload(a) {
|
|
74
|
+
const body = [
|
|
75
|
+
{ type: "TextBlock", text: teamsText(a.title), weight: "Bolder", size: "Medium", wrap: true },
|
|
76
|
+
{ type: "FactSet", facts: facts(a).map(([title, value]) => ({ title, value: teamsText(value) })) },
|
|
77
|
+
];
|
|
78
|
+
for (const s of a.summaries)
|
|
79
|
+
body.push({ type: "TextBlock", text: teamsText(s), wrap: true });
|
|
80
|
+
if (a.fix)
|
|
81
|
+
body.push({ type: "TextBlock", text: teamsText(`fix: ${a.fix}`), wrap: true });
|
|
82
|
+
body.push({ type: "TextBlock", text: ADVISORY_LINE, wrap: true, isSubtle: true });
|
|
83
|
+
return {
|
|
84
|
+
type: "message",
|
|
85
|
+
attachments: [
|
|
86
|
+
{
|
|
87
|
+
contentType: "application/vnd.microsoft.card.adaptive",
|
|
88
|
+
contentUrl: null,
|
|
89
|
+
content: {
|
|
90
|
+
$schema: "http://adaptivecards.io/schemas/adaptive-card.json",
|
|
91
|
+
type: "AdaptiveCard",
|
|
92
|
+
version: "1.2",
|
|
93
|
+
body,
|
|
94
|
+
actions: [],
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
],
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
const LINEAR_PRIORITY = { critical: 1, high: 2, medium: 3, low: 4 };
|
|
101
|
+
export function buildIncidentLinearPayload(a) {
|
|
102
|
+
return { title: a.title, description: descriptionLines(a).join("\n"), priority: LINEAR_PRIORITY[a.severity] };
|
|
103
|
+
}
|
|
104
|
+
export function buildIncidentJiraPayload(a) {
|
|
105
|
+
return { fields: { summary: a.title, description: descriptionLines(a).join("\n"), issuetype: { name: "Task" } } };
|
|
106
|
+
}
|
|
107
|
+
export function buildIncidentGenericPayload(a) {
|
|
108
|
+
return { kind: INCIDENT_KIND, event: INCIDENT_EVENT, incident: { ...a } };
|
|
109
|
+
}
|
|
110
|
+
export function buildIncidentPayload(template, a) {
|
|
111
|
+
switch (template) {
|
|
112
|
+
case "slack":
|
|
113
|
+
return buildIncidentSlackPayload(a);
|
|
114
|
+
case "teams":
|
|
115
|
+
return buildIncidentTeamsPayload(a);
|
|
116
|
+
case "linear":
|
|
117
|
+
return buildIncidentLinearPayload(a);
|
|
118
|
+
case "jira":
|
|
119
|
+
return buildIncidentJiraPayload(a);
|
|
120
|
+
default:
|
|
121
|
+
return buildIncidentGenericPayload(a);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/** Last resort when the secret scan rejects the full body: title, severity and the test mark only. */
|
|
125
|
+
export function buildIncidentMinimizedPayload(a) {
|
|
126
|
+
return { kind: INCIDENT_KIND, event: INCIDENT_EVENT, title: a.title, severity: a.severity, test: a.test };
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=incident-templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"incident-templates.js","sourceRoot":"","sources":["../../src/notify/incident-templates.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEtF,OAAO,EAAE,cAAc,EAAE,SAAS,EAAuB,MAAM,gBAAgB,CAAC;AAEhF,MAAM,aAAa,GAAG,kFAAkF,CAAC;AAEzG,SAAS,aAAa,CAAC,KAAa;IAClC,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAClF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,OAAO,aAAa,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAa;IACpC,OAAO,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;SACrD,OAAO,CAAC,0BAA0B,EAAE,MAAM,CAAC,CAAC;AACjD,CAAC;AAKD,SAAS,KAAK,CAAC,CAAgB;IAC7B,MAAM,GAAG,GAAW;QAClB,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC;QACxB,CAAC,WAAW,EAAE,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC;QAC9C,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;KACrC,CAAC;IACF,IAAI,CAAC,CAAC,MAAM;QAAE,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,KAAK,UAAU,CAAC,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC9G,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;QACb,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;QACnB,MAAM,GAAG,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC;QAC7D,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,EAAE,YAAY,CAAC,CAAC,MAAM,CAAC,EAAE,cAAc,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,KAAK,aAAa,CAAC,CAAC,CAAC;IAC9K,CAAC;IACD,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChE,IAAI,CAAC,CAAC,OAAO;QAAE,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IACpD,IAAI,CAAC,CAAC,MAAM;QAAE,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IACjD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,gBAAgB,CAAC,CAAgB;IACxC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC9E,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,YAAY,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACnE,IAAI,CAAC,CAAC,GAAG;QAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACjD,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC1B,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,CAAgB;IACxD,MAAM,MAAM,GAAc;QACxB,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE;QAC7E,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;KAC7I,CAAC;IACF,IAAI,CAAC,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAC7H,CAAC;IACD,IAAI,CAAC,CAAC,GAAG;QAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAC5G,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC,CAAC;IACtF,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,QAAQ,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,CAAgB;IACxD,MAAM,IAAI,GAAc;QACtB,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE;QAC7F,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE;KACnG,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS;QAAE,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9F,IAAI,CAAC,CAAC,GAAG;QAAE,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1F,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAClF,OAAO;QACL,IAAI,EAAE,SAAS;QACf,WAAW,EAAE;YACX;gBACE,WAAW,EAAE,yCAAyC;gBACtD,UAAU,EAAE,IAAI;gBAChB,OAAO,EAAE;oBACP,OAAO,EAAE,oDAAoD;oBAC7D,IAAI,EAAE,cAAc;oBACpB,OAAO,EAAE,KAAK;oBACd,IAAI;oBACJ,OAAO,EAAE,EAAE;iBACZ;aACF;SACF;KACF,CAAC;AACJ,CAAC;AAED,MAAM,eAAe,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAW,CAAC;AAE7E,MAAM,UAAU,0BAA0B,CAAC,CAAgB;IACzD,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;AAChH,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,CAAgB;IACvD,OAAO,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AACpH,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,CAAgB;IAC1D,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,QAAwB,EAAE,CAAgB;IAC7E,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,OAAO;YACV,OAAO,yBAAyB,CAAC,CAAC,CAAC,CAAC;QACtC,KAAK,OAAO;YACV,OAAO,yBAAyB,CAAC,CAAC,CAAC,CAAC;QACtC,KAAK,QAAQ;YACX,OAAO,0BAA0B,CAAC,CAAC,CAAC,CAAC;QACvC,KAAK,MAAM;YACT,OAAO,wBAAwB,CAAC,CAAC,CAAC,CAAC;QACrC;YACE,OAAO,2BAA2B,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC;AAED,sGAAsG;AACtG,MAAM,UAAU,6BAA6B,CAAC,CAAgB;IAC5D,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAC5G,CAAC"}
|
package/dist/notify/index.d.ts
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import type { TrailEvent } from "../trail.js";
|
|
2
2
|
import { type NotifyTemplate } from "./templates.js";
|
|
3
3
|
import { type NotifyDeps } from "./sender.js";
|
|
4
|
+
import type { IncidentAlert } from "../alerts/incident-alert.js";
|
|
5
|
+
export { INCIDENT_EVENT } from "../alerts/constants.js";
|
|
6
|
+
export { buildIncidentPayload } from "./incident-templates.js";
|
|
4
7
|
export { appendNotifyLog, NOTIFY_LOG_FILE, NOTIFY_LOG_KEEP_LINES, NOTIFY_LOG_MAX_LINES, notifyLogPath, notifyTargetLabel, readNotifyLog, summarizeNotifyLog, type NotifyLogEntry, type NotifyLogSummary, type NotifyTargetRow, } from "./log.js";
|
|
5
8
|
export { CIRCUIT_FAILURES_TO_OPEN, CIRCUIT_OPEN_MS, DEFAULT_TIMEOUT_MS, RATE_LIMIT_MAX_SENDS, RATE_LIMIT_WINDOW_MS, RETRY_DELAYS_MS, notifyStats, postWebhook, resetNotifyState, sendWithRetry, type NotifyDeps, } from "./sender.js";
|
|
6
9
|
export { NOTIFY_KIND, NOTIFY_TEMPLATES, allowedEventFields, buildGenericPayload, buildJiraPayload, buildLinearPayload, buildMinimizedPayload, buildPayload, buildSlackPayload, buildTeamsPayload, headline, teamsText, type NotifyTemplate, } from "./templates.js";
|
|
@@ -37,4 +40,13 @@ export declare function serializePayload(template: NotifyTemplate, event: TrailE
|
|
|
37
40
|
* reliability (retry, timeout, rate limit, circuit breaker) lives in sender.ts. Never throws.
|
|
38
41
|
*/
|
|
39
42
|
export declare function notifyOnTrailEvent(event: TrailEvent, config: NotifyFileConfig | undefined, env?: NodeJS.ProcessEnv, deps?: NotifyDeps): Promise<void>;
|
|
43
|
+
/** Serialized `incident.opened` body for one receiver, downgraded to the minimized shape if the secret scan trips. */
|
|
44
|
+
export declare function serializeIncidentPayload(template: NotifyTemplate, alert: IncidentAlert): string;
|
|
45
|
+
/** Receivers of `incident.opened`: configured webhooks whose `events` hold it, or that have no filter. */
|
|
46
|
+
export declare function resolveIncidentWebhooks(config: NotifyFileConfig | undefined): ResolvedWebhook[];
|
|
47
|
+
/**
|
|
48
|
+
* Deliver one incident alert to every given receiver (retries, breaker and rate limit from sender.ts,
|
|
49
|
+
* one ledger line per attempt). Returns how many receivers accepted it. Never throws.
|
|
50
|
+
*/
|
|
51
|
+
export declare function notifyIncident(alert: IncidentAlert, targets: readonly ResolvedWebhook[], env?: NodeJS.ProcessEnv, deps?: NotifyDeps): Promise<number>;
|
|
40
52
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/notify/index.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAiB,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAE7D,OAAO,EACL,eAAe,EACf,eAAe,EACf,qBAAqB,EACrB,oBAAoB,EACpB,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,kBAAkB,EAClB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,eAAe,GACrB,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,wBAAwB,EACxB,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,eAAe,EACf,WAAW,EACX,WAAW,EACX,gBAAgB,EAChB,aAAa,EACb,KAAK,UAAU,GAChB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,EACrB,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,QAAQ,EACR,SAAS,EACT,KAAK,cAAc,GACpB,MAAM,gBAAgB,CAAC;AAExB,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAC;IACnC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,oEAAoE;AACpE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE;QAChB,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;KACxC,CAAC;CACH;AAED,2FAA2F;AAC3F,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,eAAO,MAAM,mBAAmB,EAAE,SAAS,MAAM,EAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/notify/index.ts"],"names":[],"mappings":"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"}
|
package/dist/notify/index.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* Config comes from the `notify` key of the parsed `.kya/config.json` object (the module receives
|
|
6
6
|
* the parsed object, it does not read files):
|
|
7
7
|
*
|
|
8
|
-
* notify: { webhooks: [ { url, events?: ["DENY","REQUIRE_APPROVE"],
|
|
8
|
+
* notify: { webhooks: [ { url, events?: ["DENY","REQUIRE_APPROVE","incident.opened"],
|
|
9
9
|
* template?: "slack"|"teams"|"linear"|"jira"|"generic",
|
|
10
10
|
* headers?: Record<string,string>, timeoutMs? } ] }
|
|
11
11
|
*
|
|
@@ -22,10 +22,16 @@
|
|
|
22
22
|
import { assertNoSecrets } from "../dash/render.js";
|
|
23
23
|
import { NOTIFY_TEMPLATES, buildMinimizedPayload, buildPayload, } from "./templates.js";
|
|
24
24
|
import { sendWithRetry } from "./sender.js";
|
|
25
|
+
import { INCIDENT_EVENT } from "../alerts/constants.js";
|
|
26
|
+
import { buildIncidentMinimizedPayload, buildIncidentPayload } from "./incident-templates.js";
|
|
27
|
+
export { INCIDENT_EVENT } from "../alerts/constants.js";
|
|
28
|
+
export { buildIncidentPayload } from "./incident-templates.js";
|
|
25
29
|
export { appendNotifyLog, NOTIFY_LOG_FILE, NOTIFY_LOG_KEEP_LINES, NOTIFY_LOG_MAX_LINES, notifyLogPath, notifyTargetLabel, readNotifyLog, summarizeNotifyLog, } from "./log.js";
|
|
26
30
|
export { CIRCUIT_FAILURES_TO_OPEN, CIRCUIT_OPEN_MS, DEFAULT_TIMEOUT_MS, RATE_LIMIT_MAX_SENDS, RATE_LIMIT_WINDOW_MS, RETRY_DELAYS_MS, notifyStats, postWebhook, resetNotifyState, sendWithRetry, } from "./sender.js";
|
|
27
31
|
export { NOTIFY_KIND, NOTIFY_TEMPLATES, allowedEventFields, buildGenericPayload, buildJiraPayload, buildLinearPayload, buildMinimizedPayload, buildPayload, buildSlackPayload, buildTeamsPayload, headline, teamsText, } from "./templates.js";
|
|
28
32
|
export const NOTIFYABLE_VERDICTS = ["DENY", "REQUIRE_APPROVE"];
|
|
33
|
+
/** Every event name a webhook `events` list may hold. A webhook with no usable filter gets all of them from config. */
|
|
34
|
+
const KNOWN_EVENTS = [...NOTIFYABLE_VERDICTS, INCIDENT_EVENT];
|
|
29
35
|
export const ENV_WEBHOOK_VAR = "KYA_NOTIFY_WEBHOOK";
|
|
30
36
|
function isHttpUrl(raw) {
|
|
31
37
|
try {
|
|
@@ -42,9 +48,9 @@ function parseWebhook(raw) {
|
|
|
42
48
|
const w = raw;
|
|
43
49
|
if (typeof w["url"] !== "string" || !isHttpUrl(w["url"].trim()))
|
|
44
50
|
return undefined;
|
|
45
|
-
let events =
|
|
51
|
+
let events = KNOWN_EVENTS;
|
|
46
52
|
if (Array.isArray(w["events"])) {
|
|
47
|
-
const filtered = w["events"].filter((e) => typeof e === "string" &&
|
|
53
|
+
const filtered = w["events"].filter((e) => typeof e === "string" && KNOWN_EVENTS.includes(e));
|
|
48
54
|
if (filtered.length > 0)
|
|
49
55
|
events = filtered;
|
|
50
56
|
}
|
|
@@ -122,4 +128,45 @@ export async function notifyOnTrailEvent(event, config, env = process.env, deps
|
|
|
122
128
|
/* notify must never change the gate path */
|
|
123
129
|
}
|
|
124
130
|
}
|
|
131
|
+
/** Serialized `incident.opened` body for one receiver, downgraded to the minimized shape if the secret scan trips. */
|
|
132
|
+
export function serializeIncidentPayload(template, alert) {
|
|
133
|
+
const body = JSON.stringify(buildIncidentPayload(template, alert));
|
|
134
|
+
try {
|
|
135
|
+
assertNoSecrets(body);
|
|
136
|
+
return body;
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
return JSON.stringify(buildIncidentMinimizedPayload(alert));
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/** Receivers of `incident.opened`: configured webhooks whose `events` hold it, or that have no filter. */
|
|
143
|
+
export function resolveIncidentWebhooks(config) {
|
|
144
|
+
return resolveWebhooks(config, {}).filter((w) => w.events.includes(INCIDENT_EVENT));
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Deliver one incident alert to every given receiver (retries, breaker and rate limit from sender.ts,
|
|
148
|
+
* one ledger line per attempt). Returns how many receivers accepted it. Never throws.
|
|
149
|
+
*/
|
|
150
|
+
export async function notifyIncident(alert, targets, env = process.env, deps = {}) {
|
|
151
|
+
try {
|
|
152
|
+
const results = await Promise.all(targets.map(async (w) => {
|
|
153
|
+
try {
|
|
154
|
+
return await sendWithRetry({
|
|
155
|
+
url: w.url,
|
|
156
|
+
body: serializeIncidentPayload(w.template, alert),
|
|
157
|
+
...(w.headers ? { headers: w.headers } : {}),
|
|
158
|
+
...(w.timeoutMs !== undefined ? { timeoutMs: w.timeoutMs } : {}),
|
|
159
|
+
ledger: { env, verdict: INCIDENT_EVENT },
|
|
160
|
+
}, deps);
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
}));
|
|
166
|
+
return results.filter(Boolean).length;
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
return 0;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
125
172
|
//# sourceMappingURL=index.js.map
|
package/dist/notify/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/notify/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,YAAY,GAEb,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,aAAa,EAAmB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/notify/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,6 +22,12 @@ export declare const SLACK_NOT_AN_APPROVAL = "A Slack reaction or reply is not a
|
|
|
22
22
|
export declare function buildSlackPayload(event: TrailEvent): Record<string, unknown>;
|
|
23
23
|
/** Footer on every Teams card: chat is a notify channel, never an approval path. */
|
|
24
24
|
export declare const TEAMS_NOT_AN_APPROVAL = "A Teams reaction or reply is not an approval. Decide in kya or in the hosted console.";
|
|
25
|
+
/**
|
|
26
|
+
* Makes plain text unlinkable: `://` becomes `: //` and every dot between two letters or digits gets
|
|
27
|
+
* spaces around it, so no receiver can auto-link a host name or a leading `www.`. Shared by Teams
|
|
28
|
+
* (teamsText) and the Slack, Linear and Jira incident templates.
|
|
29
|
+
*/
|
|
30
|
+
export declare function breakAutolinks(value: string): string;
|
|
25
31
|
/**
|
|
26
32
|
* Event text for a Teams card. Teams renders a Markdown subset, so the characters that make links, mentions
|
|
27
33
|
* (`<at>`), bold or headings become a space, a leading list marker becomes a space, and `://` becomes `: //`.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/notify/templates.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;AAE/E,eAAO,MAAM,gBAAgB,EAAE,SAAS,cAAc,EAAoD,CAAC;AAE3G,6FAA6F;AAC7F,eAAO,MAAM,WAAW,sBAAsB,CAAC;AAE/C;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAgB5E;AAED,+FAA+F;AAC/F,wBAAgB,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAElD;AAmBD,uFAAuF;AACvF,eAAO,MAAM,qBAAqB,0FACuD,CAAC;AAE1F,mFAAmF;AACnF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAgB5E;AAED,oFAAoF;AACpF,eAAO,MAAM,qBAAqB,0FACuD,CAAC;
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/notify/templates.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;AAE/E,eAAO,MAAM,gBAAgB,EAAE,SAAS,cAAc,EAAoD,CAAC;AAE3G,6FAA6F;AAC7F,eAAO,MAAM,WAAW,sBAAsB,CAAC;AAE/C;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAgB5E;AAED,+FAA+F;AAC/F,wBAAgB,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAElD;AAmBD,uFAAuF;AACvF,eAAO,MAAM,qBAAqB,0FACuD,CAAC;AAE1F,mFAAmF;AACnF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAgB5E;AAED,oFAAoF;AACpF,eAAO,MAAM,qBAAqB,0FACuD,CAAC;AAK1F;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAO/C;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA2B5E;AAED,wFAAwF;AACxF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAM7E;AAED,uFAAuF;AACvF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAQ3E;AAED,kEAAkE;AAClE,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAE9E;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,cAAc,EAAE,KAAK,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAajG;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAOhF"}
|
package/dist/notify/templates.js
CHANGED
|
@@ -75,6 +75,16 @@ export function buildSlackPayload(event) {
|
|
|
75
75
|
}
|
|
76
76
|
/** Footer on every Teams card: chat is a notify channel, never an approval path. */
|
|
77
77
|
export const TEAMS_NOT_AN_APPROVAL = "A Teams reaction or reply is not an approval. Decide in kya or in the hosted console.";
|
|
78
|
+
const AUTOLINK_SCHEME = /:\/\//g;
|
|
79
|
+
const AUTOLINK_DOT = /(?<=[\p{L}\p{N}-])\.(?=[\p{L}\p{N}])/gu;
|
|
80
|
+
/**
|
|
81
|
+
* Makes plain text unlinkable: `://` becomes `: //` and every dot between two letters or digits gets
|
|
82
|
+
* spaces around it, so no receiver can auto-link a host name or a leading `www.`. Shared by Teams
|
|
83
|
+
* (teamsText) and the Slack, Linear and Jira incident templates.
|
|
84
|
+
*/
|
|
85
|
+
export function breakAutolinks(value) {
|
|
86
|
+
return value.replace(AUTOLINK_SCHEME, ": //").replace(AUTOLINK_DOT, " . ");
|
|
87
|
+
}
|
|
78
88
|
/**
|
|
79
89
|
* Event text for a Teams card. Teams renders a Markdown subset, so the characters that make links, mentions
|
|
80
90
|
* (`<at>`), bold or headings become a space, a leading list marker becomes a space, and `://` becomes `: //`.
|
|
@@ -85,8 +95,8 @@ export function teamsText(value) {
|
|
|
85
95
|
return value
|
|
86
96
|
.replace(/[\u0000-\u001f\u007f-\u009f\u2028\u2029\u200b-\u200f\u202a-\u202e\u2066-\u2069]/g, " ")
|
|
87
97
|
.replace(/[\\[\]()*~#<>&|!`]/g, " ")
|
|
88
|
-
.replace(
|
|
89
|
-
.replace(
|
|
98
|
+
.replace(AUTOLINK_SCHEME, ": //")
|
|
99
|
+
.replace(AUTOLINK_DOT, " . ")
|
|
90
100
|
.replace(/^\s*([-+]|\d+\.)(?=\s|$)/, " ");
|
|
91
101
|
}
|
|
92
102
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/notify/templates.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/notify/templates.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,6 +18,8 @@ export interface LiveReceiptOptions {
|
|
|
18
18
|
readonly maxRssMb?: number;
|
|
19
19
|
/** Memory check period in ms (default 30 s). */
|
|
20
20
|
readonly memPollMs?: number;
|
|
21
|
+
/** Minimum ms between incident alert scans (default 60 s). Test seam. */
|
|
22
|
+
readonly alertScanMinMs?: number;
|
|
21
23
|
}
|
|
22
24
|
export interface LiveReceiptServer {
|
|
23
25
|
readonly url: string;
|
|
@@ -38,6 +40,8 @@ export interface ReportActionResult {
|
|
|
38
40
|
readonly status: number;
|
|
39
41
|
readonly body: Record<string, unknown>;
|
|
40
42
|
}
|
|
43
|
+
/** The report daemon runs the incident alert scan at most this often. */
|
|
44
|
+
export declare const ALERT_SCAN_MIN_MS = 60000;
|
|
41
45
|
/**
|
|
42
46
|
* Run the ORR board against cwd and write <cwd>/orr-report/report.json (+ .md).
|
|
43
47
|
* Read-only probes; never throws (a failed board must not break the report
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"live-server.d.ts","sourceRoot":"","sources":["../../src/receipt/live-server.ts"],"names":[],"mappings":"AAOA,OAAO,EAEL,KAAK,mBAAmB,EAIzB,MAAM,WAAW,CAAC;AAEnB,OAAO,EAA2B,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"live-server.d.ts","sourceRoot":"","sources":["../../src/receipt/live-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,6 +12,8 @@ import { runGateDoctor, runGateRun, runGateStop } from "../commands/gate.js";
|
|
|
12
12
|
import { runInvestigate } from "../commands/investigate.js";
|
|
13
13
|
import { runOrr } from "../commands/orr.js";
|
|
14
14
|
import { loadInvestigateLastRun } from "../investigate/last-run.js";
|
|
15
|
+
import { resolveAlertsConfig } from "../alerts/config.js";
|
|
16
|
+
import { runAlertScan } from "../alerts/scan.js";
|
|
15
17
|
import { loadOrrCard } from "./enrich.js";
|
|
16
18
|
import { defaultAgtAuditPath, importTraces, } from "../importers/index.js";
|
|
17
19
|
import { notifyOnTrailEvent, resolveWebhooks, } from "../notify/index.js";
|
|
@@ -94,6 +96,8 @@ async function withLoopbackSink(run) {
|
|
|
94
96
|
function mergedFileConfig(cwd, env) {
|
|
95
97
|
return { ...readFileConfig(kyaHome(env)), ...readFileConfig(cwd) };
|
|
96
98
|
}
|
|
99
|
+
/** The report daemon runs the incident alert scan at most this often. */
|
|
100
|
+
export const ALERT_SCAN_MIN_MS = 60_000;
|
|
97
101
|
const ORR_REPORT_REL = join("orr-report", "report.json");
|
|
98
102
|
/** Re-run the board when the report is older than this (30 minutes). */
|
|
99
103
|
const ORR_REFRESH_MS = 30 * 60 * 1000;
|
|
@@ -359,6 +363,47 @@ export function startLiveReceiptServer(options) {
|
|
|
359
363
|
clearTimeout(debounce);
|
|
360
364
|
debounce = setTimeout(() => broadcast(source), 120);
|
|
361
365
|
};
|
|
366
|
+
// Incident alerts: when the trail changes, run the detectors at most once per minute (off unless alerts are on).
|
|
367
|
+
// The scan never throws and never touches the page; a new alert only triggers a refresh.
|
|
368
|
+
let lastAlertScan = 0;
|
|
369
|
+
let alertScanRunning = false;
|
|
370
|
+
// A trail change that arrives during a scan must not be lost: scan again once the running scan ends.
|
|
371
|
+
let alertRescan = false;
|
|
372
|
+
let alertTimer;
|
|
373
|
+
const maybeScanAlerts = () => {
|
|
374
|
+
if (closed || !resolveAlertsConfig(process.env).enabled)
|
|
375
|
+
return;
|
|
376
|
+
if (alertScanRunning) {
|
|
377
|
+
alertRescan = true;
|
|
378
|
+
return;
|
|
379
|
+
}
|
|
380
|
+
const wait = lastAlertScan + (options.alertScanMinMs ?? ALERT_SCAN_MIN_MS) - Date.now();
|
|
381
|
+
if (wait > 0) {
|
|
382
|
+
if (!alertTimer) {
|
|
383
|
+
alertTimer = setTimeout(() => {
|
|
384
|
+
alertTimer = undefined;
|
|
385
|
+
maybeScanAlerts();
|
|
386
|
+
}, wait);
|
|
387
|
+
alertTimer.unref?.();
|
|
388
|
+
}
|
|
389
|
+
return;
|
|
390
|
+
}
|
|
391
|
+
lastAlertScan = Date.now();
|
|
392
|
+
alertScanRunning = true;
|
|
393
|
+
void runAlertScan(cwd, process.env)
|
|
394
|
+
.then((r) => {
|
|
395
|
+
if (r.alerted.length > 0)
|
|
396
|
+
scheduleBroadcast("action");
|
|
397
|
+
})
|
|
398
|
+
.catch(() => undefined)
|
|
399
|
+
.finally(() => {
|
|
400
|
+
alertScanRunning = false;
|
|
401
|
+
if (alertRescan) {
|
|
402
|
+
alertRescan = false;
|
|
403
|
+
maybeScanAlerts();
|
|
404
|
+
}
|
|
405
|
+
});
|
|
406
|
+
};
|
|
362
407
|
const unauthorized = (res) => {
|
|
363
408
|
res.writeHead(401, { "Content-Type": "text/plain; charset=utf-8" });
|
|
364
409
|
res.end("unauthorized\n");
|
|
@@ -843,6 +888,8 @@ export function startLiveReceiptServer(options) {
|
|
|
843
888
|
process.removeListener("SIGTERM", onSignal);
|
|
844
889
|
onSignal = undefined;
|
|
845
890
|
}
|
|
891
|
+
if (alertTimer)
|
|
892
|
+
clearTimeout(alertTimer);
|
|
846
893
|
try {
|
|
847
894
|
watcher?.close();
|
|
848
895
|
}
|
|
@@ -914,6 +961,7 @@ export function startLiveReceiptServer(options) {
|
|
|
914
961
|
watcher = watch(dirname(path), { persistent: true }, (_event, filename) => {
|
|
915
962
|
if (!filename || String(filename).endsWith("trail.jsonl")) {
|
|
916
963
|
scheduleBroadcast("trail");
|
|
964
|
+
maybeScanAlerts();
|
|
917
965
|
}
|
|
918
966
|
});
|
|
919
967
|
watcher.on("error", () => {
|