@kici-dev/orchestrator 0.19.0 → 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,67 @@
1
+ /**
2
+ * The container-scaler agent image check `kici-admin orchestrator upgrade`
3
+ * runs before it restarts the service.
4
+ *
5
+ * A container scaler spawns each agent from the image its label set names, not
6
+ * from the upgraded orchestrator. So an upgrade leaves container agents on the
7
+ * old release when a label set pins an older `kici-agent:<version>`, or names
8
+ * the moving `:latest` tag with the default `imagePullPolicy: IfNotPresent`: a
9
+ * host that already pulled `:latest` keeps that image. The check only warns:
10
+ * it never rewrites the operator's scaler config and never stops the upgrade.
11
+ */
12
+ import { type ScalerConfig } from '../../../scaler/types.js';
13
+ /** Why a container label set keeps spawning an old agent after the upgrade. */
14
+ export declare enum AgentImageIssue {
15
+ /** `:latest` (or no tag) with `IfNotPresent`: the host keeps the image it pulled. */
16
+ MovingTag = "moving-tag",
17
+ /** A `kici-agent:<version>` older than the release the upgrade installs. */
18
+ OlderPin = "older-pin"
19
+ }
20
+ export interface AgentImageFinding {
21
+ issue: AgentImageIssue;
22
+ scaler: string;
23
+ labels: string[];
24
+ image: string;
25
+ message: string;
26
+ }
27
+ /** An image reference split into its repository, tag and digest. */
28
+ export interface ImageRefParts {
29
+ repository: string;
30
+ tag: string | null;
31
+ digest: string | null;
32
+ }
33
+ /**
34
+ * Split `[registry/]path/name[:tag][@digest]`. A `:` before the last `/` is a
35
+ * registry port, not a tag.
36
+ */
37
+ export declare function parseImageRef(image: string): ImageRefParts;
38
+ export interface CheckAgentImagesArgs {
39
+ config: ScalerConfig;
40
+ /** The release the upgrade installs, or null when the caller does not know it. */
41
+ targetVersion: string | null;
42
+ /** The main scaler config file, for the remedy text. */
43
+ scalerConfigPath: string;
44
+ /** The `KICI_SCALER_CONFIG_DIR` directory, when one is set. */
45
+ scalerConfigDir?: string;
46
+ }
47
+ /**
48
+ * Every container-scaler label set whose agent image an upgrade to
49
+ * `targetVersion` leaves unchanged. An empty result means each agent image is
50
+ * pinned to the target (or newer), pulled on every spawn, or not a KiCI agent.
51
+ */
52
+ export declare function checkContainerAgentImages(args: CheckAgentImagesArgs): AgentImageFinding[];
53
+ export interface WarnAgentImagesArgs {
54
+ envFilePath: string;
55
+ workingDirectory: string;
56
+ /** The release the upgrade installs, or null when the caller does not know it. */
57
+ targetVersion: string | null;
58
+ warn: (line: string) => void;
59
+ }
60
+ /**
61
+ * Print one warning per container label set whose agent image the upgrade
62
+ * leaves unchanged. Never throws, and stays silent when the env file or the
63
+ * scaler config cannot be read: the bare-metal `binaryPath` check, which runs
64
+ * first on the same files, already reports that.
65
+ */
66
+ export declare function warnAboutContainerAgentImages(args: WarnAgentImagesArgs): Promise<void>;
67
+ //# sourceMappingURL=container-agent-image-check.d.ts.map
package/dist/cli.js CHANGED
@@ -22341,6 +22341,25 @@ function encryptPrivateKey(privateKey, secretKey) {
22341
22341
  return encrypt(privateKey.toString("base64"), key, 1, PRIVATE_KEY_AAD).data;
22342
22342
  }
22343
22343
  createLogger({ prefix: "job-secret-seal" });
22344
+ //#endregion
22345
+ //#region src/agent/agent-version.ts
22346
+ /**
22347
+ * Parse `MAJOR.MINOR.PATCH`, or `null` for a non-version. The `-prerelease`
22348
+ * suffix is dropped rather than ordered: it is a build counter (`0.5.0-9159`),
22349
+ * and strict semver would order it BELOW `0.5.0`, reading every prerelease
22350
+ * agent as too old for a feature it carries.
22351
+ */
22352
+ function parseVersionBase(version) {
22353
+ const parts = version.trim().split("-")[0].split(".");
22354
+ if (parts.length !== 3) return null;
22355
+ const nums = parts.map((part) => /^\d+$/.test(part) ? Number(part) : NaN);
22356
+ if (nums.some((n) => Number.isNaN(n))) return null;
22357
+ return [
22358
+ nums[0],
22359
+ nums[1],
22360
+ nums[2]
22361
+ ];
22362
+ }
22344
22363
  runtimeLabel(RuntimeFact.enum.docker), runtimeLabel(RuntimeFact.enum.podman);
22345
22364
  //#endregion
22346
22365
  //#region src/helpers/run-detached.ts
@@ -24132,6 +24151,117 @@ async function preflightBareMetalBinaryPaths(args) {
24132
24151
  Nothing was installed and the service was not restarted. Fix binaryPath and run the upgrade again, or pass ${SKIP_BINARY_PATH_CHECK_FLAG} to upgrade anyway.`);
24133
24152
  }
24134
24153
  //#endregion
24154
+ //#region src/cli/commands/shared/container-agent-image-check.ts
24155
+ /**
24156
+ * The container-scaler agent image check `kici-admin orchestrator upgrade`
24157
+ * runs before it restarts the service.
24158
+ *
24159
+ * A container scaler spawns each agent from the image its label set names, not
24160
+ * from the upgraded orchestrator. So an upgrade leaves container agents on the
24161
+ * old release when a label set pins an older `kici-agent:<version>`, or names
24162
+ * the moving `:latest` tag with the default `imagePullPolicy: IfNotPresent`: a
24163
+ * host that already pulled `:latest` keeps that image. The check only warns:
24164
+ * it never rewrites the operator's scaler config and never stops the upgrade.
24165
+ */
24166
+ /** The repository name of the published agent image, under any registry or mirror. */
24167
+ const AGENT_IMAGE_NAME = "kici-agent";
24168
+ /** The moving tag an untagged image reference resolves to. */
24169
+ const LATEST_TAG = "latest";
24170
+ /**
24171
+ * Split `[registry/]path/name[:tag][@digest]`. A `:` before the last `/` is a
24172
+ * registry port, not a tag.
24173
+ */
24174
+ function parseImageRef(image) {
24175
+ const at = image.indexOf("@");
24176
+ const named = at === -1 ? image : image.slice(0, at);
24177
+ const digest = at === -1 ? null : image.slice(at + 1);
24178
+ const colon = named.lastIndexOf(":");
24179
+ if (colon > named.lastIndexOf("/")) return {
24180
+ repository: named.slice(0, colon),
24181
+ tag: named.slice(colon + 1),
24182
+ digest
24183
+ };
24184
+ return {
24185
+ repository: named,
24186
+ tag: null,
24187
+ digest
24188
+ };
24189
+ }
24190
+ /** True when the repository is the KiCI agent image, from quay.io or a mirror. */
24191
+ function isAgentImage(repository) {
24192
+ return repository.slice(repository.lastIndexOf("/") + 1) === AGENT_IMAGE_NAME;
24193
+ }
24194
+ /** -1, 0 or 1 as `a` is an older, the same or a newer release than `b`; null for a non-version. */
24195
+ function compareReleases(a, b) {
24196
+ const left = parseVersionBase(a.replace(/^v/, ""));
24197
+ const right = parseVersionBase(b.replace(/^v/, ""));
24198
+ if (!left || !right) return null;
24199
+ for (let i = 0; i < 3; i++) if (left[i] !== right[i]) return left[i] < right[i] ? -1 : 1;
24200
+ return 0;
24201
+ }
24202
+ /**
24203
+ * Every container-scaler label set whose agent image an upgrade to
24204
+ * `targetVersion` leaves unchanged. An empty result means each agent image is
24205
+ * pinned to the target (or newer), pulled on every spawn, or not a KiCI agent.
24206
+ */
24207
+ function checkContainerAgentImages(args) {
24208
+ const { config } = args;
24209
+ const bare = args.targetVersion?.trim().replace(/^v/, "") ?? null;
24210
+ const targetVersion = bare && parseVersionBase(bare) ? bare : null;
24211
+ const where = args.scalerConfigDir ? `${args.scalerConfigPath} (or the file under ${args.scalerConfigDir} that declares it)` : args.scalerConfigPath;
24212
+ const findings = [];
24213
+ for (const entry of config.scalers) {
24214
+ if (entry.type !== ScalerBackendType.enum.container) continue;
24215
+ for (const ls of entry.labelSets) {
24216
+ if (!ls.image) continue;
24217
+ const ref = parseImageRef(ls.image);
24218
+ if (!isAgentImage(ref.repository)) continue;
24219
+ const pinned = targetVersion ? `${ref.repository}:${targetVersion}` : null;
24220
+ const prefix = `container scaler "${entry.name}", label set [${ls.labels.join(", ")}]: image ${ls.image}`;
24221
+ const finding = (issue, message) => ({
24222
+ issue,
24223
+ scaler: entry.name,
24224
+ labels: ls.labels,
24225
+ image: ls.image,
24226
+ message: `${prefix} ${message}`
24227
+ });
24228
+ const policy = ls.imagePullPolicy ?? ImagePullPolicy.enum.IfNotPresent;
24229
+ if ((ref.tag === null || ref.tag === LATEST_TAG) && ref.digest === null && policy === ImagePullPolicy.enum.IfNotPresent) {
24230
+ const pin = pinned ? `set "image: ${pinned}"` : `set image to the kici-agent release you upgrade to (${ref.repository}:<version>)`;
24231
+ findings.push(finding("moving-tag", `with imagePullPolicy IfNotPresent keeps the agent image this host already pulled, so the upgrade does not change the container agents. In ${where}, ${pin} on this label set, or set "imagePullPolicy: Always" to pull ${LATEST_TAG} on every spawn.`));
24232
+ continue;
24233
+ }
24234
+ if (!targetVersion || ref.tag === null) continue;
24235
+ if (compareReleases(ref.tag, targetVersion) === -1) findings.push(finding("older-pin", `is older than the upgrade target ${targetVersion}, so the container agents keep running ${ref.tag}. In ${where}, set "image: ${pinned}" on this label set.`));
24236
+ }
24237
+ }
24238
+ return findings;
24239
+ }
24240
+ /**
24241
+ * Print one warning per container label set whose agent image the upgrade
24242
+ * leaves unchanged. Never throws, and stays silent when the env file or the
24243
+ * scaler config cannot be read: the bare-metal `binaryPath` check, which runs
24244
+ * first on the same files, already reports that.
24245
+ */
24246
+ async function warnAboutContainerAgentImages(args) {
24247
+ let location;
24248
+ let config;
24249
+ try {
24250
+ location = scalerConfigLocation(fs.readFileSync(args.envFilePath, "utf-8"), args.workingDirectory);
24251
+ if (!location) return;
24252
+ config = await loadScalerConfig(location.configPath, location.configDir);
24253
+ } catch {
24254
+ return;
24255
+ }
24256
+ const findings = checkContainerAgentImages({
24257
+ config,
24258
+ targetVersion: args.targetVersion,
24259
+ scalerConfigPath: location.configPath,
24260
+ ...location.configDir ? { scalerConfigDir: location.configDir } : {}
24261
+ });
24262
+ for (const f of findings) args.warn(`Warning: ${f.message}`);
24263
+ }
24264
+ //#endregion
24135
24265
  //#region src/cli/commands/shared/versioned-upgrade.ts
24136
24266
  /**
24137
24267
  * Versioned-directory upgrade shared by the kici-admin upgrade commands: each
@@ -24141,14 +24271,16 @@ Nothing was installed and the service was not restarted. Fix binaryPath and run
24141
24271
  */
24142
24272
  init_service();
24143
24273
  /**
24144
- * Check every bare-metal `binaryPath` of an orchestrator before the upgrade
24145
- * installs or restarts anything. `spec` is the unit's launch command: the
24146
- * `kici-agent` installed with its runtime is the one each `binaryPath` should
24274
+ * Check an orchestrator's scaler config before the upgrade installs or
24275
+ * restarts anything. `spec` is the unit's launch command: the `kici-agent`
24276
+ * installed with its runtime is the one each bare-metal `binaryPath` should
24147
24277
  * name. `expectedVersion` is what that agent runs after the upgrade, when the
24148
24278
  * caller knows it. Throws when a `binaryPath` would stop the restarted service,
24149
- * unless `skip` is set: then every finding is a warning.
24279
+ * unless `skip` is set: then every finding is a warning. Then warns about each
24280
+ * container label set whose agent image stays behind `targetVersion`, the
24281
+ * release the service runs after the upgrade.
24150
24282
  */
24151
- async function checkBareMetalBinaryPathsBeforeUpgrade(args) {
24283
+ async function checkScalersBeforeUpgrade(args) {
24152
24284
  if (args.component !== "orchestrator" || args.platform === "compose") return;
24153
24285
  const expectedAgent = args.spec ? agentBinaryFromLaunch(args.spec, isWindows(args.platform)) : null;
24154
24286
  await preflightBareMetalBinaryPaths({
@@ -24161,6 +24293,12 @@ async function checkBareMetalBinaryPathsBeforeUpgrade(args) {
24161
24293
  skip: args.skip,
24162
24294
  warn: (line) => console.warn(line)
24163
24295
  });
24296
+ await warnAboutContainerAgentImages({
24297
+ envFilePath: args.config.envFilePath,
24298
+ workingDirectory: args.config.workingDirectory,
24299
+ targetVersion: args.targetVersion,
24300
+ warn: (line) => console.warn(line)
24301
+ });
24164
24302
  }
24165
24303
  /**
24166
24304
  * Resolve the upgrade target through {@link resolveInstanceTarget}: `instanceDir`,
@@ -24748,12 +24886,13 @@ async function performVersionedUpgrade(component, opts, hooks = {}) {
24748
24886
  console.error(`Error: service "${config.name}" is not installed`);
24749
24887
  process.exit(1);
24750
24888
  }
24751
- await checkBareMetalBinaryPathsBeforeUpgrade({
24889
+ await checkScalersBeforeUpgrade({
24752
24890
  component,
24753
24891
  config,
24754
24892
  platform,
24755
24893
  spec: await manager.readLaunchSpec(config),
24756
24894
  expectedVersion: null,
24895
+ targetVersion: version,
24757
24896
  willInstall: false,
24758
24897
  skip: opts.skipBinaryPathCheck ?? false
24759
24898
  });
@@ -24909,12 +25048,13 @@ async function restartOnlyUpgrade(args) {
24909
25048
  console.error(`Error: ${verdict.reason}`);
24910
25049
  process.exit(1);
24911
25050
  }
24912
- await checkBareMetalBinaryPathsBeforeUpgrade({
25051
+ await checkScalersBeforeUpgrade({
24913
25052
  component: args.component,
24914
25053
  config,
24915
25054
  platform,
24916
25055
  spec,
24917
25056
  expectedVersion: null,
25057
+ targetVersion: verdict.version,
24918
25058
  willInstall: false,
24919
25059
  skip: opts.skipBinaryPathCheck ?? false
24920
25060
  });
@@ -24945,12 +25085,13 @@ async function restartOnlyUpgrade(args) {
24945
25085
  async function performSelfDrivingInstall(args) {
24946
25086
  const { component, config, resolvedInstance, manager, action, opts, platform, spec } = args;
24947
25087
  const { target, version } = action;
24948
- await checkBareMetalBinaryPathsBeforeUpgrade({
25088
+ await checkScalersBeforeUpgrade({
24949
25089
  component,
24950
25090
  config,
24951
25091
  platform,
24952
25092
  spec,
24953
25093
  expectedVersion: `${target.owningPackage}@${version}`,
25094
+ targetVersion: version,
24954
25095
  willInstall: true,
24955
25096
  skip: opts.skipBinaryPathCheck ?? false
24956
25097
  });
@@ -25108,7 +25249,7 @@ async function switchToInstalledVersion(args) {
25108
25249
  action: `switch "${config.name}" to ${targetVersion}`,
25109
25250
  config
25110
25251
  });
25111
- await warnAboutBareMetalBinaryPaths(args);
25252
+ await warnAboutScalers(args);
25112
25253
  if (!await assertSchemaAllowsSwitch({
25113
25254
  component,
25114
25255
  targetVersion,
@@ -25142,18 +25283,20 @@ async function switchToInstalledVersion(args) {
25142
25283
  });
25143
25284
  }
25144
25285
  /**
25145
- * Print the bare-metal `binaryPath` diagnosis before `--rollback` or `--pick`
25146
- * restarts the service. Never refuses and never throws: both are recovery
25147
- * paths, and a check that cannot run must not block a recovery.
25286
+ * Print the bare-metal `binaryPath` and container agent image diagnoses before
25287
+ * `--rollback` or `--pick` restarts the service. Never refuses and never
25288
+ * throws: both are recovery paths, and a check that cannot run must not block
25289
+ * a recovery.
25148
25290
  */
25149
- async function warnAboutBareMetalBinaryPaths(args) {
25291
+ async function warnAboutScalers(args) {
25150
25292
  try {
25151
- await checkBareMetalBinaryPathsBeforeUpgrade({
25293
+ await checkScalersBeforeUpgrade({
25152
25294
  component: args.component,
25153
25295
  config: args.config,
25154
25296
  platform: args.platform,
25155
25297
  spec: await args.manager.readLaunchSpec(args.config).catch(() => null),
25156
25298
  expectedVersion: null,
25299
+ targetVersion: args.targetVersion,
25157
25300
  willInstall: false,
25158
25301
  skip: true
25159
25302
  });
@@ -26677,7 +26820,7 @@ init_manifest();
26677
26820
  const ALL_PLATFORMS = AgentPlatform.options;
26678
26821
  /** The orchestrator's own version (single-version invariant) = the packaged agent version. */
26679
26822
  function resolveKiciVersion() {
26680
- return "0.19.0";
26823
+ return "0.20.0";
26681
26824
  }
26682
26825
  /** Parse the --platform value: default set | single | CSV | `all`. */
26683
26826
  function parsePlatforms(raw) {
@@ -36926,7 +37069,7 @@ function routeRootArgs(root, args) {
36926
37069
  * build entry; the fallback covers a source run (tests, `tsx`), the same shape
36927
37070
  * `server.ts` and `standalone.ts` use for `ORCHESTRATOR_VERSION`.
36928
37071
  */
36929
- const CLI_VERSION = "0.19.0";
37072
+ const CLI_VERSION = "0.20.0";
36930
37073
  /**
36931
37074
  * Root command whose option parsing first routes argv through
36932
37075
  * {@link routeRootArgs}: a leading `--version` prints the CLI version, and an
package/dist/server.js CHANGED
@@ -44036,7 +44036,10 @@ async function resolveLockFileForTest(input, deps, runId) {
44036
44036
  function selectMatchedDecisions(input, fullLockFile, simulatedEvent) {
44037
44037
  let decisions;
44038
44038
  if (input.workflowName) {
44039
- if (!fullLockFile.workflows.find((w) => w.name === input.workflowName)) return { rejected: `Workflow '${input.workflowName}' not found in lock file` };
44039
+ if (!fullLockFile.workflows.find((w) => w.name === input.workflowName)) {
44040
+ const available = fullLockFile.workflows.map((w) => w.name).join(", ");
44041
+ return { rejected: `Workflow '${input.workflowName}' not found in lock file. Available workflows: ${available || "(none)"}` };
44042
+ }
44040
44043
  decisions = [createWorkflowDecision(input.workflowName, true, [], void 0, "Direct test run")];
44041
44044
  } else decisions = matchAllWorkflows(fullLockFile.workflows, simulatedEvent);
44042
44045
  const matched = decisions.filter((d) => d.matched);
@@ -48960,13 +48963,13 @@ function createHealthRoutes$1(deps = {}) {
48960
48963
  return createHealthRoutes({
48961
48964
  livenessInfo: () => {
48962
48965
  return {
48963
- version: "0.19.0",
48964
- buildDate: "2026-10-16T22:00:26.244Z",
48965
- sdkVersion: "0.19.0",
48966
+ version: "0.20.0",
48967
+ buildDate: "2026-10-17T08:12:16.425Z",
48968
+ sdkVersion: "0.20.0",
48966
48969
  sdkBundleHash: "b012bd8bace3df9e574252bf290c652bc39766da617acf51729a08586756266d",
48967
- sharedVersion: "0.19.0",
48970
+ sharedVersion: "0.20.0",
48968
48971
  sharedBundleHash: "23378ace59973f47203be3ff171bb7d5e66702eaa335927b390f94b9771a1f8b",
48969
- engineVersion: "0.19.0",
48972
+ engineVersion: "0.20.0",
48970
48973
  engineBundleHash: "406208ee50766cd0d4ce3ab1fd5dec4501d5117a74acd294b25736d9bd6e89bd"
48971
48974
  };
48972
48975
  },
@@ -48999,7 +49002,7 @@ function createCapabilitiesRoutes() {
48999
49002
  const app = new Hono();
49000
49003
  app.get("/api/v1/capabilities", (c) => {
49001
49004
  const manifest = {
49002
- orchestratorVersion: "0.19.0",
49005
+ orchestratorVersion: "0.20.0",
49003
49006
  protocolVersion: PROTOCOL_VERSION,
49004
49007
  minProtocolVersion: MIN_PROTOCOL_VERSION
49005
49008
  };
@@ -59636,7 +59639,7 @@ var init_app = __esmMin((() => {
59636
59639
  init_agent_metrics_aggregator();
59637
59640
  init_run_detached();
59638
59641
  logger$66 = createLogger({ prefix: "app" });
59639
- ORCHESTRATOR_VERSION$2 = "0.19.0";
59642
+ ORCHESTRATOR_VERSION$2 = "0.20.0";
59640
59643
  SourceLocationStore = class {
59641
59644
  cache = /* @__PURE__ */ new Map();
59642
59645
  key(workflowName, jobName) {
@@ -68727,7 +68730,7 @@ var init_peer_client = __esmMin((() => {
68727
68730
  PeerDialOrigin["Discovered"] = "discovered";
68728
68731
  return PeerDialOrigin;
68729
68732
  }({});
68730
- SOFTWARE_VERSION$1 = "0.19.0";
68733
+ SOFTWARE_VERSION$1 = "0.20.0";
68731
68734
  PeerClient$1 = class {
68732
68735
  ws = null;
68733
68736
  _state = "disconnected";
@@ -71198,7 +71201,7 @@ var init_peer_handler = __esmMin((() => {
71198
71201
  init_join_token();
71199
71202
  init_run_detached();
71200
71203
  logger$46 = createLogger({ prefix: "peer-handler" });
71201
- SOFTWARE_VERSION = "0.19.0";
71204
+ SOFTWARE_VERSION = "0.20.0";
71202
71205
  ADVERTISED_PEER_AUTH_SCHEMES = [PeerAuthScheme.enum["mutual-v2"]];
71203
71206
  MAX_TOKEN_CANDIDATES = 8;
71204
71207
  RATE_LIMIT_MAX = 5;
@@ -100380,12 +100383,12 @@ var init_worker_core = __esmMin((() => {
100380
100383
  init_app_on_error();
100381
100384
  init_run_detached();
100382
100385
  init_peer_job_cancel();
100383
- ORCHESTRATOR_VERSION$1 = "0.19.0";
100384
- WORKER_SDK_VERSION = "0.19.0";
100386
+ ORCHESTRATOR_VERSION$1 = "0.20.0";
100387
+ WORKER_SDK_VERSION = "0.20.0";
100385
100388
  WORKER_SDK_BUNDLE_HASH = "b012bd8bace3df9e574252bf290c652bc39766da617acf51729a08586756266d";
100386
- WORKER_SHARED_VERSION = "0.19.0";
100389
+ WORKER_SHARED_VERSION = "0.20.0";
100387
100390
  WORKER_SHARED_BUNDLE_HASH = "23378ace59973f47203be3ff171bb7d5e66702eaa335927b390f94b9771a1f8b";
100388
- WORKER_ENGINE_VERSION = "0.19.0";
100391
+ WORKER_ENGINE_VERSION = "0.20.0";
100389
100392
  WORKER_ENGINE_BUNDLE_HASH = "406208ee50766cd0d4ce3ab1fd5dec4501d5117a74acd294b25736d9bd6e89bd";
100390
100393
  logger$2 = createLogger({ prefix: "worker" });
100391
100394
  DRAIN_TIMEOUT_MS = 3e5;
@@ -100413,12 +100416,12 @@ init_run_detached();
100413
100416
  init_dashboard_access();
100414
100417
  init_peer_job_cancel();
100415
100418
  init_orphan_requests();
100416
- const ORCHESTRATOR_VERSION = "0.19.0";
100417
- const SDK_VERSION = "0.19.0";
100419
+ const ORCHESTRATOR_VERSION = "0.20.0";
100420
+ const SDK_VERSION = "0.20.0";
100418
100421
  const SDK_BUNDLE_HASH = "b012bd8bace3df9e574252bf290c652bc39766da617acf51729a08586756266d";
100419
- const SHARED_VERSION = "0.19.0";
100422
+ const SHARED_VERSION = "0.20.0";
100420
100423
  const SHARED_BUNDLE_HASH = "23378ace59973f47203be3ff171bb7d5e66702eaa335927b390f94b9771a1f8b";
100421
- const ENGINE_VERSION = "0.19.0";
100424
+ const ENGINE_VERSION = "0.20.0";
100422
100425
  const ENGINE_BUNDLE_HASH = "406208ee50766cd0d4ce3ab1fd5dec4501d5117a74acd294b25736d9bd6e89bd";
100423
100426
  const otelSdk = initTelemetry({
100424
100427
  serviceName: "kici-orchestrator",
@@ -5979,7 +5979,7 @@ var init_peer_client = __esmMin((() => {
5979
5979
  PeerDialOrigin["Discovered"] = "discovered";
5980
5980
  return PeerDialOrigin;
5981
5981
  }({});
5982
- SOFTWARE_VERSION$1 = "0.19.0";
5982
+ SOFTWARE_VERSION$1 = "0.20.0";
5983
5983
  PeerClient$1 = class {
5984
5984
  ws = null;
5985
5985
  _state = "disconnected";
@@ -8450,7 +8450,7 @@ var init_peer_handler = __esmMin((() => {
8450
8450
  init_join_token();
8451
8451
  init_run_detached();
8452
8452
  logger$154 = createLogger({ prefix: "peer-handler" });
8453
- SOFTWARE_VERSION = "0.19.0";
8453
+ SOFTWARE_VERSION = "0.20.0";
8454
8454
  ADVERTISED_PEER_AUTH_SCHEMES = [PeerAuthScheme.enum["mutual-v2"]];
8455
8455
  MAX_TOKEN_CANDIDATES = 8;
8456
8456
  RATE_LIMIT_MAX = 5;
@@ -63630,7 +63630,10 @@ async function resolveLockFileForTest(input, deps, runId) {
63630
63630
  function selectMatchedDecisions(input, fullLockFile, simulatedEvent) {
63631
63631
  let decisions;
63632
63632
  if (input.workflowName) {
63633
- if (!fullLockFile.workflows.find((w) => w.name === input.workflowName)) return { rejected: `Workflow '${input.workflowName}' not found in lock file` };
63633
+ if (!fullLockFile.workflows.find((w) => w.name === input.workflowName)) {
63634
+ const available = fullLockFile.workflows.map((w) => w.name).join(", ");
63635
+ return { rejected: `Workflow '${input.workflowName}' not found in lock file. Available workflows: ${available || "(none)"}` };
63636
+ }
63634
63637
  decisions = [createWorkflowDecision(input.workflowName, true, [], void 0, "Direct test run")];
63635
63638
  } else decisions = matchAllWorkflows(fullLockFile.workflows, simulatedEvent);
63636
63639
  const matched = decisions.filter((d) => d.matched);
@@ -68523,13 +68526,13 @@ function createHealthRoutes$1(deps = {}) {
68523
68526
  return createHealthRoutes({
68524
68527
  livenessInfo: () => {
68525
68528
  return {
68526
- version: "0.19.0",
68527
- buildDate: "2026-10-16T22:00:26.244Z",
68528
- sdkVersion: "0.19.0",
68529
+ version: "0.20.0",
68530
+ buildDate: "2026-10-17T08:12:16.425Z",
68531
+ sdkVersion: "0.20.0",
68529
68532
  sdkBundleHash: "b012bd8bace3df9e574252bf290c652bc39766da617acf51729a08586756266d",
68530
- sharedVersion: "0.19.0",
68533
+ sharedVersion: "0.20.0",
68531
68534
  sharedBundleHash: "23378ace59973f47203be3ff171bb7d5e66702eaa335927b390f94b9771a1f8b",
68532
- engineVersion: "0.19.0",
68535
+ engineVersion: "0.20.0",
68533
68536
  engineBundleHash: "406208ee50766cd0d4ce3ab1fd5dec4501d5117a74acd294b25736d9bd6e89bd"
68534
68537
  };
68535
68538
  },
@@ -68562,7 +68565,7 @@ function createCapabilitiesRoutes() {
68562
68565
  const app = new Hono();
68563
68566
  app.get("/api/v1/capabilities", (c) => {
68564
68567
  const manifest = {
68565
- orchestratorVersion: "0.19.0",
68568
+ orchestratorVersion: "0.20.0",
68566
68569
  protocolVersion: PROTOCOL_VERSION,
68567
68570
  minProtocolVersion: MIN_PROTOCOL_VERSION
68568
68571
  };
@@ -71796,7 +71799,7 @@ var init_app = __esmMin((() => {
71796
71799
  init_agent_metrics_aggregator();
71797
71800
  init_run_detached();
71798
71801
  logger$38 = createLogger({ prefix: "app" });
71799
- ORCHESTRATOR_VERSION$2 = "0.19.0";
71802
+ ORCHESTRATOR_VERSION$2 = "0.20.0";
71800
71803
  SourceLocationStore = class {
71801
71804
  cache = /* @__PURE__ */ new Map();
71802
71805
  key(workflowName, jobName) {
@@ -91411,12 +91414,12 @@ var init_worker_core = __esmMin((() => {
91411
91414
  init_app_on_error();
91412
91415
  init_run_detached();
91413
91416
  init_peer_job_cancel();
91414
- ORCHESTRATOR_VERSION$1 = "0.19.0";
91415
- WORKER_SDK_VERSION = "0.19.0";
91417
+ ORCHESTRATOR_VERSION$1 = "0.20.0";
91418
+ WORKER_SDK_VERSION = "0.20.0";
91416
91419
  WORKER_SDK_BUNDLE_HASH = "b012bd8bace3df9e574252bf290c652bc39766da617acf51729a08586756266d";
91417
- WORKER_SHARED_VERSION = "0.19.0";
91420
+ WORKER_SHARED_VERSION = "0.20.0";
91418
91421
  WORKER_SHARED_BUNDLE_HASH = "23378ace59973f47203be3ff171bb7d5e66702eaa335927b390f94b9771a1f8b";
91419
- WORKER_ENGINE_VERSION = "0.19.0";
91422
+ WORKER_ENGINE_VERSION = "0.20.0";
91420
91423
  WORKER_ENGINE_BUNDLE_HASH = "406208ee50766cd0d4ce3ab1fd5dec4501d5117a74acd294b25736d9bd6e89bd";
91421
91424
  logger$2 = createLogger({ prefix: "worker" });
91422
91425
  DRAIN_TIMEOUT_MS = 3e5;
@@ -91446,12 +91449,12 @@ init_webhook_url_resolvers();
91446
91449
  init_run_detached();
91447
91450
  init_peer_job_cancel();
91448
91451
  init_orphan_requests();
91449
- const ORCHESTRATOR_VERSION = "0.19.0";
91450
- const SDK_VERSION = "0.19.0";
91452
+ const ORCHESTRATOR_VERSION = "0.20.0";
91453
+ const SDK_VERSION = "0.20.0";
91451
91454
  const SDK_BUNDLE_HASH = "b012bd8bace3df9e574252bf290c652bc39766da617acf51729a08586756266d";
91452
- const SHARED_VERSION = "0.19.0";
91455
+ const SHARED_VERSION = "0.20.0";
91453
91456
  const SHARED_BUNDLE_HASH = "23378ace59973f47203be3ff171bb7d5e66702eaa335927b390f94b9771a1f8b";
91454
- const ENGINE_VERSION = "0.19.0";
91457
+ const ENGINE_VERSION = "0.20.0";
91455
91458
  const ENGINE_BUNDLE_HASH = "406208ee50766cd0d4ce3ab1fd5dec4501d5117a74acd294b25736d9bd6e89bd";
91456
91459
  const otelSdk = initTelemetry({
91457
91460
  serviceName: "kici-orchestrator",
@@ -1,7 +1,7 @@
1
1
  {
2
- "version": "0.19.0",
2
+ "version": "0.20.0",
3
3
  "images": {
4
- "kici-agent": "sha256:6948358a9f43843e1ef61fab37253d4d50ea2f4e16cc19810d029cec8117c5a7",
5
- "kici-orchestrator": "sha256:f5d101af3e4dca37e68387168cbb3d241da71f86e11ee448ac87c038bf923580"
4
+ "kici-agent": "sha256:860c84bf420d76ce0900b0e41fe9fde0a7dfe47862d933028ff48da7efb7d1a4",
5
+ "kici-orchestrator": "sha256:b2bd35ee87b94f2612622d47d2e7c0bf6fdb8487e9631366e91bf48920f698fb"
6
6
  }
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kici-dev/orchestrator",
3
- "version": "0.19.0",
3
+ "version": "0.20.0",
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.19.0",
94
- "@kici-dev/engine": "0.19.0"
93
+ "@kici-dev/engine": "0.20.0",
94
+ "@kici-dev/shared": "0.20.0"
95
95
  },
96
96
  "kici": {
97
97
  "metrics": {
@@ -106,8 +106,8 @@
106
106
  "@types/dockerode": "^4.0.1",
107
107
  "@types/ws": "^8.18.1",
108
108
  "kysely-ctl": "^0.21.0",
109
- "@kici-dev/test-support": "0.0.0",
110
- "@kici-dev/agent": "0.19.0"
109
+ "@kici-dev/agent": "0.20.0",
110
+ "@kici-dev/test-support": "0.0.0"
111
111
  },
112
112
  "scripts": {
113
113
  "build": "node ../../scripts/build-service.mjs && tsc -p tsconfig.build.json --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.19.0",
6
- "documentNamespace": "https://kici.dev/sbom/%40kici-dev%2Forchestrator/0.19.0/40dd3338-67e9-407a-bb25-3c919db547ce",
5
+ "name": "@kici-dev/orchestrator@0.20.0",
6
+ "documentNamespace": "https://kici.dev/sbom/%40kici-dev%2Forchestrator/0.20.0/5a49c6d3-45cd-4b94-8d53-78bd4bffd04d",
7
7
  "creationInfo": {
8
- "created": "2026-10-17T04:16:13Z",
8
+ "created": "2026-10-17T10:01:06Z",
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.19.0",
967
+ "SPDXID": "SPDXRef-Package--kici-dev-core-0.20.0",
968
968
  "name": "@kici-dev/core",
969
- "versionInfo": "0.19.0",
969
+ "versionInfo": "0.20.0",
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.19.0"
980
+ "referenceLocator": "pkg:npm/%40kici-dev/core@0.20.0"
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.19.0",
987
+ "SPDXID": "SPDXRef-Package--kici-dev-engine-0.20.0",
988
988
  "name": "@kici-dev/engine",
989
- "versionInfo": "0.19.0",
989
+ "versionInfo": "0.20.0",
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.19.0"
1000
+ "referenceLocator": "pkg:npm/%40kici-dev/engine@0.20.0"
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.19.0",
1009
+ "versionInfo": "0.20.0",
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.19.0"
1020
+ "referenceLocator": "pkg:npm/%40kici-dev/orchestrator@0.20.0"
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.19.0",
1027
+ "SPDXID": "SPDXRef-Package--kici-dev-shared-0.20.0",
1028
1028
  "name": "@kici-dev/shared",
1029
- "versionInfo": "0.19.0",
1029
+ "versionInfo": "0.20.0",
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.19.0"
1040
+ "referenceLocator": "pkg:npm/%40kici-dev/shared@0.20.0"
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.19.0",
7679
+ "spdxElementId": "SPDXRef-Package--kici-dev-core-0.20.0",
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.19.0",
7684
+ "spdxElementId": "SPDXRef-Package--kici-dev-core-0.20.0",
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.19.0",
7689
+ "spdxElementId": "SPDXRef-Package--kici-dev-core-0.20.0",
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.19.0",
7694
+ "spdxElementId": "SPDXRef-Package--kici-dev-core-0.20.0",
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.19.0",
7699
+ "spdxElementId": "SPDXRef-Package--kici-dev-core-0.20.0",
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.19.0",
7704
+ "spdxElementId": "SPDXRef-Package--kici-dev-core-0.20.0",
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.19.0",
7709
+ "spdxElementId": "SPDXRef-Package--kici-dev-engine-0.20.0",
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.19.0",
7714
+ "spdxElementId": "SPDXRef-Package--kici-dev-engine-0.20.0",
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.19.0",
7719
+ "spdxElementId": "SPDXRef-Package--kici-dev-engine-0.20.0",
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.19.0",
7724
+ "spdxElementId": "SPDXRef-Package--kici-dev-engine-0.20.0",
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.19.0",
7729
+ "spdxElementId": "SPDXRef-Package--kici-dev-engine-0.20.0",
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.19.0",
7734
+ "spdxElementId": "SPDXRef-Package--kici-dev-engine-0.20.0",
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.19.0",
7770
+ "relatedSpdxElement": "SPDXRef-Package--kici-dev-engine-0.20.0",
7771
7771
  "relationshipType": "DEPENDS_ON"
7772
7772
  },
7773
7773
  {
7774
7774
  "spdxElementId": "SPDXRef-RootPackage",
7775
- "relatedSpdxElement": "SPDXRef-Package--kici-dev-shared-0.19.0",
7775
+ "relatedSpdxElement": "SPDXRef-Package--kici-dev-shared-0.20.0",
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.19.0",
7884
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.20.0",
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.19.0",
7890
- "relatedSpdxElement": "SPDXRef-Package--kici-dev-core-0.19.0",
7889
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.20.0",
7890
+ "relatedSpdxElement": "SPDXRef-Package--kici-dev-core-0.20.0",
7891
7891
  "relationshipType": "DEPENDS_ON"
7892
7892
  },
7893
7893
  {
7894
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.19.0",
7895
- "relatedSpdxElement": "SPDXRef-Package--kici-dev-engine-0.19.0",
7894
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.20.0",
7895
+ "relatedSpdxElement": "SPDXRef-Package--kici-dev-engine-0.20.0",
7896
7896
  "relationshipType": "DEPENDS_ON"
7897
7897
  },
7898
7898
  {
7899
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.19.0",
7899
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.20.0",
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.19.0",
7904
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.20.0",
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.19.0",
7909
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.20.0",
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.19.0",
7914
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.20.0",
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.19.0",
7919
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.20.0",
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.19.0",
7924
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.20.0",
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.19.0",
7929
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.20.0",
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.19.0",
7934
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.20.0",
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.19.0",
7939
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.20.0",
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.19.0",
7944
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.20.0",
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.19.0",
7949
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.20.0",
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.19.0",
7954
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.20.0",
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.19.0",
7959
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.20.0",
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.19.0",
7964
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.20.0",
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.19.0",
7969
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.20.0",
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.19.0",
7974
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.20.0",
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.19.0",
7979
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.20.0",
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.19.0",
7984
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.20.0",
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.19.0",
7989
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.20.0",
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.19.0",
7994
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.20.0",
7995
7995
  "relatedSpdxElement": "SPDXRef-Package-zx-8.8.5",
7996
7996
  "relationshipType": "DEPENDS_ON"
7997
7997
  },