@moxt-ai/mobius 0.0.409 → 0.0.410

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-M4L66DBW.js";
7
7
 
8
8
  // src/engine/runtime/relay/runtime-revocation.ts
9
9
  var runtimeRevocationCloseCode = 1008;
@@ -63747,7 +63747,11 @@ var ClaudeAcpAgent = class {
63747
63747
  return;
63748
63748
  }
63749
63749
  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`);
63750
+ const wasHeld = isHeldOpen(turn);
63750
63751
  settleOrDefer(turnOutcome(session, capturedReason));
63752
+ if (turn.settled && !wasHeld) {
63753
+ this.trackResultOwedBySettledTurn(session, turn);
63754
+ }
63751
63755
  }, RESULT_WATCHDOG_TIMEOUT_MS);
63752
63756
  };
63753
63757
  const sendUpdate = async (notification) => {
@@ -63801,18 +63805,36 @@ var ClaudeAcpAgent = class {
63801
63805
  resetTurnScratch();
63802
63806
  };
63803
63807
  const ensureActiveTurn = (resultUserMessageUuid) => {
63808
+ if (resultUserMessageUuid !== void 0) {
63809
+ const named = findUnsettledTurn(resultUserMessageUuid);
63810
+ if (named !== void 0) {
63811
+ if (named !== session.activeTurn) {
63812
+ handOffActive();
63813
+ activateTurn(named);
63814
+ }
63815
+ return "active";
63816
+ }
63817
+ if (session.orphanCommands?.has(resultUserMessageUuid)) {
63818
+ for (const [uuid3, state] of session.orphanCommands) {
63819
+ if (state === "started" || state === "zombie") {
63820
+ session.orphanCommands.delete(uuid3);
63821
+ }
63822
+ }
63823
+ session.orphanCommands.delete(resultUserMessageUuid);
63824
+ return "owed";
63825
+ }
63826
+ }
63804
63827
  if (session.activeTurn) {
63805
63828
  if (!isHeldOpen(session.activeTurn)) {
63806
- return;
63829
+ return "active";
63807
63830
  }
63808
- settleActive(session.activeTurn.deferredSettle);
63831
+ handOffActive();
63809
63832
  }
63810
63833
  if ((session.pendingOrphanResults ?? 0) > 0) {
63811
63834
  session.pendingOrphanResults = (session.pendingOrphanResults ?? 1) - 1;
63812
- return;
63835
+ return "owed";
63813
63836
  }
63814
63837
  if (session.orphanCommands?.size) {
63815
- const stampedOrphan = resultUserMessageUuid !== void 0 && session.orphanCommands.has(resultUserMessageUuid);
63816
63838
  let consumedOrphanResult = false;
63817
63839
  let oldestPending;
63818
63840
  for (const [uuid3, state] of session.orphanCommands) {
@@ -63823,26 +63845,22 @@ var ClaudeAcpAgent = class {
63823
63845
  oldestPending ??= uuid3;
63824
63846
  }
63825
63847
  }
63826
- if (stampedOrphan && resultUserMessageUuid !== void 0) {
63827
- session.orphanCommands.delete(resultUserMessageUuid);
63828
- return;
63829
- }
63830
63848
  if (resultUserMessageUuid !== void 0) {
63831
63849
  } else {
63832
63850
  if (consumedOrphanResult) {
63833
- return;
63851
+ return "owed";
63834
63852
  }
63835
63853
  if (oldestPending !== void 0) {
63836
63854
  session.orphanCommands.delete(oldestPending);
63837
- return;
63855
+ return "owed";
63838
63856
  }
63839
63857
  }
63840
63858
  }
63841
63859
  const head = firstUnsettledQueuedTurn();
63842
- if (!head) {
63843
- return;
63860
+ if (head) {
63861
+ activateTurn(head);
63844
63862
  }
63845
- activateTurn(head);
63863
+ return "active";
63846
63864
  };
63847
63865
  const recordResultForOrphanCommands = () => {
63848
63866
  for (const turn of session.turnQueue ?? []) {
@@ -63920,6 +63938,35 @@ var ClaudeAcpAgent = class {
63920
63938
  session.emittedAssistantText = false;
63921
63939
  turn.reject(error62);
63922
63940
  };
63941
+ const failActiveBeforeResult = (error62) => {
63942
+ const turn = session.activeTurn;
63943
+ if (turn && !turn.settled && !isHeldOpen(turn)) {
63944
+ this.trackResultOwedBySettledTurn(session, turn);
63945
+ }
63946
+ failActive(error62);
63947
+ };
63948
+ const handOffActive = () => {
63949
+ if (!session.activeTurn) {
63950
+ return;
63951
+ }
63952
+ if (session.cancelled) {
63953
+ session.idleBoundary = {
63954
+ kind: "accounted",
63955
+ turn: session.activeTurn ?? null
63956
+ };
63957
+ settleActive(turnOutcome(session, "cancelled"));
63958
+ } else if (isHeldOpen(session.activeTurn)) {
63959
+ settleActive(session.activeTurn.deferredSettle);
63960
+ } else if (isSteering(session.activeTurn) && session.activeTurn.steeredSettle !== void 0) {
63961
+ session.idleBoundary = {
63962
+ kind: "accounted",
63963
+ turn: session.activeTurn ?? null
63964
+ };
63965
+ settleActive(session.activeTurn.steeredSettle);
63966
+ } else {
63967
+ settleActive(turnOutcome(session, "end_turn"));
63968
+ }
63969
+ };
63923
63970
  const failAllTurns = (error62) => {
63924
63971
  disarmForceCancel(session);
63925
63972
  const turns = session.activeTurn ? [session.activeTurn, ...(session.turnQueue ?? []).filter((t) => t !== session.activeTurn)] : [...session.turnQueue ?? []];
@@ -63956,16 +64003,7 @@ var ClaudeAcpAgent = class {
63956
64003
  cancelController.signal.removeEventListener("abort", onAbort);
63957
64004
  if (raced === "abort") {
63958
64005
  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
- }
64006
+ this.trackResultOwedBySettledTurn(session, session.activeTurn);
63969
64007
  }
63970
64008
  settleActive(turnOutcome(session, "cancelled"));
63971
64009
  session.emittedAssistantText = false;
@@ -64419,9 +64457,10 @@ ${message.api_refusal_explanation}` : "";
64419
64457
  if (!isAutonomousResult) {
64420
64458
  await this.syncFastModeState(params.sessionId, session, message.fast_mode_state, message.fast_mode_disabled_reason);
64421
64459
  }
64460
+ let isOwedResult = false;
64422
64461
  if (!isAutonomousResult) {
64462
+ isOwedResult = ensureActiveTurn(message.user_message_uuid) === "owed";
64423
64463
  recordResultForOrphanCommands();
64424
- ensureActiveTurn(message.user_message_uuid);
64425
64464
  if (session.pendingGoalUpdate?.started) {
64426
64465
  const pendingGoalUpdate = session.pendingGoalUpdate;
64427
64466
  session.pendingGoalUpdate = void 0;
@@ -64435,7 +64474,7 @@ ${message.api_refusal_explanation}` : "";
64435
64474
  if (isAutonomousResult || !session.cancelled || !session.activeTurn) {
64436
64475
  session.idleBoundary = { kind: "accounted", turn: session.activeTurn ?? null };
64437
64476
  }
64438
- if (!isAutonomousResult) {
64477
+ if (!isAutonomousResult && !isOwedResult) {
64439
64478
  session.accumulatedUsage.inputTokens += message.usage.input_tokens;
64440
64479
  session.accumulatedUsage.outputTokens += message.usage.output_tokens;
64441
64480
  session.accumulatedUsage.cachedReadTokens += message.usage.cache_read_input_tokens;
@@ -64444,7 +64483,7 @@ ${message.api_refusal_explanation}` : "";
64444
64483
  const modelUsageReading = normalizeModelUsage(message.modelUsage);
64445
64484
  const resultModelUsage = modelUsageIncrement(modelUsageReading, session.lastModelUsageReading ?? {});
64446
64485
  session.lastModelUsageReading = modelUsageReading;
64447
- if (!isAutonomousResult) {
64486
+ if (!isAutonomousResult && !isOwedResult) {
64448
64487
  session.accumulatedModelUsage = addModelUsage(session.accumulatedModelUsage ?? {}, resultModelUsage);
64449
64488
  }
64450
64489
  const matchingModelUsage = lastAssistantModel ? getMatchingModelUsage(message.modelUsage, lastAssistantModel) : null;
@@ -64488,6 +64527,11 @@ ${message.api_refusal_explanation}` : "";
64488
64527
  }
64489
64528
  break;
64490
64529
  }
64530
+ if (isOwedResult) {
64531
+ session.pendingExitPlanModeInterruption = void 0;
64532
+ session.pendingExitPlanContextReset = void 0;
64533
+ break;
64534
+ }
64491
64535
  const diagnostic = executionDiagnostic(message);
64492
64536
  if (pendingExitPlanModeInterruption?.toolResultSeen && message.is_error && diagnostic && /(?:^|\s)result_type=user(?:\s|$)/.test(diagnostic) && /(?:^|\s)stop_reason=tool_use(?:\s|$)/.test(diagnostic)) {
64493
64537
  session.pendingExitPlanModeInterruption = void 0;
@@ -64714,25 +64758,7 @@ ${message.api_refusal_explanation}` : "";
64714
64758
  }));
64715
64759
  }
64716
64760
  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
- }
64761
+ handOffActive();
64736
64762
  activateTurn(queued);
64737
64763
  }
64738
64764
  break;
@@ -64793,11 +64819,11 @@ ${message.api_refusal_explanation}` : "";
64793
64819
  break;
64794
64820
  }
64795
64821
  if (message.type === "assistant" && message.error === "authentication_failed") {
64796
- failActive(RequestError5.authRequired(errorKindData(message.error)));
64822
+ failActiveBeforeResult(RequestError5.authRequired(errorKindData(message.error)));
64797
64823
  break;
64798
64824
  }
64799
64825
  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"));
64826
+ failActiveBeforeResult(RequestError5.internalError(errorKindData(message.error), "The selected model is unavailable"));
64801
64827
  break;
64802
64828
  }
64803
64829
  let content;
@@ -64955,6 +64981,30 @@ ${message.api_refusal_explanation}` : "";
64955
64981
  session.pendingOrphanResults = (session.pendingOrphanResults ?? 0) + 1;
64956
64982
  }
64957
64983
  }
64984
+ /** Record that a dispatched turn the adapter is settling BEFORE its result
64985
+ * (force-cancel backstop, result watchdog, an assistant-level failure)
64986
+ * still owes that result. Its late result is then consumed as this turn's
64987
+ * trailer — by its `user_message_uuid` when stamped, positionally otherwise
64988
+ * — instead of settling the next prompt (see ensureActiveTurn). Every
64989
+ * settle-before-result lane must record through here so the debt has one
64990
+ * representation: the orphan-accounting lanes.
64991
+ *
64992
+ * Seeded by what the frames already told us, mirroring cancel()'s
64993
+ * queued-turn sweep — the consumer may have drained the turn's result
64994
+ * and/or terminal frame already, and an entry seeded for a result or frame
64995
+ * that is already spent would never drain (it would swallow an unrelated
64996
+ * later echo-less result instead). */
64997
+ trackResultOwedBySettledTurn(session, turn) {
64998
+ if (turn.commandFinished === "completed" || turn.commandFinished === "discarded" || turn.commandFinished === "refused") {
64999
+ } else if (turn.commandFinished === "cancelled") {
65000
+ if (!turn.commandResultSeen) {
65001
+ this.trackOrphanCommand(session, turn.promptUuid, "zombie");
65002
+ }
65003
+ } else if (turn.commandResultSeen) {
65004
+ } else {
65005
+ this.trackOrphanCommand(session, turn.promptUuid, "started");
65006
+ }
65007
+ }
64958
65008
  async cancel(params) {
64959
65009
  for (const submission of this.pendingSubmissions.get(params.sessionId) ?? []) {
64960
65010
  submission.abort();
@@ -93950,4 +94000,4 @@ export {
93950
94000
  * MIT Licensed
93951
94001
  *)
93952
94002
  */
93953
- //# sourceMappingURL=chunk-PAJOMX6L.js.map
94003
+ //# sourceMappingURL=chunk-2S33N4G2.js.map