@miragon/pulse-engine-core 0.0.0-bootstrap.0 → 0.25.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/LICENSE +21 -0
- package/dist/activities.d.ts +31 -0
- package/dist/activities.d.ts.map +1 -0
- package/dist/activities.js +62 -0
- package/dist/activities.js.map +1 -0
- package/dist/advance-plan.d.ts +21 -0
- package/dist/advance-plan.d.ts.map +1 -0
- package/dist/advance-plan.js +192 -0
- package/dist/advance-plan.js.map +1 -0
- package/dist/conditions.d.ts +66 -0
- package/dist/conditions.d.ts.map +1 -0
- package/dist/conditions.js +119 -0
- package/dist/conditions.js.map +1 -0
- package/dist/dates.d.ts +59 -0
- package/dist/dates.d.ts.map +1 -0
- package/dist/dates.js +189 -0
- package/dist/dates.js.map +1 -0
- package/dist/durations.d.ts +4 -0
- package/dist/durations.d.ts.map +1 -0
- package/dist/durations.js +10 -0
- package/dist/durations.js.map +1 -0
- package/dist/engine-status.d.ts +57 -0
- package/dist/engine-status.d.ts.map +1 -0
- package/dist/engine-status.js +193 -0
- package/dist/engine-status.js.map +1 -0
- package/dist/errors.d.ts +101 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +18 -0
- package/dist/errors.js.map +1 -0
- package/dist/filters.d.ts +53 -0
- package/dist/filters.d.ts.map +1 -0
- package/dist/filters.js +74 -0
- package/dist/filters.js.map +1 -0
- package/dist/findings.d.ts +46 -0
- package/dist/findings.d.ts.map +1 -0
- package/dist/findings.js +105 -0
- package/dist/findings.js.map +1 -0
- package/dist/incident-recovery.d.ts +35 -0
- package/dist/incident-recovery.d.ts.map +1 -0
- package/dist/incident-recovery.js +24 -0
- package/dist/incident-recovery.js.map +1 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/inspect.d.ts +34 -0
- package/dist/inspect.d.ts.map +1 -0
- package/dist/inspect.js +247 -0
- package/dist/inspect.js.map +1 -0
- package/dist/next.d.ts +26 -0
- package/dist/next.d.ts.map +1 -0
- package/dist/next.js +83 -0
- package/dist/next.js.map +1 -0
- package/dist/operations.d.ts +9 -0
- package/dist/operations.d.ts.map +1 -0
- package/dist/operations.js +41 -0
- package/dist/operations.js.map +1 -0
- package/dist/poll.d.ts +24 -0
- package/dist/poll.d.ts.map +1 -0
- package/dist/poll.js +29 -0
- package/dist/poll.js.map +1 -0
- package/dist/port.d.ts +95 -0
- package/dist/port.d.ts.map +1 -0
- package/dist/port.js +113 -0
- package/dist/port.js.map +1 -0
- package/dist/records.d.ts +27 -0
- package/dist/records.d.ts.map +1 -0
- package/dist/records.js +58 -0
- package/dist/records.js.map +1 -0
- package/dist/requests.d.ts +24 -0
- package/dist/requests.d.ts.map +1 -0
- package/dist/requests.js +35 -0
- package/dist/requests.js.map +1 -0
- package/dist/retry-plan.d.ts +62 -0
- package/dist/retry-plan.d.ts.map +1 -0
- package/dist/retry-plan.js +140 -0
- package/dist/retry-plan.js.map +1 -0
- package/dist/root-cause.d.ts +17 -0
- package/dist/root-cause.d.ts.map +1 -0
- package/dist/root-cause.js +35 -0
- package/dist/root-cause.js.map +1 -0
- package/dist/select.d.ts +16 -0
- package/dist/select.d.ts.map +1 -0
- package/dist/select.js +133 -0
- package/dist/select.js.map +1 -0
- package/dist/snapshot.d.ts +12 -0
- package/dist/snapshot.d.ts.map +1 -0
- package/dist/snapshot.js +134 -0
- package/dist/snapshot.js.map +1 -0
- package/dist/sorting.d.ts +20 -0
- package/dist/sorting.d.ts.map +1 -0
- package/dist/sorting.js +17 -0
- package/dist/sorting.js.map +1 -0
- package/dist/status.d.ts +91 -0
- package/dist/status.d.ts.map +1 -0
- package/dist/status.js +222 -0
- package/dist/status.js.map +1 -0
- package/dist/testing/fake-port.d.ts +31 -0
- package/dist/testing/fake-port.d.ts.map +1 -0
- package/dist/testing/fake-port.js +50 -0
- package/dist/testing/fake-port.js.map +1 -0
- package/dist/testing/fixture.d.ts +39 -0
- package/dist/testing/fixture.d.ts.map +1 -0
- package/dist/testing/fixture.js +288 -0
- package/dist/testing/fixture.js.map +1 -0
- package/dist/testing/index.d.ts +23 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +23 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/inspect-routes.d.ts +12 -0
- package/dist/testing/inspect-routes.d.ts.map +1 -0
- package/dist/testing/inspect-routes.js +63 -0
- package/dist/testing/inspect-routes.js.map +1 -0
- package/dist/testing/status.d.ts +18 -0
- package/dist/testing/status.d.ts.map +1 -0
- package/dist/testing/status.js +12 -0
- package/dist/testing/status.js.map +1 -0
- package/dist/testing/waits.d.ts +60 -0
- package/dist/testing/waits.d.ts.map +1 -0
- package/dist/testing/waits.js +53 -0
- package/dist/testing/waits.js.map +1 -0
- package/dist/timeline.d.ts +9 -0
- package/dist/timeline.d.ts.map +1 -0
- package/dist/timeline.js +63 -0
- package/dist/timeline.js.map +1 -0
- package/dist/tree.d.ts +19 -0
- package/dist/tree.d.ts.map +1 -0
- package/dist/tree.js +61 -0
- package/dist/tree.js.map +1 -0
- package/dist/types.d.ts +254 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/util.d.ts +26 -0
- package/dist/util.d.ts.map +1 -0
- package/dist/util.js +44 -0
- package/dist/util.js.map +1 -0
- package/dist/variable-writes.d.ts +32 -0
- package/dist/variable-writes.d.ts.map +1 -0
- package/dist/variable-writes.js +113 -0
- package/dist/variable-writes.js.map +1 -0
- package/dist/variables.d.ts +28 -0
- package/dist/variables.d.ts.map +1 -0
- package/dist/variables.js +64 -0
- package/dist/variables.js.map +1 -0
- package/dist/waits.d.ts +11 -0
- package/dist/waits.d.ts.map +1 -0
- package/dist/waits.js +253 -0
- package/dist/waits.js.map +1 -0
- package/package.json +47 -5
package/dist/dates.js
ADDED
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Engine dates. CIB seven / Camunda 7 / Operaton parse EVERY date (query
|
|
3
|
+
* filters, request bodies, `Date` variables) with one Java pattern,
|
|
4
|
+
* `yyyy-MM-dd'T'HH:mm:ss.SSSZ`, where `Z` is a `±HHMM` offset. A literal "Z",
|
|
5
|
+
* an offset with a colon, missing milliseconds or a bare date are all 400s.
|
|
6
|
+
* Callers therefore accept ordinary ISO 8601 at their boundary and convert it
|
|
7
|
+
* here, once: one parser, read in one of two {@link DateInputReading}s.
|
|
8
|
+
*
|
|
9
|
+
* The read direction has two readers as well: {@link engineDateMillis} (this
|
|
10
|
+
* parser, an offset required) and {@link engineTime} (`Date.parse`, which also
|
|
11
|
+
* reads an offset-less time, in the local zone). Both are kept as they are
|
|
12
|
+
* until the two readings are aligned (a behaviour change, not a move).
|
|
13
|
+
*/
|
|
14
|
+
/** The relaxed spellings; a time needs its offset. The default of every function here. */
|
|
15
|
+
export const OFFSET_REQUIRED = "offset-required";
|
|
16
|
+
/** The strict spellings; a time without an offset is UTC. */
|
|
17
|
+
export const UTC_WITHOUT_OFFSET = "utc-without-offset";
|
|
18
|
+
const READING_RULES = {
|
|
19
|
+
[OFFSET_REQUIRED]: { assumeUtc: false, relaxed: true },
|
|
20
|
+
[UTC_WITHOUT_OFFSET]: { assumeUtc: true, relaxed: false },
|
|
21
|
+
};
|
|
22
|
+
/** Example of the accepted input forms of {@link OFFSET_REQUIRED}, for error messages and descriptions. */
|
|
23
|
+
export const ENGINE_DATE_INPUT_FORMS = "ISO 8601: a date (2026-10-01, midnight UTC) or a date-time with offset (2026-10-01T08:30:00Z, 2026-10-01T08:30:00.000+02:00)";
|
|
24
|
+
// date [ sep time [ fraction ] [ offset ] ]: the union of both readings' spellings; `isAccepted`
|
|
25
|
+
// refuses what the reading does not accept.
|
|
26
|
+
const ISO_INPUT = /^(\d{4})-(\d{2})-(\d{2})(?:([Tt ])(\d{2}):(\d{2})(?::(\d{2})(?:([.,])(\d+))?)?([Zz]|[+-]\d{2}(?::?\d{2})?)?)?$/;
|
|
27
|
+
const pad = (value, width = 2) => String(value).padStart(width, "0");
|
|
28
|
+
/** `Z` / `+02` / `+02:00` / `+0200` → `+0000` / `+0200` (null when out of range). */
|
|
29
|
+
function engineOffset(raw) {
|
|
30
|
+
if (raw === undefined || raw === "Z" || raw === "z")
|
|
31
|
+
return "+0000";
|
|
32
|
+
const digits = raw.slice(1).replace(":", "");
|
|
33
|
+
const hours = Number(digits.slice(0, 2));
|
|
34
|
+
const minutes = digits.length > 2 ? Number(digits.slice(2)) : 0;
|
|
35
|
+
if (hours > 23 || minutes > 59)
|
|
36
|
+
return null;
|
|
37
|
+
return `${raw[0]}${pad(hours)}${pad(minutes)}`;
|
|
38
|
+
}
|
|
39
|
+
function isLeapYear(year) {
|
|
40
|
+
return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
|
|
41
|
+
}
|
|
42
|
+
function daysInMonth(year, month) {
|
|
43
|
+
if (month === 2)
|
|
44
|
+
return isLeapYear(year) ? 29 : 28;
|
|
45
|
+
return [4, 6, 9, 11].includes(month) ? 30 : 31;
|
|
46
|
+
}
|
|
47
|
+
/** The day exists: `Date.UTC` rolls 2026-02-30 over to March (relaxed), or the Gregorian calendar. */
|
|
48
|
+
function isCalendarDay(parts, relaxed) {
|
|
49
|
+
if (!relaxed) {
|
|
50
|
+
return (parts.month >= 1 &&
|
|
51
|
+
parts.month <= 12 &&
|
|
52
|
+
parts.day >= 1 &&
|
|
53
|
+
parts.day <= daysInMonth(parts.year, parts.month));
|
|
54
|
+
}
|
|
55
|
+
const probe = new Date(Date.UTC(parts.year, parts.month - 1, parts.day));
|
|
56
|
+
return probe.getUTCMonth() === parts.month - 1 && probe.getUTCDate() === parts.day;
|
|
57
|
+
}
|
|
58
|
+
/** The strict spellings: `T`, `.`, and `Z` or an offset with its minutes (`±HHMM`, `±HH:MM`). */
|
|
59
|
+
function isStrictSpelling(separator, point, zone) {
|
|
60
|
+
return ((separator ?? "T") === "T" &&
|
|
61
|
+
(point ?? ".") === "." &&
|
|
62
|
+
(zone === undefined || zone === "Z" || zone.length > 3));
|
|
63
|
+
}
|
|
64
|
+
/** A time without an offset only as `assumeUtc`; the spellings of the reading. */
|
|
65
|
+
function isAccepted(match, reading) {
|
|
66
|
+
const [, , , , separator, hour, , , point, fraction, zone] = match;
|
|
67
|
+
if (hour !== undefined && zone === undefined && !reading.assumeUtc)
|
|
68
|
+
return false;
|
|
69
|
+
return reading.relaxed ? (fraction?.length ?? 0) <= 9 : isStrictSpelling(separator, point, zone);
|
|
70
|
+
}
|
|
71
|
+
function toParts(match, offset) {
|
|
72
|
+
const [, y, mo, d, , h, mi, s, , fraction] = match;
|
|
73
|
+
return {
|
|
74
|
+
year: Number(y),
|
|
75
|
+
month: Number(mo),
|
|
76
|
+
day: Number(d),
|
|
77
|
+
hour: Number(h ?? 0),
|
|
78
|
+
minute: Number(mi ?? 0),
|
|
79
|
+
second: Number(s ?? 0),
|
|
80
|
+
// The engine keeps milliseconds; finer digits are cut, never rounded up
|
|
81
|
+
// into the next second.
|
|
82
|
+
millis: (fraction ?? "").slice(0, 3).padEnd(3, "0"),
|
|
83
|
+
offset,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
function isClockTime(parts) {
|
|
87
|
+
return parts.hour <= 23 && parts.minute <= 59 && parts.second <= 59;
|
|
88
|
+
}
|
|
89
|
+
function parse(input, readingName) {
|
|
90
|
+
const reading = READING_RULES[readingName];
|
|
91
|
+
const match = ISO_INPUT.exec(reading.relaxed ? input.trim() : input);
|
|
92
|
+
if (!match || !isAccepted(match, reading))
|
|
93
|
+
return null;
|
|
94
|
+
const offset = engineOffset(match[10]);
|
|
95
|
+
if (offset === null)
|
|
96
|
+
return null;
|
|
97
|
+
const parts = toParts(match, offset);
|
|
98
|
+
return isClockTime(parts) && isCalendarDay(parts, reading.relaxed) ? parts : null;
|
|
99
|
+
}
|
|
100
|
+
/** Whether `input` is an ISO 8601 date the reading can convert. */
|
|
101
|
+
export function isEngineDateInput(input, reading = OFFSET_REQUIRED) {
|
|
102
|
+
return parse(input, reading) !== null;
|
|
103
|
+
}
|
|
104
|
+
/** The engine format of an ISO 8601 date input; undefined when the reading refuses it. */
|
|
105
|
+
export function engineDateInput(input, reading = OFFSET_REQUIRED) {
|
|
106
|
+
const parts = parse(input, reading);
|
|
107
|
+
if (!parts)
|
|
108
|
+
return undefined;
|
|
109
|
+
const date = `${pad(parts.year, 4)}-${pad(parts.month)}-${pad(parts.day)}`;
|
|
110
|
+
const time = `${pad(parts.hour)}:${pad(parts.minute)}:${pad(parts.second)}.${parts.millis}`;
|
|
111
|
+
return `${date}T${time}${parts.offset}`;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* ISO 8601 (or a `Date`) → the engine's `yyyy-MM-dd'T'HH:mm:ss.SSS±HHMM`.
|
|
115
|
+
* A string keeps its own offset (`Z` becomes `+0000`), so the instant is
|
|
116
|
+
* unchanged; a bare date means midnight UTC; a `Date` is written in UTC.
|
|
117
|
+
* Throws a `RangeError` naming the accepted forms for anything else
|
|
118
|
+
* (read as {@link OFFSET_REQUIRED}).
|
|
119
|
+
*/
|
|
120
|
+
export function toEngineDate(input) {
|
|
121
|
+
if (input instanceof Date) {
|
|
122
|
+
if (Number.isNaN(input.getTime()))
|
|
123
|
+
throw new RangeError("Invalid date: not a valid Date");
|
|
124
|
+
return input.toISOString().replace("Z", "+0000");
|
|
125
|
+
}
|
|
126
|
+
const engine = engineDateInput(input);
|
|
127
|
+
if (engine === undefined) {
|
|
128
|
+
throw new RangeError(`Invalid date "${input}": expected ${ENGINE_DATE_INPUT_FORMS}`);
|
|
129
|
+
}
|
|
130
|
+
return engine;
|
|
131
|
+
}
|
|
132
|
+
/** {@link toEngineDate} for optional filters: `undefined` stays `undefined`. */
|
|
133
|
+
export function toOptionalEngineDate(input) {
|
|
134
|
+
return input === undefined ? undefined : toEngineDate(input);
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* The read direction: a timestamp the engine EMITS (`…SSS±HHMM`, its local
|
|
138
|
+
* offset) → epoch millis; null when absent or unparseable. Engine timestamps
|
|
139
|
+
* order by instant, never as text: across a DST change the engine stamps
|
|
140
|
+
* `…+0200` and `…+0100`, and the string order is then off by up to an hour.
|
|
141
|
+
*/
|
|
142
|
+
export function engineDateMillis(value) {
|
|
143
|
+
const parts = value ? parse(value, OFFSET_REQUIRED) : null;
|
|
144
|
+
if (!parts)
|
|
145
|
+
return null;
|
|
146
|
+
const sign = parts.offset.startsWith("-") ? -1 : 1;
|
|
147
|
+
const offsetMinutes = sign * (Number(parts.offset.slice(1, 3)) * 60 + Number(parts.offset.slice(3, 5)));
|
|
148
|
+
const local = Date.UTC(parts.year, parts.month - 1, parts.day, parts.hour, parts.minute, parts.second, Number(parts.millis));
|
|
149
|
+
return local - offsetMinutes * 60_000;
|
|
150
|
+
}
|
|
151
|
+
/** The engine timestamp `pick` prefers by instant, returned as given; null when none parses. */
|
|
152
|
+
function pickEngineDate(values, pick) {
|
|
153
|
+
let best = null;
|
|
154
|
+
for (const value of values) {
|
|
155
|
+
// absent values never parse
|
|
156
|
+
if (typeof value !== "string")
|
|
157
|
+
continue;
|
|
158
|
+
const millis = engineDateMillis(value);
|
|
159
|
+
if (millis !== null && (best === null || pick(millis, best.millis)))
|
|
160
|
+
best = { value, millis };
|
|
161
|
+
}
|
|
162
|
+
return best?.value ?? null;
|
|
163
|
+
}
|
|
164
|
+
/** The newest of the given engine timestamps by instant (as given); null when none parses. */
|
|
165
|
+
export function latestEngineDate(values) {
|
|
166
|
+
return pickEngineDate(values, (candidate, best) => candidate > best);
|
|
167
|
+
}
|
|
168
|
+
/** The oldest of the given engine timestamps by instant (as given); null when none parses. */
|
|
169
|
+
export function earliestEngineDate(values) {
|
|
170
|
+
return pickEngineDate(values, (candidate, best) => candidate < best);
|
|
171
|
+
}
|
|
172
|
+
/** RFC 822 offsets (`+0200`) as ISO offsets (`+02:00`), which every Date parser accepts. */
|
|
173
|
+
const RFC822_OFFSET = /([+-]\d{2})(\d{2})$/;
|
|
174
|
+
/**
|
|
175
|
+
* Milliseconds of an engine timestamp (`2024-05-01T10:00:00.000+0200`), or undefined. Read by
|
|
176
|
+
* `Date.parse`: unlike {@link engineDateMillis} it also reads a time without an offset (in the
|
|
177
|
+
* local zone).
|
|
178
|
+
*/
|
|
179
|
+
export function engineTime(value) {
|
|
180
|
+
if (value === undefined)
|
|
181
|
+
return undefined;
|
|
182
|
+
const time = Date.parse(value.replace(RFC822_OFFSET, "$1:$2"));
|
|
183
|
+
return Number.isNaN(time) ? undefined : time;
|
|
184
|
+
}
|
|
185
|
+
/** An instant in the engine format, in UTC: `2024-05-01T08:00:00.000+0000`. */
|
|
186
|
+
export function engineFormat(ms) {
|
|
187
|
+
return new Date(ms).toISOString().replace("Z", "+0000");
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=dates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dates.js","sourceRoot":"","sources":["../src/dates.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"durations.d.ts","sourceRoot":"","sources":["../src/durations.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAS3D,6FAA6F;AAC7F,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAGjD"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** Durations as the workflow messages print them. Pure. */
|
|
2
|
+
const UNITS = { ms: 1, s: 1000, m: 60_000, h: 3_600_000 };
|
|
3
|
+
/** The largest unit first: `formatDuration` prints the largest exact one. */
|
|
4
|
+
const LARGEST_FIRST = ["h", "m", "s"];
|
|
5
|
+
/** The duration in its largest exact unit: 90000 → `90s`, 120000 → `2m`, 1500 → `1500ms`. */
|
|
6
|
+
export function formatDuration(ms) {
|
|
7
|
+
const unit = LARGEST_FIRST.find((candidate) => ms % UNITS[candidate] === 0);
|
|
8
|
+
return unit === undefined ? `${ms}ms` : `${ms / UNITS[unit]}${unit}`;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=durations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"durations.js","sourceRoot":"","sources":["../src/durations.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAE3D,MAAM,KAAK,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAW,CAAA;AAIlE,6EAA6E;AAC7E,MAAM,aAAa,GAAoB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;AAEtD,6FAA6F;AAC7F,MAAM,UAAU,cAAc,CAAC,EAAU;IACvC,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAA;IAC3E,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,CAAA;AACtE,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The status triage of one engine in one call. Round 1 loads version, statistics, incidents,
|
|
3
|
+
* external tasks, jobs, tasks and batches in parallel, round 2 the root cause of each incident
|
|
4
|
+
* group shown; the findings name their next step.
|
|
5
|
+
*/
|
|
6
|
+
import { type EngineStatus, type Finding } from "./findings.js";
|
|
7
|
+
import { type EnginePort, type PlannedRequest } from "./port.js";
|
|
8
|
+
import { type DefinitionStatus, type GroupStep, type IncidentGroup, type JobStatus, type TopicStatus } from "./status.js";
|
|
9
|
+
export interface StatusOptions {
|
|
10
|
+
/** Process definition keys to look at; empty for the whole engine. */
|
|
11
|
+
readonly keys: readonly string[];
|
|
12
|
+
/**
|
|
13
|
+
* How long an executable job or a waiting external task may wait before it is a finding;
|
|
14
|
+
* `STALE_AFTER_MS` when left out.
|
|
15
|
+
*/
|
|
16
|
+
readonly staleAfterMs?: number;
|
|
17
|
+
/** Incident groups shown (with their root cause) at most; `MAX_GROUPS` when left out. */
|
|
18
|
+
readonly maxGroups?: number;
|
|
19
|
+
/** The tie-break of equal incident groups; `defaultGroupOrder` when left out. */
|
|
20
|
+
readonly compareGroupSteps?: (left: GroupStep, right: GroupStep) => number;
|
|
21
|
+
}
|
|
22
|
+
/** The status of one engine; `next` steps structured, the engine without its address. */
|
|
23
|
+
export interface StatusData {
|
|
24
|
+
readonly engine: {
|
|
25
|
+
readonly version: string | null;
|
|
26
|
+
readonly latencyMs: number;
|
|
27
|
+
};
|
|
28
|
+
readonly status: EngineStatus;
|
|
29
|
+
readonly findings: readonly Finding[];
|
|
30
|
+
readonly definitions: readonly DefinitionStatus[];
|
|
31
|
+
readonly incidents: readonly IncidentGroup[];
|
|
32
|
+
readonly incidentsTotal: number;
|
|
33
|
+
readonly propagated: number;
|
|
34
|
+
readonly externalTasks: readonly TopicStatus[];
|
|
35
|
+
readonly jobs: JobStatus;
|
|
36
|
+
readonly tasks: {
|
|
37
|
+
readonly open: number;
|
|
38
|
+
};
|
|
39
|
+
readonly batches?: {
|
|
40
|
+
readonly running: number;
|
|
41
|
+
readonly withFailures: number;
|
|
42
|
+
};
|
|
43
|
+
readonly truncated?: readonly string[];
|
|
44
|
+
}
|
|
45
|
+
export interface StatusDeps {
|
|
46
|
+
readonly port: EnginePort;
|
|
47
|
+
readonly now: () => number;
|
|
48
|
+
}
|
|
49
|
+
/** The requests of round 1, as a preview shows them (lists with their first page). */
|
|
50
|
+
export declare function statusRequests(options: StatusOptions, now: number): PlannedRequest[];
|
|
51
|
+
/**
|
|
52
|
+
* The status of the engine behind `deps.port`: findings with their severity, the overall status,
|
|
53
|
+
* definitions, incident groups with their root cause, topics, jobs, tasks and batches; every cut
|
|
54
|
+
* named in `truncated`. Reads `deps.now` once at the start and twice around the version request.
|
|
55
|
+
*/
|
|
56
|
+
export declare function readStatus(deps: StatusDeps, statusOptions: StatusOptions): Promise<StatusData>;
|
|
57
|
+
//# sourceMappingURL=engine-status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine-status.d.ts","sourceRoot":"","sources":["../src/engine-status.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,OAAO,EAA0B,MAAM,eAAe,CAAA;AAEvF,OAAO,EAAE,KAAK,UAAU,EAAY,KAAK,cAAc,EAAyB,MAAM,WAAW,CAAA;AAIjG,OAAO,EACL,KAAK,gBAAgB,EAErB,KAAK,SAAS,EAEd,KAAK,aAAa,EAClB,KAAK,SAAS,EAEd,KAAK,WAAW,EAGjB,MAAM,aAAa,CAAA;AAQpB,MAAM,WAAW,aAAa;IAC5B,sEAAsE;IACtE,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAA;IAChC;;;OAGG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;IAC9B,yFAAyF;IACzF,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,iFAAiF;IACjF,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,KAAK,MAAM,CAAA;CAC3E;AAaD,yFAAyF;AACzF,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,EAAE;QACf,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;QAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;KAC3B,CAAA;IACD,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;IAC7B,QAAQ,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAA;IACrC,QAAQ,CAAC,WAAW,EAAE,SAAS,gBAAgB,EAAE,CAAA;IACjD,QAAQ,CAAC,SAAS,EAAE,SAAS,aAAa,EAAE,CAAA;IAC5C,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,aAAa,EAAE,SAAS,WAAW,EAAE,CAAA;IAC9C,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;IACxB,QAAQ,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;IACzC,QAAQ,CAAC,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAA;IAC9E,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CACvC;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,MAAM,CAAA;CAC3B;AA6DD,sFAAsF;AACtF,wBAAgB,cAAc,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,GAAG,cAAc,EAAE,CAcpF;AAiGD;;;;GAIG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,UAAU,EAChB,aAAa,EAAE,aAAa,GAC3B,OAAO,CAAC,UAAU,CAAC,CAwCrB"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The status triage of one engine in one call. Round 1 loads version, statistics, incidents,
|
|
3
|
+
* external tasks, jobs, tasks and batches in parallel, round 2 the root cause of each incident
|
|
4
|
+
* group shown; the findings name their next step.
|
|
5
|
+
*/
|
|
6
|
+
import { EXECUTABLE } from "./conditions.js";
|
|
7
|
+
import { findings, engineStatus } from "./findings.js";
|
|
8
|
+
import { incidentCause } from "./inspect.js";
|
|
9
|
+
import { PARALLEL, pageQuery } from "./port.js";
|
|
10
|
+
import { engineFormat } from "./dates.js";
|
|
11
|
+
import { amount, countOf, records, str } from "./records.js";
|
|
12
|
+
import { queryInput } from "./requests.js";
|
|
13
|
+
import { definitionStatus, groupIncidents, jobStatus, topicStatus, unknownKeys, } from "./status.js";
|
|
14
|
+
import { compact, mapLimit, omit } from "./util.js";
|
|
15
|
+
/** How long an executable job or a waiting external task may wait by default: 5 minutes. */
|
|
16
|
+
const STALE_AFTER_MS = 300_000;
|
|
17
|
+
/** Incident groups shown (with their root cause) by default. */
|
|
18
|
+
const MAX_GROUPS = 10;
|
|
19
|
+
function resolved(options) {
|
|
20
|
+
return {
|
|
21
|
+
...options,
|
|
22
|
+
staleAfterMs: options.staleAfterMs ?? STALE_AFTER_MS,
|
|
23
|
+
maxGroups: options.maxGroups ?? MAX_GROUPS,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/** Incidents and external tasks loaded at most. */
|
|
27
|
+
const LIST_CAP = 2000;
|
|
28
|
+
const STALE_JOBS = 1000;
|
|
29
|
+
const BATCHES = 100;
|
|
30
|
+
const PAGE = 500;
|
|
31
|
+
function request(operationId, query = {}) {
|
|
32
|
+
return { operationId, input: queryInput(query) };
|
|
33
|
+
}
|
|
34
|
+
function requests(options, now) {
|
|
35
|
+
const keyIn = options.keys.length > 0 ? options.keys.join(",") : undefined;
|
|
36
|
+
const filter = { processDefinitionKeyIn: keyIn };
|
|
37
|
+
const perKey = options.keys.length > 0 ? options.keys : [undefined];
|
|
38
|
+
const createTimes = `lt_${engineFormat(now - options.staleAfterMs)}`;
|
|
39
|
+
return {
|
|
40
|
+
version: request("getRestAPIVersion"),
|
|
41
|
+
statistics: request("getProcessDefinitionStatistics", {
|
|
42
|
+
failedJobs: "true",
|
|
43
|
+
rootIncidents: "true",
|
|
44
|
+
}),
|
|
45
|
+
incidentCount: request("getIncidentsCount", filter),
|
|
46
|
+
externalTaskCount: request("getExternalTasksCount", filter),
|
|
47
|
+
taskCount: request("getTasksCount", filter),
|
|
48
|
+
incidents: { sortBy: "incidentTimestamp", sortOrder: "desc", ...filter },
|
|
49
|
+
externalTasks: filter,
|
|
50
|
+
jobCounts: perKey.map((key) => request("getJobsCount", { ...EXECUTABLE, processDefinitionKey: key })),
|
|
51
|
+
staleJobs: perKey.map((key) => request("getJobs", {
|
|
52
|
+
...EXECUTABLE,
|
|
53
|
+
createTimes,
|
|
54
|
+
maxResults: String(STALE_JOBS),
|
|
55
|
+
processDefinitionKey: key,
|
|
56
|
+
})),
|
|
57
|
+
...compact({
|
|
58
|
+
batches: keyIn === undefined
|
|
59
|
+
? request("getBatchStatistics", { maxResults: String(BATCHES) })
|
|
60
|
+
: undefined,
|
|
61
|
+
}),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/** The requests of round 1, as a preview shows them (lists with their first page). */
|
|
65
|
+
export function statusRequests(options, now) {
|
|
66
|
+
const all = requests(resolved(options), now);
|
|
67
|
+
return [
|
|
68
|
+
all.version,
|
|
69
|
+
all.statistics,
|
|
70
|
+
request("getIncidents", pageQuery(all.incidents, 0, PAGE)),
|
|
71
|
+
all.incidentCount,
|
|
72
|
+
request("getExternalTasks", pageQuery(all.externalTasks, 0, PAGE)),
|
|
73
|
+
all.externalTaskCount,
|
|
74
|
+
...all.jobCounts,
|
|
75
|
+
...all.staleJobs,
|
|
76
|
+
all.taskCount,
|
|
77
|
+
...(all.batches === undefined ? [] : [all.batches]),
|
|
78
|
+
];
|
|
79
|
+
}
|
|
80
|
+
async function value(port, planned) {
|
|
81
|
+
return port.json(planned.operationId, planned.input);
|
|
82
|
+
}
|
|
83
|
+
async function timedVersion(deps, planned) {
|
|
84
|
+
const started = deps.now();
|
|
85
|
+
const version = await value(deps.port, planned);
|
|
86
|
+
return {
|
|
87
|
+
version: str(records([version])[0], "version") ?? null,
|
|
88
|
+
latencyMs: deps.now() - started,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
async function roundOne(deps, all) {
|
|
92
|
+
const { port } = deps;
|
|
93
|
+
const counts = (list) => Promise.all(list.map(async (planned) => countOf(await value(port, planned))));
|
|
94
|
+
const [version, statistics, incidents, incidentCount, externalTasks, externalTaskCount, jobCounts, staleJobs, openTasks, batches,] = await Promise.all([
|
|
95
|
+
timedVersion(deps, all.version),
|
|
96
|
+
value(port, all.statistics),
|
|
97
|
+
port.list("getIncidents", all.incidents, LIST_CAP),
|
|
98
|
+
value(port, all.incidentCount),
|
|
99
|
+
port.list("getExternalTasks", all.externalTasks, LIST_CAP),
|
|
100
|
+
value(port, all.externalTaskCount),
|
|
101
|
+
counts(all.jobCounts),
|
|
102
|
+
Promise.all(all.staleJobs.map(async (planned) => records(await value(port, planned)))),
|
|
103
|
+
value(port, all.taskCount),
|
|
104
|
+
all.batches === undefined ? undefined : value(port, all.batches),
|
|
105
|
+
]);
|
|
106
|
+
return {
|
|
107
|
+
...version,
|
|
108
|
+
statistics: records(statistics),
|
|
109
|
+
incidents,
|
|
110
|
+
incidentCount: countOf(incidentCount),
|
|
111
|
+
externalTasks,
|
|
112
|
+
externalTaskCount: countOf(externalTaskCount),
|
|
113
|
+
executableJobs: jobCounts.reduce((sum, count) => sum + count, 0),
|
|
114
|
+
staleJobs: staleJobs.flat(),
|
|
115
|
+
// a key's page that reached the cap may hide more overdue jobs, whatever the other keys hold
|
|
116
|
+
staleJobsCut: staleJobs.some((page) => page.length >= STALE_JOBS),
|
|
117
|
+
openTasks: countOf(openTasks),
|
|
118
|
+
...compact({ batches: batches === undefined ? undefined : records(batches) }),
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
function truncation(data, groups, options) {
|
|
122
|
+
const notes = [];
|
|
123
|
+
if (data.incidents.truncated)
|
|
124
|
+
notes.push(`incidents: ${data.incidents.items.length} of ${data.incidentCount} loaded`);
|
|
125
|
+
if (data.externalTasks.truncated)
|
|
126
|
+
notes.push(`externalTasks: ${data.externalTasks.items.length} of ${data.externalTaskCount} loaded`);
|
|
127
|
+
if (data.staleJobsCut)
|
|
128
|
+
notes.push(`jobs: the first ${STALE_JOBS} overdue candidates loaded`);
|
|
129
|
+
if (groups > options.maxGroups)
|
|
130
|
+
notes.push(`incident groups: ${options.maxGroups} of ${groups} shown`);
|
|
131
|
+
return notes;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Round 2: the incident groups (without the failed jobs of batches, which BATCH_FAILURES reports)
|
|
135
|
+
* and the root cause of each group shown.
|
|
136
|
+
*/
|
|
137
|
+
async function incidentGroups(port, data, options) {
|
|
138
|
+
const failedBatches = (data.batches ?? []).filter((batch) => amount(batch, "failedJobs") > 0);
|
|
139
|
+
const grouped = groupIncidents(data.incidents.items, data.statistics, new Set(failedBatches.flatMap((batch) => str(batch, "batchJobDefinitionId") ?? [])), options.compareGroupSteps);
|
|
140
|
+
const shown = grouped.groups.slice(0, options.maxGroups);
|
|
141
|
+
const causes = await mapLimit(shown, PARALLEL, (group) => incidentCause(port, group.newest, false));
|
|
142
|
+
const incidents = shown.map((group, index) => ({
|
|
143
|
+
...omit(group, "newest"),
|
|
144
|
+
...compact({ rootCause: causes[index]?.rootCause }),
|
|
145
|
+
}));
|
|
146
|
+
return { grouped, incidents };
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* The status of the engine behind `deps.port`: findings with their severity, the overall status,
|
|
150
|
+
* definitions, incident groups with their root cause, topics, jobs, tasks and batches; every cut
|
|
151
|
+
* named in `truncated`. Reads `deps.now` once at the start and twice around the version request.
|
|
152
|
+
*/
|
|
153
|
+
export async function readStatus(deps, statusOptions) {
|
|
154
|
+
const options = resolved(statusOptions);
|
|
155
|
+
const now = deps.now();
|
|
156
|
+
const data = await roundOne(deps, requests(options, now));
|
|
157
|
+
const { grouped, incidents } = await incidentGroups(deps.port, data, options);
|
|
158
|
+
const externalTasks = topicStatus(data.externalTasks.items, now);
|
|
159
|
+
const jobs = jobStatus(data.executableJobs, data.staleJobs, now - options.staleAfterMs);
|
|
160
|
+
const batches = data.batches ?? [];
|
|
161
|
+
const list = findings({
|
|
162
|
+
jobs,
|
|
163
|
+
incidents,
|
|
164
|
+
externalTasks,
|
|
165
|
+
batches,
|
|
166
|
+
unknownKeys: unknownKeys(data.statistics, options.keys),
|
|
167
|
+
staleAfterMs: options.staleAfterMs,
|
|
168
|
+
now,
|
|
169
|
+
});
|
|
170
|
+
const notes = truncation(data, grouped.groups.length, options);
|
|
171
|
+
return {
|
|
172
|
+
engine: { version: data.version, latencyMs: data.latencyMs },
|
|
173
|
+
status: engineStatus(list),
|
|
174
|
+
findings: list,
|
|
175
|
+
definitions: definitionStatus(data.statistics, options.keys),
|
|
176
|
+
incidents,
|
|
177
|
+
incidentsTotal: data.incidentCount,
|
|
178
|
+
propagated: grouped.propagated,
|
|
179
|
+
externalTasks,
|
|
180
|
+
jobs,
|
|
181
|
+
tasks: { open: data.openTasks },
|
|
182
|
+
...compact({
|
|
183
|
+
batches: data.batches === undefined
|
|
184
|
+
? undefined
|
|
185
|
+
: {
|
|
186
|
+
running: batches.length,
|
|
187
|
+
withFailures: batches.filter((batch) => amount(batch, "failedJobs") > 0).length,
|
|
188
|
+
},
|
|
189
|
+
truncated: notes.length > 0 ? notes : undefined,
|
|
190
|
+
}),
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=engine-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine-status.js","sourceRoot":"","sources":["../src/engine-status.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAmC,QAAQ,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AACvF,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAmB,QAAQ,EAAuB,SAAS,EAAc,MAAM,WAAW,CAAA;AACjG,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AACzC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAY,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAA;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,EAEL,gBAAgB,EAEhB,cAAc,EAGd,SAAS,EAET,WAAW,EACX,WAAW,GACZ,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEnD,4FAA4F;AAC5F,MAAM,cAAc,GAAG,OAAO,CAAA;AAC9B,gEAAgE;AAChE,MAAM,UAAU,GAAG,EAAE,CAAA;AAmBrB,SAAS,QAAQ,CAAC,OAAsB;IACtC,OAAO;QACL,GAAG,OAAO;QACV,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,cAAc;QACpD,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,UAAU;KAC3C,CAAA;AACH,CAAC;AA0BD,mDAAmD;AACnD,MAAM,QAAQ,GAAG,IAAI,CAAA;AACrB,MAAM,UAAU,GAAG,IAAI,CAAA;AACvB,MAAM,OAAO,GAAG,GAAG,CAAA;AACnB,MAAM,IAAI,GAAG,GAAG,CAAA;AAehB,SAAS,OAAO,CAAC,WAAmB,EAAE,QAAe,EAAE;IACrD,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,EAAE,CAAA;AAClD,CAAC;AAED,SAAS,QAAQ,CAAC,OAAiB,EAAE,GAAW;IAC9C,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAC1E,MAAM,MAAM,GAAG,EAAE,sBAAsB,EAAE,KAAK,EAAE,CAAA;IAChD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;IACnE,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,GAAG,GAAG,OAAO,CAAC,YAAY,CAAC,EAAE,CAAA;IACpE,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,mBAAmB,CAAC;QACrC,UAAU,EAAE,OAAO,CAAC,gCAAgC,EAAE;YACpD,UAAU,EAAE,MAAM;YAClB,aAAa,EAAE,MAAM;SACtB,CAAC;QACF,aAAa,EAAE,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC;QACnD,iBAAiB,EAAE,OAAO,CAAC,uBAAuB,EAAE,MAAM,CAAC;QAC3D,SAAS,EAAE,OAAO,CAAC,eAAe,EAAE,MAAM,CAAC;QAC3C,SAAS,EAAE,EAAE,MAAM,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;QACxE,aAAa,EAAE,MAAM;QACrB,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAC5B,OAAO,CAAC,cAAc,EAAE,EAAE,GAAG,UAAU,EAAE,oBAAoB,EAAE,GAAG,EAAE,CAAC,CACtE;QACD,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAC5B,OAAO,CAAC,SAAS,EAAE;YACjB,GAAG,UAAU;YACb,WAAW;YACX,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC;YAC9B,oBAAoB,EAAE,GAAG;SAC1B,CAAC,CACH;QACD,GAAG,OAAO,CAAC;YACT,OAAO,EACL,KAAK,KAAK,SAAS;gBACjB,CAAC,CAAC,OAAO,CAAC,oBAAoB,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;gBAChE,CAAC,CAAC,SAAS;SAChB,CAAC;KACH,CAAA;AACH,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,cAAc,CAAC,OAAsB,EAAE,GAAW;IAChE,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,CAAA;IAC5C,OAAO;QACL,GAAG,CAAC,OAAO;QACX,GAAG,CAAC,UAAU;QACd,OAAO,CAAC,cAAc,EAAE,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QAC1D,GAAG,CAAC,aAAa;QACjB,OAAO,CAAC,kBAAkB,EAAE,SAAS,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QAClE,GAAG,CAAC,iBAAiB;QACrB,GAAG,GAAG,CAAC,SAAS;QAChB,GAAG,GAAG,CAAC,SAAS;QAChB,GAAG,CAAC,SAAS;QACb,GAAG,CAAC,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;KACpD,CAAA;AACH,CAAC;AAED,KAAK,UAAU,KAAK,CAAC,IAAgB,EAAE,OAAuB;IAC5D,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,KAAK,CAAC,CAAA;AACtD,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,IAAgB,EAAE,OAAuB;IACnE,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IAC1B,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAC/C,OAAO;QACL,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,IAAI,IAAI;QACtD,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO;KAChC,CAAA;AACH,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,IAAgB,EAAE,GAAa;IACrD,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAA;IACrB,MAAM,MAAM,GAAG,CAAC,IAA+B,EAAE,EAAE,CACjD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;IAC/E,MAAM,CACJ,OAAO,EACP,UAAU,EACV,SAAS,EACT,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,SAAS,EACT,SAAS,EACT,SAAS,EACT,OAAO,EACR,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACpB,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC;QAC/B,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,UAAU,CAAC;QAC3B,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC;QAClD,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,aAAa,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,CAAC,aAAa,EAAE,QAAQ,CAAC;QAC1D,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,iBAAiB,CAAC;QAClC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;QACtF,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,SAAS,CAAC;QAC1B,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC;KACjE,CAAC,CAAA;IACF,OAAO;QACL,GAAG,OAAO;QACV,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC;QAC/B,SAAS;QACT,aAAa,EAAE,OAAO,CAAC,aAAa,CAAC;QACrC,aAAa;QACb,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,CAAC;QAC7C,cAAc,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC;QAChE,SAAS,EAAE,SAAS,CAAC,IAAI,EAAE;QAC3B,6FAA6F;QAC7F,YAAY,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,IAAI,UAAU,CAAC;QACjE,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC;QAC7B,GAAG,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;KAC9E,CAAA;AACH,CAAC;AAID,SAAS,UAAU,CAAC,IAAc,EAAE,MAAc,EAAE,OAAiB;IACnE,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS;QAC1B,KAAK,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,OAAO,IAAI,CAAC,aAAa,SAAS,CAAC,CAAA;IACzF,IAAI,IAAI,CAAC,aAAa,CAAC,SAAS;QAC9B,KAAK,CAAC,IAAI,CACR,kBAAkB,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,OAAO,IAAI,CAAC,iBAAiB,SAAS,CACxF,CAAA;IACH,IAAI,IAAI,CAAC,YAAY;QAAE,KAAK,CAAC,IAAI,CAAC,mBAAmB,UAAU,4BAA4B,CAAC,CAAA;IAC5F,IAAI,MAAM,GAAG,OAAO,CAAC,SAAS;QAC5B,KAAK,CAAC,IAAI,CAAC,oBAAoB,OAAO,CAAC,SAAS,OAAO,MAAM,QAAQ,CAAC,CAAA;IACxE,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,cAAc,CAAC,IAAgB,EAAE,IAAc,EAAE,OAAiB;IAC/E,MAAM,aAAa,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAA;IAC7F,MAAM,OAAO,GAAG,cAAc,CAC5B,IAAI,CAAC,SAAS,CAAC,KAAK,EACpB,IAAI,CAAC,UAAU,EACf,IAAI,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,sBAAsB,CAAC,IAAI,EAAE,CAAC,CAAC,EACnF,OAAO,CAAC,iBAAiB,CAC1B,CAAA;IACD,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAA;IACxD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CACvD,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CACzC,CAAA;IACD,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QAC7C,GAAG,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC;QACxB,GAAG,OAAO,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC;KACpD,CAAC,CAAC,CAAA;IACH,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAA;AAC/B,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,IAAgB,EAChB,aAA4B;IAE5B,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAA;IACvC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IACtB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAA;IACzD,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;IAC7E,MAAM,aAAa,GAAG,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IAChE,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,EAAE,GAAG,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;IACvF,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAA;IAClC,MAAM,IAAI,GAAG,QAAQ,CAAC;QACpB,IAAI;QACJ,SAAS;QACT,aAAa;QACb,OAAO;QACP,WAAW,EAAE,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC;QACvD,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,GAAG;KACJ,CAAC,CAAA;IACF,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9D,OAAO;QACL,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE;QAC5D,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC;QAC1B,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,gBAAgB,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC;QAC5D,SAAS;QACT,cAAc,EAAE,IAAI,CAAC,aAAa;QAClC,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,aAAa;QACb,IAAI;QACJ,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE;QAC/B,GAAG,OAAO,CAAC;YACT,OAAO,EACL,IAAI,CAAC,OAAO,KAAK,SAAS;gBACxB,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC;oBACE,OAAO,EAAE,OAAO,CAAC,MAAM;oBACvB,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,KAAU,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM;iBACrF;YACP,SAAS,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;SAChD,CAAC;KACH,CAAA;AACH,CAAC"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The errors of the workflow domain: a structured reason, never a message to show. A caller
|
|
3
|
+
* renders each reason in its own words (the CLI's flags and commands, the MCP tools' parameter
|
|
4
|
+
* names).
|
|
5
|
+
*/
|
|
6
|
+
import type { AdvanceOption, Candidate, InstanceState, Selection, WaitKind, WaitState } from "./types.js";
|
|
7
|
+
/** Why a workflow refused or failed, with what a message about it needs. */
|
|
8
|
+
export type WorkflowErrorReason =
|
|
9
|
+
/** An id together with filters or `latest`. */
|
|
10
|
+
{
|
|
11
|
+
readonly kind: "selection-conflict";
|
|
12
|
+
}
|
|
13
|
+
/** Neither an id nor a filter; `latest` tells whether `latest` was given alone. */
|
|
14
|
+
| {
|
|
15
|
+
readonly kind: "selection-missing";
|
|
16
|
+
readonly latest: boolean;
|
|
17
|
+
} | {
|
|
18
|
+
readonly kind: "selection-not-found";
|
|
19
|
+
readonly selection: Selection;
|
|
20
|
+
}
|
|
21
|
+
/** The first 10 merged candidates, in order; `more` when the engine had more matches. */
|
|
22
|
+
| {
|
|
23
|
+
readonly kind: "selection-ambiguous";
|
|
24
|
+
readonly selection: Selection;
|
|
25
|
+
readonly candidates: readonly Candidate[];
|
|
26
|
+
readonly more: boolean;
|
|
27
|
+
}
|
|
28
|
+
/** `latest` among several running instances without a history to order them. */
|
|
29
|
+
| {
|
|
30
|
+
readonly kind: "latest-needs-history";
|
|
31
|
+
} | {
|
|
32
|
+
readonly kind: "instance-missing";
|
|
33
|
+
readonly id: string;
|
|
34
|
+
} | {
|
|
35
|
+
readonly kind: "condition-invalid";
|
|
36
|
+
readonly raw: string;
|
|
37
|
+
readonly forms: readonly string[];
|
|
38
|
+
} | {
|
|
39
|
+
readonly kind: "retry-selection-conflict";
|
|
40
|
+
} | {
|
|
41
|
+
readonly kind: "retry-selection-missing";
|
|
42
|
+
} | {
|
|
43
|
+
readonly kind: "retry-too-many";
|
|
44
|
+
readonly max: number;
|
|
45
|
+
readonly processDefinitionKey?: string;
|
|
46
|
+
} | {
|
|
47
|
+
readonly kind: "advance-input";
|
|
48
|
+
readonly rule: "bpmn-error-excludes-fail" | "error-message-needs-bpmn-error" | "retries-need-fail";
|
|
49
|
+
} | {
|
|
50
|
+
readonly kind: "advance-ended";
|
|
51
|
+
readonly id: string;
|
|
52
|
+
readonly state: InstanceState;
|
|
53
|
+
} | {
|
|
54
|
+
readonly kind: "advance-suspended";
|
|
55
|
+
readonly id: string;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Nothing to move (at `activityId`): `waiting` are the advanceable wait states, `conditional`
|
|
59
|
+
* tells a conditional event, `firstChildId` the first called instance of a cut tree.
|
|
60
|
+
*/
|
|
61
|
+
| {
|
|
62
|
+
readonly kind: "advance-nothing";
|
|
63
|
+
readonly id: string;
|
|
64
|
+
readonly activityId?: string;
|
|
65
|
+
readonly waiting: readonly {
|
|
66
|
+
readonly activityId: string;
|
|
67
|
+
readonly kind: WaitKind;
|
|
68
|
+
}[];
|
|
69
|
+
readonly conditional: boolean;
|
|
70
|
+
readonly firstChildId?: string;
|
|
71
|
+
}
|
|
72
|
+
/** Several wait states could move: `waits` in the order of the view. */
|
|
73
|
+
| {
|
|
74
|
+
readonly kind: "advance-ambiguous";
|
|
75
|
+
readonly id: string;
|
|
76
|
+
readonly waits: readonly WaitState[];
|
|
77
|
+
}
|
|
78
|
+
/** `appliesTo`: the wait kinds the option applies to, in the order the rule lists them. */
|
|
79
|
+
| {
|
|
80
|
+
readonly kind: "advance-option-kind";
|
|
81
|
+
readonly option: AdvanceOption;
|
|
82
|
+
readonly appliesTo: readonly WaitKind[];
|
|
83
|
+
readonly activityId: string;
|
|
84
|
+
readonly waitKind: WaitKind;
|
|
85
|
+
} | {
|
|
86
|
+
readonly kind: "advance-job-suspended";
|
|
87
|
+
readonly jobId: string;
|
|
88
|
+
readonly activityId: string;
|
|
89
|
+
} | {
|
|
90
|
+
readonly kind: "advance-locked";
|
|
91
|
+
readonly externalTaskId: string;
|
|
92
|
+
readonly workerId: string;
|
|
93
|
+
readonly lockExpirationTime?: string;
|
|
94
|
+
};
|
|
95
|
+
/** A refusal or failure of the workflow domain; its message is the reason's kind. */
|
|
96
|
+
export declare class WorkflowError extends Error {
|
|
97
|
+
readonly reason: WorkflowErrorReason;
|
|
98
|
+
constructor(reason: WorkflowErrorReason);
|
|
99
|
+
}
|
|
100
|
+
export declare function isWorkflowError(error: unknown): error is WorkflowError;
|
|
101
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The errors of the workflow domain: a structured reason, never a message to show. A caller
|
|
3
|
+
* renders each reason in its own words (the CLI's flags and commands, the MCP tools' parameter
|
|
4
|
+
* names).
|
|
5
|
+
*/
|
|
6
|
+
/** A refusal or failure of the workflow domain; its message is the reason's kind. */
|
|
7
|
+
export class WorkflowError extends Error {
|
|
8
|
+
reason;
|
|
9
|
+
constructor(reason) {
|
|
10
|
+
super(reason.kind);
|
|
11
|
+
this.name = "WorkflowError";
|
|
12
|
+
this.reason = reason;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export function isWorkflowError(error) {
|
|
16
|
+
return error instanceof WorkflowError;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAkFH,qFAAqF;AACrF,MAAM,OAAO,aAAc,SAAQ,KAAK;IAC7B,MAAM,CAAqB;IAEpC,YAAY,MAA2B;QACrC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAClB,IAAI,CAAC,IAAI,GAAG,eAAe,CAAA;QAC3B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;CACF;AAED,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,OAAO,KAAK,YAAY,aAAa,CAAA;AACvC,CAAC"}
|