@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.
Files changed (130) hide show
  1. package/LICENSE +21 -0
  2. package/THEORY.md +207 -0
  3. package/dist/agency/commandRouter.d.ts +10 -0
  4. package/dist/agency/commandRouter.d.ts.map +1 -1
  5. package/dist/agency/commandRouter.js +206 -0
  6. package/dist/agency/commandRouter.js.map +1 -1
  7. package/dist/agency/runtime.d.ts +26 -0
  8. package/dist/agency/runtime.d.ts.map +1 -1
  9. package/dist/agency/runtime.js +138 -6
  10. package/dist/agency/runtime.js.map +1 -1
  11. package/dist/channels/gemini.d.ts +73 -0
  12. package/dist/channels/gemini.d.ts.map +1 -0
  13. package/dist/channels/gemini.js +246 -0
  14. package/dist/channels/gemini.js.map +1 -0
  15. package/dist/channels/sms.d.ts.map +1 -1
  16. package/dist/channels/sms.js +1 -2
  17. package/dist/channels/sms.js.map +1 -1
  18. package/dist/interop/a2a.d.ts +133 -0
  19. package/dist/interop/a2a.d.ts.map +1 -0
  20. package/dist/interop/a2a.js +357 -0
  21. package/dist/interop/a2a.js.map +1 -0
  22. package/dist/interop/index.d.ts +10 -0
  23. package/dist/interop/index.d.ts.map +1 -0
  24. package/dist/interop/index.js +10 -0
  25. package/dist/interop/index.js.map +1 -0
  26. package/dist/interop/mcp.d.ts +111 -0
  27. package/dist/interop/mcp.d.ts.map +1 -0
  28. package/dist/interop/mcp.js +337 -0
  29. package/dist/interop/mcp.js.map +1 -0
  30. package/dist/moltbook/approvalGate.d.ts +23 -0
  31. package/dist/moltbook/approvalGate.d.ts.map +1 -1
  32. package/dist/moltbook/approvalGate.js +45 -0
  33. package/dist/moltbook/approvalGate.js.map +1 -1
  34. package/dist/moltbook/attentionField.d.ts +14 -0
  35. package/dist/moltbook/attentionField.d.ts.map +1 -1
  36. package/dist/moltbook/attentionField.js +37 -1
  37. package/dist/moltbook/attentionField.js.map +1 -1
  38. package/dist/moltbook/daemon.d.ts +27 -0
  39. package/dist/moltbook/daemon.d.ts.map +1 -1
  40. package/dist/moltbook/daemon.js +184 -5
  41. package/dist/moltbook/daemon.js.map +1 -1
  42. package/dist/moltbook/responseComposer.d.ts +7 -2
  43. package/dist/moltbook/responseComposer.d.ts.map +1 -1
  44. package/dist/moltbook/responseComposer.js +36 -7
  45. package/dist/moltbook/responseComposer.js.map +1 -1
  46. package/dist/moltbook/strategicContext.d.ts +89 -0
  47. package/dist/moltbook/strategicContext.d.ts.map +1 -0
  48. package/dist/moltbook/strategicContext.js +283 -0
  49. package/dist/moltbook/strategicContext.js.map +1 -0
  50. package/dist/primitives/index.d.ts +6 -2
  51. package/dist/primitives/index.d.ts.map +1 -1
  52. package/dist/primitives/index.js +6 -2
  53. package/dist/primitives/index.js.map +1 -1
  54. package/dist/rail/persistence.d.ts +70 -1
  55. package/dist/rail/persistence.d.ts.map +1 -1
  56. package/dist/rail/persistence.js +270 -3
  57. package/dist/rail/persistence.js.map +1 -1
  58. package/dist/rail/plugin.d.ts +76 -0
  59. package/dist/rail/plugin.d.ts.map +1 -0
  60. package/dist/rail/plugin.js +141 -0
  61. package/dist/rail/plugin.js.map +1 -0
  62. package/dist/rail/server.d.ts +121 -30
  63. package/dist/rail/server.d.ts.map +1 -1
  64. package/dist/rail/server.js +404 -28
  65. package/dist/rail/server.js.map +1 -1
  66. package/dist/rail/wsServer.d.ts +7 -0
  67. package/dist/rail/wsServer.d.ts.map +1 -1
  68. package/dist/rail/wsServer.js +233 -11
  69. package/dist/rail/wsServer.js.map +1 -1
  70. package/dist/resonance/globalKuramoto.d.ts +20 -0
  71. package/dist/resonance/globalKuramoto.d.ts.map +1 -1
  72. package/dist/resonance/globalKuramoto.js +95 -2
  73. package/dist/resonance/globalKuramoto.js.map +1 -1
  74. package/dist/resonance/kuramoto.d.ts +6 -0
  75. package/dist/resonance/kuramoto.d.ts.map +1 -1
  76. package/dist/resonance/kuramoto.js +25 -0
  77. package/dist/resonance/kuramoto.js.map +1 -1
  78. package/dist/routing/index.d.ts +2 -0
  79. package/dist/routing/index.d.ts.map +1 -1
  80. package/dist/routing/index.js +1 -0
  81. package/dist/routing/index.js.map +1 -1
  82. package/dist/routing/modelRegistry.d.ts +54 -0
  83. package/dist/routing/modelRegistry.d.ts.map +1 -0
  84. package/dist/routing/modelRegistry.js +150 -0
  85. package/dist/routing/modelRegistry.js.map +1 -0
  86. package/dist/routing/thermodynamic.d.ts +14 -3
  87. package/dist/routing/thermodynamic.d.ts.map +1 -1
  88. package/dist/routing/thermodynamic.js +26 -12
  89. package/dist/routing/thermodynamic.js.map +1 -1
  90. package/dist/runtime/agent-zero.d.ts +38 -2
  91. package/dist/runtime/agent-zero.d.ts.map +1 -1
  92. package/dist/runtime/agent-zero.js +110 -7
  93. package/dist/runtime/agent-zero.js.map +1 -1
  94. package/dist/runtime/contextWindow.d.ts +62 -0
  95. package/dist/runtime/contextWindow.d.ts.map +1 -0
  96. package/dist/runtime/contextWindow.js +125 -0
  97. package/dist/runtime/contextWindow.js.map +1 -0
  98. package/dist/runtime/identity.d.ts +65 -0
  99. package/dist/runtime/identity.d.ts.map +1 -0
  100. package/dist/runtime/identity.js +199 -0
  101. package/dist/runtime/identity.js.map +1 -0
  102. package/dist/runtime/index.d.ts +6 -0
  103. package/dist/runtime/index.d.ts.map +1 -1
  104. package/dist/runtime/index.js +6 -0
  105. package/dist/runtime/index.js.map +1 -1
  106. package/dist/runtime/sessionStore.d.ts +70 -0
  107. package/dist/runtime/sessionStore.d.ts.map +1 -0
  108. package/dist/runtime/sessionStore.js +134 -0
  109. package/dist/runtime/sessionStore.js.map +1 -0
  110. package/dist/security/capabilities.d.ts +46 -0
  111. package/dist/security/capabilities.d.ts.map +1 -1
  112. package/dist/security/capabilities.js +176 -0
  113. package/dist/security/capabilities.js.map +1 -1
  114. package/dist/security/combinators.d.ts +89 -0
  115. package/dist/security/combinators.d.ts.map +1 -0
  116. package/dist/security/combinators.js +168 -0
  117. package/dist/security/combinators.js.map +1 -0
  118. package/dist/security/index.d.ts +7 -1
  119. package/dist/security/index.d.ts.map +1 -1
  120. package/dist/security/index.js +4 -1
  121. package/dist/security/index.js.map +1 -1
  122. package/dist/security/isolation.d.ts +76 -0
  123. package/dist/security/isolation.d.ts.map +1 -0
  124. package/dist/security/isolation.js +118 -0
  125. package/dist/security/isolation.js.map +1 -0
  126. package/dist/security/sandbox.d.ts +38 -1
  127. package/dist/security/sandbox.d.ts.map +1 -1
  128. package/dist/security/sandbox.js +68 -8
  129. package/dist/security/sandbox.js.map +1 -1
  130. package/package.json +13 -3
@@ -1,10 +1,57 @@
1
1
  /**
2
2
  * Rail Persistence Layer
3
3
  *
4
- * PGlite-backed persistence for rail sessions, events, and coherence logs.
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, secretHash]);
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
- return result.rows;
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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"}