@moxt-ai/mobius 0.0.152 → 0.0.154
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 +126 -284
- package/dist/cli.js.map +4 -4
- package/dist/daemon-active-turn.d.ts +1 -0
- package/dist/daemon-active-turn.d.ts.map +1 -1
- package/dist/daemon-active-turn.js +1 -0
- package/dist/daemon-active-turn.js.map +1 -1
- package/dist/daemon-turn-registry.d.ts +2 -1
- package/dist/daemon-turn-registry.d.ts.map +1 -1
- package/dist/daemon-turn-registry.js +32 -34
- package/dist/daemon-turn-registry.js.map +1 -1
- package/dist/index.js +116 -281
- package/dist/index.js.map +4 -4
- package/dist/native-sessions/live-history-page.d.ts.map +1 -1
- package/dist/native-sessions/live-history-page.js +2 -0
- package/dist/native-sessions/live-history-page.js.map +1 -1
- package/dist/relay-connection/run-relay-connection.js +1 -1
- package/dist/relay-connection/run-relay-connection.js.map +1 -1
- package/dist/relay-connection/session-event-publisher.d.ts +3 -4
- package/dist/relay-connection/session-event-publisher.d.ts.map +1 -1
- package/dist/relay-connection/session-event-publisher.js +14 -22
- package/dist/relay-connection/session-event-publisher.js.map +1 -1
- package/dist/relay-connection/session-event-queue.d.ts +14 -0
- package/dist/relay-connection/session-event-queue.d.ts.map +1 -0
- package/dist/relay-connection/session-event-queue.js +75 -0
- package/dist/relay-connection/session-event-queue.js.map +1 -0
- package/dist/run-daemon.d.ts.map +1 -1
- package/dist/run-daemon.js +1 -3
- package/dist/run-daemon.js.map +1 -1
- package/dist/runtime.js +118 -283
- package/dist/runtime.js.map +4 -4
- package/package.json +10 -3
- package/dist/relay-connection/session-event-outbox.d.ts +0 -20
- package/dist/relay-connection/session-event-outbox.d.ts.map +0 -1
- package/dist/relay-connection/session-event-outbox.js +0 -243
- package/dist/relay-connection/session-event-outbox.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@moxt-ai/mobius",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.154",
|
|
4
4
|
"description": "Mobius CLI for pairing and running local AI agent services.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -35,7 +35,9 @@
|
|
|
35
35
|
"dev": "node --watch src/cli.ts",
|
|
36
36
|
"prepack": "pnpm build",
|
|
37
37
|
"start": "node dist/cli.js",
|
|
38
|
-
"typecheck": "tsc --project tsconfig.json"
|
|
38
|
+
"typecheck": "tsc --project tsconfig.json && tsc --project tests/tsconfig.json",
|
|
39
|
+
"test:controlled": "vitest run tests/sessions tests/runtime --maxWorkers=4",
|
|
40
|
+
"test:agents": "vitest run tests/agents --maxWorkers=2"
|
|
39
41
|
},
|
|
40
42
|
"dependencies": {
|
|
41
43
|
"@agentclientprotocol/sdk": "^1.4.0",
|
|
@@ -49,7 +51,12 @@
|
|
|
49
51
|
"@types/better-sqlite3": "7.6.13",
|
|
50
52
|
"@types/node": "^24.13.5",
|
|
51
53
|
"drizzle-orm": "^0.45.2",
|
|
52
|
-
"esbuild": "0.28.2"
|
|
54
|
+
"esbuild": "0.28.2",
|
|
55
|
+
"@moxt-ai/mobius-sdk": "workspace:*",
|
|
56
|
+
"@moxt-ai/mobius-test": "workspace:*",
|
|
57
|
+
"valibot": "1.5.0",
|
|
58
|
+
"ws": "^8.21.3",
|
|
59
|
+
"@types/ws": "^8.18.1"
|
|
53
60
|
},
|
|
54
61
|
"main": "dist/index.js",
|
|
55
62
|
"keywords": [],
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { type ReliableSessionEventEnvelope, type SessionEventAcknowledgement, type SessionEventRejected } from "@moxt-ai/mobius-protocol";
|
|
2
|
-
export interface SessionEventOutboxLimits {
|
|
3
|
-
readonly criticalEventBytes: number;
|
|
4
|
-
readonly standardEventBytes: number;
|
|
5
|
-
}
|
|
6
|
-
export declare class SessionEventOutboxCapacityError extends Error {
|
|
7
|
-
readonly code = "session_event_outbox_full";
|
|
8
|
-
constructor();
|
|
9
|
-
}
|
|
10
|
-
export declare class SessionEventOutbox {
|
|
11
|
-
#private;
|
|
12
|
-
constructor(path: string, limits?: SessionEventOutboxLimits);
|
|
13
|
-
readonly acknowledge: (acknowledgement: SessionEventAcknowledgement) => boolean;
|
|
14
|
-
readonly close: () => void;
|
|
15
|
-
readonly enqueue: (sessionId: string, payload: string, critical: boolean) => ReliableSessionEventEnvelope;
|
|
16
|
-
readonly enqueueBatch: (sessionId: string, payloads: readonly string[], critical: boolean) => readonly ReliableSessionEventEnvelope[];
|
|
17
|
-
readonly pending: (limit: number, excludedEventIds: readonly string[]) => readonly ReliableSessionEventEnvelope[];
|
|
18
|
-
readonly quarantine: (rejection: SessionEventRejected) => boolean;
|
|
19
|
-
}
|
|
20
|
-
//# sourceMappingURL=session-event-outbox.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session-event-outbox.d.ts","sourceRoot":"","sources":["../../src/relay-connection/session-event-outbox.ts"],"names":[],"mappings":"AAKA,OAAO,EAGH,KAAK,4BAA4B,EAEjC,KAAK,2BAA2B,EAChC,KAAK,oBAAoB,EAC5B,MAAM,0BAA0B,CAAC;AAMlC,MAAM,WAAW,wBAAwB;IACrC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;CACvC;AAOD,qBAAa,+BAAgC,SAAQ,KAAK;IACtD,QAAQ,CAAC,IAAI,+BAA+B;IAE5C,cAGC;CACJ;AA6BD,qBAAa,kBAAkB;;IAI3B,YAAY,IAAI,EAAE,MAAM,EAAE,MAAM,GAAE,wBAAyC,EAsC1E;IAED,QAAQ,CAAC,WAAW,oBAAqB,2BAA2B,KAAG,OAAO,CACT;IAErE,QAAQ,CAAC,KAAK,QAAO,IAAI,CAEvB;IAEF,QAAQ,CAAC,OAAO,cAAe,MAAM,WAAW,MAAM,YAAY,OAAO,KAAG,4BAA4B,CAMtG;IAEF,QAAQ,CAAC,YAAY,cACN,MAAM,YACP,SAAS,MAAM,EAAE,YACjB,OAAO,KAClB,SAAS,4BAA4B,EAAE,CAkExC;IAEF,QAAQ,CAAC,OAAO,UACL,MAAM,oBACK,SAAS,MAAM,EAAE,KACpC,SAAS,4BAA4B,EAAE,CAwBxC;IAEF,QAAQ,CAAC,UAAU,cAAe,oBAAoB,KAAG,OAAO,CAqC9D;CA8CL"}
|
|
@@ -1,243 +0,0 @@
|
|
|
1
|
-
import { randomUUID } from "node:crypto";
|
|
2
|
-
import { mkdirSync } from "node:fs";
|
|
3
|
-
import { dirname } from "node:path";
|
|
4
|
-
import { DatabaseSync } from "node:sqlite";
|
|
5
|
-
import { decodeSessionEventEnvelope, encodeSessionEventEnvelope, SESSION_EVENT_KIND, } from "@moxt-ai/mobius-protocol";
|
|
6
|
-
const DEFAULT_STANDARD_EVENT_BYTES = 96 * 1024 * 1024;
|
|
7
|
-
const DEFAULT_CRITICAL_EVENT_BYTES = 128 * 1024 * 1024;
|
|
8
|
-
const MAX_DEAD_LETTERS = 1_024;
|
|
9
|
-
const DEFAULT_LIMITS = {
|
|
10
|
-
criticalEventBytes: DEFAULT_CRITICAL_EVENT_BYTES,
|
|
11
|
-
standardEventBytes: DEFAULT_STANDARD_EVENT_BYTES,
|
|
12
|
-
};
|
|
13
|
-
export class SessionEventOutboxCapacityError extends Error {
|
|
14
|
-
code = "session_event_outbox_full";
|
|
15
|
-
constructor() {
|
|
16
|
-
super("The persistent Session event outbox is full");
|
|
17
|
-
this.name = "SessionEventOutboxCapacityError";
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
function rowNumber(row, field) {
|
|
21
|
-
const value = typeof row === "object" && row !== null ? Reflect.get(row, field) : undefined;
|
|
22
|
-
if (typeof value !== "number" || !Number.isSafeInteger(value) || value < 0) {
|
|
23
|
-
throw new Error(`SQLite returned an invalid ${field} value`);
|
|
24
|
-
}
|
|
25
|
-
return value;
|
|
26
|
-
}
|
|
27
|
-
function rowString(row, field) {
|
|
28
|
-
const value = typeof row === "object" && row !== null ? Reflect.get(row, field) : undefined;
|
|
29
|
-
if (typeof value !== "string" || value.length === 0) {
|
|
30
|
-
throw new Error(`SQLite returned an invalid ${field} value`);
|
|
31
|
-
}
|
|
32
|
-
return value;
|
|
33
|
-
}
|
|
34
|
-
function validateLimits(limits) {
|
|
35
|
-
if (!Number.isSafeInteger(limits.standardEventBytes) ||
|
|
36
|
-
limits.standardEventBytes < 1 ||
|
|
37
|
-
!Number.isSafeInteger(limits.criticalEventBytes) ||
|
|
38
|
-
limits.criticalEventBytes < limits.standardEventBytes) {
|
|
39
|
-
throw new Error("Session event outbox limits are invalid");
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
export class SessionEventOutbox {
|
|
43
|
-
#database;
|
|
44
|
-
#limits;
|
|
45
|
-
constructor(path, limits = DEFAULT_LIMITS) {
|
|
46
|
-
validateLimits(limits);
|
|
47
|
-
mkdirSync(dirname(path), { mode: 0o700, recursive: true });
|
|
48
|
-
this.#limits = limits;
|
|
49
|
-
this.#database = new DatabaseSync(path);
|
|
50
|
-
this.#database.exec("PRAGMA journal_mode = WAL; PRAGMA synchronous = FULL; PRAGMA busy_timeout = 5000;");
|
|
51
|
-
this.#database.exec(`
|
|
52
|
-
CREATE TABLE IF NOT EXISTS relay_session_event_outbox (
|
|
53
|
-
ordinal INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
54
|
-
event_id TEXT NOT NULL UNIQUE,
|
|
55
|
-
session_id TEXT NOT NULL,
|
|
56
|
-
source_seq INTEGER NOT NULL UNIQUE,
|
|
57
|
-
byte_length INTEGER NOT NULL,
|
|
58
|
-
envelope_json TEXT NOT NULL
|
|
59
|
-
) STRICT;
|
|
60
|
-
CREATE INDEX IF NOT EXISTS relay_session_event_outbox_order
|
|
61
|
-
ON relay_session_event_outbox(source_seq);
|
|
62
|
-
CREATE TABLE IF NOT EXISTS relay_session_event_outbox_state (
|
|
63
|
-
singleton INTEGER PRIMARY KEY CHECK (singleton = 1),
|
|
64
|
-
stream_id TEXT NOT NULL,
|
|
65
|
-
next_source_seq INTEGER NOT NULL,
|
|
66
|
-
total_bytes INTEGER NOT NULL
|
|
67
|
-
) STRICT;
|
|
68
|
-
CREATE TABLE IF NOT EXISTS relay_session_event_dead_letters (
|
|
69
|
-
ordinal INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
70
|
-
event_id TEXT NOT NULL UNIQUE,
|
|
71
|
-
session_id TEXT NOT NULL,
|
|
72
|
-
rejection_code TEXT NOT NULL,
|
|
73
|
-
envelope_json TEXT NOT NULL
|
|
74
|
-
) STRICT;
|
|
75
|
-
`);
|
|
76
|
-
this.#database
|
|
77
|
-
.prepare(`INSERT OR IGNORE INTO relay_session_event_outbox_state (
|
|
78
|
-
singleton, stream_id, next_source_seq, total_bytes
|
|
79
|
-
) VALUES (1, ?, 1, 0)`)
|
|
80
|
-
.run(randomUUID());
|
|
81
|
-
}
|
|
82
|
-
acknowledge = (acknowledgement) => this.#remove(acknowledgement.eventId, acknowledgement.sessionId);
|
|
83
|
-
close = () => {
|
|
84
|
-
this.#database.close();
|
|
85
|
-
};
|
|
86
|
-
enqueue = (sessionId, payload, critical) => {
|
|
87
|
-
const envelope = this.enqueueBatch(sessionId, [payload], critical)[0];
|
|
88
|
-
if (envelope === undefined) {
|
|
89
|
-
throw new Error("The Session event outbox did not enqueue the event");
|
|
90
|
-
}
|
|
91
|
-
return envelope;
|
|
92
|
-
};
|
|
93
|
-
enqueueBatch = (sessionId, payloads, critical) => {
|
|
94
|
-
if (payloads.length < 1 || payloads.length > 32) {
|
|
95
|
-
throw new Error("A Session event batch must contain between 1 and 32 events");
|
|
96
|
-
}
|
|
97
|
-
this.#database.exec("BEGIN IMMEDIATE");
|
|
98
|
-
try {
|
|
99
|
-
const state = this.#database
|
|
100
|
-
.prepare(`SELECT stream_id, next_source_seq, total_bytes
|
|
101
|
-
FROM relay_session_event_outbox_state
|
|
102
|
-
WHERE singleton = 1`)
|
|
103
|
-
.get();
|
|
104
|
-
const sourceSeq = rowNumber(state, "next_source_seq");
|
|
105
|
-
if (sourceSeq < 1 || !Number.isSafeInteger(sourceSeq + payloads.length)) {
|
|
106
|
-
throw new Error("The Session event source sequence is exhausted");
|
|
107
|
-
}
|
|
108
|
-
const streamId = rowString(state, "stream_id");
|
|
109
|
-
const stored = payloads.map((payload, index) => {
|
|
110
|
-
const envelope = {
|
|
111
|
-
delivery: {
|
|
112
|
-
eventId: randomUUID(),
|
|
113
|
-
kind: "reliable",
|
|
114
|
-
sourceSeq: (sourceSeq + index).toString(),
|
|
115
|
-
streamId,
|
|
116
|
-
},
|
|
117
|
-
kind: SESSION_EVENT_KIND,
|
|
118
|
-
payload,
|
|
119
|
-
sessionId,
|
|
120
|
-
};
|
|
121
|
-
const encoded = encodeSessionEventEnvelope(envelope);
|
|
122
|
-
return { byteLength: Buffer.byteLength(encoded, "utf8"), encoded, envelope };
|
|
123
|
-
});
|
|
124
|
-
const byteLength = stored.reduce((total, entry) => total + entry.byteLength, 0);
|
|
125
|
-
const maximumBytes = critical ? this.#limits.criticalEventBytes : this.#limits.standardEventBytes;
|
|
126
|
-
if (rowNumber(state, "total_bytes") + byteLength > maximumBytes) {
|
|
127
|
-
throw new SessionEventOutboxCapacityError();
|
|
128
|
-
}
|
|
129
|
-
const insert = this.#database.prepare(`INSERT INTO relay_session_event_outbox (
|
|
130
|
-
event_id, session_id, source_seq, byte_length, envelope_json
|
|
131
|
-
) VALUES (?, ?, ?, ?, ?)`);
|
|
132
|
-
for (const entry of stored) {
|
|
133
|
-
insert.run(entry.envelope.delivery.eventId, sessionId, Number(entry.envelope.delivery.sourceSeq), entry.byteLength, entry.encoded);
|
|
134
|
-
}
|
|
135
|
-
this.#database
|
|
136
|
-
.prepare(`UPDATE relay_session_event_outbox_state
|
|
137
|
-
SET next_source_seq = next_source_seq + ?,
|
|
138
|
-
total_bytes = total_bytes + ?
|
|
139
|
-
WHERE singleton = 1`)
|
|
140
|
-
.run(stored.length, byteLength);
|
|
141
|
-
this.#database.exec("COMMIT");
|
|
142
|
-
return stored.map((entry) => entry.envelope);
|
|
143
|
-
}
|
|
144
|
-
catch (error) {
|
|
145
|
-
this.#database.exec("ROLLBACK");
|
|
146
|
-
throw error;
|
|
147
|
-
}
|
|
148
|
-
};
|
|
149
|
-
pending = (limit, excludedEventIds) => {
|
|
150
|
-
if (!Number.isSafeInteger(limit) || limit < 1) {
|
|
151
|
-
throw new Error("Session event replay limit must be a positive integer");
|
|
152
|
-
}
|
|
153
|
-
const exclusion = excludedEventIds.length === 0
|
|
154
|
-
? ""
|
|
155
|
-
: `WHERE event_id NOT IN (${excludedEventIds.map(() => "?").join(", ")})`;
|
|
156
|
-
return this.#database
|
|
157
|
-
.prepare(`SELECT envelope_json
|
|
158
|
-
FROM relay_session_event_outbox
|
|
159
|
-
${exclusion}
|
|
160
|
-
ORDER BY source_seq
|
|
161
|
-
LIMIT ?`)
|
|
162
|
-
.all(...excludedEventIds, limit)
|
|
163
|
-
.map((row) => {
|
|
164
|
-
const envelope = decodeSessionEventEnvelope(rowString(row, "envelope_json"));
|
|
165
|
-
if (!("delivery" in envelope)) {
|
|
166
|
-
throw new Error("SQLite returned an invalid reliable Session event envelope");
|
|
167
|
-
}
|
|
168
|
-
return envelope;
|
|
169
|
-
});
|
|
170
|
-
};
|
|
171
|
-
quarantine = (rejection) => {
|
|
172
|
-
this.#database.exec("BEGIN IMMEDIATE");
|
|
173
|
-
try {
|
|
174
|
-
const stored = this.#database
|
|
175
|
-
.prepare(`SELECT byte_length, envelope_json
|
|
176
|
-
FROM relay_session_event_outbox
|
|
177
|
-
WHERE event_id = ? AND session_id = ?`)
|
|
178
|
-
.get(rejection.eventId, rejection.sessionId);
|
|
179
|
-
if (stored === undefined) {
|
|
180
|
-
this.#database.exec("COMMIT");
|
|
181
|
-
return false;
|
|
182
|
-
}
|
|
183
|
-
this.#database
|
|
184
|
-
.prepare(`INSERT INTO relay_session_event_dead_letters (
|
|
185
|
-
event_id, session_id, rejection_code, envelope_json
|
|
186
|
-
) VALUES (?, ?, ?, ?)`)
|
|
187
|
-
.run(rejection.eventId, rejection.sessionId, rejection.code, rowString(stored, "envelope_json"));
|
|
188
|
-
this.#deleteStored(rejection.eventId, rejection.sessionId, rowNumber(stored, "byte_length"));
|
|
189
|
-
this.#database
|
|
190
|
-
.prepare(`DELETE FROM relay_session_event_dead_letters
|
|
191
|
-
WHERE ordinal NOT IN (
|
|
192
|
-
SELECT ordinal FROM relay_session_event_dead_letters
|
|
193
|
-
ORDER BY ordinal DESC LIMIT ?
|
|
194
|
-
)`)
|
|
195
|
-
.run(MAX_DEAD_LETTERS);
|
|
196
|
-
this.#database.exec("COMMIT");
|
|
197
|
-
return true;
|
|
198
|
-
}
|
|
199
|
-
catch (error) {
|
|
200
|
-
this.#database.exec("ROLLBACK");
|
|
201
|
-
throw error;
|
|
202
|
-
}
|
|
203
|
-
};
|
|
204
|
-
#deleteStored = (eventId, sessionId, byteLength) => {
|
|
205
|
-
const deletion = this.#database
|
|
206
|
-
.prepare(`DELETE FROM relay_session_event_outbox
|
|
207
|
-
WHERE event_id = ? AND session_id = ?`)
|
|
208
|
-
.run(eventId, sessionId);
|
|
209
|
-
if (deletion.changes !== 1) {
|
|
210
|
-
throw new Error("The Session event could not be removed from the outbox");
|
|
211
|
-
}
|
|
212
|
-
const state = this.#database
|
|
213
|
-
.prepare(`UPDATE relay_session_event_outbox_state
|
|
214
|
-
SET total_bytes = total_bytes - ?
|
|
215
|
-
WHERE singleton = 1 AND total_bytes >= ?`)
|
|
216
|
-
.run(byteLength, byteLength);
|
|
217
|
-
if (state.changes !== 1) {
|
|
218
|
-
throw new Error("The Session event outbox capacity state is inconsistent");
|
|
219
|
-
}
|
|
220
|
-
};
|
|
221
|
-
#remove = (eventId, sessionId) => {
|
|
222
|
-
this.#database.exec("BEGIN IMMEDIATE");
|
|
223
|
-
try {
|
|
224
|
-
const stored = this.#database
|
|
225
|
-
.prepare(`SELECT byte_length
|
|
226
|
-
FROM relay_session_event_outbox
|
|
227
|
-
WHERE event_id = ? AND session_id = ?`)
|
|
228
|
-
.get(eventId, sessionId);
|
|
229
|
-
if (stored === undefined) {
|
|
230
|
-
this.#database.exec("COMMIT");
|
|
231
|
-
return false;
|
|
232
|
-
}
|
|
233
|
-
this.#deleteStored(eventId, sessionId, rowNumber(stored, "byte_length"));
|
|
234
|
-
this.#database.exec("COMMIT");
|
|
235
|
-
return true;
|
|
236
|
-
}
|
|
237
|
-
catch (error) {
|
|
238
|
-
this.#database.exec("ROLLBACK");
|
|
239
|
-
throw error;
|
|
240
|
-
}
|
|
241
|
-
};
|
|
242
|
-
}
|
|
243
|
-
//# sourceMappingURL=session-event-outbox.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session-event-outbox.js","sourceRoot":"","sources":["../../src/relay-connection/session-event-outbox.ts"],"names":[],"mappings":"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"}
|