@kici-dev/agent 0.1.19 → 0.1.21

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/config.d.ts CHANGED
@@ -10,6 +10,7 @@ declare const configSchema: z.ZodObject<{
10
10
  orchestratorUrl: z.ZodString;
11
11
  agentId: z.ZodOptional<z.ZodString>;
12
12
  labels: z.ZodPipe<z.ZodDefault<z.ZodString>, z.ZodTransform<string[], string>>;
13
+ properties: z.ZodPipe<z.ZodDefault<z.ZodString>, z.ZodTransform<Record<string, string | number | boolean>, string>>;
13
14
  roles: z.ZodPipe<z.ZodPipe<z.ZodOptional<z.ZodString>, z.ZodTransform<string[] | undefined, string | undefined>>, z.ZodTransform<string[] | undefined, string[] | undefined>>;
14
15
  port: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
15
16
  logLevel: z.ZodDefault<z.ZodEnum<{
@@ -59,6 +60,7 @@ export type AppConfig = z.infer<typeof configSchema> & {
59
60
  export declare const envDef: import("@kici-dev/shared/env").DefineEnvResult<{
60
61
  orchestratorUrl: string;
61
62
  labels: string[];
63
+ properties: Record<string, string | number | boolean>;
62
64
  roles: string[] | undefined;
63
65
  port: number;
64
66
  logLevel: "error" | "debug" | "info" | "warn";
@@ -86,6 +88,7 @@ export declare const envDef: import("@kici-dev/shared/env").DefineEnvResult<{
86
88
  * - KICI_ORCHESTRATOR_URL (required)
87
89
  * - KICI_AGENT_ID (optional, auto-generated from hostname-uuid8)
88
90
  * - KICI_LABELS (comma-separated, e.g. "linux,docker"). Labels with 'kici-' prefix are reserved.
91
+ * - KICI_PROPERTIES (comma-separated key=value host-vars, e.g. "region=eu,cores=8,gpu=true"). Typed (bool/number/string), reported into the host roster.
89
92
  * - KICI_ROLES (comma-separated agent roles, e.g. "builder,init-runner". undefined=all, empty=execution-only)
90
93
  * - KICI_PORT (default: 8080)
91
94
  * - KICI_LOG_LEVEL (default: info)
@@ -120,6 +123,7 @@ export declare function agentClientConnectionOptions(config: AppConfig): {
120
123
  url: string;
121
124
  agentId: string;
122
125
  labels: string[];
126
+ properties: Record<string, string | number | boolean>;
123
127
  scalerManaged: boolean;
124
128
  token: string | undefined;
125
129
  };
@@ -1,3 +1,4 @@
1
+ import type { CheckMode, CheckStepOutcome } from '@kici-dev/engine';
1
2
  import type { SandboxStepResult } from './types.js';
2
3
  /**
3
4
  * Structured clone auth. Wire-compatible with `gitAuthSchema` on the
@@ -24,11 +25,11 @@ interface StepStartMessage {
24
25
  /** Distinguishes regular steps from hook executions (e.g., 'hook:onCancel', 'hook:cleanup'). Defaults to 'step'. */
25
26
  step_type?: string;
26
27
  }
27
- /** A step has completed (success or failure). */
28
+ /** A step has completed (success, failure, or a check-mode skip). */
28
29
  interface StepCompleteMessage {
29
30
  type: 'step.complete';
30
31
  stepIndex: number;
31
- status: 'success' | 'failed';
32
+ status: 'success' | 'failed' | 'skipped';
32
33
  durationMs: number;
33
34
  error?: {
34
35
  message: string;
@@ -47,6 +48,16 @@ interface StepCompleteMessage {
47
48
  * pseudo-steps carry `{ cacheOutcome, key, matchedKey?, bytes? }` here.
48
49
  */
49
50
  data?: Record<string, unknown>;
51
+ /**
52
+ * Idempotent per-step outcome (`CheckStepOutcome`). Present only when the run
53
+ * carried a check mode and the step has a `check` facet (or was a plain step
54
+ * skipped under check mode). Orthogonal to `status`.
55
+ */
56
+ checkOutcome?: CheckStepOutcome;
57
+ /** Human-readable drift summary (`summarize(drift)`). Present when drift was detected. */
58
+ driftSummary?: string;
59
+ /** Structured drift value returned by `check()`. Present when drift was detected. */
60
+ drift?: unknown;
50
61
  }
51
62
  /** A single log line from step execution. */
52
63
  interface LogLineMessage {
@@ -426,6 +437,13 @@ export interface JobExecutionRequest {
426
437
  checkout?: boolean;
427
438
  /** Whether this job is part of a test run triggered by `kici test`. */
428
439
  isTestRun?: boolean;
440
+ /**
441
+ * Run mode for idempotent steps (`apply` | `check` | `check-fail-on-drift`).
442
+ * Threaded from the dispatch event. In check / check-fail-on-drift mode the
443
+ * runner previews drift and never invokes a checked step's apply (`run`).
444
+ * Defaults to `apply` when unset.
445
+ */
446
+ checkMode?: CheckMode;
429
447
  /** When true, skip git clone -- use overlay tarball as complete workspace. */
430
448
  fullRepo?: boolean;
431
449
  /** URL to download the encrypted overlay tarball (test runs with uncommitted changes). */
@@ -6,6 +6,7 @@
6
6
  * module loading, and calls this loop for step execution with hooks.
7
7
  */
8
8
  import type { Step, StepContext, HookInput, OutputsMap, StepSecretMountRecord } from '@kici-dev/sdk';
9
+ import { CheckMode } from '@kici-dev/engine';
9
10
  import type { RunnerToAgentMessage } from './ipc-protocol.js';
10
11
  import type { SandboxStepResult } from './types.js';
11
12
  import { type CachePhaseDeps } from '../cache/index.js';
@@ -21,6 +22,11 @@ export interface JobHooks {
21
22
  /** Options for the step execution loop. */
22
23
  export interface StepLoopOptions {
23
24
  steps: Step[];
25
+ /**
26
+ * Run mode for idempotent steps. `apply` (default) converges; `check` /
27
+ * `check-fail-on-drift` preview drift and never invoke a checked step's apply.
28
+ */
29
+ checkMode?: CheckMode;
24
30
  /** Factory that creates a StepContext for a given step index and name. */
25
31
  createStepContext: (stepIndex: number, stepName: string) => StepContext;
26
32
  sendIpc: (msg: RunnerToAgentMessage) => void;
package/dist/index.js CHANGED
@@ -3,7 +3,7 @@ import { homedir, hostname, tmpdir } from "node:os";
3
3
  import { createHash, randomUUID } from "node:crypto";
4
4
  import { z } from "zod";
5
5
  import { LOGGER_ENV_VARS, defineEnv, validateUnknownKiciVars } from "@kici-dev/shared/env";
6
- import { KNOWN_ROLES, validateNoReservedLabels } from "@kici-dev/engine";
6
+ import { KNOWN_ROLES, parseHostPropertyAssignments, validateNoReservedLabels } from "@kici-dev/engine";
7
7
  import { execFile } from "node:child_process";
8
8
  import { access, cp, lstat, mkdir, mkdtemp, readFile, readdir, realpath, rename, rm, unlink, writeFile } from "node:fs/promises";
9
9
  import { dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
@@ -50,6 +50,7 @@ const envDef = defineEnv({
50
50
  orchestratorUrl: z.string().url().min(1, "KICI_ORCHESTRATOR_URL is required"),
51
51
  agentId: z.string().optional(),
52
52
  labels: z.string().default("").transform((s) => s.split(",").filter(Boolean)),
53
+ properties: z.string().default("").transform((s) => parseHostPropertyAssignments(s.split(",").filter(Boolean))),
53
54
  roles: z.string().optional().transform((s) => {
54
55
  if (s === void 0) return void 0;
55
56
  if (s === "") return [];
@@ -91,6 +92,7 @@ const envDef = defineEnv({
91
92
  orchestratorUrl: "KICI_ORCHESTRATOR_URL",
92
93
  agentId: "KICI_AGENT_ID",
93
94
  labels: "KICI_LABELS",
95
+ properties: "KICI_PROPERTIES",
94
96
  roles: "KICI_ROLES",
95
97
  port: "KICI_PORT",
96
98
  logLevel: "KICI_LOG_LEVEL",
@@ -118,6 +120,7 @@ const envDef = defineEnv({
118
120
  * - KICI_ORCHESTRATOR_URL (required)
119
121
  * - KICI_AGENT_ID (optional, auto-generated from hostname-uuid8)
120
122
  * - KICI_LABELS (comma-separated, e.g. "linux,docker"). Labels with 'kici-' prefix are reserved.
123
+ * - KICI_PROPERTIES (comma-separated key=value host-vars, e.g. "region=eu,cores=8,gpu=true"). Typed (bool/number/string), reported into the host roster.
121
124
  * - KICI_ROLES (comma-separated agent roles, e.g. "builder,init-runner". undefined=all, empty=execution-only)
122
125
  * - KICI_PORT (default: 8080)
123
126
  * - KICI_LOG_LEVEL (default: info)
package/dist/server.js CHANGED
@@ -12,7 +12,7 @@ import winston from "winston";
12
12
  import { RingBuffer, addLogsToArchive, chunkBuffer, createHealthRoutes, createLogger, createMeter, createMetricsRoutes, deriveSharedSecret, getPrometheusExporter, getReconnectDelay, getRequestContext, guardStartup, initTelemetry, logger, normalizeLineEndings, redactConfig, requestContext, setServiceName, setupGracefulShutdown, sha256, sha256File, toErrorMessage, validateRequiredTools } from "@kici-dev/shared";
13
13
  import { z } from "zod";
14
14
  import { LOGGER_ENV_VARS, defineEnv, validateUnknownKiciVars } from "@kici-dev/shared/env";
15
- import { ALLOWED_SYSTEM_VARS, CacheRunEventType, CacheStepType, ExecutionJobStatus, ExecutionStepStatus, InitFailureCategory, KNOWN_ROLES, PROTOCOL_VERSION, SANDBOX_DEFAULT_VARS, WS_CLOSE_AGENT_AUTH_FAILED, WS_MAX_PAYLOAD_BYTES, applyIncludeExclude, deriveOsArchLabels, expandMatrix, heartbeatSchema, hostLabel, mergeAutoLabels, orchestratorToAgentMessageSchema, resolveRoleLabels, validateNoReservedLabels } from "@kici-dev/engine";
15
+ import { ALLOWED_SYSTEM_VARS, CacheRunEventType, CacheStepType, ExecutionJobStatus, ExecutionStepStatus, InitFailureCategory, KNOWN_ROLES, PROTOCOL_VERSION, SANDBOX_DEFAULT_VARS, WS_CLOSE_AGENT_AUTH_FAILED, WS_MAX_PAYLOAD_BYTES, applyIncludeExclude, deriveOsArchLabels, expandMatrix, heartbeatSchema, hostLabel, mergeAutoLabels, orchestratorToAgentMessageSchema, parseHostPropertyAssignments, resolveRoleLabels, validateNoReservedLabels } from "@kici-dev/engine";
16
16
  import { execFile, execFileSync, execSync, fork, spawn } from "node:child_process";
17
17
  import WebSocket from "ws";
18
18
  import * as fs$2 from "node:fs";
@@ -66,6 +66,7 @@ const envDef = defineEnv({
66
66
  orchestratorUrl: z.string().url().min(1, "KICI_ORCHESTRATOR_URL is required"),
67
67
  agentId: z.string().optional(),
68
68
  labels: z.string().default("").transform((s) => s.split(",").filter(Boolean)),
69
+ properties: z.string().default("").transform((s) => parseHostPropertyAssignments(s.split(",").filter(Boolean))),
69
70
  roles: z.string().optional().transform((s) => {
70
71
  if (s === void 0) return void 0;
71
72
  if (s === "") return [];
@@ -107,6 +108,7 @@ const envDef = defineEnv({
107
108
  orchestratorUrl: "KICI_ORCHESTRATOR_URL",
108
109
  agentId: "KICI_AGENT_ID",
109
110
  labels: "KICI_LABELS",
111
+ properties: "KICI_PROPERTIES",
110
112
  roles: "KICI_ROLES",
111
113
  port: "KICI_PORT",
112
114
  logLevel: "KICI_LOG_LEVEL",
@@ -134,6 +136,7 @@ const envDef = defineEnv({
134
136
  * - KICI_ORCHESTRATOR_URL (required)
135
137
  * - KICI_AGENT_ID (optional, auto-generated from hostname-uuid8)
136
138
  * - KICI_LABELS (comma-separated, e.g. "linux,docker"). Labels with 'kici-' prefix are reserved.
139
+ * - KICI_PROPERTIES (comma-separated key=value host-vars, e.g. "region=eu,cores=8,gpu=true"). Typed (bool/number/string), reported into the host roster.
137
140
  * - KICI_ROLES (comma-separated agent roles, e.g. "builder,init-runner". undefined=all, empty=execution-only)
138
141
  * - KICI_PORT (default: 8080)
139
142
  * - KICI_LOG_LEVEL (default: info)
@@ -177,6 +180,7 @@ function agentClientConnectionOptions(config) {
177
180
  url: config.orchestratorUrl,
178
181
  agentId: config.agentId,
179
182
  labels: config.labels,
183
+ properties: config.properties,
180
184
  scalerManaged: config.scalerManaged,
181
185
  token: config.agentToken
182
186
  };
@@ -329,6 +333,7 @@ var OrchestratorClient = class OrchestratorClient {
329
333
  url;
330
334
  agentId;
331
335
  labels;
336
+ properties;
332
337
  onJobDispatch;
333
338
  onJobCancel;
334
339
  token;
@@ -356,6 +361,7 @@ var OrchestratorClient = class OrchestratorClient {
356
361
  this.url = options.url;
357
362
  this.agentId = options.agentId;
358
363
  this.labels = options.labels;
364
+ this.properties = options.properties ?? {};
359
365
  this.onJobDispatch = options.onJobDispatch;
360
366
  this.onJobCancel = options.onJobCancel;
361
367
  this.token = options.token;
@@ -1205,6 +1211,7 @@ var OrchestratorClient = class OrchestratorClient {
1205
1211
  })()
1206
1212
  };
1207
1213
  if (inFlightJobs.length > 0) msg.inFlightJobs = inFlightJobs;
1214
+ if (Object.keys(this.properties).length > 0) msg.properties = this.properties;
1208
1215
  this.ws.send(JSON.stringify(msg));
1209
1216
  }
1210
1217
  scheduleReconnect() {
@@ -1300,14 +1307,14 @@ var init_console_capture = __esmMin((() => {
1300
1307
  init_console_capture();
1301
1308
  function safe(name, fallback = "unknown") {
1302
1309
  switch (name) {
1303
- case "version": return "0.1.19";
1304
- case "buildCommit": return "1590f5e99";
1305
- case "sdkVersion": return "0.1.19";
1310
+ case "version": return "0.1.21";
1311
+ case "buildCommit": return "8aeccc2c4";
1312
+ case "sdkVersion": return "0.1.21";
1306
1313
  case "sdkBundleHash": return "8308089347c304e41b457d3867b17bbff11d6b5cd9706b6823e7abdbd849f33f";
1307
- case "sharedVersion": return "0.1.19";
1308
- case "sharedBundleHash": return "5f2c220f24d166b0f13d0620a2e80d19689ac8b683a12154daef44e938fd46a7";
1309
- case "engineVersion": return "0.1.19";
1310
- case "engineBundleHash": return "79ce14640d1798eaaa7cb3aa6c4bc325da3bff1e9f4716936e19614eabb1d858";
1314
+ case "sharedVersion": return "0.1.21";
1315
+ case "sharedBundleHash": return "991385c024392c395d3eb8a68946ef8ed3fcba96f2652f21c3164a54eafa1b1b";
1316
+ case "engineVersion": return "0.1.21";
1317
+ case "engineBundleHash": return "1b1f49acbbb66f045cfa8284406fce48de8975d9ec3a5685aff70313cd8232cc";
1311
1318
  default: return fallback;
1312
1319
  }
1313
1320
  }
@@ -1993,7 +2000,7 @@ async function extractStepsFromDynamicJob(workflow, dynamicIndex, jobName, event
1993
2000
  }
1994
2001
  var AGENT_SDK_VERSION, AGENT_SDK_BUNDLE_HASH, hookRegistered;
1995
2002
  var init_workflow_loader = __esmMin((() => {
1996
- AGENT_SDK_VERSION = "0.1.19";
2003
+ AGENT_SDK_VERSION = "0.1.21";
1997
2004
  AGENT_SDK_BUNDLE_HASH = "8308089347c304e41b457d3867b17bbff11d6b5cd9706b6823e7abdbd849f33f";
1998
2005
  hookRegistered = false;
1999
2006
  }));
@@ -4188,6 +4195,7 @@ function buildRequest(dispatch, workDir) {
4188
4195
  checkout: jobConfig.checkout ?? true,
4189
4196
  isTestRun: jobConfig.isTestRun ?? false,
4190
4197
  fullRepo: jobConfig.fullRepo ?? false,
4198
+ checkMode: jobConfig.checkMode,
4191
4199
  tarballUrl: jobConfig.tarballUrl,
4192
4200
  cliPublicKey: jobConfig.cliPublicKey,
4193
4201
  orchestratorPrivateKey: jobConfig.orchestratorPrivateKey,
@@ -4525,6 +4533,9 @@ function relayChildIpcMessage(msg, dispatch, ctx) {
4525
4533
  ...msg.error && { error: msg.error },
4526
4534
  ...msg.secretsAccessed && { secretsAccessed: msg.secretsAccessed },
4527
4535
  ...msg.step_type && { step_type: msg.step_type },
4536
+ ...msg.checkOutcome !== void 0 && { checkOutcome: msg.checkOutcome },
4537
+ ...msg.driftSummary !== void 0 && { driftSummary: msg.driftSummary },
4538
+ ...msg.drift !== void 0 && { drift: msg.drift },
4528
4539
  ...msg.data && msg.data
4529
4540
  });
4530
4541
  return;
@@ -5249,6 +5260,9 @@ var init_container_sandbox = __esmMin((() => {
5249
5260
  ...msg.error && { error: msg.error },
5250
5261
  ...msg.secretsAccessed && { secretsAccessed: msg.secretsAccessed },
5251
5262
  ...msg.step_type && { step_type: msg.step_type },
5263
+ ...msg.checkOutcome !== void 0 && { checkOutcome: msg.checkOutcome },
5264
+ ...msg.driftSummary !== void 0 && { driftSummary: msg.driftSummary },
5265
+ ...msg.drift !== void 0 && { drift: msg.drift },
5252
5266
  ...msg.data && msg.data
5253
5267
  });
5254
5268
  stepResults.push({
@@ -5764,12 +5778,17 @@ var init_job_runner = __esmMin((() => {
5764
5778
  stepsTotal.add(1, { status: stepResult.status });
5765
5779
  if (stepResult.durationMs > 0) stepDurationSeconds.record(stepResult.durationMs / 1e3);
5766
5780
  }
5767
- if (result.status === ExecutionJobStatus.enum.failed) logger$2.error("Sandbox returned failed result", {
5768
- durationMs: result.durationMs,
5769
- stepCount: result.stepResults.length,
5770
- steps: result.stepResults.map((r) => `${r.name}:${r.status}`).join(","),
5771
- logStreamerKeys: [...logStreamers.keys()].join(",")
5772
- });
5781
+ if (result.status === ExecutionJobStatus.enum.failed) {
5782
+ const stepErrors = result.stepResults.filter((r) => r.error).map((r) => `${r.name}: ${r.error.message}`).join(" | ");
5783
+ logger$2.error("Sandbox returned failed result", {
5784
+ durationMs: result.durationMs,
5785
+ stepCount: result.stepResults.length,
5786
+ steps: result.stepResults.map((r) => `${r.name}:${r.status}`).join(","),
5787
+ logStreamerKeys: [...logStreamers.keys()].join(","),
5788
+ ...result.error && { error: result.error },
5789
+ ...stepErrors && { stepErrors }
5790
+ });
5791
+ }
5773
5792
  this.sendJobStatus(dispatch, result.status, {
5774
5793
  durationMs: result.durationMs,
5775
5794
  ...result.error && { error: result.error },
@@ -6406,14 +6425,14 @@ var init_job_runner = __esmMin((() => {
6406
6425
  */
6407
6426
  init_console_capture();
6408
6427
  init_npm_resolver();
6409
- const AGENT_VERSION = "0.1.19";
6410
- const BUILD_COMMIT = "1590f5e99";
6411
- const SDK_VERSION = "0.1.19";
6428
+ const AGENT_VERSION = "0.1.21";
6429
+ const BUILD_COMMIT = "8aeccc2c4";
6430
+ const SDK_VERSION = "0.1.21";
6412
6431
  const SDK_BUNDLE_HASH = "8308089347c304e41b457d3867b17bbff11d6b5cd9706b6823e7abdbd849f33f";
6413
- const SHARED_VERSION = "0.1.19";
6414
- const SHARED_BUNDLE_HASH = "5f2c220f24d166b0f13d0620a2e80d19689ac8b683a12154daef44e938fd46a7";
6415
- const ENGINE_VERSION = "0.1.19";
6416
- const ENGINE_BUNDLE_HASH = "79ce14640d1798eaaa7cb3aa6c4bc325da3bff1e9f4716936e19614eabb1d858";
6432
+ const SHARED_VERSION = "0.1.21";
6433
+ const SHARED_BUNDLE_HASH = "991385c024392c395d3eb8a68946ef8ed3fcba96f2652f21c3164a54eafa1b1b";
6434
+ const ENGINE_VERSION = "0.1.21";
6435
+ const ENGINE_BUNDLE_HASH = "1b1f49acbbb66f045cfa8284406fce48de8975d9ec3a5685aff70313cd8232cc";
6417
6436
  initTelemetry({
6418
6437
  serviceName: "kici-agent",
6419
6438
  otlpEndpoint: process.env.OTEL_EXPORTER_OTLP_ENDPOINT
@@ -7,7 +7,7 @@ import os, { homedir, tmpdir } from "node:os";
7
7
  import path, { dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
8
8
  import { $ } from "zx";
9
9
  import { createLogger, deriveSharedSecret, initZx, normalizeLineEndings, sha256, sha256File, toErrorMessage } from "@kici-dev/shared";
10
- import { CacheOutcome, CacheStepType, ExecutionJobStatus, ExecutionStepStatus, TimeoutReason } from "@kici-dev/engine";
10
+ import { CacheOutcome, CacheStepType, CheckMode, CheckStepOutcome, ExecutionJobStatus, ExecutionStepStatus, TimeoutReason } from "@kici-dev/engine";
11
11
  import { buildKiciApi, createStepSecrets, evaluateRules, isDynamicJobFn, normalizeCacheSpecs, normalizeRequireApproval, provenanceSubjectIsPath, resolveJobOutputs, resolveStepOutputs, setJobOutputsMap, setStepOutputsMap, setStepRefMap } from "@kici-dev/sdk";
12
12
  import { OIDC_TOKEN_REQUEST_METHOD } from "@kici-dev/engine/protocol/messages/oidc-token-relay";
13
13
  import { sha256File as sha256File$1 } from "@kici-dev/core";
@@ -22,6 +22,7 @@ import { pipeline } from "node:stream/promises";
22
22
  import { createGunzip } from "node:zlib";
23
23
  import { fileURLToPath, pathToFileURL } from "node:url";
24
24
  import { c, x } from "tar";
25
+ import { runIdempotentStep } from "@kici-dev/core/idempotency";
25
26
  import { execFile } from "node:child_process";
26
27
  import { promisify } from "node:util";
27
28
  import { PNPM_IGNORE_BUILD_GATE_ARG, PackageManager, YarnFlavor, detectPackageManagerFromManifests, detectYarnFlavor } from "@kici-dev/shared/package-manager";
@@ -1117,11 +1118,59 @@ function createRuleContext(event, changedFiles = [], env = {}) {
1117
1118
  //#endregion
1118
1119
  //#region src/execution/sandbox/step-loop.ts
1119
1120
  /**
1121
+ * Run one step honoring the run-level {@link CheckMode}, reusing the
1122
+ * `runIdempotentStep` primitive for checked steps (never hand-rolled branching).
1123
+ *
1124
+ * - Plain step (no `check`): in apply mode, runs as today; in any check mode it
1125
+ * is skipped with `no_check` (a side-effecting step can't be safely previewed).
1126
+ * - Checked step: adapted into an `IdempotentStep` and driven by the primitive
1127
+ * with `dryRun` set in check mode (so `apply`/`run` never fires) and `yes: true`
1128
+ * (v0 has no mid-run confirm). On drift the summary is emitted as a log line.
1129
+ */
1130
+ async function runStepWithCheckMode(step, stepIndex, ctx, checkMode, sendFn) {
1131
+ if (!step.check) {
1132
+ if (checkMode !== CheckMode.enum.apply) return {
1133
+ checkOutcome: CheckStepOutcome.enum.no_check,
1134
+ status: "skipped",
1135
+ outputs: void 0
1136
+ };
1137
+ return {
1138
+ status: "success",
1139
+ outputs: await step.run(ctx)
1140
+ };
1141
+ }
1142
+ const res = await runIdempotentStep({
1143
+ name: step.name,
1144
+ check: () => step.check(ctx),
1145
+ summarize: step.summarize,
1146
+ apply: (drift) => step.run(ctx, drift),
1147
+ whenInSync: step.whenInSync ? () => step.whenInSync(ctx) : void 0
1148
+ }, {
1149
+ dryRun: checkMode !== CheckMode.enum.apply,
1150
+ yes: true,
1151
+ log: (line) => sendFn({
1152
+ type: "log.line",
1153
+ stepIndex,
1154
+ line
1155
+ })
1156
+ });
1157
+ const driftSummary = res.drift != null ? step.summarize(res.drift) : void 0;
1158
+ const status = res.outcome === CheckStepOutcome.enum.applied ? "success" : "skipped";
1159
+ const mappedStatus = res.outcome === CheckStepOutcome.enum["dry-run"] ? "success" : status;
1160
+ return {
1161
+ checkOutcome: res.outcome,
1162
+ status: mappedStatus,
1163
+ outputs: res.result,
1164
+ ...driftSummary !== void 0 && { driftSummary },
1165
+ ...res.drift != null && { drift: res.drift }
1166
+ };
1167
+ }
1168
+ /**
1120
1169
  * Execute a single step with timeout enforcement.
1121
1170
  *
1122
1171
  * Timeout pattern using Promise.race + AbortController, with IPC status reporting.
1123
1172
  */
1124
- async function executeStepInLoop(step, stepIndex, ctx, timeoutMs, sendFn, outputsMap, getSecretsAccessLog, getSecretMountRecords, jobDeadlineSignal) {
1173
+ async function executeStepInLoop(step, stepIndex, ctx, timeoutMs, sendFn, outputsMap, getSecretsAccessLog, getSecretMountRecords, jobDeadlineSignal, checkMode = CheckMode.enum.apply) {
1125
1174
  sendFn({
1126
1175
  type: "step.start",
1127
1176
  stepIndex,
@@ -1131,8 +1180,8 @@ async function executeStepInLoop(step, stepIndex, ctx, timeoutMs, sendFn, output
1131
1180
  const abortController = new AbortController();
1132
1181
  const timeoutId = setTimeout(() => abortController.abort(), timeoutMs);
1133
1182
  try {
1134
- const result = await Promise.race([
1135
- step.run(ctx),
1183
+ const phase = await Promise.race([
1184
+ runStepWithCheckMode(step, stepIndex, ctx, checkMode, sendFn),
1136
1185
  new Promise((_, reject) => {
1137
1186
  abortController.signal.addEventListener("abort", () => {
1138
1187
  reject(/* @__PURE__ */ new Error(`Step '${step.name}' timed out after ${timeoutMs}ms`));
@@ -1151,22 +1200,26 @@ async function executeStepInLoop(step, stepIndex, ctx, timeoutMs, sendFn, output
1151
1200
  ]);
1152
1201
  clearTimeout(timeoutId);
1153
1202
  const durationMs = Date.now() - startTime;
1154
- const outputsPayload = result != null ? result : void 0;
1203
+ const outputsPayload = phase.outputs != null ? phase.outputs : void 0;
1155
1204
  if (outputsPayload) outputsMap.set(step.name, outputsPayload);
1156
1205
  const secretsAccessed = getSecretsAccessLog?.();
1157
1206
  emitSecretMountEvents(getSecretMountRecords?.(), stepIndex, sendFn);
1207
+ const stepStatus = phase.status === "skipped" ? ExecutionStepStatus.enum.skipped : ExecutionStepStatus.enum.success;
1158
1208
  sendFn({
1159
1209
  type: "step.complete",
1160
1210
  stepIndex,
1161
- status: ExecutionStepStatus.enum.success,
1211
+ status: stepStatus,
1162
1212
  durationMs,
1163
1213
  ...outputsPayload && { outputs: outputsPayload },
1164
- ...secretsAccessed !== void 0 && { secretsAccessed }
1214
+ ...secretsAccessed !== void 0 && { secretsAccessed },
1215
+ ...phase.checkOutcome !== void 0 && { checkOutcome: phase.checkOutcome },
1216
+ ...phase.driftSummary !== void 0 && { driftSummary: phase.driftSummary },
1217
+ ...phase.drift !== void 0 && { drift: phase.drift }
1165
1218
  });
1166
1219
  return {
1167
1220
  name: step.name,
1168
1221
  stepIndex,
1169
- status: ExecutionStepStatus.enum.success,
1222
+ status: stepStatus,
1170
1223
  durationMs,
1171
1224
  ...outputsPayload && { outputs: outputsPayload }
1172
1225
  };
@@ -1381,7 +1434,7 @@ async function runStepIteration(step, stepIndex, opts) {
1381
1434
  const timeoutMs = step.timeout ?? opts.defaultTimeoutMs;
1382
1435
  let result;
1383
1436
  try {
1384
- result = await executeStepInLoop(step, stepIndex, ctx, timeoutMs, opts.sendIpc, opts.outputsMap, opts.getSecretsAccessLog, opts.getSecretMountRecords, opts.jobDeadlineSignal);
1437
+ result = await executeStepInLoop(step, stepIndex, ctx, timeoutMs, opts.sendIpc, opts.outputsMap, opts.getSecretsAccessLog, opts.getSecretMountRecords, opts.jobDeadlineSignal, opts.checkMode ?? CheckMode.enum.apply);
1385
1438
  } finally {
1386
1439
  await opts.afterStepApplyEnvFiles?.();
1387
1440
  }
@@ -3023,7 +3076,7 @@ function logSubprocessStreams(e, tokens) {
3023
3076
  * no Rolldown step at runtime. `@kici-dev/sdk` and host-repo deps resolve via
3024
3077
  * Node's normal ESM lookup against `.kici/node_modules/`.
3025
3078
  */
3026
- const AGENT_SDK_VERSION = "0.1.19";
3079
+ const AGENT_SDK_VERSION = "0.1.21";
3027
3080
  const AGENT_SDK_BUNDLE_HASH = "8308089347c304e41b457d3867b17bbff11d6b5cd9706b6823e7abdbd849f33f";
3028
3081
  /**
3029
3082
  * Register the `@kici-dev/core/ts-loader-hook` oxc-transform ESM loader hook so
@@ -3386,7 +3439,7 @@ async function applyOverlay(config) {
3386
3439
  */
3387
3440
  init_download();
3388
3441
  init_dep_restore();
3389
- const AGENT_VERSION = "0.1.19";
3442
+ const AGENT_VERSION = "0.1.21";
3390
3443
  process.on("uncaughtException", (err) => {
3391
3444
  process.stderr.write(`[workflow-runner] UNCAUGHT EXCEPTION: ${err.message}\n`);
3392
3445
  if (err.stack) process.stderr.write(`[workflow-runner] Stack: ${err.stack}\n`);
@@ -5099,6 +5152,7 @@ async function main() {
5099
5152
  const jobStartTime = Date.now();
5100
5153
  const loopResult = await executeStepLoop({
5101
5154
  steps: normalizedSteps,
5155
+ checkMode: request.checkMode,
5102
5156
  createStepContext: createStepCtxWithCapture,
5103
5157
  sendIpc: maskedSend,
5104
5158
  defaultTimeoutMs,
@@ -8,6 +8,12 @@ export interface OrchestratorClientOptions {
8
8
  agentId: string;
9
9
  /** Agent's label set for job routing. */
10
10
  labels: string[];
11
+ /**
12
+ * Agent-reported typed host-vars (the `KICI_PROPERTIES` bag). Reported at
13
+ * registration and shallow-merged into the orchestrator's host roster.
14
+ * Omitted / empty ⇒ no properties reported.
15
+ */
16
+ properties?: Record<string, string | number | boolean>;
11
17
  /** Callback invoked when a job.dispatch message is received. */
12
18
  onJobDispatch: (dispatch: JobDispatch) => void;
13
19
  /** Callback invoked when a job.cancel message is received. */
@@ -94,6 +100,7 @@ export declare class OrchestratorClient {
94
100
  private readonly url;
95
101
  private readonly agentId;
96
102
  private readonly labels;
103
+ private readonly properties;
97
104
  private readonly onJobDispatch;
98
105
  private readonly onJobCancel;
99
106
  private readonly token?;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kici-dev/agent",
3
- "version": "0.1.19",
3
+ "version": "0.1.21",
4
4
  "description": "Customer-deployable agent for the KiCI CI/CD stack. Connects to an orchestrator, clones the workflow repo, executes steps, and streams logs back.",
5
5
  "keywords": [
6
6
  "ci",
@@ -64,10 +64,10 @@
64
64
  "yaml": "^2.9.0",
65
65
  "zod": "^4.4.3",
66
66
  "zx": "^8.8.5",
67
- "@kici-dev/engine": "0.1.19",
68
- "@kici-dev/sdk": "0.1.19",
69
- "@kici-dev/core": "0.1.19",
70
- "@kici-dev/shared": "0.1.19"
67
+ "@kici-dev/core": "0.1.21",
68
+ "@kici-dev/engine": "0.1.21",
69
+ "@kici-dev/sdk": "0.1.21",
70
+ "@kici-dev/shared": "0.1.21"
71
71
  },
72
72
  "kici": {
73
73
  "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/agent@0.1.19",
6
- "documentNamespace": "https://kici.dev/sbom/%40kici-dev%2Fagent/0.1.19/69353e40-6ba4-4597-af86-49d578ecda83",
5
+ "name": "@kici-dev/agent@0.1.21",
6
+ "documentNamespace": "https://kici.dev/sbom/%40kici-dev%2Fagent/0.1.21/6530efba-4ce4-4daf-a61c-0e742670115a",
7
7
  "creationInfo": {
8
- "created": "2026-06-19T05:11:29Z",
8
+ "created": "2026-06-23T05:10:35Z",
9
9
  "creators": [
10
10
  "Tool: kici-sbom-generator"
11
11
  ]
@@ -816,7 +816,7 @@
816
816
  {
817
817
  "SPDXID": "SPDXRef-RootPackage",
818
818
  "name": "@kici-dev/agent",
819
- "versionInfo": "0.1.19",
819
+ "versionInfo": "0.1.21",
820
820
  "downloadLocation": "NOASSERTION",
821
821
  "filesAnalyzed": false,
822
822
  "licenseConcluded": "NOASSERTION",
@@ -827,16 +827,16 @@
827
827
  {
828
828
  "referenceCategory": "PACKAGE-MANAGER",
829
829
  "referenceType": "purl",
830
- "referenceLocator": "pkg:npm/%40kici-dev/agent@0.1.19"
830
+ "referenceLocator": "pkg:npm/%40kici-dev/agent@0.1.21"
831
831
  }
832
832
  ],
833
833
  "description": "Customer-deployable agent for the KiCI CI/CD stack. Connects to an orchestrator, clones the workflow repo, executes steps, and streams logs back.",
834
834
  "homepage": "https://kici.dev"
835
835
  },
836
836
  {
837
- "SPDXID": "SPDXRef-Package--kici-dev-core-0.1.19",
837
+ "SPDXID": "SPDXRef-Package--kici-dev-core-0.1.21",
838
838
  "name": "@kici-dev/core",
839
- "versionInfo": "0.1.19",
839
+ "versionInfo": "0.1.21",
840
840
  "downloadLocation": "NOASSERTION",
841
841
  "filesAnalyzed": false,
842
842
  "licenseConcluded": "NOASSERTION",
@@ -847,16 +847,16 @@
847
847
  {
848
848
  "referenceCategory": "PACKAGE-MANAGER",
849
849
  "referenceType": "purl",
850
- "referenceLocator": "pkg:npm/%40kici-dev/core@0.1.19"
850
+ "referenceLocator": "pkg:npm/%40kici-dev/core@0.1.21"
851
851
  }
852
852
  ],
853
853
  "description": "Light shared utilities for the KiCI stack (logging, errors, formatting, crypto, zx init, the TypeScript ESM loader hook). No server-side dependencies.",
854
854
  "homepage": "https://kici.dev"
855
855
  },
856
856
  {
857
- "SPDXID": "SPDXRef-Package--kici-dev-engine-0.1.19",
857
+ "SPDXID": "SPDXRef-Package--kici-dev-engine-0.1.21",
858
858
  "name": "@kici-dev/engine",
859
- "versionInfo": "0.1.19",
859
+ "versionInfo": "0.1.21",
860
860
  "downloadLocation": "NOASSERTION",
861
861
  "filesAnalyzed": false,
862
862
  "licenseConcluded": "NOASSERTION",
@@ -867,16 +867,16 @@
867
867
  {
868
868
  "referenceCategory": "PACKAGE-MANAGER",
869
869
  "referenceType": "purl",
870
- "referenceLocator": "pkg:npm/%40kici-dev/engine@0.1.19"
870
+ "referenceLocator": "pkg:npm/%40kici-dev/engine@0.1.21"
871
871
  }
872
872
  ],
873
873
  "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.",
874
874
  "homepage": "https://kici.dev"
875
875
  },
876
876
  {
877
- "SPDXID": "SPDXRef-Package--kici-dev-sdk-0.1.19",
877
+ "SPDXID": "SPDXRef-Package--kici-dev-sdk-0.1.21",
878
878
  "name": "@kici-dev/sdk",
879
- "versionInfo": "0.1.19",
879
+ "versionInfo": "0.1.21",
880
880
  "downloadLocation": "NOASSERTION",
881
881
  "filesAnalyzed": false,
882
882
  "licenseConcluded": "NOASSERTION",
@@ -887,16 +887,16 @@
887
887
  {
888
888
  "referenceCategory": "PACKAGE-MANAGER",
889
889
  "referenceType": "purl",
890
- "referenceLocator": "pkg:npm/%40kici-dev/sdk@0.1.19"
890
+ "referenceLocator": "pkg:npm/%40kici-dev/sdk@0.1.21"
891
891
  }
892
892
  ],
893
893
  "description": "TypeScript SDK for defining KiCI workflows. Import into `.kici/workflows/*.ts` to declare workflows, jobs, steps, triggers, rules, and matrix configurations.",
894
894
  "homepage": "https://kici.dev"
895
895
  },
896
896
  {
897
- "SPDXID": "SPDXRef-Package--kici-dev-shared-0.1.19",
897
+ "SPDXID": "SPDXRef-Package--kici-dev-shared-0.1.21",
898
898
  "name": "@kici-dev/shared",
899
- "versionInfo": "0.1.19",
899
+ "versionInfo": "0.1.21",
900
900
  "downloadLocation": "NOASSERTION",
901
901
  "filesAnalyzed": false,
902
902
  "licenseConcluded": "NOASSERTION",
@@ -907,7 +907,7 @@
907
907
  {
908
908
  "referenceCategory": "PACKAGE-MANAGER",
909
909
  "referenceType": "purl",
910
- "referenceLocator": "pkg:npm/%40kici-dev/shared@0.1.19"
910
+ "referenceLocator": "pkg:npm/%40kici-dev/shared@0.1.21"
911
911
  }
912
912
  ],
913
913
  "description": "Shared utilities for the KiCI CI/CD stack — logging, zx setup, crypto, telemetry, health and metrics routes. No business logic.",
@@ -2127,26 +2127,6 @@
2127
2127
  }
2128
2128
  ]
2129
2129
  },
2130
- {
2131
- "SPDXID": "SPDXRef-Package--types-node-24.12.0",
2132
- "name": "@types/node",
2133
- "versionInfo": "24.12.0",
2134
- "downloadLocation": "https://registry.npmjs.org/@types/node/-/node-24.12.0.tgz",
2135
- "filesAnalyzed": false,
2136
- "licenseConcluded": "NOASSERTION",
2137
- "licenseDeclared": "MIT",
2138
- "copyrightText": "NOASSERTION",
2139
- "supplier": "NOASSERTION",
2140
- "externalRefs": [
2141
- {
2142
- "referenceCategory": "PACKAGE-MANAGER",
2143
- "referenceType": "purl",
2144
- "referenceLocator": "pkg:npm/%40types/node@24.12.0"
2145
- }
2146
- ],
2147
- "description": "TypeScript definitions for node",
2148
- "homepage": "https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node"
2149
- },
2150
2130
  {
2151
2131
  "SPDXID": "SPDXRef-Package--types-triple-beam-1.3.5",
2152
2132
  "name": "@types/triple-beam",
@@ -4337,10 +4317,10 @@
4337
4317
  "description": "process information for node.js and browsers"
4338
4318
  },
4339
4319
  {
4340
- "SPDXID": "SPDXRef-Package-protobufjs-8.0.3",
4320
+ "SPDXID": "SPDXRef-Package-protobufjs-8.6.3",
4341
4321
  "name": "protobufjs",
4342
- "versionInfo": "8.0.3",
4343
- "downloadLocation": "https://registry.npmjs.org/protobufjs/-/protobufjs-8.0.3.tgz",
4322
+ "versionInfo": "8.6.3",
4323
+ "downloadLocation": "https://registry.npmjs.org/protobufjs/-/protobufjs-8.6.3.tgz",
4344
4324
  "filesAnalyzed": false,
4345
4325
  "licenseConcluded": "NOASSERTION",
4346
4326
  "licenseDeclared": "BSD-3-Clause",
@@ -4350,11 +4330,10 @@
4350
4330
  {
4351
4331
  "referenceCategory": "PACKAGE-MANAGER",
4352
4332
  "referenceType": "purl",
4353
- "referenceLocator": "pkg:npm/protobufjs@8.0.3"
4333
+ "referenceLocator": "pkg:npm/protobufjs@8.6.3"
4354
4334
  }
4355
4335
  ],
4356
- "description": "Protocol Buffers for JavaScript (& TypeScript).",
4357
- "homepage": "https://protobufjs.github.io/protobuf.js/"
4336
+ "description": "Protocol Buffers for JavaScript & TypeScript."
4358
4337
  },
4359
4338
  {
4360
4339
  "SPDXID": "SPDXRef-Package-pump-3.0.4",
@@ -5026,26 +5005,6 @@
5026
5005
  "description": "Port of TweetNaCl cryptographic library to JavaScript",
5027
5006
  "homepage": "https://tweetnacl.js.org"
5028
5007
  },
5029
- {
5030
- "SPDXID": "SPDXRef-Package-undici-types-7.16.0",
5031
- "name": "undici-types",
5032
- "versionInfo": "7.16.0",
5033
- "downloadLocation": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz",
5034
- "filesAnalyzed": false,
5035
- "licenseConcluded": "NOASSERTION",
5036
- "licenseDeclared": "MIT",
5037
- "copyrightText": "NOASSERTION",
5038
- "supplier": "NOASSERTION",
5039
- "externalRefs": [
5040
- {
5041
- "referenceCategory": "PACKAGE-MANAGER",
5042
- "referenceType": "purl",
5043
- "referenceLocator": "pkg:npm/undici-types@7.16.0"
5044
- }
5045
- ],
5046
- "description": "A stand-alone types package for Undici",
5047
- "homepage": "https://undici.nodejs.org"
5048
- },
5049
5008
  {
5050
5009
  "SPDXID": "SPDXRef-Package-util-deprecate-1.0.2",
5051
5010
  "name": "util-deprecate",
@@ -6195,7 +6154,7 @@
6195
6154
  },
6196
6155
  {
6197
6156
  "spdxElementId": "SPDXRef-Package--grpc-proto-loader-0.7.15",
6198
- "relatedSpdxElement": "SPDXRef-Package-protobufjs-8.0.3",
6157
+ "relatedSpdxElement": "SPDXRef-Package-protobufjs-8.6.3",
6199
6158
  "relationshipType": "DEPENDS_ON"
6200
6159
  },
6201
6160
  {
@@ -6215,7 +6174,7 @@
6215
6174
  },
6216
6175
  {
6217
6176
  "spdxElementId": "SPDXRef-Package--grpc-proto-loader-0.8.0",
6218
- "relatedSpdxElement": "SPDXRef-Package-protobufjs-8.0.3",
6177
+ "relatedSpdxElement": "SPDXRef-Package-protobufjs-8.6.3",
6219
6178
  "relationshipType": "DEPENDS_ON"
6220
6179
  },
6221
6180
  {
@@ -6250,22 +6209,22 @@
6250
6209
  },
6251
6210
  {
6252
6211
  "spdxElementId": "SPDXRef-RootPackage",
6253
- "relatedSpdxElement": "SPDXRef-Package--kici-dev-core-0.1.19",
6212
+ "relatedSpdxElement": "SPDXRef-Package--kici-dev-core-0.1.21",
6254
6213
  "relationshipType": "DEPENDS_ON"
6255
6214
  },
6256
6215
  {
6257
6216
  "spdxElementId": "SPDXRef-RootPackage",
6258
- "relatedSpdxElement": "SPDXRef-Package--kici-dev-engine-0.1.19",
6217
+ "relatedSpdxElement": "SPDXRef-Package--kici-dev-engine-0.1.21",
6259
6218
  "relationshipType": "DEPENDS_ON"
6260
6219
  },
6261
6220
  {
6262
6221
  "spdxElementId": "SPDXRef-RootPackage",
6263
- "relatedSpdxElement": "SPDXRef-Package--kici-dev-sdk-0.1.19",
6222
+ "relatedSpdxElement": "SPDXRef-Package--kici-dev-sdk-0.1.21",
6264
6223
  "relationshipType": "DEPENDS_ON"
6265
6224
  },
6266
6225
  {
6267
6226
  "spdxElementId": "SPDXRef-RootPackage",
6268
- "relatedSpdxElement": "SPDXRef-Package--kici-dev-shared-0.1.19",
6227
+ "relatedSpdxElement": "SPDXRef-Package--kici-dev-shared-0.1.21",
6269
6228
  "relationshipType": "DEPENDS_ON"
6270
6229
  },
6271
6230
  {
@@ -6319,192 +6278,192 @@
6319
6278
  "relationshipType": "DEPENDS_ON"
6320
6279
  },
6321
6280
  {
6322
- "spdxElementId": "SPDXRef-Package--kici-dev-core-0.1.19",
6281
+ "spdxElementId": "SPDXRef-Package--kici-dev-core-0.1.21",
6323
6282
  "relatedSpdxElement": "SPDXRef-Package-oxc-transform-0.135.0",
6324
6283
  "relationshipType": "DEPENDS_ON"
6325
6284
  },
6326
6285
  {
6327
- "spdxElementId": "SPDXRef-Package--kici-dev-core-0.1.19",
6286
+ "spdxElementId": "SPDXRef-Package--kici-dev-core-0.1.21",
6328
6287
  "relatedSpdxElement": "SPDXRef-Package-picocolors-1.1.1",
6329
6288
  "relationshipType": "DEPENDS_ON"
6330
6289
  },
6331
6290
  {
6332
- "spdxElementId": "SPDXRef-Package--kici-dev-core-0.1.19",
6291
+ "spdxElementId": "SPDXRef-Package--kici-dev-core-0.1.21",
6333
6292
  "relatedSpdxElement": "SPDXRef-Package-winston-daily-rotate-file-5.0.0",
6334
6293
  "relationshipType": "DEPENDS_ON"
6335
6294
  },
6336
6295
  {
6337
- "spdxElementId": "SPDXRef-Package--kici-dev-core-0.1.19",
6296
+ "spdxElementId": "SPDXRef-Package--kici-dev-core-0.1.21",
6338
6297
  "relatedSpdxElement": "SPDXRef-Package-winston-3.19.0",
6339
6298
  "relationshipType": "DEPENDS_ON"
6340
6299
  },
6341
6300
  {
6342
- "spdxElementId": "SPDXRef-Package--kici-dev-core-0.1.19",
6301
+ "spdxElementId": "SPDXRef-Package--kici-dev-core-0.1.21",
6343
6302
  "relatedSpdxElement": "SPDXRef-Package-zod-4.4.3",
6344
6303
  "relationshipType": "DEPENDS_ON"
6345
6304
  },
6346
6305
  {
6347
- "spdxElementId": "SPDXRef-Package--kici-dev-core-0.1.19",
6306
+ "spdxElementId": "SPDXRef-Package--kici-dev-core-0.1.21",
6348
6307
  "relatedSpdxElement": "SPDXRef-Package-zx-8.8.5",
6349
6308
  "relationshipType": "DEPENDS_ON"
6350
6309
  },
6351
6310
  {
6352
- "spdxElementId": "SPDXRef-Package--kici-dev-engine-0.1.19",
6311
+ "spdxElementId": "SPDXRef-Package--kici-dev-engine-0.1.21",
6353
6312
  "relatedSpdxElement": "SPDXRef-Package-jose-6.2.3",
6354
6313
  "relationshipType": "DEPENDS_ON"
6355
6314
  },
6356
6315
  {
6357
- "spdxElementId": "SPDXRef-Package--kici-dev-engine-0.1.19",
6316
+ "spdxElementId": "SPDXRef-Package--kici-dev-engine-0.1.21",
6358
6317
  "relatedSpdxElement": "SPDXRef-Package-jsonpath-plus-10.4.0",
6359
6318
  "relationshipType": "DEPENDS_ON"
6360
6319
  },
6361
6320
  {
6362
- "spdxElementId": "SPDXRef-Package--kici-dev-engine-0.1.19",
6321
+ "spdxElementId": "SPDXRef-Package--kici-dev-engine-0.1.21",
6363
6322
  "relatedSpdxElement": "SPDXRef-Package-picomatch-4.0.4",
6364
6323
  "relationshipType": "DEPENDS_ON"
6365
6324
  },
6366
6325
  {
6367
- "spdxElementId": "SPDXRef-Package--kici-dev-engine-0.1.19",
6326
+ "spdxElementId": "SPDXRef-Package--kici-dev-engine-0.1.21",
6368
6327
  "relatedSpdxElement": "SPDXRef-Package-safe-regex-2.1.1",
6369
6328
  "relationshipType": "DEPENDS_ON"
6370
6329
  },
6371
6330
  {
6372
- "spdxElementId": "SPDXRef-Package--kici-dev-engine-0.1.19",
6331
+ "spdxElementId": "SPDXRef-Package--kici-dev-engine-0.1.21",
6373
6332
  "relatedSpdxElement": "SPDXRef-Package-zod-4.4.3",
6374
6333
  "relationshipType": "DEPENDS_ON"
6375
6334
  },
6376
6335
  {
6377
- "spdxElementId": "SPDXRef-Package--kici-dev-sdk-0.1.19",
6378
- "relatedSpdxElement": "SPDXRef-Package--kici-dev-core-0.1.19",
6336
+ "spdxElementId": "SPDXRef-Package--kici-dev-sdk-0.1.21",
6337
+ "relatedSpdxElement": "SPDXRef-Package--kici-dev-core-0.1.21",
6379
6338
  "relationshipType": "DEPENDS_ON"
6380
6339
  },
6381
6340
  {
6382
- "spdxElementId": "SPDXRef-Package--kici-dev-sdk-0.1.19",
6383
- "relatedSpdxElement": "SPDXRef-Package--kici-dev-engine-0.1.19",
6341
+ "spdxElementId": "SPDXRef-Package--kici-dev-sdk-0.1.21",
6342
+ "relatedSpdxElement": "SPDXRef-Package--kici-dev-engine-0.1.21",
6384
6343
  "relationshipType": "DEPENDS_ON"
6385
6344
  },
6386
6345
  {
6387
- "spdxElementId": "SPDXRef-Package--kici-dev-sdk-0.1.19",
6346
+ "spdxElementId": "SPDXRef-Package--kici-dev-sdk-0.1.21",
6388
6347
  "relatedSpdxElement": "SPDXRef-Package-micromatch-4.0.8",
6389
6348
  "relationshipType": "DEPENDS_ON"
6390
6349
  },
6391
6350
  {
6392
- "spdxElementId": "SPDXRef-Package--kici-dev-sdk-0.1.19",
6351
+ "spdxElementId": "SPDXRef-Package--kici-dev-sdk-0.1.21",
6393
6352
  "relatedSpdxElement": "SPDXRef-Package-zod-4.4.3",
6394
6353
  "relationshipType": "DEPENDS_ON"
6395
6354
  },
6396
6355
  {
6397
- "spdxElementId": "SPDXRef-Package--kici-dev-sdk-0.1.19",
6356
+ "spdxElementId": "SPDXRef-Package--kici-dev-sdk-0.1.21",
6398
6357
  "relatedSpdxElement": "SPDXRef-Package-zx-8.8.5",
6399
6358
  "relationshipType": "DEPENDS_ON"
6400
6359
  },
6401
6360
  {
6402
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.19",
6361
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.21",
6403
6362
  "relatedSpdxElement": "SPDXRef-Package--aws-sdk-client-s3-3.1064.0",
6404
6363
  "relationshipType": "DEPENDS_ON"
6405
6364
  },
6406
6365
  {
6407
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.19",
6408
- "relatedSpdxElement": "SPDXRef-Package--kici-dev-core-0.1.19",
6366
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.21",
6367
+ "relatedSpdxElement": "SPDXRef-Package--kici-dev-core-0.1.21",
6409
6368
  "relationshipType": "DEPENDS_ON"
6410
6369
  },
6411
6370
  {
6412
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.19",
6371
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.21",
6413
6372
  "relatedSpdxElement": "SPDXRef-Package--opentelemetry-api-1.9.1",
6414
6373
  "relationshipType": "DEPENDS_ON"
6415
6374
  },
6416
6375
  {
6417
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.19",
6376
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.21",
6418
6377
  "relatedSpdxElement": "SPDXRef-Package--opentelemetry-exporter-metrics-otlp-http-0.218.0",
6419
6378
  "relationshipType": "DEPENDS_ON"
6420
6379
  },
6421
6380
  {
6422
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.19",
6381
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.21",
6423
6382
  "relatedSpdxElement": "SPDXRef-Package--opentelemetry-exporter-prometheus-0.218.0",
6424
6383
  "relationshipType": "DEPENDS_ON"
6425
6384
  },
6426
6385
  {
6427
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.19",
6386
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.21",
6428
6387
  "relatedSpdxElement": "SPDXRef-Package--opentelemetry-exporter-trace-otlp-http-0.218.0",
6429
6388
  "relationshipType": "DEPENDS_ON"
6430
6389
  },
6431
6390
  {
6432
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.19",
6391
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.21",
6433
6392
  "relatedSpdxElement": "SPDXRef-Package--opentelemetry-instrumentation-runtime-node-0.31.0",
6434
6393
  "relationshipType": "DEPENDS_ON"
6435
6394
  },
6436
6395
  {
6437
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.19",
6396
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.21",
6438
6397
  "relatedSpdxElement": "SPDXRef-Package--opentelemetry-resources-2.7.1",
6439
6398
  "relationshipType": "DEPENDS_ON"
6440
6399
  },
6441
6400
  {
6442
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.19",
6401
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.21",
6443
6402
  "relatedSpdxElement": "SPDXRef-Package--opentelemetry-sdk-node-0.218.0",
6444
6403
  "relationshipType": "DEPENDS_ON"
6445
6404
  },
6446
6405
  {
6447
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.19",
6406
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.21",
6448
6407
  "relatedSpdxElement": "SPDXRef-Package--opentelemetry-semantic-conventions-1.41.1",
6449
6408
  "relationshipType": "DEPENDS_ON"
6450
6409
  },
6451
6410
  {
6452
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.19",
6411
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.21",
6453
6412
  "relatedSpdxElement": "SPDXRef-Package-archiver-8.0.0",
6454
6413
  "relationshipType": "DEPENDS_ON"
6455
6414
  },
6456
6415
  {
6457
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.19",
6416
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.21",
6458
6417
  "relatedSpdxElement": "SPDXRef-Package-diff-9.0.0",
6459
6418
  "relationshipType": "DEPENDS_ON"
6460
6419
  },
6461
6420
  {
6462
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.19",
6421
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.21",
6463
6422
  "relatedSpdxElement": "SPDXRef-Package-hono-4.12.25",
6464
6423
  "relationshipType": "DEPENDS_ON"
6465
6424
  },
6466
6425
  {
6467
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.19",
6426
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.21",
6468
6427
  "relatedSpdxElement": "SPDXRef-Package-kysely-0.29.2",
6469
6428
  "relationshipType": "DEPENDS_ON"
6470
6429
  },
6471
6430
  {
6472
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.19",
6431
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.21",
6473
6432
  "relatedSpdxElement": "SPDXRef-Package-oxc-transform-0.135.0",
6474
6433
  "relationshipType": "DEPENDS_ON"
6475
6434
  },
6476
6435
  {
6477
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.19",
6436
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.21",
6478
6437
  "relatedSpdxElement": "SPDXRef-Package-pg-8.21.0",
6479
6438
  "relationshipType": "DEPENDS_ON"
6480
6439
  },
6481
6440
  {
6482
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.19",
6441
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.21",
6483
6442
  "relatedSpdxElement": "SPDXRef-Package-picocolors-1.1.1",
6484
6443
  "relationshipType": "DEPENDS_ON"
6485
6444
  },
6486
6445
  {
6487
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.19",
6446
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.21",
6488
6447
  "relatedSpdxElement": "SPDXRef-Package-winston-daily-rotate-file-5.0.0",
6489
6448
  "relationshipType": "DEPENDS_ON"
6490
6449
  },
6491
6450
  {
6492
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.19",
6451
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.21",
6493
6452
  "relatedSpdxElement": "SPDXRef-Package-winston-3.19.0",
6494
6453
  "relationshipType": "DEPENDS_ON"
6495
6454
  },
6496
6455
  {
6497
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.19",
6456
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.21",
6498
6457
  "relatedSpdxElement": "SPDXRef-Package-yaml-2.9.0",
6499
6458
  "relationshipType": "DEPENDS_ON"
6500
6459
  },
6501
6460
  {
6502
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.19",
6461
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.21",
6503
6462
  "relatedSpdxElement": "SPDXRef-Package-zod-4.4.3",
6504
6463
  "relationshipType": "DEPENDS_ON"
6505
6464
  },
6506
6465
  {
6507
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.19",
6466
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.1.21",
6508
6467
  "relatedSpdxElement": "SPDXRef-Package-zx-8.8.5",
6509
6468
  "relationshipType": "DEPENDS_ON"
6510
6469
  },
@@ -7418,11 +7377,6 @@
7418
7377
  "relatedSpdxElement": "SPDXRef-Package-tslib-2.8.1",
7419
7378
  "relationshipType": "DEPENDS_ON"
7420
7379
  },
7421
- {
7422
- "spdxElementId": "SPDXRef-Package--types-node-24.12.0",
7423
- "relatedSpdxElement": "SPDXRef-Package-undici-types-7.16.0",
7424
- "relationshipType": "DEPENDS_ON"
7425
- },
7426
7380
  {
7427
7381
  "spdxElementId": "SPDXRef-Package-abort-controller-3.0.0",
7428
7382
  "relatedSpdxElement": "SPDXRef-Package-event-target-shim-5.0.1",
@@ -7720,7 +7674,7 @@
7720
7674
  },
7721
7675
  {
7722
7676
  "spdxElementId": "SPDXRef-Package-dockerode-5.0.0",
7723
- "relatedSpdxElement": "SPDXRef-Package-protobufjs-8.0.3",
7677
+ "relatedSpdxElement": "SPDXRef-Package-protobufjs-8.6.3",
7724
7678
  "relationshipType": "DEPENDS_ON"
7725
7679
  },
7726
7680
  {
@@ -8049,12 +8003,7 @@
8049
8003
  "relationshipType": "DEPENDS_ON"
8050
8004
  },
8051
8005
  {
8052
- "spdxElementId": "SPDXRef-Package-protobufjs-8.0.3",
8053
- "relatedSpdxElement": "SPDXRef-Package--types-node-24.12.0",
8054
- "relationshipType": "DEPENDS_ON"
8055
- },
8056
- {
8057
- "spdxElementId": "SPDXRef-Package-protobufjs-8.0.3",
8006
+ "spdxElementId": "SPDXRef-Package-protobufjs-8.6.3",
8058
8007
  "relatedSpdxElement": "SPDXRef-Package-long-5.3.2",
8059
8008
  "relationshipType": "DEPENDS_ON"
8060
8009
  },