@camstack/agent 1.1.50 → 1.1.52

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/index.mjs CHANGED
@@ -5,8 +5,8 @@ import {
5
5
  loadAgentConfig,
6
6
  startAgent,
7
7
  startAgentHttpServer
8
- } from "./chunk-P6AJ6S7H.mjs";
9
- import "./chunk-Y6BUFOWG.mjs";
8
+ } from "./chunk-67UOSAWB.mjs";
9
+ import "./chunk-KPUXW5YX.mjs";
10
10
  export {
11
11
  createAgentHttpServer,
12
12
  createAgentService,
package/dist/starter.js CHANGED
@@ -83,6 +83,7 @@ var require_dist = __commonJS({
83
83
  planBoot: () => planBoot,
84
84
  readDevUploadManifest: () => readDevUploadManifest,
85
85
  readRestartIntentMarker: () => readRestartIntentMarker,
86
+ readSeedVersion: () => readSeedVersion,
86
87
  readServerRootState: () => readServerRootState,
87
88
  registerActiveRootResolver: () => registerActiveRootResolver,
88
89
  restartIntentMarkerPath: () => restartIntentMarkerPath,
@@ -294,7 +295,34 @@ var require_dist = __commonJS({
294
295
  }
295
296
  return null;
296
297
  }
297
- function planBoot(state, isValidVersion, now) {
298
+ function parse(version) {
299
+ const dashIdx = version.indexOf("-");
300
+ const base = dashIdx === -1 ? version : version.slice(0, dashIdx);
301
+ const prerelease = dashIdx === -1 ? null : version.slice(dashIdx + 1);
302
+ const nums = base.split(".").map((seg) => {
303
+ const n = Number.parseInt(seg, 10);
304
+ return Number.isNaN(n) ? 0 : n;
305
+ });
306
+ return { nums, prerelease };
307
+ }
308
+ function compareSemver(a, b) {
309
+ const pa = parse(a);
310
+ const pb = parse(b);
311
+ const len = Math.max(pa.nums.length, pb.nums.length);
312
+ for (let i = 0; i < len; i++) {
313
+ const na = pa.nums[i] ?? 0;
314
+ const nb = pb.nums[i] ?? 0;
315
+ if (na < nb) return -1;
316
+ if (na > nb) return 1;
317
+ }
318
+ if (pa.prerelease === null && pb.prerelease === null) return 0;
319
+ if (pa.prerelease === null) return 1;
320
+ if (pb.prerelease === null) return -1;
321
+ if (pa.prerelease < pb.prerelease) return -1;
322
+ if (pa.prerelease > pb.prerelease) return 1;
323
+ return 0;
324
+ }
325
+ function planBoot(state, isValidVersion, now, seedVersion = null) {
298
326
  if (state === null) {
299
327
  return { kind: "baked", reason: "no server-root state", stateToWrite: null };
300
328
  }
@@ -340,6 +368,19 @@ var require_dist = __commonJS({
340
368
  }
341
369
  if (next.currentVersion !== null) {
342
370
  if (isValidVersion(next.currentVersion)) {
371
+ if (!changed && seedVersion !== null && compareSemver(seedVersion, next.currentVersion) > 0) {
372
+ return {
373
+ kind: "baked",
374
+ reason: `baked seed ${seedVersion} is newer than active data-root ${next.currentVersion} \u2014 adopting the image seed`,
375
+ stateToWrite: {
376
+ ...next,
377
+ currentVersion: null,
378
+ previousVersion: null,
379
+ pendingBoot: null,
380
+ rolledBack: null
381
+ }
382
+ };
383
+ }
343
384
  return {
344
385
  kind: "data-root",
345
386
  version: next.currentVersion,
@@ -388,33 +429,6 @@ var require_dist = __commonJS({
388
429
  stateToWrite: changed ? next : null
389
430
  };
390
431
  }
391
- function parse(version) {
392
- const dashIdx = version.indexOf("-");
393
- const base = dashIdx === -1 ? version : version.slice(0, dashIdx);
394
- const prerelease = dashIdx === -1 ? null : version.slice(dashIdx + 1);
395
- const nums = base.split(".").map((seg) => {
396
- const n = Number.parseInt(seg, 10);
397
- return Number.isNaN(n) ? 0 : n;
398
- });
399
- return { nums, prerelease };
400
- }
401
- function compareSemver(a, b) {
402
- const pa = parse(a);
403
- const pb = parse(b);
404
- const len = Math.max(pa.nums.length, pb.nums.length);
405
- for (let i = 0; i < len; i++) {
406
- const na = pa.nums[i] ?? 0;
407
- const nb = pb.nums[i] ?? 0;
408
- if (na < nb) return -1;
409
- if (na > nb) return 1;
410
- }
411
- if (pa.prerelease === null && pb.prerelease === null) return 0;
412
- if (pa.prerelease === null) return 1;
413
- if (pb.prerelease === null) return -1;
414
- if (pa.prerelease < pb.prerelease) return -1;
415
- if (pa.prerelease > pb.prerelease) return 1;
416
- return 0;
417
- }
418
432
  var fs3 = __toESM2(require("fs"));
419
433
  var path3 = __toESM2(require("path"));
420
434
  function detectWorkspaceRoot(fromDir) {
@@ -433,6 +447,7 @@ var require_dist = __commonJS({
433
447
  dir = parent;
434
448
  }
435
449
  }
450
+ var fs4 = __toESM2(require("fs"));
436
451
  var path4 = __toESM2(require("path"));
437
452
  var import_node_url = require("url");
438
453
  var HOST_EXTERNAL_SPECIFIERS = [
@@ -476,6 +491,19 @@ var require_dist = __commonJS({
476
491
  };
477
492
  registerHooks(hooks);
478
493
  }
494
+ function readSeedVersion(seedEntry) {
495
+ try {
496
+ const pkgJsonPath = path4.join(path4.dirname(seedEntry), "..", "package.json");
497
+ const raw = JSON.parse(fs4.readFileSync(pkgJsonPath, "utf-8"));
498
+ if (typeof raw === "object" && raw !== null) {
499
+ const version = raw["version"];
500
+ if (typeof version === "string") return version;
501
+ }
502
+ return null;
503
+ } catch {
504
+ return null;
505
+ }
506
+ }
479
507
  function runNodeStarter2(options) {
480
508
  const env = options.env ?? process.env;
481
509
  const now = options.now ?? Date.now;
@@ -504,7 +532,8 @@ var require_dist = __commonJS({
504
532
  if (reason !== null) console.warn(`[starter] version ${version} invalid: ${reason}`);
505
533
  return reason === null;
506
534
  };
507
- const plan = planBoot(state, isValidVersion, now);
535
+ const seedVersion = readSeedVersion(options.seedEntry);
536
+ const plan = planBoot(state, isValidVersion, now, seedVersion);
508
537
  if (plan.stateToWrite !== null) {
509
538
  try {
510
539
  writeServerRootState(rootDir, plan.stateToWrite);
@@ -539,7 +568,7 @@ var require_dist = __commonJS({
539
568
  options.loadEntry(options.seedEntry);
540
569
  }
541
570
  var import_node_child_process = require("child_process");
542
- var fs4 = __toESM2(require("fs"));
571
+ var fs5 = __toESM2(require("fs"));
543
572
  var path5 = __toESM2(require("path"));
544
573
  var import_node_util = require("util");
545
574
  var execFileAsync = (0, import_node_util.promisify)(import_node_child_process.execFile);
@@ -552,7 +581,7 @@ var require_dist = __commonJS({
552
581
  var RESTART_REASON_PREFIX = "server-update";
553
582
  function readPackageVersion(pkgJsonPath) {
554
583
  try {
555
- const raw = JSON.parse(fs4.readFileSync(pkgJsonPath, "utf-8"));
584
+ const raw = JSON.parse(fs5.readFileSync(pkgJsonPath, "utf-8"));
556
585
  if (typeof raw === "object" && raw !== null) {
557
586
  const version = raw["version"];
558
587
  if (typeof version === "string") return version;
@@ -626,7 +655,7 @@ var require_dist = __commonJS({
626
655
  const rootDir = this.rootDir();
627
656
  const raw = readServerRootState(rootDir);
628
657
  if (raw !== null) return { state: raw, corrupt: false };
629
- return { state: emptyServerRootState(), corrupt: fs4.existsSync(stateFilePath(rootDir)) };
658
+ return { state: emptyServerRootState(), corrupt: fs5.existsSync(stateFilePath(rootDir)) };
630
659
  }
631
660
  updateState(state) {
632
661
  if (this.inFlight === "checking") return "checking";
@@ -768,7 +797,7 @@ var require_dist = __commonJS({
768
797
  }
769
798
  if (isDevChannelVersion(target)) {
770
799
  const uploadsDir = devUploadVersionDir(this.rootDir(), target);
771
- if (!fs4.existsSync(uploadsDir)) {
800
+ if (!fs5.existsSync(uploadsDir)) {
772
801
  return {
773
802
  accepted: false,
774
803
  targetVersion: target,
@@ -823,15 +852,15 @@ var require_dist = __commonJS({
823
852
  async stageAndActivate(target) {
824
853
  const rootDir = this.rootDir();
825
854
  const vDir = versionsDir(rootDir);
826
- fs4.mkdirSync(vDir, { recursive: true });
855
+ fs5.mkdirSync(vDir, { recursive: true });
827
856
  const stagingDir = path5.join(vDir, `.staging-${target}-${process.pid}-${this.now()}`);
828
- fs4.mkdirSync(stagingDir, { recursive: true });
857
+ fs5.mkdirSync(stagingDir, { recursive: true });
829
858
  try {
830
859
  const devDir = devUploadVersionDir(rootDir, target);
831
860
  const registry = this.env["CAMSTACK_NPM_REGISTRY"];
832
861
  const installArgs = ["install", "--omit=dev", "--no-audit", "--no-fund", "--loglevel=error"];
833
- if (fs4.existsSync(devDir)) {
834
- fs4.writeFileSync(
862
+ if (fs5.existsSync(devDir)) {
863
+ fs5.writeFileSync(
835
864
  path5.join(stagingDir, "package.json"),
836
865
  JSON.stringify(this.buildDevUploadsPackageJson(devDir, target), null, 2),
837
866
  "utf-8"
@@ -841,7 +870,7 @@ var require_dist = __commonJS({
841
870
  timeoutMs: NPM_INSTALL_TIMEOUT_MS
842
871
  });
843
872
  } else {
844
- fs4.writeFileSync(
873
+ fs5.writeFileSync(
845
874
  path5.join(stagingDir, "package.json"),
846
875
  JSON.stringify({ name: "camstack-node-root", private: true }, null, 2),
847
876
  "utf-8"
@@ -852,7 +881,7 @@ var require_dist = __commonJS({
852
881
  );
853
882
  }
854
883
  const entry = rootEntryPath(stagingDir, this.spec);
855
- if (!fs4.existsSync(entry)) {
884
+ if (!fs5.existsSync(entry)) {
856
885
  throw new Error(`staged closure is missing the root entry (${entry})`);
857
886
  }
858
887
  const stagedVersion = readPackageVersion(
@@ -864,14 +893,14 @@ var require_dist = __commonJS({
864
893
  );
865
894
  }
866
895
  const dest = versionDir(rootDir, target);
867
- if (fs4.existsSync(dest)) {
896
+ if (fs5.existsSync(dest)) {
868
897
  const aside = `${dest}.evicted-${this.now()}`;
869
- await fs4.promises.rename(dest, aside);
870
- await fs4.promises.rm(aside, { recursive: true, force: true }).catch(() => void 0);
898
+ await fs5.promises.rename(dest, aside);
899
+ await fs5.promises.rm(aside, { recursive: true, force: true }).catch(() => void 0);
871
900
  }
872
- await fs4.promises.rename(stagingDir, dest);
901
+ await fs5.promises.rename(stagingDir, dest);
873
902
  } catch (err) {
874
- await fs4.promises.rm(stagingDir, { recursive: true, force: true }).catch(() => void 0);
903
+ await fs5.promises.rm(stagingDir, { recursive: true, force: true }).catch(() => void 0);
875
904
  throw err;
876
905
  }
877
906
  }
@@ -902,7 +931,7 @@ var require_dist = __commonJS({
902
931
  }
903
932
  const fileRef = (filename) => {
904
933
  const abs = path5.join(devDir, filename);
905
- if (!fs4.existsSync(abs)) {
934
+ if (!fs5.existsSync(abs)) {
906
935
  throw new Error(`dev-uploads tarball listed in the manifest is missing: ${abs}`);
907
936
  }
908
937
  return `file:${abs}`;
@@ -1072,7 +1101,7 @@ var require_dist = __commonJS({
1072
1101
  const vDir = versionsDir(this.rootDir());
1073
1102
  let entries;
1074
1103
  try {
1075
- entries = fs4.readdirSync(vDir);
1104
+ entries = fs5.readdirSync(vDir);
1076
1105
  } catch {
1077
1106
  return;
1078
1107
  }
@@ -1081,14 +1110,14 @@ var require_dist = __commonJS({
1081
1110
  const full = path5.join(vDir, entry);
1082
1111
  if (entry.startsWith(".")) {
1083
1112
  try {
1084
- const ageMs = this.now() - fs4.statSync(full).mtimeMs;
1113
+ const ageMs = this.now() - fs5.statSync(full).mtimeMs;
1085
1114
  if (ageMs < _RootUpdateService.STALE_TRANSIENT_MS) continue;
1086
1115
  } catch {
1087
1116
  continue;
1088
1117
  }
1089
1118
  }
1090
1119
  try {
1091
- fs4.rmSync(full, { recursive: true, force: true });
1120
+ fs5.rmSync(full, { recursive: true, force: true });
1092
1121
  this.logger.debug("pruned server-root version dir", { meta: { entry } });
1093
1122
  } catch (err) {
1094
1123
  this.logger.warn("failed to prune server-root version dir", {
@@ -1109,15 +1138,15 @@ var require_dist = __commonJS({
1109
1138
  const dir = devUploadsDir(this.rootDir());
1110
1139
  let entries;
1111
1140
  try {
1112
- entries = fs4.readdirSync(dir);
1141
+ entries = fs5.readdirSync(dir);
1113
1142
  } catch {
1114
1143
  return;
1115
1144
  }
1116
1145
  const graveyard = path5.join(dir, ".sweeping");
1117
1146
  try {
1118
- for (const residue of fs4.readdirSync(graveyard)) {
1147
+ for (const residue of fs5.readdirSync(graveyard)) {
1119
1148
  try {
1120
- fs4.rmSync(path5.join(graveyard, residue), { recursive: true, force: true });
1149
+ fs5.rmSync(path5.join(graveyard, residue), { recursive: true, force: true });
1121
1150
  } catch {
1122
1151
  }
1123
1152
  }
@@ -1129,11 +1158,11 @@ var require_dist = __commonJS({
1129
1158
  );
1130
1159
  const doomed = byNewestFirst.slice(keepCount);
1131
1160
  if (doomed.length === 0) return;
1132
- fs4.mkdirSync(graveyard, { recursive: true });
1161
+ fs5.mkdirSync(graveyard, { recursive: true });
1133
1162
  for (const entry of doomed) {
1134
1163
  const aside = path5.join(graveyard, `${entry}-${this.now()}`);
1135
1164
  try {
1136
- fs4.renameSync(path5.join(dir, entry), aside);
1165
+ fs5.renameSync(path5.join(dir, entry), aside);
1137
1166
  } catch (err) {
1138
1167
  this.logger.warn("failed to move dev-uploads entry aside for sweep", {
1139
1168
  meta: { entry, error: err instanceof Error ? err.message : String(err) }
@@ -1141,7 +1170,7 @@ var require_dist = __commonJS({
1141
1170
  continue;
1142
1171
  }
1143
1172
  try {
1144
- fs4.rmSync(aside, { recursive: true, force: true });
1173
+ fs5.rmSync(aside, { recursive: true, force: true });
1145
1174
  this.logger.debug("swept dev-uploads entry", { meta: { entry } });
1146
1175
  } catch {
1147
1176
  }