@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.
Files changed (42) hide show
  1. package/dist/cli.js +109 -10
  2. package/dist/cli.js.map +4 -4
  3. package/dist/daemon/lifecycle/worker.d.ts.map +1 -1
  4. package/dist/daemon/lifecycle/worker.js +4 -1
  5. package/dist/daemon/lifecycle/worker.js.map +1 -1
  6. package/dist/daemon/upgrades/upgrade.d.ts +2 -1
  7. package/dist/daemon/upgrades/upgrade.d.ts.map +1 -1
  8. package/dist/daemon/upgrades/upgrade.js +101 -10
  9. package/dist/daemon/upgrades/upgrade.js.map +1 -1
  10. package/dist/runtime/command/registry/prompt.d.ts.map +1 -1
  11. package/dist/runtime/command/registry/prompt.js +10 -0
  12. package/dist/runtime/command/registry/prompt.js.map +1 -1
  13. package/dist/runtime/engine.d.ts +2 -0
  14. package/dist/runtime/engine.d.ts.map +1 -1
  15. package/dist/runtime/engine.js +1 -0
  16. package/dist/runtime/engine.js.map +1 -1
  17. package/dist/runtime/relay/run-relay-connection.d.ts.map +1 -1
  18. package/dist/runtime/relay/run-relay-connection.js +2 -0
  19. package/dist/runtime/relay/run-relay-connection.js.map +1 -1
  20. package/dist/runtime/relay/session-event-publisher.d.ts +1 -0
  21. package/dist/runtime/relay/session-event-publisher.d.ts.map +1 -1
  22. package/dist/runtime/relay/session-event-publisher.js +5 -0
  23. package/dist/runtime/relay/session-event-publisher.js.map +1 -1
  24. package/dist/runtime/run.d.ts +2 -0
  25. package/dist/runtime/run.d.ts.map +1 -1
  26. package/dist/runtime/run.js +1 -0
  27. package/dist/runtime/run.js.map +1 -1
  28. package/dist/runtime.js +74 -4
  29. package/dist/runtime.js.map +4 -4
  30. package/dist/session/api/session-layer.d.ts +2 -0
  31. package/dist/session/api/session-layer.d.ts.map +1 -1
  32. package/dist/session/api/session-layer.js +1 -1
  33. package/dist/session/api/session-layer.js.map +1 -1
  34. package/dist/session/turn/runtime-turn-activity.d.ts +11 -0
  35. package/dist/session/turn/runtime-turn-activity.d.ts.map +1 -0
  36. package/dist/session/turn/runtime-turn-activity.js +45 -0
  37. package/dist/session/turn/runtime-turn-activity.js.map +1 -0
  38. package/dist/session/turn/session-turns.d.ts +3 -1
  39. package/dist/session/turn/session-turns.d.ts.map +1 -1
  40. package/dist/session/turn/session-turns.js +11 -2
  41. package/dist/session/turn/session-turns.js.map +1 -1
  42. 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.292",
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
- constructor(operations) {
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) => this.session(command.sessionId).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: version2 };
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 requestDaemonReleaseUpgrade(control.stateDirectory, package_default.version, signal);
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
  }