@moxt-ai/mobius 0.0.20 → 0.0.21

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.
package/dist/index.js CHANGED
@@ -19885,6 +19885,11 @@ var decodeNativeSessionCancel = (encoded) => decode4(nativeSessionCancelSchema,
19885
19885
  var SESSION_EVENT_KIND = "session.event";
19886
19886
  var SESSION_EVENT_ACK_KIND = "session.event.ack";
19887
19887
  var SESSION_EVENT_COMMITTED_KIND = "session.event.committed";
19888
+ var SESSION_EVENT_REJECTED_KIND = "session.event.rejected";
19889
+ var SessionEventRejectionCode = {
19890
+ SessionDeleted: "session_deleted",
19891
+ SessionNotFound: "session_not_found"
19892
+ };
19888
19893
  var IDENTIFIER_PATTERN3 = /^[a-zA-Z0-9][a-zA-Z0-9._:-]{0,127}$/;
19889
19894
  var CURSOR_PATTERN = /^[A-Za-z0-9_-]{1,512}$/;
19890
19895
  var MAX_RECORDED_EVENT_LENGTH = 8 * 1024 * 1024;
@@ -19925,6 +19930,12 @@ var eventAcknowledgementSchema = external_exports.strictObject({
19925
19930
  sequence: external_exports.string().min(1).max(40).regex(DECIMAL_SEQUENCE_PATTERN),
19926
19931
  sessionId: external_exports.string().min(1).max(128).regex(IDENTIFIER_PATTERN3)
19927
19932
  }).readonly();
19933
+ var eventRejectionSchema = external_exports.strictObject({
19934
+ code: external_exports.enum(SessionEventRejectionCode),
19935
+ eventId: external_exports.string().min(1).max(128).regex(IDENTIFIER_PATTERN3),
19936
+ kind: external_exports.literal(SESSION_EVENT_REJECTED_KIND),
19937
+ sessionId: external_exports.string().min(1).max(128).regex(IDENTIFIER_PATTERN3)
19938
+ }).readonly();
19928
19939
  function decode5(encoded, schema) {
19929
19940
  let value;
19930
19941
  try {
@@ -19951,6 +19962,7 @@ var encode4 = (message, schema) => {
19951
19962
  };
19952
19963
  var encodeSessionEventEnvelope = (message) => encode4(message, eventEnvelopeSchema);
19953
19964
  var decodeSessionEventAcknowledgement = (encoded) => decode5(encoded, eventAcknowledgementSchema);
19965
+ var decodeSessionEventRejection = (encoded) => decode5(encoded, eventRejectionSchema);
19954
19966
 
19955
19967
  // src/agent-catalog/local-agent.ts
19956
19968
  import { realpathSync, statSync } from "node:fs";
@@ -27531,6 +27543,15 @@ var SessionEventOutbox = class {
27531
27543
  ) STRICT;
27532
27544
  CREATE INDEX IF NOT EXISTS relay_session_event_outbox_order
27533
27545
  ON relay_session_event_outbox(ordinal);
27546
+ CREATE TABLE IF NOT EXISTS relay_session_event_dead_letters (
27547
+ ordinal INTEGER PRIMARY KEY,
27548
+ event_id TEXT NOT NULL UNIQUE,
27549
+ session_id TEXT NOT NULL,
27550
+ envelope_json TEXT NOT NULL,
27551
+ rejection_code TEXT NOT NULL CHECK (
27552
+ rejection_code IN ('session_deleted', 'session_not_found')
27553
+ )
27554
+ ) STRICT;
27534
27555
  CREATE TABLE IF NOT EXISTS relay_session_event_sources (
27535
27556
  source_key TEXT PRIMARY KEY,
27536
27557
  next_source_seq INTEGER NOT NULL
@@ -27603,6 +27624,35 @@ var SessionEventOutbox = class {
27603
27624
  WHERE event_id = ? AND session_id = ?`
27604
27625
  ).run(acknowledgement.eventId, acknowledgement.sessionId);
27605
27626
  };
27627
+ quarantine = (rejection) => {
27628
+ this.#database.exec("BEGIN IMMEDIATE");
27629
+ try {
27630
+ const insertion = this.#database.prepare(
27631
+ `INSERT INTO relay_session_event_dead_letters (
27632
+ ordinal, event_id, session_id, envelope_json, rejection_code
27633
+ )
27634
+ SELECT ordinal, event_id, session_id, envelope_json, ?
27635
+ FROM relay_session_event_outbox
27636
+ WHERE event_id = ? AND session_id = ?`
27637
+ ).run(rejection.code, rejection.eventId, rejection.sessionId);
27638
+ if (insertion.changes !== 1) {
27639
+ this.#database.exec("COMMIT");
27640
+ return false;
27641
+ }
27642
+ const deletion = this.#database.prepare(
27643
+ `DELETE FROM relay_session_event_outbox
27644
+ WHERE event_id = ? AND session_id = ?`
27645
+ ).run(rejection.eventId, rejection.sessionId);
27646
+ if (deletion.changes !== 1) {
27647
+ throw new Error("The rejected session event could not be removed from the durable outbox");
27648
+ }
27649
+ this.#database.exec("COMMIT");
27650
+ return true;
27651
+ } catch (error61) {
27652
+ this.#database.exec("ROLLBACK");
27653
+ throw error61;
27654
+ }
27655
+ };
27606
27656
  close = () => {
27607
27657
  this.#database.close();
27608
27658
  };
@@ -28424,6 +28474,20 @@ async function runRelayConnection(config2, directories, audit, sessions, install
28424
28474
  outbox.acknowledge(decodeSessionEventAcknowledgement(encoded));
28425
28475
  return;
28426
28476
  }
28477
+ if (kind === SESSION_EVENT_REJECTED_KIND) {
28478
+ const rejection = decodeSessionEventRejection(encoded);
28479
+ if (outbox.quarantine(rejection)) {
28480
+ audit.record({
28481
+ commandId: rejection.eventId,
28482
+ details: { code: rejection.code },
28483
+ event: "session_event_rejected",
28484
+ sessionId: rejection.sessionId
28485
+ });
28486
+ } else {
28487
+ console.warn("Mobius daemon ignored a rejection for an unknown session event");
28488
+ }
28489
+ return;
28490
+ }
28427
28491
  if (kind === NATIVE_SESSION_CANCEL_KIND) {
28428
28492
  const command2 = decodeNativeSessionCancel(encoded);
28429
28493
  const pending = nativeRequests.get(command2.requestId);