@moxt-ai/mobius 0.0.303 → 0.0.305

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
@@ -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.303",
2089
+ version: "0.0.305",
2090
2090
  description: "Mobius CLI for pairing and running local AI agent services.",
2091
2091
  type: "module",
2092
2092
  bin: {
@@ -41914,14 +41914,14 @@ function unreachable(value, logger = console) {
41914
41914
  async function withDeadline(signal, timeoutMilliseconds, operation) {
41915
41915
  const deadline = AbortSignal.any([signal, AbortSignal.timeout(timeoutMilliseconds)]);
41916
41916
  deadline.throwIfAborted();
41917
- return await new Promise((resolve20, reject2) => {
41917
+ return await new Promise((resolve19, reject2) => {
41918
41918
  const settle2 = (callback) => {
41919
41919
  deadline.removeEventListener("abort", onAbort);
41920
41920
  callback();
41921
41921
  };
41922
41922
  const onAbort = () => settle2(() => reject2(deadline.reason));
41923
41923
  deadline.addEventListener("abort", onAbort, { once: true });
41924
- operation().then((value) => settle2(() => resolve20(value)), (error62) => settle2(() => reject2(error62)));
41924
+ operation().then((value) => settle2(() => resolve19(value)), (error62) => settle2(() => reject2(error62)));
41925
41925
  });
41926
41926
  }
41927
41927
  function withEnvironment(environment, operation) {
@@ -41948,11 +41948,11 @@ var init_utils = __esm({
41948
41948
  done = false;
41949
41949
  push(item) {
41950
41950
  if (this.resolvers.length > 0) {
41951
- const resolve20 = this.resolvers.shift();
41952
- if (resolve20 === void 0) {
41951
+ const resolve19 = this.resolvers.shift();
41952
+ if (resolve19 === void 0) {
41953
41953
  return;
41954
41954
  }
41955
- resolve20({ value: item, done: false });
41955
+ resolve19({ value: item, done: false });
41956
41956
  } else {
41957
41957
  this.queue.push(item);
41958
41958
  }
@@ -41960,8 +41960,8 @@ var init_utils = __esm({
41960
41960
  end() {
41961
41961
  this.done = true;
41962
41962
  while (this.resolvers.length > 0) {
41963
- const resolve20 = this.resolvers.shift();
41964
- resolve20?.({ done: true, value: void 0 });
41963
+ const resolve19 = this.resolvers.shift();
41964
+ resolve19?.({ done: true, value: void 0 });
41965
41965
  }
41966
41966
  }
41967
41967
  [Symbol.asyncIterator]() {
@@ -41977,8 +41977,8 @@ var init_utils = __esm({
41977
41977
  if (this.done) {
41978
41978
  return Promise.resolve({ done: true, value: void 0 });
41979
41979
  }
41980
- return new Promise((resolve20) => {
41981
- this.resolvers.push(resolve20);
41980
+ return new Promise((resolve19) => {
41981
+ this.resolvers.push(resolve19);
41982
41982
  });
41983
41983
  }
41984
41984
  };
@@ -47450,7 +47450,7 @@ function isRef(value) {
47450
47450
  function cloneIssues(issues) {
47451
47451
  return issues.map((iss) => iss.path ? { ...iss, path: iss.path.slice() } : { ...iss });
47452
47452
  }
47453
- function isRecursive(inst, stack, resolve20) {
47453
+ function isRecursive(inst, stack, resolve19) {
47454
47454
  const cached2 = recursive.get(inst);
47455
47455
  if (cached2 !== void 0)
47456
47456
  return cached2 ? PROVEN : NONE;
@@ -47460,7 +47460,7 @@ function isRecursive(inst, stack, resolve20) {
47460
47460
  let result = NONE;
47461
47461
  const check2 = (child) => {
47462
47462
  if (result !== PROVEN && child?._zod) {
47463
- const answer = isRecursive(child, stack, resolve20);
47463
+ const answer = isRecursive(child, stack, resolve19);
47464
47464
  if (answer > result)
47465
47465
  result = answer;
47466
47466
  }
@@ -47471,7 +47471,7 @@ function isRecursive(inst, stack, resolve20) {
47471
47471
  const desc2 = Object.getOwnPropertyDescriptor(sh, key);
47472
47472
  if (spread && !desc2.enumerable)
47473
47473
  continue;
47474
- const child = desc2.get ? ASSUMED : desc2.value?._zod ? isRecursive(desc2.value, stack, resolve20) : NONE;
47474
+ const child = desc2.get ? ASSUMED : desc2.value?._zod ? isRecursive(desc2.value, stack, resolve19) : NONE;
47475
47475
  if (child > answer)
47476
47476
  answer = child;
47477
47477
  }
@@ -47535,7 +47535,7 @@ function isRecursive(inst, stack, resolve20) {
47535
47535
  break;
47536
47536
  // `$ZodLazy` caches its inner on the def, so a resolved edge is followed exactly
47537
47537
  case "lazy": {
47538
- const inner = def._cachedInner ?? (resolve20 ? inst._zod.innerType : void 0);
47538
+ const inner = def._cachedInner ?? (resolve19 ? inst._zod.innerType : void 0);
47539
47539
  merge2(inner ? isRecursive(inner, stack, false) : ASSUMED);
47540
47540
  break;
47541
47541
  }
@@ -65138,14 +65138,14 @@ function waitUnlessAborted(milliseconds, signal) {
65138
65138
  if (signal.aborted) {
65139
65139
  return Promise.resolve(false);
65140
65140
  }
65141
- return new Promise((resolve20) => {
65141
+ return new Promise((resolve19) => {
65142
65142
  const timer = setTimeout(() => {
65143
65143
  signal.removeEventListener("abort", onAbort);
65144
- resolve20(true);
65144
+ resolve19(true);
65145
65145
  }, milliseconds);
65146
65146
  const onAbort = () => {
65147
65147
  clearTimeout(timer);
65148
- resolve20(false);
65148
+ resolve19(false);
65149
65149
  };
65150
65150
  signal.addEventListener("abort", onAbort, { once: true });
65151
65151
  });
@@ -65329,7 +65329,7 @@ function stripLocalCommandMetadata(content) {
65329
65329
  return kept;
65330
65330
  }
65331
65331
  function raceWithAbort(operation, signal) {
65332
- return new Promise((resolve20, reject2) => {
65332
+ return new Promise((resolve19, reject2) => {
65333
65333
  const cleanup = () => signal.removeEventListener("abort", onAbort);
65334
65334
  const onAbort = () => {
65335
65335
  cleanup();
@@ -65341,7 +65341,7 @@ function raceWithAbort(operation, signal) {
65341
65341
  }
65342
65342
  void operation.then((value) => {
65343
65343
  cleanup();
65344
- resolve20(value);
65344
+ resolve19(value);
65345
65345
  }, (error62) => {
65346
65346
  cleanup();
65347
65347
  reject2(error62);
@@ -67250,12 +67250,12 @@ var init_acp_agent = __esm({
67250
67250
  }
67251
67251
  };
67252
67252
  let completeTurn;
67253
- turn.completion = new Promise((resolve20) => {
67254
- completeTurn = resolve20;
67253
+ turn.completion = new Promise((resolve19) => {
67254
+ completeTurn = resolve19;
67255
67255
  });
67256
- const response = new Promise((resolve20, reject2) => {
67256
+ const response = new Promise((resolve19, reject2) => {
67257
67257
  turn.resolve = (result) => {
67258
- resolve20(result);
67258
+ resolve19(result);
67259
67259
  completeTurn();
67260
67260
  };
67261
67261
  turn.reject = (error62) => {
@@ -67654,8 +67654,8 @@ var init_acp_agent = __esm({
67654
67654
  pendingNext ??= session.query.next().then((result) => ({ kind: "message", result }));
67655
67655
  const nextMessage = pendingNext;
67656
67656
  let onAbort;
67657
- const abortRace = new Promise((resolve20) => {
67658
- onAbort = () => resolve20("abort");
67657
+ const abortRace = new Promise((resolve19) => {
67658
+ onAbort = () => resolve19("abort");
67659
67659
  cancelController.signal.addEventListener("abort", onAbort, { once: true });
67660
67660
  });
67661
67661
  const raced = await Promise.race([nextMessage, abortRace]);
@@ -76147,10 +76147,10 @@ var init_process = __esm({
76147
76147
  shell: shouldUseShellForPiCommand(cmd)
76148
76148
  });
76149
76149
  try {
76150
- await new Promise((resolve20, reject2) => {
76150
+ await new Promise((resolve19, reject2) => {
76151
76151
  const onSpawn = () => {
76152
76152
  cleanup();
76153
- resolve20();
76153
+ resolve19();
76154
76154
  };
76155
76155
  const onError = (err) => {
76156
76156
  cleanup();
@@ -76352,7 +76352,7 @@ var init_process = __esm({
76352
76352
  const timeoutMs = opts?.timeoutMs;
76353
76353
  const line = `${JSON.stringify(withId)}
76354
76354
  `;
76355
- return new Promise((resolve20, reject2) => {
76355
+ return new Promise((resolve19, reject2) => {
76356
76356
  const signal = opts?.signal;
76357
76357
  if (signal?.aborted === true) {
76358
76358
  reject2(signal.reason);
@@ -76374,7 +76374,7 @@ var init_process = __esm({
76374
76374
  this.pending.set(id, {
76375
76375
  resolve: (res) => {
76376
76376
  drop();
76377
- resolve20(res);
76377
+ resolve19(res);
76378
76378
  },
76379
76379
  reject: (error62) => {
76380
76380
  drop();
@@ -76407,14 +76407,14 @@ var init_process = __esm({
76407
76407
  });
76408
76408
  }
76409
76409
  writeLine(line) {
76410
- return new Promise((resolve20, reject2) => {
76410
+ return new Promise((resolve19, reject2) => {
76411
76411
  try {
76412
76412
  this.child.stdin.write(line, (error62) => {
76413
76413
  if (error62) {
76414
76414
  reject2(error62);
76415
76415
  return;
76416
76416
  }
76417
- resolve20();
76417
+ resolve19();
76418
76418
  });
76419
76419
  } catch (error62) {
76420
76420
  reject2(error62);
@@ -77779,8 +77779,8 @@ var init_session = __esm({
77779
77779
  }
77780
77780
  async prompt(message, images = []) {
77781
77781
  const expandedMessage = expandSlashCommand(message, this.fileCommands);
77782
- const turnPromise = new Promise((resolve20, reject2) => {
77783
- const queued = { message: expandedMessage, images, resolve: resolve20, reject: reject2 };
77782
+ const turnPromise = new Promise((resolve19, reject2) => {
77783
+ const queued = { message: expandedMessage, images, resolve: resolve19, reject: reject2 };
77784
77784
  if (this.pendingTurn) {
77785
77785
  this.turnQueue.push(queued);
77786
77786
  this.emit({
@@ -82246,7 +82246,7 @@ function controlSocketPath(stateDirectory, endpoint = "manager") {
82246
82246
  }
82247
82247
  async function readSocketMessage(socket, signal) {
82248
82248
  signal.throwIfAborted();
82249
- return await new Promise((resolve20, reject2) => {
82249
+ return await new Promise((resolve19, reject2) => {
82250
82250
  let encoded = "";
82251
82251
  const finish = (error62, value) => {
82252
82252
  signal.removeEventListener("abort", abort);
@@ -82254,7 +82254,7 @@ async function readSocketMessage(socket, signal) {
82254
82254
  socket.removeAllListeners("error");
82255
82255
  socket.removeAllListeners("end");
82256
82256
  if (error62 === void 0) {
82257
- resolve20(value);
82257
+ resolve19(value);
82258
82258
  } else {
82259
82259
  reject2(error62);
82260
82260
  }
@@ -82290,14 +82290,14 @@ async function sendLocalRequest(stateDirectory, endpoint, command, signal) {
82290
82290
  deadline.throwIfAborted();
82291
82291
  const socket = createConnection(controlSocketPath(stateDirectory, endpoint));
82292
82292
  try {
82293
- await new Promise((resolve20, reject2) => {
82293
+ await new Promise((resolve19, reject2) => {
82294
82294
  const abort = () => {
82295
82295
  socket.destroy();
82296
82296
  reject2(deadline.reason);
82297
82297
  };
82298
82298
  socket.once("connect", () => {
82299
82299
  deadline.removeEventListener("abort", abort);
82300
- resolve20();
82300
+ resolve19();
82301
82301
  });
82302
82302
  socket.once("error", reject2);
82303
82303
  deadline.addEventListener("abort", abort, { once: true });
@@ -82966,21 +82966,21 @@ async function serveLocalControl(stateDirectory, endpoint, signal, handle, onLis
82966
82966
  });
82967
82967
  try {
82968
82968
  await platform2.prepareControlSocket(path8);
82969
- await new Promise((resolve20, reject2) => {
82970
- server.once("listening", resolve20);
82969
+ await new Promise((resolve19, reject2) => {
82970
+ server.once("listening", resolve19);
82971
82971
  server.once("error", reject2);
82972
82972
  server.listen(path8);
82973
82973
  });
82974
82974
  await platform2.secureControlSocket(path8);
82975
82975
  await onListening();
82976
82976
  if (!signal.aborted) {
82977
- await new Promise((resolve20) => signal.addEventListener("abort", () => resolve20(), { once: true }));
82977
+ await new Promise((resolve19) => signal.addEventListener("abort", () => resolve19(), { once: true }));
82978
82978
  }
82979
82979
  } finally {
82980
82980
  for (const socket of sockets) {
82981
82981
  socket.destroy();
82982
82982
  }
82983
- await new Promise((resolve20) => server.close(() => resolve20()));
82983
+ await new Promise((resolve19) => server.close(() => resolve19()));
82984
82984
  await Promise.allSettled(requests);
82985
82985
  await platform2.removeControlSocket(path8).catch(() => void 0);
82986
82986
  }
@@ -83323,18 +83323,7 @@ var init_worker_lifecycle_log = __esm({
83323
83323
 
83324
83324
  // src/daemon/lifecycle/worker-process.ts
83325
83325
  import { spawn as spawn7 } from "node:child_process";
83326
- import { isAbsolute as isAbsolute13, resolve as resolve16 } from "node:path";
83327
- function currentWorkerLaunch(version2) {
83328
- const entry = process.argv[1];
83329
- if (entry === void 0 || entry.length === 0) {
83330
- throw new Error("The Mobius CLI entry path is unavailable");
83331
- }
83332
- return {
83333
- executable: process.execPath,
83334
- entry: resolve16(entry),
83335
- version: version2
83336
- };
83337
- }
83326
+ import { isAbsolute as isAbsolute13 } from "node:path";
83338
83327
  async function decodeWorkerLaunch(value) {
83339
83328
  const { entry, executable, version: version2 } = workerLaunch.parse(value);
83340
83329
  if (!isAbsolute13(entry) || !isAbsolute13(executable)) {
@@ -83514,6 +83503,7 @@ async function runManager(stateDirectory, signal) {
83514
83503
  const shutdown = new AbortController();
83515
83504
  const combined = AbortSignal.any([signal, shutdown.signal]);
83516
83505
  const lifecycle = new WorkerLifecycleLog(stateDirectory);
83506
+ const workerExits = /* @__PURE__ */ new Set();
83517
83507
  let worker;
83518
83508
  let switchState = null;
83519
83509
  let queue = Promise.resolve();
@@ -83548,7 +83538,7 @@ async function runManager(stateDirectory, signal) {
83548
83538
  if (pid !== null) {
83549
83539
  lifecycle.ready(pid, launch.version);
83550
83540
  }
83551
- void replacement.exited.then(async () => {
83541
+ const exited = replacement.exited.then(async () => {
83552
83542
  await replacement.streamsSettled;
83553
83543
  if (pid !== null) {
83554
83544
  lifecycle.exited(pid, launch.version, replacement.exit, replacement.stderr);
@@ -83571,6 +83561,8 @@ async function runManager(stateDirectory, signal) {
83571
83561
  }
83572
83562
  }
83573
83563
  });
83564
+ workerExits.add(exited);
83565
+ void exited.finally(() => workerExits.delete(exited));
83574
83566
  };
83575
83567
  const switchWorker = async (transition2) => {
83576
83568
  try {
@@ -83649,7 +83641,7 @@ async function runManager(stateDirectory, signal) {
83649
83641
  }
83650
83642
  case "ensure": {
83651
83643
  const launch = await decodeWorkerLaunch(command.launch);
83652
- if (!worker?.running || worker.launch.version !== launch.version) {
83644
+ if (!worker?.running || worker.launch.version !== launch.version || worker.launch.entry !== launch.entry || worker.launch.executable !== launch.executable) {
83653
83645
  await start(launch);
83654
83646
  }
83655
83647
  await worker?.ready;
@@ -83683,6 +83675,7 @@ async function runManager(stateDirectory, signal) {
83683
83675
  shutdown.abort();
83684
83676
  await queue;
83685
83677
  await worker?.close();
83678
+ await Promise.all(workerExits);
83686
83679
  rejectionGuard.release();
83687
83680
  await release();
83688
83681
  }
@@ -83714,10 +83707,191 @@ var init_manager2 = __esm({
83714
83707
  }
83715
83708
  });
83716
83709
 
83710
+ // src/storage/daemon/release-files.ts
83711
+ import { readFile as readFile10, realpath as realpath8 } from "node:fs/promises";
83712
+ import { join as join28 } from "node:path";
83713
+ function releasePrefix(version2) {
83714
+ return join28(readStateDirectory(), "npm", version2);
83715
+ }
83716
+ async function readInstalledRelease(prefix) {
83717
+ const packageRoot = await realpath8(join28(prefix, "node_modules", "@moxt-ai", "mobius"));
83718
+ return { manifest: await readFile10(join28(packageRoot, "package.json"), "utf8"), packageRoot };
83719
+ }
83720
+ var init_release_files = __esm({
83721
+ "src/storage/daemon/release-files.ts"() {
83722
+ "use strict";
83723
+ init_state_directory();
83724
+ }
83725
+ });
83726
+
83727
+ // src/daemon/upgrades/package.ts
83728
+ import { isAbsolute as isAbsolute14, join as join29, relative as relative3 } from "node:path";
83729
+ async function prepareDaemonReleaseVersion(version2, signal) {
83730
+ runtimeUpgradeVersionSchema.parse(version2);
83731
+ signal.throwIfAborted();
83732
+ const prefix = releasePrefix(version2);
83733
+ let installed;
83734
+ try {
83735
+ installed = await readInstalledRelease(prefix);
83736
+ } catch (cause) {
83737
+ signal.throwIfAborted();
83738
+ if (!isNodeError(cause, "ENOENT")) {
83739
+ throw new DaemonReleaseUpgradeError(
83740
+ "release_read_failed",
83741
+ "The installed Mobius release could not be read",
83742
+ { cause }
83743
+ );
83744
+ }
83745
+ return await installDaemonReleaseVersion(version2, signal);
83746
+ }
83747
+ try {
83748
+ return await verifyInstalledDaemonRelease(installed, prefix, version2, signal);
83749
+ } catch (cause) {
83750
+ signal.throwIfAborted();
83751
+ if (cause instanceof DaemonReleaseUpgradeError) {
83752
+ throw cause;
83753
+ }
83754
+ throw new DaemonReleaseUpgradeError("release_invalid", "The installed Mobius release could not be verified", {
83755
+ cause
83756
+ });
83757
+ }
83758
+ }
83759
+ async function installDaemonReleaseVersion(version2, signal) {
83760
+ runtimeUpgradeVersionSchema.parse(version2);
83761
+ const npm = await findExecutableOnPath("npm", process.env);
83762
+ if (npm === null) {
83763
+ throw new DaemonReleaseUpgradeError("npm_unavailable", "npm is required to download the new daemon");
83764
+ }
83765
+ const prefix = releasePrefix(version2);
83766
+ await ensurePrivateDirectory(prefix);
83767
+ try {
83768
+ await validateLocalPath(prefix, true, true, signal);
83769
+ await runBoundedProcess({
83770
+ command: npm.path,
83771
+ arguments: [
83772
+ "install",
83773
+ "--prefix",
83774
+ prefix,
83775
+ "--ignore-scripts",
83776
+ "--no-audit",
83777
+ "--no-fund",
83778
+ "--save-exact",
83779
+ "--",
83780
+ `@moxt-ai/mobius@${version2}`
83781
+ ],
83782
+ cwd: prefix,
83783
+ environment: process.env,
83784
+ signal,
83785
+ timeoutMilliseconds: 3e5,
83786
+ outputLimitBytes: 64 * 1024
83787
+ });
83788
+ return await verifyInstalledDaemonRelease(await readInstalledRelease(prefix), prefix, version2, signal);
83789
+ } catch (cause) {
83790
+ signal.throwIfAborted();
83791
+ if (cause instanceof DaemonReleaseUpgradeError) {
83792
+ throw cause;
83793
+ }
83794
+ throw new DaemonReleaseUpgradeError(
83795
+ "npm_install_failed",
83796
+ "npm could not install and verify the requested Mobius version",
83797
+ { cause }
83798
+ );
83799
+ }
83800
+ }
83801
+ async function verifyInstalledDaemonRelease(installed, prefix, version2, signal) {
83802
+ await validateLocalPath(prefix, true, true, signal);
83803
+ const metadata = external_exports.object({
83804
+ name: external_exports.literal("@moxt-ai/mobius"),
83805
+ version: external_exports.literal(version2),
83806
+ bin: external_exports.object({ mobius: external_exports.literal("dist/cli.js") }),
83807
+ engines: external_exports.object({ node: external_exports.string().refine((value) => (0, import_semver.validRange)(value) !== null) })
83808
+ }).parse(JSON.parse(installed.manifest));
83809
+ const entry = await canonicalPath(join29(installed.packageRoot, metadata.bin.mobius));
83810
+ const resolved = relative3(await canonicalPath(prefix), entry);
83811
+ if (resolved.startsWith("..") || isAbsolute14(resolved)) {
83812
+ throw new Error("Installed entry escaped npm prefix");
83813
+ }
83814
+ if (!(0, import_semver.satisfies)(process.versions.node, metadata.engines.node)) {
83815
+ throw new DaemonReleaseUpgradeError(
83816
+ "node_incompatible",
83817
+ `Mobius ${version2} requires Node.js ${metadata.engines.node}; the running daemon uses ${process.versions.node} at ${process.execPath}. Update Node.js before retrying.`
83818
+ );
83819
+ }
83820
+ try {
83821
+ const result = await runBoundedProcess({
83822
+ command: process.execPath,
83823
+ arguments: [entry, "--version"],
83824
+ cwd: prefix,
83825
+ environment: process.env,
83826
+ signal,
83827
+ timeoutMilliseconds: 3e4,
83828
+ outputLimitBytes: 16 * 1024
83829
+ });
83830
+ if (!result.stdout.split(/\r?\n/u).includes(`CLI: ${version2}`)) {
83831
+ throw new Error("Candidate did not report the requested CLI version");
83832
+ }
83833
+ } catch (cause) {
83834
+ signal.throwIfAborted();
83835
+ throw new DaemonReleaseUpgradeError(
83836
+ "release_startup_failed",
83837
+ `Mobius ${version2} startup check failed; the current daemon is unchanged.`,
83838
+ { cause }
83839
+ );
83840
+ }
83841
+ return await decodeWorkerLaunch({ executable: process.execPath, entry, version: version2 });
83842
+ }
83843
+ async function findNewDaemonReleaseVersion(currentVersion, signal) {
83844
+ const npm = await findExecutableOnPath("npm", process.env);
83845
+ if (npm === null) {
83846
+ throw new DaemonReleaseUpgradeError("npm_unavailable", "npm is required to check for a new daemon");
83847
+ }
83848
+ try {
83849
+ const result = await runBoundedProcess({
83850
+ command: npm.path,
83851
+ arguments: ["view", "@moxt-ai/mobius", "dist-tags.latest", "--json", "--prefer-online"],
83852
+ cwd: process.cwd(),
83853
+ environment: process.env,
83854
+ signal,
83855
+ timeoutMilliseconds: 3e4,
83856
+ outputLimitBytes: 4096
83857
+ });
83858
+ const version2 = npmViewVersionSchema.parse(JSON.parse(result.stdout));
83859
+ return (0, import_semver.gt)(version2, currentVersion) ? version2 : null;
83860
+ } catch (cause) {
83861
+ signal.throwIfAborted();
83862
+ throw new DaemonReleaseUpgradeError("npm_check_failed", "npm could not return a valid latest Mobius version", {
83863
+ cause
83864
+ });
83865
+ }
83866
+ }
83867
+ var import_semver, DaemonReleaseUpgradeError, npmViewVersionSchema;
83868
+ var init_package2 = __esm({
83869
+ "src/daemon/upgrades/package.ts"() {
83870
+ "use strict";
83871
+ init_protocol();
83872
+ import_semver = __toESM(require_semver2(), 1);
83873
+ init_zod();
83874
+ init_release_files();
83875
+ init_local_files();
83876
+ init_private_path();
83877
+ init_node_error();
83878
+ init_executable();
83879
+ init_worker_process();
83880
+ DaemonReleaseUpgradeError = class extends Error {
83881
+ code;
83882
+ constructor(code, message, options) {
83883
+ super(message, options);
83884
+ this.code = code;
83885
+ }
83886
+ };
83887
+ npmViewVersionSchema = external_exports.union([runtimeUpgradeVersionSchema, external_exports.tuple([runtimeUpgradeVersionSchema])]).transform((value) => typeof value === "string" ? value : value[0]);
83888
+ }
83889
+ });
83890
+
83717
83891
  // src/daemon/lifecycle/manager-client.ts
83718
83892
  import { spawn as spawn8 } from "node:child_process";
83719
- async function spawnManager() {
83720
- const child = spawn8(process.execPath, [process.argv[1] ?? "", "__manager"], {
83893
+ async function spawnManager(launch) {
83894
+ const child = spawn8(launch.executable, [launch.entry, "__manager"], {
83721
83895
  detached: true,
83722
83896
  windowsHide: true,
83723
83897
  env: process.env,
@@ -83726,10 +83900,10 @@ async function spawnManager() {
83726
83900
  child.unref();
83727
83901
  return child;
83728
83902
  }
83729
- async function launchManager(managerVersion) {
83730
- process.stdout.write(`Starting mobius daemon ${managerVersion}
83903
+ async function launchManager(launch) {
83904
+ process.stdout.write(`Starting mobius daemon ${launch.version}
83731
83905
  `);
83732
- await spawnManager();
83906
+ await spawnManager(launch);
83733
83907
  }
83734
83908
  async function waitForManagerExit(stateDirectory, signal) {
83735
83909
  const deadline = AbortSignal.any([signal, AbortSignal.timeout(3e4)]);
@@ -83737,13 +83911,13 @@ async function waitForManagerExit(stateDirectory, signal) {
83737
83911
  if (!await managerLockExists(stateDirectory)) {
83738
83912
  return;
83739
83913
  }
83740
- await new Promise((resolve20, reject2) => {
83914
+ await new Promise((resolve19, reject2) => {
83741
83915
  const timeout = setTimeout(finish, 20);
83742
83916
  const abort = () => finish(deadline.reason);
83743
83917
  function finish(cause) {
83744
83918
  clearTimeout(timeout);
83745
83919
  deadline.removeEventListener("abort", abort);
83746
- cause === void 0 ? resolve20() : reject2(cause);
83920
+ cause === void 0 ? resolve19() : reject2(cause);
83747
83921
  }
83748
83922
  deadline.addEventListener("abort", abort, { once: true });
83749
83923
  });
@@ -83751,15 +83925,11 @@ async function waitForManagerExit(stateDirectory, signal) {
83751
83925
  throw deadline.reason;
83752
83926
  }
83753
83927
  async function ensureWorkingProcess(stateDirectory, version2, signal) {
83928
+ const launch = await prepareDaemonReleaseVersion(version2, signal);
83754
83929
  const deadline = AbortSignal.any([signal, AbortSignal.timeout(CONTROL_TIMEOUT_MILLISECONDS)]);
83755
- await ensureManager(stateDirectory, version2, deadline);
83930
+ await ensureManager(stateDirectory, launch, deadline);
83756
83931
  const response = lifecycleResponse.parse(
83757
- await sendLocalRequest(
83758
- stateDirectory,
83759
- "manager",
83760
- { kind: "ensure", launch: currentWorkerLaunch(version2) },
83761
- deadline
83762
- )
83932
+ await sendLocalRequest(stateDirectory, "manager", { kind: "ensure", launch }, deadline)
83763
83933
  );
83764
83934
  if (response.kind === "error") {
83765
83935
  throw new Error(response.message);
@@ -83783,7 +83953,7 @@ async function readWorkingProcessVersion(stateDirectory, signal) {
83783
83953
  }
83784
83954
  return null;
83785
83955
  }
83786
- async function ensureManager(stateDirectory, managerVersion, signal) {
83956
+ async function ensureManager(stateDirectory, launch, signal) {
83787
83957
  let managerStarted = false;
83788
83958
  while (!signal.aborted) {
83789
83959
  try {
@@ -83792,29 +83962,29 @@ async function ensureManager(stateDirectory, managerVersion, signal) {
83792
83962
  );
83793
83963
  if (response.success && response.data.kind === "status") {
83794
83964
  if (managerStarted) {
83795
- process.stdout.write(`Mobius daemon ${managerVersion} started
83965
+ process.stdout.write(`Mobius daemon ${launch.version} started
83796
83966
  `);
83797
83967
  }
83798
83968
  return;
83799
83969
  }
83800
83970
  await stopManager(stateDirectory, signal);
83801
- await launchManager(managerVersion);
83971
+ await launchManager(launch);
83802
83972
  managerStarted = true;
83803
83973
  } catch (cause) {
83804
83974
  if (!isNodeError(cause, "ENOENT") && !isNodeError(cause, "ECONNREFUSED")) {
83805
83975
  throw cause;
83806
83976
  }
83807
83977
  if (!managerStarted) {
83808
- await launchManager(managerVersion);
83978
+ await launchManager(launch);
83809
83979
  managerStarted = true;
83810
83980
  }
83811
- await new Promise((resolve20, reject2) => {
83981
+ await new Promise((resolve19, reject2) => {
83812
83982
  const timeout = setTimeout(finish, 50);
83813
83983
  const abort = () => finish(signal.reason);
83814
83984
  function finish(cause2) {
83815
83985
  clearTimeout(timeout);
83816
83986
  signal.removeEventListener("abort", abort);
83817
- cause2 === void 0 ? resolve20() : reject2(cause2);
83987
+ cause2 === void 0 ? resolve19() : reject2(cause2);
83818
83988
  }
83819
83989
  signal.addEventListener("abort", abort, { once: true });
83820
83990
  });
@@ -83849,7 +84019,7 @@ var init_manager_client = __esm({
83849
84019
  init_node_error();
83850
84020
  init_local_client();
83851
84021
  init_protocol2();
83852
- init_worker_process();
84022
+ init_package2();
83853
84023
  }
83854
84024
  });
83855
84025
 
@@ -83904,7 +84074,7 @@ var init_native_session = __esm({
83904
84074
  });
83905
84075
 
83906
84076
  // src/acp/content/raster.ts
83907
- import { basename as basename6, isAbsolute as isAbsolute14, normalize } from "node:path";
84077
+ import { basename as basename6, isAbsolute as isAbsolute15, normalize } from "node:path";
83908
84078
  import { fileURLToPath } from "node:url";
83909
84079
  function startsWith(bytes, signature, offset = 0) {
83910
84080
  if (bytes.byteLength < offset + signature.byteLength) {
@@ -83929,13 +84099,13 @@ function sniffRasterMime(bytes) {
83929
84099
  }
83930
84100
  async function resolveCanonicalPath(requested, signal) {
83931
84101
  signal.throwIfAborted();
83932
- if (!isAbsolute14(requested) || requested.includes("\0") || normalize(requested) !== requested) {
84102
+ if (!isAbsolute15(requested) || requested.includes("\0") || normalize(requested) !== requested) {
83933
84103
  return null;
83934
84104
  }
83935
84105
  try {
83936
84106
  const target = await canonicalPath(requested);
83937
84107
  signal.throwIfAborted();
83938
- if (!isAbsolute14(target) || normalize(target) !== target) {
84108
+ if (!isAbsolute15(target) || normalize(target) !== target) {
83939
84109
  return null;
83940
84110
  }
83941
84111
  return target;
@@ -83966,7 +84136,7 @@ function parseLocalImageUri(uri) {
83966
84136
  return null;
83967
84137
  }
83968
84138
  }
83969
- if (!isAbsolute14(trimmed) && /^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(trimmed)) {
84139
+ if (!isAbsolute15(trimmed) && /^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(trimmed)) {
83970
84140
  return null;
83971
84141
  }
83972
84142
  return trimmed;
@@ -86081,7 +86251,7 @@ function arrayOverlaps(column, values) {
86081
86251
  }
86082
86252
  return sql`${column} && ${bindIfParam(values, column)}`;
86083
86253
  }
86084
- var eq2, ne, gt2, gte2, lt2, lte2;
86254
+ var eq2, ne, gt3, gte2, lt2, lte2;
86085
86255
  var init_conditions = __esm({
86086
86256
  "../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.4_@cloudflare+workers-types@5.20261007.1_@types+better-sqlite3@7.6_b0c6d3ccc291c2479f0b2dd204176291/node_modules/drizzle-orm/sql/expressions/conditions.js"() {
86087
86257
  init_sql();
@@ -86094,7 +86264,7 @@ var init_conditions = __esm({
86094
86264
  ne = (left, right) => {
86095
86265
  return sql`${left} <> ${bindIfParam(right, left)}`;
86096
86266
  };
86097
- gt2 = (left, right) => {
86267
+ gt3 = (left, right) => {
86098
86268
  return sql`${left} > ${bindIfParam(right, left)}`;
86099
86269
  };
86100
86270
  gte2 = (left, right) => {
@@ -86977,7 +87147,7 @@ var init_relations = __esm({
86977
87147
  between,
86978
87148
  eq: eq2,
86979
87149
  exists,
86980
- gt: gt2,
87150
+ gt: gt3,
86981
87151
  gte: gte2,
86982
87152
  ilike,
86983
87153
  inArray,
@@ -91143,12 +91313,12 @@ var init_local_sqlite_database = __esm({
91143
91313
 
91144
91314
  // src/storage/sqlite/local-databases.ts
91145
91315
  import { createHash as createHash5 } from "node:crypto";
91146
- import { join as join28 } from "node:path";
91316
+ import { join as join30 } from "node:path";
91147
91317
  function channelSessionDatabasePaths(stateDirectory, channelId) {
91148
91318
  const channelHash = createHash5("sha256").update(channelId).digest("hex");
91149
91319
  return {
91150
- events: join28(stateDirectory, "sessions", `${channelHash}.events.sqlite`),
91151
- sessions: join28(stateDirectory, "sessions", `${channelHash}.sqlite`)
91320
+ events: join30(stateDirectory, "sessions", `${channelHash}.events.sqlite`),
91321
+ sessions: join30(stateDirectory, "sessions", `${channelHash}.sqlite`)
91152
91322
  };
91153
91323
  }
91154
91324
  var openAcpSessionDatabase, openSessionEventCacheDatabase;
@@ -91169,8 +91339,8 @@ var init_local_databases = __esm({
91169
91339
 
91170
91340
  // src/storage/files/scratch-directory.ts
91171
91341
  import { randomUUID as randomUUID11 } from "node:crypto";
91172
- import { lstat as lstat6, mkdir as mkdir5, readdir as readdir7, realpath as realpath8, rename as rename5, rm as rm4, stat as stat7, utimes, writeFile as writeFile5 } from "node:fs/promises";
91173
- import { dirname as dirname10, join as join29 } from "node:path";
91342
+ import { lstat as lstat6, mkdir as mkdir5, readdir as readdir7, realpath as realpath9, rename as rename5, rm as rm4, stat as stat7, utimes, writeFile as writeFile5 } from "node:fs/promises";
91343
+ import { dirname as dirname10, join as join31 } from "node:path";
91174
91344
  async function atomicWrite(path8, bytes, signal) {
91175
91345
  const temporary = `${path8}.${randomUUID11()}.tmp`;
91176
91346
  try {
@@ -91188,7 +91358,7 @@ var init_scratch_directory = __esm({
91188
91358
  ScratchDirectory = class {
91189
91359
  #root;
91190
91360
  constructor(parent) {
91191
- this.#root = join29(parent, randomUUID11());
91361
+ this.#root = join31(parent, randomUUID11());
91192
91362
  }
91193
91363
  /** Refreshes this directory's lease and removes sibling directories whose lease is older than `leaseMilliseconds`. */
91194
91364
  refreshLease = async (leaseMilliseconds) => {
@@ -91199,7 +91369,7 @@ var init_scratch_directory = __esm({
91199
91369
  if (!directory.isDirectory() || !/^[a-f0-9-]{36}$/u.test(directory.name)) {
91200
91370
  continue;
91201
91371
  }
91202
- const path8 = join29(dirname10(this.#root), directory.name);
91372
+ const path8 = join31(dirname10(this.#root), directory.name);
91203
91373
  if (path8 === this.#root) {
91204
91374
  continue;
91205
91375
  }
@@ -91214,10 +91384,10 @@ var init_scratch_directory = __esm({
91214
91384
  };
91215
91385
  /** Writes `bytes` atomically to `<group>/<name>` with owner-only permissions and returns the path. */
91216
91386
  write = async (group, name2, bytes, signal) => {
91217
- const directory = join29(this.#root, group);
91387
+ const directory = join31(this.#root, group);
91218
91388
  await mkdir5(directory, { mode: 448, recursive: true });
91219
91389
  signal.throwIfAborted();
91220
- const path8 = join29(directory, name2);
91390
+ const path8 = join31(directory, name2);
91221
91391
  await atomicWrite(path8, bytes, signal);
91222
91392
  return path8;
91223
91393
  };
@@ -91228,8 +91398,8 @@ var init_scratch_directory = __esm({
91228
91398
  resolveFile = async (path8) => {
91229
91399
  try {
91230
91400
  const [resolvedDirectory, resolvedPath, file2] = await Promise.all([
91231
- realpath8(dirname10(path8)),
91232
- realpath8(path8),
91401
+ realpath9(dirname10(path8)),
91402
+ realpath9(path8),
91233
91403
  lstat6(path8)
91234
91404
  ]);
91235
91405
  return file2.isFile() && !file2.isSymbolicLink() && dirname10(resolvedPath) === resolvedDirectory ? resolvedPath : null;
@@ -91246,7 +91416,7 @@ var init_scratch_directory = __esm({
91246
91416
 
91247
91417
  // src/session/content/external-content-store.ts
91248
91418
  import { createHash as createHash6 } from "node:crypto";
91249
- import { join as join30 } from "node:path";
91419
+ import { join as join32 } from "node:path";
91250
91420
  var contentRequest, CONTENT_LIFETIME_MILLISECONDS, metadataSchema, LocalExternalContentStore;
91251
91421
  var init_external_content_store = __esm({
91252
91422
  "src/session/content/external-content-store.ts"() {
@@ -91268,7 +91438,7 @@ var init_external_content_store = __esm({
91268
91438
  #expirationTimer;
91269
91439
  #cleanup = Promise.resolve();
91270
91440
  constructor(stateDirectory) {
91271
- this.#scratch = new ScratchDirectory(join30(stateDirectory, "tmp", "session-content"));
91441
+ this.#scratch = new ScratchDirectory(join32(stateDirectory, "tmp", "session-content"));
91272
91442
  this.#expirationTimer = setInterval(() => {
91273
91443
  void this.#expire().catch(() => void 0);
91274
91444
  }, 6e4);
@@ -91462,10 +91632,10 @@ var init_session_event_history_projection = __esm({
91462
91632
  SessionEventHistoryProjection = class {
91463
91633
  #toolCallEventIds = /* @__PURE__ */ new Map();
91464
91634
  #latestEvent = null;
91465
- apply = (liveEvent2, resolve20) => {
91635
+ apply = (liveEvent2, resolve19) => {
91466
91636
  if (liveEvent2.type === "acp" && liveEvent2.payload.sessionUpdate === "tool_call_update") {
91467
91637
  const targetEventId = this.#toolCallEventIds.get(liveEvent2.payload.toolCallId);
91468
- const current = targetEventId === void 0 ? void 0 : resolve20([targetEventId]).get(targetEventId);
91638
+ const current = targetEventId === void 0 ? void 0 : resolve19([targetEventId]).get(targetEventId);
91469
91639
  if (current?.type === "acp" && (current.payload.sessionUpdate === "tool_call" || current.payload.sessionUpdate === "tool_call_update")) {
91470
91640
  return this.#replace(
91471
91641
  current,
@@ -91489,12 +91659,12 @@ var init_session_event_history_projection = __esm({
91489
91659
  * The projected tool call announced with this identifier, in its current
91490
91660
  * merged form, or `undefined` when the projection has not recorded one.
91491
91661
  */
91492
- getToolCall = (toolCallId, resolve20) => {
91662
+ getToolCall = (toolCallId, resolve19) => {
91493
91663
  const eventId = this.#toolCallEventIds.get(toolCallId);
91494
91664
  if (eventId === void 0) {
91495
91665
  return void 0;
91496
91666
  }
91497
- const event = resolve20([eventId]).get(eventId);
91667
+ const event = resolve19([eventId]).get(eventId);
91498
91668
  if (event?.type === "acp" && (event.payload.sessionUpdate === "tool_call" || event.payload.sessionUpdate === "tool_call_update")) {
91499
91669
  return event.payload;
91500
91670
  }
@@ -91589,8 +91759,8 @@ var init_session_event_store = __esm({
91589
91759
  this.sessionGenerationId = sessionGenerationId;
91590
91760
  this.#projection = new SessionEventHistoryProjection();
91591
91761
  }
91592
- apply = (event, resolve20) => {
91593
- const projected = this.#projection.apply(event, resolve20);
91762
+ apply = (event, resolve19) => {
91763
+ const projected = this.#projection.apply(event, resolve19);
91594
91764
  this.#throughPosition = event.position;
91595
91765
  if (projected.kind === "replace") {
91596
91766
  const current = this.#cachedItemsByEventId.get(projected.replacedEventId);
@@ -91612,7 +91782,7 @@ var init_session_event_store = __esm({
91612
91782
  return this.#cachedItemsByEventId.size;
91613
91783
  }
91614
91784
  /** The projected tool call for this identifier, materializing it if needed. */
91615
- toolCall = (toolCallId, resolve20) => this.#projection.getToolCall(toolCallId, resolve20);
91785
+ toolCall = (toolCallId, resolve19) => this.#projection.getToolCall(toolCallId, resolve19);
91616
91786
  endIndex = (cursor) => {
91617
91787
  if (cursor === null) {
91618
91788
  return this.#eventIds.length;
@@ -92096,7 +92266,7 @@ function createWritableAcpStream(output2) {
92096
92266
  if (outputFailure !== void 0) {
92097
92267
  return Promise.reject(outputFailure);
92098
92268
  }
92099
- return new Promise((resolve20, reject2) => {
92269
+ return new Promise((resolve19, reject2) => {
92100
92270
  pendingWriteFailures.add(reject2);
92101
92271
  output2.write(chunk, (error62) => {
92102
92272
  pendingWriteFailures.delete(reject2);
@@ -92109,7 +92279,7 @@ function createWritableAcpStream(output2) {
92109
92279
  reject2(outputFailure);
92110
92280
  return;
92111
92281
  }
92112
- resolve20();
92282
+ resolve19();
92113
92283
  });
92114
92284
  });
92115
92285
  }
@@ -92161,12 +92331,12 @@ var init_agent_connection = __esm({
92161
92331
  stderr.on("data", (chunk) => {
92162
92332
  process.stderr.write(`[${agent.id}-acp] ${chunk}`);
92163
92333
  });
92164
- this.termination = new Promise((resolve20) => {
92334
+ this.termination = new Promise((resolve19) => {
92165
92335
  child.once("error", (cause) => {
92166
- resolve20({ kind: "failed", error: new AcpExecutionError("The ACP process could not run", { cause }) });
92336
+ resolve19({ kind: "failed", error: new AcpExecutionError("The ACP process could not run", { cause }) });
92167
92337
  });
92168
92338
  child.once("exit", (code, signal) => {
92169
- resolve20({
92339
+ resolve19({
92170
92340
  kind: "failed",
92171
92341
  error: new AcpExecutionError("The ACP process stopped", { cause: { code, signal } })
92172
92342
  });
@@ -96922,7 +97092,7 @@ var init_runtime_turn_activity = __esm({
96922
97092
  if (this.#admission.kind !== "open") {
96923
97093
  throw new Error("A daemon upgrade already owns admission");
96924
97094
  }
96925
- return new Promise((resolve20, reject2) => {
97095
+ return new Promise((resolve19, reject2) => {
96926
97096
  const abort = () => {
96927
97097
  this.#admission = { kind: "open" };
96928
97098
  signal.removeEventListener("abort", abort);
@@ -96931,7 +97101,7 @@ var init_runtime_turn_activity = __esm({
96931
97101
  const reserve = () => {
96932
97102
  this.#admission = { kind: "reserved" };
96933
97103
  signal.removeEventListener("abort", abort);
96934
- resolve20({
97104
+ resolve19({
96935
97105
  [Symbol.dispose]: () => {
96936
97106
  this.#admission = { kind: "open" };
96937
97107
  }
@@ -97063,7 +97233,7 @@ var init_session_execution = __esm({
97063
97233
  init_active_turn();
97064
97234
  waitForTurnCompletion = (turn, waitSignal) => {
97065
97235
  waitSignal.throwIfAborted();
97066
- return new Promise((resolve20, reject2) => {
97236
+ return new Promise((resolve19, reject2) => {
97067
97237
  let settled = false;
97068
97238
  const finish = (result) => {
97069
97239
  if (settled) {
@@ -97072,7 +97242,7 @@ var init_session_execution = __esm({
97072
97242
  settled = true;
97073
97243
  waitSignal.removeEventListener("abort", onAbort);
97074
97244
  if (result.kind === "completed") {
97075
- resolve20();
97245
+ resolve19();
97076
97246
  } else {
97077
97247
  reject2(result.error);
97078
97248
  }
@@ -97265,7 +97435,7 @@ var init_session_turns = __esm({
97265
97435
 
97266
97436
  // src/session/workspace/workspace-directory.ts
97267
97437
  import { homedir as homedir4 } from "node:os";
97268
- import { basename as basename7, dirname as dirname11, isAbsolute as isAbsolute15, join as join31, normalize as normalize2, relative as relative3 } from "node:path";
97438
+ import { basename as basename7, dirname as dirname11, isAbsolute as isAbsolute16, join as join33, normalize as normalize2, relative as relative4 } from "node:path";
97269
97439
  function encodePath(path8) {
97270
97440
  const encoded = Buffer.from(path8, "utf8").toString("base64url");
97271
97441
  if (path8.length === 0 || path8.length > MAX_WORKSPACE_PATH_LENGTH || encoded.length + "path-".length > MAX_DIRECTORY_IDENTIFIER_LENGTH) {
@@ -97328,7 +97498,7 @@ var init_workspace_directory = __esm({
97328
97498
  }
97329
97499
  if (id.startsWith("path-")) {
97330
97500
  const path8 = expandCurrentUserHome(decodePath(id, "path-"));
97331
- if (isAbsolute15(path8)) {
97501
+ if (isAbsolute16(path8)) {
97332
97502
  return path8;
97333
97503
  }
97334
97504
  }
@@ -97336,7 +97506,7 @@ var init_workspace_directory = __esm({
97336
97506
  };
97337
97507
  resolvePath = async (requested, signal) => {
97338
97508
  signal.throwIfAborted();
97339
- if (!isAbsolute15(requested) || requested.includes("\0") || normalize2(requested) !== requested) {
97509
+ if (!isAbsolute16(requested) || requested.includes("\0") || normalize2(requested) !== requested) {
97340
97510
  throw new LocalAuthorizationError("The local directory path is invalid");
97341
97511
  }
97342
97512
  try {
@@ -97344,7 +97514,7 @@ var init_workspace_directory = __esm({
97344
97514
  signal.throwIfAborted();
97345
97515
  const metadata = await readPathMetadata(target);
97346
97516
  signal.throwIfAborted();
97347
- if (!isAbsolute15(target) || normalize2(target) !== target || metadata.kind !== "directory") {
97517
+ if (!isAbsolute16(target) || normalize2(target) !== target || metadata.kind !== "directory") {
97348
97518
  throw new LocalAuthorizationError("The selected location is not a directory");
97349
97519
  }
97350
97520
  return target;
@@ -97359,8 +97529,8 @@ var init_workspace_directory = __esm({
97359
97529
  }
97360
97530
  };
97361
97531
  label = (path8) => {
97362
- const suffix = relative3(homedir4(), path8);
97363
- return suffix === "" ? "~" : !isAbsolute15(suffix) && suffix !== ".." && !suffix.startsWith(`..${process.platform === "win32" ? "\\" : "/"}`) ? `~/${suffix.replaceAll("\\", "/")}` : path8;
97532
+ const suffix = relative4(homedir4(), path8);
97533
+ return suffix === "" ? "~" : !isAbsolute16(suffix) && suffix !== ".." && !suffix.startsWith(`..${process.platform === "win32" ? "\\" : "/"}`) ? `~/${suffix.replaceAll("\\", "/")}` : path8;
97364
97534
  };
97365
97535
  identify = async (bindingId, requestedPath2, signal) => {
97366
97536
  this.authorizeMachine(bindingId);
@@ -97390,7 +97560,7 @@ var init_workspace_directory = __esm({
97390
97560
  continue;
97391
97561
  }
97392
97562
  try {
97393
- const path8 = await this.resolvePath(join31(target, child.name), signal);
97563
+ const path8 = await this.resolvePath(join33(target, child.name), signal);
97394
97564
  entries.push({ directoryId: encodePath(path8), name: child.name });
97395
97565
  } catch (cause) {
97396
97566
  signal.throwIfAborted();
@@ -97566,7 +97736,7 @@ var init_session_layer = __esm({
97566
97736
  });
97567
97737
 
97568
97738
  // src/runtime/observability/diagnostic-log.ts
97569
- import { join as join32 } from "node:path";
97739
+ import { join as join34 } from "node:path";
97570
97740
  function exportedFields(value) {
97571
97741
  const entry = {};
97572
97742
  for (const field of REMOTE_DIAGNOSTIC_FIELDS) {
@@ -97635,7 +97805,7 @@ var init_diagnostic_log = __esm({
97635
97805
  this.#maximumBytes = maximumBytes;
97636
97806
  const processLogsDirectory = options.processLogsDirectory;
97637
97807
  this.#sources = [
97638
- { maximumBytes, path: join32(directory, DAEMON_LOG_FILENAME) },
97808
+ { maximumBytes, path: join34(directory, DAEMON_LOG_FILENAME) },
97639
97809
  // The process logs a Runtime does not own, but must read to explain its own deaths.
97640
97810
  ...processLogsDirectory === void 0 ? [] : processLogPaths(processLogsDirectory).map((path8) => ({ maximumBytes: null, path: path8 }))
97641
97811
  ];
@@ -98544,7 +98714,7 @@ var init_agent_settings = __esm({
98544
98714
  });
98545
98715
 
98546
98716
  // src/session/content/session-files.ts
98547
- import { basename as basename8, extname as extname2, isAbsolute as isAbsolute16, join as join33, normalize as normalize3, resolve as resolve17 } from "node:path";
98717
+ import { basename as basename8, extname as extname2, isAbsolute as isAbsolute17, join as join35, normalize as normalize3, resolve as resolve16 } from "node:path";
98548
98718
  import { fileURLToPath as fileURLToPath2 } from "node:url";
98549
98719
  function requestedPath(value) {
98550
98720
  if (value.includes("\0")) {
@@ -98562,21 +98732,21 @@ function requestedPath(value) {
98562
98732
  }
98563
98733
  async function resolveFile(value, workingDirectory, signal) {
98564
98734
  const requested = requestedPath(value);
98565
- if (requested === null || !isAbsolute16(requested.path) && workingDirectory === null) {
98735
+ if (requested === null || !isAbsolute17(requested.path) && workingDirectory === null) {
98566
98736
  return null;
98567
98737
  }
98568
- if (isAbsolute16(requested.path) && normalize3(requested.path) !== requested.path) {
98738
+ if (isAbsolute17(requested.path) && normalize3(requested.path) !== requested.path) {
98569
98739
  return null;
98570
98740
  }
98571
- const candidates = requested.explicitUrl || workingDirectory === null ? [requested.path] : isAbsolute16(requested.path) ? [join33(workingDirectory, requested.path), requested.path] : [resolve17(workingDirectory, requested.path)];
98741
+ const candidates = requested.explicitUrl || workingDirectory === null ? [requested.path] : isAbsolute17(requested.path) ? [join35(workingDirectory, requested.path), requested.path] : [resolve16(workingDirectory, requested.path)];
98572
98742
  for (const candidate of candidates) {
98573
- if (!isAbsolute16(candidate) || normalize3(candidate) !== candidate) {
98743
+ if (!isAbsolute17(candidate) || normalize3(candidate) !== candidate) {
98574
98744
  continue;
98575
98745
  }
98576
98746
  try {
98577
98747
  const target = await canonicalPath(candidate);
98578
98748
  signal.throwIfAborted();
98579
- if (isAbsolute16(target) && normalize3(target) === target) {
98749
+ if (isAbsolute17(target) && normalize3(target) === target) {
98580
98750
  return target;
98581
98751
  }
98582
98752
  } catch {
@@ -99069,13 +99239,13 @@ function createNativeSessionRequestHandler(dependencies) {
99069
99239
  operationSignal.throwIfAborted();
99070
99240
  const skipPrevious = command.action === "active-turn";
99071
99241
  if (previous.length > 0 && !skipPrevious) {
99072
- await new Promise((resolve20, reject2) => {
99242
+ await new Promise((resolve19, reject2) => {
99073
99243
  const onAbort = () => reject2(operationSignal.reason);
99074
99244
  operationSignal.addEventListener("abort", onAbort, { once: true });
99075
99245
  void Promise.all(previous.map((request) => request.completion)).then(
99076
99246
  () => {
99077
99247
  operationSignal.removeEventListener("abort", onAbort);
99078
- resolve20();
99248
+ resolve19();
99079
99249
  },
99080
99250
  (error62) => {
99081
99251
  operationSignal.removeEventListener("abort", onAbort);
@@ -100354,7 +100524,7 @@ var init_runtime_revocation = __esm({
100354
100524
  import { WebSocket as WebSocket7 } from "undici";
100355
100525
  function connectRelay(url2, signal) {
100356
100526
  signal.throwIfAborted();
100357
- return new Promise((resolve20, reject2) => {
100527
+ return new Promise((resolve19, reject2) => {
100358
100528
  const endpoint = new URL(url2);
100359
100529
  const headers = relayAuthorization(endpoint);
100360
100530
  endpoint.searchParams.delete("token");
@@ -100421,7 +100591,7 @@ function connectRelay(url2, signal) {
100421
100591
  }
100422
100592
  finished = true;
100423
100593
  cleanup();
100424
- resolve20(socket);
100594
+ resolve19(socket);
100425
100595
  };
100426
100596
  function onTimeout() {
100427
100597
  fail(
@@ -100651,7 +100821,7 @@ async function runRelayConnection({
100651
100821
  }
100652
100822
  });
100653
100823
  try {
100654
- await new Promise((resolve20, reject2) => {
100824
+ await new Promise((resolve19, reject2) => {
100655
100825
  let finished = false;
100656
100826
  let ready = false;
100657
100827
  const cleanup = () => {
@@ -100669,7 +100839,7 @@ async function runRelayConnection({
100669
100839
  }
100670
100840
  finished = true;
100671
100841
  cleanup();
100672
- resolve20();
100842
+ resolve19();
100673
100843
  };
100674
100844
  const rejectConnection = (failure2) => {
100675
100845
  if (finished) {
@@ -100977,12 +101147,12 @@ function waitForRelayRetry(signal, timer) {
100977
101147
  if (signal.aborted) {
100978
101148
  return Promise.resolve();
100979
101149
  }
100980
- return new Promise((resolve20) => {
101150
+ return new Promise((resolve19) => {
100981
101151
  const retry = timer.schedule(finish, RELAY_RECONNECT_DELAY_MILLISECONDS);
100982
101152
  function finish() {
100983
101153
  retry.cancel();
100984
101154
  signal.removeEventListener("abort", finish);
100985
- resolve20();
101155
+ resolve19();
100986
101156
  }
100987
101157
  signal.addEventListener("abort", finish, { once: true });
100988
101158
  });
@@ -101257,153 +101427,6 @@ var init_engine = __esm({
101257
101427
  }
101258
101428
  });
101259
101429
 
101260
- // src/storage/daemon/release-files.ts
101261
- import { readFile as readFile10, realpath as realpath9 } from "node:fs/promises";
101262
- import { join as join34 } from "node:path";
101263
- function releasePrefix(version2) {
101264
- return join34(readStateDirectory(), "npm", version2);
101265
- }
101266
- async function readInstalledRelease(prefix) {
101267
- const packageRoot = await realpath9(join34(prefix, "node_modules", "@moxt-ai", "mobius"));
101268
- return { manifest: await readFile10(join34(packageRoot, "package.json"), "utf8"), packageRoot };
101269
- }
101270
- var init_release_files = __esm({
101271
- "src/storage/daemon/release-files.ts"() {
101272
- "use strict";
101273
- init_state_directory();
101274
- }
101275
- });
101276
-
101277
- // src/daemon/upgrades/package.ts
101278
- import { isAbsolute as isAbsolute17, join as join35, relative as relative4 } from "node:path";
101279
- async function installDaemonReleaseVersion(version2, signal) {
101280
- runtimeUpgradeVersionSchema.parse(version2);
101281
- const npm = await findExecutableOnPath("npm", process.env);
101282
- if (npm === null) {
101283
- throw new DaemonReleaseUpgradeError("npm_unavailable", "npm is required to download the new daemon");
101284
- }
101285
- const prefix = releasePrefix(version2);
101286
- await ensurePrivateDirectory(prefix);
101287
- try {
101288
- await validateLocalPath(prefix, true, true, signal);
101289
- await runBoundedProcess({
101290
- command: npm.path,
101291
- arguments: [
101292
- "install",
101293
- "--prefix",
101294
- prefix,
101295
- "--ignore-scripts",
101296
- "--no-audit",
101297
- "--no-fund",
101298
- "--save-exact",
101299
- "--",
101300
- `@moxt-ai/mobius@${version2}`
101301
- ],
101302
- cwd: prefix,
101303
- environment: process.env,
101304
- signal,
101305
- timeoutMilliseconds: 3e5,
101306
- outputLimitBytes: 64 * 1024
101307
- });
101308
- const installed = await readInstalledRelease(prefix);
101309
- const metadata = external_exports.object({
101310
- name: external_exports.literal("@moxt-ai/mobius"),
101311
- version: external_exports.literal(version2),
101312
- bin: external_exports.object({ mobius: external_exports.literal("dist/cli.js") }),
101313
- engines: external_exports.object({ node: external_exports.string().refine((value) => (0, import_semver.validRange)(value) !== null) })
101314
- }).parse(JSON.parse(installed.manifest));
101315
- const entry = await canonicalPath(join35(installed.packageRoot, metadata.bin.mobius));
101316
- const resolved = relative4(await canonicalPath(prefix), entry);
101317
- if (resolved.startsWith("..") || isAbsolute17(resolved)) {
101318
- throw new Error("Installed entry escaped npm prefix");
101319
- }
101320
- if (!(0, import_semver.satisfies)(process.versions.node, metadata.engines.node)) {
101321
- throw new DaemonReleaseUpgradeError(
101322
- "node_incompatible",
101323
- `Mobius ${version2} requires Node.js ${metadata.engines.node}; the running daemon uses ${process.versions.node} at ${process.execPath}. Update Node.js before retrying.`
101324
- );
101325
- }
101326
- try {
101327
- const result = await runBoundedProcess({
101328
- command: process.execPath,
101329
- arguments: [entry, "--version"],
101330
- cwd: prefix,
101331
- environment: process.env,
101332
- signal,
101333
- timeoutMilliseconds: 3e4,
101334
- outputLimitBytes: 16 * 1024
101335
- });
101336
- if (!result.stdout.split(/\r?\n/u).includes(`CLI: ${version2}`)) {
101337
- throw new Error("Candidate did not report the requested CLI version");
101338
- }
101339
- } catch (cause) {
101340
- signal.throwIfAborted();
101341
- throw new DaemonReleaseUpgradeError(
101342
- "release_startup_failed",
101343
- `Mobius ${version2} startup check failed; the current daemon is unchanged.`,
101344
- { cause }
101345
- );
101346
- }
101347
- return await decodeWorkerLaunch({ executable: process.execPath, entry, version: version2 });
101348
- } catch (cause) {
101349
- signal.throwIfAborted();
101350
- if (cause instanceof DaemonReleaseUpgradeError) {
101351
- throw cause;
101352
- }
101353
- throw new DaemonReleaseUpgradeError(
101354
- "npm_install_failed",
101355
- "npm could not install and verify the requested Mobius version",
101356
- { cause }
101357
- );
101358
- }
101359
- }
101360
- async function findNewDaemonReleaseVersion(currentVersion, signal) {
101361
- const npm = await findExecutableOnPath("npm", process.env);
101362
- if (npm === null) {
101363
- throw new DaemonReleaseUpgradeError("npm_unavailable", "npm is required to check for a new daemon");
101364
- }
101365
- try {
101366
- const result = await runBoundedProcess({
101367
- command: npm.path,
101368
- arguments: ["view", "@moxt-ai/mobius", "dist-tags.latest", "--json", "--prefer-online"],
101369
- cwd: process.cwd(),
101370
- environment: process.env,
101371
- signal,
101372
- timeoutMilliseconds: 3e4,
101373
- outputLimitBytes: 4096
101374
- });
101375
- const version2 = npmViewVersionSchema.parse(JSON.parse(result.stdout));
101376
- return (0, import_semver.gt)(version2, currentVersion) ? version2 : null;
101377
- } catch (cause) {
101378
- signal.throwIfAborted();
101379
- throw new DaemonReleaseUpgradeError("npm_check_failed", "npm could not return a valid latest Mobius version", {
101380
- cause
101381
- });
101382
- }
101383
- }
101384
- var import_semver, DaemonReleaseUpgradeError, npmViewVersionSchema;
101385
- var init_package2 = __esm({
101386
- "src/daemon/upgrades/package.ts"() {
101387
- "use strict";
101388
- init_protocol();
101389
- import_semver = __toESM(require_semver2(), 1);
101390
- init_zod();
101391
- init_release_files();
101392
- init_local_files();
101393
- init_private_path();
101394
- init_executable();
101395
- init_worker_process();
101396
- DaemonReleaseUpgradeError = class extends Error {
101397
- code;
101398
- constructor(code, message, options) {
101399
- super(message, options);
101400
- this.code = code;
101401
- }
101402
- };
101403
- npmViewVersionSchema = external_exports.union([runtimeUpgradeVersionSchema, external_exports.tuple([runtimeUpgradeVersionSchema])]).transform((value) => typeof value === "string" ? value : value[0]);
101404
- }
101405
- });
101406
-
101407
101430
  // src/daemon/upgrades/upgrade.ts
101408
101431
  import { randomUUID as randomUUID17 } from "node:crypto";
101409
101432
  import { setInterval as setInterval2, setTimeout as setTimeout4 } from "node:timers/promises";
@@ -101531,11 +101554,11 @@ async function checkDaemonReleaseUpgrade(signal, activity2) {
101531
101554
  const _reservation = __using(_stack, await activity2.reserveWhenIdle(signal));
101532
101555
  signal.throwIfAborted();
101533
101556
  await requestInstalledDaemonReleaseSwitch(control.stateDirectory, launch, signal);
101534
- await new Promise((resolve20) => {
101557
+ await new Promise((resolve19) => {
101535
101558
  if (signal.aborted) {
101536
- resolve20();
101559
+ resolve19();
101537
101560
  } else {
101538
- signal.addEventListener("abort", () => resolve20(), { once: true });
101561
+ signal.addEventListener("abort", () => resolve19(), { once: true });
101539
101562
  }
101540
101563
  });
101541
101564
  } catch (_) {
@@ -101841,10 +101864,10 @@ var init_daemon = __esm({
101841
101864
  });
101842
101865
 
101843
101866
  // src/cli/handler/logs/logic/collect-local-logs.ts
101844
- import { join as join36, relative as relative5, resolve as resolve18 } from "node:path";
101867
+ import { join as join36, relative as relative5, resolve as resolve17 } from "node:path";
101845
101868
  async function collectLocalDaemonLogs(stateDirectory, tailLines, signal) {
101846
101869
  signal.throwIfAborted();
101847
- const root = resolve18(stateDirectory);
101870
+ const root = resolve17(stateDirectory);
101848
101871
  const entries = [];
101849
101872
  const unreadable = [];
101850
101873
  const directories = await findLogDirectories(root, unreadable, signal);
@@ -101873,7 +101896,7 @@ async function collectLocalDaemonLogs(stateDirectory, tailLines, signal) {
101873
101896
  return { entries, unreadable: [...unreadable].sort() };
101874
101897
  }
101875
101898
  function defaultStateDirectory(environment = process.env) {
101876
- return resolve18(readStateDirectory(environment));
101899
+ return resolve17(readStateDirectory(environment));
101877
101900
  }
101878
101901
  var init_collect_local_logs = __esm({
101879
101902
  "src/cli/handler/logs/logic/collect-local-logs.ts"() {
@@ -102033,11 +102056,11 @@ var init_pair_list_output = __esm({
102033
102056
  });
102034
102057
 
102035
102058
  // src/cli/handler/pair/list.ts
102036
- import { resolve as resolve19 } from "node:path";
102059
+ import { resolve as resolve18 } from "node:path";
102037
102060
  function registerPairListCommand(command, context) {
102038
102061
  command.command("list").description("list saved pairings").addOption(valueOption("--output-json <existing-file.json>", "write JSON to an existing file")).action(async (options) => {
102039
102062
  const installation = await openMobiusCliInstallation(context.shutdownSignal, process.env);
102040
- const outputPath = options.outputJson === void 0 ? null : resolve19(options.outputJson);
102063
+ const outputPath = options.outputJson === void 0 ? null : resolve18(options.outputJson);
102041
102064
  const pairs = (await installation.listConnections(context.shutdownSignal)).map(savedPairSummary).sort(
102042
102065
  (left, right) => left.appId.localeCompare(right.appId) || left.connectionId.localeCompare(right.connectionId)
102043
102066
  );