@moxt-ai/mobius 0.0.292 → 0.0.293
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 +109 -10
- package/dist/cli.js.map +4 -4
- package/dist/daemon/lifecycle/worker.d.ts.map +1 -1
- package/dist/daemon/lifecycle/worker.js +4 -1
- package/dist/daemon/lifecycle/worker.js.map +1 -1
- package/dist/daemon/upgrades/upgrade.d.ts +2 -1
- package/dist/daemon/upgrades/upgrade.d.ts.map +1 -1
- package/dist/daemon/upgrades/upgrade.js +101 -10
- package/dist/daemon/upgrades/upgrade.js.map +1 -1
- package/dist/runtime/command/registry/prompt.d.ts.map +1 -1
- package/dist/runtime/command/registry/prompt.js +10 -0
- package/dist/runtime/command/registry/prompt.js.map +1 -1
- package/dist/runtime/engine.d.ts +2 -0
- package/dist/runtime/engine.d.ts.map +1 -1
- package/dist/runtime/engine.js +1 -0
- package/dist/runtime/engine.js.map +1 -1
- package/dist/runtime/relay/run-relay-connection.d.ts.map +1 -1
- package/dist/runtime/relay/run-relay-connection.js +2 -0
- package/dist/runtime/relay/run-relay-connection.js.map +1 -1
- package/dist/runtime/relay/session-event-publisher.d.ts +1 -0
- package/dist/runtime/relay/session-event-publisher.d.ts.map +1 -1
- package/dist/runtime/relay/session-event-publisher.js +5 -0
- package/dist/runtime/relay/session-event-publisher.js.map +1 -1
- package/dist/runtime/run.d.ts +2 -0
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js +1 -0
- package/dist/runtime/run.js.map +1 -1
- package/dist/runtime.js +74 -4
- package/dist/runtime.js.map +4 -4
- package/dist/session/api/session-layer.d.ts +2 -0
- package/dist/session/api/session-layer.d.ts.map +1 -1
- package/dist/session/api/session-layer.js +1 -1
- package/dist/session/api/session-layer.js.map +1 -1
- package/dist/session/turn/runtime-turn-activity.d.ts +11 -0
- package/dist/session/turn/runtime-turn-activity.d.ts.map +1 -0
- package/dist/session/turn/runtime-turn-activity.js +45 -0
- package/dist/session/turn/runtime-turn-activity.js.map +1 -0
- package/dist/session/turn/session-turns.d.ts +3 -1
- package/dist/session/turn/session-turns.d.ts.map +1 -1
- package/dist/session/turn/session-turns.js +11 -2
- package/dist/session/turn/session-turns.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -5398,7 +5398,7 @@ var program = new Command();
|
|
|
5398
5398
|
// package.json
|
|
5399
5399
|
var package_default = {
|
|
5400
5400
|
name: "@moxt-ai/mobius",
|
|
5401
|
-
version: "0.0.
|
|
5401
|
+
version: "0.0.293",
|
|
5402
5402
|
description: "Mobius CLI for pairing and running local AI agent services.",
|
|
5403
5403
|
type: "module",
|
|
5404
5404
|
bin: {
|
|
@@ -93239,6 +93239,50 @@ var ExecutionReceipts = class {
|
|
|
93239
93239
|
};
|
|
93240
93240
|
};
|
|
93241
93241
|
|
|
93242
|
+
// src/session/turn/runtime-turn-activity.ts
|
|
93243
|
+
var RuntimeTurnActivity = class {
|
|
93244
|
+
#turns = /* @__PURE__ */ new Set();
|
|
93245
|
+
#admission = { kind: "open" };
|
|
93246
|
+
acceptsPrompts = () => this.#admission.kind !== "reserved";
|
|
93247
|
+
count = () => this.#turns.size;
|
|
93248
|
+
start = (turn) => {
|
|
93249
|
+
this.#turns.add(turn);
|
|
93250
|
+
};
|
|
93251
|
+
finish = (turn) => {
|
|
93252
|
+
this.#turns.delete(turn);
|
|
93253
|
+
if (this.#turns.size === 0 && this.#admission.kind === "waiting") {
|
|
93254
|
+
this.#admission.reserve();
|
|
93255
|
+
}
|
|
93256
|
+
};
|
|
93257
|
+
reserveWhenIdle = (signal) => {
|
|
93258
|
+
signal.throwIfAborted();
|
|
93259
|
+
if (this.#admission.kind !== "open") {
|
|
93260
|
+
throw new Error("A daemon upgrade already owns admission");
|
|
93261
|
+
}
|
|
93262
|
+
return new Promise((resolve20, reject2) => {
|
|
93263
|
+
const abort = () => {
|
|
93264
|
+
this.#admission = { kind: "open" };
|
|
93265
|
+
signal.removeEventListener("abort", abort);
|
|
93266
|
+
reject2(signal.reason);
|
|
93267
|
+
};
|
|
93268
|
+
const reserve = () => {
|
|
93269
|
+
this.#admission = { kind: "reserved" };
|
|
93270
|
+
signal.removeEventListener("abort", abort);
|
|
93271
|
+
resolve20({
|
|
93272
|
+
[Symbol.dispose]: () => {
|
|
93273
|
+
this.#admission = { kind: "open" };
|
|
93274
|
+
}
|
|
93275
|
+
});
|
|
93276
|
+
};
|
|
93277
|
+
this.#admission = { kind: "waiting", reserve };
|
|
93278
|
+
signal.addEventListener("abort", abort, { once: true });
|
|
93279
|
+
if (this.#turns.size === 0) {
|
|
93280
|
+
reserve();
|
|
93281
|
+
}
|
|
93282
|
+
});
|
|
93283
|
+
};
|
|
93284
|
+
};
|
|
93285
|
+
|
|
93242
93286
|
// src/session/turn/active-turn.ts
|
|
93243
93287
|
import { randomUUID as randomUUID15 } from "node:crypto";
|
|
93244
93288
|
var ActiveRuntimeTurn = class {
|
|
@@ -93455,9 +93499,12 @@ var SessionExecutionState = class {
|
|
|
93455
93499
|
var SessionTurns = class {
|
|
93456
93500
|
#bySessionId = /* @__PURE__ */ new Map();
|
|
93457
93501
|
#operations;
|
|
93458
|
-
|
|
93502
|
+
#activity;
|
|
93503
|
+
constructor(operations, activity2 = new RuntimeTurnActivity()) {
|
|
93459
93504
|
this.#operations = operations;
|
|
93505
|
+
this.#activity = activity2;
|
|
93460
93506
|
}
|
|
93507
|
+
acceptsPrompts = () => this.#activity.acceptsPrompts();
|
|
93461
93508
|
session = (sessionId) => {
|
|
93462
93509
|
let session = this.#bySessionId.get(sessionId);
|
|
93463
93510
|
if (session === void 0) {
|
|
@@ -93467,10 +93514,15 @@ var SessionTurns = class {
|
|
|
93467
93514
|
return session;
|
|
93468
93515
|
};
|
|
93469
93516
|
get = (commandId, sessionId) => this.#bySessionId.get(sessionId)?.get(commandId);
|
|
93470
|
-
start = (command, attemptId) =>
|
|
93517
|
+
start = (command, attemptId) => {
|
|
93518
|
+
const turn = this.session(command.sessionId).start(command, attemptId);
|
|
93519
|
+
this.#activity.start(turn);
|
|
93520
|
+
return turn;
|
|
93521
|
+
};
|
|
93471
93522
|
finish = (turn) => {
|
|
93472
93523
|
this.#bySessionId.get(turn.command.sessionId)?.finish(turn);
|
|
93473
93524
|
this.sweep();
|
|
93525
|
+
this.#activity.finish(turn);
|
|
93474
93526
|
};
|
|
93475
93527
|
recordEvent = (event) => "sessionId" in event ? this.#bySessionId.get(event.sessionId)?.recordEvent(event) ?? event : event;
|
|
93476
93528
|
recordSessionEvent = (event) => {
|
|
@@ -93712,7 +93764,7 @@ function buildSessionLayer(options) {
|
|
|
93712
93764
|
const sessionStore = new SqliteSessionStore(new AcpSessionTable(sessionDatabase), events);
|
|
93713
93765
|
const externalContent = new LocalExternalContentStore(stateDirectory);
|
|
93714
93766
|
const operations = new ExecutionReceipts();
|
|
93715
|
-
const activeSessions = new SessionTurns(operations);
|
|
93767
|
+
const activeSessions = new SessionTurns(operations, options.turnActivity);
|
|
93716
93768
|
const directories = new WorkspaceDirectoryService(bindingId, defaultWorkspace);
|
|
93717
93769
|
const manager = new SessionManager2({
|
|
93718
93770
|
observer: new SessionLayerObserver((event) => eventProjection.record(event), sink.publishInfo),
|
|
@@ -95685,6 +95737,16 @@ var sessionPromptCommand = {
|
|
|
95685
95737
|
if (message.kind !== SESSION_PROMPT_KIND) {
|
|
95686
95738
|
throw new Error("Command kind mismatch");
|
|
95687
95739
|
}
|
|
95740
|
+
if (!context.sessionTurns.acceptsPrompts()) {
|
|
95741
|
+
send(context.socket, {
|
|
95742
|
+
code: "runtime_upgrading",
|
|
95743
|
+
requestId: message.commandId,
|
|
95744
|
+
kind: "session.operation.failed",
|
|
95745
|
+
message: "The Runtime is upgrading. Retry after it reconnects.",
|
|
95746
|
+
sessionId: message.sessionId
|
|
95747
|
+
});
|
|
95748
|
+
return;
|
|
95749
|
+
}
|
|
95688
95750
|
const receipt = context.operations.claimExecution(
|
|
95689
95751
|
message.commandId,
|
|
95690
95752
|
message.sessionId,
|
|
@@ -96490,6 +96552,7 @@ async function runRelayConnection({
|
|
|
96490
96552
|
reject2(failure2);
|
|
96491
96553
|
};
|
|
96492
96554
|
const stop = () => {
|
|
96555
|
+
publisher.flush();
|
|
96493
96556
|
diagnostics.connectionClosed(connectionEpoch, 1e3, "Daemon stopped", "daemon_stop");
|
|
96494
96557
|
closeRelaySocket(socket, 1e3, "Daemon stopped");
|
|
96495
96558
|
resolveConnection();
|
|
@@ -96645,6 +96708,11 @@ var RuntimeSessionEventPublisher = class {
|
|
|
96645
96708
|
this.#socket = null;
|
|
96646
96709
|
this.dropPendingEvents();
|
|
96647
96710
|
};
|
|
96711
|
+
flush = () => {
|
|
96712
|
+
if (this.#socket !== null) {
|
|
96713
|
+
this.flushEvents(this.#socket);
|
|
96714
|
+
}
|
|
96715
|
+
};
|
|
96648
96716
|
publishOperationFailure = (sessionId, requestId, code, message) => {
|
|
96649
96717
|
this.#send({ kind: "session.operation.failed", sessionId, requestId, code, message });
|
|
96650
96718
|
};
|
|
@@ -96778,6 +96846,7 @@ async function runRuntime(config2, parentSignal, timer = systemTimer, options =
|
|
|
96778
96846
|
);
|
|
96779
96847
|
const publisher = new RuntimeSessionEventPublisher(timer);
|
|
96780
96848
|
const layer = buildSessionLayer({
|
|
96849
|
+
...options.turnActivity === void 0 ? {} : { turnActivity: options.turnActivity },
|
|
96781
96850
|
bindingId: config2.bindingId,
|
|
96782
96851
|
channelId: config2.channelId,
|
|
96783
96852
|
defaultWorkspace: config2.defaultWorkspace,
|
|
@@ -96947,6 +97016,7 @@ var MobiusRuntimeEngine = class {
|
|
|
96947
97016
|
this.#state = new RunningMobiusRuntimeState();
|
|
96948
97017
|
try {
|
|
96949
97018
|
await runRuntime(this.#config, signal, void 0, {
|
|
97019
|
+
...this.#options.turnActivity === void 0 ? {} : { turnActivity: this.#options.turnActivity },
|
|
96950
97020
|
...this.#options.onConnectionStatus === void 0 ? {} : { onConnectionStatus: this.#options.onConnectionStatus },
|
|
96951
97021
|
...this.#options.reportUpgradeAvailability === void 0 ? {} : { reportUpgradeAvailability: this.#options.reportUpgradeAvailability },
|
|
96952
97022
|
...this.#options.processLogsDirectory === void 0 ? {} : { processLogsDirectory: this.#options.processLogsDirectory }
|
|
@@ -97095,11 +97165,11 @@ async function reportDaemonUpgradeAvailability(send2, signal) {
|
|
|
97095
97165
|
send2({ ...base, kind: "runtime.upgrade.result", outcome: { status: "succeeded" } });
|
|
97096
97166
|
}
|
|
97097
97167
|
}
|
|
97098
|
-
async function runDaemonReleaseUpgrades(signal) {
|
|
97168
|
+
async function runDaemonReleaseUpgrades(signal, activity2) {
|
|
97099
97169
|
try {
|
|
97100
97170
|
for await (const _tick of setInterval2(36e5, void 0, { signal })) {
|
|
97101
97171
|
try {
|
|
97102
|
-
await checkDaemonReleaseUpgrade(signal);
|
|
97172
|
+
await checkDaemonReleaseUpgrade(signal, activity2);
|
|
97103
97173
|
} catch (cause) {
|
|
97104
97174
|
signal.throwIfAborted();
|
|
97105
97175
|
console.error("Daemon npm upgrade check failed", cause);
|
|
@@ -97117,6 +97187,9 @@ async function requestDaemonReleaseUpgrade(stateDirectory, currentVersion, signa
|
|
|
97117
97187
|
return { kind: "current" };
|
|
97118
97188
|
}
|
|
97119
97189
|
const launch = await installDaemonReleaseVersion(version2, signal);
|
|
97190
|
+
return await requestInstalledDaemonReleaseSwitch(stateDirectory, launch, signal);
|
|
97191
|
+
}
|
|
97192
|
+
async function requestInstalledDaemonReleaseSwitch(stateDirectory, launch, signal) {
|
|
97120
97193
|
const id = randomUUID17();
|
|
97121
97194
|
const response = lifecycleResponse.parse(
|
|
97122
97195
|
await sendLocalRequest(stateDirectory, "manager", { kind: "switch", id, context: "npm", launch }, signal)
|
|
@@ -97127,7 +97200,7 @@ async function requestDaemonReleaseUpgrade(stateDirectory, currentVersion, signa
|
|
|
97127
97200
|
if (response.kind !== "switching") {
|
|
97128
97201
|
throw new DaemonReleaseUpgradeError("manager_incompatible", "The manager does not support daemon switching");
|
|
97129
97202
|
}
|
|
97130
|
-
return { kind: "requested", id, version:
|
|
97203
|
+
return { kind: "requested", id, version: launch.version };
|
|
97131
97204
|
}
|
|
97132
97205
|
async function awaitDaemonReleaseSwitch(stateDirectory, id, signal) {
|
|
97133
97206
|
const deadline = AbortSignal.any([signal, AbortSignal.timeout(SWITCH_COMPLETION_MILLISECONDS)]);
|
|
@@ -97158,13 +97231,37 @@ async function awaitDaemonReleaseSwitch(stateDirectory, id, signal) {
|
|
|
97158
97231
|
}
|
|
97159
97232
|
return outcome;
|
|
97160
97233
|
}
|
|
97161
|
-
async function checkDaemonReleaseUpgrade(signal) {
|
|
97234
|
+
async function checkDaemonReleaseUpgrade(signal, activity2) {
|
|
97162
97235
|
const control = await openMobiusControlInstallation(signal, process.env);
|
|
97163
97236
|
const transition2 = await readSwitchStatus(control.stateDirectory, signal);
|
|
97164
97237
|
if (transition2?.kind === "switching" || transition2?.kind === "rolled-back" && transition2.retryAfter > Date.now()) {
|
|
97165
97238
|
return;
|
|
97166
97239
|
}
|
|
97167
|
-
await
|
|
97240
|
+
const version2 = await findNewDaemonReleaseVersion(package_default.version, signal);
|
|
97241
|
+
if (version2 === null) {
|
|
97242
|
+
return;
|
|
97243
|
+
}
|
|
97244
|
+
const launch = await installDaemonReleaseVersion(version2, signal);
|
|
97245
|
+
if (activity2.count() > 0) {
|
|
97246
|
+
new RuntimeDiagnosticLog(control.stateDirectory).record(
|
|
97247
|
+
`Mobius daemon diagnostic ${JSON.stringify({
|
|
97248
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
97249
|
+
event: "daemon_upgrade_deferred",
|
|
97250
|
+
version: version2,
|
|
97251
|
+
activeTurns: activity2.count()
|
|
97252
|
+
})}`
|
|
97253
|
+
);
|
|
97254
|
+
}
|
|
97255
|
+
using _reservation = await activity2.reserveWhenIdle(signal);
|
|
97256
|
+
signal.throwIfAborted();
|
|
97257
|
+
await requestInstalledDaemonReleaseSwitch(control.stateDirectory, launch, signal);
|
|
97258
|
+
await new Promise((resolve20) => {
|
|
97259
|
+
if (signal.aborted) {
|
|
97260
|
+
resolve20();
|
|
97261
|
+
} else {
|
|
97262
|
+
signal.addEventListener("abort", () => resolve20(), { once: true });
|
|
97263
|
+
}
|
|
97264
|
+
});
|
|
97168
97265
|
}
|
|
97169
97266
|
|
|
97170
97267
|
// src/daemon/lifecycle/worker.ts
|
|
@@ -97220,6 +97317,7 @@ async function runWorkerRuntime(version2, combined, shutdown, rejectionGuard) {
|
|
|
97220
97317
|
}
|
|
97221
97318
|
}
|
|
97222
97319
|
rejectionGuard.bindStateDirectory(control.stateDirectory);
|
|
97320
|
+
const turnActivity = new RuntimeTurnActivity();
|
|
97223
97321
|
const active = /* @__PURE__ */ new Map();
|
|
97224
97322
|
const fail = (connectionId2, cause) => {
|
|
97225
97323
|
console.error(`Runtime ${connectionId2} failed; stopping the daemon`, cause);
|
|
@@ -97247,6 +97345,7 @@ async function runWorkerRuntime(version2, combined, shutdown, rejectionGuard) {
|
|
|
97247
97345
|
const controller = new AbortController();
|
|
97248
97346
|
const engine = new MobiusRuntimeEngine(paired.config, {
|
|
97249
97347
|
processLogsDirectory: control.stateDirectory,
|
|
97348
|
+
turnActivity,
|
|
97250
97349
|
reportUpgradeAvailability: reportDaemonUpgradeAvailability
|
|
97251
97350
|
});
|
|
97252
97351
|
const completion = engine.run(AbortSignal.any([combined, controller.signal])).then(
|
|
@@ -97289,7 +97388,7 @@ async function runWorkerRuntime(version2, combined, shutdown, rejectionGuard) {
|
|
|
97289
97388
|
async () => {
|
|
97290
97389
|
combined.throwIfAborted();
|
|
97291
97390
|
await recordCurrentData(version2, combined);
|
|
97292
|
-
upgrades = runDaemonReleaseUpgrades(combined);
|
|
97391
|
+
upgrades = runDaemonReleaseUpgrades(combined, turnActivity);
|
|
97293
97392
|
if (process.connected) {
|
|
97294
97393
|
process.send?.({ kind: "worker-ready", version: version2 }, () => void 0);
|
|
97295
97394
|
}
|