@moxt-ai/mobius 0.0.409 → 0.0.411

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.
@@ -3,7 +3,7 @@ import {
3
3
  __export,
4
4
  __using,
5
5
  package_default
6
- } from "./chunk-SEIA72PR.js";
6
+ } from "./chunk-EX66DFKM.js";
7
7
 
8
8
  // src/engine/runtime/relay/runtime-revocation.ts
9
9
  var runtimeRevocationCloseCode = 1008;
@@ -20159,6 +20159,9 @@ var agentModelEffortSchema = external_exports.object({
20159
20159
  }).readonly();
20160
20160
  var agentSettingsDiscoverCommandSchema = external_exports.object({
20161
20161
  agentId: identifierStringSchema,
20162
+ // The directory a Session would start in, whose project settings the Agent reads. Omitted, the Runtime's
20163
+ // default directory. A Runtime that predates this field ignores it; see the discovered event's `directoryId`.
20164
+ directoryId: DIRECTORY_IDENTIFIER.optional(),
20162
20165
  kind: external_exports.literal(AGENT_SETTINGS_DISCOVER_KIND),
20163
20166
  model: external_exports.string().min(1).max(500).optional(),
20164
20167
  requestId: identifierStringSchema
@@ -20167,6 +20170,9 @@ var agentSettingsDiscoveredEventSchema = external_exports.object({
20167
20170
  agentId: identifierStringSchema,
20168
20171
  agentName: external_exports.string().max(255),
20169
20172
  agentVersion: external_exports.string().max(128),
20173
+ // The directory the settings were discovered in. Absent from older Runtimes, which always discover in the
20174
+ // Runtime's default directory whatever the command named.
20175
+ directoryId: DIRECTORY_IDENTIFIER.optional(),
20170
20176
  kind: external_exports.literal(AGENT_SETTINGS_DISCOVERED_KIND),
20171
20177
  modelEffort: agentModelEffortSchema,
20172
20178
  requestId: identifierStringSchema,
@@ -63747,7 +63753,11 @@ var ClaudeAcpAgent = class {
63747
63753
  return;
63748
63754
  }
63749
63755
  this.logger.error(`Session ${params.sessionId}: SDK emitted a terminal assistant message (stop_reason=${capturedReason}) but never followed with result or idle; settling the turn via watchdog after ${RESULT_WATCHDOG_TIMEOUT_MS}ms`);
63756
+ const wasHeld = isHeldOpen(turn);
63750
63757
  settleOrDefer(turnOutcome(session, capturedReason));
63758
+ if (turn.settled && !wasHeld) {
63759
+ this.trackResultOwedBySettledTurn(session, turn);
63760
+ }
63751
63761
  }, RESULT_WATCHDOG_TIMEOUT_MS);
63752
63762
  };
63753
63763
  const sendUpdate = async (notification) => {
@@ -63801,18 +63811,36 @@ var ClaudeAcpAgent = class {
63801
63811
  resetTurnScratch();
63802
63812
  };
63803
63813
  const ensureActiveTurn = (resultUserMessageUuid) => {
63814
+ if (resultUserMessageUuid !== void 0) {
63815
+ const named = findUnsettledTurn(resultUserMessageUuid);
63816
+ if (named !== void 0) {
63817
+ if (named !== session.activeTurn) {
63818
+ handOffActive();
63819
+ activateTurn(named);
63820
+ }
63821
+ return "active";
63822
+ }
63823
+ if (session.orphanCommands?.has(resultUserMessageUuid)) {
63824
+ for (const [uuid3, state] of session.orphanCommands) {
63825
+ if (state === "started" || state === "zombie") {
63826
+ session.orphanCommands.delete(uuid3);
63827
+ }
63828
+ }
63829
+ session.orphanCommands.delete(resultUserMessageUuid);
63830
+ return "owed";
63831
+ }
63832
+ }
63804
63833
  if (session.activeTurn) {
63805
63834
  if (!isHeldOpen(session.activeTurn)) {
63806
- return;
63835
+ return "active";
63807
63836
  }
63808
- settleActive(session.activeTurn.deferredSettle);
63837
+ handOffActive();
63809
63838
  }
63810
63839
  if ((session.pendingOrphanResults ?? 0) > 0) {
63811
63840
  session.pendingOrphanResults = (session.pendingOrphanResults ?? 1) - 1;
63812
- return;
63841
+ return "owed";
63813
63842
  }
63814
63843
  if (session.orphanCommands?.size) {
63815
- const stampedOrphan = resultUserMessageUuid !== void 0 && session.orphanCommands.has(resultUserMessageUuid);
63816
63844
  let consumedOrphanResult = false;
63817
63845
  let oldestPending;
63818
63846
  for (const [uuid3, state] of session.orphanCommands) {
@@ -63823,26 +63851,22 @@ var ClaudeAcpAgent = class {
63823
63851
  oldestPending ??= uuid3;
63824
63852
  }
63825
63853
  }
63826
- if (stampedOrphan && resultUserMessageUuid !== void 0) {
63827
- session.orphanCommands.delete(resultUserMessageUuid);
63828
- return;
63829
- }
63830
63854
  if (resultUserMessageUuid !== void 0) {
63831
63855
  } else {
63832
63856
  if (consumedOrphanResult) {
63833
- return;
63857
+ return "owed";
63834
63858
  }
63835
63859
  if (oldestPending !== void 0) {
63836
63860
  session.orphanCommands.delete(oldestPending);
63837
- return;
63861
+ return "owed";
63838
63862
  }
63839
63863
  }
63840
63864
  }
63841
63865
  const head = firstUnsettledQueuedTurn();
63842
- if (!head) {
63843
- return;
63866
+ if (head) {
63867
+ activateTurn(head);
63844
63868
  }
63845
- activateTurn(head);
63869
+ return "active";
63846
63870
  };
63847
63871
  const recordResultForOrphanCommands = () => {
63848
63872
  for (const turn of session.turnQueue ?? []) {
@@ -63920,6 +63944,35 @@ var ClaudeAcpAgent = class {
63920
63944
  session.emittedAssistantText = false;
63921
63945
  turn.reject(error62);
63922
63946
  };
63947
+ const failActiveBeforeResult = (error62) => {
63948
+ const turn = session.activeTurn;
63949
+ if (turn && !turn.settled && !isHeldOpen(turn)) {
63950
+ this.trackResultOwedBySettledTurn(session, turn);
63951
+ }
63952
+ failActive(error62);
63953
+ };
63954
+ const handOffActive = () => {
63955
+ if (!session.activeTurn) {
63956
+ return;
63957
+ }
63958
+ if (session.cancelled) {
63959
+ session.idleBoundary = {
63960
+ kind: "accounted",
63961
+ turn: session.activeTurn ?? null
63962
+ };
63963
+ settleActive(turnOutcome(session, "cancelled"));
63964
+ } else if (isHeldOpen(session.activeTurn)) {
63965
+ settleActive(session.activeTurn.deferredSettle);
63966
+ } else if (isSteering(session.activeTurn) && session.activeTurn.steeredSettle !== void 0) {
63967
+ session.idleBoundary = {
63968
+ kind: "accounted",
63969
+ turn: session.activeTurn ?? null
63970
+ };
63971
+ settleActive(session.activeTurn.steeredSettle);
63972
+ } else {
63973
+ settleActive(turnOutcome(session, "end_turn"));
63974
+ }
63975
+ };
63923
63976
  const failAllTurns = (error62) => {
63924
63977
  disarmForceCancel(session);
63925
63978
  const turns = session.activeTurn ? [session.activeTurn, ...(session.turnQueue ?? []).filter((t) => t !== session.activeTurn)] : [...session.turnQueue ?? []];
@@ -63956,16 +64009,7 @@ var ClaudeAcpAgent = class {
63956
64009
  cancelController.signal.removeEventListener("abort", onAbort);
63957
64010
  if (raced === "abort") {
63958
64011
  if (session.activeTurn && !session.activeTurn.settled) {
63959
- const active = session.activeTurn;
63960
- if (active.commandFinished === "completed" || active.commandFinished === "discarded" || active.commandFinished === "refused") {
63961
- } else if (active.commandFinished === "cancelled") {
63962
- if (!active.commandResultSeen) {
63963
- this.trackOrphanCommand(session, active.promptUuid, "zombie");
63964
- }
63965
- } else if (active.commandResultSeen) {
63966
- } else {
63967
- this.trackOrphanCommand(session, active.promptUuid, "started");
63968
- }
64012
+ this.trackResultOwedBySettledTurn(session, session.activeTurn);
63969
64013
  }
63970
64014
  settleActive(turnOutcome(session, "cancelled"));
63971
64015
  session.emittedAssistantText = false;
@@ -64419,9 +64463,10 @@ ${message.api_refusal_explanation}` : "";
64419
64463
  if (!isAutonomousResult) {
64420
64464
  await this.syncFastModeState(params.sessionId, session, message.fast_mode_state, message.fast_mode_disabled_reason);
64421
64465
  }
64466
+ let isOwedResult = false;
64422
64467
  if (!isAutonomousResult) {
64468
+ isOwedResult = ensureActiveTurn(message.user_message_uuid) === "owed";
64423
64469
  recordResultForOrphanCommands();
64424
- ensureActiveTurn(message.user_message_uuid);
64425
64470
  if (session.pendingGoalUpdate?.started) {
64426
64471
  const pendingGoalUpdate = session.pendingGoalUpdate;
64427
64472
  session.pendingGoalUpdate = void 0;
@@ -64435,7 +64480,7 @@ ${message.api_refusal_explanation}` : "";
64435
64480
  if (isAutonomousResult || !session.cancelled || !session.activeTurn) {
64436
64481
  session.idleBoundary = { kind: "accounted", turn: session.activeTurn ?? null };
64437
64482
  }
64438
- if (!isAutonomousResult) {
64483
+ if (!isAutonomousResult && !isOwedResult) {
64439
64484
  session.accumulatedUsage.inputTokens += message.usage.input_tokens;
64440
64485
  session.accumulatedUsage.outputTokens += message.usage.output_tokens;
64441
64486
  session.accumulatedUsage.cachedReadTokens += message.usage.cache_read_input_tokens;
@@ -64444,7 +64489,7 @@ ${message.api_refusal_explanation}` : "";
64444
64489
  const modelUsageReading = normalizeModelUsage(message.modelUsage);
64445
64490
  const resultModelUsage = modelUsageIncrement(modelUsageReading, session.lastModelUsageReading ?? {});
64446
64491
  session.lastModelUsageReading = modelUsageReading;
64447
- if (!isAutonomousResult) {
64492
+ if (!isAutonomousResult && !isOwedResult) {
64448
64493
  session.accumulatedModelUsage = addModelUsage(session.accumulatedModelUsage ?? {}, resultModelUsage);
64449
64494
  }
64450
64495
  const matchingModelUsage = lastAssistantModel ? getMatchingModelUsage(message.modelUsage, lastAssistantModel) : null;
@@ -64488,6 +64533,11 @@ ${message.api_refusal_explanation}` : "";
64488
64533
  }
64489
64534
  break;
64490
64535
  }
64536
+ if (isOwedResult) {
64537
+ session.pendingExitPlanModeInterruption = void 0;
64538
+ session.pendingExitPlanContextReset = void 0;
64539
+ break;
64540
+ }
64491
64541
  const diagnostic = executionDiagnostic(message);
64492
64542
  if (pendingExitPlanModeInterruption?.toolResultSeen && message.is_error && diagnostic && /(?:^|\s)result_type=user(?:\s|$)/.test(diagnostic) && /(?:^|\s)stop_reason=tool_use(?:\s|$)/.test(diagnostic)) {
64493
64543
  session.pendingExitPlanModeInterruption = void 0;
@@ -64714,25 +64764,7 @@ ${message.api_refusal_explanation}` : "";
64714
64764
  }));
64715
64765
  }
64716
64766
  if (session.activeTurn !== queued) {
64717
- if (session.activeTurn) {
64718
- if (session.cancelled) {
64719
- session.idleBoundary = {
64720
- kind: "accounted",
64721
- turn: session.activeTurn ?? null
64722
- };
64723
- settleActive(turnOutcome(session, "cancelled"));
64724
- } else if (isHeldOpen(session.activeTurn)) {
64725
- settleActive(session.activeTurn.deferredSettle);
64726
- } else if (isSteering(session.activeTurn) && session.activeTurn.steeredSettle !== void 0) {
64727
- session.idleBoundary = {
64728
- kind: "accounted",
64729
- turn: session.activeTurn ?? null
64730
- };
64731
- settleActive(session.activeTurn.steeredSettle);
64732
- } else {
64733
- settleActive(turnOutcome(session, "end_turn"));
64734
- }
64735
- }
64767
+ handOffActive();
64736
64768
  activateTurn(queued);
64737
64769
  }
64738
64770
  break;
@@ -64793,11 +64825,11 @@ ${message.api_refusal_explanation}` : "";
64793
64825
  break;
64794
64826
  }
64795
64827
  if (message.type === "assistant" && message.error === "authentication_failed") {
64796
- failActive(RequestError5.authRequired(errorKindData(message.error)));
64828
+ failActiveBeforeResult(RequestError5.authRequired(errorKindData(message.error)));
64797
64829
  break;
64798
64830
  }
64799
64831
  if (message.type === "assistant" && message.parent_tool_use_id === null && message.error === "model_not_found") {
64800
- failActive(RequestError5.internalError(errorKindData(message.error), "The selected model is unavailable"));
64832
+ failActiveBeforeResult(RequestError5.internalError(errorKindData(message.error), "The selected model is unavailable"));
64801
64833
  break;
64802
64834
  }
64803
64835
  let content;
@@ -64955,6 +64987,30 @@ ${message.api_refusal_explanation}` : "";
64955
64987
  session.pendingOrphanResults = (session.pendingOrphanResults ?? 0) + 1;
64956
64988
  }
64957
64989
  }
64990
+ /** Record that a dispatched turn the adapter is settling BEFORE its result
64991
+ * (force-cancel backstop, result watchdog, an assistant-level failure)
64992
+ * still owes that result. Its late result is then consumed as this turn's
64993
+ * trailer — by its `user_message_uuid` when stamped, positionally otherwise
64994
+ * — instead of settling the next prompt (see ensureActiveTurn). Every
64995
+ * settle-before-result lane must record through here so the debt has one
64996
+ * representation: the orphan-accounting lanes.
64997
+ *
64998
+ * Seeded by what the frames already told us, mirroring cancel()'s
64999
+ * queued-turn sweep — the consumer may have drained the turn's result
65000
+ * and/or terminal frame already, and an entry seeded for a result or frame
65001
+ * that is already spent would never drain (it would swallow an unrelated
65002
+ * later echo-less result instead). */
65003
+ trackResultOwedBySettledTurn(session, turn) {
65004
+ if (turn.commandFinished === "completed" || turn.commandFinished === "discarded" || turn.commandFinished === "refused") {
65005
+ } else if (turn.commandFinished === "cancelled") {
65006
+ if (!turn.commandResultSeen) {
65007
+ this.trackOrphanCommand(session, turn.promptUuid, "zombie");
65008
+ }
65009
+ } else if (turn.commandResultSeen) {
65010
+ } else {
65011
+ this.trackOrphanCommand(session, turn.promptUuid, "started");
65012
+ }
65013
+ }
64958
65014
  async cancel(params) {
64959
65015
  for (const submission of this.pendingSubmissions.get(params.sessionId) ?? []) {
64960
65016
  submission.abort();
@@ -90755,7 +90811,8 @@ function unsupportedModelIds(unsupportedModels) {
90755
90811
  }
90756
90812
  async function discoverAgentSettings(command, resolveAgent, bindingId, directories, sessions, signal) {
90757
90813
  const { agent, adapter: harnessAdapter } = await resolveAgent(command.agentId, signal);
90758
- const cwd = await directories.resolve(bindingId, "default", signal);
90814
+ const directoryId = command.directoryId ?? "default";
90815
+ const cwd = await directories.resolve(bindingId, directoryId, signal);
90759
90816
  const inspectedBaseSnapshot = await sessions.inspectAgentSettings({
90760
90817
  adapter: harnessAdapter,
90761
90818
  additionalDirectories: [],
@@ -90829,6 +90886,7 @@ async function discoverAgentSettings(command, resolveAgent, bindingId, directori
90829
90886
  agentId: command.agentId,
90830
90887
  agentName: selectedSnapshot.agentName,
90831
90888
  agentVersion: selectedSnapshot.agentVersion,
90889
+ directoryId,
90832
90890
  kind: AGENT_SETTINGS_DISCOVERED_KIND,
90833
90891
  modelEffort,
90834
90892
  requestId: command.requestId,
@@ -91018,8 +91076,9 @@ function createAgentSettingsDiscoveryHandler(dependencies) {
91018
91076
  const { config: config2, directories, sessions, diagnostics, socket, signal, timer } = dependencies;
91019
91077
  const agentSettingsDiscoveries = /* @__PURE__ */ new Map();
91020
91078
  const handle = (command) => {
91079
+ const directoryId = command.directoryId ?? "default";
91021
91080
  const existing = [...agentSettingsDiscoveries.values()].find(
91022
- (request) => request.agentId === command.agentId && !request.controller.signal.aborted
91081
+ (request) => request.agentId === command.agentId && request.directoryId === directoryId && !request.controller.signal.aborted
91023
91082
  );
91024
91083
  if ([...agentSettingsDiscoveries.values()].some((request) => request.requestIds.has(command.requestId))) {
91025
91084
  if (socket.readyState === WebSocket4.OPEN) {
@@ -91117,6 +91176,7 @@ function createAgentSettingsDiscoveryHandler(dependencies) {
91117
91176
  })();
91118
91177
  agentSettingsDiscoveries.set(command.requestId, {
91119
91178
  agentId: command.agentId,
91179
+ directoryId,
91120
91180
  model: command.model,
91121
91181
  requestIds,
91122
91182
  completion,
@@ -93950,4 +94010,4 @@ export {
93950
94010
  * MIT Licensed
93951
94011
  *)
93952
94012
  */
93953
- //# sourceMappingURL=chunk-PAJOMX6L.js.map
94013
+ //# sourceMappingURL=chunk-6BQX2L5A.js.map