@moxt-ai/mobius 0.0.324 → 0.0.325

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
@@ -780,8 +780,8 @@ var require_gt = __commonJS({
780
780
  "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/gt.js"(exports, module) {
781
781
  "use strict";
782
782
  var compare = require_compare();
783
- var gt4 = (a, b2, loose) => compare(a, b2, loose) > 0;
784
- module.exports = gt4;
783
+ var gt5 = (a, b2, loose) => compare(a, b2, loose) > 0;
784
+ module.exports = gt5;
785
785
  }
786
786
  });
787
787
 
@@ -841,7 +841,7 @@ var require_cmp = __commonJS({
841
841
  "use strict";
842
842
  var eq3 = require_eq();
843
843
  var neq = require_neq();
844
- var gt4 = require_gt();
844
+ var gt5 = require_gt();
845
845
  var gte3 = require_gte();
846
846
  var lt3 = require_lt();
847
847
  var lte3 = require_lte();
@@ -870,7 +870,7 @@ var require_cmp = __commonJS({
870
870
  case "!=":
871
871
  return neq(a, b2, loose);
872
872
  case ">":
873
- return gt4(a, b2, loose);
873
+ return gt5(a, b2, loose);
874
874
  case ">=":
875
875
  return gte3(a, b2, loose);
876
876
  case "<":
@@ -1599,7 +1599,7 @@ var require_min_version = __commonJS({
1599
1599
  "use strict";
1600
1600
  var SemVer = require_semver();
1601
1601
  var Range = require_range();
1602
- var gt4 = require_gt();
1602
+ var gt5 = require_gt();
1603
1603
  var minVersion = (range, loose) => {
1604
1604
  range = new Range(range, loose);
1605
1605
  let minver = new SemVer("0.0.0");
@@ -1627,7 +1627,7 @@ var require_min_version = __commonJS({
1627
1627
  /* fallthrough */
1628
1628
  case "":
1629
1629
  case ">=":
1630
- if (!setMin || gt4(compver, setMin)) {
1630
+ if (!setMin || gt5(compver, setMin)) {
1631
1631
  setMin = compver;
1632
1632
  }
1633
1633
  break;
@@ -1639,7 +1639,7 @@ var require_min_version = __commonJS({
1639
1639
  throw new Error(`Unexpected operation: ${comparator.operator}`);
1640
1640
  }
1641
1641
  });
1642
- if (setMin && (!minver || gt4(minver, setMin))) {
1642
+ if (setMin && (!minver || gt5(minver, setMin))) {
1643
1643
  minver = setMin;
1644
1644
  }
1645
1645
  }
@@ -1677,7 +1677,7 @@ var require_outside = __commonJS({
1677
1677
  var { ANY } = Comparator;
1678
1678
  var Range = require_range();
1679
1679
  var satisfies3 = require_satisfies();
1680
- var gt4 = require_gt();
1680
+ var gt5 = require_gt();
1681
1681
  var lt3 = require_lt();
1682
1682
  var lte3 = require_lte();
1683
1683
  var gte3 = require_gte();
@@ -1687,7 +1687,7 @@ var require_outside = __commonJS({
1687
1687
  let gtfn, ltefn, ltfn, comp, ecomp;
1688
1688
  switch (hilo) {
1689
1689
  case ">":
1690
- gtfn = gt4;
1690
+ gtfn = gt5;
1691
1691
  ltefn = lte3;
1692
1692
  ltfn = lt3;
1693
1693
  comp = ">";
@@ -1696,7 +1696,7 @@ var require_outside = __commonJS({
1696
1696
  case "<":
1697
1697
  gtfn = lt3;
1698
1698
  ltefn = gte3;
1699
- ltfn = gt4;
1699
+ ltfn = gt5;
1700
1700
  comp = "<";
1701
1701
  ecomp = "<=";
1702
1702
  break;
@@ -1874,10 +1874,10 @@ var require_subset = __commonJS({
1874
1874
  }
1875
1875
  }
1876
1876
  const eqSet = /* @__PURE__ */ new Set();
1877
- let gt4, lt3;
1877
+ let gt5, lt3;
1878
1878
  for (const c of sub) {
1879
1879
  if (c.operator === ">" || c.operator === ">=") {
1880
- gt4 = higherGT(gt4, c, options);
1880
+ gt5 = higherGT(gt5, c, options);
1881
1881
  } else if (c.operator === "<" || c.operator === "<=") {
1882
1882
  lt3 = lowerLT(lt3, c, options);
1883
1883
  } else {
@@ -1888,16 +1888,16 @@ var require_subset = __commonJS({
1888
1888
  return null;
1889
1889
  }
1890
1890
  let gtltComp;
1891
- if (gt4 && lt3) {
1892
- gtltComp = compare(gt4.semver, lt3.semver, options);
1891
+ if (gt5 && lt3) {
1892
+ gtltComp = compare(gt5.semver, lt3.semver, options);
1893
1893
  if (gtltComp > 0) {
1894
1894
  return null;
1895
- } else if (gtltComp === 0 && (gt4.operator !== ">=" || lt3.operator !== "<=")) {
1895
+ } else if (gtltComp === 0 && (gt5.operator !== ">=" || lt3.operator !== "<=")) {
1896
1896
  return null;
1897
1897
  }
1898
1898
  }
1899
1899
  for (const eq3 of eqSet) {
1900
- if (gt4 && !satisfies3(eq3, String(gt4), options)) {
1900
+ if (gt5 && !satisfies3(eq3, String(gt5), options)) {
1901
1901
  return null;
1902
1902
  }
1903
1903
  if (lt3 && !satisfies3(eq3, String(lt3), options)) {
@@ -1913,25 +1913,25 @@ var require_subset = __commonJS({
1913
1913
  let higher, lower;
1914
1914
  let hasDomLT, hasDomGT;
1915
1915
  let needDomLTPre = lt3 && !options.includePrerelease && lt3.semver.prerelease.length ? lt3.semver : false;
1916
- let needDomGTPre = gt4 && !options.includePrerelease && gt4.semver.prerelease.length ? gt4.semver : false;
1916
+ let needDomGTPre = gt5 && !options.includePrerelease && gt5.semver.prerelease.length ? gt5.semver : false;
1917
1917
  if (needDomLTPre && needDomLTPre.prerelease.length === 1 && lt3.operator === "<" && needDomLTPre.prerelease[0] === 0) {
1918
1918
  needDomLTPre = false;
1919
1919
  }
1920
1920
  for (const c of dom) {
1921
1921
  hasDomGT = hasDomGT || c.operator === ">" || c.operator === ">=";
1922
1922
  hasDomLT = hasDomLT || c.operator === "<" || c.operator === "<=";
1923
- if (gt4) {
1923
+ if (gt5) {
1924
1924
  if (needDomGTPre) {
1925
1925
  if (c.semver.prerelease && c.semver.prerelease.length && c.semver.major === needDomGTPre.major && c.semver.minor === needDomGTPre.minor && c.semver.patch === needDomGTPre.patch) {
1926
1926
  needDomGTPre = false;
1927
1927
  }
1928
1928
  }
1929
1929
  if (c.operator === ">" || c.operator === ">=") {
1930
- higher = higherGT(gt4, c, options);
1931
- if (higher === c && higher !== gt4) {
1930
+ higher = higherGT(gt5, c, options);
1931
+ if (higher === c && higher !== gt5) {
1932
1932
  return false;
1933
1933
  }
1934
- } else if (gt4.operator === ">=" && !c.test(gt4.semver)) {
1934
+ } else if (gt5.operator === ">=" && !c.test(gt5.semver)) {
1935
1935
  return false;
1936
1936
  }
1937
1937
  }
@@ -1950,14 +1950,14 @@ var require_subset = __commonJS({
1950
1950
  return false;
1951
1951
  }
1952
1952
  }
1953
- if (!c.operator && (lt3 || gt4) && gtltComp !== 0) {
1953
+ if (!c.operator && (lt3 || gt5) && gtltComp !== 0) {
1954
1954
  return false;
1955
1955
  }
1956
1956
  }
1957
- if (gt4 && hasDomLT && !lt3 && gtltComp !== 0) {
1957
+ if (gt5 && hasDomLT && !lt3 && gtltComp !== 0) {
1958
1958
  return false;
1959
1959
  }
1960
- if (lt3 && hasDomGT && !gt4 && gtltComp !== 0) {
1960
+ if (lt3 && hasDomGT && !gt5 && gtltComp !== 0) {
1961
1961
  return false;
1962
1962
  }
1963
1963
  if (needDomGTPre || needDomLTPre) {
@@ -2006,7 +2006,7 @@ var require_semver2 = __commonJS({
2006
2006
  var compareBuild = require_compare_build();
2007
2007
  var sort = require_sort();
2008
2008
  var rsort = require_rsort();
2009
- var gt4 = require_gt();
2009
+ var gt5 = require_gt();
2010
2010
  var lt3 = require_lt();
2011
2011
  var eq3 = require_eq();
2012
2012
  var neq = require_neq();
@@ -2045,7 +2045,7 @@ var require_semver2 = __commonJS({
2045
2045
  compareBuild,
2046
2046
  sort,
2047
2047
  rsort,
2048
- gt: gt4,
2048
+ gt: gt5,
2049
2049
  lt: lt3,
2050
2050
  eq: eq3,
2051
2051
  neq,
@@ -2086,7 +2086,7 @@ var init_package = __esm({
2086
2086
  "package.json"() {
2087
2087
  package_default = {
2088
2088
  name: "@moxt-ai/mobius",
2089
- version: "0.0.324",
2089
+ version: "0.0.325",
2090
2090
  description: "Mobius CLI for pairing and running local AI agent services.",
2091
2091
  type: "module",
2092
2092
  bin: {
@@ -91350,243 +91350,9 @@ var init_version_data = __esm({
91350
91350
  }
91351
91351
  });
91352
91352
 
91353
- // src/storage/daemon/control-token.ts
91354
- import { randomBytes } from "node:crypto";
91355
- import { readFile as readFile8, writeFile as writeFile3 } from "node:fs/promises";
91356
- import { join as join26 } from "node:path";
91357
- function controlTokenPath(stateDirectory) {
91358
- return join26(stateDirectory, "manager.token");
91359
- }
91360
- async function readOrCreateControlToken(stateDirectory) {
91361
- const path8 = controlTokenPath(stateDirectory);
91362
- try {
91363
- return (await readFile8(path8, "utf8")).trim();
91364
- } catch (cause) {
91365
- if (!isNodeError(cause, "ENOENT")) {
91366
- throw cause;
91367
- }
91368
- }
91369
- const token = randomBytes(32).toString("base64url");
91370
- try {
91371
- await writeFile3(path8, `${token}
91372
- `, { flag: "wx", mode: 384 });
91373
- return token;
91374
- } catch (cause) {
91375
- if (!isNodeError(cause, "EEXIST")) {
91376
- throw cause;
91377
- }
91378
- return (await readFile8(path8, "utf8")).trim();
91379
- }
91380
- }
91381
- var init_control_token = __esm({
91382
- "src/storage/daemon/control-token.ts"() {
91383
- "use strict";
91384
- init_node_error();
91385
- }
91386
- });
91387
-
91388
- // src/daemon/control/local-client.ts
91389
- import { createHash as createHash6 } from "node:crypto";
91390
- import { createConnection } from "node:net";
91391
- function controlSocketPath(stateDirectory, endpoint = "manager") {
91392
- const installationHash = createHash6("sha256").update(endpoint === "manager" ? stateDirectory : `${stateDirectory}:worker`).digest("hex").slice(0, 32);
91393
- return managerPlatform.controlSocketPath(installationHash);
91394
- }
91395
- async function readSocketMessage(socket, signal) {
91396
- signal.throwIfAborted();
91397
- return await new Promise((resolve21, reject2) => {
91398
- let encoded = "";
91399
- const finish = (error62, value) => {
91400
- signal.removeEventListener("abort", abort);
91401
- socket.removeAllListeners("data");
91402
- socket.removeAllListeners("error");
91403
- socket.removeAllListeners("end");
91404
- if (error62 === void 0) {
91405
- resolve21(value);
91406
- } else {
91407
- reject2(error62);
91408
- }
91409
- };
91410
- const abort = () => {
91411
- socket.destroy();
91412
- finish(signal.reason);
91413
- };
91414
- socket.on("data", (chunk) => {
91415
- encoded += chunk.toString("utf8");
91416
- if (encoded.length > MAXIMUM_MESSAGE_BYTES) {
91417
- finish(new Error("The manager message is too large"));
91418
- socket.destroy();
91419
- return;
91420
- }
91421
- const newline = encoded.indexOf("\n");
91422
- if (newline >= 0) {
91423
- try {
91424
- finish(void 0, JSON.parse(encoded.slice(0, newline)));
91425
- } catch (cause) {
91426
- finish(cause);
91427
- }
91428
- }
91429
- });
91430
- socket.once("error", finish);
91431
- socket.once("end", () => finish(new Error("The manager connection closed without a response")));
91432
- signal.addEventListener("abort", abort, { once: true });
91433
- });
91434
- }
91435
- async function sendLocalRequest(stateDirectory, endpoint, command, signal) {
91436
- const token = await readOrCreateControlToken(stateDirectory);
91437
- const deadline = AbortSignal.any([signal, AbortSignal.timeout(CONTROL_TIMEOUT_MILLISECONDS)]);
91438
- deadline.throwIfAborted();
91439
- const socket = createConnection(controlSocketPath(stateDirectory, endpoint));
91440
- try {
91441
- await new Promise((resolve21, reject2) => {
91442
- const abort = () => {
91443
- socket.destroy();
91444
- reject2(deadline.reason);
91445
- };
91446
- socket.once("connect", () => {
91447
- deadline.removeEventListener("abort", abort);
91448
- resolve21();
91449
- });
91450
- socket.once("error", reject2);
91451
- deadline.addEventListener("abort", abort, { once: true });
91452
- });
91453
- socket.write(`${JSON.stringify({ ...command, token })}
91454
- `);
91455
- return await readSocketMessage(socket, deadline);
91456
- } finally {
91457
- socket.destroy();
91458
- }
91459
- }
91460
- var CONTROL_TIMEOUT_MILLISECONDS, MAXIMUM_MESSAGE_BYTES, managerPlatform;
91461
- var init_local_client = __esm({
91462
- "src/daemon/control/local-client.ts"() {
91463
- "use strict";
91464
- init_control_token();
91465
- init_platform();
91466
- CONTROL_TIMEOUT_MILLISECONDS = 13e4;
91467
- MAXIMUM_MESSAGE_BYTES = 64 * 1024;
91468
- managerPlatform = platformSupportFor(process.platform);
91469
- }
91470
- });
91471
-
91472
- // src/daemon/control/protocol.ts
91473
- var workerLaunch, transition, daemonSwitchState, lifecycleCommand, lifecycleResponse;
91474
- var init_protocol2 = __esm({
91475
- "src/daemon/control/protocol.ts"() {
91476
- "use strict";
91477
- init_zod();
91478
- workerLaunch = external_exports.object({
91479
- executable: external_exports.string().min(1),
91480
- entry: external_exports.string().min(1),
91481
- version: external_exports.string().min(1).max(128)
91482
- }).readonly();
91483
- transition = {
91484
- id: external_exports.string().min(1).max(256),
91485
- context: external_exports.string().max(256),
91486
- previous: workerLaunch,
91487
- next: workerLaunch
91488
- };
91489
- daemonSwitchState = external_exports.discriminatedUnion("kind", [
91490
- external_exports.object({ ...transition, kind: external_exports.literal("switching") }),
91491
- external_exports.object({ ...transition, kind: external_exports.literal("switched") }),
91492
- external_exports.object({
91493
- ...transition,
91494
- kind: external_exports.literal("rolled-back"),
91495
- code: external_exports.string(),
91496
- message: external_exports.string(),
91497
- stdout: external_exports.string().max(4096),
91498
- stderr: external_exports.string().max(4096),
91499
- retryAfter: external_exports.number().int().nonnegative()
91500
- })
91501
- ]).readonly();
91502
- lifecycleCommand = external_exports.discriminatedUnion("kind", [
91503
- external_exports.object({ kind: external_exports.literal("status") }),
91504
- external_exports.object({ kind: external_exports.literal("ensure"), launch: workerLaunch }),
91505
- external_exports.object({ kind: external_exports.literal("stop") }),
91506
- external_exports.object({
91507
- kind: external_exports.literal("switch"),
91508
- id: external_exports.string().min(1).max(256),
91509
- context: external_exports.string().max(256),
91510
- launch: workerLaunch
91511
- }),
91512
- external_exports.object({ kind: external_exports.literal("switch-status"), wait: external_exports.boolean() })
91513
- ]).readonly();
91514
- lifecycleResponse = external_exports.discriminatedUnion("kind", [
91515
- external_exports.object({
91516
- kind: external_exports.literal("status"),
91517
- protocolVersion: external_exports.literal(2),
91518
- worker: external_exports.object({ pid: external_exports.number().int().positive(), version: external_exports.string() }).readonly().nullable()
91519
- }),
91520
- external_exports.object({ kind: external_exports.literal("switch-status"), state: daemonSwitchState.nullable() }),
91521
- external_exports.object({ kind: external_exports.literal("stopped") }),
91522
- external_exports.object({ kind: external_exports.literal("switching") }),
91523
- external_exports.object({ kind: external_exports.literal("error"), code: external_exports.string(), message: external_exports.string() })
91524
- ]).readonly();
91525
- }
91526
- });
91527
-
91528
- // src/daemon/control/switch-status.ts
91529
- async function readSwitchStatus(directory, signal, wait = false) {
91530
- const response = lifecycleResponse.parse(
91531
- await sendLocalRequest(directory, "manager", { kind: "switch-status", wait }, signal)
91532
- );
91533
- if (response.kind !== "switch-status") {
91534
- throw new Error("The manager could not return the switch status");
91535
- }
91536
- return response.state;
91537
- }
91538
- var init_switch_status = __esm({
91539
- "src/daemon/control/switch-status.ts"() {
91540
- "use strict";
91541
- init_local_client();
91542
- init_protocol2();
91543
- }
91544
- });
91545
-
91546
- // src/daemon/upgrades/data.ts
91547
- async function prepareVersionData(version2, signal, environment = process.env, fallbackVersion = null) {
91548
- signal.throwIfAborted();
91549
- const root = readStateDirectory(environment);
91550
- const targetVersion = runtimeUpgradeVersionSchema.parse(version2);
91551
- if (await versionDataExists(root, targetVersion, signal)) {
91552
- return;
91553
- }
91554
- const previous = await readCurrentDataVersion(root, signal) ?? fallbackVersion;
91555
- if (previous === null) {
91556
- return;
91557
- }
91558
- const leftBehind = await copyVersionData(root, runtimeUpgradeVersionSchema.parse(previous), targetVersion, signal);
91559
- for (const entry of leftBehind) {
91560
- process.stderr.write(
91561
- `Mobius did not carry ${entry} into version ${targetVersion}: an earlier Mobius ran with that installation as its state root.
91562
- `
91563
- );
91564
- }
91565
- }
91566
- async function discardRolledBackData(version2, signal) {
91567
- await discardVersionData(readStateDirectory(), runtimeUpgradeVersionSchema.parse(version2), signal);
91568
- }
91569
- async function recordCurrentData(version2, signal) {
91570
- await writeCurrentDataVersion(readStateDirectory(), runtimeUpgradeVersionSchema.parse(version2), signal);
91571
- }
91572
- async function prepareUpgradeData(controlDirectory, version2, signal) {
91573
- const transition2 = await readSwitchStatus(controlDirectory, signal);
91574
- const previous = transition2?.kind === "switching" && transition2.next.version === version2 ? transition2.previous.version : null;
91575
- await prepareVersionData(version2, signal, process.env, previous);
91576
- }
91577
- var init_data = __esm({
91578
- "src/daemon/upgrades/data.ts"() {
91579
- "use strict";
91580
- init_protocol();
91581
- init_version_data();
91582
- init_state_directory();
91583
- init_switch_status();
91584
- }
91585
- });
91586
-
91587
91353
  // src/daemon/pairing/pair-local-machine.ts
91588
91354
  import { hostname as hostname3 } from "node:os";
91589
- import { basename as basename7, join as join27, resolve as resolve16 } from "node:path";
91355
+ import { basename as basename7, join as join26, resolve as resolve16 } from "node:path";
91590
91356
  import { fetch as fetch3 } from "undici";
91591
91357
  function hasExactKeys2(value, expectedKeys) {
91592
91358
  const keys = Object.keys(value);
@@ -91839,11 +91605,15 @@ async function openMobiusControlInstallation(signal, environment) {
91839
91605
  );
91840
91606
  }
91841
91607
  async function openMobiusCliInstallation(signal, environment) {
91842
- await prepareVersionData(package_default.version, signal, environment);
91608
+ const root = readStateDirectory(environment);
91609
+ const version2 = await readCurrentDataVersion(root, signal) ?? package_default.version;
91610
+ return await openMobiusVersionInstallation(version2, signal, environment);
91611
+ }
91612
+ async function openMobiusVersionInstallation(version2, signal, environment) {
91843
91613
  return await openRuntimeInstallationStore(
91844
91614
  {
91845
91615
  applicationId: MOBIUS_CLI_APPLICATION_ID,
91846
- stateDirectory: join27(readStateDirectory(environment), "versions", package_default.version)
91616
+ stateDirectory: join26(readStateDirectory(environment), "versions", version2)
91847
91617
  },
91848
91618
  signal
91849
91619
  );
@@ -91882,11 +91652,11 @@ var init_pair_local_machine = __esm({
91882
91652
  init_resolve_catalog_agent();
91883
91653
  init_config();
91884
91654
  init_runtime_installation_store();
91655
+ init_version_data();
91885
91656
  init_local_files();
91886
91657
  init_state_directory();
91887
91658
  init_environment_proxy();
91888
91659
  init_value_utils();
91889
- init_data();
91890
91660
  PAIRING_TIMEOUT_MILLISECONDS = 2e4;
91891
91661
  PAIRING_CODE_PATTERN = /^[A-HJ-NP-Z2-9]{4}(?:-[A-HJ-NP-Z2-9]{4}){4}$/;
91892
91662
  TOKEN_PATTERN = /^[a-zA-Z0-9_-]{32,256}$/;
@@ -92115,20 +91885,20 @@ var init_agents = __esm({
92115
91885
  });
92116
91886
 
92117
91887
  // src/storage/daemon/manager-lock.ts
92118
- import { readFile as readFile9, unlink as unlink4, writeFile as writeFile4 } from "node:fs/promises";
92119
- import { join as join28 } from "node:path";
91888
+ import { readFile as readFile8, unlink as unlink4, writeFile as writeFile3 } from "node:fs/promises";
91889
+ import { join as join27 } from "node:path";
92120
91890
  async function acquireManagerLock(stateDirectory, name2 = "manager.lock") {
92121
- const path8 = join28(stateDirectory, name2);
91891
+ const path8 = join27(stateDirectory, name2);
92122
91892
  for (let attempt = 0; attempt < 2; attempt += 1) {
92123
91893
  try {
92124
- await writeFile4(path8, `${process.pid.toString()}
91894
+ await writeFile3(path8, `${process.pid.toString()}
92125
91895
  `, { flag: "wx", mode: 384 });
92126
91896
  return async () => await unlink4(path8).catch(() => void 0);
92127
91897
  } catch (cause) {
92128
91898
  if (!isNodeError(cause, "EEXIST")) {
92129
91899
  throw cause;
92130
91900
  }
92131
- const encoded = await readFile9(path8, "utf8").catch(() => "");
91901
+ const encoded = await readFile8(path8, "utf8").catch(() => "");
92132
91902
  const pid = Number(encoded.trim());
92133
91903
  if (Number.isSafeInteger(pid) && pid > 1) {
92134
91904
  try {
@@ -92147,7 +91917,7 @@ async function acquireManagerLock(stateDirectory, name2 = "manager.lock") {
92147
91917
  }
92148
91918
  async function managerLockExists(stateDirectory) {
92149
91919
  try {
92150
- await readFile9(join28(stateDirectory, "manager.lock"), "utf8");
91920
+ await readFile8(join27(stateDirectory, "manager.lock"), "utf8");
92151
91921
  return true;
92152
91922
  } catch (cause) {
92153
91923
  if (isNodeError(cause, "ENOENT")) {
@@ -92163,6 +91933,125 @@ var init_manager_lock = __esm({
92163
91933
  }
92164
91934
  });
92165
91935
 
91936
+ // src/storage/daemon/control-token.ts
91937
+ import { randomBytes } from "node:crypto";
91938
+ import { readFile as readFile9, writeFile as writeFile4 } from "node:fs/promises";
91939
+ import { join as join28 } from "node:path";
91940
+ function controlTokenPath(stateDirectory) {
91941
+ return join28(stateDirectory, "manager.token");
91942
+ }
91943
+ async function readOrCreateControlToken(stateDirectory) {
91944
+ const path8 = controlTokenPath(stateDirectory);
91945
+ try {
91946
+ return (await readFile9(path8, "utf8")).trim();
91947
+ } catch (cause) {
91948
+ if (!isNodeError(cause, "ENOENT")) {
91949
+ throw cause;
91950
+ }
91951
+ }
91952
+ const token = randomBytes(32).toString("base64url");
91953
+ try {
91954
+ await writeFile4(path8, `${token}
91955
+ `, { flag: "wx", mode: 384 });
91956
+ return token;
91957
+ } catch (cause) {
91958
+ if (!isNodeError(cause, "EEXIST")) {
91959
+ throw cause;
91960
+ }
91961
+ return (await readFile9(path8, "utf8")).trim();
91962
+ }
91963
+ }
91964
+ var init_control_token = __esm({
91965
+ "src/storage/daemon/control-token.ts"() {
91966
+ "use strict";
91967
+ init_node_error();
91968
+ }
91969
+ });
91970
+
91971
+ // src/daemon/control/local-client.ts
91972
+ import { createHash as createHash6 } from "node:crypto";
91973
+ import { createConnection } from "node:net";
91974
+ function controlSocketPath(stateDirectory, endpoint = "manager") {
91975
+ const installationHash = createHash6("sha256").update(endpoint === "manager" ? stateDirectory : `${stateDirectory}:worker`).digest("hex").slice(0, 32);
91976
+ return managerPlatform.controlSocketPath(installationHash);
91977
+ }
91978
+ async function readSocketMessage(socket, signal) {
91979
+ signal.throwIfAborted();
91980
+ return await new Promise((resolve21, reject2) => {
91981
+ let encoded = "";
91982
+ const finish = (error62, value) => {
91983
+ signal.removeEventListener("abort", abort);
91984
+ socket.removeAllListeners("data");
91985
+ socket.removeAllListeners("error");
91986
+ socket.removeAllListeners("end");
91987
+ if (error62 === void 0) {
91988
+ resolve21(value);
91989
+ } else {
91990
+ reject2(error62);
91991
+ }
91992
+ };
91993
+ const abort = () => {
91994
+ socket.destroy();
91995
+ finish(signal.reason);
91996
+ };
91997
+ socket.on("data", (chunk) => {
91998
+ encoded += chunk.toString("utf8");
91999
+ if (encoded.length > MAXIMUM_MESSAGE_BYTES) {
92000
+ finish(new Error("The manager message is too large"));
92001
+ socket.destroy();
92002
+ return;
92003
+ }
92004
+ const newline = encoded.indexOf("\n");
92005
+ if (newline >= 0) {
92006
+ try {
92007
+ finish(void 0, JSON.parse(encoded.slice(0, newline)));
92008
+ } catch (cause) {
92009
+ finish(cause);
92010
+ }
92011
+ }
92012
+ });
92013
+ socket.once("error", finish);
92014
+ socket.once("end", () => finish(new Error("The manager connection closed without a response")));
92015
+ signal.addEventListener("abort", abort, { once: true });
92016
+ });
92017
+ }
92018
+ async function sendLocalRequest(stateDirectory, endpoint, command, signal) {
92019
+ const token = await readOrCreateControlToken(stateDirectory);
92020
+ const deadline = AbortSignal.any([signal, AbortSignal.timeout(CONTROL_TIMEOUT_MILLISECONDS)]);
92021
+ deadline.throwIfAborted();
92022
+ const socket = createConnection(controlSocketPath(stateDirectory, endpoint));
92023
+ try {
92024
+ await new Promise((resolve21, reject2) => {
92025
+ const abort = () => {
92026
+ socket.destroy();
92027
+ reject2(deadline.reason);
92028
+ };
92029
+ socket.once("connect", () => {
92030
+ deadline.removeEventListener("abort", abort);
92031
+ resolve21();
92032
+ });
92033
+ socket.once("error", reject2);
92034
+ deadline.addEventListener("abort", abort, { once: true });
92035
+ });
92036
+ socket.write(`${JSON.stringify({ ...command, token })}
92037
+ `);
92038
+ return await readSocketMessage(socket, deadline);
92039
+ } finally {
92040
+ socket.destroy();
92041
+ }
92042
+ }
92043
+ var CONTROL_TIMEOUT_MILLISECONDS, MAXIMUM_MESSAGE_BYTES, managerPlatform;
92044
+ var init_local_client = __esm({
92045
+ "src/daemon/control/local-client.ts"() {
92046
+ "use strict";
92047
+ init_control_token();
92048
+ init_platform();
92049
+ CONTROL_TIMEOUT_MILLISECONDS = 13e4;
92050
+ MAXIMUM_MESSAGE_BYTES = 64 * 1024;
92051
+ managerPlatform = platformSupportFor(process.platform);
92052
+ }
92053
+ });
92054
+
92166
92055
  // src/daemon/control/local-server.ts
92167
92056
  import { createServer } from "node:net";
92168
92057
  async function serveLocalControl(stateDirectory, endpoint, signal, handle, onListening = () => void 0, onResponse = () => void 0) {
@@ -92233,6 +92122,121 @@ var init_local_server = __esm({
92233
92122
  }
92234
92123
  });
92235
92124
 
92125
+ // src/daemon/control/protocol.ts
92126
+ var workerLaunch, transition, daemonSwitchState, lifecycleCommand, lifecycleResponse;
92127
+ var init_protocol2 = __esm({
92128
+ "src/daemon/control/protocol.ts"() {
92129
+ "use strict";
92130
+ init_zod();
92131
+ workerLaunch = external_exports.object({
92132
+ executable: external_exports.string().min(1),
92133
+ entry: external_exports.string().min(1),
92134
+ version: external_exports.string().min(1).max(128)
92135
+ }).readonly();
92136
+ transition = {
92137
+ id: external_exports.string().min(1).max(256),
92138
+ context: external_exports.string().max(256),
92139
+ previous: workerLaunch,
92140
+ next: workerLaunch
92141
+ };
92142
+ daemonSwitchState = external_exports.discriminatedUnion("kind", [
92143
+ external_exports.object({ ...transition, kind: external_exports.literal("switching") }),
92144
+ external_exports.object({ ...transition, kind: external_exports.literal("switched") }),
92145
+ external_exports.object({
92146
+ ...transition,
92147
+ kind: external_exports.literal("rolled-back"),
92148
+ code: external_exports.string(),
92149
+ message: external_exports.string(),
92150
+ stdout: external_exports.string().max(4096),
92151
+ stderr: external_exports.string().max(4096),
92152
+ retryAfter: external_exports.number().int().nonnegative()
92153
+ })
92154
+ ]).readonly();
92155
+ lifecycleCommand = external_exports.discriminatedUnion("kind", [
92156
+ external_exports.object({ kind: external_exports.literal("status") }),
92157
+ external_exports.object({ kind: external_exports.literal("ensure"), launch: workerLaunch }),
92158
+ external_exports.object({ kind: external_exports.literal("stop") }),
92159
+ external_exports.object({
92160
+ kind: external_exports.literal("switch"),
92161
+ id: external_exports.string().min(1).max(256),
92162
+ context: external_exports.string().max(256),
92163
+ launch: workerLaunch
92164
+ }),
92165
+ external_exports.object({ kind: external_exports.literal("switch-status"), wait: external_exports.boolean() })
92166
+ ]).readonly();
92167
+ lifecycleResponse = external_exports.discriminatedUnion("kind", [
92168
+ external_exports.object({
92169
+ kind: external_exports.literal("status"),
92170
+ protocolVersion: external_exports.literal(2),
92171
+ worker: external_exports.object({ pid: external_exports.number().int().positive(), version: external_exports.string() }).readonly().nullable()
92172
+ }),
92173
+ external_exports.object({ kind: external_exports.literal("switch-status"), state: daemonSwitchState.nullable() }),
92174
+ external_exports.object({ kind: external_exports.literal("stopped") }),
92175
+ external_exports.object({ kind: external_exports.literal("switching") }),
92176
+ external_exports.object({ kind: external_exports.literal("error"), code: external_exports.string(), message: external_exports.string() })
92177
+ ]).readonly();
92178
+ }
92179
+ });
92180
+
92181
+ // src/daemon/control/switch-status.ts
92182
+ async function readSwitchStatus(directory, signal, wait = false) {
92183
+ const response = lifecycleResponse.parse(
92184
+ await sendLocalRequest(directory, "manager", { kind: "switch-status", wait }, signal)
92185
+ );
92186
+ if (response.kind !== "switch-status") {
92187
+ throw new Error("The manager could not return the switch status");
92188
+ }
92189
+ return response.state;
92190
+ }
92191
+ var init_switch_status = __esm({
92192
+ "src/daemon/control/switch-status.ts"() {
92193
+ "use strict";
92194
+ init_local_client();
92195
+ init_protocol2();
92196
+ }
92197
+ });
92198
+
92199
+ // src/daemon/upgrades/data.ts
92200
+ async function prepareVersionData(version2, signal, environment = process.env, fallbackVersion = null) {
92201
+ signal.throwIfAborted();
92202
+ const root = readStateDirectory(environment);
92203
+ const targetVersion = runtimeUpgradeVersionSchema.parse(version2);
92204
+ if (await versionDataExists(root, targetVersion, signal)) {
92205
+ return;
92206
+ }
92207
+ const previous = await readCurrentDataVersion(root, signal) ?? fallbackVersion;
92208
+ if (previous === null) {
92209
+ return;
92210
+ }
92211
+ const leftBehind = await copyVersionData(root, runtimeUpgradeVersionSchema.parse(previous), targetVersion, signal);
92212
+ for (const entry of leftBehind) {
92213
+ process.stderr.write(
92214
+ `Mobius did not carry ${entry} into version ${targetVersion}: an earlier Mobius ran with that installation as its state root.
92215
+ `
92216
+ );
92217
+ }
92218
+ }
92219
+ async function discardRolledBackData(version2, signal) {
92220
+ await discardVersionData(readStateDirectory(), runtimeUpgradeVersionSchema.parse(version2), signal);
92221
+ }
92222
+ async function recordCurrentData(version2, signal) {
92223
+ await writeCurrentDataVersion(readStateDirectory(), runtimeUpgradeVersionSchema.parse(version2), signal);
92224
+ }
92225
+ async function prepareUpgradeData(controlDirectory, version2, signal) {
92226
+ const transition2 = await readSwitchStatus(controlDirectory, signal);
92227
+ const previous = transition2?.kind === "switching" && transition2.next.version === version2 ? transition2.previous.version : null;
92228
+ await prepareVersionData(version2, signal, process.env, previous);
92229
+ }
92230
+ var init_data = __esm({
92231
+ "src/daemon/upgrades/data.ts"() {
92232
+ "use strict";
92233
+ init_protocol();
92234
+ init_version_data();
92235
+ init_state_directory();
92236
+ init_switch_status();
92237
+ }
92238
+ });
92239
+
92236
92240
  // src/storage/logs/bounded-log.ts
92237
92241
  import { appendFileSync as appendFileSync2, mkdirSync as mkdirSync4, readFileSync as readFileSync9, renameSync as renameSync2, statSync as statSync5, writeFileSync as writeFileSync2 } from "node:fs";
92238
92242
  import { join as join29 } from "node:path";
@@ -93166,7 +93170,9 @@ async function waitForManagerExit(stateDirectory, signal) {
93166
93170
  }
93167
93171
  throw deadline.reason;
93168
93172
  }
93169
- async function ensureWorkingProcess(stateDirectory, version2, signal) {
93173
+ async function ensureWorkingProcess(stateDirectory, cliVersion, signal) {
93174
+ const current = await readCurrentDataVersion(readStateDirectory(), signal);
93175
+ const version2 = current !== null && (0, import_semver2.gt)(current, cliVersion) ? current : cliVersion;
93170
93176
  const launch = await prepareDaemonReleaseVersion(version2, signal);
93171
93177
  const deadline = AbortSignal.any([signal, AbortSignal.timeout(CONTROL_TIMEOUT_MILLISECONDS)]);
93172
93178
  await ensureManager(stateDirectory, launch, deadline);
@@ -93179,6 +93185,7 @@ async function ensureWorkingProcess(stateDirectory, version2, signal) {
93179
93185
  if (response.kind !== "status" || response.worker?.version !== version2) {
93180
93186
  throw new Error("The working daemon did not start");
93181
93187
  }
93188
+ return version2;
93182
93189
  }
93183
93190
  async function readWorkingProcessVersion(stateDirectory, signal) {
93184
93191
  try {
@@ -93254,10 +93261,14 @@ async function stopManager(stateDirectory, signal) {
93254
93261
  throw cause;
93255
93262
  }
93256
93263
  }
93264
+ var import_semver2;
93257
93265
  var init_manager_client = __esm({
93258
93266
  "src/daemon/lifecycle/manager-client.ts"() {
93259
93267
  "use strict";
93268
+ import_semver2 = __toESM(require_semver2(), 1);
93260
93269
  init_manager_lock();
93270
+ init_version_data();
93271
+ init_state_directory();
93261
93272
  init_node_error();
93262
93273
  init_local_client();
93263
93274
  init_protocol2();
@@ -102152,7 +102163,7 @@ async function runWorker(version2, signal) {
102152
102163
  async function runWorkerRuntime(version2, combined, shutdown, rejectionGuard) {
102153
102164
  const control = await openMobiusControlInstallation(combined, process.env);
102154
102165
  await prepareUpgradeData(control.stateDirectory, version2, combined);
102155
- const installation = await openMobiusCliInstallation(combined, process.env);
102166
+ const installation = await openMobiusVersionInstallation(version2, combined, process.env);
102156
102167
  const deadline = AbortSignal.any([combined, AbortSignal.timeout(15e3)]);
102157
102168
  let release = null;
102158
102169
  while (release === null) {
@@ -102324,11 +102335,7 @@ function registerUpgradeCommand(program2, context) {
102324
102335
  program2.command("upgrade").description("start the daemon if needed and upgrade it to the newest npm release").action(async () => {
102325
102336
  const signal = context.shutdownSignal;
102326
102337
  const control = await openMobiusControlInstallation(signal, process.env);
102327
- const running = await readWorkingProcessVersion(control.stateDirectory, signal);
102328
- const current = running ?? context.version;
102329
- if (running === null) {
102330
- await ensureWorkingProcess(control.stateDirectory, context.version, signal);
102331
- }
102338
+ const current = await readWorkingProcessVersion(control.stateDirectory, signal) ?? await ensureWorkingProcess(control.stateDirectory, context.version, signal);
102332
102339
  await reloadDaemon(control.stateDirectory, signal);
102333
102340
  const attempt = await requestDaemonReleaseUpgrade(control.stateDirectory, current, signal);
102334
102341
  if (attempt.kind === "current") {
@@ -102804,9 +102811,9 @@ var init_cli = __esm({
102804
102811
  });
102805
102812
 
102806
102813
  // src/cli/entrypoint.ts
102807
- var import_semver2 = __toESM(require_semver2(), 1);
102814
+ var import_semver3 = __toESM(require_semver2(), 1);
102808
102815
  init_package();
102809
- if (!(0, import_semver2.satisfies)(process.versions.node, package_default.engines.node)) {
102816
+ if (!(0, import_semver3.satisfies)(process.versions.node, package_default.engines.node)) {
102810
102817
  process.stderr.write(
102811
102818
  `Mobius requires Node.js ${package_default.engines.node}; found ${process.versions.node} at ${process.execPath}. Update Node.js and reinstall Mobius.
102812
102819
  `