@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 +125 -0
- package/dist/cli.js.map +4 -4
- package/dist/index.js +64 -0
- package/dist/index.js.map +3 -3
- package/dist/relay-connection/session-event-outbox.d.ts +2 -1
- package/dist/relay-connection/session-event-outbox.d.ts.map +1 -1
- package/dist/relay-connection/session-event-outbox.js +39 -0
- package/dist/relay-connection/session-event-outbox.js.map +1 -1
- package/dist/run-daemon.d.ts.map +1 -1
- package/dist/run-daemon.js +16 -1
- package/dist/run-daemon.js.map +1 -1
- package/package.json +1 -1
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");
|