@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/cli.js CHANGED
@@ -11,7 +11,7 @@ import { mkdir as mkdir4 } from "node:fs/promises";
11
11
  // package.json
12
12
  var package_default = {
13
13
  name: "@moxt-ai/mobius",
14
- version: "0.0.20",
14
+ version: "0.0.21",
15
15
  description: "Mobius CLI for pairing and running local AI agent services.",
16
16
  type: "module",
17
17
  bin: {
@@ -22464,6 +22464,11 @@ var decodeNativeSessionCancel = (encoded) => decode4(nativeSessionCancelSchema,
22464
22464
  var SESSION_EVENT_KIND = "session.event";
22465
22465
  var SESSION_EVENT_ACK_KIND = "session.event.ack";
22466
22466
  var SESSION_EVENT_COMMITTED_KIND = "session.event.committed";
22467
+ var SESSION_EVENT_REJECTED_KIND = "session.event.rejected";
22468
+ var SessionEventRejectionCode = {
22469
+ SessionDeleted: "session_deleted",
22470
+ SessionNotFound: "session_not_found"
22471
+ };
22467
22472
  var IDENTIFIER_PATTERN3 = /^[a-zA-Z0-9][a-zA-Z0-9._:-]{0,127}$/;
22468
22473
  var CURSOR_PATTERN = /^[A-Za-z0-9_-]{1,512}$/;
22469
22474
  var MAX_RECORDED_EVENT_LENGTH = 8 * 1024 * 1024;
@@ -22504,6 +22509,12 @@ var eventAcknowledgementSchema = external_exports.strictObject({
22504
22509
  sequence: external_exports.string().min(1).max(40).regex(DECIMAL_SEQUENCE_PATTERN),
22505
22510
  sessionId: external_exports.string().min(1).max(128).regex(IDENTIFIER_PATTERN3)
22506
22511
  }).readonly();
22512
+ var eventRejectionSchema = external_exports.strictObject({
22513
+ code: external_exports.enum(SessionEventRejectionCode),
22514
+ eventId: external_exports.string().min(1).max(128).regex(IDENTIFIER_PATTERN3),
22515
+ kind: external_exports.literal(SESSION_EVENT_REJECTED_KIND),
22516
+ sessionId: external_exports.string().min(1).max(128).regex(IDENTIFIER_PATTERN3)
22517
+ }).readonly();
22507
22518
  function decode5(encoded, schema) {
22508
22519
  let value;
22509
22520
  try {
@@ -22530,6 +22541,7 @@ var encode4 = (message, schema) => {
22530
22541
  };
22531
22542
  var encodeSessionEventEnvelope = (message) => encode4(message, eventEnvelopeSchema);
22532
22543
  var decodeSessionEventAcknowledgement = (encoded) => decode5(encoded, eventAcknowledgementSchema);
22544
+ var decodeSessionEventRejection = (encoded) => decode5(encoded, eventRejectionSchema);
22533
22545
 
22534
22546
  // src/config.ts
22535
22547
  function loadDefaultWorkspace() {
@@ -27606,6 +27618,15 @@ var SessionEventOutbox = class {
27606
27618
  ) STRICT;
27607
27619
  CREATE INDEX IF NOT EXISTS relay_session_event_outbox_order
27608
27620
  ON relay_session_event_outbox(ordinal);
27621
+ CREATE TABLE IF NOT EXISTS relay_session_event_dead_letters (
27622
+ ordinal INTEGER PRIMARY KEY,
27623
+ event_id TEXT NOT NULL UNIQUE,
27624
+ session_id TEXT NOT NULL,
27625
+ envelope_json TEXT NOT NULL,
27626
+ rejection_code TEXT NOT NULL CHECK (
27627
+ rejection_code IN ('session_deleted', 'session_not_found')
27628
+ )
27629
+ ) STRICT;
27609
27630
  CREATE TABLE IF NOT EXISTS relay_session_event_sources (
27610
27631
  source_key TEXT PRIMARY KEY,
27611
27632
  next_source_seq INTEGER NOT NULL
@@ -27678,6 +27699,35 @@ var SessionEventOutbox = class {
27678
27699
  WHERE event_id = ? AND session_id = ?`
27679
27700
  ).run(acknowledgement.eventId, acknowledgement.sessionId);
27680
27701
  };
27702
+ quarantine = (rejection) => {
27703
+ this.#database.exec("BEGIN IMMEDIATE");
27704
+ try {
27705
+ const insertion = this.#database.prepare(
27706
+ `INSERT INTO relay_session_event_dead_letters (
27707
+ ordinal, event_id, session_id, envelope_json, rejection_code
27708
+ )
27709
+ SELECT ordinal, event_id, session_id, envelope_json, ?
27710
+ FROM relay_session_event_outbox
27711
+ WHERE event_id = ? AND session_id = ?`
27712
+ ).run(rejection.code, rejection.eventId, rejection.sessionId);
27713
+ if (insertion.changes !== 1) {
27714
+ this.#database.exec("COMMIT");
27715
+ return false;
27716
+ }
27717
+ const deletion = this.#database.prepare(
27718
+ `DELETE FROM relay_session_event_outbox
27719
+ WHERE event_id = ? AND session_id = ?`
27720
+ ).run(rejection.eventId, rejection.sessionId);
27721
+ if (deletion.changes !== 1) {
27722
+ throw new Error("The rejected session event could not be removed from the durable outbox");
27723
+ }
27724
+ this.#database.exec("COMMIT");
27725
+ return true;
27726
+ } catch (error61) {
27727
+ this.#database.exec("ROLLBACK");
27728
+ throw error61;
27729
+ }
27730
+ };
27681
27731
  close = () => {
27682
27732
  this.#database.close();
27683
27733
  };
@@ -28499,6 +28549,20 @@ async function runRelayConnection(config2, directories, audit, sessions, install
28499
28549
  outbox.acknowledge(decodeSessionEventAcknowledgement(encoded));
28500
28550
  return;
28501
28551
  }
28552
+ if (kind === SESSION_EVENT_REJECTED_KIND) {
28553
+ const rejection = decodeSessionEventRejection(encoded);
28554
+ if (outbox.quarantine(rejection)) {
28555
+ audit.record({
28556
+ commandId: rejection.eventId,
28557
+ details: { code: rejection.code },
28558
+ event: "session_event_rejected",
28559
+ sessionId: rejection.sessionId
28560
+ });
28561
+ } else {
28562
+ console.warn("Mobius daemon ignored a rejection for an unknown session event");
28563
+ }
28564
+ return;
28565
+ }
28502
28566
  if (kind === NATIVE_SESSION_CANCEL_KIND) {
28503
28567
  const command2 = decodeNativeSessionCancel(encoded);
28504
28568
  const pending = nativeRequests.get(command2.requestId);