@kici-dev/engine 0.1.27 → 0.3.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/dist/approval/types.d.ts +8 -1
- package/dist/approval/types.js +8 -1
- package/dist/artifacts/name.d.ts +60 -0
- package/dist/artifacts/name.js +71 -0
- package/dist/audit/access-log-policy.d.ts +1 -1
- package/dist/audit/access-log-policy.js +8 -0
- package/dist/audit/activity.d.ts +12 -12
- package/dist/audit/retention-policy.js +16 -0
- package/dist/billing/plan-type.d.ts +53 -0
- package/dist/billing/plan-type.js +70 -0
- package/dist/bundler/rolldown-config.d.ts +3 -3
- package/dist/check-mode.d.ts +1 -1
- package/dist/context/concurrency-strategy.d.ts +34 -0
- package/dist/context/concurrency-strategy.js +35 -0
- package/dist/context/held-run-job-id.d.ts +45 -0
- package/dist/context/held-run-job-id.js +56 -0
- package/dist/context/held-run-status.d.ts +33 -0
- package/dist/context/held-run-status.js +37 -0
- package/dist/context/hold-expiry.d.ts +20 -0
- package/dist/context/hold-expiry.js +25 -0
- package/dist/context/hold-reason.d.ts +33 -0
- package/dist/context/hold-reason.js +23 -0
- package/dist/context/hold-type.d.ts +40 -0
- package/dist/context/hold-type.js +61 -0
- package/dist/context/index.d.ts +9 -1
- package/dist/context/index.js +9 -2
- package/dist/context/multi-context.d.ts +3 -3
- package/dist/context/scope-name.d.ts +29 -0
- package/dist/context/scope-name.js +49 -0
- package/dist/context/scope-resolver.d.ts +33 -0
- package/dist/context/scope-resolver.js +45 -15
- package/dist/context/types.d.ts +8 -5
- package/dist/dev-ops/operations.d.ts +8 -0
- package/dist/dev-ops/operations.js +36 -19
- package/dist/diagnostics/infra-alert.d.ts +71 -0
- package/dist/diagnostics/infra-alert.js +60 -0
- package/dist/env/environment-allowlist.d.ts +4 -4
- package/dist/fanout/materialize.d.ts +16 -0
- package/dist/fanout/materialize.js +32 -3
- package/dist/index.d.ts +15 -6
- package/dist/index.js +34 -19
- package/dist/inputs/descriptor.d.ts +9 -9
- package/dist/inventory.d.ts +4 -4
- package/dist/labels.d.ts +82 -2
- package/dist/labels.js +119 -1
- package/dist/matrix/expand.d.ts +49 -2
- package/dist/matrix/expand.js +102 -13
- package/dist/matrix/format.d.ts +6 -1
- package/dist/matrix/format.js +6 -1
- package/dist/mcp/held-run-resolve.d.ts +7 -10
- package/dist/mcp/held-run-resolve.js +33 -7
- package/dist/metrics/catalog-policy.js +4 -4
- package/dist/metrics/metric-catalog.generated.d.ts +959 -739
- package/dist/metrics/metric-catalog.generated.js +284 -20
- package/dist/metrics/metric-kind-compat.d.ts +26 -0
- package/dist/metrics/metric-kind-compat.js +33 -0
- package/dist/protocol/analytics-events.d.ts +6 -6
- package/dist/protocol/dashboard-api-errors.d.ts +1 -0
- package/dist/protocol/dashboard-api-errors.js +5 -1
- package/dist/protocol/dashboard-write-operations.d.ts +143 -86
- package/dist/protocol/dashboard-write-operations.js +91 -17
- package/dist/protocol/messages/access-log.d.ts +437 -392
- package/dist/protocol/messages/access-log.js +11 -2
- package/dist/protocol/messages/actor.d.ts +2 -2
- package/dist/protocol/messages/agent-dev-ops.d.ts +4 -2
- package/dist/protocol/messages/agent-dev-ops.js +2 -5
- package/dist/protocol/messages/agent-run-result.d.ts +72 -62
- package/dist/protocol/messages/auth.d.ts +35 -23
- package/dist/protocol/messages/browser.d.ts +81 -5
- package/dist/protocol/messages/browser.js +53 -2
- package/dist/protocol/messages/capabilities.d.ts +106 -31
- package/dist/protocol/messages/capabilities.js +94 -10
- package/dist/protocol/messages/common.d.ts +45 -2
- package/dist/protocol/messages/common.js +64 -3
- package/dist/protocol/messages/dashboard-sealed-write.d.ts +52 -0
- package/dist/protocol/messages/dashboard-sealed-write.js +57 -0
- package/dist/protocol/messages/dashboard.d.ts +1026 -498
- package/dist/protocol/messages/dashboard.js +208 -31
- package/dist/protocol/messages/deployment-identity.d.ts +37 -10
- package/dist/protocol/messages/deployment-identity.js +30 -3
- package/dist/protocol/messages/event-log.d.ts +5 -5
- package/dist/protocol/messages/execution-status.d.ts +189 -53
- package/dist/protocol/messages/execution-status.js +108 -40
- package/dist/protocol/messages/heartbeat-health.d.ts +83 -0
- package/dist/protocol/messages/heartbeat-health.js +87 -0
- package/dist/protocol/messages/log-stream.d.ts +18 -0
- package/dist/protocol/messages/log-stream.js +19 -0
- package/dist/protocol/messages/oidc-mint.d.ts +7 -0
- package/dist/protocol/messages/oidc-mint.js +7 -0
- package/dist/protocol/messages/orchestrator-agent.d.ts +264 -67
- package/dist/protocol/messages/orchestrator-agent.js +170 -5
- package/dist/protocol/messages/pat-kind.d.ts +1 -1
- package/dist/protocol/messages/peer.d.ts +122 -58
- package/dist/protocol/messages/peer.js +37 -2
- package/dist/protocol/messages/platform-orchestrator.d.ts +561 -217
- package/dist/protocol/messages/platform-orchestrator.js +131 -21
- package/dist/protocol/messages/run-events.d.ts +5 -5
- package/dist/protocol/messages/scaler-event.d.ts +3 -3
- package/dist/protocol/messages/source-registration.d.ts +56 -13
- package/dist/protocol/messages/source-registration.js +49 -6
- package/dist/protocol/source-origin.d.ts +1 -1
- package/dist/provenance/attestation-origin.d.ts +1 -1
- package/dist/provenance/schema.d.ts +11 -11
- package/dist/provenance/verify.js +2 -1
- package/dist/provider/changed-files-fetcher.d.ts +21 -2
- package/dist/provider/check-run-conclusion.d.ts +2 -2
- package/dist/provider/check-status-poster.d.ts +23 -0
- package/dist/provider/index.d.ts +2 -2
- package/dist/registration/registerable-trigger-type.d.ts +14 -13
- package/dist/registration/registerable-trigger-type.js +1 -0
- package/dist/sandbox/capabilities.d.ts +6 -0
- package/dist/sandbox/capabilities.js +57 -0
- package/dist/scaler/scaler-backend-type.d.ts +1 -1
- package/dist/status/presentation.d.ts +89 -0
- package/dist/status/presentation.js +163 -0
- package/dist/trigger/compiled-matchers.d.ts +13 -0
- package/dist/trigger/compiled-matchers.js +44 -0
- package/dist/trigger/event-buckets.d.ts +44 -0
- package/dist/trigger/event-buckets.js +93 -0
- package/dist/trigger/matcher.d.ts +7 -3
- package/dist/trigger/matcher.js +53 -15
- package/dist/trigger/schedule-key.d.ts +14 -0
- package/dist/trigger/schedule-key.js +21 -0
- package/dist/trigger/trigger-event-type.d.ts +1 -1
- package/dist/trigger/trigger-event-type.js +2 -0
- package/dist/trigger/types.d.ts +173 -43
- package/dist/trigger/types.js +82 -25
- package/dist/webhook/event-types.d.ts +56 -0
- package/dist/webhook/event-types.js +59 -0
- package/dist/ws/ws-like.d.ts +13 -0
- package/package.json +12 -4
- package/sbom.spdx.json +10 -10
- package/dist/environment/host-match.d.ts +0 -25
- package/dist/environment/index.d.ts +0 -6
- package/dist/environment/multi-env.d.ts +0 -30
- package/dist/environment/scope-resolver.d.ts +0 -46
- package/dist/environment/scope-template.d.ts +0 -18
- package/dist/environment/types.d.ts +0 -119
- package/dist/package-manager.d.ts +0 -20
- package/dist/protocol/messages/observe.d.ts +0 -76
- package/dist/protocol/messages/saas-orchestrator.d.ts +0 -2179
- package/dist/protocol/messages/test-run.d.ts +0 -59
- package/dist/state-machine/index.d.ts +0 -2
- package/dist/state-machine/index.js +0 -3
- package/dist/state-machine/machine.d.ts +0 -34
- package/dist/state-machine/machine.js +0 -103
- package/dist/state-machine/types.d.ts +0 -34
- package/dist/state-machine/types.js +0 -15
package/dist/matrix/expand.js
CHANGED
|
@@ -1,10 +1,65 @@
|
|
|
1
1
|
import "../rolldown-runtime-ClRpJifh.js";
|
|
2
2
|
//#region src/matrix/expand.ts
|
|
3
3
|
/**
|
|
4
|
+
* Thrown when a matrix value does not match the documented contract — a
|
|
5
|
+
* `string[]` or a `Record<string, string[]>`. A static matrix is guaranteed by
|
|
6
|
+
* the lock-file schema, but a dynamic matrix returns arbitrary runtime data, so
|
|
7
|
+
* the contract has to be enforced here rather than by the type system.
|
|
8
|
+
*/
|
|
9
|
+
var MatrixShapeError = class MatrixShapeError extends Error {
|
|
10
|
+
name = "MatrixShapeError";
|
|
11
|
+
constructor(message) {
|
|
12
|
+
super(message);
|
|
13
|
+
Object.setPrototypeOf(this, MatrixShapeError.prototype);
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
/** Describe a rejected value for an error message, without dumping it wholesale. */
|
|
17
|
+
function describeValue(value) {
|
|
18
|
+
if (value === null) return "null";
|
|
19
|
+
if (value === void 0) return "undefined";
|
|
20
|
+
if (Array.isArray(value)) return "an array";
|
|
21
|
+
if (typeof value === "string") return `a string (${JSON.stringify(value)})`;
|
|
22
|
+
if (typeof value === "object") return "an object";
|
|
23
|
+
return `a ${typeof value}`;
|
|
24
|
+
}
|
|
25
|
+
/** Coerce one matrix element, rejecting anything that has no sensible string form. */
|
|
26
|
+
function coerceElement(value, where) {
|
|
27
|
+
if (typeof value === "string") return value;
|
|
28
|
+
if (typeof value === "number" || typeof value === "boolean") return String(value);
|
|
29
|
+
throw new MatrixShapeError(`matrix ${where} must contain strings, got ${describeValue(value)}`);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Validate and normalize a matrix value. Accepts the two documented shapes,
|
|
33
|
+
* coercing numeric and boolean elements to strings (they already reach job
|
|
34
|
+
* names as strings), and rejects everything else with the contract in the
|
|
35
|
+
* message. Dimensions are sorted here so expansion stays deterministic.
|
|
36
|
+
*/
|
|
37
|
+
function normalizeMatrixInput(input) {
|
|
38
|
+
if (Array.isArray(input)) return {
|
|
39
|
+
kind: "array",
|
|
40
|
+
values: Array.from(input, (v, i) => coerceElement(v, `values[${i}]`))
|
|
41
|
+
};
|
|
42
|
+
if (input === null || typeof input !== "object") {
|
|
43
|
+
const suffix = typeof input === "string" ? " — a bare string is read as one dimension per character; split it into an array" : "";
|
|
44
|
+
throw new MatrixShapeError(`matrix must be a string array or an object of string arrays, got ${describeValue(input)}${suffix}`);
|
|
45
|
+
}
|
|
46
|
+
const dimensions = [];
|
|
47
|
+
for (const [name, values] of Object.entries(input)) {
|
|
48
|
+
if (!Array.isArray(values)) throw new MatrixShapeError(`matrix dimension "${name}" must be an array, got ${describeValue(values)}`);
|
|
49
|
+
dimensions.push([name, Array.from(values, (v, i) => coerceElement(v, `dimension "${name}"[${i}]`))]);
|
|
50
|
+
}
|
|
51
|
+
dimensions.sort((a, b) => a[0].localeCompare(b[0]));
|
|
52
|
+
return {
|
|
53
|
+
kind: "object",
|
|
54
|
+
dimensions
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
4
58
|
* Compute the cartesian product of the given value sets in row-major order.
|
|
5
59
|
* An empty set list yields a single empty tuple; any empty set yields no tuples.
|
|
6
60
|
*/
|
|
7
61
|
function cartesianProduct(sets) {
|
|
62
|
+
if (sets.some((set) => set.length === 0)) return [];
|
|
8
63
|
return sets.reduce((acc, set) => acc.flatMap((tuple) => set.map((value) => [...tuple, value])), [[]]);
|
|
9
64
|
}
|
|
10
65
|
/**
|
|
@@ -24,20 +79,54 @@ function expandMultiDimension(matrix) {
|
|
|
24
79
|
if (dimensions.length === 0) return [];
|
|
25
80
|
dimensions.sort((a, b) => a[0].localeCompare(b[0]));
|
|
26
81
|
const names = dimensions.map(([name]) => name);
|
|
27
|
-
return cartesianProduct(dimensions.map(([, values]) => values)).map((combo) =>
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
82
|
+
return cartesianProduct(dimensions.map(([, values]) => values)).map((combo) => Object.fromEntries(names.map((name, idx) => [name, combo[idx]])));
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Validated entry point: normalizes an untrusted matrix value, then dispatches
|
|
86
|
+
* to single- or multi-dimensional expansion. {@link expandSingleDimension} and
|
|
87
|
+
* {@link expandMultiDimension} remain available for a caller that already holds
|
|
88
|
+
* a typed value; this is the one to use for anything crossing a runtime
|
|
89
|
+
* boundary, such as the return value of a dynamic matrix function.
|
|
90
|
+
*/
|
|
91
|
+
function expandMatrix(input) {
|
|
92
|
+
const normalized = normalizeMatrixInput(input);
|
|
93
|
+
if (normalized.kind === "array") return expandSingleDimension(normalized.values);
|
|
94
|
+
return expandMultiDimension(Object.fromEntries(normalized.dimensions));
|
|
34
95
|
}
|
|
35
96
|
/**
|
|
36
|
-
*
|
|
97
|
+
* How many combinations a matrix would expand to, computed WITHOUT building
|
|
98
|
+
* them. Callers use this to refuse an oversized matrix before allocating it —
|
|
99
|
+
* the product is checked, never materialized.
|
|
37
100
|
*/
|
|
38
|
-
function
|
|
39
|
-
|
|
40
|
-
|
|
101
|
+
function matrixCombinationCount(input) {
|
|
102
|
+
const normalized = normalizeMatrixInput(input);
|
|
103
|
+
if (normalized.kind === "array") return normalized.values.length;
|
|
104
|
+
if (normalized.dimensions.length === 0) return 0;
|
|
105
|
+
return normalized.dimensions.reduce((acc, [, values]) => acc * values.length, 1);
|
|
106
|
+
}
|
|
107
|
+
/** Stable identity for a combination: its key/value pairs, key-sorted. */
|
|
108
|
+
function combinationKey(combo) {
|
|
109
|
+
return JSON.stringify(Object.entries(combo).filter(([, value]) => value !== void 0).sort((a, b) => a[0].localeCompare(b[0])));
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* The first combination whose key collides with an earlier one, or `null` when
|
|
113
|
+
* every combination is distinct.
|
|
114
|
+
*
|
|
115
|
+
* `keyOf` decides what "the same combination" means. Callers that own a job name
|
|
116
|
+
* pass a renderer for the expanded name, because the collision that actually
|
|
117
|
+
* hurts is two children sharing a name — they are indistinguishable to an
|
|
118
|
+
* operator and ambiguous as a needs-edge target. Two structurally different
|
|
119
|
+
* combinations can still render the same name, so name-keying is strictly
|
|
120
|
+
* stronger than the structural default.
|
|
121
|
+
*/
|
|
122
|
+
function findDuplicateCombination(combos, keyOf = combinationKey) {
|
|
123
|
+
const seen = /* @__PURE__ */ new Set();
|
|
124
|
+
for (const combo of combos) {
|
|
125
|
+
const key = keyOf(combo);
|
|
126
|
+
if (seen.has(key)) return combo;
|
|
127
|
+
seen.add(key);
|
|
128
|
+
}
|
|
129
|
+
return null;
|
|
41
130
|
}
|
|
42
131
|
/**
|
|
43
132
|
* Apply include/exclude modifications to expanded matrix combinations.
|
|
@@ -62,11 +151,11 @@ function applyIncludeExclude(expanded, include, exclude) {
|
|
|
62
151
|
const comboKeys = Object.keys(combo);
|
|
63
152
|
if (inclKeys.length !== comboKeys.length) return false;
|
|
64
153
|
return inclKeys.every((key) => combo[key] === incl[key]);
|
|
65
|
-
})) result.push(incl);
|
|
154
|
+
})) result.push(Object.fromEntries([...inclKeys].sort((a, b) => a.localeCompare(b)).map((key) => [key, incl[key]])));
|
|
66
155
|
}
|
|
67
156
|
return result;
|
|
68
157
|
}
|
|
69
158
|
//#endregion
|
|
70
|
-
export { applyIncludeExclude, cartesianProduct, expandMatrix, expandMultiDimension, expandSingleDimension };
|
|
159
|
+
export { MatrixShapeError, applyIncludeExclude, cartesianProduct, expandMatrix, expandMultiDimension, expandSingleDimension, findDuplicateCombination, matrixCombinationCount, normalizeMatrixInput };
|
|
71
160
|
|
|
72
161
|
//# sourceMappingURL=expand.js.map
|
package/dist/matrix/format.d.ts
CHANGED
|
@@ -5,6 +5,11 @@ import type { MatrixValues } from './expand.js';
|
|
|
5
5
|
* Multi-dimensional: "linux, 18"
|
|
6
6
|
*/
|
|
7
7
|
export declare function formatMatrixSuffix(matrixValues: MatrixValues): string;
|
|
8
|
-
/**
|
|
8
|
+
/**
|
|
9
|
+
* Expanded child job name: `${baseName} (${suffix})`. The `(...)` wrapper is
|
|
10
|
+
* load-bearing, not decoration: `variantLabelOf` (fanout/materialize.ts) and
|
|
11
|
+
* `buildMatrixOutputsEnvelope` (the orchestrator's `byMatrix` key) both recover
|
|
12
|
+
* the suffix by slicing it back out of the name.
|
|
13
|
+
*/
|
|
9
14
|
export declare function formatExpandedJobName(baseName: string, matrixValues: MatrixValues): string;
|
|
10
15
|
//# sourceMappingURL=format.d.ts.map
|
package/dist/matrix/format.js
CHANGED
|
@@ -10,7 +10,12 @@ function formatMatrixSuffix(matrixValues) {
|
|
|
10
10
|
if (defined.length === 1 && defined[0][0] === "value") return defined[0][1];
|
|
11
11
|
return defined.map(([, v]) => v).join(", ");
|
|
12
12
|
}
|
|
13
|
-
/**
|
|
13
|
+
/**
|
|
14
|
+
* Expanded child job name: `${baseName} (${suffix})`. The `(...)` wrapper is
|
|
15
|
+
* load-bearing, not decoration: `variantLabelOf` (fanout/materialize.ts) and
|
|
16
|
+
* `buildMatrixOutputsEnvelope` (the orchestrator's `byMatrix` key) both recover
|
|
17
|
+
* the suffix by slicing it back out of the name.
|
|
18
|
+
*/
|
|
14
19
|
function formatExpandedJobName(baseName, matrixValues) {
|
|
15
20
|
return `${baseName} (${formatMatrixSuffix(matrixValues)})`;
|
|
16
21
|
}
|
|
@@ -1,13 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Shared held-run resolution for the `kici approve` / `kici reject` commands and
|
|
3
|
-
* the developer MCP `approve_run` / `reject_run` tools.
|
|
4
|
-
*
|
|
5
|
-
* Both surfaces first list the pending holds for a run, then resolve the one
|
|
6
|
-
* the caller named via `job` / `step` (or the sole pending hold when there is
|
|
7
|
-
* exactly one and no filter is given). The resolution is a pure function so it
|
|
8
|
-
* can be unit-tested without HTTP, and it stays import-free so it is safe to
|
|
9
|
-
* re-export from the browser-facing engine barrel.
|
|
10
|
-
*/
|
|
11
1
|
/** Hold scope, mirroring the engine `HoldScope` enum. */
|
|
12
2
|
export type HeldRunScope = 'workflow' | 'job' | 'step';
|
|
13
3
|
/** A pending-hold row as returned by the held-runs list. */
|
|
@@ -18,6 +8,13 @@ export interface HeldRunSummary {
|
|
|
18
8
|
holdScope?: HeldRunScope;
|
|
19
9
|
stepIndex?: number | null;
|
|
20
10
|
status: string;
|
|
11
|
+
/**
|
|
12
|
+
* Persisted `held_runs.hold_type`, when the orchestrator's list response
|
|
13
|
+
* carried one. Optional and un-normalized: callers pass it through
|
|
14
|
+
* `normalizePersistedHoldType` before branching. Absent from an older
|
|
15
|
+
* orchestrator's response.
|
|
16
|
+
*/
|
|
17
|
+
holdType?: string;
|
|
21
18
|
/** Computed drift payload for a `when: 'drift'` step hold; absent otherwise. */
|
|
22
19
|
payload?: {
|
|
23
20
|
summaryMarkdown: string;
|
|
@@ -1,6 +1,32 @@
|
|
|
1
1
|
import "../rolldown-runtime-ClRpJifh.js";
|
|
2
|
+
import { HeldRunStatus } from "../context/held-run-status.js";
|
|
2
3
|
//#region src/mcp/held-run-resolve.ts
|
|
3
4
|
/**
|
|
5
|
+
* Shared held-run resolution for the `kici approve` / `kici reject` commands and
|
|
6
|
+
* the developer MCP `approve_run` / `reject_run` tools.
|
|
7
|
+
*
|
|
8
|
+
* Both surfaces first list the pending holds for a run, then resolve the one
|
|
9
|
+
* the caller named via `job` / `step` (or the sole pending hold when there is
|
|
10
|
+
* exactly one and no filter is given). The resolution is a pure function so it
|
|
11
|
+
* can be unit-tested without HTTP, and it imports nothing beyond the shared
|
|
12
|
+
* held-run vocabulary, so it is safe to re-export from the browser-facing
|
|
13
|
+
* engine barrel.
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* Name a hold the way the caller would type it: the literal `jobId` (so an
|
|
17
|
+
* `__install__…` sentinel or an opaque legacy id is reproduced verbatim), with
|
|
18
|
+
* the step index prefixed for a step-scoped hold.
|
|
19
|
+
*/
|
|
20
|
+
function describeHold(hold) {
|
|
21
|
+
const job = hold.jobId || "(unnamed hold)";
|
|
22
|
+
if (hold.holdScope === "step" && hold.stepIndex != null) return `step ${hold.stepIndex} of ${job}`;
|
|
23
|
+
return job;
|
|
24
|
+
}
|
|
25
|
+
/** The distinct hold descriptions, in listing order, for an error message. */
|
|
26
|
+
function listCandidates(holds) {
|
|
27
|
+
return [...new Set(holds.map(describeHold))].join(", ");
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
4
30
|
* Resolve the held-run id matching the filter from a list of pending holds.
|
|
5
31
|
*
|
|
6
32
|
* - `step` requires `job` and matches a `step`-scoped hold whose step index
|
|
@@ -9,7 +35,7 @@ import "../rolldown-runtime-ClRpJifh.js";
|
|
|
9
35
|
* - With no filter, the sole pending hold is used; ambiguity is an error.
|
|
10
36
|
*/
|
|
11
37
|
function resolveHeldRunId(holds, filter) {
|
|
12
|
-
const pending = holds.filter((h) => h.status ===
|
|
38
|
+
const pending = holds.filter((h) => h.status === HeldRunStatus.enum.pending);
|
|
13
39
|
if (pending.length === 0) return {
|
|
14
40
|
ok: false,
|
|
15
41
|
error: "No pending approval holds found for this run."
|
|
@@ -19,12 +45,12 @@ function resolveHeldRunId(holds, filter) {
|
|
|
19
45
|
ok: false,
|
|
20
46
|
error: "--step requires --job to identify the held step."
|
|
21
47
|
};
|
|
22
|
-
return pickSingle(pending.filter((h) => h.holdScope === "step" && h.jobId === filter.job && String(h.stepIndex ?? "") === filter.step), `step ${filter.step} of job '${filter.job}'
|
|
48
|
+
return pickSingle(pending.filter((h) => h.holdScope === "step" && h.jobId === filter.job && String(h.stepIndex ?? "") === filter.step), `step ${filter.step} of job '${filter.job}'`, pending);
|
|
23
49
|
}
|
|
24
|
-
if (filter.job !== void 0) return pickSingle(pending.filter((h) => h.jobId === filter.job && h.holdScope !== "step"), `job '${filter.job}'
|
|
50
|
+
if (filter.job !== void 0) return pickSingle(pending.filter((h) => h.jobId === filter.job && h.holdScope !== "step"), `job '${filter.job}'`, pending);
|
|
25
51
|
if (pending.length > 1) return {
|
|
26
52
|
ok: false,
|
|
27
|
-
error:
|
|
53
|
+
error: `Multiple pending holds for this run. Use --job <name> (and --step <index>) to choose one. Candidates: ${listCandidates(pending)}.`
|
|
28
54
|
};
|
|
29
55
|
return {
|
|
30
56
|
ok: true,
|
|
@@ -32,14 +58,14 @@ function resolveHeldRunId(holds, filter) {
|
|
|
32
58
|
hold: pending[0]
|
|
33
59
|
};
|
|
34
60
|
}
|
|
35
|
-
function pickSingle(matches, label) {
|
|
61
|
+
function pickSingle(matches, label, pending) {
|
|
36
62
|
if (matches.length === 0) return {
|
|
37
63
|
ok: false,
|
|
38
|
-
error: `No pending hold found for ${label}.`
|
|
64
|
+
error: `No pending hold found for ${label}. Pending holds: ${listCandidates(pending)}.`
|
|
39
65
|
};
|
|
40
66
|
if (matches.length > 1) return {
|
|
41
67
|
ok: false,
|
|
42
|
-
error: `Multiple pending holds match ${label}; cannot disambiguate.`
|
|
68
|
+
error: `Multiple pending holds match ${label}; cannot disambiguate. Candidates: ${listCandidates(matches)}.`
|
|
43
69
|
};
|
|
44
70
|
return {
|
|
45
71
|
ok: true,
|
|
@@ -259,10 +259,6 @@ const METRIC_LABEL_POLICY = {
|
|
|
259
259
|
"v8js.gc.type": { maxUniqueValues: 6 },
|
|
260
260
|
scaler: { values: AGENT_SCALER_VALUES }
|
|
261
261
|
},
|
|
262
|
-
"v8js.memory.heap.limit": {
|
|
263
|
-
"v8js.heap.space.name": { maxUniqueValues: 20 },
|
|
264
|
-
scaler: { values: AGENT_SCALER_VALUES }
|
|
265
|
-
},
|
|
266
262
|
"v8js.memory.heap.used": {
|
|
267
263
|
"v8js.heap.space.name": { maxUniqueValues: 20 },
|
|
268
264
|
scaler: { values: AGENT_SCALER_VALUES }
|
|
@@ -274,6 +270,10 @@ const METRIC_LABEL_POLICY = {
|
|
|
274
270
|
"v8js.memory.heap.space.physical_size": {
|
|
275
271
|
"v8js.heap.space.name": { maxUniqueValues: 20 },
|
|
276
272
|
scaler: { values: AGENT_SCALER_VALUES }
|
|
273
|
+
},
|
|
274
|
+
"v8js.resource.active": {
|
|
275
|
+
"v8js.resource.type": { maxUniqueValues: 20 },
|
|
276
|
+
scaler: { values: AGENT_SCALER_VALUES }
|
|
277
277
|
}
|
|
278
278
|
};
|
|
279
279
|
//#endregion
|