@moxt-ai/mobius 0.0.149 → 0.0.150

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.
@@ -1 +1 @@
1
- {"version":3,"file":"run-relay-connection.d.ts","sourceRoot":"","sources":["../../src/relay-connection/run-relay-connection.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,qDAAqD,CAAC;AACpG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,yCAAyC,CAAC;AACzF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAGjD,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAE1E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAGnE,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAChF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAe9C,MAAM,WAAW,sBAAsB;IACnC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,yBAAyB,CAAC;IAChD,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAC;IACvC,QAAQ,CAAC,aAAa,EAAE,wBAAwB,CAAC;IACjD,QAAQ,CAAC,oBAAoB,EAAE,0BAA0B,CAAC;IAC1D,QAAQ,CAAC,cAAc,EAAE,oBAAoB,CAAC;IAC9C,QAAQ,CAAC,UAAU,EAAE,oBAAoB,CAAC;IAC1C,QAAQ,CAAC,SAAS,EAAE,2BAA2B,CAAC;IAChD,QAAQ,CAAC,WAAW,EAAE,kBAAkB,CAAC;IACzC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,0BAA0B,CAAC;IACjD,QAAQ,CAAC,WAAW,EAAE,MAAM,IAAI,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,8BAA8B,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;CAC1G;AAED,wBAAsB,kBAAkB,CAAC,EACrC,MAAM,EACN,WAAW,EACX,KAAK,EACL,QAAQ,EACR,aAAa,EACb,oBAAoB,EACpB,cAAc,EACd,UAAU,EACV,SAAS,EACT,WAAW,EACX,eAAe,EACf,WAAW,EACX,WAAW,EACX,MAAM,EACN,KAAK,EACL,8BAA8B,GACjC,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkKxC"}
1
+ {"version":3,"file":"run-relay-connection.d.ts","sourceRoot":"","sources":["../../src/relay-connection/run-relay-connection.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,qDAAqD,CAAC;AACpG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,yCAAyC,CAAC;AACzF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAGjD,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAE1E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAGnE,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAChF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAe9C,MAAM,WAAW,sBAAsB;IACnC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,yBAAyB,CAAC;IAChD,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAC;IACvC,QAAQ,CAAC,aAAa,EAAE,wBAAwB,CAAC;IACjD,QAAQ,CAAC,oBAAoB,EAAE,0BAA0B,CAAC;IAC1D,QAAQ,CAAC,cAAc,EAAE,oBAAoB,CAAC;IAC9C,QAAQ,CAAC,UAAU,EAAE,oBAAoB,CAAC;IAC1C,QAAQ,CAAC,SAAS,EAAE,2BAA2B,CAAC;IAChD,QAAQ,CAAC,WAAW,EAAE,kBAAkB,CAAC;IACzC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,0BAA0B,CAAC;IACjD,QAAQ,CAAC,WAAW,EAAE,MAAM,IAAI,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,8BAA8B,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;CAC1G;AAED,wBAAsB,kBAAkB,CAAC,EACrC,MAAM,EACN,WAAW,EACX,KAAK,EACL,QAAQ,EACR,aAAa,EACb,oBAAoB,EACpB,cAAc,EACd,UAAU,EACV,SAAS,EACT,WAAW,EACX,eAAe,EACf,WAAW,EACX,WAAW,EACX,MAAM,EACN,KAAK,EACL,8BAA8B,GACjC,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkLxC"}
@@ -1,4 +1,4 @@
1
- import { decodeServiceToDaemonMessage, RUNTIME_HEARTBEAT_ACK_KIND, RUNTIME_LIVENESS_READY_KIND, } from "@moxt-ai/mobius-protocol";
1
+ import { decodeServiceToDaemonMessage, RUNTIME_HEARTBEAT_ACK_KIND, RUNTIME_LIVENESS_READY_KIND, SESSION_EVENT_ACK_KIND, SESSION_EVENT_DEFERRED_KIND, SESSION_EVENT_REJECTED_KIND, } from "@moxt-ai/mobius-protocol";
2
2
  import { WebSocket } from "undici";
3
3
  import { createDaemonCommandHandler } from "../daemon-command-handler.js";
4
4
  import { send } from "../daemon-command-results.js";
@@ -22,6 +22,7 @@ function closeRelaySocket(socket, code, reason) {
22
22
  export async function runRelayConnection({ config, directories, audit, sessions, installations, installationObserver, nativeSessions, operations, publisher, activeTurns, connectionEpoch, diagnostics, onConnected, signal, timer, resolveAgentCatalogEnvironment, }) {
23
23
  const relayUrl = new URL(config.relayUrl);
24
24
  relayUrl.searchParams.set("liveness", "1");
25
+ relayUrl.searchParams.set("sessionEventDelivery", "reliable-v1");
25
26
  const socket = await connectRelay(relayUrl, signal);
26
27
  diagnostics.connectionOpened(connectionEpoch);
27
28
  const connectionController = new AbortController();
@@ -137,6 +138,7 @@ export async function runRelayConnection({ config, directories, audit, sessions,
137
138
  const message = decodeServiceToDaemonMessage(encoded);
138
139
  const kind = message.kind;
139
140
  if (kind === RUNTIME_LIVENESS_READY_KIND) {
141
+ publisher.connect(socket, message.sessionEventDelivery === "reliable-v1" ? "reliable" : "ephemeral");
140
142
  connectionLiveness.start();
141
143
  return;
142
144
  }
@@ -144,6 +146,18 @@ export async function runRelayConnection({ config, directories, audit, sessions,
144
146
  connectionLiveness.acknowledge(message);
145
147
  return;
146
148
  }
149
+ if (kind === SESSION_EVENT_ACK_KIND) {
150
+ publisher.acknowledge(message);
151
+ return;
152
+ }
153
+ if (kind === SESSION_EVENT_DEFERRED_KIND) {
154
+ publisher.defer(message);
155
+ return;
156
+ }
157
+ if (kind === SESSION_EVENT_REJECTED_KIND) {
158
+ publisher.quarantine(message);
159
+ return;
160
+ }
147
161
  commands.handle(message);
148
162
  }
149
163
  catch (error) {
@@ -154,7 +168,6 @@ export async function runRelayConnection({ config, directories, audit, sessions,
154
168
  socket.addEventListener("close", handleClose);
155
169
  socket.addEventListener("error", handleError);
156
170
  socket.addEventListener("message", handleMessage);
157
- publisher.connect(socket);
158
171
  if (signal.aborted) {
159
172
  stop();
160
173
  }
@@ -1 +1 @@
1
- {"version":3,"file":"run-relay-connection.js","sourceRoot":"","sources":["../../src/relay-connection/run-relay-connection.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run-relay-connection.js","sourceRoot":"","sources":["../../src/relay-connection/run-relay-connection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
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 pending: (limit: number, excludedEventIds: readonly string[]) => readonly ReliableSessionEventEnvelope[];
17
+ readonly quarantine: (rejection: SessionEventRejected) => boolean;
18
+ }
19
+ //# sourceMappingURL=session-event-outbox.d.ts.map
@@ -0,0 +1 @@
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,CAoDtG;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"}
@@ -0,0 +1,228 @@
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
+ this.#database.exec("BEGIN IMMEDIATE");
88
+ try {
89
+ const state = this.#database
90
+ .prepare(`SELECT stream_id, next_source_seq, total_bytes
91
+ FROM relay_session_event_outbox_state
92
+ WHERE singleton = 1`)
93
+ .get();
94
+ const sourceSeq = rowNumber(state, "next_source_seq");
95
+ if (sourceSeq < 1 || !Number.isSafeInteger(sourceSeq + 1)) {
96
+ throw new Error("The Session event source sequence is exhausted");
97
+ }
98
+ const envelope = {
99
+ delivery: {
100
+ eventId: randomUUID(),
101
+ kind: "reliable",
102
+ sourceSeq: sourceSeq.toString(),
103
+ streamId: rowString(state, "stream_id"),
104
+ },
105
+ kind: SESSION_EVENT_KIND,
106
+ payload,
107
+ sessionId,
108
+ };
109
+ const encoded = encodeSessionEventEnvelope(envelope);
110
+ const byteLength = Buffer.byteLength(encoded, "utf8");
111
+ const maximumBytes = critical ? this.#limits.criticalEventBytes : this.#limits.standardEventBytes;
112
+ if (rowNumber(state, "total_bytes") + byteLength > maximumBytes) {
113
+ throw new SessionEventOutboxCapacityError();
114
+ }
115
+ this.#database
116
+ .prepare(`INSERT INTO relay_session_event_outbox (
117
+ event_id, session_id, source_seq, byte_length, envelope_json
118
+ ) VALUES (?, ?, ?, ?, ?)`)
119
+ .run(envelope.delivery.eventId, sessionId, sourceSeq, byteLength, encoded);
120
+ this.#database
121
+ .prepare(`UPDATE relay_session_event_outbox_state
122
+ SET next_source_seq = next_source_seq + 1,
123
+ total_bytes = total_bytes + ?
124
+ WHERE singleton = 1`)
125
+ .run(byteLength);
126
+ this.#database.exec("COMMIT");
127
+ return envelope;
128
+ }
129
+ catch (error) {
130
+ this.#database.exec("ROLLBACK");
131
+ throw error;
132
+ }
133
+ };
134
+ pending = (limit, excludedEventIds) => {
135
+ if (!Number.isSafeInteger(limit) || limit < 1) {
136
+ throw new Error("Session event replay limit must be a positive integer");
137
+ }
138
+ const exclusion = excludedEventIds.length === 0
139
+ ? ""
140
+ : `WHERE event_id NOT IN (${excludedEventIds.map(() => "?").join(", ")})`;
141
+ return this.#database
142
+ .prepare(`SELECT envelope_json
143
+ FROM relay_session_event_outbox
144
+ ${exclusion}
145
+ ORDER BY source_seq
146
+ LIMIT ?`)
147
+ .all(...excludedEventIds, limit)
148
+ .map((row) => {
149
+ const envelope = decodeSessionEventEnvelope(rowString(row, "envelope_json"));
150
+ if (!("delivery" in envelope)) {
151
+ throw new Error("SQLite returned an invalid reliable Session event envelope");
152
+ }
153
+ return envelope;
154
+ });
155
+ };
156
+ quarantine = (rejection) => {
157
+ this.#database.exec("BEGIN IMMEDIATE");
158
+ try {
159
+ const stored = this.#database
160
+ .prepare(`SELECT byte_length, envelope_json
161
+ FROM relay_session_event_outbox
162
+ WHERE event_id = ? AND session_id = ?`)
163
+ .get(rejection.eventId, rejection.sessionId);
164
+ if (stored === undefined) {
165
+ this.#database.exec("COMMIT");
166
+ return false;
167
+ }
168
+ this.#database
169
+ .prepare(`INSERT INTO relay_session_event_dead_letters (
170
+ event_id, session_id, rejection_code, envelope_json
171
+ ) VALUES (?, ?, ?, ?)`)
172
+ .run(rejection.eventId, rejection.sessionId, rejection.code, rowString(stored, "envelope_json"));
173
+ this.#deleteStored(rejection.eventId, rejection.sessionId, rowNumber(stored, "byte_length"));
174
+ this.#database
175
+ .prepare(`DELETE FROM relay_session_event_dead_letters
176
+ WHERE ordinal NOT IN (
177
+ SELECT ordinal FROM relay_session_event_dead_letters
178
+ ORDER BY ordinal DESC LIMIT ?
179
+ )`)
180
+ .run(MAX_DEAD_LETTERS);
181
+ this.#database.exec("COMMIT");
182
+ return true;
183
+ }
184
+ catch (error) {
185
+ this.#database.exec("ROLLBACK");
186
+ throw error;
187
+ }
188
+ };
189
+ #deleteStored = (eventId, sessionId, byteLength) => {
190
+ const deletion = this.#database
191
+ .prepare(`DELETE FROM relay_session_event_outbox
192
+ WHERE event_id = ? AND session_id = ?`)
193
+ .run(eventId, sessionId);
194
+ if (deletion.changes !== 1) {
195
+ throw new Error("The Session event could not be removed from the outbox");
196
+ }
197
+ const state = this.#database
198
+ .prepare(`UPDATE relay_session_event_outbox_state
199
+ SET total_bytes = total_bytes - ?
200
+ WHERE singleton = 1 AND total_bytes >= ?`)
201
+ .run(byteLength, byteLength);
202
+ if (state.changes !== 1) {
203
+ throw new Error("The Session event outbox capacity state is inconsistent");
204
+ }
205
+ };
206
+ #remove = (eventId, sessionId) => {
207
+ this.#database.exec("BEGIN IMMEDIATE");
208
+ try {
209
+ const stored = this.#database
210
+ .prepare(`SELECT byte_length
211
+ FROM relay_session_event_outbox
212
+ WHERE event_id = ? AND session_id = ?`)
213
+ .get(eventId, sessionId);
214
+ if (stored === undefined) {
215
+ this.#database.exec("COMMIT");
216
+ return false;
217
+ }
218
+ this.#deleteStored(eventId, sessionId, rowNumber(stored, "byte_length"));
219
+ this.#database.exec("COMMIT");
220
+ return true;
221
+ }
222
+ catch (error) {
223
+ this.#database.exec("ROLLBACK");
224
+ throw error;
225
+ }
226
+ };
227
+ }
228
+ //# sourceMappingURL=session-event-outbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-event-outbox.js","sourceRoot":"","sources":["../../src/relay-connection/session-event-outbox.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,17 @@
1
- import { type RecordedSessionEvent } from "@moxt-ai/mobius-protocol";
1
+ import { type RecordedSessionEvent, type SessionEventAcknowledgement, type SessionEventDeferred, type SessionEventRejected } from "@moxt-ai/mobius-protocol";
2
2
  import { WebSocket } from "undici";
3
- /** Live Session events are disposable: native Agent history and the active Turn snapshot restore viewers. */
3
+ import { type SessionEventOutbox } from "./session-event-outbox.ts";
4
+ import type { DaemonTimer } from "./timer.ts";
5
+ /** Persists every Session event until the Relay confirms its configured durability outcome. */
4
6
  export declare class DaemonSessionEventPublisher {
5
7
  #private;
6
- readonly connect: (socket: WebSocket) => void;
8
+ constructor(outbox: SessionEventOutbox, timer: DaemonTimer);
9
+ readonly acknowledge: (acknowledgement: SessionEventAcknowledgement) => void;
10
+ readonly close: () => void;
11
+ readonly connect: (socket: WebSocket, delivery: "ephemeral" | "reliable") => void;
12
+ readonly defer: (deferred: SessionEventDeferred) => void;
7
13
  readonly disconnect: (socket: WebSocket) => void;
8
14
  readonly publish: (sessionId: string, event: RecordedSessionEvent) => void;
9
- readonly close: () => void;
15
+ readonly quarantine: (rejection: SessionEventRejected) => void;
10
16
  }
11
17
  //# sourceMappingURL=session-event-publisher.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"session-event-publisher.d.ts","sourceRoot":"","sources":["../../src/relay-connection/session-event-publisher.ts"],"names":[],"mappings":"AAAA,OAAO,EAGH,KAAK,oBAAoB,EAE5B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAInC,6GAA6G;AAC7G,qBAAa,2BAA2B;;IAIpC,QAAQ,CAAC,OAAO,WAAY,SAAS,KAAG,IAAI,CAG1C;IAEF,QAAQ,CAAC,UAAU,WAAY,SAAS,KAAG,IAAI,CAI7C;IAEF,QAAQ,CAAC,OAAO,cAAe,MAAM,SAAS,oBAAoB,KAAG,IAAI,CAuBvE;IAEF,QAAQ,CAAC,KAAK,QAAO,IAAI,CAEvB;CASL"}
1
+ {"version":3,"file":"session-event-publisher.d.ts","sourceRoot":"","sources":["../../src/relay-connection/session-event-publisher.ts"],"names":[],"mappings":"AAAA,OAAO,EAIH,KAAK,oBAAoB,EAGzB,KAAK,2BAA2B,EAChC,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EAC5B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAEnC,OAAO,EAAE,KAAK,kBAAkB,EAAmC,MAAM,2BAA2B,CAAC;AACrG,OAAO,KAAK,EAAuB,WAAW,EAAE,MAAM,YAAY,CAAC;AA4BnE,+FAA+F;AAC/F,qBAAa,2BAA2B;;IASpC,YAAY,MAAM,EAAE,kBAAkB,EAAE,KAAK,EAAE,WAAW,EAGzD;IAED,QAAQ,CAAC,WAAW,oBAAqB,2BAA2B,KAAG,IAAI,CAMzE;IAEF,QAAQ,CAAC,KAAK,QAAO,IAAI,CAMvB;IAEF,QAAQ,CAAC,OAAO,WAAY,SAAS,YAAY,WAAW,GAAG,UAAU,KAAG,IAAI,CAI9E;IAEF,QAAQ,CAAC,KAAK,aAAc,oBAAoB,KAAG,IAAI,CAYrD;IAEF,QAAQ,CAAC,UAAU,WAAY,SAAS,KAAG,IAAI,CAM7C;IAEF,QAAQ,CAAC,OAAO,cAAe,MAAM,SAAS,oBAAoB,KAAG,IAAI,CAgBvE;IAEF,QAAQ,CAAC,UAAU,cAAe,oBAAoB,KAAG,IAAI,CAO3D;CA0EL"}
@@ -1,51 +1,159 @@
1
- import { encodeDaemonToServiceMessage, encodeRecordedSessionEvent, SESSION_EVENT_KIND, } from "@moxt-ai/mobius-protocol";
1
+ import { AGENT_ACTIVITY_KIND, encodeDaemonToServiceMessage, encodeRecordedSessionEvent, SESSION_COMPLETED_KIND, SESSION_FAILED_KIND, } from "@moxt-ai/mobius-protocol";
2
2
  import { WebSocket } from "undici";
3
- const MAX_LIVE_EVENT_BUFFERED_BYTES = 16 * 1024 * 1024;
4
- /** Live Session events are disposable: native Agent history and the active Turn snapshot restore viewers. */
3
+ import { SessionEventOutboxCapacityError } from "./session-event-outbox.js";
4
+ const SESSION_EVENT_REPLAY_WINDOW = 16;
5
+ const SESSION_EVENT_REPLAY_BYTE_LIMIT = 32 * 1024 * 1024;
6
+ function reservesSessionEventCapacity(event) {
7
+ if (event.kind === SESSION_COMPLETED_KIND || event.kind === SESSION_FAILED_KIND) {
8
+ return true;
9
+ }
10
+ return (event.kind === AGENT_ACTIVITY_KIND &&
11
+ (event.activityType === "progress" || event.activityType === "reasoning") &&
12
+ (event.status === "completed" || event.status === "failed"));
13
+ }
14
+ /** Persists every Session event until the Relay confirms its configured durability outcome. */
5
15
  export class DaemonSessionEventPublisher {
6
- #socket = null;
7
- #reportedDrop = false;
8
- connect = (socket) => {
9
- this.#socket = socket;
10
- this.#reportedDrop = false;
16
+ #inFlight = new Map();
17
+ #outbox;
18
+ #reportedCapacityKinds = new Set();
19
+ #timer;
20
+ #connection = { kind: "disconnected" };
21
+ #deferredReplay = null;
22
+ #inFlightBytes = 0;
23
+ constructor(outbox, timer) {
24
+ this.#outbox = outbox;
25
+ this.#timer = timer;
26
+ }
27
+ acknowledge = (acknowledgement) => {
28
+ if (!this.#outbox.acknowledge(acknowledgement)) {
29
+ return;
30
+ }
31
+ this.#removeInFlight(acknowledgement.eventId);
32
+ this.#publishNextBatch();
33
+ };
34
+ close = () => {
35
+ this.#deferredReplay?.cancel();
36
+ this.#deferredReplay = null;
37
+ this.#connection = { kind: "disconnected" };
38
+ this.#clearInFlight();
39
+ this.#outbox.close();
40
+ };
41
+ connect = (socket, delivery) => {
42
+ this.#connection = { delivery, kind: "connected", socket };
43
+ this.#clearInFlight();
44
+ this.#publishNextBatch();
45
+ };
46
+ defer = (deferred) => {
47
+ if (!this.#inFlight.has(deferred.eventId)) {
48
+ return;
49
+ }
50
+ this.#clearInFlight();
51
+ if (this.#deferredReplay !== null) {
52
+ return;
53
+ }
54
+ this.#deferredReplay = this.#timer.schedule(() => {
55
+ this.#deferredReplay = null;
56
+ this.#publishNextBatch();
57
+ }, deferred.retryAfterMilliseconds);
11
58
  };
12
59
  disconnect = (socket) => {
13
- if (this.#socket === socket) {
14
- this.#socket = null;
60
+ if (this.#connection.kind !== "connected" || this.#connection.socket !== socket) {
61
+ return;
15
62
  }
63
+ this.#connection = { kind: "disconnected" };
64
+ this.#clearInFlight();
16
65
  };
17
66
  publish = (sessionId, event) => {
18
- const socket = this.#socket;
19
- if (socket === null || socket.readyState !== WebSocket.OPEN) {
20
- this.#reportDrop();
67
+ try {
68
+ this.#outbox.enqueue(sessionId, encodeRecordedSessionEvent(event), reservesSessionEventCapacity(event));
69
+ }
70
+ catch (error) {
71
+ if (!(error instanceof SessionEventOutboxCapacityError)) {
72
+ throw error;
73
+ }
74
+ if (!this.#reportedCapacityKinds.has(event.kind)) {
75
+ this.#reportedCapacityKinds.add(event.kind);
76
+ console.warn(`Mobius daemon could not persist "${event.kind}" because the Session event outbox is full`);
77
+ }
21
78
  return;
22
79
  }
23
- if (socket.bufferedAmount >= MAX_LIVE_EVENT_BUFFERED_BYTES) {
24
- this.#socket = null;
25
- socket.close(1013, "Live event backpressure");
26
- this.#reportDrop();
80
+ this.#publishNextBatch();
81
+ };
82
+ quarantine = (rejection) => {
83
+ if (!this.#outbox.quarantine(rejection)) {
27
84
  return;
28
85
  }
29
- try {
30
- socket.send(encodeDaemonToServiceMessage({
31
- kind: SESSION_EVENT_KIND,
32
- payload: encodeRecordedSessionEvent(event),
33
- sessionId,
34
- }));
86
+ this.#removeInFlight(rejection.eventId);
87
+ console.error(`Mobius Relay rejected Session event ${rejection.eventId} with code ${rejection.code}`);
88
+ this.#publishNextBatch();
89
+ };
90
+ #clearInFlight = () => {
91
+ this.#inFlight.clear();
92
+ this.#inFlightBytes = 0;
93
+ };
94
+ #publishNextBatch = () => {
95
+ if (this.#deferredReplay !== null || this.#connection.kind !== "connected") {
96
+ return;
35
97
  }
36
- catch {
37
- this.#reportDrop();
98
+ while (this.#inFlight.size < SESSION_EVENT_REPLAY_WINDOW) {
99
+ const batch = this.#outbox.pending(SESSION_EVENT_REPLAY_WINDOW - this.#inFlight.size, [
100
+ ...this.#inFlight.keys(),
101
+ ]);
102
+ let sent = 0;
103
+ for (const envelope of batch) {
104
+ const encoded = encodeDaemonToServiceMessage(this.#connection.delivery === "reliable"
105
+ ? envelope
106
+ : {
107
+ kind: envelope.kind,
108
+ payload: envelope.payload,
109
+ sessionId: envelope.sessionId,
110
+ });
111
+ const byteLength = Buffer.byteLength(encoded, "utf8");
112
+ if (this.#inFlightBytes + byteLength > SESSION_EVENT_REPLAY_BYTE_LIMIT) {
113
+ return;
114
+ }
115
+ if (!this.#send(encoded)) {
116
+ this.#clearInFlight();
117
+ return;
118
+ }
119
+ if (this.#connection.delivery === "ephemeral") {
120
+ this.#outbox.acknowledge({
121
+ eventId: envelope.delivery.eventId,
122
+ kind: "session.event.ack",
123
+ outcome: { kind: "relayed" },
124
+ sessionId: envelope.sessionId,
125
+ });
126
+ sent += 1;
127
+ continue;
128
+ }
129
+ this.#inFlight.set(envelope.delivery.eventId, { byteLength });
130
+ this.#inFlightBytes += byteLength;
131
+ sent += 1;
132
+ }
133
+ if (sent === 0) {
134
+ return;
135
+ }
38
136
  }
39
137
  };
40
- close = () => {
41
- this.#socket = null;
42
- };
43
- #reportDrop = () => {
44
- if (this.#reportedDrop) {
138
+ #removeInFlight = (eventId) => {
139
+ const inFlight = this.#inFlight.get(eventId);
140
+ if (inFlight === undefined) {
45
141
  return;
46
142
  }
47
- this.#reportedDrop = true;
48
- console.warn("Mobius daemon dropped live Session events while the Relay was unavailable");
143
+ this.#inFlight.delete(eventId);
144
+ this.#inFlightBytes -= inFlight.byteLength;
145
+ };
146
+ #send = (encoded) => {
147
+ if (this.#connection.kind !== "connected" || this.#connection.socket.readyState !== WebSocket.OPEN) {
148
+ return false;
149
+ }
150
+ try {
151
+ this.#connection.socket.send(encoded);
152
+ return true;
153
+ }
154
+ catch {
155
+ return false;
156
+ }
49
157
  };
50
158
  }
51
159
  //# sourceMappingURL=session-event-publisher.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"session-event-publisher.js","sourceRoot":"","sources":["../../src/relay-connection/session-event-publisher.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,4BAA4B,EAC5B,0BAA0B,EAE1B,kBAAkB,GACrB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAEnC,MAAM,6BAA6B,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAEvD,6GAA6G;AAC7G,MAAM,OAAO,2BAA2B;IACpC,OAAO,GAAqB,IAAI,CAAC;IACjC,aAAa,GAAG,KAAK,CAAC;IAEb,OAAO,GAAG,CAAC,MAAiB,EAAQ,EAAE;QAC3C,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;IAC/B,CAAC,CAAC;IAEO,UAAU,GAAG,CAAC,MAAiB,EAAQ,EAAE;QAC9C,IAAI,IAAI,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;YAC1B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACxB,CAAC;IACL,CAAC,CAAC;IAEO,OAAO,GAAG,CAAC,SAAiB,EAAE,KAA2B,EAAQ,EAAE;QACxE,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;QAC5B,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YAC1D,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,OAAO;QACX,CAAC;QACD,IAAI,MAAM,CAAC,cAAc,IAAI,6BAA6B,EAAE,CAAC;YACzD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,yBAAyB,CAAC,CAAC;YAC9C,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,OAAO;QACX,CAAC;QACD,IAAI,CAAC;YACD,MAAM,CAAC,IAAI,CACP,4BAA4B,CAAC;gBACzB,IAAI,EAAE,kBAAkB;gBACxB,OAAO,EAAE,0BAA0B,CAAC,KAAK,CAAC;gBAC1C,SAAS;aACZ,CAAC,CACL,CAAC;QACN,CAAC;QAAC,MAAM,CAAC;YACL,IAAI,CAAC,WAAW,EAAE,CAAC;QACvB,CAAC;IACL,CAAC,CAAC;IAEO,KAAK,GAAG,GAAS,EAAE;QACxB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACxB,CAAC,CAAC;IAEO,WAAW,GAAG,GAAS,EAAE;QAC9B,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,OAAO;QACX,CAAC;QACD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,OAAO,CAAC,IAAI,CAAC,2EAA2E,CAAC,CAAC;IAC9F,CAAC,CAAC;CACL"}
1
+ {"version":3,"file":"session-event-publisher.js","sourceRoot":"","sources":["../../src/relay-connection/session-event-publisher.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,mBAAmB,EACnB,4BAA4B,EAC5B,0BAA0B,EAE1B,sBAAsB,EACtB,mBAAmB,GAItB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAEnC,OAAO,EAA2B,+BAA+B,EAAE,MAAM,2BAA2B,CAAC;AAGrG,MAAM,2BAA2B,GAAG,EAAE,CAAC;AACvC,MAAM,+BAA+B,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAczD,SAAS,4BAA4B,CAAC,KAA2B;IAC7D,IAAI,KAAK,CAAC,IAAI,KAAK,sBAAsB,IAAI,KAAK,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;QAC9E,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,OAAO,CACH,KAAK,CAAC,IAAI,KAAK,mBAAmB;QAClC,CAAC,KAAK,CAAC,YAAY,KAAK,UAAU,IAAI,KAAK,CAAC,YAAY,KAAK,WAAW,CAAC;QACzE,CAAC,KAAK,CAAC,MAAM,KAAK,WAAW,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,CAC9D,CAAC;AACN,CAAC;AAED,+FAA+F;AAC/F,MAAM,OAAO,2BAA2B;IAC3B,SAAS,GAAG,IAAI,GAAG,EAAyB,CAAC;IAC7C,OAAO,CAAqB;IAC5B,sBAAsB,GAAG,IAAI,GAAG,EAAU,CAAC;IAC3C,MAAM,CAAc;IAC7B,WAAW,GAAoB,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;IACxD,eAAe,GAA+B,IAAI,CAAC;IACnD,cAAc,GAAG,CAAC,CAAC;IAEnB,YAAY,MAA0B,EAAE,KAAkB;QACtD,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACxB,CAAC;IAEQ,WAAW,GAAG,CAAC,eAA4C,EAAQ,EAAE;QAC1E,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,eAAe,CAAC,EAAE,CAAC;YAC7C,OAAO;QACX,CAAC;QACD,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC7B,CAAC,CAAC;IAEO,KAAK,GAAG,GAAS,EAAE;QACxB,IAAI,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC;QAC/B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,WAAW,GAAG,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;QAC5C,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC,CAAC;IAEO,OAAO,GAAG,CAAC,MAAiB,EAAE,QAAkC,EAAQ,EAAE;QAC/E,IAAI,CAAC,WAAW,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;QAC3D,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC7B,CAAC,CAAC;IAEO,KAAK,GAAG,CAAC,QAA8B,EAAQ,EAAE;QACtD,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACxC,OAAO;QACX,CAAC;QACD,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,IAAI,IAAI,CAAC,eAAe,KAAK,IAAI,EAAE,CAAC;YAChC,OAAO;QACX,CAAC;QACD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE;YAC7C,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAC5B,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC7B,CAAC,EAAE,QAAQ,CAAC,sBAAsB,CAAC,CAAC;IACxC,CAAC,CAAC;IAEO,UAAU,GAAG,CAAC,MAAiB,EAAQ,EAAE;QAC9C,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,KAAK,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC9E,OAAO;QACX,CAAC;QACD,IAAI,CAAC,WAAW,GAAG,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;QAC5C,IAAI,CAAC,cAAc,EAAE,CAAC;IAC1B,CAAC,CAAC;IAEO,OAAO,GAAG,CAAC,SAAiB,EAAE,KAA2B,EAAQ,EAAE;QACxE,IAAI,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,0BAA0B,CAAC,KAAK,CAAC,EAAE,4BAA4B,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5G,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,CAAC,KAAK,YAAY,+BAA+B,CAAC,EAAE,CAAC;gBACtD,MAAM,KAAK,CAAC;YAChB,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC/C,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC5C,OAAO,CAAC,IAAI,CACR,oCAAoC,KAAK,CAAC,IAAI,4CAA4C,CAC7F,CAAC;YACN,CAAC;YACD,OAAO;QACX,CAAC;QACD,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC7B,CAAC,CAAC;IAEO,UAAU,GAAG,CAAC,SAA+B,EAAQ,EAAE;QAC5D,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACtC,OAAO;QACX,CAAC;QACD,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACxC,OAAO,CAAC,KAAK,CAAC,uCAAuC,SAAS,CAAC,OAAO,cAAc,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;QACtG,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC7B,CAAC,CAAC;IAEO,cAAc,GAAG,GAAS,EAAE;QACjC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACvB,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;IAC5B,CAAC,CAAC;IAEO,iBAAiB,GAAG,GAAS,EAAE;QACpC,IAAI,IAAI,CAAC,eAAe,KAAK,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YACzE,OAAO;QACX,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,GAAG,2BAA2B,EAAE,CAAC;YACvD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,2BAA2B,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;gBAClF,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;aAC3B,CAAC,CAAC;YACH,IAAI,IAAI,GAAG,CAAC,CAAC;YACb,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;gBAC3B,MAAM,OAAO,GAAG,4BAA4B,CACxC,IAAI,CAAC,WAAW,CAAC,QAAQ,KAAK,UAAU;oBACpC,CAAC,CAAC,QAAQ;oBACV,CAAC,CAAC;wBACI,IAAI,EAAE,QAAQ,CAAC,IAAI;wBACnB,OAAO,EAAE,QAAQ,CAAC,OAAO;wBACzB,SAAS,EAAE,QAAQ,CAAC,SAAS;qBAChC,CACV,CAAC;gBACF,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBACtD,IAAI,IAAI,CAAC,cAAc,GAAG,UAAU,GAAG,+BAA+B,EAAE,CAAC;oBACrE,OAAO;gBACX,CAAC;gBACD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;oBACvB,IAAI,CAAC,cAAc,EAAE,CAAC;oBACtB,OAAO;gBACX,CAAC;gBACD,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;oBAC5C,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;wBACrB,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,OAAO;wBAClC,IAAI,EAAE,mBAAmB;wBACzB,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;wBAC5B,SAAS,EAAE,QAAQ,CAAC,SAAS;qBAChC,CAAC,CAAC;oBACH,IAAI,IAAI,CAAC,CAAC;oBACV,SAAS;gBACb,CAAC;gBACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;gBAC9D,IAAI,CAAC,cAAc,IAAI,UAAU,CAAC;gBAClC,IAAI,IAAI,CAAC,CAAC;YACd,CAAC;YACD,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACb,OAAO;YACX,CAAC;QACL,CAAC;IACL,CAAC,CAAC;IAEO,eAAe,GAAG,CAAC,OAAe,EAAQ,EAAE;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YACzB,OAAO;QACX,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC/B,IAAI,CAAC,cAAc,IAAI,QAAQ,CAAC,UAAU,CAAC;IAC/C,CAAC,CAAC;IAEO,KAAK,GAAG,CAAC,OAAe,EAAW,EAAE;QAC1C,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,KAAK,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YACjG,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,IAAI,CAAC;YACD,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACtC,OAAO,IAAI,CAAC;QAChB,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC,CAAC;CACL"}
@@ -1 +1 @@
1
- {"version":3,"file":"run-daemon.d.ts","sourceRoot":"","sources":["../src/run-daemon.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAWhD,OAAO,EAAE,KAAK,WAAW,EAAqB,MAAM,6BAA6B,CAAC;AAwElF,MAAM,WAAW,gBAAgB;IAC7B,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,GAAG,cAAc,KAAK,IAAI,CAAC;IAC1E,QAAQ,CAAC,8BAA8B,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;CAC3G;AAED,wBAAsB,SAAS,CAC3B,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,WAAW,EACnB,KAAK,GAAE,WAA+B,EACtC,OAAO,GAAE,gBAAqB,GAC/B,OAAO,CAAC,IAAI,CAAC,CAiNf"}
1
+ {"version":3,"file":"run-daemon.d.ts","sourceRoot":"","sources":["../src/run-daemon.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAYhD,OAAO,EAAE,KAAK,WAAW,EAAqB,MAAM,6BAA6B,CAAC;AAwElF,MAAM,WAAW,gBAAgB;IAC7B,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,GAAG,cAAc,KAAK,IAAI,CAAC;IAC1E,QAAQ,CAAC,8BAA8B,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;CAC3G;AAED,wBAAsB,SAAS,CAC3B,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,WAAW,EACnB,KAAK,GAAE,WAA+B,EACtC,OAAO,GAAE,gBAAqB,GAC/B,OAAO,CAAC,IAAI,CAAC,CAqNf"}
@@ -19,6 +19,7 @@ import { DaemonOperationState } from "./relay-connection/daemon-operation-state.
19
19
  import { RelayConnectionDiagnostics } from "./relay-connection/diagnostics.js";
20
20
  import { runRelayConnection } from "./relay-connection/run-relay-connection.js";
21
21
  import { RuntimeRelayRevokedError } from "./relay-connection/runtime-revocation.js";
22
+ import { SessionEventOutbox } from "./relay-connection/session-event-outbox.js";
22
23
  import { DaemonSessionEventPublisher } from "./relay-connection/session-event-publisher.js";
23
24
  import { systemDaemonTimer } from "./relay-connection/timer.js";
24
25
  const RELAY_RECONNECT_DELAY_MILLISECONDS = 500;
@@ -87,7 +88,8 @@ export async function runDaemon(config, audit, signal, timer = systemDaemonTimer
87
88
  });
88
89
  const sessionStore = new SqliteAcpSessionStore(join(stateDirectory, "sessions", `${createHash("sha256").update(config.channelId).digest("hex")}.sqlite`));
89
90
  const operations = new DaemonOperationState();
90
- const publisher = new DaemonSessionEventPublisher();
91
+ const channelHash = createHash("sha256").update(config.channelId).digest("hex");
92
+ const publisher = new DaemonSessionEventPublisher(new SessionEventOutbox(join(stateDirectory, "events", `${channelHash}.sqlite`)), timer);
91
93
  const activeTurns = new DaemonTurnRegistry(operations);
92
94
  const recordSessionEvent = (sessionId, event) => {
93
95
  publisher.publish(sessionId, activeTurns.recordEvent(event));