@sfdxy/anypoint-connect 0.16.3 → 0.17.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/README.md +17 -6
- package/dist/analysis/audit-actors.d.ts +36 -0
- package/dist/analysis/audit-actors.d.ts.map +1 -0
- package/dist/analysis/audit-actors.js +93 -0
- package/dist/analysis/audit-actors.js.map +1 -0
- package/dist/analysis/credentials.d.ts +49 -0
- package/dist/analysis/credentials.d.ts.map +1 -0
- package/dist/analysis/credentials.js +118 -0
- package/dist/analysis/credentials.js.map +1 -0
- package/dist/analysis/parser.d.ts +5 -0
- package/dist/analysis/parser.d.ts.map +1 -1
- package/dist/analysis/parser.js +10 -1
- package/dist/analysis/parser.js.map +1 -1
- package/dist/api/AlertsApi.d.ts +138 -0
- package/dist/api/AlertsApi.d.ts.map +1 -0
- package/dist/api/AlertsApi.js +168 -0
- package/dist/api/AlertsApi.js.map +1 -0
- package/dist/api/LogsApi.d.ts +14 -2
- package/dist/api/LogsApi.d.ts.map +1 -1
- package/dist/api/LogsApi.js +23 -12
- package/dist/api/LogsApi.js.map +1 -1
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/client/AnypointClient.d.ts +2 -0
- package/dist/client/AnypointClient.d.ts.map +1 -1
- package/dist/client/AnypointClient.js +3 -0
- package/dist/client/AnypointClient.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 +358 -0
- package/dist/commands/alerts.js.map +1 -0
- package/dist/commands/api.d.ts.map +1 -1
- package/dist/commands/api.js +8 -3
- package/dist/commands/api.js.map +1 -1
- package/dist/commands/app-change-cli.d.ts +5 -2
- package/dist/commands/app-change-cli.d.ts.map +1 -1
- package/dist/commands/app-change-cli.js +19 -5
- package/dist/commands/app-change-cli.js.map +1 -1
- package/dist/commands/apps.d.ts.map +1 -1
- package/dist/commands/apps.js +26 -21
- package/dist/commands/apps.js.map +1 -1
- package/dist/commands/deploy.d.ts.map +1 -1
- package/dist/commands/deploy.js +17 -6
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/index.d.ts +1 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +1 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/logs.d.ts +1 -0
- package/dist/commands/logs.d.ts.map +1 -1
- package/dist/commands/logs.js +45 -0
- package/dist/commands/logs.js.map +1 -1
- package/dist/config/profiles.d.ts +10 -2
- package/dist/config/profiles.d.ts.map +1 -1
- package/dist/config/profiles.js +52 -21
- package/dist/config/profiles.js.map +1 -1
- package/dist/index.d.ts +8 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +3 -2
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools/alerts.d.ts +82 -0
- package/dist/mcp/tools/alerts.d.ts.map +1 -0
- package/dist/mcp/tools/alerts.js +409 -0
- package/dist/mcp/tools/alerts.js.map +1 -0
- package/dist/mcp/tools/api-manager.d.ts.map +1 -1
- package/dist/mcp/tools/api-manager.js +6 -1
- package/dist/mcp/tools/api-manager.js.map +1 -1
- package/dist/mcp/tools/app-inputs.d.ts +4 -2
- package/dist/mcp/tools/app-inputs.d.ts.map +1 -1
- package/dist/mcp/tools/app-inputs.js +14 -2
- package/dist/mcp/tools/app-inputs.js.map +1 -1
- package/dist/mcp/tools/apps-deploy.d.ts.map +1 -1
- package/dist/mcp/tools/apps-deploy.js +48 -12
- package/dist/mcp/tools/apps-deploy.js.map +1 -1
- package/dist/mcp/tools/apps-lifecycle.d.ts.map +1 -1
- package/dist/mcp/tools/apps-lifecycle.js +27 -12
- package/dist/mcp/tools/apps-lifecycle.js.map +1 -1
- package/dist/mcp/tools/audit.d.ts.map +1 -1
- package/dist/mcp/tools/audit.js +17 -4
- package/dist/mcp/tools/audit.js.map +1 -1
- package/dist/mcp/tools/exchange.d.ts.map +1 -1
- package/dist/mcp/tools/exchange.js +38 -18
- package/dist/mcp/tools/exchange.js.map +1 -1
- package/dist/mcp/tools/identity.d.ts.map +1 -1
- package/dist/mcp/tools/identity.js +4 -1
- package/dist/mcp/tools/identity.js.map +1 -1
- package/dist/mcp/tools/index.d.ts +1 -0
- package/dist/mcp/tools/index.d.ts.map +1 -1
- package/dist/mcp/tools/index.js +1 -0
- package/dist/mcp/tools/index.js.map +1 -1
- package/dist/mcp/tools/logs.d.ts +1 -1
- package/dist/mcp/tools/logs.d.ts.map +1 -1
- package/dist/mcp/tools/logs.js +34 -1
- package/dist/mcp/tools/logs.js.map +1 -1
- package/dist/mcp/tools/profile.d.ts +17 -3
- package/dist/mcp/tools/profile.d.ts.map +1 -1
- package/dist/mcp/tools/profile.js +122 -10
- package/dist/mcp/tools/profile.js.map +1 -1
- package/dist/mcp/tools/shared.d.ts +22 -2
- package/dist/mcp/tools/shared.d.ts.map +1 -1
- package/dist/mcp/tools/shared.js +29 -4
- package/dist/mcp/tools/shared.js.map +1 -1
- package/dist/safety/artifact.d.ts +45 -0
- package/dist/safety/artifact.d.ts.map +1 -1
- package/dist/safety/artifact.js +109 -0
- package/dist/safety/artifact.js.map +1 -1
- package/dist/safety/guards.d.ts +10 -0
- package/dist/safety/guards.d.ts.map +1 -1
- package/dist/safety/guards.js +16 -0
- package/dist/safety/guards.js.map +1 -1
- package/dist/safety/preapproval.d.ts +102 -0
- package/dist/safety/preapproval.d.ts.map +1 -0
- package/dist/safety/preapproval.js +251 -0
- package/dist/safety/preapproval.js.map +1 -0
- package/dist/safety/secrets.d.ts +7 -0
- package/dist/safety/secrets.d.ts.map +1 -1
- package/dist/safety/secrets.js +16 -0
- package/dist/safety/secrets.js.map +1 -1
- package/dist/workflows/alerts.d.ts +299 -0
- package/dist/workflows/alerts.d.ts.map +1 -0
- package/dist/workflows/alerts.js +595 -0
- package/dist/workflows/alerts.js.map +1 -0
- package/dist/workflows/app-change.d.ts +25 -1
- package/dist/workflows/app-change.d.ts.map +1 -1
- package/dist/workflows/app-change.js +22 -1
- package/dist/workflows/app-change.js.map +1 -1
- package/dist/workflows/artifact-verification.d.ts +52 -0
- package/dist/workflows/artifact-verification.d.ts.map +1 -0
- package/dist/workflows/artifact-verification.js +85 -0
- package/dist/workflows/artifact-verification.js.map +1 -0
- package/dist/workflows/jar-deployment.d.ts +36 -10
- package/dist/workflows/jar-deployment.d.ts.map +1 -1
- package/dist/workflows/jar-deployment.js +40 -12
- package/dist/workflows/jar-deployment.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,595 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Alert workflows
|
|
3
|
+
* Shared by the alert MCP tools and `anc alerts`: normalizing alerts for display (recipients masked by
|
|
4
|
+
* default), turning human inputs (percent thresholds, minutes, explicit notifications) into the
|
|
5
|
+
* platform's payload, resolving the target from CloudHub 2.0 or API Manager, duplicate detection,
|
|
6
|
+
* and the get-merge-replace update the platform requires.
|
|
7
|
+
*/
|
|
8
|
+
import { AlertPendingError, } from '../api/AlertsApi.js';
|
|
9
|
+
/** Every metric an alert can watch, in one table. */
|
|
10
|
+
export const ALERT_METRICS = {
|
|
11
|
+
cpu_utilization: { unit: 'percent', entityType: 'application', aggregation: 'AVG' },
|
|
12
|
+
memory_utilization: { unit: 'percent', entityType: 'application', aggregation: 'AVG' },
|
|
13
|
+
thread_count: { unit: 'count', entityType: 'application', aggregation: 'AVG' },
|
|
14
|
+
message_count: { unit: 'count', entityType: 'application', aggregation: 'SUM' },
|
|
15
|
+
message_error_count: { unit: 'count', entityType: 'application', aggregation: 'SUM' },
|
|
16
|
+
message_response_time: { unit: 'ms', entityType: 'application', aggregation: 'AVG' },
|
|
17
|
+
api_request_count: { unit: 'count', entityType: 'api', aggregation: 'SUM' },
|
|
18
|
+
api_response_time: { unit: 'ms', entityType: 'api', aggregation: 'AVG' },
|
|
19
|
+
api_response_code_count: { unit: 'count', entityType: 'api', aggregation: 'SUM', requires: 'RESPONSE_CODE' },
|
|
20
|
+
api_policy_violation_count: { unit: 'count', entityType: 'api', aggregation: 'SUM', requires: 'POLICY' },
|
|
21
|
+
};
|
|
22
|
+
export const MAX_DURATION_MINUTES = 60;
|
|
23
|
+
function domainOf(email) {
|
|
24
|
+
const at = email.lastIndexOf('@');
|
|
25
|
+
return at >= 0 ? email.slice(at + 1).toLowerCase() : '(invalid address)';
|
|
26
|
+
}
|
|
27
|
+
export function summarizeRecipients(notifications = []) {
|
|
28
|
+
const emails = notifications.filter((n) => n.type === 'EMAIL').flatMap((n) => n.recipients ?? []);
|
|
29
|
+
return {
|
|
30
|
+
recipientCount: emails.length + notifications.filter((n) => n.type === 'SLACK').length,
|
|
31
|
+
recipientDomains: [...new Set(emails.map(domainOf))].sort(),
|
|
32
|
+
slackChannels: notifications.filter((n) => n.type === 'SLACK').length,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Notifications as written back: the read side (`notificationTemplates`) under the write name, with
|
|
37
|
+
* every field the platform returned kept, including ones this tool does not know.
|
|
38
|
+
*/
|
|
39
|
+
export function notificationsOf(alert) {
|
|
40
|
+
return (alert.notificationTemplates ?? alert.notifications ?? []).map((n) => ({
|
|
41
|
+
...n,
|
|
42
|
+
...(n.recipients ? { recipients: [...n.recipients] } : {}),
|
|
43
|
+
}));
|
|
44
|
+
}
|
|
45
|
+
/** The fields a caller sets on a notification, in a fixed order, for comparison. */
|
|
46
|
+
function settableNotification(n) {
|
|
47
|
+
return {
|
|
48
|
+
type: n.type,
|
|
49
|
+
recipients: n.recipients ?? [],
|
|
50
|
+
subject: n.subject ?? null,
|
|
51
|
+
messageTemplate: n.messageTemplate ?? null,
|
|
52
|
+
channelId: n.channelId ?? null,
|
|
53
|
+
carrierId: n.carrierId ?? null,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/** Which aspects of the notifications differ, by name only, so a masked diff still says what changed. */
|
|
57
|
+
export function notificationDifferences(before, after) {
|
|
58
|
+
const a = before.map(settableNotification);
|
|
59
|
+
const b = after.map(settableNotification);
|
|
60
|
+
const fields = new Set();
|
|
61
|
+
if (a.length !== b.length)
|
|
62
|
+
fields.add('count');
|
|
63
|
+
for (let i = 0; i < Math.max(a.length, b.length); i++) {
|
|
64
|
+
const x = a[i];
|
|
65
|
+
const y = b[i];
|
|
66
|
+
if (!x || !y)
|
|
67
|
+
continue;
|
|
68
|
+
for (const key of Object.keys(x)) {
|
|
69
|
+
if (JSON.stringify(x[key]) !== JSON.stringify(y[key]))
|
|
70
|
+
fields.add(key);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return [...fields];
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* A recipient summary for display. Domains can identify clients, so they are shown only with `reveal`;
|
|
77
|
+
* otherwise only the counts.
|
|
78
|
+
*/
|
|
79
|
+
export function displayRecipients(notifications, reveal = false) {
|
|
80
|
+
const { recipientDomains, ...counts } = summarizeRecipients(notifications);
|
|
81
|
+
return reveal ? { ...counts, recipientDomains } : counts;
|
|
82
|
+
}
|
|
83
|
+
/** Notifications for display: masked to counts unless `reveal`. */
|
|
84
|
+
export function describeNotifications(notifications, reveal = false) {
|
|
85
|
+
return notifications.map((n) => reveal
|
|
86
|
+
? n
|
|
87
|
+
: {
|
|
88
|
+
type: n.type,
|
|
89
|
+
...(n.subject !== undefined ? { subject: n.subject } : {}),
|
|
90
|
+
...displayRecipients([n]),
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
// ── Severity ──────────────────────────────────────────
|
|
94
|
+
/** The Monitoring UI's levels: the stored number is the index. */
|
|
95
|
+
export const SEVERITY_LABELS = ['LOW', 'MEDIUM', 'HIGH', 'CRITICAL'];
|
|
96
|
+
/** Other alert families use words; map them onto the same labels. */
|
|
97
|
+
const SEVERITY_WORDS = {
|
|
98
|
+
info: 'LOW',
|
|
99
|
+
low: 'LOW',
|
|
100
|
+
warning: 'MEDIUM',
|
|
101
|
+
warn: 'MEDIUM',
|
|
102
|
+
medium: 'MEDIUM',
|
|
103
|
+
error: 'HIGH',
|
|
104
|
+
high: 'HIGH',
|
|
105
|
+
critical: 'CRITICAL',
|
|
106
|
+
};
|
|
107
|
+
/** A severity given as 0-3 or a label (LOW, MEDIUM, HIGH, CRITICAL), as the stored number. */
|
|
108
|
+
export function parseSeverity(input) {
|
|
109
|
+
if (typeof input === 'number' || /^\d+$/.test(String(input).trim())) {
|
|
110
|
+
const n = Number(input);
|
|
111
|
+
if (!Number.isInteger(n) || n < 0 || n > 3)
|
|
112
|
+
throw new Error('severity must be 0-3 or LOW, MEDIUM, HIGH, CRITICAL');
|
|
113
|
+
return n;
|
|
114
|
+
}
|
|
115
|
+
const index = SEVERITY_LABELS.indexOf(String(input).trim().toUpperCase());
|
|
116
|
+
if (index < 0)
|
|
117
|
+
throw new Error('severity must be 0-3 or LOW, MEDIUM, HIGH, CRITICAL');
|
|
118
|
+
return index;
|
|
119
|
+
}
|
|
120
|
+
/** One label for any family's severity: a Monitoring number, or a word such as INFO or warning. */
|
|
121
|
+
export function severityLabel(value) {
|
|
122
|
+
if (typeof value === 'number')
|
|
123
|
+
return SEVERITY_LABELS[value] ?? String(value);
|
|
124
|
+
if (typeof value === 'string' && value)
|
|
125
|
+
return SEVERITY_WORDS[value.toLowerCase()] ?? value.toUpperCase();
|
|
126
|
+
return undefined;
|
|
127
|
+
}
|
|
128
|
+
export function windowMinutes(interval) {
|
|
129
|
+
const match = /^(\d+)\s*([mh])$/i.exec(interval ?? '');
|
|
130
|
+
if (!match)
|
|
131
|
+
return undefined;
|
|
132
|
+
return Number(match[1]) * (match[2].toLowerCase() === 'h' ? 60 : 1);
|
|
133
|
+
}
|
|
134
|
+
export function metricInfo(metric) {
|
|
135
|
+
return ALERT_METRICS[metric];
|
|
136
|
+
}
|
|
137
|
+
/** A stored threshold in the unit people use: percent metrics are stored as fractions. */
|
|
138
|
+
export function displayThreshold(metric, stored) {
|
|
139
|
+
return metricInfo(metric)?.unit === 'percent' ? Math.round(stored * 100 * 1e6) / 1e6 : stored;
|
|
140
|
+
}
|
|
141
|
+
export function normalizeAlert(alert, options = {}) {
|
|
142
|
+
const notifications = notificationsOf(alert);
|
|
143
|
+
const entity = alert.entity ?? {};
|
|
144
|
+
const metric = alert.settings?.metricId;
|
|
145
|
+
return {
|
|
146
|
+
id: alert.id,
|
|
147
|
+
source: 'monitoring',
|
|
148
|
+
name: alert.name,
|
|
149
|
+
enabled: alert.enabled,
|
|
150
|
+
severity: severityLabel(alert.severity),
|
|
151
|
+
severityLevel: alert.severity,
|
|
152
|
+
status: alert.alertStatus,
|
|
153
|
+
state: alert.state?.currentState,
|
|
154
|
+
entity: {
|
|
155
|
+
type: entity.entityType,
|
|
156
|
+
name: entity.appId ?? entity.apiName ?? entity.entityName ?? entity.endpoint,
|
|
157
|
+
...(entity.apiInstanceId ? { apiInstanceId: entity.apiInstanceId } : {}),
|
|
158
|
+
deploymentType: entity.deploymentType,
|
|
159
|
+
environment: entity.environmentName ?? entity.environmentId,
|
|
160
|
+
environmentId: entity.environmentId,
|
|
161
|
+
},
|
|
162
|
+
condition: {
|
|
163
|
+
metric,
|
|
164
|
+
operator: alert.settings?.evaluationOperator,
|
|
165
|
+
threshold: metric !== undefined ? displayThreshold(metric, alert.settings.threshold) : undefined,
|
|
166
|
+
unit: metric !== undefined ? metricInfo(metric)?.unit : undefined,
|
|
167
|
+
windowMinutes: windowMinutes(alert.settings?.evaluationInterval),
|
|
168
|
+
},
|
|
169
|
+
...displayRecipients(notifications, options.reveal),
|
|
170
|
+
...(options.reveal ? { notifications } : {}),
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
const RM_RESOURCE_TYPES = { 'mc-application': 'application' };
|
|
174
|
+
/** Whether a Runtime Manager alert targets an app: membership in its resources, case-insensitive. */
|
|
175
|
+
export function targetsApp(resources, app) {
|
|
176
|
+
return (resources ?? []).some((r) => r.toLowerCase() === app.toLowerCase());
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* View of a Runtime Manager event alert (deployment failed and similar). Observed shape:
|
|
180
|
+
* condition{type, resourceType, resources[]}, actions[]{type, userIds[], emails[], subject, content},
|
|
181
|
+
* plus conditionType, isSystem and productName.
|
|
182
|
+
*/
|
|
183
|
+
export function normalizeRuntimeManagerAlert(alert, options = {}) {
|
|
184
|
+
const text = (value) => (typeof value === 'string' || typeof value === 'number' ? value : undefined);
|
|
185
|
+
const condition = (alert.condition ?? {});
|
|
186
|
+
const actions = (Array.isArray(alert.actions) ? alert.actions : []);
|
|
187
|
+
const strings = (value) => Array.isArray(value) ? value.filter((v) => typeof v === 'string') : [];
|
|
188
|
+
const emails = actions.flatMap((a) => strings(a.emails));
|
|
189
|
+
const userIds = actions.flatMap((a) => strings(a.userIds));
|
|
190
|
+
const resources = strings(condition.resources);
|
|
191
|
+
const resourceType = text(condition.resourceType);
|
|
192
|
+
return {
|
|
193
|
+
id: text(alert.id),
|
|
194
|
+
source: 'runtime-manager',
|
|
195
|
+
name: text(alert.name),
|
|
196
|
+
enabled: typeof alert.enabled === 'boolean' ? alert.enabled : undefined,
|
|
197
|
+
severity: severityLabel(alert.severity),
|
|
198
|
+
status: text(alert.status),
|
|
199
|
+
state: text(alert.state),
|
|
200
|
+
entity: {
|
|
201
|
+
type: (resourceType && RM_RESOURCE_TYPES[String(resourceType)]) ?? resourceType,
|
|
202
|
+
name: resources.length ? resources.join(', ') : undefined,
|
|
203
|
+
/** Every target, for filtering by membership. */
|
|
204
|
+
resources,
|
|
205
|
+
},
|
|
206
|
+
condition: { event: text(condition.type) },
|
|
207
|
+
...(text(alert.conditionType) !== undefined ? { conditionType: text(alert.conditionType) } : {}),
|
|
208
|
+
...(typeof alert.isSystem === 'boolean' ? { isSystem: alert.isSystem } : {}),
|
|
209
|
+
...(text(alert.productName) !== undefined ? { productName: text(alert.productName) } : {}),
|
|
210
|
+
recipientCount: emails.length + userIds.length,
|
|
211
|
+
...(options.reveal
|
|
212
|
+
? {
|
|
213
|
+
recipientDomains: [...new Set(emails.map(domainOf))].sort(),
|
|
214
|
+
actions: actions.map((a) => ({
|
|
215
|
+
type: a.type,
|
|
216
|
+
emails: strings(a.emails),
|
|
217
|
+
userIds: strings(a.userIds),
|
|
218
|
+
})),
|
|
219
|
+
}
|
|
220
|
+
: {}),
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
const EMAIL = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
224
|
+
/** Turn explicit notification inputs into the platform shape. At least one is required; there are no defaults. */
|
|
225
|
+
export function buildNotifications(inputs) {
|
|
226
|
+
if (!inputs?.length)
|
|
227
|
+
throw new Error('At least one notification is required (EMAIL recipients or a SLACK channel)');
|
|
228
|
+
return inputs.map((n, i) => {
|
|
229
|
+
if (n.type === 'EMAIL') {
|
|
230
|
+
if (!n.recipients?.length)
|
|
231
|
+
throw new Error(`notifications[${i}]: EMAIL needs at least one recipient`);
|
|
232
|
+
const bad = n.recipients.filter((r) => !EMAIL.test(r));
|
|
233
|
+
if (bad.length)
|
|
234
|
+
throw new Error(`notifications[${i}]: ${bad.length} recipient(s) are not email addresses`);
|
|
235
|
+
if (!n.subject?.trim())
|
|
236
|
+
throw new Error(`notifications[${i}]: EMAIL needs a subject`);
|
|
237
|
+
if (!n.message?.trim())
|
|
238
|
+
throw new Error(`notifications[${i}]: EMAIL needs a message`);
|
|
239
|
+
return { type: 'EMAIL', recipients: [...n.recipients], subject: n.subject, messageTemplate: n.message };
|
|
240
|
+
}
|
|
241
|
+
if (!n.channelId?.trim())
|
|
242
|
+
throw new Error(`notifications[${i}]: SLACK needs a channelId`);
|
|
243
|
+
if (!n.message?.trim())
|
|
244
|
+
throw new Error(`notifications[${i}]: SLACK needs a message`);
|
|
245
|
+
return {
|
|
246
|
+
type: 'SLACK',
|
|
247
|
+
channelId: n.channelId,
|
|
248
|
+
...(n.carrierId ? { carrierId: n.carrierId } : {}),
|
|
249
|
+
messageTemplate: n.message,
|
|
250
|
+
};
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
/** Convert and validate a threshold given in the metric's unit (percent for % metrics). */
|
|
254
|
+
export function storedThreshold(metric, value) {
|
|
255
|
+
const info = ALERT_METRICS[metric];
|
|
256
|
+
if (!Number.isFinite(value))
|
|
257
|
+
throw new Error('threshold must be a number');
|
|
258
|
+
if (info.unit === 'percent') {
|
|
259
|
+
if (value <= 0 || value > 100) {
|
|
260
|
+
throw new Error(`threshold for ${metric} is a percentage: more than 0 and at most 100 (got ${value})`);
|
|
261
|
+
}
|
|
262
|
+
return Math.round((value / 100) * 1e6) / 1e6;
|
|
263
|
+
}
|
|
264
|
+
if (value < 0)
|
|
265
|
+
throw new Error(`threshold for ${metric} must not be negative`);
|
|
266
|
+
if (info.unit === 'count' && !Number.isInteger(value)) {
|
|
267
|
+
throw new Error(`threshold for ${metric} is a count and must be a whole number`);
|
|
268
|
+
}
|
|
269
|
+
return value;
|
|
270
|
+
}
|
|
271
|
+
export function evaluationInterval(durationMinutes) {
|
|
272
|
+
if (!Number.isInteger(durationMinutes) || durationMinutes < 1 || durationMinutes > MAX_DURATION_MINUTES) {
|
|
273
|
+
throw new Error(`durationMinutes must be a whole number from 1 to ${MAX_DURATION_MINUTES}`);
|
|
274
|
+
}
|
|
275
|
+
return `${durationMinutes}m`;
|
|
276
|
+
}
|
|
277
|
+
export const checkSeverity = parseSeverity;
|
|
278
|
+
/** Resolve the alert entity from CloudHub 2.0 (an app) or API Manager (an API instance). */
|
|
279
|
+
export async function resolveAlertEntity(client, orgId, env, target, metric, filters) {
|
|
280
|
+
const info = ALERT_METRICS[metric];
|
|
281
|
+
if ('app' in target) {
|
|
282
|
+
if (info.entityType !== 'application')
|
|
283
|
+
throw new Error(`${metric} applies to an API instance, not an app`);
|
|
284
|
+
const deployment = await client.cloudHub2.findDetailByName(orgId, env.id, target.app);
|
|
285
|
+
if (!deployment) {
|
|
286
|
+
throw new Error(`Application "${target.app}" not found in CloudHub 2.0 in ${env.name}; alerts can be created for CloudHub 2.0 apps and API instances`);
|
|
287
|
+
}
|
|
288
|
+
return {
|
|
289
|
+
entityType: 'application',
|
|
290
|
+
subOrgId: orgId,
|
|
291
|
+
environmentId: env.id,
|
|
292
|
+
environmentName: env.name,
|
|
293
|
+
appId: deployment.name,
|
|
294
|
+
clusterId: deployment.target?.targetId,
|
|
295
|
+
deploymentType: 'CLOUDHUB2',
|
|
296
|
+
deploymentId: deployment.id,
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
if (info.entityType !== 'api')
|
|
300
|
+
throw new Error(`${metric} applies to an app, not an API instance`);
|
|
301
|
+
const resolved = await client.apiManager.resolveApiInstance(orgId, env, String(target.apiInstanceId));
|
|
302
|
+
if (!resolved.instance)
|
|
303
|
+
throw new Error(`API instance ${target.apiInstanceId} not found in ${env.name}`);
|
|
304
|
+
const apiFilters = [
|
|
305
|
+
...(filters?.responseCodes?.length
|
|
306
|
+
? [{ property: 'RESPONSE_CODE', operator: 'IN', values: filters.responseCodes }]
|
|
307
|
+
: []),
|
|
308
|
+
...(filters?.policies?.length
|
|
309
|
+
? [{ property: 'POLICY', operator: 'IN', values: filters.policies }]
|
|
310
|
+
: []),
|
|
311
|
+
];
|
|
312
|
+
if (info.requires && !apiFilters.some((f) => f.property === info.requires)) {
|
|
313
|
+
throw new Error(`${metric} needs apiFilters.${info.requires === 'RESPONSE_CODE' ? 'responseCodes' : 'policies'}`);
|
|
314
|
+
}
|
|
315
|
+
return {
|
|
316
|
+
entityType: 'api',
|
|
317
|
+
subOrgId: orgId,
|
|
318
|
+
environmentId: env.id,
|
|
319
|
+
environmentName: env.name,
|
|
320
|
+
apiName: resolved.asset?.exchangeAssetName ?? resolved.instance.assetId,
|
|
321
|
+
apiInstanceId: String(resolved.apiId),
|
|
322
|
+
...(resolved.instance.endpointUri ? { endpoint: resolved.instance.endpointUri } : {}),
|
|
323
|
+
...(apiFilters.length ? { filters: apiFilters } : {}),
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
export function sameEntity(a, b) {
|
|
327
|
+
if (!a || a.entityType !== b.entityType || a.environmentId !== b.environmentId)
|
|
328
|
+
return false;
|
|
329
|
+
return b.entityType === 'api' ? String(a.apiInstanceId) === String(b.apiInstanceId) : a.appId === b.appId;
|
|
330
|
+
}
|
|
331
|
+
/** Recipients outside the user's own email domain, as domains. The user's address is never returned. */
|
|
332
|
+
export function outsideDomains(notifications, userEmail) {
|
|
333
|
+
if (!userEmail || !userEmail.includes('@'))
|
|
334
|
+
return [];
|
|
335
|
+
const own = domainOf(userEmail);
|
|
336
|
+
return summarizeRecipients(notifications).recipientDomains.filter((d) => d !== own);
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* The create payload for a preview. For an API target only the instance ID the caller passed is shown;
|
|
340
|
+
* the API name and endpoint resolved from API Manager are sent but not printed.
|
|
341
|
+
*/
|
|
342
|
+
export function previewPayload(body) {
|
|
343
|
+
if (body.entity.entityType !== 'api')
|
|
344
|
+
return body;
|
|
345
|
+
const { apiName: _apiName, endpoint: _endpoint, ...entity } = body.entity;
|
|
346
|
+
return { ...body, entity: { ...entity, apiName: '(resolved from API Manager)' } };
|
|
347
|
+
}
|
|
348
|
+
export async function planCreateAlert(client, input, options = {}) {
|
|
349
|
+
const orgId = await client.getDefaultOrgId();
|
|
350
|
+
const env = await client.accessManagement.resolveEnvironment(orgId, input.environment);
|
|
351
|
+
if (!input.name?.trim())
|
|
352
|
+
throw new Error('name is required');
|
|
353
|
+
const info = ALERT_METRICS[input.metric];
|
|
354
|
+
if (!info)
|
|
355
|
+
throw new Error(`Unknown metric "${input.metric}"`);
|
|
356
|
+
const notifications = buildNotifications(input.notifications);
|
|
357
|
+
const settings = {
|
|
358
|
+
metricId: input.metric,
|
|
359
|
+
aggregationFunction: info.aggregation,
|
|
360
|
+
evaluationOperator: input.operator,
|
|
361
|
+
aggregationInterval: '1m',
|
|
362
|
+
threshold: storedThreshold(input.metric, input.threshold),
|
|
363
|
+
evaluationInterval: evaluationInterval(input.durationMinutes),
|
|
364
|
+
};
|
|
365
|
+
const entity = await resolveAlertEntity(client, orgId, env, input.target, input.metric, input.apiFilters);
|
|
366
|
+
const body = {
|
|
367
|
+
name: input.name.trim(),
|
|
368
|
+
severity: checkSeverity(input.severity),
|
|
369
|
+
enabled: input.enabled ?? false,
|
|
370
|
+
settings,
|
|
371
|
+
entity,
|
|
372
|
+
notifications,
|
|
373
|
+
};
|
|
374
|
+
const warnings = [];
|
|
375
|
+
let userEmail;
|
|
376
|
+
try {
|
|
377
|
+
userEmail = (await client.whoami()).email;
|
|
378
|
+
}
|
|
379
|
+
catch {
|
|
380
|
+
// Without the user's address the domain check is skipped.
|
|
381
|
+
}
|
|
382
|
+
const outside = outsideDomains(notifications, userEmail);
|
|
383
|
+
if (outside.length)
|
|
384
|
+
warnings.push(`Recipients outside your email domain: ${outside.join(', ')}`);
|
|
385
|
+
if (!body.enabled) {
|
|
386
|
+
warnings.push(`The alert is created disabled; enable it with ${options.enableHint ?? 'set_alert_enabled'} once reviewed.`);
|
|
387
|
+
}
|
|
388
|
+
const existing = await client.alerts.list(orgId, { environmentId: env.id, name: body.name });
|
|
389
|
+
const match = existing.find((a) => a.name === body.name && a.alertStatus !== 'DELETED' && sameEntity(a.entity, entity));
|
|
390
|
+
return {
|
|
391
|
+
orgId,
|
|
392
|
+
env,
|
|
393
|
+
body,
|
|
394
|
+
warnings,
|
|
395
|
+
...(match ? { duplicate: { id: match.id, name: match.name, status: match.alertStatus } } : {}),
|
|
396
|
+
};
|
|
397
|
+
}
|
|
398
|
+
/** Fields the platform returns but does not take back; everything else on the alert is resent. */
|
|
399
|
+
const READ_ONLY_ALERT_FIELDS = [
|
|
400
|
+
'alertStatus',
|
|
401
|
+
'state',
|
|
402
|
+
'notificationTemplates',
|
|
403
|
+
'createdAt',
|
|
404
|
+
'updatedAt',
|
|
405
|
+
'createdDate',
|
|
406
|
+
'updatedDate',
|
|
407
|
+
'lastModifiedDate',
|
|
408
|
+
];
|
|
409
|
+
export async function loadAlert(client, orgId, id) {
|
|
410
|
+
const alert = await client.alerts.get(orgId, id);
|
|
411
|
+
if (!alert || alert.alertStatus === 'DELETED')
|
|
412
|
+
throw new Error(`Alert ${id} not found (it may have been deleted)`);
|
|
413
|
+
return alert;
|
|
414
|
+
}
|
|
415
|
+
/** The environment an alert belongs to, for production checks. */
|
|
416
|
+
export async function alertEnvironment(client, orgId, alert) {
|
|
417
|
+
return client.accessManagement.resolveEnvironment(orgId, alert.entity.environmentId);
|
|
418
|
+
}
|
|
419
|
+
/** Read the alert, merge the patch, and build the full replacement body the platform needs. */
|
|
420
|
+
export async function planUpdateAlert(client, id, patch) {
|
|
421
|
+
const orgId = await client.getDefaultOrgId();
|
|
422
|
+
const existing = await loadAlert(client, orgId, id);
|
|
423
|
+
if (existing.alertStatus === 'PENDING')
|
|
424
|
+
throw new AlertPendingError(id);
|
|
425
|
+
const env = await alertEnvironment(client, orgId, existing);
|
|
426
|
+
const metric = existing.settings.metricId;
|
|
427
|
+
const settings = { ...existing.settings };
|
|
428
|
+
if (patch.operator !== undefined)
|
|
429
|
+
settings.evaluationOperator = patch.operator;
|
|
430
|
+
if (patch.threshold !== undefined) {
|
|
431
|
+
if (!metricInfo(metric))
|
|
432
|
+
throw new Error(`Unknown metric "${metric}"; threshold cannot be converted`);
|
|
433
|
+
settings.threshold = storedThreshold(metric, patch.threshold);
|
|
434
|
+
}
|
|
435
|
+
if (patch.durationMinutes !== undefined)
|
|
436
|
+
settings.evaluationInterval = evaluationInterval(patch.durationMinutes);
|
|
437
|
+
const writable = { ...existing };
|
|
438
|
+
for (const field of READ_ONLY_ALERT_FIELDS)
|
|
439
|
+
delete writable[field];
|
|
440
|
+
const body = {
|
|
441
|
+
...writable,
|
|
442
|
+
id: existing.id,
|
|
443
|
+
name: patch.name?.trim() || existing.name,
|
|
444
|
+
severity: patch.severity !== undefined ? checkSeverity(patch.severity) : existing.severity,
|
|
445
|
+
enabled: patch.enabled ?? existing.enabled,
|
|
446
|
+
settings,
|
|
447
|
+
entity: existing.entity,
|
|
448
|
+
notifications: patch.notifications ? buildNotifications(patch.notifications) : notificationsOf(existing),
|
|
449
|
+
};
|
|
450
|
+
const changes = [];
|
|
451
|
+
const push = (field, from, to) => {
|
|
452
|
+
if (JSON.stringify(from) !== JSON.stringify(to))
|
|
453
|
+
changes.push({ field, from, to });
|
|
454
|
+
};
|
|
455
|
+
push('name', existing.name, body.name);
|
|
456
|
+
push('severity', severityLabel(existing.severity), severityLabel(body.severity));
|
|
457
|
+
push('enabled', existing.enabled, body.enabled);
|
|
458
|
+
push('operator', existing.settings.evaluationOperator, settings.evaluationOperator);
|
|
459
|
+
push('threshold', displayThreshold(metric, existing.settings.threshold), displayThreshold(metric, settings.threshold));
|
|
460
|
+
push('windowMinutes', windowMinutes(existing.settings.evaluationInterval), windowMinutes(settings.evaluationInterval));
|
|
461
|
+
if (patch.notifications) {
|
|
462
|
+
// Compare the full bodies; show only the masked summary and which parts differ.
|
|
463
|
+
const differs = notificationDifferences(notificationsOf(existing), body.notifications);
|
|
464
|
+
if (differs.length) {
|
|
465
|
+
changes.push({
|
|
466
|
+
field: 'notifications',
|
|
467
|
+
from: describeNotifications(notificationsOf(existing)),
|
|
468
|
+
to: describeNotifications(body.notifications),
|
|
469
|
+
differs,
|
|
470
|
+
});
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
return { orgId, env, existing, body, changes, noop: changes.length === 0 };
|
|
474
|
+
}
|
|
475
|
+
// ── Delete ────────────────────────────────────────────
|
|
476
|
+
/**
|
|
477
|
+
* Find an alert in the list, narrowed by environment and name so the listing stays small. `complete`
|
|
478
|
+
* is false when the listing hit its page cap; absence from an incomplete listing proves nothing.
|
|
479
|
+
*/
|
|
480
|
+
export async function findListedAlert(client, orgId, alert) {
|
|
481
|
+
const { alerts, complete } = await client.alerts.listAll(orgId, {
|
|
482
|
+
...(alert.environmentId ? { environmentId: alert.environmentId } : {}),
|
|
483
|
+
...(alert.name ? { name: alert.name } : {}),
|
|
484
|
+
});
|
|
485
|
+
return { alert: alerts.find((a) => a.id === alert.id && a.alertStatus !== 'DELETED'), complete };
|
|
486
|
+
}
|
|
487
|
+
function applied(listed, body) {
|
|
488
|
+
const same = (a, b) => JSON.stringify(a) === JSON.stringify(b);
|
|
489
|
+
return (listed.name === body.name &&
|
|
490
|
+
listed.enabled === body.enabled &&
|
|
491
|
+
listed.severity === body.severity &&
|
|
492
|
+
same(listed.settings?.threshold, body.settings.threshold) &&
|
|
493
|
+
same(listed.settings?.evaluationOperator, body.settings.evaluationOperator) &&
|
|
494
|
+
same(listed.settings?.evaluationInterval, body.settings.evaluationInterval));
|
|
495
|
+
}
|
|
496
|
+
/**
|
|
497
|
+
* Send the full replacement, then re-read the alert from the list once. The platform answers 202 and
|
|
498
|
+
* applies the change asynchronously, so "updated" is claimed only when the list shows it applied.
|
|
499
|
+
*/
|
|
500
|
+
export async function executeUpdateAlert(client, plan) {
|
|
501
|
+
const id = plan.existing.id;
|
|
502
|
+
await client.alerts.update(plan.orgId, id, plan.body);
|
|
503
|
+
const { alert: listed } = await findListedAlert(client, plan.orgId, {
|
|
504
|
+
id,
|
|
505
|
+
name: plan.body.name,
|
|
506
|
+
environmentId: plan.existing.entity.environmentId,
|
|
507
|
+
});
|
|
508
|
+
const retry = 'The platform applies changes asynchronously; check again with get_alert or list_alerts in a minute.';
|
|
509
|
+
if (!listed) {
|
|
510
|
+
return {
|
|
511
|
+
accepted: true,
|
|
512
|
+
verified: false,
|
|
513
|
+
status: 'UNVERIFIED',
|
|
514
|
+
message: `Change accepted; the alert was not found in the list yet. ${retry}`,
|
|
515
|
+
};
|
|
516
|
+
}
|
|
517
|
+
if (listed.alertStatus === 'PENDING') {
|
|
518
|
+
return {
|
|
519
|
+
accepted: true,
|
|
520
|
+
verified: false,
|
|
521
|
+
status: 'PENDING',
|
|
522
|
+
message: `Change accepted; the alert is PENDING while the platform applies it. ${retry}`,
|
|
523
|
+
};
|
|
524
|
+
}
|
|
525
|
+
if (!applied(listed, plan.body)) {
|
|
526
|
+
return {
|
|
527
|
+
accepted: true,
|
|
528
|
+
verified: false,
|
|
529
|
+
status: 'ACTIVE',
|
|
530
|
+
message: `Change accepted, but the list still shows the previous values. ${retry}`,
|
|
531
|
+
};
|
|
532
|
+
}
|
|
533
|
+
return { accepted: true, verified: true, status: 'ACTIVE', message: `Updated alert "${plan.body.name}".` };
|
|
534
|
+
}
|
|
535
|
+
export const CHANGE_IN_PROGRESS = 'A change to this alert is in progress (PENDING); the platform refuses changes and deletion until it finishes. Retry later.';
|
|
536
|
+
/**
|
|
537
|
+
* Read an alert for deletion. The list is fresher than GET right after a change (GET can keep
|
|
538
|
+
* answering ACTIVE, or 404 while the list still shows PENDING), so the listed entry wins.
|
|
539
|
+
*/
|
|
540
|
+
export async function readAlertForDelete(client, orgId, id) {
|
|
541
|
+
const got = await client.alerts.get(orgId, id);
|
|
542
|
+
const { alert: listed } = await findListedAlert(client, orgId, {
|
|
543
|
+
id,
|
|
544
|
+
...(got ? { name: got.name, environmentId: got.entity.environmentId } : {}),
|
|
545
|
+
});
|
|
546
|
+
if (listed)
|
|
547
|
+
return listed;
|
|
548
|
+
return got && got.alertStatus !== 'DELETED' ? got : null;
|
|
549
|
+
}
|
|
550
|
+
/**
|
|
551
|
+
* Request deletion, then verify it from the list. Never claims deleted while the list still shows the
|
|
552
|
+
* alert, or when the listing was cut off. A 404 on DELETE with the alert absent from a complete
|
|
553
|
+
* listing means it is already gone.
|
|
554
|
+
*/
|
|
555
|
+
export async function executeDeleteAlert(client, orgId, alert) {
|
|
556
|
+
const outcome = await client.alerts.delete(orgId, alert.id);
|
|
557
|
+
const { alert: still, complete } = await findListedAlert(client, orgId, {
|
|
558
|
+
id: alert.id,
|
|
559
|
+
name: alert.name,
|
|
560
|
+
environmentId: alert.entity.environmentId,
|
|
561
|
+
});
|
|
562
|
+
if (!still && !complete) {
|
|
563
|
+
return {
|
|
564
|
+
accepted: outcome === 'accepted',
|
|
565
|
+
status: 'UNVERIFIED',
|
|
566
|
+
verifiedAbsent: false,
|
|
567
|
+
message: 'Deletion accepted, but it could not be verified: the alert list is longer than this tool reads. Check again with get_alert or list_alerts.',
|
|
568
|
+
};
|
|
569
|
+
}
|
|
570
|
+
if (!still) {
|
|
571
|
+
return {
|
|
572
|
+
accepted: outcome === 'accepted',
|
|
573
|
+
status: 'GONE',
|
|
574
|
+
verifiedAbsent: true,
|
|
575
|
+
message: outcome === 'accepted'
|
|
576
|
+
? 'Deleted; the alert no longer appears in the list.'
|
|
577
|
+
: 'Already gone: the platform no longer has the alert and it is not in the list.',
|
|
578
|
+
};
|
|
579
|
+
}
|
|
580
|
+
if (outcome === 'not-found') {
|
|
581
|
+
return {
|
|
582
|
+
accepted: false,
|
|
583
|
+
status: still.alertStatus === 'ACTIVE' ? 'ACTIVE' : 'PENDING',
|
|
584
|
+
verifiedAbsent: false,
|
|
585
|
+
message: `The platform answered not found but still lists the alert (${still.alertStatus}). ${CHANGE_IN_PROGRESS}`,
|
|
586
|
+
};
|
|
587
|
+
}
|
|
588
|
+
return {
|
|
589
|
+
accepted: true,
|
|
590
|
+
status: still.alertStatus === 'ACTIVE' ? 'ACTIVE' : 'PENDING',
|
|
591
|
+
verifiedAbsent: false,
|
|
592
|
+
message: 'Deletion accepted but not finished: the alert still appears in the list. Deletion is asynchronous and can take a while; check again with list_alerts.',
|
|
593
|
+
};
|
|
594
|
+
}
|
|
595
|
+
//# sourceMappingURL=alerts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alerts.js","sourceRoot":"","sources":["../../src/workflows/alerts.ts"],"names":[],"mappings":"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"}
|