@terminals-tech/agent-zero 1.0.0 → 2.0.0
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/LICENSE +21 -0
- package/THEORY.md +207 -0
- package/dist/agency/commandRouter.d.ts +10 -0
- package/dist/agency/commandRouter.d.ts.map +1 -1
- package/dist/agency/commandRouter.js +206 -0
- package/dist/agency/commandRouter.js.map +1 -1
- package/dist/agency/runtime.d.ts +26 -0
- package/dist/agency/runtime.d.ts.map +1 -1
- package/dist/agency/runtime.js +138 -6
- package/dist/agency/runtime.js.map +1 -1
- package/dist/channels/gemini.d.ts +73 -0
- package/dist/channels/gemini.d.ts.map +1 -0
- package/dist/channels/gemini.js +246 -0
- package/dist/channels/gemini.js.map +1 -0
- package/dist/channels/sms.d.ts.map +1 -1
- package/dist/channels/sms.js +1 -2
- package/dist/channels/sms.js.map +1 -1
- package/dist/interop/a2a.d.ts +133 -0
- package/dist/interop/a2a.d.ts.map +1 -0
- package/dist/interop/a2a.js +357 -0
- package/dist/interop/a2a.js.map +1 -0
- package/dist/interop/index.d.ts +10 -0
- package/dist/interop/index.d.ts.map +1 -0
- package/dist/interop/index.js +10 -0
- package/dist/interop/index.js.map +1 -0
- package/dist/interop/mcp.d.ts +111 -0
- package/dist/interop/mcp.d.ts.map +1 -0
- package/dist/interop/mcp.js +337 -0
- package/dist/interop/mcp.js.map +1 -0
- package/dist/moltbook/approvalGate.d.ts +23 -0
- package/dist/moltbook/approvalGate.d.ts.map +1 -1
- package/dist/moltbook/approvalGate.js +45 -0
- package/dist/moltbook/approvalGate.js.map +1 -1
- package/dist/moltbook/attentionField.d.ts +14 -0
- package/dist/moltbook/attentionField.d.ts.map +1 -1
- package/dist/moltbook/attentionField.js +37 -1
- package/dist/moltbook/attentionField.js.map +1 -1
- package/dist/moltbook/daemon.d.ts +27 -0
- package/dist/moltbook/daemon.d.ts.map +1 -1
- package/dist/moltbook/daemon.js +184 -5
- package/dist/moltbook/daemon.js.map +1 -1
- package/dist/moltbook/responseComposer.d.ts +7 -2
- package/dist/moltbook/responseComposer.d.ts.map +1 -1
- package/dist/moltbook/responseComposer.js +36 -7
- package/dist/moltbook/responseComposer.js.map +1 -1
- package/dist/moltbook/strategicContext.d.ts +89 -0
- package/dist/moltbook/strategicContext.d.ts.map +1 -0
- package/dist/moltbook/strategicContext.js +283 -0
- package/dist/moltbook/strategicContext.js.map +1 -0
- package/dist/primitives/index.d.ts +6 -2
- package/dist/primitives/index.d.ts.map +1 -1
- package/dist/primitives/index.js +6 -2
- package/dist/primitives/index.js.map +1 -1
- package/dist/rail/persistence.d.ts +70 -1
- package/dist/rail/persistence.d.ts.map +1 -1
- package/dist/rail/persistence.js +270 -3
- package/dist/rail/persistence.js.map +1 -1
- package/dist/rail/plugin.d.ts +76 -0
- package/dist/rail/plugin.d.ts.map +1 -0
- package/dist/rail/plugin.js +141 -0
- package/dist/rail/plugin.js.map +1 -0
- package/dist/rail/server.d.ts +121 -30
- package/dist/rail/server.d.ts.map +1 -1
- package/dist/rail/server.js +404 -28
- package/dist/rail/server.js.map +1 -1
- package/dist/rail/wsServer.d.ts +7 -0
- package/dist/rail/wsServer.d.ts.map +1 -1
- package/dist/rail/wsServer.js +233 -11
- package/dist/rail/wsServer.js.map +1 -1
- package/dist/resonance/globalKuramoto.d.ts +20 -0
- package/dist/resonance/globalKuramoto.d.ts.map +1 -1
- package/dist/resonance/globalKuramoto.js +95 -2
- package/dist/resonance/globalKuramoto.js.map +1 -1
- package/dist/resonance/kuramoto.d.ts +6 -0
- package/dist/resonance/kuramoto.d.ts.map +1 -1
- package/dist/resonance/kuramoto.js +25 -0
- package/dist/resonance/kuramoto.js.map +1 -1
- package/dist/routing/index.d.ts +2 -0
- package/dist/routing/index.d.ts.map +1 -1
- package/dist/routing/index.js +1 -0
- package/dist/routing/index.js.map +1 -1
- package/dist/routing/modelRegistry.d.ts +54 -0
- package/dist/routing/modelRegistry.d.ts.map +1 -0
- package/dist/routing/modelRegistry.js +150 -0
- package/dist/routing/modelRegistry.js.map +1 -0
- package/dist/routing/thermodynamic.d.ts +14 -3
- package/dist/routing/thermodynamic.d.ts.map +1 -1
- package/dist/routing/thermodynamic.js +26 -12
- package/dist/routing/thermodynamic.js.map +1 -1
- package/dist/runtime/agent-zero.d.ts +38 -2
- package/dist/runtime/agent-zero.d.ts.map +1 -1
- package/dist/runtime/agent-zero.js +110 -7
- package/dist/runtime/agent-zero.js.map +1 -1
- package/dist/runtime/contextWindow.d.ts +62 -0
- package/dist/runtime/contextWindow.d.ts.map +1 -0
- package/dist/runtime/contextWindow.js +125 -0
- package/dist/runtime/contextWindow.js.map +1 -0
- package/dist/runtime/identity.d.ts +65 -0
- package/dist/runtime/identity.d.ts.map +1 -0
- package/dist/runtime/identity.js +199 -0
- package/dist/runtime/identity.js.map +1 -0
- package/dist/runtime/index.d.ts +6 -0
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +6 -0
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/sessionStore.d.ts +70 -0
- package/dist/runtime/sessionStore.d.ts.map +1 -0
- package/dist/runtime/sessionStore.js +134 -0
- package/dist/runtime/sessionStore.js.map +1 -0
- package/dist/security/capabilities.d.ts +46 -0
- package/dist/security/capabilities.d.ts.map +1 -1
- package/dist/security/capabilities.js +176 -0
- package/dist/security/capabilities.js.map +1 -1
- package/dist/security/combinators.d.ts +89 -0
- package/dist/security/combinators.d.ts.map +1 -0
- package/dist/security/combinators.js +168 -0
- package/dist/security/combinators.js.map +1 -0
- package/dist/security/index.d.ts +7 -1
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/index.js +4 -1
- package/dist/security/index.js.map +1 -1
- package/dist/security/isolation.d.ts +76 -0
- package/dist/security/isolation.d.ts.map +1 -0
- package/dist/security/isolation.js +118 -0
- package/dist/security/isolation.js.map +1 -0
- package/dist/security/sandbox.d.ts +38 -1
- package/dist/security/sandbox.d.ts.map +1 -1
- package/dist/security/sandbox.js +68 -8
- package/dist/security/sandbox.js.map +1 -1
- package/package.json +13 -3
package/dist/rail/persistence.js
CHANGED
|
@@ -1,10 +1,57 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Rail Persistence Layer
|
|
3
3
|
*
|
|
4
|
-
* PGlite-backed persistence for rail sessions, events,
|
|
4
|
+
* PGlite-backed persistence for rail sessions, events, coherence logs,
|
|
5
|
+
* pause state, and reasoning traces.
|
|
5
6
|
* Stores to RAIL_DATA_DIR (default ./data) for Fly.io volume mount.
|
|
6
7
|
*/
|
|
7
8
|
import { PGlite } from '@electric-sql/pglite';
|
|
9
|
+
import { createCipheriv, createDecipheriv, createHash, randomBytes } from 'crypto';
|
|
10
|
+
import { cosineSimilarity } from '../routing/thermodynamic.js';
|
|
11
|
+
// ============================================================================
|
|
12
|
+
// ENROLLMENT ENCRYPTION (AES-256-GCM, key derived from RAIL_ADMIN_SECRET)
|
|
13
|
+
// ============================================================================
|
|
14
|
+
const ENC_PREFIX = 'enc:';
|
|
15
|
+
function getEnrollmentKey() {
|
|
16
|
+
const adminSecret = process.env['RAIL_ADMIN_SECRET'];
|
|
17
|
+
if (!adminSecret)
|
|
18
|
+
return null;
|
|
19
|
+
return createHash('sha256').update(adminSecret).digest();
|
|
20
|
+
}
|
|
21
|
+
function encryptSecret(plaintext) {
|
|
22
|
+
const key = getEnrollmentKey();
|
|
23
|
+
if (!key)
|
|
24
|
+
return plaintext; // fallback to plaintext if no admin secret
|
|
25
|
+
const iv = randomBytes(12);
|
|
26
|
+
const cipher = createCipheriv('aes-256-gcm', key, iv);
|
|
27
|
+
const encrypted = Buffer.concat([cipher.update(plaintext, 'utf8'), cipher.final()]);
|
|
28
|
+
const tag = cipher.getAuthTag();
|
|
29
|
+
// Format: enc:<iv hex>:<tag hex>:<ciphertext hex>
|
|
30
|
+
return `${ENC_PREFIX}${iv.toString('hex')}:${tag.toString('hex')}:${encrypted.toString('hex')}`;
|
|
31
|
+
}
|
|
32
|
+
function decryptSecret(stored) {
|
|
33
|
+
if (!stored.startsWith(ENC_PREFIX))
|
|
34
|
+
return stored; // legacy plaintext
|
|
35
|
+
const key = getEnrollmentKey();
|
|
36
|
+
if (!key)
|
|
37
|
+
return stored; // can't decrypt without admin secret
|
|
38
|
+
const parts = stored.slice(ENC_PREFIX.length).split(':');
|
|
39
|
+
if (parts.length !== 3)
|
|
40
|
+
return stored;
|
|
41
|
+
const [ivHex, tagHex, ciphertextHex] = parts;
|
|
42
|
+
try {
|
|
43
|
+
const decipher = createDecipheriv('aes-256-gcm', key, Buffer.from(ivHex, 'hex'));
|
|
44
|
+
decipher.setAuthTag(Buffer.from(tagHex, 'hex'));
|
|
45
|
+
const decrypted = Buffer.concat([decipher.update(Buffer.from(ciphertextHex, 'hex')), decipher.final()]);
|
|
46
|
+
return decrypted.toString('utf8');
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return stored; // decryption failed — wrong key or corrupt data
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// ============================================================================
|
|
53
|
+
// PERSISTENCE IMPLEMENTATION
|
|
54
|
+
// ============================================================================
|
|
8
55
|
export class PGliteRailPersistence {
|
|
9
56
|
db;
|
|
10
57
|
coherenceLogInterval;
|
|
@@ -58,8 +105,45 @@ export class PGliteRailPersistence {
|
|
|
58
105
|
secret_hash TEXT NOT NULL,
|
|
59
106
|
enrolled_at TIMESTAMPTZ DEFAULT NOW()
|
|
60
107
|
);
|
|
108
|
+
|
|
109
|
+
CREATE TABLE IF NOT EXISTS rail_pause_state (
|
|
110
|
+
id SERIAL PRIMARY KEY,
|
|
111
|
+
phases JSONB NOT NULL,
|
|
112
|
+
coherence REAL NOT NULL,
|
|
113
|
+
created_at TIMESTAMPTZ DEFAULT NOW()
|
|
114
|
+
);
|
|
115
|
+
|
|
116
|
+
CREATE TABLE IF NOT EXISTS rail_traces (
|
|
117
|
+
id SERIAL PRIMARY KEY,
|
|
118
|
+
agent_id TEXT NOT NULL,
|
|
119
|
+
agent_name TEXT NOT NULL,
|
|
120
|
+
content TEXT NOT NULL,
|
|
121
|
+
embedding TEXT,
|
|
122
|
+
kind TEXT NOT NULL,
|
|
123
|
+
metadata JSONB,
|
|
124
|
+
created_at TIMESTAMPTZ DEFAULT NOW()
|
|
125
|
+
);
|
|
126
|
+
|
|
127
|
+
CREATE INDEX IF NOT EXISTS idx_rail_traces_agent ON rail_traces(agent_id);
|
|
128
|
+
CREATE INDEX IF NOT EXISTS idx_rail_traces_kind ON rail_traces(kind);
|
|
129
|
+
|
|
130
|
+
CREATE TABLE IF NOT EXISTS rail_message_log (
|
|
131
|
+
seq SERIAL PRIMARY KEY,
|
|
132
|
+
type TEXT NOT NULL,
|
|
133
|
+
agent_id TEXT NOT NULL,
|
|
134
|
+
agent_name TEXT,
|
|
135
|
+
payload JSONB,
|
|
136
|
+
timestamp TIMESTAMPTZ NOT NULL,
|
|
137
|
+
created_at TIMESTAMPTZ DEFAULT NOW()
|
|
138
|
+
);
|
|
139
|
+
|
|
140
|
+
CREATE INDEX IF NOT EXISTS idx_rail_message_log_seq ON rail_message_log(seq);
|
|
141
|
+
CREATE INDEX IF NOT EXISTS idx_rail_message_log_ts ON rail_message_log(timestamp);
|
|
61
142
|
`);
|
|
62
143
|
}
|
|
144
|
+
// ==========================================================================
|
|
145
|
+
// SESSION / EVENT / COHERENCE (existing)
|
|
146
|
+
// ==========================================================================
|
|
63
147
|
async recordSession(client, action) {
|
|
64
148
|
await this.db.query('INSERT INTO rail_clients (agent_id, agent_name, platform, action) VALUES ($1, $2, $3, $4)', [client.agentId, client.agentName, client.platform, action]);
|
|
65
149
|
}
|
|
@@ -78,18 +162,201 @@ export class PGliteRailPersistence {
|
|
|
78
162
|
return result.rows;
|
|
79
163
|
}
|
|
80
164
|
async saveEnrollment(agentId, secretHash) {
|
|
165
|
+
const encrypted = encryptSecret(secretHash);
|
|
81
166
|
await this.db.query(`INSERT INTO rail_enrollments (agent_id, secret_hash) VALUES ($1, $2)
|
|
82
|
-
ON CONFLICT (agent_id) DO UPDATE SET secret_hash = $2`, [agentId,
|
|
167
|
+
ON CONFLICT (agent_id) DO UPDATE SET secret_hash = $2`, [agentId, encrypted]);
|
|
83
168
|
}
|
|
84
169
|
async loadEnrollments() {
|
|
85
170
|
const result = await this.db.query('SELECT agent_id, secret_hash FROM rail_enrollments');
|
|
86
|
-
|
|
171
|
+
const rows = result.rows;
|
|
172
|
+
return rows.map(row => ({
|
|
173
|
+
agent_id: row.agent_id,
|
|
174
|
+
secret_hash: decryptSecret(row.secret_hash),
|
|
175
|
+
}));
|
|
87
176
|
}
|
|
88
177
|
startCoherenceLogging(getCoherence, getAgentCount, getMeanPhase) {
|
|
89
178
|
this.coherenceLogInterval = setInterval(() => {
|
|
90
179
|
this.logCoherence(getCoherence(), getAgentCount(), getMeanPhase()).catch(() => { });
|
|
91
180
|
}, 60_000);
|
|
92
181
|
}
|
|
182
|
+
// ==========================================================================
|
|
183
|
+
// PAUSE STATE (A1)
|
|
184
|
+
// ==========================================================================
|
|
185
|
+
async savePauseState(phases, coherence) {
|
|
186
|
+
const phasesObj = {};
|
|
187
|
+
for (const [k, v] of phases) {
|
|
188
|
+
phasesObj[k] = v;
|
|
189
|
+
}
|
|
190
|
+
await this.db.query('INSERT INTO rail_pause_state (phases, coherence) VALUES ($1, $2)', [JSON.stringify(phasesObj), coherence]);
|
|
191
|
+
}
|
|
192
|
+
async loadPauseState() {
|
|
193
|
+
const result = await this.db.query('SELECT phases, coherence FROM rail_pause_state ORDER BY created_at DESC LIMIT 1');
|
|
194
|
+
if (result.rows.length === 0)
|
|
195
|
+
return null;
|
|
196
|
+
const row = result.rows[0];
|
|
197
|
+
const phasesRaw = typeof row.phases === 'string' ? JSON.parse(row.phases) : row.phases;
|
|
198
|
+
const phases = new Map();
|
|
199
|
+
for (const [k, v] of Object.entries(phasesRaw)) {
|
|
200
|
+
phases.set(k, v);
|
|
201
|
+
}
|
|
202
|
+
return { phases, coherence: row.coherence };
|
|
203
|
+
}
|
|
204
|
+
// ==========================================================================
|
|
205
|
+
// REASONING TRACES (A2)
|
|
206
|
+
// ==========================================================================
|
|
207
|
+
async saveTrace(trace) {
|
|
208
|
+
const embeddingStr = trace.embedding ? JSON.stringify(trace.embedding) : null;
|
|
209
|
+
const metadataStr = trace.metadata ? JSON.stringify(trace.metadata) : null;
|
|
210
|
+
const result = await this.db.query(`INSERT INTO rail_traces (agent_id, agent_name, content, embedding, kind, metadata)
|
|
211
|
+
VALUES ($1, $2, $3, $4, $5, $6)
|
|
212
|
+
RETURNING id`, [trace.agentId, trace.agentName, trace.content, embeddingStr, trace.kind, metadataStr]);
|
|
213
|
+
const row = result.rows[0];
|
|
214
|
+
return String(row.id);
|
|
215
|
+
}
|
|
216
|
+
async searchTraces(query) {
|
|
217
|
+
const limit = query.limit ?? 10;
|
|
218
|
+
// Build filter conditions
|
|
219
|
+
const conditions = [];
|
|
220
|
+
const params = [];
|
|
221
|
+
let paramIdx = 1;
|
|
222
|
+
if (query.agentId) {
|
|
223
|
+
conditions.push(`agent_id = $${paramIdx}`);
|
|
224
|
+
params.push(query.agentId);
|
|
225
|
+
paramIdx++;
|
|
226
|
+
}
|
|
227
|
+
if (query.kind) {
|
|
228
|
+
conditions.push(`kind = $${paramIdx}`);
|
|
229
|
+
params.push(query.kind);
|
|
230
|
+
paramIdx++;
|
|
231
|
+
}
|
|
232
|
+
if (query.since) {
|
|
233
|
+
conditions.push(`created_at >= to_timestamp($${paramIdx})`);
|
|
234
|
+
params.push(query.since / 1000); // JS timestamp to Unix seconds
|
|
235
|
+
paramIdx++;
|
|
236
|
+
}
|
|
237
|
+
const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
|
|
238
|
+
// If embedding search is requested, load matching rows (capped) and compute cosine similarity in JS
|
|
239
|
+
if (query.embedding && query.embedding.length > 0) {
|
|
240
|
+
// Cap the candidate set to avoid loading the entire table
|
|
241
|
+
const candidateLimit = Math.max(limit * 10, 1000);
|
|
242
|
+
params.push(candidateLimit);
|
|
243
|
+
const sql = `SELECT id, agent_id, agent_name, content, kind, embedding, metadata, created_at
|
|
244
|
+
FROM rail_traces ${whereClause}
|
|
245
|
+
ORDER BY created_at DESC
|
|
246
|
+
LIMIT $${paramIdx}`;
|
|
247
|
+
paramIdx++;
|
|
248
|
+
const result = await this.db.query(sql, params);
|
|
249
|
+
const rows = result.rows;
|
|
250
|
+
// Compute cosine similarity for rows with embeddings
|
|
251
|
+
const scored = [];
|
|
252
|
+
for (const row of rows) {
|
|
253
|
+
let similarity = 0;
|
|
254
|
+
if (row.embedding) {
|
|
255
|
+
try {
|
|
256
|
+
const rowEmbedding = typeof row.embedding === 'string'
|
|
257
|
+
? JSON.parse(row.embedding)
|
|
258
|
+
: row.embedding;
|
|
259
|
+
if (rowEmbedding.length === query.embedding.length) {
|
|
260
|
+
similarity = cosineSimilarity(query.embedding, rowEmbedding);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
catch {
|
|
264
|
+
// Skip rows with unparseable embeddings
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
scored.push({
|
|
268
|
+
id: row.id,
|
|
269
|
+
agent_id: row.agent_id,
|
|
270
|
+
agent_name: row.agent_name,
|
|
271
|
+
content: row.content,
|
|
272
|
+
kind: row.kind,
|
|
273
|
+
metadata: row.metadata,
|
|
274
|
+
similarity,
|
|
275
|
+
created_at: row.created_at,
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
// Sort by similarity descending, return top-K
|
|
279
|
+
scored.sort((a, b) => (b.similarity ?? 0) - (a.similarity ?? 0));
|
|
280
|
+
return scored.slice(0, limit);
|
|
281
|
+
}
|
|
282
|
+
// No embedding search — just filter and return
|
|
283
|
+
const sql = `SELECT id, agent_id, agent_name, content, kind, metadata, created_at
|
|
284
|
+
FROM rail_traces ${whereClause}
|
|
285
|
+
ORDER BY created_at DESC
|
|
286
|
+
LIMIT $${paramIdx}`;
|
|
287
|
+
params.push(limit);
|
|
288
|
+
const result = await this.db.query(sql, params);
|
|
289
|
+
return result.rows.map(row => ({
|
|
290
|
+
...row,
|
|
291
|
+
similarity: undefined,
|
|
292
|
+
}));
|
|
293
|
+
}
|
|
294
|
+
async getTracesByAgent(agentId, limit = 50) {
|
|
295
|
+
const result = await this.db.query(`SELECT id, agent_id, agent_name, content, kind, metadata, created_at
|
|
296
|
+
FROM rail_traces WHERE agent_id = $1 ORDER BY created_at DESC LIMIT $2`, [agentId, limit]);
|
|
297
|
+
return result.rows;
|
|
298
|
+
}
|
|
299
|
+
// ==========================================================================
|
|
300
|
+
// MESSAGE LOG (D2)
|
|
301
|
+
// ==========================================================================
|
|
302
|
+
/**
|
|
303
|
+
* Log a rail message and return its monotonic sequence number.
|
|
304
|
+
*/
|
|
305
|
+
async logMessage(message) {
|
|
306
|
+
const payloadStr = message.payload != null ? JSON.stringify(message.payload) : null;
|
|
307
|
+
const ts = new Date(message.timestamp).toISOString();
|
|
308
|
+
const result = await this.db.query(`INSERT INTO rail_message_log (type, agent_id, agent_name, payload, timestamp)
|
|
309
|
+
VALUES ($1, $2, $3, $4, $5)
|
|
310
|
+
RETURNING seq`, [message.type, message.agentId, message.agentName, payloadStr, ts]);
|
|
311
|
+
const row = result.rows[0];
|
|
312
|
+
return row.seq;
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Replay messages from a given sequence number forward.
|
|
316
|
+
*/
|
|
317
|
+
async replayMessages(fromSeq, limit) {
|
|
318
|
+
const effectiveLimit = limit ?? 1000;
|
|
319
|
+
const result = await this.db.query(`SELECT seq, type, agent_id, agent_name, payload, timestamp
|
|
320
|
+
FROM rail_message_log
|
|
321
|
+
WHERE seq >= $1
|
|
322
|
+
ORDER BY seq ASC
|
|
323
|
+
LIMIT $2`, [fromSeq, effectiveLimit]);
|
|
324
|
+
return result.rows;
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Get the latest sequence number in the message log.
|
|
328
|
+
* Returns 0 if no messages have been logged.
|
|
329
|
+
*/
|
|
330
|
+
async getLatestSeq() {
|
|
331
|
+
const result = await this.db.query('SELECT COALESCE(MAX(seq), 0) AS max_seq FROM rail_message_log');
|
|
332
|
+
const row = result.rows[0];
|
|
333
|
+
return row.max_seq;
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Prune old messages from the log.
|
|
337
|
+
* @param keepCount - Keep the last N messages (by seq). If provided, deletes older ones.
|
|
338
|
+
* @param keepSince - Keep messages since this JS timestamp (ms). If provided, deletes older ones.
|
|
339
|
+
* @returns Number of deleted rows.
|
|
340
|
+
*/
|
|
341
|
+
async pruneMessageLog(keepCount, keepSince) {
|
|
342
|
+
if (keepCount != null && keepCount > 0) {
|
|
343
|
+
// Delete all except the last keepCount messages
|
|
344
|
+
const result = await this.db.query(`DELETE FROM rail_message_log
|
|
345
|
+
WHERE seq NOT IN (
|
|
346
|
+
SELECT seq FROM rail_message_log ORDER BY seq DESC LIMIT $1
|
|
347
|
+
)`, [keepCount]);
|
|
348
|
+
return result.affectedRows ?? 0;
|
|
349
|
+
}
|
|
350
|
+
if (keepSince != null) {
|
|
351
|
+
const sinceTs = new Date(keepSince).toISOString();
|
|
352
|
+
const result = await this.db.query(`DELETE FROM rail_message_log WHERE timestamp < $1`, [sinceTs]);
|
|
353
|
+
return result.affectedRows ?? 0;
|
|
354
|
+
}
|
|
355
|
+
return 0;
|
|
356
|
+
}
|
|
357
|
+
// ==========================================================================
|
|
358
|
+
// CLOSE
|
|
359
|
+
// ==========================================================================
|
|
93
360
|
async close() {
|
|
94
361
|
if (this.coherenceLogInterval) {
|
|
95
362
|
clearInterval(this.coherenceLogInterval);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persistence.js","sourceRoot":"","sources":["../../src/rail/persistence.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"persistence.js","sourceRoot":"","sources":["../../src/rail/persistence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rail Plugin System (A4)
|
|
3
|
+
*
|
|
4
|
+
* Allows external code to register with the rail and receive/send messages.
|
|
5
|
+
* Plugins receive notifications for broadcasts, coherence updates, and trace events.
|
|
6
|
+
*/
|
|
7
|
+
import type { ResonanceRailServer, RailMessage, RailStats, RailClient } from './server.js';
|
|
8
|
+
import type { TraceRecord } from './persistence.js';
|
|
9
|
+
export interface RailPlugin {
|
|
10
|
+
id: string;
|
|
11
|
+
name: string;
|
|
12
|
+
/** Called when plugin is registered with the rail. */
|
|
13
|
+
onRegister?(context: RailPluginContext): void;
|
|
14
|
+
/** Called on each broadcast message. */
|
|
15
|
+
onBroadcast?(message: RailMessage): void;
|
|
16
|
+
/** Called on each coherence update (from Kuramoto tick). */
|
|
17
|
+
onCoherence?(coherence: number): void;
|
|
18
|
+
/** Called on trace events (reasoning traces from agents). */
|
|
19
|
+
onTrace?(trace: {
|
|
20
|
+
agentId: string;
|
|
21
|
+
content: string;
|
|
22
|
+
kind: string;
|
|
23
|
+
}): void;
|
|
24
|
+
}
|
|
25
|
+
export interface RailPluginContext {
|
|
26
|
+
/** Send a message through the rail. */
|
|
27
|
+
sendMessage(message: Omit<RailMessage, 'timestamp'>): void;
|
|
28
|
+
/** Get current server stats. */
|
|
29
|
+
getStats(): RailStats;
|
|
30
|
+
/** Get connected agents. */
|
|
31
|
+
getAgents(): RailClient[];
|
|
32
|
+
/** Search traces by embedding similarity. */
|
|
33
|
+
searchTraces(embedding: number[], limit?: number): Promise<TraceRecord[]>;
|
|
34
|
+
}
|
|
35
|
+
export declare class RailPluginManager {
|
|
36
|
+
private plugins;
|
|
37
|
+
private context;
|
|
38
|
+
constructor(rail: ResonanceRailServer);
|
|
39
|
+
/**
|
|
40
|
+
* Register a plugin with the rail.
|
|
41
|
+
* Calls plugin.onRegister with the context if defined.
|
|
42
|
+
*/
|
|
43
|
+
register(plugin: RailPlugin): void;
|
|
44
|
+
/**
|
|
45
|
+
* Unregister a plugin by ID.
|
|
46
|
+
*/
|
|
47
|
+
unregister(pluginId: string): void;
|
|
48
|
+
/**
|
|
49
|
+
* Get a registered plugin by ID.
|
|
50
|
+
*/
|
|
51
|
+
getPlugin(pluginId: string): RailPlugin | undefined;
|
|
52
|
+
/**
|
|
53
|
+
* List all registered plugins.
|
|
54
|
+
*/
|
|
55
|
+
listPlugins(): Array<{
|
|
56
|
+
id: string;
|
|
57
|
+
name: string;
|
|
58
|
+
}>;
|
|
59
|
+
/**
|
|
60
|
+
* Notify all plugins of a broadcast message.
|
|
61
|
+
*/
|
|
62
|
+
notifyBroadcast(message: RailMessage): void;
|
|
63
|
+
/**
|
|
64
|
+
* Notify all plugins of a coherence update.
|
|
65
|
+
*/
|
|
66
|
+
notifyCoherence(coherence: number): void;
|
|
67
|
+
/**
|
|
68
|
+
* Notify all plugins of a trace event.
|
|
69
|
+
*/
|
|
70
|
+
notifyTrace(trace: {
|
|
71
|
+
agentId: string;
|
|
72
|
+
content: string;
|
|
73
|
+
kind: string;
|
|
74
|
+
}): void;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/rail/plugin.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC3F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAOpD,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IAEb,sDAAsD;IACtD,UAAU,CAAC,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAE9C,wCAAwC;IACxC,WAAW,CAAC,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IAEzC,4DAA4D;IAC5D,WAAW,CAAC,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAEtC,6DAA6D;IAC7D,OAAO,CAAC,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAC3E;AAED,MAAM,WAAW,iBAAiB;IAChC,uCAAuC;IACvC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,GAAG,IAAI,CAAC;IAE3D,gCAAgC;IAChC,QAAQ,IAAI,SAAS,CAAC;IAEtB,4BAA4B;IAC5B,SAAS,IAAI,UAAU,EAAE,CAAC;IAE1B,6CAA6C;IAC7C,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;CAC3E;AAMD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,OAAO,CAAsC;IACrD,OAAO,CAAC,OAAO,CAAoB;gBAEvB,IAAI,EAAE,mBAAmB;IAyBrC;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAqBlC;;OAEG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAOlC;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAInD;;OAEG;IACH,WAAW,IAAI,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAYlD;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAe3C;;OAEG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAexC;;OAEG;IACH,WAAW,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;CAc7E"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rail Plugin System (A4)
|
|
3
|
+
*
|
|
4
|
+
* Allows external code to register with the rail and receive/send messages.
|
|
5
|
+
* Plugins receive notifications for broadcasts, coherence updates, and trace events.
|
|
6
|
+
*/
|
|
7
|
+
import { railLog } from './logger.js';
|
|
8
|
+
// ============================================================================
|
|
9
|
+
// PLUGIN MANAGER
|
|
10
|
+
// ============================================================================
|
|
11
|
+
export class RailPluginManager {
|
|
12
|
+
plugins = new Map();
|
|
13
|
+
context;
|
|
14
|
+
constructor(rail) {
|
|
15
|
+
this.context = {
|
|
16
|
+
sendMessage(message) {
|
|
17
|
+
rail.processMessage({
|
|
18
|
+
...message,
|
|
19
|
+
timestamp: Date.now(),
|
|
20
|
+
});
|
|
21
|
+
},
|
|
22
|
+
getStats() {
|
|
23
|
+
return rail.getStats();
|
|
24
|
+
},
|
|
25
|
+
getAgents() {
|
|
26
|
+
return rail.getClients();
|
|
27
|
+
},
|
|
28
|
+
async searchTraces(embedding, limit) {
|
|
29
|
+
const persistence = rail.getPersistence();
|
|
30
|
+
if (!persistence)
|
|
31
|
+
return [];
|
|
32
|
+
return persistence.searchTraces({ embedding, limit });
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Register a plugin with the rail.
|
|
38
|
+
* Calls plugin.onRegister with the context if defined.
|
|
39
|
+
*/
|
|
40
|
+
register(plugin) {
|
|
41
|
+
if (this.plugins.has(plugin.id)) {
|
|
42
|
+
railLog.warn('plugin', 'Plugin already registered, replacing', { id: plugin.id });
|
|
43
|
+
}
|
|
44
|
+
this.plugins.set(plugin.id, plugin);
|
|
45
|
+
if (plugin.onRegister) {
|
|
46
|
+
try {
|
|
47
|
+
plugin.onRegister(this.context);
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
railLog.error('plugin', 'Plugin onRegister failed', {
|
|
51
|
+
id: plugin.id,
|
|
52
|
+
error: String(err),
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
railLog.info('plugin', 'Plugin registered', { id: plugin.id, name: plugin.name });
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Unregister a plugin by ID.
|
|
60
|
+
*/
|
|
61
|
+
unregister(pluginId) {
|
|
62
|
+
const existed = this.plugins.delete(pluginId);
|
|
63
|
+
if (existed) {
|
|
64
|
+
railLog.info('plugin', 'Plugin unregistered', { id: pluginId });
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Get a registered plugin by ID.
|
|
69
|
+
*/
|
|
70
|
+
getPlugin(pluginId) {
|
|
71
|
+
return this.plugins.get(pluginId);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* List all registered plugins.
|
|
75
|
+
*/
|
|
76
|
+
listPlugins() {
|
|
77
|
+
const list = [];
|
|
78
|
+
for (const plugin of this.plugins.values()) {
|
|
79
|
+
list.push({ id: plugin.id, name: plugin.name });
|
|
80
|
+
}
|
|
81
|
+
return list;
|
|
82
|
+
}
|
|
83
|
+
// ==========================================================================
|
|
84
|
+
// NOTIFICATION METHODS (called by server)
|
|
85
|
+
// ==========================================================================
|
|
86
|
+
/**
|
|
87
|
+
* Notify all plugins of a broadcast message.
|
|
88
|
+
*/
|
|
89
|
+
notifyBroadcast(message) {
|
|
90
|
+
for (const plugin of this.plugins.values()) {
|
|
91
|
+
if (plugin.onBroadcast) {
|
|
92
|
+
try {
|
|
93
|
+
plugin.onBroadcast(message);
|
|
94
|
+
}
|
|
95
|
+
catch (err) {
|
|
96
|
+
railLog.error('plugin', 'Plugin onBroadcast error', {
|
|
97
|
+
id: plugin.id,
|
|
98
|
+
error: String(err),
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Notify all plugins of a coherence update.
|
|
106
|
+
*/
|
|
107
|
+
notifyCoherence(coherence) {
|
|
108
|
+
for (const plugin of this.plugins.values()) {
|
|
109
|
+
if (plugin.onCoherence) {
|
|
110
|
+
try {
|
|
111
|
+
plugin.onCoherence(coherence);
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
railLog.error('plugin', 'Plugin onCoherence error', {
|
|
115
|
+
id: plugin.id,
|
|
116
|
+
error: String(err),
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Notify all plugins of a trace event.
|
|
124
|
+
*/
|
|
125
|
+
notifyTrace(trace) {
|
|
126
|
+
for (const plugin of this.plugins.values()) {
|
|
127
|
+
if (plugin.onTrace) {
|
|
128
|
+
try {
|
|
129
|
+
plugin.onTrace(trace);
|
|
130
|
+
}
|
|
131
|
+
catch (err) {
|
|
132
|
+
railLog.error('plugin', 'Plugin onTrace error', {
|
|
133
|
+
id: plugin.id,
|
|
134
|
+
error: String(err),
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/rail/plugin.ts"],"names":[],"mappings":"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"}
|