@moxt-ai/mobius 0.0.19 → 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
@@ -8,6 +8,65 @@ var __export = (target, all) => {
8
8
  // src/cli.ts
9
9
  import { mkdir as mkdir4 } from "node:fs/promises";
10
10
 
11
+ // package.json
12
+ var package_default = {
13
+ name: "@moxt-ai/mobius",
14
+ version: "0.0.21",
15
+ description: "Mobius CLI for pairing and running local AI agent services.",
16
+ type: "module",
17
+ bin: {
18
+ mobius: "dist/cli.js"
19
+ },
20
+ exports: {
21
+ ".": {
22
+ types: "./dist/index.d.ts",
23
+ import: "./dist/index.js"
24
+ }
25
+ },
26
+ files: [
27
+ "dist"
28
+ ],
29
+ engines: {
30
+ node: ">=22.13.0"
31
+ },
32
+ publishConfig: {
33
+ access: "public"
34
+ },
35
+ repository: {
36
+ type: "git",
37
+ url: "git+https://github.com/moxt-ai/mobius.git",
38
+ directory: "packages/cli"
39
+ },
40
+ scripts: {
41
+ build: "tsc --project tsconfig.build.json && esbuild src/cli.ts src/index.ts --bundle --platform=node --format=esm --sourcemap --outdir=dist --external:@agentclientprotocol/* --external:undici",
42
+ dev: "node --watch src/cli.ts",
43
+ prepack: "pnpm build",
44
+ start: "node dist/cli.js",
45
+ typecheck: "tsc --project tsconfig.json"
46
+ },
47
+ dependencies: {
48
+ "@agentclientprotocol/sdk": "^1.4.0",
49
+ undici: "7.29.0",
50
+ zod: "^4.5.4"
51
+ },
52
+ devDependencies: {
53
+ "@moxt-ai/mobius-protocol": "workspace:*",
54
+ "@types/node": "^24.13.3",
55
+ esbuild: "0.28.2"
56
+ },
57
+ main: "dist/index.js",
58
+ directories: {
59
+ test: "tests"
60
+ },
61
+ keywords: [],
62
+ author: "",
63
+ license: "ISC",
64
+ bugs: {
65
+ url: "https://github.com/moxt-ai/mobius/issues"
66
+ },
67
+ homepage: "https://github.com/moxt-ai/mobius#readme"
68
+ };
69
+
11
70
  // src/agent-catalog/local-agent.ts
12
71
  import { realpathSync, statSync } from "node:fs";
13
72
 
@@ -22405,6 +22464,11 @@ var decodeNativeSessionCancel = (encoded) => decode4(nativeSessionCancelSchema,
22405
22464
  var SESSION_EVENT_KIND = "session.event";
22406
22465
  var SESSION_EVENT_ACK_KIND = "session.event.ack";
22407
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
+ };
22408
22472
  var IDENTIFIER_PATTERN3 = /^[a-zA-Z0-9][a-zA-Z0-9._:-]{0,127}$/;
22409
22473
  var CURSOR_PATTERN = /^[A-Za-z0-9_-]{1,512}$/;
22410
22474
  var MAX_RECORDED_EVENT_LENGTH = 8 * 1024 * 1024;
@@ -22445,6 +22509,12 @@ var eventAcknowledgementSchema = external_exports.strictObject({
22445
22509
  sequence: external_exports.string().min(1).max(40).regex(DECIMAL_SEQUENCE_PATTERN),
22446
22510
  sessionId: external_exports.string().min(1).max(128).regex(IDENTIFIER_PATTERN3)
22447
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();
22448
22518
  function decode5(encoded, schema) {
22449
22519
  let value;
22450
22520
  try {
@@ -22471,6 +22541,7 @@ var encode4 = (message, schema) => {
22471
22541
  };
22472
22542
  var encodeSessionEventEnvelope = (message) => encode4(message, eventEnvelopeSchema);
22473
22543
  var decodeSessionEventAcknowledgement = (encoded) => decode5(encoded, eventAcknowledgementSchema);
22544
+ var decodeSessionEventRejection = (encoded) => decode5(encoded, eventRejectionSchema);
22474
22545
 
22475
22546
  // src/config.ts
22476
22547
  function loadDefaultWorkspace() {
@@ -27547,6 +27618,15 @@ var SessionEventOutbox = class {
27547
27618
  ) STRICT;
27548
27619
  CREATE INDEX IF NOT EXISTS relay_session_event_outbox_order
27549
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;
27550
27630
  CREATE TABLE IF NOT EXISTS relay_session_event_sources (
27551
27631
  source_key TEXT PRIMARY KEY,
27552
27632
  next_source_seq INTEGER NOT NULL
@@ -27619,6 +27699,35 @@ var SessionEventOutbox = class {
27619
27699
  WHERE event_id = ? AND session_id = ?`
27620
27700
  ).run(acknowledgement.eventId, acknowledgement.sessionId);
27621
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
+ };
27622
27731
  close = () => {
27623
27732
  this.#database.close();
27624
27733
  };
@@ -28440,6 +28549,20 @@ async function runRelayConnection(config2, directories, audit, sessions, install
28440
28549
  outbox.acknowledge(decodeSessionEventAcknowledgement(encoded));
28441
28550
  return;
28442
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
+ }
28443
28566
  if (kind === NATIVE_SESSION_CANCEL_KIND) {
28444
28567
  const command2 = decodeNativeSessionCancel(encoded);
28445
28568
  const pending = nativeRequests.get(command2.requestId);
@@ -28863,6 +28986,8 @@ async function main() {
28863
28986
  }
28864
28987
  let config2;
28865
28988
  if (command === "pair") {
28989
+ process.stdout.write(`mobius version: ${package_default.version}
28990
+ `);
28866
28991
  const paired = await pairLocalMachine(process.argv.slice(3), shutdown.signal);
28867
28992
  config2 = paired.config;
28868
28993
  process.stdout.write("\nLocal machine paired.\n");