@kici-dev/orchestrator 0.13.0 → 0.14.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/dist/agent/dispatcher.d.ts +17 -0
  2. package/dist/cancel/peer-job-cancel.d.ts +12 -0
  3. package/dist/cli/api-client.d.ts +73 -0
  4. package/dist/cli/commands/cluster-settings.d.ts +31 -1
  5. package/dist/cli/commands/peer.d.ts +27 -1
  6. package/dist/cli/commands/scaler.d.ts +40 -4
  7. package/dist/cli.js +2210 -933
  8. package/dist/cluster/cluster-settings-reader.d.ts +8 -2
  9. package/dist/cluster/coordinator.d.ts +34 -8
  10. package/dist/cluster/peer-client.d.ts +37 -4
  11. package/dist/cluster/peer-forget.d.ts +138 -0
  12. package/dist/cluster/peer-handler.d.ts +18 -1
  13. package/dist/cluster/scaler-orphans-peer.d.ts +40 -0
  14. package/dist/cluster/settings-propagation.d.ts +85 -0
  15. package/dist/cluster/worker-cluster-settings.d.ts +29 -0
  16. package/dist/config.d.ts +9 -0
  17. package/dist/db/migrations/154_cluster_settings_firecracker_api_socket_wait.d.ts +4 -0
  18. package/dist/db/migrations/155_org_settings_reroute_spawn_retry.d.ts +17 -0
  19. package/dist/db/migrations/156_kici_events_match_outcome.d.ts +17 -0
  20. package/dist/db/types.d.ts +16 -0
  21. package/dist/events/event-router.d.ts +7 -1
  22. package/dist/events/event-store.d.ts +20 -3
  23. package/dist/events/types.d.ts +45 -0
  24. package/dist/helpers/windows-batch.d.ts +59 -0
  25. package/dist/index.js +60 -0
  26. package/dist/metrics/prometheus.d.ts +2 -0
  27. package/dist/orchestrator-core.d.ts +7 -0
  28. package/dist/registration/registration-store.d.ts +10 -0
  29. package/dist/routes/admin-cluster-settings.d.ts +13 -1
  30. package/dist/routes/admin-event-inspect.d.ts +36 -0
  31. package/dist/routes/admin-peer-forget.d.ts +43 -0
  32. package/dist/routes/admin-scaler-orphans.d.ts +64 -0
  33. package/dist/routes/admin.d.ts +23 -0
  34. package/dist/scaler/backend-factory.d.ts +6 -1
  35. package/dist/scaler/bare-metal-backend.d.ts +17 -15
  36. package/dist/scaler/bare-metal-launch.d.ts +90 -0
  37. package/dist/scaler/firecracker-backend.d.ts +181 -7
  38. package/dist/scaler/live-vms.d.ts +57 -0
  39. package/dist/scaler/manager.d.ts +112 -3
  40. package/dist/scaler/orphan-requests.d.ts +23 -0
  41. package/dist/scaler/overlay-template.d.ts +38 -0
  42. package/dist/scaler/scaler-state-store.d.ts +7 -0
  43. package/dist/scaler/spawn-errors.d.ts +17 -0
  44. package/dist/scaler/startup-orphan-sweep.d.ts +15 -0
  45. package/dist/scaler/types.d.ts +21 -2
  46. package/dist/scaler/vm-job-bindings.d.ts +17 -0
  47. package/dist/secrets/rbac.d.ts +7 -1
  48. package/dist/server.js +5498 -2193
  49. package/dist/standalone.js +10754 -7451
  50. package/dist/worker/in-memory-execution-tracker.d.ts +5 -0
  51. package/dist/worker/in-memory-job-queue.d.ts +21 -1
  52. package/dist/worker/queued-reroute-release.d.ts +39 -0
  53. package/dist/worker/reroute-spawn-control.d.ts +58 -0
  54. package/dist/worker/spawn-retry-budget.d.ts +87 -0
  55. package/dist/worker-core.d.ts +11 -2
  56. package/installer-image-digests.json +3 -3
  57. package/package.json +4 -4
  58. package/sbom.spdx.json +53 -53
@@ -80,6 +80,11 @@ export declare class InMemoryExecutionTracker {
80
80
  * Update step status. Forwards to coordinator callback if configured.
81
81
  */
82
82
  onStepStatus(runId: string, jobId: string, stepIndex: number, stepName: string, status: string, timestamp: number, data?: Record<string, unknown>): Promise<void>;
83
+ /**
84
+ * Forget a job this worker gave up or was told to stop before it ran. Nothing is
85
+ * forwarded: the coordinator that owns the run already decided what happens to it.
86
+ */
87
+ dropJob(runId: string, jobId: string): void;
83
88
  /**
84
89
  * Get the current status of a run.
85
90
  */
@@ -16,6 +16,25 @@ export declare class InMemoryJobQueue {
16
16
  private readonly dispatched;
17
17
  /** Per-job re-dispatch counter (parity with dispatch_queue.dispatch_attempts). */
18
18
  private readonly attempts;
19
+ /**
20
+ * Jobs the owning coordinator stopped (a cancel), or that this worker gave back
21
+ * after its spawn retries ran out. A stopped job is never claimed, listed or
22
+ * re-pended, which is this queue's counterpart of the database queue's
23
+ * stopped-run guard. The mark goes with the job's entry.
24
+ */
25
+ private readonly stopped;
26
+ /** Stop-mark every job of `runId` (or just `jobId`), pending or dispatched. Synchronous. */
27
+ stop(runId: string, jobId?: string): {
28
+ pending: string[];
29
+ dispatched: string[];
30
+ };
31
+ /** True while the job waits in this queue and has not been stopped. */
32
+ isPending(jobId: string): boolean;
33
+ /**
34
+ * Parity with the database queue, whose dispatcher calls this after a `null`
35
+ * requeue. `requeue` already dropped a stopped job, so nothing is left to settle.
36
+ */
37
+ settleClaimOfStoppedRun(_jobId: string, _runId: string): Promise<boolean>;
19
38
  /** Enqueue a job in memory and return its ID. */
20
39
  enqueue(input: QueuedJobInput): Promise<string>;
21
40
  /**
@@ -98,7 +117,8 @@ export declare class InMemoryJobQueue {
98
117
  * Return a dispatched job to pending for re-dispatch, bumping its attempt
99
118
  * counter unless `countAttempt` is false. Mirrors the DB-backed
100
119
  * `JobQueue.requeue`. Returns the attempt count, or null when the job is
101
- * not currently dispatched.
120
+ * not currently dispatched. A stopped job is dropped instead of re-pended, and
121
+ * also returns null.
102
122
  */
103
123
  requeue(jobId: string, opts?: {
104
124
  countAttempt?: boolean;
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Remove a worker's queued rerouted jobs and stop-mark its dispatched ones.
3
+ *
4
+ * Two triggers reach here: the owning coordinator's `peer.job.cancel`, and this
5
+ * worker exhausting a job's spawn-retry budget. Either way the coordinator owns
6
+ * the job's verdict — it already failed, cancelled or re-dispatched the job — so
7
+ * this reports **nothing** back to it. A worker-side `failed` or `cancelled`
8
+ * terminal would reach the coordinator as a superseded peer's terminal at best,
9
+ * and as a second verdict at worst.
10
+ *
11
+ * A dispatched job keeps its agent, projection and ownership: the agent is
12
+ * running it, and the cancel receiver delivers its `job.cancel`. The stop mark
13
+ * only makes a later requeue drop the job instead of re-pending it.
14
+ */
15
+ import type { Dispatcher } from '../agent/dispatcher.js';
16
+ import type { InMemoryJobQueue } from './in-memory-job-queue.js';
17
+ import type { InMemoryExecutionTracker } from './in-memory-execution-tracker.js';
18
+ import type { SpawnRetryBudget } from './spawn-retry-budget.js';
19
+ export interface ReleaseDeps {
20
+ queue: Pick<InMemoryJobQueue, 'stop'>;
21
+ dispatcher: Pick<Dispatcher, 'cancelQueuedJob'>;
22
+ executionTracker: Pick<InMemoryExecutionTracker, 'dropJob'>;
23
+ /** jobId → owning coordinator URL. */
24
+ jobOwnership: Map<string, string>;
25
+ budget: Pick<SpawnRetryBudget, 'release'>;
26
+ }
27
+ /**
28
+ * Stop every matching job of `runId` (or just `jobId`) and remove the pending
29
+ * ones. The stop mark is set synchronously, before the first `await`, so a
30
+ * requeue racing this call drops the job.
31
+ *
32
+ * @returns the ids of the pending jobs removed.
33
+ */
34
+ export declare function releaseQueuedRerouteJobs(deps: ReleaseDeps, target: {
35
+ runId: string;
36
+ jobId?: string;
37
+ reason: string;
38
+ }): Promise<string[]>;
39
+ //# sourceMappingURL=queued-reroute-release.d.ts.map
@@ -0,0 +1,58 @@
1
+ /**
2
+ * The worker-side half of the reroute spawn-retry agreement.
3
+ *
4
+ * A coordinator reroutes a job to this worker with a spawn-retry budget
5
+ * (`job.reroute.spawnRetry`). This module applies it:
6
+ *
7
+ * - every scaler request for the job passes a per-job attempt gate, so one spawn
8
+ * is in flight at a time and none starts during the backoff;
9
+ * - each `scaler.failed` is relayed to the owning coordinator with the budget's
10
+ * verdict (`final`), and the last one releases the job from this worker's queue;
11
+ * - a coordinator's cancel releases a queued job and stop-marks a dispatched one.
12
+ *
13
+ * Assembled here so `bootstrapWorker` only wires it.
14
+ */
15
+ import { type JobReroute, type PeerScalerEvent, type RerouteSpawnRetry } from '@kici-dev/engine';
16
+ import type { Dispatcher } from '../agent/dispatcher.js';
17
+ import type { ScalerManager } from '../scaler/manager.js';
18
+ import type { ScaleResult, ScalerEvent } from '../scaler/types.js';
19
+ import type { InMemoryJobQueue } from './in-memory-job-queue.js';
20
+ import type { InMemoryExecutionTracker } from './in-memory-execution-tracker.js';
21
+ /** The scaler request the dispatcher's `onNoMatchingAgent` makes. */
22
+ export type ScaleRequest = (...args: Parameters<ScalerManager['requestScale']>) => Promise<ScaleResult>;
23
+ export interface RerouteSpawnControlDeps {
24
+ queue: InMemoryJobQueue;
25
+ /** Late-bound: the scaler that emits events is built before the dispatcher. */
26
+ getDispatcher: () => Pick<Dispatcher, 'cancelQueuedJob' | 'redrivePendingJob'>;
27
+ executionTracker: InMemoryExecutionTracker;
28
+ /** jobId → owning coordinator URL. */
29
+ jobOwnership: Map<string, string>;
30
+ /** Relay a message to the coordinator that owns the job. */
31
+ sendToOwningCoord: (jobId: string, msg: PeerScalerEvent) => void;
32
+ /** The worker's configured budget, used when the coordinator sent none. */
33
+ defaults: RerouteSpawnRetry;
34
+ logger: {
35
+ debug(message: string, meta?: Record<string, unknown>): unknown;
36
+ info(message: string, meta?: Record<string, unknown>): unknown;
37
+ warn(message: string, meta?: Record<string, unknown>): unknown;
38
+ error(message: string, meta?: Record<string, unknown>): unknown;
39
+ };
40
+ }
41
+ export interface RerouteSpawnControl {
42
+ /** Start the job's budget. Call before the job is dispatched. */
43
+ registerReroute(msg: JobReroute): void;
44
+ /** Drop the budget of a reroute this worker did not accept. */
45
+ forgetReroute(jobId: string): void;
46
+ /** Gate a scaler request through the job's budget. */
47
+ wrapScaleRequest(fn: ScaleRequest): ScaleRequest;
48
+ /** Relay a scaler event to the owning coordinator, with the budget's verdict. */
49
+ onScalerEvent(runId: string, jobId: string, ev: ScalerEvent): void;
50
+ /** An agent received the job. */
51
+ onDelivered(jobId: string): void;
52
+ /** The job reached a terminal state. */
53
+ onJobTerminal(jobId: string): void;
54
+ /** The owning coordinator cancelled the run, or one job of it. */
55
+ releaseQueued(runId: string, jobId: string | undefined): Promise<string[]>;
56
+ }
57
+ export declare function createRerouteSpawnControl(deps: RerouteSpawnControlDeps): RerouteSpawnControl;
58
+ //# sourceMappingURL=reroute-spawn-control.d.ts.map
@@ -0,0 +1,87 @@
1
+ /**
2
+ * The spawn-retry budget a worker applies to each job a coordinator rerouted to it.
3
+ *
4
+ * A worker whose agent spawn fails retries, but only `maxAttempts` times and with
5
+ * `backoffMs` between attempts, so the coordinator that owns the run can tell
6
+ * "still trying" from "gave up". The coordinator sends the budget on `job.reroute`,
7
+ * and the verdict for each failure rides back on the relayed `scaler.failed` as
8
+ * `final`. One entry per rerouted job, created before the job is dispatched and
9
+ * released when the job leaves this worker's queue.
10
+ */
11
+ import { z } from 'zod';
12
+ import type { RerouteSpawnRetry } from '@kici-dev/engine';
13
+ /** The answer to "may this job start a spawn now?". */
14
+ export declare const SpawnAttemptGate: z.ZodEnum<{
15
+ backoff: "backoff";
16
+ begun: "begun";
17
+ "in-flight": "in-flight";
18
+ "not-queued": "not-queued";
19
+ untracked: "untracked";
20
+ }>;
21
+ export type SpawnAttemptGate = z.infer<typeof SpawnAttemptGate>;
22
+ /** The budget's verdict on one spawn failure. */
23
+ export type FailureVerdict = {
24
+ tracked: false;
25
+ } | {
26
+ tracked: true;
27
+ final: boolean;
28
+ failures: number;
29
+ maxAttempts: number;
30
+ duplicate: boolean;
31
+ };
32
+ export interface SpawnRetryBudgetDeps {
33
+ /** True while the job waits in the worker's queue (not claimed, not stopped). */
34
+ isQueued: (jobId: string) => boolean;
35
+ /** Offer one pending job to the scaler again. */
36
+ redrive: (jobId: string) => Promise<unknown>;
37
+ logger: {
38
+ debug(message: string, meta?: object): unknown;
39
+ info(message: string, meta?: object): unknown;
40
+ warn(message: string, meta?: object): unknown;
41
+ };
42
+ now?: () => number;
43
+ }
44
+ export declare class SpawnRetryBudget {
45
+ private readonly deps;
46
+ private readonly entries;
47
+ private readonly now;
48
+ constructor(deps: SpawnRetryBudgetDeps);
49
+ /** Start tracking a rerouted job. A second call for the same job keeps the first entry. */
50
+ register(jobId: string, runId: string, policy: RerouteSpawnRetry): void;
51
+ /** Claim the right to start one spawn. Synchronous, so two callers cannot both win. */
52
+ beginAttempt(jobId: string): SpawnAttemptGate;
53
+ /**
54
+ * Record the agent the claimed attempt is spawning. Ignored when the attempt is
55
+ * no longer in flight, or when that agent's failure already arrived.
56
+ */
57
+ setHolder(jobId: string, agentId: string): void;
58
+ /** The claimed attempt started no spawn (at capacity, no backend, skipped). */
59
+ abortAttempt(jobId: string): void;
60
+ /**
61
+ * The claimed attempt started no spawn because the scaler is deferring for
62
+ * `delayMs`. Nothing is charged; the job is offered to the scaler again when
63
+ * the deferral ends. Without this a worker, which has no periodic pending
64
+ * sweep, would ask once during the deferral and never again, and the
65
+ * coordinator's spawn window would run out on an attempt the budget still
66
+ * holds.
67
+ */
68
+ deferAttempt(jobId: string, delayMs: number): void;
69
+ /** An agent received the job. The budget stays in place in case the job is requeued. */
70
+ onDelivered(jobId: string): void;
71
+ /**
72
+ * Count one failed spawn. A failure for a job no longer queued is not a spawn
73
+ * failure (an agent already took the job), so it is untracked. Only the spawn
74
+ * holding the attempt gate is charged: a failure from any other agent (a
75
+ * superseded spawn failing late) is untracked and leaves the gate held. While
76
+ * the scaler has not yet named the in-flight agent, the in-flight attempt is
77
+ * the only one that can fail, so its failure is charged. On a non-final
78
+ * failure the backoff starts, and its timer offers the job to the scaler again.
79
+ */
80
+ recordFailure(jobId: string, agentId: string): FailureVerdict;
81
+ /** The job left the queue: terminal, stopped, or given back. */
82
+ release(jobId: string): void;
83
+ private armBackoff;
84
+ /** Gate new attempts for `delayMs`, then offer the job to the scaler again. */
85
+ private scheduleRedrive;
86
+ }
87
+ //# sourceMappingURL=spawn-retry-budget.d.ts.map
@@ -64,13 +64,22 @@ interface WorkerSubsystems {
64
64
  }
65
65
  /**
66
66
  * Resolve the ephemeral agent-token TTL a worker-spawned agent should use:
67
- * the fleet-wide `agent_token_ttl_ms` pulled from the leader when a snapshot has
68
- * landed, otherwise the boot-time config default. This is the single seam the
67
+ * the fleet-wide `agent_token_ttl_ms` pulled from a coordinator when a snapshot
68
+ * has landed, otherwise the boot-time config default. This is the single seam the
69
69
  * worker's three scaler backends read at spawn.
70
70
  */
71
71
  export declare function resolveWorkerAgentTokenTtlMs(pushed: {
72
72
  settings: WorkerClusterSettings;
73
73
  } | null, fallback: number): number;
74
+ /**
75
+ * Resolve the Firecracker API-socket wait a worker-spawned VM should use: the
76
+ * fleet-wide `firecracker_api_socket_wait_ms` pulled from a coordinator,
77
+ * otherwise the boot-time config default. A snapshot from a coordinator that
78
+ * predates the knob carries no value, and the default applies.
79
+ */
80
+ export declare function resolveWorkerFirecrackerApiSocketWaitMs(pushed: {
81
+ settings: WorkerClusterSettings;
82
+ } | null, fallback: number): number;
74
83
  /**
75
84
  * Bootstrap the orchestrator in worker mode.
76
85
  *
@@ -1,7 +1,7 @@
1
1
  {
2
- "version": "0.13.0",
2
+ "version": "0.14.1",
3
3
  "images": {
4
- "kici-agent": "sha256:301bc573b855f582a43aaf1813ed6d5fc1b1f72ecbbe6e98d7176227bb4f7d81",
5
- "kici-orchestrator": "sha256:6dc6f9aa82b30b6f194873816cebc37a8d8eb4600ed00ce72f3ea8dbdfa91501"
4
+ "kici-agent": "sha256:5d07a69a9a33f2aaf3d84d77a051038e35e32983bd3e1d8833b19b52916e7074",
5
+ "kici-orchestrator": "sha256:98207bb438b5f0dc571e303324ab47ac6e0b26f4402f63a660f9d419eec4b3cd"
6
6
  }
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kici-dev/orchestrator",
3
- "version": "0.13.0",
3
+ "version": "0.14.1",
4
4
  "description": "Customer-deployable orchestrator for the KiCI CI/CD stack. Receives webhook events (direct or via Platform relay), matches triggers against the lock file, and dispatches jobs to connected agents.",
5
5
  "keywords": [
6
6
  "ci",
@@ -90,8 +90,8 @@
90
90
  "ws": "^8.21.3",
91
91
  "yaml": "^2.9.1",
92
92
  "zod": "^4.6.5",
93
- "@kici-dev/shared": "0.13.0",
94
- "@kici-dev/engine": "0.13.0"
93
+ "@kici-dev/engine": "0.14.1",
94
+ "@kici-dev/shared": "0.14.1"
95
95
  },
96
96
  "kici": {
97
97
  "metrics": {
@@ -106,7 +106,7 @@
106
106
  "@types/dockerode": "^4.0.1",
107
107
  "@types/ws": "^8.18.1",
108
108
  "kysely-ctl": "^0.21.0",
109
- "@kici-dev/agent": "0.13.0"
109
+ "@kici-dev/agent": "0.14.1"
110
110
  },
111
111
  "scripts": {
112
112
  "build": "node ../../scripts/build-service.mjs && tsc --emitDeclarationOnly",
package/sbom.spdx.json CHANGED
@@ -2,10 +2,10 @@
2
2
  "spdxVersion": "SPDX-2.3",
3
3
  "dataLicense": "CC0-1.0",
4
4
  "SPDXID": "SPDXRef-DOCUMENT",
5
- "name": "@kici-dev/orchestrator@0.13.0",
6
- "documentNamespace": "https://kici.dev/sbom/%40kici-dev%2Forchestrator/0.13.0/2d67bf58-654a-4c14-96ff-5d0ca3e027a0",
5
+ "name": "@kici-dev/orchestrator@0.14.1",
6
+ "documentNamespace": "https://kici.dev/sbom/%40kici-dev%2Forchestrator/0.14.1/e3e2feed-940b-4c7b-b1ac-8dfa92ada09d",
7
7
  "creationInfo": {
8
- "created": "2026-09-30T15:39:17Z",
8
+ "created": "2026-10-02T17:53:29Z",
9
9
  "creators": [
10
10
  "Tool: kici-sbom-generator"
11
11
  ]
@@ -964,9 +964,9 @@
964
964
  "homepage": "https://ericsmekens.github.io/jsep/tree/master/packages/regex#readme"
965
965
  },
966
966
  {
967
- "SPDXID": "SPDXRef-Package--kici-dev-core-0.13.0",
967
+ "SPDXID": "SPDXRef-Package--kici-dev-core-0.14.1",
968
968
  "name": "@kici-dev/core",
969
- "versionInfo": "0.13.0",
969
+ "versionInfo": "0.14.1",
970
970
  "downloadLocation": "NOASSERTION",
971
971
  "filesAnalyzed": false,
972
972
  "licenseConcluded": "NOASSERTION",
@@ -977,16 +977,16 @@
977
977
  {
978
978
  "referenceCategory": "PACKAGE-MANAGER",
979
979
  "referenceType": "purl",
980
- "referenceLocator": "pkg:npm/%40kici-dev/core@0.13.0"
980
+ "referenceLocator": "pkg:npm/%40kici-dev/core@0.14.1"
981
981
  }
982
982
  ],
983
983
  "description": "Light shared utilities for the KiCI stack (logging, errors, formatting, crypto, zx init, the TypeScript ESM loader hook). No server-side dependencies.",
984
984
  "homepage": "https://kici.dev"
985
985
  },
986
986
  {
987
- "SPDXID": "SPDXRef-Package--kici-dev-engine-0.13.0",
987
+ "SPDXID": "SPDXRef-Package--kici-dev-engine-0.14.1",
988
988
  "name": "@kici-dev/engine",
989
- "versionInfo": "0.13.0",
989
+ "versionInfo": "0.14.1",
990
990
  "downloadLocation": "NOASSERTION",
991
991
  "filesAnalyzed": false,
992
992
  "licenseConcluded": "NOASSERTION",
@@ -997,7 +997,7 @@
997
997
  {
998
998
  "referenceCategory": "PACKAGE-MANAGER",
999
999
  "referenceType": "purl",
1000
- "referenceLocator": "pkg:npm/%40kici-dev/engine@0.13.0"
1000
+ "referenceLocator": "pkg:npm/%40kici-dev/engine@0.14.1"
1001
1001
  }
1002
1002
  ],
1003
1003
  "description": "Shared business logic for the KiCI CI/CD stack: protocol, triggers, state machine, and provider interfaces used by the Platform relay, orchestrator, and compiler.",
@@ -1006,7 +1006,7 @@
1006
1006
  {
1007
1007
  "SPDXID": "SPDXRef-RootPackage",
1008
1008
  "name": "@kici-dev/orchestrator",
1009
- "versionInfo": "0.13.0",
1009
+ "versionInfo": "0.14.1",
1010
1010
  "downloadLocation": "NOASSERTION",
1011
1011
  "filesAnalyzed": false,
1012
1012
  "licenseConcluded": "NOASSERTION",
@@ -1017,16 +1017,16 @@
1017
1017
  {
1018
1018
  "referenceCategory": "PACKAGE-MANAGER",
1019
1019
  "referenceType": "purl",
1020
- "referenceLocator": "pkg:npm/%40kici-dev/orchestrator@0.13.0"
1020
+ "referenceLocator": "pkg:npm/%40kici-dev/orchestrator@0.14.1"
1021
1021
  }
1022
1022
  ],
1023
1023
  "description": "Customer-deployable orchestrator for the KiCI CI/CD stack. Receives webhook events (direct or via Platform relay), matches triggers against the lock file, and dispatches jobs to connected agents.",
1024
1024
  "homepage": "https://kici.dev"
1025
1025
  },
1026
1026
  {
1027
- "SPDXID": "SPDXRef-Package--kici-dev-shared-0.13.0",
1027
+ "SPDXID": "SPDXRef-Package--kici-dev-shared-0.14.1",
1028
1028
  "name": "@kici-dev/shared",
1029
- "versionInfo": "0.13.0",
1029
+ "versionInfo": "0.14.1",
1030
1030
  "downloadLocation": "NOASSERTION",
1031
1031
  "filesAnalyzed": false,
1032
1032
  "licenseConcluded": "NOASSERTION",
@@ -1037,7 +1037,7 @@
1037
1037
  {
1038
1038
  "referenceCategory": "PACKAGE-MANAGER",
1039
1039
  "referenceType": "purl",
1040
- "referenceLocator": "pkg:npm/%40kici-dev/shared@0.13.0"
1040
+ "referenceLocator": "pkg:npm/%40kici-dev/shared@0.14.1"
1041
1041
  }
1042
1042
  ],
1043
1043
  "description": "Shared utilities for the KiCI CI/CD stack — logging, zx setup, crypto, telemetry, health and metrics routes. No business logic.",
@@ -7676,62 +7676,62 @@
7676
7676
  "relationshipType": "DEPENDS_ON"
7677
7677
  },
7678
7678
  {
7679
- "spdxElementId": "SPDXRef-Package--kici-dev-core-0.13.0",
7679
+ "spdxElementId": "SPDXRef-Package--kici-dev-core-0.14.1",
7680
7680
  "relatedSpdxElement": "SPDXRef-Package-oxc-transform-0.150.0",
7681
7681
  "relationshipType": "DEPENDS_ON"
7682
7682
  },
7683
7683
  {
7684
- "spdxElementId": "SPDXRef-Package--kici-dev-core-0.13.0",
7684
+ "spdxElementId": "SPDXRef-Package--kici-dev-core-0.14.1",
7685
7685
  "relatedSpdxElement": "SPDXRef-Package-picocolors-1.1.1",
7686
7686
  "relationshipType": "DEPENDS_ON"
7687
7687
  },
7688
7688
  {
7689
- "spdxElementId": "SPDXRef-Package--kici-dev-core-0.13.0",
7689
+ "spdxElementId": "SPDXRef-Package--kici-dev-core-0.14.1",
7690
7690
  "relatedSpdxElement": "SPDXRef-Package-winston-daily-rotate-file-5.0.0",
7691
7691
  "relationshipType": "DEPENDS_ON"
7692
7692
  },
7693
7693
  {
7694
- "spdxElementId": "SPDXRef-Package--kici-dev-core-0.13.0",
7694
+ "spdxElementId": "SPDXRef-Package--kici-dev-core-0.14.1",
7695
7695
  "relatedSpdxElement": "SPDXRef-Package-winston-3.19.0",
7696
7696
  "relationshipType": "DEPENDS_ON"
7697
7697
  },
7698
7698
  {
7699
- "spdxElementId": "SPDXRef-Package--kici-dev-core-0.13.0",
7699
+ "spdxElementId": "SPDXRef-Package--kici-dev-core-0.14.1",
7700
7700
  "relatedSpdxElement": "SPDXRef-Package-zod-4.6.5",
7701
7701
  "relationshipType": "DEPENDS_ON"
7702
7702
  },
7703
7703
  {
7704
- "spdxElementId": "SPDXRef-Package--kici-dev-core-0.13.0",
7704
+ "spdxElementId": "SPDXRef-Package--kici-dev-core-0.14.1",
7705
7705
  "relatedSpdxElement": "SPDXRef-Package-zx-8.8.5",
7706
7706
  "relationshipType": "DEPENDS_ON"
7707
7707
  },
7708
7708
  {
7709
- "spdxElementId": "SPDXRef-Package--kici-dev-engine-0.13.0",
7709
+ "spdxElementId": "SPDXRef-Package--kici-dev-engine-0.14.1",
7710
7710
  "relatedSpdxElement": "SPDXRef-Package-jose-6.2.12",
7711
7711
  "relationshipType": "DEPENDS_ON"
7712
7712
  },
7713
7713
  {
7714
- "spdxElementId": "SPDXRef-Package--kici-dev-engine-0.13.0",
7714
+ "spdxElementId": "SPDXRef-Package--kici-dev-engine-0.14.1",
7715
7715
  "relatedSpdxElement": "SPDXRef-Package-jsonpath-plus-10.4.0",
7716
7716
  "relationshipType": "DEPENDS_ON"
7717
7717
  },
7718
7718
  {
7719
- "spdxElementId": "SPDXRef-Package--kici-dev-engine-0.13.0",
7719
+ "spdxElementId": "SPDXRef-Package--kici-dev-engine-0.14.1",
7720
7720
  "relatedSpdxElement": "SPDXRef-Package-picomatch-4.0.7",
7721
7721
  "relationshipType": "DEPENDS_ON"
7722
7722
  },
7723
7723
  {
7724
- "spdxElementId": "SPDXRef-Package--kici-dev-engine-0.13.0",
7724
+ "spdxElementId": "SPDXRef-Package--kici-dev-engine-0.14.1",
7725
7725
  "relatedSpdxElement": "SPDXRef-Package-safe-regex-2.1.1",
7726
7726
  "relationshipType": "DEPENDS_ON"
7727
7727
  },
7728
7728
  {
7729
- "spdxElementId": "SPDXRef-Package--kici-dev-engine-0.13.0",
7729
+ "spdxElementId": "SPDXRef-Package--kici-dev-engine-0.14.1",
7730
7730
  "relatedSpdxElement": "SPDXRef-Package-yaml-2.9.1",
7731
7731
  "relationshipType": "DEPENDS_ON"
7732
7732
  },
7733
7733
  {
7734
- "spdxElementId": "SPDXRef-Package--kici-dev-engine-0.13.0",
7734
+ "spdxElementId": "SPDXRef-Package--kici-dev-engine-0.14.1",
7735
7735
  "relatedSpdxElement": "SPDXRef-Package-zod-4.6.5",
7736
7736
  "relationshipType": "DEPENDS_ON"
7737
7737
  },
@@ -7767,12 +7767,12 @@
7767
7767
  },
7768
7768
  {
7769
7769
  "spdxElementId": "SPDXRef-RootPackage",
7770
- "relatedSpdxElement": "SPDXRef-Package--kici-dev-engine-0.13.0",
7770
+ "relatedSpdxElement": "SPDXRef-Package--kici-dev-engine-0.14.1",
7771
7771
  "relationshipType": "DEPENDS_ON"
7772
7772
  },
7773
7773
  {
7774
7774
  "spdxElementId": "SPDXRef-RootPackage",
7775
- "relatedSpdxElement": "SPDXRef-Package--kici-dev-shared-0.13.0",
7775
+ "relatedSpdxElement": "SPDXRef-Package--kici-dev-shared-0.14.1",
7776
7776
  "relationshipType": "DEPENDS_ON"
7777
7777
  },
7778
7778
  {
@@ -7881,117 +7881,117 @@
7881
7881
  "relationshipType": "DEPENDS_ON"
7882
7882
  },
7883
7883
  {
7884
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.13.0",
7884
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.14.1",
7885
7885
  "relatedSpdxElement": "SPDXRef-Package--aws-sdk-client-s3-3.1135.0",
7886
7886
  "relationshipType": "DEPENDS_ON"
7887
7887
  },
7888
7888
  {
7889
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.13.0",
7890
- "relatedSpdxElement": "SPDXRef-Package--kici-dev-core-0.13.0",
7889
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.14.1",
7890
+ "relatedSpdxElement": "SPDXRef-Package--kici-dev-core-0.14.1",
7891
7891
  "relationshipType": "DEPENDS_ON"
7892
7892
  },
7893
7893
  {
7894
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.13.0",
7895
- "relatedSpdxElement": "SPDXRef-Package--kici-dev-engine-0.13.0",
7894
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.14.1",
7895
+ "relatedSpdxElement": "SPDXRef-Package--kici-dev-engine-0.14.1",
7896
7896
  "relationshipType": "DEPENDS_ON"
7897
7897
  },
7898
7898
  {
7899
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.13.0",
7899
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.14.1",
7900
7900
  "relatedSpdxElement": "SPDXRef-Package--opentelemetry-api-1.9.1",
7901
7901
  "relationshipType": "DEPENDS_ON"
7902
7902
  },
7903
7903
  {
7904
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.13.0",
7904
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.14.1",
7905
7905
  "relatedSpdxElement": "SPDXRef-Package--opentelemetry-exporter-metrics-otlp-http-0.222.0",
7906
7906
  "relationshipType": "DEPENDS_ON"
7907
7907
  },
7908
7908
  {
7909
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.13.0",
7909
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.14.1",
7910
7910
  "relatedSpdxElement": "SPDXRef-Package--opentelemetry-exporter-prometheus-0.222.0",
7911
7911
  "relationshipType": "DEPENDS_ON"
7912
7912
  },
7913
7913
  {
7914
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.13.0",
7914
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.14.1",
7915
7915
  "relatedSpdxElement": "SPDXRef-Package--opentelemetry-exporter-trace-otlp-http-0.222.0",
7916
7916
  "relationshipType": "DEPENDS_ON"
7917
7917
  },
7918
7918
  {
7919
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.13.0",
7919
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.14.1",
7920
7920
  "relatedSpdxElement": "SPDXRef-Package--opentelemetry-instrumentation-runtime-node-0.35.0",
7921
7921
  "relationshipType": "DEPENDS_ON"
7922
7922
  },
7923
7923
  {
7924
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.13.0",
7924
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.14.1",
7925
7925
  "relatedSpdxElement": "SPDXRef-Package--opentelemetry-resources-2.11.0",
7926
7926
  "relationshipType": "DEPENDS_ON"
7927
7927
  },
7928
7928
  {
7929
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.13.0",
7929
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.14.1",
7930
7930
  "relatedSpdxElement": "SPDXRef-Package--opentelemetry-sdk-node-0.222.0",
7931
7931
  "relationshipType": "DEPENDS_ON"
7932
7932
  },
7933
7933
  {
7934
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.13.0",
7934
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.14.1",
7935
7935
  "relatedSpdxElement": "SPDXRef-Package--opentelemetry-semantic-conventions-1.43.0",
7936
7936
  "relationshipType": "DEPENDS_ON"
7937
7937
  },
7938
7938
  {
7939
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.13.0",
7939
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.14.1",
7940
7940
  "relatedSpdxElement": "SPDXRef-Package-archiver-8.0.0",
7941
7941
  "relationshipType": "DEPENDS_ON"
7942
7942
  },
7943
7943
  {
7944
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.13.0",
7944
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.14.1",
7945
7945
  "relatedSpdxElement": "SPDXRef-Package-diff-9.0.0",
7946
7946
  "relationshipType": "DEPENDS_ON"
7947
7947
  },
7948
7948
  {
7949
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.13.0",
7949
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.14.1",
7950
7950
  "relatedSpdxElement": "SPDXRef-Package-hono-4.13.7",
7951
7951
  "relationshipType": "DEPENDS_ON"
7952
7952
  },
7953
7953
  {
7954
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.13.0",
7954
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.14.1",
7955
7955
  "relatedSpdxElement": "SPDXRef-Package-kysely-0.29.4",
7956
7956
  "relationshipType": "DEPENDS_ON"
7957
7957
  },
7958
7958
  {
7959
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.13.0",
7959
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.14.1",
7960
7960
  "relatedSpdxElement": "SPDXRef-Package-oxc-transform-0.150.0",
7961
7961
  "relationshipType": "DEPENDS_ON"
7962
7962
  },
7963
7963
  {
7964
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.13.0",
7964
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.14.1",
7965
7965
  "relatedSpdxElement": "SPDXRef-Package-pg-8.23.0",
7966
7966
  "relationshipType": "DEPENDS_ON"
7967
7967
  },
7968
7968
  {
7969
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.13.0",
7969
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.14.1",
7970
7970
  "relatedSpdxElement": "SPDXRef-Package-picocolors-1.1.1",
7971
7971
  "relationshipType": "DEPENDS_ON"
7972
7972
  },
7973
7973
  {
7974
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.13.0",
7974
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.14.1",
7975
7975
  "relatedSpdxElement": "SPDXRef-Package-winston-daily-rotate-file-5.0.0",
7976
7976
  "relationshipType": "DEPENDS_ON"
7977
7977
  },
7978
7978
  {
7979
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.13.0",
7979
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.14.1",
7980
7980
  "relatedSpdxElement": "SPDXRef-Package-winston-3.19.0",
7981
7981
  "relationshipType": "DEPENDS_ON"
7982
7982
  },
7983
7983
  {
7984
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.13.0",
7984
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.14.1",
7985
7985
  "relatedSpdxElement": "SPDXRef-Package-yaml-2.9.1",
7986
7986
  "relationshipType": "DEPENDS_ON"
7987
7987
  },
7988
7988
  {
7989
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.13.0",
7989
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.14.1",
7990
7990
  "relatedSpdxElement": "SPDXRef-Package-zod-4.6.5",
7991
7991
  "relationshipType": "DEPENDS_ON"
7992
7992
  },
7993
7993
  {
7994
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.13.0",
7994
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.14.1",
7995
7995
  "relatedSpdxElement": "SPDXRef-Package-zx-8.8.5",
7996
7996
  "relationshipType": "DEPENDS_ON"
7997
7997
  },