@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.
- package/dist/cli.js +459 -40
- package/dist/cli.js.map +4 -4
- package/dist/daemon-turn-registry.d.ts +13 -13
- package/dist/index.js +458 -39
- package/dist/index.js.map +4 -4
- package/dist/relay-connection/run-relay-connection.d.ts.map +1 -1
- package/dist/relay-connection/run-relay-connection.js +15 -2
- package/dist/relay-connection/run-relay-connection.js.map +1 -1
- package/dist/relay-connection/session-event-outbox.d.ts +19 -0
- package/dist/relay-connection/session-event-outbox.d.ts.map +1 -0
- package/dist/relay-connection/session-event-outbox.js +228 -0
- package/dist/relay-connection/session-event-outbox.js.map +1 -0
- package/dist/relay-connection/session-event-publisher.d.ts +10 -4
- package/dist/relay-connection/session-event-publisher.d.ts.map +1 -1
- package/dist/relay-connection/session-event-publisher.js +140 -32
- package/dist/relay-connection/session-event-publisher.js.map +1 -1
- package/dist/run-daemon.d.ts.map +1 -1
- package/dist/run-daemon.js +3 -1
- package/dist/run-daemon.js.map +1 -1
- package/dist/runtime.js +464 -45
- package/dist/runtime.js.map +4 -4
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-relay-connection.d.ts","sourceRoot":"","sources":["../../src/relay-connection/run-relay-connection.ts"],"names":[],"mappings":"
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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,
|
|
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,
|
|
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
|
-
|
|
4
|
-
|
|
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
|
-
#
|
|
7
|
-
#
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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
|
|
14
|
-
|
|
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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
80
|
+
this.#publishNextBatch();
|
|
81
|
+
};
|
|
82
|
+
quarantine = (rejection) => {
|
|
83
|
+
if (!this.#outbox.quarantine(rejection)) {
|
|
27
84
|
return;
|
|
28
85
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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
|
-
|
|
37
|
-
this.#
|
|
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
|
-
|
|
41
|
-
|
|
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.#
|
|
48
|
-
|
|
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,
|
|
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"}
|
package/dist/run-daemon.d.ts.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/run-daemon.js
CHANGED
|
@@ -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
|
|
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));
|