@kici-dev/orchestrator 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -7,10 +7,10 @@ import * as fs$1 from "node:fs";
7
7
  import fs, { chmodSync, closeSync, constants, createReadStream, createWriteStream, existsSync, mkdirSync, mkdtempSync, openSync, promises, readFileSync, realpathSync, rmSync, statSync, unwatchFile, watchFile, writeFileSync } from "node:fs";
8
8
  import { Command, Option } from "commander";
9
9
  import { AgentPlatform, BaseColdStore, ChunkLru, addLogsToArchive, chunkObjectKey, clearDispatchQueueDirect, computeChunkId, computeMigrationsHash, createContextTemplateDirect, createDb, createDbRole, createLogger, createPool, createReadOnlyDbUser, createS3Client, decodeChunk, decrypt, deleteContextDirect, deriveKey, diagnoseExitCode, dropAndCreateDatabase, emitKiciEventDirect, encodeKeySegment, encrypt, ensureDatabase, formatBytes, formatUptime, isSchemaCurrent, kiciMkdtemp, listCheckRunTrackingDirect, listContextsDirect, listExecutionRunsDirect, listQueueDirect, listRegistrationsDirect, maskDatabaseUrl, parseDatabaseUrl, parseManifest, prunePeerCredentialsDirect, purgeContextsDirect, purgeScopedSecretsDirect, purgeSecretBackendsDirect, purgeStaleExecutionDirect, purgeStaleSourcesDirect, registerWorkflowManualDirect, resetRaftStateDirect, seedContextBindingDirect, seedContextDirect, setContextPolicyDirect, setContextSecretDirect, sha256, showContextDirect, showExecutionRunDirect, showQueueEntryDirect, showRegistrationDirect, splitAgentPlatform, storeMigrationContentHash, tablePrefix, toErrorMessage } from "@kici-dev/shared";
10
+ import { AccessLogSource, DEFAULT_APPROVAL_EXPIRY_HOURS, ExecutionJobStatus, KICI_AGENT_ENV_PREFIX, KNOWN_ROLES, OrchestratorMode, PLATFORM_CONNECTED_MODES, PRIVILEGED_ROOT_LABEL, ScalerBackendType, ScalerEventType, TERMINAL_JOB_STATES, TERMINAL_RUN_STATES, WS_MAX_PAYLOAD_BYTES, accessLogWarmSqlCase, agentLabelOf, assertValidSecretKey, attestationVerifyStatusSchema, flattenActor, getAccessLogColdDays, getSecretAuditLogColdDays, matcherSatisfiedBy, minAccessLogWarmDays, minSecretAuditLogWarmDays, parseHostPropertyAssignments, scalerAgentLabels, scalerPlatformSchema, secretAuditLogWarmSqlCase, shouldRecordAccess, shouldRecordSecretResolve } from "@kici-dev/engine";
10
11
  import crypto$1, { createDecipheriv, createHash, createHmac, createPublicKey, generateKeyPairSync, hkdfSync, randomBytes, randomUUID } from "node:crypto";
11
12
  import { createInterface } from "node:readline";
12
13
  import { sql } from "kysely";
13
- import { AccessLogSource, DEFAULT_APPROVAL_EXPIRY_HOURS, ExecutionJobStatus, KICI_AGENT_ENV_PREFIX, KNOWN_ROLES, OrchestratorMode, PLATFORM_CONNECTED_MODES, PRIVILEGED_ROOT_LABEL, ScalerBackendType, ScalerEventType, TERMINAL_JOB_STATES, TERMINAL_RUN_STATES, WS_MAX_PAYLOAD_BYTES, accessLogWarmSqlCase, agentLabelOf, attestationVerifyStatusSchema, flattenActor, getAccessLogColdDays, getSecretAuditLogColdDays, matcherSatisfiedBy, minAccessLogWarmDays, minSecretAuditLogWarmDays, parseHostPropertyAssignments, scalerAgentLabels, scalerPlatformSchema, secretAuditLogWarmSqlCase, shouldRecordAccess, shouldRecordSecretResolve } from "@kici-dev/engine";
14
14
  import { access, chmod, constants as constants$1, copyFile, link, mkdir, open, readFile, readdir, rm, stat, writeFile } from "node:fs/promises";
15
15
  import { parse, stringify } from "yaml";
16
16
  import { z } from "zod";
@@ -783,17 +783,36 @@ var PgSecretStore = class PgSecretStore {
783
783
  }
784
784
  return result;
785
785
  }
786
- /**
787
- * Set (create or update) a secret in a scope.
788
- * Encrypts the value with AAD = "orgId:scope:key".
789
- */
790
786
  /** Check if a scope is internal/operational (always allowed regardless of toggle). */
791
787
  isInternalScope(scope) {
792
788
  const colonIdx = scope.indexOf(":");
793
789
  const path = colonIdx >= 0 ? scope.slice(colonIdx + 1) : scope;
794
790
  return path.startsWith("__source__/") || path.startsWith("__webhook__/");
795
791
  }
792
+ /**
793
+ * Set (create or update) a secret in a scope.
794
+ * Encrypts the value with AAD = "orgId:scope:key".
795
+ *
796
+ * Rejects a key outside `[A-Za-z0-9._-]` before doing anything else. The AAD
797
+ * is a plain concatenation, so a `:` in the key would let two distinct
798
+ * locations render one AAD (scope 'b' + key 'c:d' equals scope 'b:c' + key
799
+ * 'd') and a ciphertext written at one would authenticate at the other. The
800
+ * check sits ahead of the customerSecretsEnabled gate so internal scopes get
801
+ * no exemption — the binding has to hold for every writer.
802
+ *
803
+ * Callers pass a bare scope path, so the AAD's middle field is colon-free
804
+ * too: the admin route and the dashboard handler both run the scope
805
+ * validator immediately before calling in, and `source-store` builds its
806
+ * scope from a uuid. That precondition is what makes the whole triple
807
+ * recoverable, and it is the caller's to keep — this method does not
808
+ * re-check it.
809
+ *
810
+ * Write-path only: getSecrets, listKeys, deleteSecret, deleteScope,
811
+ * renameScope, getAllSecrets and createScope stay unvalidated, which is what
812
+ * keeps a key stored before this rule readable and deletable.
813
+ */
796
814
  async setSecret(orgId, scope, key, value) {
815
+ assertValidSecretKey(key);
797
816
  if (!this.customerSecretsEnabled && !this.isInternalScope(scope)) throw new Error("PG customer secrets are disabled. Use an external secret backend or enable pgCustomerSecrets in config.");
798
817
  const aad = `${orgId}:${scope}:${key}`;
799
818
  const encrypted = encrypt(value, this.masterKey, this.keyVersion, aad);
@@ -1491,6 +1510,7 @@ function registerSecretCommands(program, getClient) {
1491
1510
  }
1492
1511
  const dbUrl = resolveDirectDbUrl$10(opts.databaseUrl);
1493
1512
  if (dbUrl) {
1513
+ assertValidSecretKey(key);
1494
1514
  await setContextSecretDirect(dbUrl, {
1495
1515
  orgId,
1496
1516
  context: scope,
@@ -10131,6 +10151,21 @@ function parseLocalConfig(s) {
10131
10151
  const parsed = LocalSourceConfigSchema.safeParse(raw);
10132
10152
  return parsed.success ? parsed.data : null;
10133
10153
  }
10154
+ /**
10155
+ * Read a local source's stored config over whichever transport the caller is
10156
+ * already on — direct DB when `--database-url` / KICI_DATABASE_URL is in play,
10157
+ * otherwise the admin API. Used to preserve `repoBasePath` when only the clone
10158
+ * base is being changed; returns null when the id names no local source.
10159
+ */
10160
+ async function readLocalSourceConfig(id, databaseUrl, getClient) {
10161
+ const dbUrl = resolveDirectDbUrl$9(databaseUrl);
10162
+ if (dbUrl) {
10163
+ const row = await withGenericManager(dbUrl, (mgr) => mgr.getById(id));
10164
+ return row ? parseLocalConfig(row) : null;
10165
+ }
10166
+ const { source } = await getClient().getGenericSource(id);
10167
+ return parseLocalConfig(source);
10168
+ }
10134
10169
  function safeParse(value) {
10135
10170
  try {
10136
10171
  return JSON.parse(value);
@@ -10676,17 +10711,26 @@ function registerSourceCommands(program, getClient) {
10676
10711
  try {
10677
10712
  const data = {};
10678
10713
  if (opts.name) data.name = opts.name;
10679
- if (opts.path !== void 0) {
10680
- if (!path.isAbsolute(opts.path)) {
10681
- console.error(`Error: --path must be an absolute path: ${opts.path}`);
10714
+ if (opts.path !== void 0 || opts.cloneUrlBase !== void 0) {
10715
+ let repoBasePath = opts.path;
10716
+ if (repoBasePath === void 0) {
10717
+ const existing = await readLocalSourceConfig(id, opts.databaseUrl, getClient);
10718
+ if (!existing) {
10719
+ console.error(`Error: no local source with id ${id}`);
10720
+ process.exit(1);
10721
+ }
10722
+ repoBasePath = existing.repoBasePath;
10723
+ }
10724
+ if (!path.isAbsolute(repoBasePath)) {
10725
+ console.error(`Error: --path must be an absolute path: ${repoBasePath}`);
10682
10726
  process.exit(1);
10683
10727
  }
10684
- const localConfig = { repoBasePath: opts.path };
10728
+ const localConfig = { repoBasePath };
10685
10729
  if (opts.cloneUrlBase) localConfig.cloneUrlBase = opts.cloneUrlBase;
10686
10730
  data.localConfig = localConfig;
10687
10731
  }
10688
10732
  if (Object.keys(data).length === 0) {
10689
- console.error("Error: no fields to update. Provide --path and/or --name.");
10733
+ console.error("Error: no fields to update. Provide --path, --name, and/or --clone-url-base.");
10690
10734
  process.exit(1);
10691
10735
  }
10692
10736
  const dbUrl = resolveDirectDbUrl$9(opts.databaseUrl);
@@ -18402,7 +18446,7 @@ async function refreshAgentPackages(storage, version, opts, deps) {
18402
18446
  const ALL_PLATFORMS = AgentPlatform.options;
18403
18447
  /** The orchestrator's own version (single-version invariant) = the packaged agent version. */
18404
18448
  function resolveKiciVersion() {
18405
- return "0.3.0";
18449
+ return "0.4.0";
18406
18450
  }
18407
18451
  /** Parse the --platform value: default set | single | CSV | `all`. */
18408
18452
  function parsePlatforms(raw) {
@@ -60,12 +60,30 @@ export declare class PgSecretStore implements SecretStore {
60
60
  * Get all secrets for a scope as decrypted key-value pairs.
61
61
  */
62
62
  getSecrets(orgId: string, scope: string): Promise<Record<string, string>>;
63
+ /** Check if a scope is internal/operational (always allowed regardless of toggle). */
64
+ private isInternalScope;
63
65
  /**
64
66
  * Set (create or update) a secret in a scope.
65
67
  * Encrypts the value with AAD = "orgId:scope:key".
68
+ *
69
+ * Rejects a key outside `[A-Za-z0-9._-]` before doing anything else. The AAD
70
+ * is a plain concatenation, so a `:` in the key would let two distinct
71
+ * locations render one AAD (scope 'b' + key 'c:d' equals scope 'b:c' + key
72
+ * 'd') and a ciphertext written at one would authenticate at the other. The
73
+ * check sits ahead of the customerSecretsEnabled gate so internal scopes get
74
+ * no exemption — the binding has to hold for every writer.
75
+ *
76
+ * Callers pass a bare scope path, so the AAD's middle field is colon-free
77
+ * too: the admin route and the dashboard handler both run the scope
78
+ * validator immediately before calling in, and `source-store` builds its
79
+ * scope from a uuid. That precondition is what makes the whole triple
80
+ * recoverable, and it is the caller's to keep — this method does not
81
+ * re-check it.
82
+ *
83
+ * Write-path only: getSecrets, listKeys, deleteSecret, deleteScope,
84
+ * renameScope, getAllSecrets and createScope stay unvalidated, which is what
85
+ * keeps a key stored before this rule readable and deletable.
66
86
  */
67
- /** Check if a scope is internal/operational (always allowed regardless of toggle). */
68
- private isInternalScope;
69
87
  setSecret(orgId: string, scope: string, key: string, value: string): Promise<void>;
70
88
  /**
71
89
  * Delete a secret from a scope.
package/dist/server.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import "node:module";
2
2
  import { AgentDeliveryMode, AgentPlatform, BaseColdStore, ChunkRequestWaiter, RingBuffer, addLogsToArchive, chunkBuffer, computeBackoffDelay, computeMigrationsHash, createDb, createHealthRoutes, createLogger, createMeter, createMetricsRoutes, createPool, createS3Client, decrypt, decryptJson, deriveKey, encodeKeySegment, encrypt, enrichRequestContext, formatDuration, getPrometheusExporter, getReconnectDelay, getRequestContext, guardStartup, initTelemetry, isPgUniqueViolation, logger, parseDatabaseUrl, redactConfig, requestContext, serializeError, setServiceName, setupGracefulShutdown, sha256, storeMigrationContentHash, toErrorMessage, validateRequiredTools } from "@kici-dev/shared";
3
- import { ALLOWED_SYSTEM_VARS, ARTIFACT_NAME_MAX_LENGTH, AccessLogAction, AccessLogOutcome, AccessLogSource, AccessLogTargetType, ActorType, AgentFailureCategory, ApprovalDecision, ArtifactCompleteAckOutcome, ArtifactDownloadOutcome, ArtifactUploadOutcome, AttestationOrigin, BREAKING_FLOOR, CANONICAL_STATUSES, CacheRefScope, CheckMode, CheckRunConclusion, CheckStepOutcome, ConcurrencyStrategy, ContextDeleteErrorCode, ContextGateRejectReason, DASHBOARD_REQUEST_TYPE_SET, DEFAULT_APPROVAL_EXPIRY_HOURS, DEFAULT_CONCURRENCY_STRATEGY, DEFAULT_HOLD_EXPIRY_SECONDS, DashboardResponseErrorCode, DeploymentContainerRuntimeSchema, DeploymentModeSchema, EVENT_LOG_PAYLOAD_CHUNK_BYTES, EventLogPayloadStreamError, EventLogSource, EventLogStatus, ExecutionJobStatus, ExecutionRunStatus, ExecutionStepStatus, FanoutCause, FanoutError, HeldRunQueueType, HoldScope, HoldType, INIT_LABEL, InitFailureCategory, InventorySelectorSchema, KICI_AGENT_ENV_PREFIX, KNOWN_ROLES, LabelMatcher, LockFileParseError, LogStream, MIN_PROTOCOL_VERSION, ORCH_AGENT_CAPABILITIES, ORCH_CAPABILITIES, OWN_INGRESS_MODES, OrchLogPhase, OrchRole, OrchestratorMode, PLATFORM_CONNECTED_MODES, PLATFORM_TAINT_LABELS, PLATFORM_TO_ORCH_RECOGNIZED_TYPES, PRIVILEGED_ROOT_LABEL, PROTOCOL_VERSION, PayloadOmittedReason, RELAY_INGRESS_MODES, RegisterableTriggerType, RunFailureClass, SCHEMA_VERSION, SECURITY_HOLD_JOB_IDS, SSH_TRANSPORT_CAPABILITY, ScalerBackendType, ScalerEventType, ScalerEventType as ScalerEventType$1, SourceOrigin, SourceSubtype, TERMINAL_JOB_STATES, TERMINAL_RUN_STATES, TimeoutReason, TriggerSource, VariantKind, WEBHOOK_RELAY_MAX_BODY_BYTES, WS_CLOSE_AGENT_AUTH_FAILED, WS_CLOSE_AUTH_TIMEOUT, WS_CLOSE_DISPATCH_ACK_TIMEOUT, WS_CLOSE_GOING_AWAY, WS_CLOSE_HEARTBEAT_TIMEOUT, WS_CLOSE_INVALID_MESSAGE, WS_CLOSE_PROTOCOL_ERROR, WS_CLOSE_UNAUTHORIZED, WS_MAX_PAYLOAD_BYTES, WebhookRelayResult, WsRateLimiter, accessLogWarmSqlCase, agentAuthRequestSchema, agentLabelOf, agentToOrchestratorMessageSchema, agentTypeLabel, approvalTimeoutSecondsSchema, artifactInvalidNameError, assertValidScopeName, attestationVerifyStatusSchema, buildTrustedPassthroughEnv, buildUnsupportedMessageNack, canonicalizeCapability, checkArtifactName, coerceDispatchInputs, collectDiscriminatorTypes, createWorkflowDecision, dashboardArtifactsListResponseSchema, dashboardAttestationGetResponseSchema, dashboardAttestationsListAllResponseSchema, dashboardAttestationsListResponseSchema, dashboardRunDetailApiResponseSchema, dashboardStepLogsApiResponseSchema, deriveOsArchLabels, derivePlatformTaints, fanoutEnvelopeFields, flattenActor, getAccessLogColdDays, getSecretAuditLogColdDays, githubIngressPath, githubWebhookPath, hasPlatformCapability, hostLabel, hostSatisfiesTarget, hostToScalerPlatform, installGateJobId, isFailureStatus, isKnownCapability, isLockDynamicJobFn, isLockInlineValue, isLockParallelStep, isLockStaticJob, isSelfReportedLabel, joinRequestSchema, logPullPlatformToOrchSchema, matchAllWorkflows, matchScopePattern, matchWorkflowsForEvent, matcherSatisfiedBy, materializeFanout, materializeResolvedHosts, materializeResolvedMatrix, matrixEnvelopeFields, mergeOrderedMaps, minAccessLogWarmDays, minSecretAuditLogWarmDays, normalizePersistedHoldType, partitionMatchers, peerAuthRequestSchema, peerFromPeerMessageSchema, peerHelloResponseSchema, peerHelloSchema, persistedHoldTypeSpellings, platformToOrchestratorMessageSchema, platformToOsArchLabels, platformToTaints, resolveRoleLabels, resolveScheduleInputs, resolveSecretsWithProvenance, scalerAgentLabels, scalerLabel, scalerPlatformSchema, scheduleTriggerKey, secretAuditLogWarmSqlCase, shouldRecordAccess, shouldRecordSecretResolve, stateReplaySchema, stringifyActor, trustedContributorHoldReason, unknownContributorHoldReason, validateScopeName, wrapUntrusted } from "@kici-dev/engine";
3
+ import { ALLOWED_SYSTEM_VARS, ARTIFACT_NAME_MAX_LENGTH, AccessLogAction, AccessLogOutcome, AccessLogSource, AccessLogTargetType, ActorType, AgentFailureCategory, ApprovalDecision, ArtifactCompleteAckOutcome, ArtifactDownloadOutcome, ArtifactUploadOutcome, AttestationOrigin, BREAKING_FLOOR, CANONICAL_STATUSES, CacheRefScope, CheckMode, CheckRunConclusion, CheckStepOutcome, ConcurrencyStrategy, ContextDeleteErrorCode, ContextGateRejectReason, DASHBOARD_REQUEST_TYPE_SET, DEFAULT_APPROVAL_EXPIRY_HOURS, DEFAULT_CONCURRENCY_STRATEGY, DEFAULT_HOLD_EXPIRY_SECONDS, DashboardResponseErrorCode, DeploymentContainerRuntimeSchema, DeploymentModeSchema, EVENT_LOG_PAYLOAD_CHUNK_BYTES, EventLogPayloadStreamError, EventLogSource, EventLogStatus, ExecutionJobStatus, ExecutionRunStatus, ExecutionStepStatus, FanoutCause, FanoutError, HeldRunQueueType, HoldScope, HoldType, INIT_LABEL, InitFailureCategory, InventorySelectorSchema, KICI_AGENT_ENV_PREFIX, KNOWN_ROLES, LabelMatcher, LockFileParseError, LogStream, MIN_PROTOCOL_VERSION, ORCH_AGENT_CAPABILITIES, ORCH_CAPABILITIES, OWN_INGRESS_MODES, OrchLogPhase, OrchRole, OrchestratorMode, PLATFORM_CONNECTED_MODES, PLATFORM_TAINT_LABELS, PLATFORM_TO_ORCH_RECOGNIZED_TYPES, PRIVILEGED_ROOT_LABEL, PROTOCOL_VERSION, PayloadOmittedReason, RELAY_INGRESS_MODES, RegisterableTriggerType, RunFailureClass, SCHEMA_VERSION, SECURITY_HOLD_JOB_IDS, SSH_TRANSPORT_CAPABILITY, ScalerBackendType, ScalerEventType, ScalerEventType as ScalerEventType$1, SourceOrigin, SourceSubtype, TERMINAL_JOB_STATES, TERMINAL_RUN_STATES, TimeoutReason, TriggerSource, VariantKind, WEBHOOK_RELAY_MAX_BODY_BYTES, WS_CLOSE_AGENT_AUTH_FAILED, WS_CLOSE_AUTH_TIMEOUT, WS_CLOSE_DISPATCH_ACK_TIMEOUT, WS_CLOSE_GOING_AWAY, WS_CLOSE_HEARTBEAT_TIMEOUT, WS_CLOSE_INVALID_MESSAGE, WS_CLOSE_PROTOCOL_ERROR, WS_CLOSE_UNAUTHORIZED, WS_MAX_PAYLOAD_BYTES, WebhookRelayResult, WsRateLimiter, accessLogWarmSqlCase, agentAuthRequestSchema, agentLabelOf, agentToOrchestratorMessageSchema, agentTypeLabel, approvalTimeoutSecondsSchema, artifactInvalidNameError, assertValidScopeName, assertValidSecretKey, attestationVerifyStatusSchema, buildTrustedPassthroughEnv, buildUnsupportedMessageNack, canonicalizeCapability, checkArtifactName, coerceDispatchInputs, collectDiscriminatorTypes, createWorkflowDecision, dashboardArtifactsListResponseSchema, dashboardAttestationGetResponseSchema, dashboardAttestationsListAllResponseSchema, dashboardAttestationsListResponseSchema, dashboardRunDetailApiResponseSchema, dashboardStepLogsApiResponseSchema, deriveOsArchLabels, derivePlatformTaints, fanoutEnvelopeFields, flattenActor, getAccessLogColdDays, getSecretAuditLogColdDays, githubIngressPath, githubWebhookPath, hasPlatformCapability, hostLabel, hostSatisfiesTarget, hostToScalerPlatform, installGateJobId, isFailureStatus, isKnownCapability, isLockDynamicJobFn, isLockInlineValue, isLockParallelStep, isLockStaticJob, isSelfReportedLabel, joinRequestSchema, logPullPlatformToOrchSchema, matchAllWorkflows, matchScopePattern, matchWorkflowsForEvent, matcherSatisfiedBy, materializeFanout, materializeResolvedHosts, materializeResolvedMatrix, matrixEnvelopeFields, mergeOrderedMaps, minAccessLogWarmDays, minSecretAuditLogWarmDays, normalizePersistedHoldType, partitionMatchers, peerAuthRequestSchema, peerFromPeerMessageSchema, peerHelloResponseSchema, peerHelloSchema, persistedHoldTypeSpellings, platformToOrchestratorMessageSchema, platformToOsArchLabels, platformToTaints, resolveRoleLabels, resolveScheduleInputs, resolveSecretsWithProvenance, scalerAgentLabels, scalerLabel, scalerPlatformSchema, scheduleTriggerKey, secretAuditLogWarmSqlCase, shouldRecordAccess, shouldRecordSecretResolve, stateReplaySchema, stringifyActor, trustedContributorHoldReason, unknownContributorHoldReason, validateScopeName, validateSecretKey, wrapUntrusted } from "@kici-dev/engine";
4
4
  import { X509Certificate, createCipheriv, createDecipheriv, createHash, createHmac, createPrivateKey, createPublicKey, diffieHellman, generateKeyPairSync, hkdfSync, randomBytes, randomUUID, timingSafeEqual } from "node:crypto";
5
5
  import * as fs$1 from "node:fs";
6
6
  import { chmodSync, closeSync, createReadStream, createWriteStream, fsyncSync, mkdirSync, mkdtempSync, openSync, promises, readFileSync, renameSync, rmSync, statSync, unwatchFile, watchFile, writeFileSync, writeSync } from "node:fs";
@@ -19137,17 +19137,36 @@ var init_pg_secret_store = __esmMin((() => {
19137
19137
  }
19138
19138
  return result;
19139
19139
  }
19140
- /**
19141
- * Set (create or update) a secret in a scope.
19142
- * Encrypts the value with AAD = "orgId:scope:key".
19143
- */
19144
19140
  /** Check if a scope is internal/operational (always allowed regardless of toggle). */
19145
19141
  isInternalScope(scope) {
19146
19142
  const colonIdx = scope.indexOf(":");
19147
19143
  const path = colonIdx >= 0 ? scope.slice(colonIdx + 1) : scope;
19148
19144
  return path.startsWith("__source__/") || path.startsWith("__webhook__/");
19149
19145
  }
19146
+ /**
19147
+ * Set (create or update) a secret in a scope.
19148
+ * Encrypts the value with AAD = "orgId:scope:key".
19149
+ *
19150
+ * Rejects a key outside `[A-Za-z0-9._-]` before doing anything else. The AAD
19151
+ * is a plain concatenation, so a `:` in the key would let two distinct
19152
+ * locations render one AAD (scope 'b' + key 'c:d' equals scope 'b:c' + key
19153
+ * 'd') and a ciphertext written at one would authenticate at the other. The
19154
+ * check sits ahead of the customerSecretsEnabled gate so internal scopes get
19155
+ * no exemption — the binding has to hold for every writer.
19156
+ *
19157
+ * Callers pass a bare scope path, so the AAD's middle field is colon-free
19158
+ * too: the admin route and the dashboard handler both run the scope
19159
+ * validator immediately before calling in, and `source-store` builds its
19160
+ * scope from a uuid. That precondition is what makes the whole triple
19161
+ * recoverable, and it is the caller's to keep — this method does not
19162
+ * re-check it.
19163
+ *
19164
+ * Write-path only: getSecrets, listKeys, deleteSecret, deleteScope,
19165
+ * renameScope, getAllSecrets and createScope stay unvalidated, which is what
19166
+ * keeps a key stored before this rule readable and deletable.
19167
+ */
19150
19168
  async setSecret(orgId, scope, key, value) {
19169
+ assertValidSecretKey(key);
19151
19170
  if (!this.customerSecretsEnabled && !this.isInternalScope(scope)) throw new Error("PG customer secrets are disabled. Use an external secret backend or enable pgCustomerSecrets in config.");
19152
19171
  const aad = `${orgId}:${scope}:${key}`;
19153
19172
  const encrypted = encrypt(value, this.masterKey, this.keyVersion, aad);
@@ -29773,6 +29792,8 @@ function createAdminRoutes(deps) {
29773
29792
  const resolved = await routeScope(scope);
29774
29793
  const scopeError = validateScopeName(resolved.path);
29775
29794
  if (scopeError) return c.json({ error: scopeError }, 400);
29795
+ const keyError = validateSecretKey(key);
29796
+ if (keyError) return c.json({ error: keyError }, 400);
29776
29797
  await resolved.store.setSecret(orgId, resolved.path, key, parsed.value);
29777
29798
  await deps.auditLogger.log({
29778
29799
  action: "setSecret",
@@ -34396,15 +34417,15 @@ var init_admin_config = __esmMin((() => {
34396
34417
  function createHealthRoutes$1(deps = {}) {
34397
34418
  return createHealthRoutes({
34398
34419
  livenessInfo: () => ({
34399
- version: "0.3.0",
34400
- buildDate: "2026-08-09T00:52:55.102Z",
34401
- buildCommit: "2e7dec998",
34402
- sdkVersion: "0.3.0",
34420
+ version: "0.4.0",
34421
+ buildDate: "2026-08-09T15:20:50.779Z",
34422
+ buildCommit: "ffd489464",
34423
+ sdkVersion: "0.4.0",
34403
34424
  sdkBundleHash: "fcd0a836aa1cb92debd93e0254450614d123b3748511aa4148d956fd72a7c29f",
34404
- sharedVersion: "0.3.0",
34425
+ sharedVersion: "0.4.0",
34405
34426
  sharedBundleHash: "f16fa528a8a9ef1bed8df369f0e88efafca8a9954a749005299fdbcdb93fa188",
34406
- engineVersion: "0.3.0",
34407
- engineBundleHash: "c579e54f7d0b0d5b16587a0528a3e66d32f63e2434bb471a93a01366296efd58"
34427
+ engineVersion: "0.4.0",
34428
+ engineBundleHash: "31e2d5c327284e1cac908d7f85cf6d878bbf87ea0da93ed09c6205ada6935f89"
34408
34429
  }),
34409
34430
  readinessCheck: deps.db ? async () => {
34410
34431
  const checks = {};
@@ -34439,7 +34460,7 @@ function createCapabilitiesRoutes() {
34439
34460
  const app = new Hono();
34440
34461
  app.get("/api/v1/capabilities", (c) => {
34441
34462
  const manifest = {
34442
- orchestratorVersion: "0.3.0",
34463
+ orchestratorVersion: "0.4.0",
34443
34464
  protocolVersion: PROTOCOL_VERSION,
34444
34465
  minProtocolVersion: MIN_PROTOCOL_VERSION
34445
34466
  };
@@ -37058,7 +37079,7 @@ var init_app = __esmMin((() => {
37058
37079
  init_log_chunk_sink();
37059
37080
  init_agent_metrics_aggregator();
37060
37081
  logger$57 = createLogger({ prefix: "app" });
37061
- ORCHESTRATOR_VERSION$2 = "0.3.0";
37082
+ ORCHESTRATOR_VERSION$2 = "0.4.0";
37062
37083
  SourceLocationStore = class {
37063
37084
  cache = /* @__PURE__ */ new Map();
37064
37085
  key(workflowName, jobName) {
@@ -46250,7 +46271,7 @@ var logger$44, SOFTWARE_VERSION$1, PeerClient$1;
46250
46271
  var init_peer_client = __esmMin((() => {
46251
46272
  init_peer_crypto();
46252
46273
  logger$44 = createLogger({ prefix: "peer-client" });
46253
- SOFTWARE_VERSION$1 = "0.3.0";
46274
+ SOFTWARE_VERSION$1 = "0.4.0";
46254
46275
  PeerClient$1 = class {
46255
46276
  ws = null;
46256
46277
  _state = "disconnected";
@@ -48213,7 +48234,7 @@ var init_peer_handler = __esmMin((() => {
48213
48234
  init_peer_crypto();
48214
48235
  init_join_token();
48215
48236
  logger$42 = createLogger({ prefix: "peer-handler" });
48216
- SOFTWARE_VERSION = "0.3.0";
48237
+ SOFTWARE_VERSION = "0.4.0";
48217
48238
  RATE_LIMIT_MAX = 5;
48218
48239
  RATE_LIMIT_WINDOW_MS = 6e4;
48219
48240
  }));
@@ -70553,6 +70574,7 @@ var init_dashboard_context_handler = __esmMin((() => {
70553
70574
  try {
70554
70575
  const { store, scope } = await this.resolveStoreForScope(msg.scope);
70555
70576
  assertValidScopeName(scope);
70577
+ assertValidSecretKey(msg.key);
70556
70578
  await store.setSecret(this.deps.orgId, scope, msg.key, resolved.plaintext);
70557
70579
  this.recordAccess(msg.actor, "secret.set", {
70558
70580
  type: "secret_scope",
@@ -75590,14 +75612,14 @@ var init_worker_core = __esmMin((() => {
75590
75612
  init_peer_outbox();
75591
75613
  init_worker_outbox_relay();
75592
75614
  init_app_on_error();
75593
- ORCHESTRATOR_VERSION$1 = "0.3.0";
75594
- WORKER_BUILD_COMMIT = "2e7dec998";
75595
- WORKER_SDK_VERSION = "0.3.0";
75615
+ ORCHESTRATOR_VERSION$1 = "0.4.0";
75616
+ WORKER_BUILD_COMMIT = "ffd489464";
75617
+ WORKER_SDK_VERSION = "0.4.0";
75596
75618
  WORKER_SDK_BUNDLE_HASH = "fcd0a836aa1cb92debd93e0254450614d123b3748511aa4148d956fd72a7c29f";
75597
- WORKER_SHARED_VERSION = "0.3.0";
75619
+ WORKER_SHARED_VERSION = "0.4.0";
75598
75620
  WORKER_SHARED_BUNDLE_HASH = "f16fa528a8a9ef1bed8df369f0e88efafca8a9954a749005299fdbcdb93fa188";
75599
- WORKER_ENGINE_VERSION = "0.3.0";
75600
- WORKER_ENGINE_BUNDLE_HASH = "c579e54f7d0b0d5b16587a0528a3e66d32f63e2434bb471a93a01366296efd58";
75621
+ WORKER_ENGINE_VERSION = "0.4.0";
75622
+ WORKER_ENGINE_BUNDLE_HASH = "31e2d5c327284e1cac908d7f85cf6d878bbf87ea0da93ed09c6205ada6935f89";
75601
75623
  logger$2 = createLogger({ prefix: "worker" });
75602
75624
  DRAIN_TIMEOUT_MS = 3e5;
75603
75625
  }));
@@ -75621,14 +75643,14 @@ var init_worker_core = __esmMin((() => {
75621
75643
  init_verify_inbound();
75622
75644
  init_ingest_overflow_types();
75623
75645
  init_scope_routing();
75624
- const ORCHESTRATOR_VERSION = "0.3.0";
75625
- const BUILD_COMMIT = "2e7dec998";
75626
- const SDK_VERSION = "0.3.0";
75646
+ const ORCHESTRATOR_VERSION = "0.4.0";
75647
+ const BUILD_COMMIT = "ffd489464";
75648
+ const SDK_VERSION = "0.4.0";
75627
75649
  const SDK_BUNDLE_HASH = "fcd0a836aa1cb92debd93e0254450614d123b3748511aa4148d956fd72a7c29f";
75628
- const SHARED_VERSION = "0.3.0";
75650
+ const SHARED_VERSION = "0.4.0";
75629
75651
  const SHARED_BUNDLE_HASH = "f16fa528a8a9ef1bed8df369f0e88efafca8a9954a749005299fdbcdb93fa188";
75630
- const ENGINE_VERSION = "0.3.0";
75631
- const ENGINE_BUNDLE_HASH = "c579e54f7d0b0d5b16587a0528a3e66d32f63e2434bb471a93a01366296efd58";
75652
+ const ENGINE_VERSION = "0.4.0";
75653
+ const ENGINE_BUNDLE_HASH = "31e2d5c327284e1cac908d7f85cf6d878bbf87ea0da93ed09c6205ada6935f89";
75632
75654
  const otelSdk = initTelemetry({
75633
75655
  serviceName: "kici-orchestrator",
75634
75656
  otlpEndpoint: process.env.OTEL_EXPORTER_OTLP_ENDPOINT
@@ -1,6 +1,6 @@
1
1
  import "node:module";
2
2
  import { AgentDeliveryMode, AgentPlatform, BaseColdStore, ChunkRequestWaiter, addLogsToArchive, chunkBuffer, computeBackoffDelay, computeMigrationsHash, createDb, createHealthRoutes, createLogger, createMeter, createMetricsRoutes, createPool, createS3Client, decrypt, deriveKey, encodeKeySegment, encrypt, enrichRequestContext, formatDuration, getPrometheusExporter, getReconnectDelay, getRequestContext, guardStartup, initTelemetry, isPgUniqueViolation, logger, parseDatabaseUrl, redactConfig, requestContext, serializeError, setServiceName, setupGracefulShutdown, sha256, storeMigrationContentHash, toErrorMessage, validateRequiredTools } from "@kici-dev/shared";
3
- import { ALLOWED_SYSTEM_VARS, ARTIFACT_NAME_MAX_LENGTH, AccessLogAction, AccessLogOutcome, AccessLogSource, AccessLogTargetType, ActorType, AgentFailureCategory, ArtifactCompleteAckOutcome, ArtifactDownloadOutcome, ArtifactUploadOutcome, AttestationOrigin, BREAKING_FLOOR, CANONICAL_STATUSES, CacheRefScope, CheckMode, CheckRunConclusion, CheckStepOutcome, ConcurrencyStrategy, ContextDeleteErrorCode, ContextGateRejectReason, DEFAULT_APPROVAL_EXPIRY_HOURS, DEFAULT_CONCURRENCY_STRATEGY, DEFAULT_HOLD_EXPIRY_SECONDS, EventLogSource, EventLogStatus, ExecutionJobStatus, ExecutionRunStatus, ExecutionStepStatus, FanoutCause, FanoutError, HoldScope, HoldType, INIT_LABEL, InitFailureCategory, InventorySelectorSchema, KICI_AGENT_ENV_PREFIX, KNOWN_ROLES, LabelMatcher, LockFileParseError, LogStream, MIN_PROTOCOL_VERSION, ORCH_AGENT_CAPABILITIES, OWN_INGRESS_MODES, OrchLogPhase, OrchestratorMode, PLATFORM_CONNECTED_MODES, PLATFORM_TAINT_LABELS, PRIVILEGED_ROOT_LABEL, PROTOCOL_VERSION, PayloadOmittedReason, RegisterableTriggerType, RunFailureClass, SCHEMA_VERSION, SECURITY_HOLD_JOB_IDS, SSH_TRANSPORT_CAPABILITY, ScalerBackendType, ScalerEventType, ScalerEventType as ScalerEventType$1, SourceOrigin, SourceSubtype, TERMINAL_JOB_STATES, TERMINAL_RUN_STATES, TimeoutReason, TriggerSource, VariantKind, WS_CLOSE_AGENT_AUTH_FAILED, WS_CLOSE_AUTH_TIMEOUT, WS_CLOSE_DISPATCH_ACK_TIMEOUT, WS_CLOSE_GOING_AWAY, WS_CLOSE_HEARTBEAT_TIMEOUT, WS_CLOSE_INVALID_MESSAGE, WS_CLOSE_PROTOCOL_ERROR, WS_CLOSE_UNAUTHORIZED, WS_MAX_PAYLOAD_BYTES, WebhookRelayResult, WsRateLimiter, accessLogWarmSqlCase, agentAuthRequestSchema, agentLabelOf, agentToOrchestratorMessageSchema, agentTypeLabel, approvalTimeoutSecondsSchema, artifactInvalidNameError, attestationVerifyStatusSchema, buildTrustedPassthroughEnv, canonicalizeCapability, checkArtifactName, deriveOsArchLabels, derivePlatformTaints, fanoutEnvelopeFields, flattenActor, getAccessLogColdDays, getSecretAuditLogColdDays, githubIngressPath, hostLabel, hostSatisfiesTarget, hostToScalerPlatform, installGateJobId, isFailureStatus, isKnownCapability, isLockDynamicJobFn, isLockInlineValue, isLockParallelStep, isLockStaticJob, isSelfReportedLabel, matchAllWorkflows, matchScopePattern, matchWorkflowsForEvent, matcherSatisfiedBy, materializeFanout, materializeResolvedHosts, materializeResolvedMatrix, matrixEnvelopeFields, mergeOrderedMaps, minAccessLogWarmDays, minSecretAuditLogWarmDays, partitionMatchers, peerAuthRequestSchema, peerFromPeerMessageSchema, peerHelloResponseSchema, peerHelloSchema, platformToOsArchLabels, platformToTaints, resolveRoleLabels, resolveScheduleInputs, resolveSecretsWithProvenance, scalerAgentLabels, scalerLabel, scalerPlatformSchema, scheduleTriggerKey, secretAuditLogWarmSqlCase, shouldRecordAccess, shouldRecordSecretResolve, trustedContributorHoldReason, unknownContributorHoldReason, validateScopeName, wrapUntrusted } from "@kici-dev/engine";
3
+ import { ALLOWED_SYSTEM_VARS, ARTIFACT_NAME_MAX_LENGTH, AccessLogAction, AccessLogOutcome, AccessLogSource, AccessLogTargetType, ActorType, AgentFailureCategory, ArtifactCompleteAckOutcome, ArtifactDownloadOutcome, ArtifactUploadOutcome, AttestationOrigin, BREAKING_FLOOR, CANONICAL_STATUSES, CacheRefScope, CheckMode, CheckRunConclusion, CheckStepOutcome, ConcurrencyStrategy, ContextDeleteErrorCode, ContextGateRejectReason, DEFAULT_APPROVAL_EXPIRY_HOURS, DEFAULT_CONCURRENCY_STRATEGY, DEFAULT_HOLD_EXPIRY_SECONDS, EventLogSource, EventLogStatus, ExecutionJobStatus, ExecutionRunStatus, ExecutionStepStatus, FanoutCause, FanoutError, HoldScope, HoldType, INIT_LABEL, InitFailureCategory, InventorySelectorSchema, KICI_AGENT_ENV_PREFIX, KNOWN_ROLES, LabelMatcher, LockFileParseError, LogStream, MIN_PROTOCOL_VERSION, ORCH_AGENT_CAPABILITIES, OWN_INGRESS_MODES, OrchLogPhase, OrchestratorMode, PLATFORM_CONNECTED_MODES, PLATFORM_TAINT_LABELS, PRIVILEGED_ROOT_LABEL, PROTOCOL_VERSION, PayloadOmittedReason, RegisterableTriggerType, RunFailureClass, SCHEMA_VERSION, SECURITY_HOLD_JOB_IDS, SSH_TRANSPORT_CAPABILITY, ScalerBackendType, ScalerEventType, ScalerEventType as ScalerEventType$1, SourceOrigin, SourceSubtype, TERMINAL_JOB_STATES, TERMINAL_RUN_STATES, TimeoutReason, TriggerSource, VariantKind, WS_CLOSE_AGENT_AUTH_FAILED, WS_CLOSE_AUTH_TIMEOUT, WS_CLOSE_DISPATCH_ACK_TIMEOUT, WS_CLOSE_GOING_AWAY, WS_CLOSE_HEARTBEAT_TIMEOUT, WS_CLOSE_INVALID_MESSAGE, WS_CLOSE_PROTOCOL_ERROR, WS_CLOSE_UNAUTHORIZED, WS_MAX_PAYLOAD_BYTES, WebhookRelayResult, WsRateLimiter, accessLogWarmSqlCase, agentAuthRequestSchema, agentLabelOf, agentToOrchestratorMessageSchema, agentTypeLabel, approvalTimeoutSecondsSchema, artifactInvalidNameError, assertValidSecretKey, attestationVerifyStatusSchema, buildTrustedPassthroughEnv, canonicalizeCapability, checkArtifactName, deriveOsArchLabels, derivePlatformTaints, fanoutEnvelopeFields, flattenActor, getAccessLogColdDays, getSecretAuditLogColdDays, githubIngressPath, hostLabel, hostSatisfiesTarget, hostToScalerPlatform, installGateJobId, isFailureStatus, isKnownCapability, isLockDynamicJobFn, isLockInlineValue, isLockParallelStep, isLockStaticJob, isSelfReportedLabel, matchAllWorkflows, matchScopePattern, matchWorkflowsForEvent, matcherSatisfiedBy, materializeFanout, materializeResolvedHosts, materializeResolvedMatrix, matrixEnvelopeFields, mergeOrderedMaps, minAccessLogWarmDays, minSecretAuditLogWarmDays, partitionMatchers, peerAuthRequestSchema, peerFromPeerMessageSchema, peerHelloResponseSchema, peerHelloSchema, platformToOsArchLabels, platformToTaints, resolveRoleLabels, resolveScheduleInputs, resolveSecretsWithProvenance, scalerAgentLabels, scalerLabel, scalerPlatformSchema, scheduleTriggerKey, secretAuditLogWarmSqlCase, shouldRecordAccess, shouldRecordSecretResolve, trustedContributorHoldReason, unknownContributorHoldReason, validateScopeName, validateSecretKey, wrapUntrusted } from "@kici-dev/engine";
4
4
  import * as os$1 from "node:os";
5
5
  import os, { cpus, freemem, homedir, hostname, release, tmpdir, totalmem, uptime, userInfo } from "node:os";
6
6
  import { X509Certificate, createCipheriv, createDecipheriv, createHash, createHmac, createPrivateKey, createPublicKey, diffieHellman, generateKeyPairSync, hkdfSync, randomBytes, randomUUID, timingSafeEqual } from "node:crypto";
@@ -1269,7 +1269,7 @@ var logger$113, SOFTWARE_VERSION$1, PeerClient$1;
1269
1269
  var init_peer_client = __esmMin((() => {
1270
1270
  init_peer_crypto();
1271
1271
  logger$113 = createLogger({ prefix: "peer-client" });
1272
- SOFTWARE_VERSION$1 = "0.3.0";
1272
+ SOFTWARE_VERSION$1 = "0.4.0";
1273
1273
  PeerClient$1 = class {
1274
1274
  ws = null;
1275
1275
  _state = "disconnected";
@@ -3232,7 +3232,7 @@ var init_peer_handler = __esmMin((() => {
3232
3232
  init_peer_crypto();
3233
3233
  init_join_token();
3234
3234
  logger$111 = createLogger({ prefix: "peer-handler" });
3235
- SOFTWARE_VERSION = "0.3.0";
3235
+ SOFTWARE_VERSION = "0.4.0";
3236
3236
  RATE_LIMIT_MAX = 5;
3237
3237
  RATE_LIMIT_WINDOW_MS = 6e4;
3238
3238
  }));
@@ -30004,17 +30004,36 @@ var init_pg_secret_store = __esmMin((() => {
30004
30004
  }
30005
30005
  return result;
30006
30006
  }
30007
- /**
30008
- * Set (create or update) a secret in a scope.
30009
- * Encrypts the value with AAD = "orgId:scope:key".
30010
- */
30011
30007
  /** Check if a scope is internal/operational (always allowed regardless of toggle). */
30012
30008
  isInternalScope(scope) {
30013
30009
  const colonIdx = scope.indexOf(":");
30014
30010
  const path = colonIdx >= 0 ? scope.slice(colonIdx + 1) : scope;
30015
30011
  return path.startsWith("__source__/") || path.startsWith("__webhook__/");
30016
30012
  }
30013
+ /**
30014
+ * Set (create or update) a secret in a scope.
30015
+ * Encrypts the value with AAD = "orgId:scope:key".
30016
+ *
30017
+ * Rejects a key outside `[A-Za-z0-9._-]` before doing anything else. The AAD
30018
+ * is a plain concatenation, so a `:` in the key would let two distinct
30019
+ * locations render one AAD (scope 'b' + key 'c:d' equals scope 'b:c' + key
30020
+ * 'd') and a ciphertext written at one would authenticate at the other. The
30021
+ * check sits ahead of the customerSecretsEnabled gate so internal scopes get
30022
+ * no exemption — the binding has to hold for every writer.
30023
+ *
30024
+ * Callers pass a bare scope path, so the AAD's middle field is colon-free
30025
+ * too: the admin route and the dashboard handler both run the scope
30026
+ * validator immediately before calling in, and `source-store` builds its
30027
+ * scope from a uuid. That precondition is what makes the whole triple
30028
+ * recoverable, and it is the caller's to keep — this method does not
30029
+ * re-check it.
30030
+ *
30031
+ * Write-path only: getSecrets, listKeys, deleteSecret, deleteScope,
30032
+ * renameScope, getAllSecrets and createScope stay unvalidated, which is what
30033
+ * keeps a key stored before this rule readable and deletable.
30034
+ */
30017
30035
  async setSecret(orgId, scope, key, value) {
30036
+ assertValidSecretKey(key);
30018
30037
  if (!this.customerSecretsEnabled && !this.isInternalScope(scope)) throw new Error("PG customer secrets are disabled. Use an external secret backend or enable pgCustomerSecrets in config.");
30019
30038
  const aad = `${orgId}:${scope}:${key}`;
30020
30039
  const encrypted = encrypt(value, this.masterKey, this.keyVersion, aad);
@@ -40190,6 +40209,8 @@ function createAdminRoutes(deps) {
40190
40209
  const resolved = await routeScope(scope);
40191
40210
  const scopeError = validateScopeName(resolved.path);
40192
40211
  if (scopeError) return c.json({ error: scopeError }, 400);
40212
+ const keyError = validateSecretKey(key);
40213
+ if (keyError) return c.json({ error: keyError }, 400);
40193
40214
  await resolved.store.setSecret(orgId, resolved.path, key, parsed.value);
40194
40215
  await deps.auditLogger.log({
40195
40216
  action: "setSecret",
@@ -44813,15 +44834,15 @@ var init_admin_config = __esmMin((() => {
44813
44834
  function createHealthRoutes$1(deps = {}) {
44814
44835
  return createHealthRoutes({
44815
44836
  livenessInfo: () => ({
44816
- version: "0.3.0",
44817
- buildDate: "2026-08-09T00:52:55.102Z",
44818
- buildCommit: "2e7dec998",
44819
- sdkVersion: "0.3.0",
44837
+ version: "0.4.0",
44838
+ buildDate: "2026-08-09T15:20:50.779Z",
44839
+ buildCommit: "ffd489464",
44840
+ sdkVersion: "0.4.0",
44820
44841
  sdkBundleHash: "fcd0a836aa1cb92debd93e0254450614d123b3748511aa4148d956fd72a7c29f",
44821
- sharedVersion: "0.3.0",
44842
+ sharedVersion: "0.4.0",
44822
44843
  sharedBundleHash: "f16fa528a8a9ef1bed8df369f0e88efafca8a9954a749005299fdbcdb93fa188",
44823
- engineVersion: "0.3.0",
44824
- engineBundleHash: "c579e54f7d0b0d5b16587a0528a3e66d32f63e2434bb471a93a01366296efd58"
44844
+ engineVersion: "0.4.0",
44845
+ engineBundleHash: "31e2d5c327284e1cac908d7f85cf6d878bbf87ea0da93ed09c6205ada6935f89"
44825
44846
  }),
44826
44847
  readinessCheck: deps.db ? async () => {
44827
44848
  const checks = {};
@@ -44856,7 +44877,7 @@ function createCapabilitiesRoutes() {
44856
44877
  const app = new Hono();
44857
44878
  app.get("/api/v1/capabilities", (c) => {
44858
44879
  const manifest = {
44859
- orchestratorVersion: "0.3.0",
44880
+ orchestratorVersion: "0.4.0",
44860
44881
  protocolVersion: PROTOCOL_VERSION,
44861
44882
  minProtocolVersion: MIN_PROTOCOL_VERSION
44862
44883
  };
@@ -47475,7 +47496,7 @@ var init_app = __esmMin((() => {
47475
47496
  init_log_chunk_sink();
47476
47497
  init_agent_metrics_aggregator();
47477
47498
  logger$31 = createLogger({ prefix: "app" });
47478
- ORCHESTRATOR_VERSION$2 = "0.3.0";
47499
+ ORCHESTRATOR_VERSION$2 = "0.4.0";
47479
47500
  SourceLocationStore = class {
47480
47501
  cache = /* @__PURE__ */ new Map();
47481
47502
  key(workflowName, jobName) {
@@ -64901,14 +64922,14 @@ var init_worker_core = __esmMin((() => {
64901
64922
  init_peer_outbox();
64902
64923
  init_worker_outbox_relay();
64903
64924
  init_app_on_error();
64904
- ORCHESTRATOR_VERSION$1 = "0.3.0";
64905
- WORKER_BUILD_COMMIT = "2e7dec998";
64906
- WORKER_SDK_VERSION = "0.3.0";
64925
+ ORCHESTRATOR_VERSION$1 = "0.4.0";
64926
+ WORKER_BUILD_COMMIT = "ffd489464";
64927
+ WORKER_SDK_VERSION = "0.4.0";
64907
64928
  WORKER_SDK_BUNDLE_HASH = "fcd0a836aa1cb92debd93e0254450614d123b3748511aa4148d956fd72a7c29f";
64908
- WORKER_SHARED_VERSION = "0.3.0";
64929
+ WORKER_SHARED_VERSION = "0.4.0";
64909
64930
  WORKER_SHARED_BUNDLE_HASH = "f16fa528a8a9ef1bed8df369f0e88efafca8a9954a749005299fdbcdb93fa188";
64910
- WORKER_ENGINE_VERSION = "0.3.0";
64911
- WORKER_ENGINE_BUNDLE_HASH = "c579e54f7d0b0d5b16587a0528a3e66d32f63e2434bb471a93a01366296efd58";
64931
+ WORKER_ENGINE_VERSION = "0.4.0";
64932
+ WORKER_ENGINE_BUNDLE_HASH = "31e2d5c327284e1cac908d7f85cf6d878bbf87ea0da93ed09c6205ada6935f89";
64912
64933
  logger$2 = createLogger({ prefix: "worker" });
64913
64934
  DRAIN_TIMEOUT_MS = 3e5;
64914
64935
  }));
@@ -64932,14 +64953,14 @@ var init_worker_core = __esmMin((() => {
64932
64953
  * Graceful shutdown:
64933
64954
  * agent WS -> heartbeat -> HTTP -> DB
64934
64955
  */
64935
- const ORCHESTRATOR_VERSION = "0.3.0";
64936
- const BUILD_COMMIT = "2e7dec998";
64937
- const SDK_VERSION = "0.3.0";
64956
+ const ORCHESTRATOR_VERSION = "0.4.0";
64957
+ const BUILD_COMMIT = "ffd489464";
64958
+ const SDK_VERSION = "0.4.0";
64938
64959
  const SDK_BUNDLE_HASH = "fcd0a836aa1cb92debd93e0254450614d123b3748511aa4148d956fd72a7c29f";
64939
- const SHARED_VERSION = "0.3.0";
64960
+ const SHARED_VERSION = "0.4.0";
64940
64961
  const SHARED_BUNDLE_HASH = "f16fa528a8a9ef1bed8df369f0e88efafca8a9954a749005299fdbcdb93fa188";
64941
- const ENGINE_VERSION = "0.3.0";
64942
- const ENGINE_BUNDLE_HASH = "c579e54f7d0b0d5b16587a0528a3e66d32f63e2434bb471a93a01366296efd58";
64962
+ const ENGINE_VERSION = "0.4.0";
64963
+ const ENGINE_BUNDLE_HASH = "31e2d5c327284e1cac908d7f85cf6d878bbf87ea0da93ed09c6205ada6935f89";
64943
64964
  const otelSdk = initTelemetry({
64944
64965
  serviceName: "kici-orchestrator",
64945
64966
  otlpEndpoint: process.env.OTEL_EXPORTER_OTLP_ENDPOINT
@@ -1,7 +1,7 @@
1
1
  {
2
- "version": "0.3.0",
2
+ "version": "0.4.0",
3
3
  "images": {
4
- "kici-agent": "sha256:2c0bc34ff4c2f8f736cac88c758093d90fbf2df8d80351e400db03a9936438fe",
5
- "kici-orchestrator": "sha256:328d45e2231d1585eba4a3cceb12080175e93b90b083bf6e45bf4e7ec65e642a"
4
+ "kici-agent": "sha256:60f463973e2fa02c4e1d9311c9214e679269fa6ead3135b4c826789ca0278cbf",
5
+ "kici-orchestrator": "sha256:75312fc8bee960384aa2c57ff72cf2fe65bcd52d222278632c79a5f14ccd3e27"
6
6
  }
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kici-dev/orchestrator",
3
- "version": "0.3.0",
3
+ "version": "0.4.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",
@@ -84,8 +84,8 @@
84
84
  "ws": "^8.21.1",
85
85
  "yaml": "^2.9.0",
86
86
  "zod": "^4.4.3",
87
- "@kici-dev/shared": "0.3.0",
88
- "@kici-dev/engine": "0.3.0"
87
+ "@kici-dev/engine": "0.4.0",
88
+ "@kici-dev/shared": "0.4.0"
89
89
  },
90
90
  "kici": {
91
91
  "metrics": {
@@ -100,7 +100,7 @@
100
100
  "@types/dockerode": "^4.0.1",
101
101
  "@types/ws": "^8.18.1",
102
102
  "kysely-ctl": "^0.21.0",
103
- "@kici-dev/agent": "0.3.0"
103
+ "@kici-dev/agent": "0.4.0"
104
104
  },
105
105
  "scripts": {
106
106
  "build": "node ../../scripts/build-service.mjs && tsgo --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.3.0",
6
- "documentNamespace": "https://kici.dev/sbom/%40kici-dev%2Forchestrator/0.3.0/7acb1732-6f68-4a3e-be32-37f73bf25228",
5
+ "name": "@kici-dev/orchestrator@0.4.0",
6
+ "documentNamespace": "https://kici.dev/sbom/%40kici-dev%2Forchestrator/0.4.0/2bd64076-f4f1-416e-9ca2-c7c843d5d0a1",
7
7
  "creationInfo": {
8
- "created": "2026-08-09T01:30:30Z",
8
+ "created": "2026-08-09T16:03:04Z",
9
9
  "creators": [
10
10
  "Tool: kici-sbom-generator"
11
11
  ]
@@ -1018,9 +1018,9 @@
1018
1018
  "homepage": "https://ericsmekens.github.io/jsep/tree/master/packages/regex#readme"
1019
1019
  },
1020
1020
  {
1021
- "SPDXID": "SPDXRef-Package--kici-dev-core-0.3.0",
1021
+ "SPDXID": "SPDXRef-Package--kici-dev-core-0.4.0",
1022
1022
  "name": "@kici-dev/core",
1023
- "versionInfo": "0.3.0",
1023
+ "versionInfo": "0.4.0",
1024
1024
  "downloadLocation": "NOASSERTION",
1025
1025
  "filesAnalyzed": false,
1026
1026
  "licenseConcluded": "NOASSERTION",
@@ -1031,16 +1031,16 @@
1031
1031
  {
1032
1032
  "referenceCategory": "PACKAGE-MANAGER",
1033
1033
  "referenceType": "purl",
1034
- "referenceLocator": "pkg:npm/%40kici-dev/core@0.3.0"
1034
+ "referenceLocator": "pkg:npm/%40kici-dev/core@0.4.0"
1035
1035
  }
1036
1036
  ],
1037
1037
  "description": "Light shared utilities for the KiCI stack (logging, errors, formatting, crypto, zx init, the TypeScript ESM loader hook). No server-side dependencies.",
1038
1038
  "homepage": "https://kici.dev"
1039
1039
  },
1040
1040
  {
1041
- "SPDXID": "SPDXRef-Package--kici-dev-engine-0.3.0",
1041
+ "SPDXID": "SPDXRef-Package--kici-dev-engine-0.4.0",
1042
1042
  "name": "@kici-dev/engine",
1043
- "versionInfo": "0.3.0",
1043
+ "versionInfo": "0.4.0",
1044
1044
  "downloadLocation": "NOASSERTION",
1045
1045
  "filesAnalyzed": false,
1046
1046
  "licenseConcluded": "NOASSERTION",
@@ -1051,7 +1051,7 @@
1051
1051
  {
1052
1052
  "referenceCategory": "PACKAGE-MANAGER",
1053
1053
  "referenceType": "purl",
1054
- "referenceLocator": "pkg:npm/%40kici-dev/engine@0.3.0"
1054
+ "referenceLocator": "pkg:npm/%40kici-dev/engine@0.4.0"
1055
1055
  }
1056
1056
  ],
1057
1057
  "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.",
@@ -1060,7 +1060,7 @@
1060
1060
  {
1061
1061
  "SPDXID": "SPDXRef-RootPackage",
1062
1062
  "name": "@kici-dev/orchestrator",
1063
- "versionInfo": "0.3.0",
1063
+ "versionInfo": "0.4.0",
1064
1064
  "downloadLocation": "NOASSERTION",
1065
1065
  "filesAnalyzed": false,
1066
1066
  "licenseConcluded": "NOASSERTION",
@@ -1071,16 +1071,16 @@
1071
1071
  {
1072
1072
  "referenceCategory": "PACKAGE-MANAGER",
1073
1073
  "referenceType": "purl",
1074
- "referenceLocator": "pkg:npm/%40kici-dev/orchestrator@0.3.0"
1074
+ "referenceLocator": "pkg:npm/%40kici-dev/orchestrator@0.4.0"
1075
1075
  }
1076
1076
  ],
1077
1077
  "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.",
1078
1078
  "homepage": "https://kici.dev"
1079
1079
  },
1080
1080
  {
1081
- "SPDXID": "SPDXRef-Package--kici-dev-shared-0.3.0",
1081
+ "SPDXID": "SPDXRef-Package--kici-dev-shared-0.4.0",
1082
1082
  "name": "@kici-dev/shared",
1083
- "versionInfo": "0.3.0",
1083
+ "versionInfo": "0.4.0",
1084
1084
  "downloadLocation": "NOASSERTION",
1085
1085
  "filesAnalyzed": false,
1086
1086
  "licenseConcluded": "NOASSERTION",
@@ -1091,7 +1091,7 @@
1091
1091
  {
1092
1092
  "referenceCategory": "PACKAGE-MANAGER",
1093
1093
  "referenceType": "purl",
1094
- "referenceLocator": "pkg:npm/%40kici-dev/shared@0.3.0"
1094
+ "referenceLocator": "pkg:npm/%40kici-dev/shared@0.4.0"
1095
1095
  }
1096
1096
  ],
1097
1097
  "description": "Shared utilities for the KiCI CI/CD stack — logging, zx setup, crypto, telemetry, health and metrics routes. No business logic.",
@@ -7768,57 +7768,57 @@
7768
7768
  "relationshipType": "DEPENDS_ON"
7769
7769
  },
7770
7770
  {
7771
- "spdxElementId": "SPDXRef-Package--kici-dev-core-0.3.0",
7771
+ "spdxElementId": "SPDXRef-Package--kici-dev-core-0.4.0",
7772
7772
  "relatedSpdxElement": "SPDXRef-Package-oxc-transform-0.140.0",
7773
7773
  "relationshipType": "DEPENDS_ON"
7774
7774
  },
7775
7775
  {
7776
- "spdxElementId": "SPDXRef-Package--kici-dev-core-0.3.0",
7776
+ "spdxElementId": "SPDXRef-Package--kici-dev-core-0.4.0",
7777
7777
  "relatedSpdxElement": "SPDXRef-Package-picocolors-1.1.1",
7778
7778
  "relationshipType": "DEPENDS_ON"
7779
7779
  },
7780
7780
  {
7781
- "spdxElementId": "SPDXRef-Package--kici-dev-core-0.3.0",
7781
+ "spdxElementId": "SPDXRef-Package--kici-dev-core-0.4.0",
7782
7782
  "relatedSpdxElement": "SPDXRef-Package-winston-daily-rotate-file-5.0.0",
7783
7783
  "relationshipType": "DEPENDS_ON"
7784
7784
  },
7785
7785
  {
7786
- "spdxElementId": "SPDXRef-Package--kici-dev-core-0.3.0",
7786
+ "spdxElementId": "SPDXRef-Package--kici-dev-core-0.4.0",
7787
7787
  "relatedSpdxElement": "SPDXRef-Package-winston-3.19.0",
7788
7788
  "relationshipType": "DEPENDS_ON"
7789
7789
  },
7790
7790
  {
7791
- "spdxElementId": "SPDXRef-Package--kici-dev-core-0.3.0",
7791
+ "spdxElementId": "SPDXRef-Package--kici-dev-core-0.4.0",
7792
7792
  "relatedSpdxElement": "SPDXRef-Package-zod-4.4.3",
7793
7793
  "relationshipType": "DEPENDS_ON"
7794
7794
  },
7795
7795
  {
7796
- "spdxElementId": "SPDXRef-Package--kici-dev-core-0.3.0",
7796
+ "spdxElementId": "SPDXRef-Package--kici-dev-core-0.4.0",
7797
7797
  "relatedSpdxElement": "SPDXRef-Package-zx-8.8.5",
7798
7798
  "relationshipType": "DEPENDS_ON"
7799
7799
  },
7800
7800
  {
7801
- "spdxElementId": "SPDXRef-Package--kici-dev-engine-0.3.0",
7801
+ "spdxElementId": "SPDXRef-Package--kici-dev-engine-0.4.0",
7802
7802
  "relatedSpdxElement": "SPDXRef-Package-jose-6.2.3",
7803
7803
  "relationshipType": "DEPENDS_ON"
7804
7804
  },
7805
7805
  {
7806
- "spdxElementId": "SPDXRef-Package--kici-dev-engine-0.3.0",
7806
+ "spdxElementId": "SPDXRef-Package--kici-dev-engine-0.4.0",
7807
7807
  "relatedSpdxElement": "SPDXRef-Package-jsonpath-plus-10.4.0",
7808
7808
  "relationshipType": "DEPENDS_ON"
7809
7809
  },
7810
7810
  {
7811
- "spdxElementId": "SPDXRef-Package--kici-dev-engine-0.3.0",
7811
+ "spdxElementId": "SPDXRef-Package--kici-dev-engine-0.4.0",
7812
7812
  "relatedSpdxElement": "SPDXRef-Package-picomatch-4.0.5",
7813
7813
  "relationshipType": "DEPENDS_ON"
7814
7814
  },
7815
7815
  {
7816
- "spdxElementId": "SPDXRef-Package--kici-dev-engine-0.3.0",
7816
+ "spdxElementId": "SPDXRef-Package--kici-dev-engine-0.4.0",
7817
7817
  "relatedSpdxElement": "SPDXRef-Package-safe-regex-2.1.1",
7818
7818
  "relationshipType": "DEPENDS_ON"
7819
7819
  },
7820
7820
  {
7821
- "spdxElementId": "SPDXRef-Package--kici-dev-engine-0.3.0",
7821
+ "spdxElementId": "SPDXRef-Package--kici-dev-engine-0.4.0",
7822
7822
  "relatedSpdxElement": "SPDXRef-Package-zod-4.4.3",
7823
7823
  "relationshipType": "DEPENDS_ON"
7824
7824
  },
@@ -7854,12 +7854,12 @@
7854
7854
  },
7855
7855
  {
7856
7856
  "spdxElementId": "SPDXRef-RootPackage",
7857
- "relatedSpdxElement": "SPDXRef-Package--kici-dev-engine-0.3.0",
7857
+ "relatedSpdxElement": "SPDXRef-Package--kici-dev-engine-0.4.0",
7858
7858
  "relationshipType": "DEPENDS_ON"
7859
7859
  },
7860
7860
  {
7861
7861
  "spdxElementId": "SPDXRef-RootPackage",
7862
- "relatedSpdxElement": "SPDXRef-Package--kici-dev-shared-0.3.0",
7862
+ "relatedSpdxElement": "SPDXRef-Package--kici-dev-shared-0.4.0",
7863
7863
  "relationshipType": "DEPENDS_ON"
7864
7864
  },
7865
7865
  {
@@ -7968,117 +7968,117 @@
7968
7968
  "relationshipType": "DEPENDS_ON"
7969
7969
  },
7970
7970
  {
7971
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.3.0",
7971
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.4.0",
7972
7972
  "relatedSpdxElement": "SPDXRef-Package--aws-sdk-client-s3-3.1090.0",
7973
7973
  "relationshipType": "DEPENDS_ON"
7974
7974
  },
7975
7975
  {
7976
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.3.0",
7977
- "relatedSpdxElement": "SPDXRef-Package--kici-dev-core-0.3.0",
7976
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.4.0",
7977
+ "relatedSpdxElement": "SPDXRef-Package--kici-dev-core-0.4.0",
7978
7978
  "relationshipType": "DEPENDS_ON"
7979
7979
  },
7980
7980
  {
7981
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.3.0",
7982
- "relatedSpdxElement": "SPDXRef-Package--kici-dev-engine-0.3.0",
7981
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.4.0",
7982
+ "relatedSpdxElement": "SPDXRef-Package--kici-dev-engine-0.4.0",
7983
7983
  "relationshipType": "DEPENDS_ON"
7984
7984
  },
7985
7985
  {
7986
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.3.0",
7986
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.4.0",
7987
7987
  "relatedSpdxElement": "SPDXRef-Package--opentelemetry-api-1.9.1",
7988
7988
  "relationshipType": "DEPENDS_ON"
7989
7989
  },
7990
7990
  {
7991
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.3.0",
7991
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.4.0",
7992
7992
  "relatedSpdxElement": "SPDXRef-Package--opentelemetry-exporter-metrics-otlp-http-0.221.0",
7993
7993
  "relationshipType": "DEPENDS_ON"
7994
7994
  },
7995
7995
  {
7996
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.3.0",
7996
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.4.0",
7997
7997
  "relatedSpdxElement": "SPDXRef-Package--opentelemetry-exporter-prometheus-0.221.0",
7998
7998
  "relationshipType": "DEPENDS_ON"
7999
7999
  },
8000
8000
  {
8001
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.3.0",
8001
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.4.0",
8002
8002
  "relatedSpdxElement": "SPDXRef-Package--opentelemetry-exporter-trace-otlp-http-0.221.0",
8003
8003
  "relationshipType": "DEPENDS_ON"
8004
8004
  },
8005
8005
  {
8006
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.3.0",
8006
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.4.0",
8007
8007
  "relatedSpdxElement": "SPDXRef-Package--opentelemetry-instrumentation-runtime-node-0.34.0",
8008
8008
  "relationshipType": "DEPENDS_ON"
8009
8009
  },
8010
8010
  {
8011
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.3.0",
8011
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.4.0",
8012
8012
  "relatedSpdxElement": "SPDXRef-Package--opentelemetry-resources-2.10.0",
8013
8013
  "relationshipType": "DEPENDS_ON"
8014
8014
  },
8015
8015
  {
8016
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.3.0",
8016
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.4.0",
8017
8017
  "relatedSpdxElement": "SPDXRef-Package--opentelemetry-sdk-node-0.221.0",
8018
8018
  "relationshipType": "DEPENDS_ON"
8019
8019
  },
8020
8020
  {
8021
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.3.0",
8021
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.4.0",
8022
8022
  "relatedSpdxElement": "SPDXRef-Package--opentelemetry-semantic-conventions-1.43.0",
8023
8023
  "relationshipType": "DEPENDS_ON"
8024
8024
  },
8025
8025
  {
8026
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.3.0",
8026
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.4.0",
8027
8027
  "relatedSpdxElement": "SPDXRef-Package-archiver-8.0.0",
8028
8028
  "relationshipType": "DEPENDS_ON"
8029
8029
  },
8030
8030
  {
8031
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.3.0",
8031
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.4.0",
8032
8032
  "relatedSpdxElement": "SPDXRef-Package-diff-9.0.0",
8033
8033
  "relationshipType": "DEPENDS_ON"
8034
8034
  },
8035
8035
  {
8036
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.3.0",
8036
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.4.0",
8037
8037
  "relatedSpdxElement": "SPDXRef-Package-hono-4.12.32",
8038
8038
  "relationshipType": "DEPENDS_ON"
8039
8039
  },
8040
8040
  {
8041
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.3.0",
8041
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.4.0",
8042
8042
  "relatedSpdxElement": "SPDXRef-Package-kysely-0.29.4",
8043
8043
  "relationshipType": "DEPENDS_ON"
8044
8044
  },
8045
8045
  {
8046
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.3.0",
8046
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.4.0",
8047
8047
  "relatedSpdxElement": "SPDXRef-Package-oxc-transform-0.140.0",
8048
8048
  "relationshipType": "DEPENDS_ON"
8049
8049
  },
8050
8050
  {
8051
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.3.0",
8051
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.4.0",
8052
8052
  "relatedSpdxElement": "SPDXRef-Package-pg-8.22.0",
8053
8053
  "relationshipType": "DEPENDS_ON"
8054
8054
  },
8055
8055
  {
8056
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.3.0",
8056
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.4.0",
8057
8057
  "relatedSpdxElement": "SPDXRef-Package-picocolors-1.1.1",
8058
8058
  "relationshipType": "DEPENDS_ON"
8059
8059
  },
8060
8060
  {
8061
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.3.0",
8061
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.4.0",
8062
8062
  "relatedSpdxElement": "SPDXRef-Package-winston-daily-rotate-file-5.0.0",
8063
8063
  "relationshipType": "DEPENDS_ON"
8064
8064
  },
8065
8065
  {
8066
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.3.0",
8066
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.4.0",
8067
8067
  "relatedSpdxElement": "SPDXRef-Package-winston-3.19.0",
8068
8068
  "relationshipType": "DEPENDS_ON"
8069
8069
  },
8070
8070
  {
8071
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.3.0",
8071
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.4.0",
8072
8072
  "relatedSpdxElement": "SPDXRef-Package-yaml-2.9.0",
8073
8073
  "relationshipType": "DEPENDS_ON"
8074
8074
  },
8075
8075
  {
8076
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.3.0",
8076
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.4.0",
8077
8077
  "relatedSpdxElement": "SPDXRef-Package-zod-4.4.3",
8078
8078
  "relationshipType": "DEPENDS_ON"
8079
8079
  },
8080
8080
  {
8081
- "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.3.0",
8081
+ "spdxElementId": "SPDXRef-Package--kici-dev-shared-0.4.0",
8082
8082
  "relatedSpdxElement": "SPDXRef-Package-zx-8.8.5",
8083
8083
  "relationshipType": "DEPENDS_ON"
8084
8084
  },