@kici-dev/orchestrator 0.1.3 → 0.1.6

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 (73) hide show
  1. package/dist/agent/dispatcher.d.ts +26 -0
  2. package/dist/agent/ownership-tracker.d.ts +45 -3
  3. package/dist/app.d.ts +9 -3
  4. package/dist/audit/access-log.d.ts +7 -0
  5. package/dist/cli/api-client.d.ts +14 -0
  6. package/dist/cli/commands/cluster-name.d.ts +18 -0
  7. package/dist/cli/commands/db.d.ts +9 -6
  8. package/dist/cli/commands/org-settings.d.ts +2 -1
  9. package/dist/cli/commands/shared/secret-input.d.ts +46 -0
  10. package/dist/cli/commands/variable.d.ts +18 -0
  11. package/dist/cli/service/index.d.ts +1 -0
  12. package/dist/cli/service/launchd.d.ts +19 -0
  13. package/dist/cli/service/privilege.d.ts +21 -0
  14. package/dist/cli/wizard/orchestrator-wizard.d.ts +4 -2
  15. package/dist/cli.js +1074 -225
  16. package/dist/cluster/coordinator.d.ts +3 -3
  17. package/dist/cluster/join-token.d.ts +21 -13
  18. package/dist/cluster/peer-client.d.ts +9 -0
  19. package/dist/config/cluster-id.d.ts +23 -0
  20. package/dist/config/cluster-name.d.ts +39 -0
  21. package/dist/config.d.ts +8 -0
  22. package/dist/dashboard/handler.d.ts +54 -2
  23. package/dist/db/migrations/019_generic_sources_change_notify.d.ts +25 -0
  24. package/dist/db/migrations/020_org_settings_dashboard_write_policy.d.ts +17 -0
  25. package/dist/db/migrations/021_check_run_tracking.d.ts +26 -0
  26. package/dist/db/migrations/022_scaler_manager_state.d.ts +29 -0
  27. package/dist/db/migrations/023_dispatch_queue_recovery_deadline.d.ts +26 -0
  28. package/dist/db/types.d.ts +137 -0
  29. package/dist/events/event-store.d.ts +9 -2
  30. package/dist/events/trust-store.d.ts +7 -0
  31. package/dist/events/types.d.ts +33 -0
  32. package/dist/metrics/scheduled-jobs.d.ts +26 -5
  33. package/dist/orchestrator-core.d.ts +16 -2
  34. package/dist/pipeline/processor.d.ts +2 -2
  35. package/dist/pipeline/rerun.d.ts +2 -2
  36. package/dist/pipeline/test-pipeline.d.ts +2 -2
  37. package/dist/policy/dashboard-write-policy.d.ts +115 -0
  38. package/dist/queue/job-queue.d.ts +54 -1
  39. package/dist/reporting/{commit-status.d.ts → check-run-reporter.d.ts} +94 -16
  40. package/dist/reporting/check-run-tracking-store.d.ts +133 -0
  41. package/dist/routes/admin-access-log.d.ts +1 -0
  42. package/dist/routes/admin-backends.d.ts +9 -1
  43. package/dist/routes/admin-cluster-name.d.ts +50 -0
  44. package/dist/routes/admin-db.d.ts +9 -1
  45. package/dist/routes/admin-environments.d.ts +10 -6
  46. package/dist/routes/admin-event-dlq.d.ts +1 -0
  47. package/dist/routes/admin-event-log.d.ts +1 -0
  48. package/dist/routes/admin-events.d.ts +19 -0
  49. package/dist/routes/admin-maintenance.d.ts +9 -1
  50. package/dist/routes/admin-org-settings.d.ts +10 -1
  51. package/dist/routes/admin-queue-execution.d.ts +1 -0
  52. package/dist/routes/admin-registrations.d.ts +1 -0
  53. package/dist/routes/admin-runs.d.ts +1 -0
  54. package/dist/routes/admin-scheduled-jobs.d.ts +1 -0
  55. package/dist/routes/admin-sources.d.ts +24 -1
  56. package/dist/routes/admin.d.ts +22 -0
  57. package/dist/scaler/manager.d.ts +38 -0
  58. package/dist/scaler/scaler-state-store.d.ts +102 -0
  59. package/dist/secrets/routing-key-scope.d.ts +43 -0
  60. package/dist/server.js +10098 -6961
  61. package/dist/sources/build-platform-sources.d.ts +26 -0
  62. package/dist/sources/source-manager.d.ts +14 -0
  63. package/dist/stale-detector/stale-run-detector.d.ts +17 -5
  64. package/dist/standalone.js +7525 -5172
  65. package/dist/webhook/generic-sources-listener.d.ts +89 -0
  66. package/dist/webhook/register-source-bundle.d.ts +57 -0
  67. package/dist/ws/dashboard-backends-handler.d.ts +14 -0
  68. package/dist/ws/dashboard-env-handler.d.ts +7 -0
  69. package/dist/ws/dashboard-global-workflows-handler.d.ts +6 -0
  70. package/dist/ws/dashboard-registrations-handler.d.ts +7 -0
  71. package/dist/ws/platform-client.d.ts +57 -2
  72. package/package.json +3 -3
  73. package/sbom.spdx.json +40 -35
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Cross-peer propagation of generic-webhook-source registration changes.
3
+ *
4
+ * Sister to the GitHub-app `SourceManager`
5
+ * (`packages/orchestrator/src/sources/source-manager.ts`), which owns the
6
+ * `sources_change` channel. This listener owns `generic_sources_change`
7
+ * — the channel the migration-019 trigger emits on every INSERT, UPDATE,
8
+ * or DELETE of a `generic_webhook_sources` row.
9
+ *
10
+ * On NOTIFY:
11
+ * 1. Queue the affected `routing_key` (the channel payload).
12
+ * 2. Debounce 200 ms so rapid edits coalesce into one drain pass.
13
+ * 3. For each queued routing_key:
14
+ * - Re-query `GenericSourceManager.getByRoutingKey()`. The query
15
+ * already filters out soft-deleted (`deleted_at IS NOT NULL`)
16
+ * and disabled (`enabled = false`) rows.
17
+ * - If the row is gone (DELETE, soft-delete, or disable):
18
+ * `providerRegistry.unregister(routingKey)`.
19
+ * - Otherwise: `registerProviderBundleForSource(row, deps)`
20
+ * (idempotent — a second call replaces the prior bundle).
21
+ *
22
+ * The listener does NOT own the `ProviderRegistry` — it mutates the
23
+ * shared instance the rest of the orchestrator dispatches against. This
24
+ * differs from `SourceManager`, which rebuilds a fresh registry on
25
+ * every reload and asks the caller to swap the reference. The reason is
26
+ * shared ownership: the GitHub-app and generic-webhook sources both
27
+ * populate the same `ProviderRegistry` instance, so a wholesale rebuild
28
+ * by one of them would clobber the other's bundles.
29
+ *
30
+ * The admin POST/PATCH/DELETE handlers in `routes/admin-events.ts` ALSO
31
+ * mutate the registry inline so the API response is self-consistent on
32
+ * the issuing peer (a webhook fired immediately after a 200 OK sees the
33
+ * change without waiting for the NOTIFY round-trip). The local NOTIFY
34
+ * fires too — `registerByRoutingKey` is idempotent, so the redundant
35
+ * apply is harmless.
36
+ */
37
+ import type pg from 'pg';
38
+ import type { GenericSourceManager } from './generic-sources.js';
39
+ import type { ProviderRegistry } from '../provider-registry.js';
40
+ import type { AppConfig } from '../config.js';
41
+ import type { SecretResolver } from '../secrets/secret-resolver.js';
42
+ export interface GenericSourcesChangeListenerOptions {
43
+ /** Raw pg pool — a dedicated PoolClient is checked out for LISTEN. */
44
+ pool: pg.Pool;
45
+ /** Used to re-query the affected row by routing_key on each NOTIFY. */
46
+ sourceManager: GenericSourceManager;
47
+ /** Mutated in place — registerByRoutingKey / unregister. */
48
+ providerRegistry: ProviderRegistry;
49
+ /** Gates internal-provider bundle registration in the helper. */
50
+ config: AppConfig;
51
+ /** Required for universal-git source rows; null is acceptable on
52
+ * peers that cannot serve them. */
53
+ secretResolver: SecretResolver | null;
54
+ /** Coalesce window for rapid NOTIFYs against the same row. Default 200 ms. */
55
+ debounceMs?: number;
56
+ /**
57
+ * Invoked once per drain pass that applied at least one change. The
58
+ * platform-mode boot wires this to re-push the full source list to the
59
+ * Platform (`platformClient.updateSources()`) so a generic source added /
60
+ * removed at runtime reaches the Platform's `webhook_sources` immediately,
61
+ * not just the local registry.
62
+ */
63
+ onChange?: () => void;
64
+ }
65
+ export declare class GenericSourcesChangeListener {
66
+ private readonly opts;
67
+ private client;
68
+ private readonly pending;
69
+ private debounceTimer;
70
+ private readonly debounceMs;
71
+ /**
72
+ * Drain-applied-change callback. Mutable so the platform-mode boot can wire
73
+ * it after the Platform client exists (this listener is constructed before).
74
+ */
75
+ private onChange?;
76
+ constructor(opts: GenericSourcesChangeListenerOptions);
77
+ /** Replace the drain-applied-change callback after construction. */
78
+ setOnChange(cb: () => void): void;
79
+ /** Open the dedicated client and subscribe. Cold-boot bundle
80
+ * registration is handled by the orchestrator-core startup loop
81
+ * via the same helper; this listener only services warm-path
82
+ * NOTIFYs. */
83
+ start(): Promise<void>;
84
+ stop(): Promise<void>;
85
+ private scheduleDrain;
86
+ /** Visible for tests — drain the queued routing_keys synchronously. */
87
+ drain(): Promise<void>;
88
+ }
89
+ //# sourceMappingURL=generic-sources-listener.d.ts.map
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Per-source provider-bundle registration.
3
+ *
4
+ * Three call sites need this logic; the helper exists so they don't
5
+ * each carry a copy of the `provider_type` / `git_config` dispatch:
6
+ *
7
+ * 1. `orchestrator-core.ts` startup, where it loops over every source
8
+ * already in `generic_webhook_sources` and registers the matching
9
+ * provider bundle into `ProviderRegistry`. Cold-boot path.
10
+ * 2. The admin HTTP handlers in `admin-events.ts` —
11
+ * `POST /api/v1/admin/generic-sources` and the matching PATCH /
12
+ * DELETE / enable / disable endpoints. Calling the helper inline
13
+ * makes the API response self-consistent on the issuing peer (a
14
+ * webhook fired immediately after the 200 reaches the right
15
+ * normalizer without waiting for the `pg_notify` round-trip).
16
+ * 3. `GenericSourcesChangeListener` (`webhook/generic-sources-listener.ts`),
17
+ * which listens for the migration-019 `pg_notify('generic_sources_change',
18
+ * routing_key)` and applies the change on every other peer in the
19
+ * HA cluster.
20
+ *
21
+ * `registerProviderBundleForSource` is the single source of truth. It
22
+ * dispatches on `row.provider_type` and `row.git_config` so callers
23
+ * don't have to know which bundle to build — they hand over the row +
24
+ * the orchestrator's already-instantiated registry / config /
25
+ * secret-resolver and we do the right thing.
26
+ *
27
+ * Failure semantics match the startup behaviour: internal-only-but-
28
+ * unservable peers log + skip (no throw); universal-git config errors
29
+ * bump the per-row metric + log but never propagate. The caller can
30
+ * assume "returns normally" means "the right thing happened or we
31
+ * recorded why it didn't".
32
+ */
33
+ import type { AppConfig } from '../config.js';
34
+ import type { ProviderRegistry } from '../provider-registry.js';
35
+ import type { SecretResolver } from '../secrets/secret-resolver.js';
36
+ import type { GenericWebhookSource } from '../db/types.js';
37
+ export interface RegisterSourceBundleDeps {
38
+ providerRegistry: ProviderRegistry;
39
+ config: AppConfig;
40
+ /** Required for universal-git source rows. Null is allowed; rows that
41
+ * carry `git_config` will be skipped with a metric bump. */
42
+ secretResolver: SecretResolver | null;
43
+ }
44
+ /**
45
+ * Register the per-routing-key provider bundle a source row needs.
46
+ *
47
+ * - `provider_type='internal'`: registers an `InternalWebhookNormalizer`
48
+ * bundle when the peer can serve it (gated on
49
+ * `internalProviderRepoPath` per `canServeGenericProviderType`).
50
+ * - `git_config IS NOT NULL`: registers a universal-git bundle.
51
+ * - everything else: no-op — the default `'generic'` bundle handles it.
52
+ *
53
+ * Idempotent under `ProviderRegistry.registerByRoutingKey` semantics: a
54
+ * second call with the same routing key replaces the prior bundle.
55
+ */
56
+ export declare function registerProviderBundleForSource(row: GenericWebhookSource, deps: RegisterSourceBundleDeps): void;
57
+ //# sourceMappingURL=register-source-bundle.d.ts.map
@@ -2,12 +2,16 @@ import type { BackendSyncManager, DashboardPlatformToOrchMessage } from '@kici-d
2
2
  import type { BackendRegistry } from '../secrets/backend-registry.js';
3
3
  import type { BackendHealthChecker } from '../secrets/backend-health.js';
4
4
  import type { AccessLogWriter } from '../audit/access-log.js';
5
+ import type { Kysely } from 'kysely';
6
+ import type { Database } from '../db/types.js';
5
7
  interface DashboardBackendsHandlerDeps {
6
8
  /** Send a response message back to Platform over the WS connection. */
7
9
  send: (msg: unknown) => void;
8
10
  registry: BackendRegistry;
9
11
  healthChecker: BackendHealthChecker;
10
12
  syncManager?: BackendSyncManager;
13
+ /** Database — required for dashboard-write policy lookups. */
14
+ db: Kysely<Database>;
11
15
  /** Access log writer — records one row per read / mutation with actor attribution. */
12
16
  accessLog?: AccessLogWriter;
13
17
  /** Org ID for access_log rows (null when the orchestrator isn't org-scoped). */
@@ -31,6 +35,16 @@ export declare class DashboardBackendsHandler {
31
35
  * the single tenant org from the `sources` / `generic_webhook_sources` table.
32
36
  */
33
37
  setOrgContext(orgId: string | null, routingKey: string | null): void;
38
+ /**
39
+ * Defense-in-depth dashboard-write policy gate. Returns true when the
40
+ * operation is allowed and the caller should proceed. Returns false
41
+ * when the policy is disabled — also records a `denied` access_log row
42
+ * and emits a structured `operation_disabled` envelope on the WS.
43
+ *
44
+ * Fails open when no org is bound — the orch hasn't resolved a
45
+ * customer yet, so there's nothing to look up.
46
+ */
47
+ private enforcePolicy;
34
48
  /**
35
49
  * Write an access_log row for a handler invocation. Best-effort; the writer
36
50
  * swallows failures.
@@ -59,6 +59,13 @@ export declare class DashboardEnvHandler {
59
59
  setOrgId(orgId: string): void;
60
60
  /** Update the routing key bound to access_log rows. */
61
61
  setRoutingKey(routingKey: string | null): void;
62
+ /**
63
+ * Defense-in-depth dashboard-write policy gate. Returns true when the
64
+ * operation is allowed and the caller should proceed. Returns false when
65
+ * the policy is disabled — also records a `denied` access_log row and
66
+ * sends a structured `operation_disabled` envelope back to Platform.
67
+ */
68
+ private enforcePolicy;
62
69
  /**
63
70
  * Write an access_log row for a handler invocation. Uses the handler's
64
71
  * bound orgId + routingKey, the msg.actor principal, and the handler-
@@ -38,6 +38,12 @@ export declare class DashboardGlobalWorkflowsHandler {
38
38
  constructor(deps: DashboardGlobalWorkflowsHandlerDeps);
39
39
  /** Update the customer / org id this handler operates on. */
40
40
  setOrgId(customerId: string | null): void;
41
+ /**
42
+ * Defense-in-depth dashboard-write policy gate. Returns true when the
43
+ * operation is allowed; false (with a structured `operation_disabled`
44
+ * envelope and a `denied` access_log row) when policy says no.
45
+ */
46
+ private enforcePolicy;
41
47
  /**
42
48
  * Write an access_log row for a handler invocation. Best-effort; the writer
43
49
  * swallows failures.
@@ -57,6 +57,13 @@ export declare class DashboardRegistrationsHandler {
57
57
  setOrgId(orgId: string): void;
58
58
  /** Update the routing key bound to access_log rows. */
59
59
  setRoutingKey(routingKey: string | null): void;
60
+ /**
61
+ * Defense-in-depth dashboard-write policy gate. Returns true when the
62
+ * operation is allowed and the caller should proceed. Returns false
63
+ * when the policy is disabled — also records a `denied` access_log row
64
+ * and emits a structured `operation_disabled` envelope on the WS.
65
+ */
66
+ private enforcePolicy;
60
67
  /**
61
68
  * Write an access_log row for a handler invocation. Uses the handler's
62
69
  * bound orgId + routingKey, the msg.actor principal, and the handler-
@@ -36,6 +36,20 @@ export interface PlatformClientOptions {
36
36
  providerSources?: ProviderSource[];
37
37
  /** Orchestrator cluster instance ID (sent in source.register for peer correlation). */
38
38
  instanceId?: string;
39
+ /**
40
+ * Human-friendly cluster name resolved on orch boot
41
+ * (`cluster_meta.cluster_name`). Sent in source.register so Platform
42
+ * can route per-orch dashboard requests by this identifier.
43
+ */
44
+ clusterName?: string;
45
+ /**
46
+ * Orchestrator DB identifier (UUID, seeded by migration 001 in
47
+ * `cluster_meta` key `'cluster_id'`). Sent in source.register so
48
+ * Platform can warn when two unrelated clusters in the same org
49
+ * accidentally share a `clusterName`. HA siblings share the same orch
50
+ * DB and therefore the same `clusterId`.
51
+ */
52
+ clusterId?: string;
39
53
  /** Reachable address for peer-to-peer connections (from KICI_CLUSTER_ADDRESS env var). Null if not configured. */
40
54
  address?: string | null;
41
55
  /** Orchestrator version string (e.g. "0.0.1"). Sent in source.register for diagnostics. */
@@ -140,7 +154,15 @@ export declare class PlatformClient {
140
154
  private readonly token;
141
155
  private readonly onWebhookRelay;
142
156
  private providerSources;
157
+ /**
158
+ * Pending `registerSourceAndAwait()` callers, keyed by routing key. Resolved
159
+ * with the Platform-computed webhook URL when the matching
160
+ * `source.register.ack` arrives, or rejected on timeout / disconnect.
161
+ */
162
+ private readonly pendingSourceRegistrations;
143
163
  private readonly instanceId?;
164
+ private readonly clusterName?;
165
+ private readonly clusterId?;
144
166
  private readonly address?;
145
167
  private readonly version?;
146
168
  private readonly mode?;
@@ -166,7 +188,7 @@ export declare class PlatformClient {
166
188
  private readonly onTrustPolicyUpdate?;
167
189
  private readonly onStaleCheckrunCleanup?;
168
190
  private readonly onJoinRequest?;
169
- private readonly orchCapabilities;
191
+ private orchCapabilities;
170
192
  private readonly onVerifyInbound?;
171
193
  private readonly relayBuffer;
172
194
  /**
@@ -180,10 +202,23 @@ export declare class PlatformClient {
180
202
  /**
181
203
  * Returns the cached public alias of the orchestrator's owning org,
182
204
  * or `undefined` if Platform has not supplied one yet. Read by
183
- * `commit-status.ts` when building `details_url`.
205
+ * `check-run-reporter.ts` when building `details_url`.
184
206
  */
185
207
  getOrgPublicAlias(): string | undefined;
186
208
  constructor(options: PlatformClientOptions);
209
+ /**
210
+ * Merge `updates` into the stored orch capabilities and broadcast the
211
+ * full set to Platform via `orch.capabilities.update`. Buffers via
212
+ * `send()` when not yet authenticated. The next `auth.request` will
213
+ * also carry the merged capabilities, so a reconnect-followed-by-
214
+ * runtime-broadcast still ends Platform in the correct cache state.
215
+ */
216
+ broadcastCapabilities(updates: Partial<OrchCapabilities>): void;
217
+ /**
218
+ * Current merged orchestrator capabilities. Read-only view used by
219
+ * tests and diagnostics; mutate via `broadcastCapabilities`.
220
+ */
221
+ getCapabilities(): OrchCapabilities;
187
222
  /** Current connection state. */
188
223
  get state(): ConnectionState;
189
224
  /** Number of messages currently buffered. */
@@ -233,6 +268,26 @@ export declare class PlatformClient {
233
268
  * Convenience method for config reload that atomically updates routing.
234
269
  */
235
270
  updateSources(newSources: ProviderSource[]): void;
271
+ /**
272
+ * Push the full source list to the Platform and resolve with the webhook URL
273
+ * the Platform computed for `routingKey` (from the `source.register.ack`), or
274
+ * `null` if the Platform has no public webhook base configured.
275
+ *
276
+ * Used by `kici-admin source add` (platform/hybrid mode) to print the URL
277
+ * synchronously. Passing the **full** source list keeps this on the single
278
+ * `updateSources` push path — the routing key being newly added means
279
+ * `updateSources` emits a `source.register` whose ack carries the URL; the
280
+ * later NOTIFY-driven republish then diffs to a no-op.
281
+ *
282
+ * Rejects on timeout or disconnect; the caller degrades to a "(unavailable)"
283
+ * note rather than fabricating a URL.
284
+ */
285
+ registerSourceAndAwait(fullSources: ProviderSource[], routingKey: string, timeoutMs?: number): Promise<string | null>;
286
+ /**
287
+ * Reject every pending `registerSourceAndAwait()` — called on disconnect so a
288
+ * `source add` issued while the link drops fails fast instead of hanging.
289
+ */
290
+ private rejectPendingSourceRegistrations;
236
291
  getReconnectDelay(): number;
237
292
  private doConnect;
238
293
  private handleMessage;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kici-dev/orchestrator",
3
- "version": "0.1.3",
3
+ "version": "0.1.6",
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
  "kici",
@@ -80,8 +80,8 @@
80
80
  "ws": "^8.20.0",
81
81
  "yaml": "^2.8.3",
82
82
  "zod": "^4.3.6",
83
- "@kici-dev/engine": "0.1.3",
84
- "@kici-dev/shared": "0.1.3"
83
+ "@kici-dev/engine": "0.1.6",
84
+ "@kici-dev/shared": "0.1.6"
85
85
  },
86
86
  "kici": {
87
87
  "metrics": {
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.1.3",
6
- "documentNamespace": "https://kici.dev/sbom/%40kici-dev%2Forchestrator/0.1.3/a7e5ea69-4ff5-4a0c-b8ed-4f9848407372",
5
+ "name": "@kici-dev/orchestrator@0.1.6",
6
+ "documentNamespace": "https://kici.dev/sbom/%40kici-dev%2Forchestrator/0.1.6/38c048ce-020f-4f87-a88d-3158aaebd7e8",
7
7
  "creationInfo": {
8
- "created": "2026-05-15T14:17:23Z",
8
+ "created": "2026-05-26T05:00:30Z",
9
9
  "creators": [
10
10
  "Tool: kici-sbom-generator"
11
11
  ]
@@ -1477,9 +1477,9 @@
1477
1477
  "homepage": "https://ericsmekens.github.io/jsep/tree/master/packages/regex#readme"
1478
1478
  },
1479
1479
  {
1480
- "SPDXID": "SPDXRef-Package--kici-dev-engine-0.1.3",
1480
+ "SPDXID": "SPDXRef-Package--kici-dev-engine-0.1.6",
1481
1481
  "name": "@kici-dev/engine",
1482
- "versionInfo": "0.1.3",
1482
+ "versionInfo": "0.1.6",
1483
1483
  "downloadLocation": "NOASSERTION",
1484
1484
  "filesAnalyzed": false,
1485
1485
  "licenseConcluded": "NOASSERTION",
@@ -1490,7 +1490,7 @@
1490
1490
  {
1491
1491
  "referenceCategory": "PACKAGE-MANAGER",
1492
1492
  "referenceType": "purl",
1493
- "referenceLocator": "pkg:npm/%40kici-dev/engine@0.1.3"
1493
+ "referenceLocator": "pkg:npm/%40kici-dev/engine@0.1.6"
1494
1494
  }
1495
1495
  ],
1496
1496
  "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.",
@@ -1499,7 +1499,7 @@
1499
1499
  {
1500
1500
  "SPDXID": "SPDXRef-RootPackage",
1501
1501
  "name": "@kici-dev/orchestrator",
1502
- "versionInfo": "0.1.3",
1502
+ "versionInfo": "0.1.6",
1503
1503
  "downloadLocation": "NOASSERTION",
1504
1504
  "filesAnalyzed": false,
1505
1505
  "licenseConcluded": "NOASSERTION",
@@ -1510,16 +1510,16 @@
1510
1510
  {
1511
1511
  "referenceCategory": "PACKAGE-MANAGER",
1512
1512
  "referenceType": "purl",
1513
- "referenceLocator": "pkg:npm/%40kici-dev/orchestrator@0.1.3"
1513
+ "referenceLocator": "pkg:npm/%40kici-dev/orchestrator@0.1.6"
1514
1514
  }
1515
1515
  ],
1516
1516
  "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.",
1517
1517
  "homepage": "https://kici.dev"
1518
1518
  },
1519
1519
  {
1520
- "SPDXID": "SPDXRef-Package--kici-dev-shared-0.1.3",
1520
+ "SPDXID": "SPDXRef-Package--kici-dev-shared-0.1.6",
1521
1521
  "name": "@kici-dev/shared",
1522
- "versionInfo": "0.1.3",
1522
+ "versionInfo": "0.1.6",
1523
1523
  "downloadLocation": "NOASSERTION",
1524
1524
  "filesAnalyzed": false,
1525
1525
  "licenseConcluded": "NOASSERTION",
@@ -1530,7 +1530,7 @@
1530
1530
  {
1531
1531
  "referenceCategory": "PACKAGE-MANAGER",
1532
1532
  "referenceType": "purl",
1533
- "referenceLocator": "pkg:npm/%40kici-dev/shared@0.1.3"
1533
+ "referenceLocator": "pkg:npm/%40kici-dev/shared@0.1.6"
1534
1534
  }
1535
1535
  ],
1536
1536
  "description": "Shared utilities for the KiCI CI/CD stack — logging, zx setup, crypto, telemetry, health and metrics routes. No business logic.",
@@ -10682,17 +10682,17 @@
10682
10682
  "relationshipType": "DEPENDS_ON"
10683
10683
  },
10684
10684
  {
10685
- "spdxElementId": "SPDXRef-Package--kici-dev-engine-0.1.3",
10685
+ "spdxElementId": "SPDXRef-Package--kici-dev-engine-0.1.6",
10686
10686
  "relatedSpdxElement": "SPDXRef-Package-jsonpath-plus-10.4.0",
10687
10687
  "relationshipType": "DEPENDS_ON"
10688
10688
  },
10689
10689
  {
10690
- "spdxElementId": "SPDXRef-Package--kici-dev-engine-0.1.3",
10690
+ "spdxElementId": "SPDXRef-Package--kici-dev-engine-0.1.6",
10691
10691
  "relatedSpdxElement": "SPDXRef-Package-picomatch-4.0.4",
10692
10692
  "relationshipType": "DEPENDS_ON"
10693
10693
  },
10694
10694
  {
10695
- "spdxElementId": "SPDXRef-Package--kici-dev-engine-0.1.3",
10695
+ "spdxElementId": "SPDXRef-Package--kici-dev-engine-0.1.6",
10696
10696
  "relatedSpdxElement": "SPDXRef-Package-zod-4.3.6",
10697
10697
  "relationshipType": "DEPENDS_ON"
10698
10698
  },
@@ -10728,12 +10728,12 @@
10728
10728
  },
10729
10729
  {
10730
10730
  "spdxElementId": "SPDXRef-RootPackage",
10731
- "relatedSpdxElement": "SPDXRef-Package--kici-dev-engine-0.1.3",
10731
+ "relatedSpdxElement": "SPDXRef-Package--kici-dev-engine-0.1.6",
10732
10732
  "relationshipType": "DEPENDS_ON"
10733
10733
  },
10734
10734
  {
10735
10735
  "spdxElementId": "SPDXRef-RootPackage",
10736
- "relatedSpdxElement": "SPDXRef-Package--kici-dev-shared-0.1.3",
10736
+ "relatedSpdxElement": "SPDXRef-Package--kici-dev-shared-0.1.6",
10737
10737
  "relationshipType": "DEPENDS_ON"
10738
10738
  },
10739
10739
  {
@@ -10837,97 +10837,102 @@
10837
10837
  "relationshipType": "DEPENDS_ON"
10838
10838
  },
10839
10839
  {
10840
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.3",
10840
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.6",
10841
10841
  "relatedSpdxElement": "SPDXRef-Package--aws-sdk-client-s3-3.1038.0",
10842
10842
  "relationshipType": "DEPENDS_ON"
10843
10843
  },
10844
10844
  {
10845
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.3",
10845
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.6",
10846
10846
  "relatedSpdxElement": "SPDXRef-Package--opentelemetry-api-1.9.1",
10847
10847
  "relationshipType": "DEPENDS_ON"
10848
10848
  },
10849
10849
  {
10850
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.3",
10850
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.6",
10851
10851
  "relatedSpdxElement": "SPDXRef-Package--opentelemetry-exporter-metrics-otlp-http-0.217.0",
10852
10852
  "relationshipType": "DEPENDS_ON"
10853
10853
  },
10854
10854
  {
10855
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.3",
10855
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.6",
10856
10856
  "relatedSpdxElement": "SPDXRef-Package--opentelemetry-exporter-prometheus-0.217.0",
10857
10857
  "relationshipType": "DEPENDS_ON"
10858
10858
  },
10859
10859
  {
10860
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.3",
10860
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.6",
10861
10861
  "relatedSpdxElement": "SPDXRef-Package--opentelemetry-exporter-trace-otlp-http-0.217.0",
10862
10862
  "relationshipType": "DEPENDS_ON"
10863
10863
  },
10864
10864
  {
10865
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.3",
10865
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.6",
10866
10866
  "relatedSpdxElement": "SPDXRef-Package--opentelemetry-instrumentation-runtime-node-0.28.0",
10867
10867
  "relationshipType": "DEPENDS_ON"
10868
10868
  },
10869
10869
  {
10870
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.3",
10870
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.6",
10871
10871
  "relatedSpdxElement": "SPDXRef-Package--opentelemetry-resources-2.7.0",
10872
10872
  "relationshipType": "DEPENDS_ON"
10873
10873
  },
10874
10874
  {
10875
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.3",
10875
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.6",
10876
10876
  "relatedSpdxElement": "SPDXRef-Package--opentelemetry-sdk-node-0.217.0",
10877
10877
  "relationshipType": "DEPENDS_ON"
10878
10878
  },
10879
10879
  {
10880
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.3",
10880
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.6",
10881
10881
  "relatedSpdxElement": "SPDXRef-Package--opentelemetry-semantic-conventions-1.40.0",
10882
10882
  "relationshipType": "DEPENDS_ON"
10883
10883
  },
10884
10884
  {
10885
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.3",
10885
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.6",
10886
10886
  "relatedSpdxElement": "SPDXRef-Package-diff-7.0.0",
10887
10887
  "relationshipType": "DEPENDS_ON"
10888
10888
  },
10889
10889
  {
10890
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.3",
10890
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.6",
10891
10891
  "relatedSpdxElement": "SPDXRef-Package-hono-4.12.18",
10892
10892
  "relationshipType": "DEPENDS_ON"
10893
10893
  },
10894
10894
  {
10895
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.3",
10895
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.6",
10896
10896
  "relatedSpdxElement": "SPDXRef-Package-kysely-0.29.0",
10897
10897
  "relationshipType": "DEPENDS_ON"
10898
10898
  },
10899
10899
  {
10900
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.3",
10900
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.6",
10901
10901
  "relatedSpdxElement": "SPDXRef-Package-oxc-transform-0.128.0",
10902
10902
  "relationshipType": "DEPENDS_ON"
10903
10903
  },
10904
10904
  {
10905
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.3",
10905
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.6",
10906
10906
  "relatedSpdxElement": "SPDXRef-Package-pg-8.20.0",
10907
10907
  "relationshipType": "DEPENDS_ON"
10908
10908
  },
10909
10909
  {
10910
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.3",
10910
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.6",
10911
10911
  "relatedSpdxElement": "SPDXRef-Package-picocolors-1.1.1",
10912
10912
  "relationshipType": "DEPENDS_ON"
10913
10913
  },
10914
10914
  {
10915
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.3",
10915
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.6",
10916
10916
  "relatedSpdxElement": "SPDXRef-Package-winston-daily-rotate-file-5.0.0",
10917
10917
  "relationshipType": "DEPENDS_ON"
10918
10918
  },
10919
10919
  {
10920
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.3",
10920
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.6",
10921
10921
  "relatedSpdxElement": "SPDXRef-Package-winston-3.19.0",
10922
10922
  "relationshipType": "DEPENDS_ON"
10923
10923
  },
10924
10924
  {
10925
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.3",
10925
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.6",
10926
+ "relatedSpdxElement": "SPDXRef-Package-yaml-2.8.3",
10927
+ "relationshipType": "DEPENDS_ON"
10928
+ },
10929
+ {
10930
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.6",
10926
10931
  "relatedSpdxElement": "SPDXRef-Package-zod-4.3.6",
10927
10932
  "relationshipType": "DEPENDS_ON"
10928
10933
  },
10929
10934
  {
10930
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.3",
10935
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.6",
10931
10936
  "relatedSpdxElement": "SPDXRef-Package-zx-8.8.5",
10932
10937
  "relationshipType": "DEPENDS_ON"
10933
10938
  },