@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 +313 -290
- package/dist/cli.js.map +4 -4
- package/dist/daemon/lifecycle/manager-client.d.ts.map +1 -1
- package/dist/daemon/lifecycle/manager-client.js +13 -12
- package/dist/daemon/lifecycle/manager-client.js.map +1 -1
- package/dist/daemon/lifecycle/manager.d.ts.map +1 -1
- package/dist/daemon/lifecycle/manager.js +11 -2
- package/dist/daemon/lifecycle/manager.js.map +1 -1
- package/dist/daemon/lifecycle/worker-process.d.ts +0 -1
- package/dist/daemon/lifecycle/worker-process.d.ts.map +1 -1
- package/dist/daemon/lifecycle/worker-process.js +1 -12
- package/dist/daemon/lifecycle/worker-process.js.map +1 -1
- package/dist/daemon/upgrades/package.d.ts +1 -0
- package/dist/daemon/upgrades/package.d.ts.map +1 -1
- package/dist/daemon/upgrades/package.js +70 -38
- package/dist/daemon/upgrades/package.js.map +1 -1
- package/dist/runtime.js +1 -1
- package/dist/runtime.js.map +1 -1
- package/package.json +1 -1
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.
|
|
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((
|
|
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(() =>
|
|
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
|
|
41952
|
-
if (
|
|
41951
|
+
const resolve19 = this.resolvers.shift();
|
|
41952
|
+
if (resolve19 === void 0) {
|
|
41953
41953
|
return;
|
|
41954
41954
|
}
|
|
41955
|
-
|
|
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
|
|
41964
|
-
|
|
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((
|
|
41981
|
-
this.resolvers.push(
|
|
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,
|
|
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,
|
|
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,
|
|
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 ?? (
|
|
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((
|
|
65141
|
+
return new Promise((resolve19) => {
|
|
65142
65142
|
const timer = setTimeout(() => {
|
|
65143
65143
|
signal.removeEventListener("abort", onAbort);
|
|
65144
|
-
|
|
65144
|
+
resolve19(true);
|
|
65145
65145
|
}, milliseconds);
|
|
65146
65146
|
const onAbort = () => {
|
|
65147
65147
|
clearTimeout(timer);
|
|
65148
|
-
|
|
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((
|
|
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
|
-
|
|
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((
|
|
67254
|
-
completeTurn =
|
|
67253
|
+
turn.completion = new Promise((resolve19) => {
|
|
67254
|
+
completeTurn = resolve19;
|
|
67255
67255
|
});
|
|
67256
|
-
const response = new Promise((
|
|
67256
|
+
const response = new Promise((resolve19, reject2) => {
|
|
67257
67257
|
turn.resolve = (result) => {
|
|
67258
|
-
|
|
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((
|
|
67658
|
-
onAbort = () =>
|
|
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((
|
|
76150
|
+
await new Promise((resolve19, reject2) => {
|
|
76151
76151
|
const onSpawn = () => {
|
|
76152
76152
|
cleanup();
|
|
76153
|
-
|
|
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((
|
|
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
|
-
|
|
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((
|
|
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
|
-
|
|
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((
|
|
77783
|
-
const queued = { message: expandedMessage, images, resolve:
|
|
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((
|
|
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
|
-
|
|
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((
|
|
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
|
-
|
|
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((
|
|
82970
|
-
server.once("listening",
|
|
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((
|
|
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((
|
|
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
|
|
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
|
-
|
|
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(
|
|
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(
|
|
83730
|
-
process.stdout.write(`Starting mobius daemon ${
|
|
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((
|
|
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 ?
|
|
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,
|
|
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,
|
|
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 ${
|
|
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(
|
|
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(
|
|
83978
|
+
await launchManager(launch);
|
|
83809
83979
|
managerStarted = true;
|
|
83810
83980
|
}
|
|
83811
|
-
await new Promise((
|
|
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 ?
|
|
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
|
-
|
|
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
|
|
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 (!
|
|
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 (!
|
|
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 (!
|
|
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,
|
|
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
|
-
|
|
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:
|
|
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
|
|
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:
|
|
91151
|
-
sessions:
|
|
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
|
|
91173
|
-
import { dirname as dirname10, join as
|
|
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 =
|
|
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 =
|
|
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 =
|
|
91387
|
+
const directory = join31(this.#root, group);
|
|
91218
91388
|
await mkdir5(directory, { mode: 448, recursive: true });
|
|
91219
91389
|
signal.throwIfAborted();
|
|
91220
|
-
const path8 =
|
|
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
|
-
|
|
91232
|
-
|
|
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
|
|
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(
|
|
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,
|
|
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 :
|
|
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,
|
|
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 =
|
|
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,
|
|
91593
|
-
const projected = this.#projection.apply(event,
|
|
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,
|
|
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((
|
|
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
|
-
|
|
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((
|
|
92334
|
+
this.termination = new Promise((resolve19) => {
|
|
92165
92335
|
child.once("error", (cause) => {
|
|
92166
|
-
|
|
92336
|
+
resolve19({ kind: "failed", error: new AcpExecutionError("The ACP process could not run", { cause }) });
|
|
92167
92337
|
});
|
|
92168
92338
|
child.once("exit", (code, signal) => {
|
|
92169
|
-
|
|
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((
|
|
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
|
-
|
|
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((
|
|
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
|
-
|
|
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
|
|
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 (
|
|
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 (!
|
|
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 (!
|
|
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 =
|
|
97363
|
-
return suffix === "" ? "~" : !
|
|
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(
|
|
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
|
|
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:
|
|
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
|
|
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 || !
|
|
98735
|
+
if (requested === null || !isAbsolute17(requested.path) && workingDirectory === null) {
|
|
98566
98736
|
return null;
|
|
98567
98737
|
}
|
|
98568
|
-
if (
|
|
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] :
|
|
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 (!
|
|
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 (
|
|
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((
|
|
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
|
-
|
|
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((
|
|
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
|
-
|
|
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((
|
|
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
|
-
|
|
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((
|
|
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
|
-
|
|
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((
|
|
101557
|
+
await new Promise((resolve19) => {
|
|
101535
101558
|
if (signal.aborted) {
|
|
101536
|
-
|
|
101559
|
+
resolve19();
|
|
101537
101560
|
} else {
|
|
101538
|
-
signal.addEventListener("abort", () =>
|
|
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
|
|
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 =
|
|
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
|
|
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
|
|
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 :
|
|
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
|
);
|