@moxt-ai/mobius 0.0.291 → 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 (51) hide show
  1. package/dist/acp/native-history/preview-contract.d.ts +1 -0
  2. package/dist/acp/native-history/preview-contract.d.ts.map +1 -1
  3. package/dist/cli.js +122 -11
  4. package/dist/cli.js.map +4 -4
  5. package/dist/daemon/lifecycle/worker.d.ts.map +1 -1
  6. package/dist/daemon/lifecycle/worker.js +4 -1
  7. package/dist/daemon/lifecycle/worker.js.map +1 -1
  8. package/dist/daemon/upgrades/upgrade.d.ts +2 -1
  9. package/dist/daemon/upgrades/upgrade.d.ts.map +1 -1
  10. package/dist/daemon/upgrades/upgrade.js +101 -10
  11. package/dist/daemon/upgrades/upgrade.js.map +1 -1
  12. package/dist/runtime/command/registry/history.d.ts.map +1 -1
  13. package/dist/runtime/command/registry/history.js +5 -1
  14. package/dist/runtime/command/registry/history.js.map +1 -1
  15. package/dist/runtime/command/registry/prompt.d.ts.map +1 -1
  16. package/dist/runtime/command/registry/prompt.js +10 -0
  17. package/dist/runtime/command/registry/prompt.js.map +1 -1
  18. package/dist/runtime/engine.d.ts +2 -0
  19. package/dist/runtime/engine.d.ts.map +1 -1
  20. package/dist/runtime/engine.js +1 -0
  21. package/dist/runtime/engine.js.map +1 -1
  22. package/dist/runtime/relay/run-relay-connection.d.ts.map +1 -1
  23. package/dist/runtime/relay/run-relay-connection.js +2 -0
  24. package/dist/runtime/relay/run-relay-connection.js.map +1 -1
  25. package/dist/runtime/relay/session-event-publisher.d.ts +1 -0
  26. package/dist/runtime/relay/session-event-publisher.d.ts.map +1 -1
  27. package/dist/runtime/relay/session-event-publisher.js +5 -0
  28. package/dist/runtime/relay/session-event-publisher.js.map +1 -1
  29. package/dist/runtime/run.d.ts +2 -0
  30. package/dist/runtime/run.d.ts.map +1 -1
  31. package/dist/runtime/run.js +1 -0
  32. package/dist/runtime/run.js.map +1 -1
  33. package/dist/runtime.js +87 -5
  34. package/dist/runtime.js.map +4 -4
  35. package/dist/session/api/session-layer.d.ts +2 -0
  36. package/dist/session/api/session-layer.d.ts.map +1 -1
  37. package/dist/session/api/session-layer.js +1 -1
  38. package/dist/session/api/session-layer.js.map +1 -1
  39. package/dist/session/history/session-event-store.d.ts +1 -0
  40. package/dist/session/history/session-event-store.d.ts.map +1 -1
  41. package/dist/session/history/session-event-store.js +6 -0
  42. package/dist/session/history/session-event-store.js.map +1 -1
  43. package/dist/session/turn/runtime-turn-activity.d.ts +11 -0
  44. package/dist/session/turn/runtime-turn-activity.d.ts.map +1 -0
  45. package/dist/session/turn/runtime-turn-activity.js +45 -0
  46. package/dist/session/turn/runtime-turn-activity.js.map +1 -0
  47. package/dist/session/turn/session-turns.d.ts +3 -1
  48. package/dist/session/turn/session-turns.d.ts.map +1 -1
  49. package/dist/session/turn/session-turns.js +11 -2
  50. package/dist/session/turn/session-turns.js.map +1 -1
  51. package/package.json +2 -2
@@ -3,6 +3,7 @@ import type { AcpAgentDefinition } from "../agent/agent-definition.ts";
3
3
  import type { ProjectedToolCall } from "../tool-call-projection.ts";
4
4
  /** One page of a saved native session's events. */
5
5
  export interface SessionEventPage {
6
+ readonly throughPosition: string;
6
7
  readonly events: readonly SessionEvent[];
7
8
  readonly nextCursor: string | null;
8
9
  readonly sessionGenerationId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"preview-contract.d.ts","sourceRoot":"","sources":["../../../src/acp/native-history/preview-contract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AACxG,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAEpE,mDAAmD;AACnD,MAAM,WAAW,gBAAgB;IAC7B,QAAQ,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC;IACzC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC/B;AAED,wFAAwF;AACxF,MAAM,WAAW,iBAAiB;IAC9B,QAAQ,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB,KAAK,gBAAgB,CAAC;IACrF,QAAQ,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC;IAC3B;;;OAGG;IACH,QAAQ,CAAC,WAAW,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,iBAAiB,GAAG,SAAS,CAAC;IAC/F,6DAA6D;IAC7D,QAAQ,CAAC,WAAW,EAAE,CAClB,SAAS,EAAE,MAAM,EACjB,mBAAmB,EAAE,MAAM,EAC3B,MAAM,EAAE,SAAS,mBAAmB,EAAE,KACrC,IAAI,CAAC;IACV,yCAAyC;IACzC,QAAQ,CAAC,IAAI,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,KAAK,gBAAgB,CAAC;IAClG,QAAQ,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,QAAQ,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/C;AAED,kEAAkE;AAClE,MAAM,WAAW,2BAA2B;IACxC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,kEAAkE;IAClE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC9B;AAED,+CAA+C;AAC/C,MAAM,WAAW,cAAc;IAC3B;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAC;IACnC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,qBAAqB,EAAE,SAAS,MAAM,EAAE,CAAC;IAClD,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,kFAAkF;IAClF,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC;;;OAGG;IACH,QAAQ,CAAC,iBAAiB,EAAE,CAAC,OAAO,EAAE,2BAA2B,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC;CACnG;AAED;;;;GAIG;AACH,MAAM,WAAW,OAAO;IACpB,QAAQ,CAAC,oBAAoB,EAAE,CAC3B,OAAO,EAAE,2BAA2B,EACpC,OAAO,EAAE,cAAc,KACtB,OAAO,CAAC,gBAAgB,CAAC,CAAC;CAClC;AAED,oEAAoE;AACpE,MAAM,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,kBAAkB,KAAK,OAAO,CAAC"}
1
+ {"version":3,"file":"preview-contract.d.ts","sourceRoot":"","sources":["../../../src/acp/native-history/preview-contract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AACxG,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAEpE,mDAAmD;AACnD,MAAM,WAAW,gBAAgB;IAC7B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC;IACzC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC/B;AAED,wFAAwF;AACxF,MAAM,WAAW,iBAAiB;IAC9B,QAAQ,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB,KAAK,gBAAgB,CAAC;IACrF,QAAQ,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC;IAC3B;;;OAGG;IACH,QAAQ,CAAC,WAAW,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,iBAAiB,GAAG,SAAS,CAAC;IAC/F,6DAA6D;IAC7D,QAAQ,CAAC,WAAW,EAAE,CAClB,SAAS,EAAE,MAAM,EACjB,mBAAmB,EAAE,MAAM,EAC3B,MAAM,EAAE,SAAS,mBAAmB,EAAE,KACrC,IAAI,CAAC;IACV,yCAAyC;IACzC,QAAQ,CAAC,IAAI,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,KAAK,gBAAgB,CAAC;IAClG,QAAQ,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,QAAQ,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/C;AAED,kEAAkE;AAClE,MAAM,WAAW,2BAA2B;IACxC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,kEAAkE;IAClE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC9B;AAED,+CAA+C;AAC/C,MAAM,WAAW,cAAc;IAC3B;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAC;IACnC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,qBAAqB,EAAE,SAAS,MAAM,EAAE,CAAC;IAClD,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,kFAAkF;IAClF,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC;;;OAGG;IACH,QAAQ,CAAC,iBAAiB,EAAE,CAAC,OAAO,EAAE,2BAA2B,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC;CACnG;AAED;;;;GAIG;AACH,MAAM,WAAW,OAAO;IACpB,QAAQ,CAAC,oBAAoB,EAAE,CAC3B,OAAO,EAAE,2BAA2B,EACpC,OAAO,EAAE,cAAc,KACtB,OAAO,CAAC,gBAAgB,CAAC,CAAC;CAClC;AAED,oEAAoE;AACpE,MAAM,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,kBAAkB,KAAK,OAAO,CAAC"}
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.291",
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: {
@@ -73018,6 +73018,9 @@ var sessionEventLogPageSchema = external_exports.object({
73018
73018
  nextCursor: external_exports.string().min(1).max(512).nullable(),
73019
73019
  sessionGenerationId: identifierStringSchema,
73020
73020
  tailCursor: external_exports.string().max(512),
73021
+ // The generation-scoped live position covered by this snapshot, including
73022
+ // coalesced and omitted events. Absent only on older Runtime versions.
73023
+ throughPosition: positionSchema.optional(),
73021
73024
  truncated: external_exports.boolean(),
73022
73025
  version: external_exports.literal(2)
73023
73026
  }).readonly();
@@ -88351,6 +88354,7 @@ var ProjectedSessionEvent = class {
88351
88354
  };
88352
88355
  };
88353
88356
  var SessionEvents = class {
88357
+ #throughPosition = "0";
88354
88358
  #eventIds = [];
88355
88359
  #eventIndexById = /* @__PURE__ */ new Map();
88356
88360
  #cachedItemsByEventId = /* @__PURE__ */ new Map();
@@ -88362,6 +88366,7 @@ var SessionEvents = class {
88362
88366
  }
88363
88367
  apply = (event, resolve20) => {
88364
88368
  const projected = this.#projection.apply(event, resolve20);
88369
+ this.#throughPosition = event.position;
88365
88370
  if (projected.kind === "replace") {
88366
88371
  const current = this.#cachedItemsByEventId.get(projected.replacedEventId);
88367
88372
  if (current === void 0) {
@@ -88375,6 +88380,9 @@ var SessionEvents = class {
88375
88380
  this.#cachedItemsByEventId.set(projected.event.eventId, item);
88376
88381
  this.#eventIds.push(projected.event.eventId);
88377
88382
  };
88383
+ get throughPosition() {
88384
+ return this.#throughPosition;
88385
+ }
88378
88386
  get materializedCount() {
88379
88387
  return this.#cachedItemsByEventId.size;
88380
88388
  }
@@ -88462,6 +88470,7 @@ function eventPage(session, sessionGenerationId, endIndex, eventLimit, read) {
88462
88470
  const startIndex = Math.max(0, endIndex - eventLimit);
88463
88471
  return {
88464
88472
  events: read(startIndex, endIndex),
88473
+ throughPosition: session.throughPosition,
88465
88474
  nextCursor: startIndex === 0 ? null : session.cursorAt(startIndex),
88466
88475
  sessionGenerationId,
88467
88476
  truncated: startIndex > 0
@@ -93230,6 +93239,50 @@ var ExecutionReceipts = class {
93230
93239
  };
93231
93240
  };
93232
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
+
93233
93286
  // src/session/turn/active-turn.ts
93234
93287
  import { randomUUID as randomUUID15 } from "node:crypto";
93235
93288
  var ActiveRuntimeTurn = class {
@@ -93446,9 +93499,12 @@ var SessionExecutionState = class {
93446
93499
  var SessionTurns = class {
93447
93500
  #bySessionId = /* @__PURE__ */ new Map();
93448
93501
  #operations;
93449
- constructor(operations) {
93502
+ #activity;
93503
+ constructor(operations, activity2 = new RuntimeTurnActivity()) {
93450
93504
  this.#operations = operations;
93505
+ this.#activity = activity2;
93451
93506
  }
93507
+ acceptsPrompts = () => this.#activity.acceptsPrompts();
93452
93508
  session = (sessionId) => {
93453
93509
  let session = this.#bySessionId.get(sessionId);
93454
93510
  if (session === void 0) {
@@ -93458,10 +93514,15 @@ var SessionTurns = class {
93458
93514
  return session;
93459
93515
  };
93460
93516
  get = (commandId, sessionId) => this.#bySessionId.get(sessionId)?.get(commandId);
93461
- 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
+ };
93462
93522
  finish = (turn) => {
93463
93523
  this.#bySessionId.get(turn.command.sessionId)?.finish(turn);
93464
93524
  this.sweep();
93525
+ this.#activity.finish(turn);
93465
93526
  };
93466
93527
  recordEvent = (event) => "sessionId" in event ? this.#bySessionId.get(event.sessionId)?.recordEvent(event) ?? event : event;
93467
93528
  recordSessionEvent = (event) => {
@@ -93703,7 +93764,7 @@ function buildSessionLayer(options) {
93703
93764
  const sessionStore = new SqliteSessionStore(new AcpSessionTable(sessionDatabase), events);
93704
93765
  const externalContent = new LocalExternalContentStore(stateDirectory);
93705
93766
  const operations = new ExecutionReceipts();
93706
- const activeSessions = new SessionTurns(operations);
93767
+ const activeSessions = new SessionTurns(operations, options.turnActivity);
93707
93768
  const directories = new WorkspaceDirectoryService(bindingId, defaultWorkspace);
93708
93769
  const manager = new SessionManager2({
93709
93770
  observer: new SessionLayerObserver((event) => eventProjection.record(event), sink.publishInfo),
@@ -94717,8 +94778,10 @@ async function loadHistoryPage(sessionId, eventLimit, initialCursor, omitReasoni
94717
94778
  let loaded = [];
94718
94779
  let sessionGenerationId = null;
94719
94780
  let sourceNextCursor = null;
94781
+ let throughPosition = null;
94720
94782
  do {
94721
94783
  const replay = await load(eventLimit, cursor);
94784
+ throughPosition ??= replay.throughPosition;
94722
94785
  if (sessionGenerationId !== null && replay.sessionGenerationId !== sessionGenerationId) {
94723
94786
  throw new SessionError("session_reloaded", "The Session reloaded while history was loading");
94724
94787
  }
@@ -94744,7 +94807,7 @@ async function loadHistoryPage(sessionId, eventLimit, initialCursor, omitReasoni
94744
94807
  }
94745
94808
  cursor = sourceNextCursor;
94746
94809
  } while (cursor !== null);
94747
- if (sessionGenerationId === null) {
94810
+ if (sessionGenerationId === null || throughPosition === null) {
94748
94811
  throw new SessionError("session_history_unavailable", "The Session history is unavailable");
94749
94812
  }
94750
94813
  const visible = omitReasoning ? omitAgentReasoning(loaded) : loaded;
@@ -94756,6 +94819,7 @@ async function loadHistoryPage(sessionId, eventLimit, initialCursor, omitReasoni
94756
94819
  nextCursor,
94757
94820
  sessionGenerationId,
94758
94821
  tailCursor: orderedEvents.at(-1)?.event.eventId ?? "",
94822
+ throughPosition,
94759
94823
  truncated: nextCursor !== null,
94760
94824
  version: 2
94761
94825
  },
@@ -95673,6 +95737,16 @@ var sessionPromptCommand = {
95673
95737
  if (message.kind !== SESSION_PROMPT_KIND) {
95674
95738
  throw new Error("Command kind mismatch");
95675
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
+ }
95676
95750
  const receipt = context.operations.claimExecution(
95677
95751
  message.commandId,
95678
95752
  message.sessionId,
@@ -96478,6 +96552,7 @@ async function runRelayConnection({
96478
96552
  reject2(failure2);
96479
96553
  };
96480
96554
  const stop = () => {
96555
+ publisher.flush();
96481
96556
  diagnostics.connectionClosed(connectionEpoch, 1e3, "Daemon stopped", "daemon_stop");
96482
96557
  closeRelaySocket(socket, 1e3, "Daemon stopped");
96483
96558
  resolveConnection();
@@ -96633,6 +96708,11 @@ var RuntimeSessionEventPublisher = class {
96633
96708
  this.#socket = null;
96634
96709
  this.dropPendingEvents();
96635
96710
  };
96711
+ flush = () => {
96712
+ if (this.#socket !== null) {
96713
+ this.flushEvents(this.#socket);
96714
+ }
96715
+ };
96636
96716
  publishOperationFailure = (sessionId, requestId, code, message) => {
96637
96717
  this.#send({ kind: "session.operation.failed", sessionId, requestId, code, message });
96638
96718
  };
@@ -96766,6 +96846,7 @@ async function runRuntime(config2, parentSignal, timer = systemTimer, options =
96766
96846
  );
96767
96847
  const publisher = new RuntimeSessionEventPublisher(timer);
96768
96848
  const layer = buildSessionLayer({
96849
+ ...options.turnActivity === void 0 ? {} : { turnActivity: options.turnActivity },
96769
96850
  bindingId: config2.bindingId,
96770
96851
  channelId: config2.channelId,
96771
96852
  defaultWorkspace: config2.defaultWorkspace,
@@ -96935,6 +97016,7 @@ var MobiusRuntimeEngine = class {
96935
97016
  this.#state = new RunningMobiusRuntimeState();
96936
97017
  try {
96937
97018
  await runRuntime(this.#config, signal, void 0, {
97019
+ ...this.#options.turnActivity === void 0 ? {} : { turnActivity: this.#options.turnActivity },
96938
97020
  ...this.#options.onConnectionStatus === void 0 ? {} : { onConnectionStatus: this.#options.onConnectionStatus },
96939
97021
  ...this.#options.reportUpgradeAvailability === void 0 ? {} : { reportUpgradeAvailability: this.#options.reportUpgradeAvailability },
96940
97022
  ...this.#options.processLogsDirectory === void 0 ? {} : { processLogsDirectory: this.#options.processLogsDirectory }
@@ -97083,11 +97165,11 @@ async function reportDaemonUpgradeAvailability(send2, signal) {
97083
97165
  send2({ ...base, kind: "runtime.upgrade.result", outcome: { status: "succeeded" } });
97084
97166
  }
97085
97167
  }
97086
- async function runDaemonReleaseUpgrades(signal) {
97168
+ async function runDaemonReleaseUpgrades(signal, activity2) {
97087
97169
  try {
97088
97170
  for await (const _tick of setInterval2(36e5, void 0, { signal })) {
97089
97171
  try {
97090
- await checkDaemonReleaseUpgrade(signal);
97172
+ await checkDaemonReleaseUpgrade(signal, activity2);
97091
97173
  } catch (cause) {
97092
97174
  signal.throwIfAborted();
97093
97175
  console.error("Daemon npm upgrade check failed", cause);
@@ -97105,6 +97187,9 @@ async function requestDaemonReleaseUpgrade(stateDirectory, currentVersion, signa
97105
97187
  return { kind: "current" };
97106
97188
  }
97107
97189
  const launch = await installDaemonReleaseVersion(version2, signal);
97190
+ return await requestInstalledDaemonReleaseSwitch(stateDirectory, launch, signal);
97191
+ }
97192
+ async function requestInstalledDaemonReleaseSwitch(stateDirectory, launch, signal) {
97108
97193
  const id = randomUUID17();
97109
97194
  const response = lifecycleResponse.parse(
97110
97195
  await sendLocalRequest(stateDirectory, "manager", { kind: "switch", id, context: "npm", launch }, signal)
@@ -97115,7 +97200,7 @@ async function requestDaemonReleaseUpgrade(stateDirectory, currentVersion, signa
97115
97200
  if (response.kind !== "switching") {
97116
97201
  throw new DaemonReleaseUpgradeError("manager_incompatible", "The manager does not support daemon switching");
97117
97202
  }
97118
- return { kind: "requested", id, version: version2 };
97203
+ return { kind: "requested", id, version: launch.version };
97119
97204
  }
97120
97205
  async function awaitDaemonReleaseSwitch(stateDirectory, id, signal) {
97121
97206
  const deadline = AbortSignal.any([signal, AbortSignal.timeout(SWITCH_COMPLETION_MILLISECONDS)]);
@@ -97146,13 +97231,37 @@ async function awaitDaemonReleaseSwitch(stateDirectory, id, signal) {
97146
97231
  }
97147
97232
  return outcome;
97148
97233
  }
97149
- async function checkDaemonReleaseUpgrade(signal) {
97234
+ async function checkDaemonReleaseUpgrade(signal, activity2) {
97150
97235
  const control = await openMobiusControlInstallation(signal, process.env);
97151
97236
  const transition2 = await readSwitchStatus(control.stateDirectory, signal);
97152
97237
  if (transition2?.kind === "switching" || transition2?.kind === "rolled-back" && transition2.retryAfter > Date.now()) {
97153
97238
  return;
97154
97239
  }
97155
- 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
+ });
97156
97265
  }
97157
97266
 
97158
97267
  // src/daemon/lifecycle/worker.ts
@@ -97208,6 +97317,7 @@ async function runWorkerRuntime(version2, combined, shutdown, rejectionGuard) {
97208
97317
  }
97209
97318
  }
97210
97319
  rejectionGuard.bindStateDirectory(control.stateDirectory);
97320
+ const turnActivity = new RuntimeTurnActivity();
97211
97321
  const active = /* @__PURE__ */ new Map();
97212
97322
  const fail = (connectionId2, cause) => {
97213
97323
  console.error(`Runtime ${connectionId2} failed; stopping the daemon`, cause);
@@ -97235,6 +97345,7 @@ async function runWorkerRuntime(version2, combined, shutdown, rejectionGuard) {
97235
97345
  const controller = new AbortController();
97236
97346
  const engine = new MobiusRuntimeEngine(paired.config, {
97237
97347
  processLogsDirectory: control.stateDirectory,
97348
+ turnActivity,
97238
97349
  reportUpgradeAvailability: reportDaemonUpgradeAvailability
97239
97350
  });
97240
97351
  const completion = engine.run(AbortSignal.any([combined, controller.signal])).then(
@@ -97277,7 +97388,7 @@ async function runWorkerRuntime(version2, combined, shutdown, rejectionGuard) {
97277
97388
  async () => {
97278
97389
  combined.throwIfAborted();
97279
97390
  await recordCurrentData(version2, combined);
97280
- upgrades = runDaemonReleaseUpgrades(combined);
97391
+ upgrades = runDaemonReleaseUpgrades(combined, turnActivity);
97281
97392
  if (process.connected) {
97282
97393
  process.send?.({ kind: "worker-ready", version: version2 }, () => void 0);
97283
97394
  }