@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.
Files changed (35) hide show
  1. package/dist/cli.js +126 -284
  2. package/dist/cli.js.map +4 -4
  3. package/dist/daemon-active-turn.d.ts +1 -0
  4. package/dist/daemon-active-turn.d.ts.map +1 -1
  5. package/dist/daemon-active-turn.js +1 -0
  6. package/dist/daemon-active-turn.js.map +1 -1
  7. package/dist/daemon-turn-registry.d.ts +2 -1
  8. package/dist/daemon-turn-registry.d.ts.map +1 -1
  9. package/dist/daemon-turn-registry.js +32 -34
  10. package/dist/daemon-turn-registry.js.map +1 -1
  11. package/dist/index.js +116 -281
  12. package/dist/index.js.map +4 -4
  13. package/dist/native-sessions/live-history-page.d.ts.map +1 -1
  14. package/dist/native-sessions/live-history-page.js +2 -0
  15. package/dist/native-sessions/live-history-page.js.map +1 -1
  16. package/dist/relay-connection/run-relay-connection.js +1 -1
  17. package/dist/relay-connection/run-relay-connection.js.map +1 -1
  18. package/dist/relay-connection/session-event-publisher.d.ts +3 -4
  19. package/dist/relay-connection/session-event-publisher.d.ts.map +1 -1
  20. package/dist/relay-connection/session-event-publisher.js +14 -22
  21. package/dist/relay-connection/session-event-publisher.js.map +1 -1
  22. package/dist/relay-connection/session-event-queue.d.ts +14 -0
  23. package/dist/relay-connection/session-event-queue.d.ts.map +1 -0
  24. package/dist/relay-connection/session-event-queue.js +75 -0
  25. package/dist/relay-connection/session-event-queue.js.map +1 -0
  26. package/dist/run-daemon.d.ts.map +1 -1
  27. package/dist/run-daemon.js +1 -3
  28. package/dist/run-daemon.js.map +1 -1
  29. package/dist/runtime.js +118 -283
  30. package/dist/runtime.js.map +4 -4
  31. package/package.json +10 -3
  32. package/dist/relay-connection/session-event-outbox.d.ts +0 -20
  33. package/dist/relay-connection/session-event-outbox.d.ts.map +0 -1
  34. package/dist/relay-connection/session-event-outbox.js +0 -243
  35. 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.152",
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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"}