@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/runtime.js CHANGED
@@ -22572,7 +22572,7 @@ import { fetch as fetch3 } from "undici";
22572
22572
  // package.json
22573
22573
  var package_default = {
22574
22574
  name: "@moxt-ai/mobius",
22575
- version: "0.0.292",
22575
+ version: "0.0.293",
22576
22576
  description: "Mobius CLI for pairing and running local AI agent services.",
22577
22577
  type: "module",
22578
22578
  bin: {
@@ -86536,6 +86536,50 @@ var ExecutionReceipts = class {
86536
86536
  };
86537
86537
  };
86538
86538
 
86539
+ // src/session/turn/runtime-turn-activity.ts
86540
+ var RuntimeTurnActivity = class {
86541
+ #turns = /* @__PURE__ */ new Set();
86542
+ #admission = { kind: "open" };
86543
+ acceptsPrompts = () => this.#admission.kind !== "reserved";
86544
+ count = () => this.#turns.size;
86545
+ start = (turn) => {
86546
+ this.#turns.add(turn);
86547
+ };
86548
+ finish = (turn) => {
86549
+ this.#turns.delete(turn);
86550
+ if (this.#turns.size === 0 && this.#admission.kind === "waiting") {
86551
+ this.#admission.reserve();
86552
+ }
86553
+ };
86554
+ reserveWhenIdle = (signal) => {
86555
+ signal.throwIfAborted();
86556
+ if (this.#admission.kind !== "open") {
86557
+ throw new Error("A daemon upgrade already owns admission");
86558
+ }
86559
+ return new Promise((resolve18, reject2) => {
86560
+ const abort = () => {
86561
+ this.#admission = { kind: "open" };
86562
+ signal.removeEventListener("abort", abort);
86563
+ reject2(signal.reason);
86564
+ };
86565
+ const reserve = () => {
86566
+ this.#admission = { kind: "reserved" };
86567
+ signal.removeEventListener("abort", abort);
86568
+ resolve18({
86569
+ [Symbol.dispose]: () => {
86570
+ this.#admission = { kind: "open" };
86571
+ }
86572
+ });
86573
+ };
86574
+ this.#admission = { kind: "waiting", reserve };
86575
+ signal.addEventListener("abort", abort, { once: true });
86576
+ if (this.#turns.size === 0) {
86577
+ reserve();
86578
+ }
86579
+ });
86580
+ };
86581
+ };
86582
+
86539
86583
  // src/session/turn/active-turn.ts
86540
86584
  import { randomUUID as randomUUID14 } from "node:crypto";
86541
86585
  var ActiveRuntimeTurn = class {
@@ -86752,9 +86796,12 @@ var SessionExecutionState = class {
86752
86796
  var SessionTurns = class {
86753
86797
  #bySessionId = /* @__PURE__ */ new Map();
86754
86798
  #operations;
86755
- constructor(operations) {
86799
+ #activity;
86800
+ constructor(operations, activity2 = new RuntimeTurnActivity()) {
86756
86801
  this.#operations = operations;
86802
+ this.#activity = activity2;
86757
86803
  }
86804
+ acceptsPrompts = () => this.#activity.acceptsPrompts();
86758
86805
  session = (sessionId) => {
86759
86806
  let session = this.#bySessionId.get(sessionId);
86760
86807
  if (session === void 0) {
@@ -86764,10 +86811,15 @@ var SessionTurns = class {
86764
86811
  return session;
86765
86812
  };
86766
86813
  get = (commandId, sessionId) => this.#bySessionId.get(sessionId)?.get(commandId);
86767
- start = (command, attemptId) => this.session(command.sessionId).start(command, attemptId);
86814
+ start = (command, attemptId) => {
86815
+ const turn = this.session(command.sessionId).start(command, attemptId);
86816
+ this.#activity.start(turn);
86817
+ return turn;
86818
+ };
86768
86819
  finish = (turn) => {
86769
86820
  this.#bySessionId.get(turn.command.sessionId)?.finish(turn);
86770
86821
  this.sweep();
86822
+ this.#activity.finish(turn);
86771
86823
  };
86772
86824
  recordEvent = (event) => "sessionId" in event ? this.#bySessionId.get(event.sessionId)?.recordEvent(event) ?? event : event;
86773
86825
  recordSessionEvent = (event) => {
@@ -87009,7 +87061,7 @@ function buildSessionLayer(options) {
87009
87061
  const sessionStore = new SqliteSessionStore(new AcpSessionTable(sessionDatabase), events);
87010
87062
  const externalContent = new LocalExternalContentStore(stateDirectory);
87011
87063
  const operations = new ExecutionReceipts();
87012
- const activeSessions = new SessionTurns(operations);
87064
+ const activeSessions = new SessionTurns(operations, options.turnActivity);
87013
87065
  const directories = new WorkspaceDirectoryService(bindingId, defaultWorkspace);
87014
87066
  const manager = new SessionManager2({
87015
87067
  observer: new SessionLayerObserver((event) => eventProjection.record(event), sink.publishInfo),
@@ -89070,6 +89122,16 @@ var sessionPromptCommand = {
89070
89122
  if (message.kind !== SESSION_PROMPT_KIND) {
89071
89123
  throw new Error("Command kind mismatch");
89072
89124
  }
89125
+ if (!context.sessionTurns.acceptsPrompts()) {
89126
+ send(context.socket, {
89127
+ code: "runtime_upgrading",
89128
+ requestId: message.commandId,
89129
+ kind: "session.operation.failed",
89130
+ message: "The Runtime is upgrading. Retry after it reconnects.",
89131
+ sessionId: message.sessionId
89132
+ });
89133
+ return;
89134
+ }
89073
89135
  const receipt = context.operations.claimExecution(
89074
89136
  message.commandId,
89075
89137
  message.sessionId,
@@ -89875,6 +89937,7 @@ async function runRelayConnection({
89875
89937
  reject2(failure2);
89876
89938
  };
89877
89939
  const stop = () => {
89940
+ publisher.flush();
89878
89941
  diagnostics.connectionClosed(connectionEpoch, 1e3, "Daemon stopped", "daemon_stop");
89879
89942
  closeRelaySocket(socket, 1e3, "Daemon stopped");
89880
89943
  resolveConnection();
@@ -90030,6 +90093,11 @@ var RuntimeSessionEventPublisher = class {
90030
90093
  this.#socket = null;
90031
90094
  this.dropPendingEvents();
90032
90095
  };
90096
+ flush = () => {
90097
+ if (this.#socket !== null) {
90098
+ this.flushEvents(this.#socket);
90099
+ }
90100
+ };
90033
90101
  publishOperationFailure = (sessionId, requestId, code, message) => {
90034
90102
  this.#send({ kind: "session.operation.failed", sessionId, requestId, code, message });
90035
90103
  };
@@ -90163,6 +90231,7 @@ async function runRuntime(config2, parentSignal, timer = systemTimer, options =
90163
90231
  );
90164
90232
  const publisher = new RuntimeSessionEventPublisher(timer);
90165
90233
  const layer = buildSessionLayer({
90234
+ ...options.turnActivity === void 0 ? {} : { turnActivity: options.turnActivity },
90166
90235
  bindingId: config2.bindingId,
90167
90236
  channelId: config2.channelId,
90168
90237
  defaultWorkspace: config2.defaultWorkspace,
@@ -90406,6 +90475,7 @@ var MobiusRuntimeEngine = class {
90406
90475
  this.#state = new RunningMobiusRuntimeState();
90407
90476
  try {
90408
90477
  await runRuntime(this.#config, signal, void 0, {
90478
+ ...this.#options.turnActivity === void 0 ? {} : { turnActivity: this.#options.turnActivity },
90409
90479
  ...this.#options.onConnectionStatus === void 0 ? {} : { onConnectionStatus: this.#options.onConnectionStatus },
90410
90480
  ...this.#options.reportUpgradeAvailability === void 0 ? {} : { reportUpgradeAvailability: this.#options.reportUpgradeAvailability },
90411
90481
  ...this.#options.processLogsDirectory === void 0 ? {} : { processLogsDirectory: this.#options.processLogsDirectory }