agent-relay 2.0.37 → 2.1.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 (81) hide show
  1. package/dist/index.cjs +31903 -33913
  2. package/dist/src/cli/index.js +36 -51
  3. package/dist/src/cli/index.js.map +1 -1
  4. package/package.json +18 -19
  5. package/packages/api-types/package.json +1 -1
  6. package/packages/benchmark/package.json +4 -4
  7. package/packages/bridge/package.json +8 -8
  8. package/packages/cli-tester/package.json +1 -1
  9. package/packages/config/dist/project-namespace.d.ts +28 -0
  10. package/packages/config/dist/project-namespace.d.ts.map +1 -1
  11. package/packages/config/dist/project-namespace.js +42 -0
  12. package/packages/config/dist/project-namespace.js.map +1 -1
  13. package/packages/config/package.json +2 -2
  14. package/packages/config/src/project-namespace.ts +65 -0
  15. package/packages/continuity/dist/formatter.d.ts +8 -2
  16. package/packages/continuity/dist/formatter.d.ts.map +1 -1
  17. package/packages/continuity/dist/formatter.js +142 -7
  18. package/packages/continuity/dist/formatter.js.map +1 -1
  19. package/packages/continuity/dist/index.d.ts +1 -0
  20. package/packages/continuity/dist/index.d.ts.map +1 -1
  21. package/packages/continuity/dist/index.js +2 -0
  22. package/packages/continuity/dist/index.js.map +1 -1
  23. package/packages/continuity/package.json +4 -1
  24. package/packages/continuity/src/formatter.ts +175 -10
  25. package/packages/continuity/src/index.ts +3 -0
  26. package/packages/daemon/dist/enhanced-features.d.ts +2 -3
  27. package/packages/daemon/dist/enhanced-features.d.ts.map +1 -1
  28. package/packages/daemon/dist/enhanced-features.js +1 -0
  29. package/packages/daemon/dist/enhanced-features.js.map +1 -1
  30. package/packages/daemon/dist/index.d.ts +0 -2
  31. package/packages/daemon/dist/index.d.ts.map +1 -1
  32. package/packages/daemon/dist/index.js +0 -3
  33. package/packages/daemon/dist/index.js.map +1 -1
  34. package/packages/daemon/dist/server.d.ts +0 -6
  35. package/packages/daemon/dist/server.d.ts.map +1 -1
  36. package/packages/daemon/dist/server.js +20 -119
  37. package/packages/daemon/dist/server.js.map +1 -1
  38. package/packages/daemon/package.json +12 -14
  39. package/packages/daemon/src/enhanced-features.ts +4 -4
  40. package/packages/daemon/src/index.ts +0 -4
  41. package/packages/daemon/src/server.ts +19 -127
  42. package/packages/daemon/vitest.config.ts +9 -0
  43. package/packages/hooks/package.json +4 -4
  44. package/packages/mcp/package.json +3 -3
  45. package/packages/memory/package.json +2 -2
  46. package/packages/policy/package.json +2 -2
  47. package/packages/protocol/package.json +1 -1
  48. package/packages/resiliency/package.json +1 -1
  49. package/packages/sdk/package.json +2 -2
  50. package/packages/spawner/package.json +1 -1
  51. package/packages/state/package.json +1 -1
  52. package/packages/storage/dist/adapter.d.ts +5 -5
  53. package/packages/storage/dist/adapter.js +9 -9
  54. package/packages/storage/dist/adapter.js.map +1 -1
  55. package/packages/storage/package.json +2 -2
  56. package/packages/storage/src/adapter.ts +9 -9
  57. package/packages/telemetry/package.json +1 -1
  58. package/packages/trajectory/package.json +2 -2
  59. package/packages/user-directory/package.json +2 -2
  60. package/packages/utils/package.json +2 -2
  61. package/packages/wrapper/package.json +6 -6
  62. package/scripts/build-cjs.mjs +2 -0
  63. package/packages/daemon/dist/migrations/index.d.ts +0 -73
  64. package/packages/daemon/dist/migrations/index.d.ts.map +0 -1
  65. package/packages/daemon/dist/migrations/index.js +0 -241
  66. package/packages/daemon/dist/migrations/index.js.map +0 -1
  67. package/packages/daemon/dist/relay-ledger.d.ts +0 -263
  68. package/packages/daemon/dist/relay-ledger.d.ts.map +0 -1
  69. package/packages/daemon/dist/relay-ledger.js +0 -538
  70. package/packages/daemon/dist/relay-ledger.js.map +0 -1
  71. package/packages/daemon/dist/relay-watchdog.d.ts +0 -125
  72. package/packages/daemon/dist/relay-watchdog.d.ts.map +0 -1
  73. package/packages/daemon/dist/relay-watchdog.js +0 -611
  74. package/packages/daemon/dist/relay-watchdog.js.map +0 -1
  75. package/packages/daemon/src/migrations/0001_initial.sql +0 -72
  76. package/packages/daemon/src/migrations/index.test.ts +0 -195
  77. package/packages/daemon/src/migrations/index.ts +0 -286
  78. package/packages/daemon/src/relay-ledger.test.ts +0 -358
  79. package/packages/daemon/src/relay-ledger.ts +0 -713
  80. package/packages/daemon/src/relay-watchdog.test.ts +0 -881
  81. package/packages/daemon/src/relay-watchdog.ts +0 -785
@@ -1,538 +0,0 @@
1
- /**
2
- * Relay Ledger - SQLite-based tracking of relay file processing
3
- *
4
- * Tracks files discovered in agent outboxes through their lifecycle:
5
- * pending -> processing -> delivered/failed -> archived
6
- *
7
- * Features:
8
- * - Atomic claims with status WHERE clause
9
- * - Crash recovery (reset processing -> pending on startup)
10
- * - Archive path tracking for auditing
11
- * - Configurable retention
12
- * - Schema migrations for version upgrades
13
- */
14
- import Database from 'better-sqlite3';
15
- import path from 'node:path';
16
- import fs from 'node:fs';
17
- import crypto from 'node:crypto';
18
- import { runMigrations, getPendingMigrations, verifyMigrations } from './migrations/index.js';
19
- // ============================================================================
20
- // Constants
21
- // ============================================================================
22
- const DEFAULT_MAX_RETRIES = 3;
23
- const DEFAULT_ARCHIVE_RETENTION_MS = 7 * 24 * 60 * 60 * 1000; // 7 days
24
- const DEFAULT_BUSY_TIMEOUT = 5000;
25
- // Reserved agent names for special routing
26
- const RESERVED_AGENT_NAMES = new Set(['Lead', 'System', 'Broadcast', '*']);
27
- // ============================================================================
28
- // RelayLedger Class
29
- // ============================================================================
30
- export class RelayLedger {
31
- db;
32
- config;
33
- // Prepared statements for performance
34
- stmtInsert;
35
- stmtClaim;
36
- stmtUpdateStatus;
37
- stmtMarkDelivered;
38
- stmtMarkFailed;
39
- stmtMarkArchived;
40
- stmtGetPending;
41
- stmtGetByPath;
42
- stmtIsActivePath;
43
- stmtGetById;
44
- stmtResetProcessing;
45
- stmtCleanupArchived;
46
- stmtGetStats;
47
- constructor(config) {
48
- this.config = {
49
- dbPath: config.dbPath,
50
- maxRetries: config.maxRetries ?? DEFAULT_MAX_RETRIES,
51
- archiveRetentionMs: config.archiveRetentionMs ?? DEFAULT_ARCHIVE_RETENTION_MS,
52
- busyTimeout: config.busyTimeout ?? DEFAULT_BUSY_TIMEOUT,
53
- };
54
- // Ensure directory exists
55
- const dbDir = path.dirname(this.config.dbPath);
56
- if (!fs.existsSync(dbDir)) {
57
- fs.mkdirSync(dbDir, { recursive: true });
58
- }
59
- // Open database with recommended settings
60
- this.db = new Database(this.config.dbPath);
61
- this.db.pragma('journal_mode = WAL');
62
- this.db.pragma(`busy_timeout = ${this.config.busyTimeout}`);
63
- this.db.pragma('synchronous = NORMAL');
64
- this.db.pragma('foreign_keys = ON');
65
- this.initSchema();
66
- this.prepareStatements();
67
- }
68
- /** Last migration result (for debugging) */
69
- lastMigrationResult;
70
- /**
71
- * Initialize database schema using migrations
72
- */
73
- initSchema() {
74
- // Run migrations (creates tables if they don't exist, or upgrades existing schema)
75
- this.lastMigrationResult = runMigrations(this.db);
76
- // Log migration results for debugging
77
- if (this.lastMigrationResult.applied.length > 0) {
78
- console.log(`[relay-ledger] Applied migrations: ${this.lastMigrationResult.applied.join(', ')}`);
79
- }
80
- if (this.lastMigrationResult.errors.length > 0) {
81
- console.error(`[relay-ledger] Migration errors:`, this.lastMigrationResult.errors);
82
- }
83
- }
84
- /**
85
- * Get the last migration result
86
- */
87
- getMigrationResult() {
88
- return this.lastMigrationResult;
89
- }
90
- /**
91
- * Get pending migrations that haven't been applied
92
- */
93
- getPendingMigrations() {
94
- return getPendingMigrations(this.db);
95
- }
96
- /**
97
- * Verify migration checksums match what was originally applied
98
- */
99
- verifyMigrationIntegrity() {
100
- return verifyMigrations(this.db);
101
- }
102
- /**
103
- * Prepare frequently-used statements
104
- */
105
- prepareStatements() {
106
- this.stmtInsert = this.db.prepare(`
107
- INSERT INTO relay_files (file_id, source_path, symlink_path, agent_name, message_type, discovered_at, file_size, content_hash, file_mtime_ns, file_inode)
108
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
109
- ON CONFLICT(file_id) DO NOTHING
110
- `);
111
- this.stmtClaim = this.db.prepare(`
112
- UPDATE relay_files
113
- SET status = 'processing', retries = retries + 1
114
- WHERE file_id = ? AND status = 'pending' AND retries < max_retries
115
- RETURNING *
116
- `);
117
- this.stmtUpdateStatus = this.db.prepare(`
118
- UPDATE relay_files SET status = ? WHERE file_id = ?
119
- `);
120
- this.stmtMarkDelivered = this.db.prepare(`
121
- UPDATE relay_files
122
- SET status = 'delivered', processed_at = ?
123
- WHERE file_id = ?
124
- `);
125
- this.stmtMarkFailed = this.db.prepare(`
126
- UPDATE relay_files
127
- SET status = 'failed', processed_at = ?, error = ?
128
- WHERE file_id = ?
129
- `);
130
- this.stmtMarkArchived = this.db.prepare(`
131
- UPDATE relay_files
132
- SET status = 'archived', archive_path = ?, archived_at = ?
133
- WHERE file_id = ?
134
- `);
135
- this.stmtGetPending = this.db.prepare(`
136
- SELECT * FROM relay_files
137
- WHERE status = 'pending' AND retries < max_retries
138
- ORDER BY id ASC
139
- LIMIT ?
140
- `);
141
- this.stmtGetByPath = this.db.prepare(`
142
- SELECT * FROM relay_files WHERE source_path = ?
143
- `);
144
- // Only check for pending/processing files (not archived/delivered/failed)
145
- this.stmtIsActivePath = this.db.prepare(`
146
- SELECT 1 FROM relay_files WHERE source_path = ? AND status IN ('pending', 'processing')
147
- `);
148
- this.stmtGetById = this.db.prepare(`
149
- SELECT * FROM relay_files WHERE file_id = ?
150
- `);
151
- this.stmtResetProcessing = this.db.prepare(`
152
- UPDATE relay_files
153
- SET status = 'pending'
154
- WHERE status = 'processing'
155
- `);
156
- this.stmtCleanupArchived = this.db.prepare(`
157
- DELETE FROM relay_files
158
- WHERE status = 'archived' AND archived_at < ?
159
- `);
160
- this.stmtGetStats = this.db.prepare(`
161
- SELECT status, COUNT(*) as count FROM relay_files GROUP BY status
162
- `);
163
- }
164
- /**
165
- * Generate a unique file ID (12-char hex for ~281 trillion combinations)
166
- */
167
- generateFileId() {
168
- return crypto.randomBytes(6).toString('hex');
169
- }
170
- /**
171
- * Check if an agent name is reserved
172
- */
173
- isReservedAgentName(name) {
174
- return RESERVED_AGENT_NAMES.has(name);
175
- }
176
- /**
177
- * Register a newly discovered file
178
- * @param sourcePath - Canonical path (symlinks resolved)
179
- * @param agentName - Agent that owns the file
180
- * @param messageType - Type of message (msg, spawn, release, etc.)
181
- * @param fileSize - Size in bytes
182
- * @param contentHash - Optional hash for deduplication
183
- * @param fileMtimeNs - Optional modification time in nanoseconds
184
- * @param fileInode - Optional inode number
185
- * @param symlinkPath - Original path if it was a symlink (for debugging)
186
- */
187
- registerFile(sourcePath, agentName, messageType, fileSize, contentHash, fileMtimeNs, fileInode, symlinkPath) {
188
- const fileId = this.generateFileId();
189
- const now = Date.now();
190
- this.stmtInsert.run(fileId, sourcePath, symlinkPath ?? null, agentName, messageType, now, fileSize, contentHash ?? null, fileMtimeNs ?? null, fileInode ?? null);
191
- return fileId;
192
- }
193
- /**
194
- * Check if a file is actively being processed (pending or processing).
195
- * Returns false for archived/delivered/failed files so new files at the same path can be registered.
196
- */
197
- isFileRegistered(sourcePath) {
198
- const row = this.stmtIsActivePath.get(sourcePath);
199
- return row !== undefined;
200
- }
201
- /**
202
- * Atomically claim a file for processing
203
- * Returns the record if claim succeeded, null otherwise
204
- */
205
- claimFile(fileId) {
206
- const row = this.stmtClaim.get(fileId);
207
- if (!row) {
208
- // Check why claim failed
209
- const existing = this.stmtGetById.get(fileId);
210
- if (!existing) {
211
- return { success: false, reason: 'File not found' };
212
- }
213
- if (existing.status !== 'pending') {
214
- return { success: false, reason: `File status is ${existing.status}, not pending` };
215
- }
216
- if (existing.retries >= existing.max_retries) {
217
- return { success: false, reason: `Max retries (${existing.max_retries}) exceeded` };
218
- }
219
- return { success: false, reason: 'Unknown claim failure' };
220
- }
221
- return {
222
- success: true,
223
- record: this.rowToRecord(row),
224
- };
225
- }
226
- /**
227
- * Mark a file as successfully delivered
228
- */
229
- markDelivered(fileId) {
230
- this.stmtMarkDelivered.run(Date.now(), fileId);
231
- }
232
- /**
233
- * Mark a file as failed (will retry if under max retries)
234
- */
235
- markFailed(fileId, error) {
236
- const record = this.getById(fileId);
237
- if (!record)
238
- return;
239
- if (record.retries >= record.maxRetries) {
240
- // Permanent failure
241
- this.stmtMarkFailed.run(Date.now(), error, fileId);
242
- }
243
- else {
244
- // Reset to pending for retry
245
- this.stmtUpdateStatus.run('pending', fileId);
246
- }
247
- }
248
- /**
249
- * Mark a file as archived (moved to archive location)
250
- */
251
- markArchived(fileId, archivePath) {
252
- this.stmtMarkArchived.run(archivePath, Date.now(), fileId);
253
- }
254
- /**
255
- * Get pending files ready for processing
256
- */
257
- getPendingFiles(limit = 100) {
258
- const rows = this.stmtGetPending.all(limit);
259
- return rows.map(row => this.rowToRecord(row));
260
- }
261
- /**
262
- * Get a file record by ID
263
- */
264
- getById(fileId) {
265
- const row = this.stmtGetById.get(fileId);
266
- return row ? this.rowToRecord(row) : null;
267
- }
268
- /**
269
- * Get a file record by source path
270
- */
271
- getByPath(sourcePath) {
272
- const row = this.stmtGetByPath.get(sourcePath);
273
- return row ? this.rowToRecord(row) : null;
274
- }
275
- /**
276
- * Reset all 'processing' files to 'pending' (crash recovery)
277
- */
278
- resetProcessingFiles() {
279
- const result = this.stmtResetProcessing.run();
280
- return result.changes;
281
- }
282
- /**
283
- * Mark files as failed if their source file no longer exists
284
- */
285
- reconcileWithFilesystem() {
286
- let reset = 0;
287
- let failed = 0;
288
- // Get all processing files
289
- const processingFiles = this.db
290
- .prepare(`SELECT * FROM relay_files WHERE status = 'processing'`)
291
- .all();
292
- for (const row of processingFiles) {
293
- if (!fs.existsSync(row.source_path)) {
294
- // File was deleted while processing - mark as failed
295
- this.stmtMarkFailed.run(Date.now(), 'Source file deleted during processing', row.file_id);
296
- failed++;
297
- }
298
- else {
299
- // Reset to pending
300
- this.stmtUpdateStatus.run('pending', row.file_id);
301
- reset++;
302
- }
303
- }
304
- return { reset, failed };
305
- }
306
- /**
307
- * Clean up old archived records
308
- */
309
- cleanupArchivedRecords() {
310
- const cutoff = Date.now() - this.config.archiveRetentionMs;
311
- const result = this.stmtCleanupArchived.run(cutoff);
312
- return result.changes;
313
- }
314
- /**
315
- * Get statistics about file processing
316
- */
317
- getStats() {
318
- const rows = this.stmtGetStats.all();
319
- const stats = {
320
- pending: 0,
321
- processing: 0,
322
- delivered: 0,
323
- failed: 0,
324
- archived: 0,
325
- };
326
- for (const row of rows) {
327
- stats[row.status] = row.count;
328
- }
329
- return stats;
330
- }
331
- /**
332
- * Convert database row to RelayFileRecord
333
- */
334
- rowToRecord(row) {
335
- return {
336
- id: row.id,
337
- fileId: row.file_id,
338
- sourcePath: row.source_path,
339
- symlinkPath: row.symlink_path,
340
- archivePath: row.archive_path,
341
- agentName: row.agent_name,
342
- messageType: row.message_type,
343
- status: row.status,
344
- retries: row.retries,
345
- maxRetries: row.max_retries,
346
- discoveredAt: row.discovered_at,
347
- processedAt: row.processed_at,
348
- archivedAt: row.archived_at,
349
- error: row.error,
350
- contentHash: row.content_hash,
351
- fileSize: row.file_size,
352
- fileMtimeNs: row.file_mtime_ns,
353
- fileInode: row.file_inode,
354
- };
355
- }
356
- // ==========================================================================
357
- // Agent Management
358
- // ==========================================================================
359
- /**
360
- * Register or update an agent
361
- */
362
- registerAgent(agentName, metadata) {
363
- const now = Date.now();
364
- const metadataJson = metadata ? JSON.stringify(metadata) : null;
365
- this.db.prepare(`
366
- INSERT INTO agents (agent_name, created_at, last_seen_at, status, metadata)
367
- VALUES (?, ?, ?, 'active', ?)
368
- ON CONFLICT(agent_name) DO UPDATE SET
369
- last_seen_at = excluded.last_seen_at,
370
- status = 'active',
371
- metadata = COALESCE(excluded.metadata, agents.metadata)
372
- `).run(agentName, now, now, metadataJson);
373
- }
374
- /**
375
- * Update agent last seen time
376
- */
377
- updateAgentLastSeen(agentName) {
378
- this.db.prepare(`
379
- UPDATE agents SET last_seen_at = ? WHERE agent_name = ?
380
- `).run(Date.now(), agentName);
381
- }
382
- /**
383
- * Mark agent as inactive
384
- */
385
- markAgentInactive(agentName) {
386
- this.db.prepare(`
387
- UPDATE agents SET status = 'inactive' WHERE agent_name = ?
388
- `).run(agentName);
389
- }
390
- /**
391
- * Get all active agents
392
- */
393
- getActiveAgents() {
394
- const rows = this.db.prepare(`
395
- SELECT * FROM agents WHERE status = 'active' ORDER BY last_seen_at DESC
396
- `).all();
397
- return rows.map(row => ({
398
- id: row.id,
399
- agentName: row.agent_name,
400
- createdAt: row.created_at,
401
- lastSeenAt: row.last_seen_at,
402
- status: row.status,
403
- metadata: row.metadata ? JSON.parse(row.metadata) : null,
404
- }));
405
- }
406
- /**
407
- * Get agent by name
408
- */
409
- getAgent(agentName) {
410
- const row = this.db.prepare(`
411
- SELECT * FROM agents WHERE agent_name = ?
412
- `).get(agentName);
413
- if (!row)
414
- return null;
415
- return {
416
- id: row.id,
417
- agentName: row.agent_name,
418
- createdAt: row.created_at,
419
- lastSeenAt: row.last_seen_at,
420
- status: row.status,
421
- metadata: row.metadata ? JSON.parse(row.metadata) : null,
422
- };
423
- }
424
- // ==========================================================================
425
- // Orchestrator State
426
- // ==========================================================================
427
- /**
428
- * Save orchestrator state
429
- */
430
- saveState(key, value) {
431
- this.db.prepare(`
432
- INSERT INTO orchestrator_state (key, value, updated_at)
433
- VALUES (?, ?, ?)
434
- ON CONFLICT(key) DO UPDATE SET
435
- value = excluded.value,
436
- updated_at = excluded.updated_at
437
- `).run(key, value, Date.now());
438
- }
439
- /**
440
- * Get orchestrator state
441
- */
442
- getState(key) {
443
- const row = this.db.prepare(`
444
- SELECT value FROM orchestrator_state WHERE key = ?
445
- `).get(key);
446
- return row?.value ?? null;
447
- }
448
- /**
449
- * Delete orchestrator state
450
- */
451
- deleteState(key) {
452
- this.db.prepare(`
453
- DELETE FROM orchestrator_state WHERE key = ?
454
- `).run(key);
455
- }
456
- /**
457
- * Get all orchestrator state
458
- */
459
- getAllState() {
460
- const rows = this.db.prepare(`
461
- SELECT * FROM orchestrator_state ORDER BY key
462
- `).all();
463
- return rows.map(row => ({
464
- key: row.key,
465
- value: row.value,
466
- updatedAt: row.updated_at,
467
- }));
468
- }
469
- // ==========================================================================
470
- // Pending Operations (for crash recovery)
471
- // ==========================================================================
472
- /**
473
- * Add a pending operation
474
- */
475
- addPendingOperation(operationType, targetId, payload) {
476
- const result = this.db.prepare(`
477
- INSERT INTO pending_operations (operation_type, target_id, payload, created_at)
478
- VALUES (?, ?, ?, ?)
479
- `).run(operationType, targetId, payload ?? null, Date.now());
480
- return result.lastInsertRowid;
481
- }
482
- /**
483
- * Complete a pending operation (remove it)
484
- */
485
- completePendingOperation(id) {
486
- this.db.prepare(`
487
- DELETE FROM pending_operations WHERE id = ?
488
- `).run(id);
489
- }
490
- /**
491
- * Fail a pending operation (increment attempts, record error)
492
- */
493
- failPendingOperation(id, error) {
494
- this.db.prepare(`
495
- UPDATE pending_operations
496
- SET attempts = attempts + 1, last_attempt_at = ?, error = ?
497
- WHERE id = ?
498
- `).run(Date.now(), error, id);
499
- }
500
- /**
501
- * Get pending operations for recovery
502
- */
503
- getPendingOperations(maxAttempts = 5) {
504
- const rows = this.db.prepare(`
505
- SELECT * FROM pending_operations
506
- WHERE attempts < ?
507
- ORDER BY created_at ASC
508
- `).all(maxAttempts);
509
- return rows.map(row => ({
510
- id: row.id,
511
- operationType: row.operation_type,
512
- targetId: row.target_id,
513
- payload: row.payload,
514
- createdAt: row.created_at,
515
- attempts: row.attempts,
516
- lastAttemptAt: row.last_attempt_at,
517
- error: row.error,
518
- }));
519
- }
520
- /**
521
- * Cleanup old failed operations
522
- */
523
- cleanupFailedOperations(maxAge = 24 * 60 * 60 * 1000) {
524
- const cutoff = Date.now() - maxAge;
525
- const result = this.db.prepare(`
526
- DELETE FROM pending_operations
527
- WHERE created_at < ? AND attempts >= 5
528
- `).run(cutoff);
529
- return result.changes;
530
- }
531
- /**
532
- * Close the database connection
533
- */
534
- close() {
535
- this.db.close();
536
- }
537
- }
538
- //# sourceMappingURL=relay-ledger.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"relay-ledger.js","sourceRoot":"","sources":["../src/relay-ledger.ts"],"names":[],"mappings":"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"}
@@ -1,125 +0,0 @@
1
- /**
2
- * Relay Watchdog - File-based relay message detection and processing
3
- *
4
- * Monitors agent outbox directories for new relay files and processes them:
5
- * 1. Detects new files via fs.watch + periodic reconciliation
6
- * 2. Validates files (size > 0, not symlink, settled)
7
- * 3. Claims files atomically via ledger
8
- * 4. Processes and archives files
9
- *
10
- * Features:
11
- * - fsevents/inotify watchers with overflow fallback
12
- * - Configurable settle time for file stability
13
- * - Symlink rejection (security)
14
- * - Orphaned .pending file cleanup
15
- * - Crash recovery on startup
16
- */
17
- import { EventEmitter } from 'node:events';
18
- import { type RelayFileRecord } from './relay-ledger.js';
19
- import { type RelayPaths } from '@agent-relay/config/relay-file-writer';
20
- export interface WatchdogConfig {
21
- /** Base relay paths (auto-detected if not provided) */
22
- relayPaths?: RelayPaths;
23
- /** Ledger database path (default: ~/.agent-relay/meta/ledger.sqlite) */
24
- ledgerPath?: string;
25
- /** Settle time before processing file (default: 500ms) */
26
- settleTimeMs?: number;
27
- /** Timeout for malformed/incomplete files (default: 10000ms) */
28
- malformedTimeoutMs?: number;
29
- /** Interval for periodic reconciliation (default: 30000ms) */
30
- reconcileIntervalMs?: number;
31
- /** Maximum message size in bytes (default: 1MB) */
32
- maxMessageSizeBytes?: number;
33
- /** Maximum attachment size in bytes (default: 10MB) */
34
- maxAttachmentSizeBytes?: number;
35
- /** Cleanup interval for orphaned files (default: 60000ms) */
36
- cleanupIntervalMs?: number;
37
- /** Age threshold for orphaned .pending files (default: 30000ms) */
38
- orphanedPendingAgeMs?: number;
39
- /** Archive retention in milliseconds (default: 7 days) */
40
- archiveRetentionMs?: number;
41
- /** Enable debug logging */
42
- debug?: boolean;
43
- }
44
- export interface DiscoveredFile {
45
- path: string;
46
- agentName: string;
47
- messageType: string;
48
- size: number;
49
- mtime: number;
50
- contentHash?: string;
51
- }
52
- export interface ProcessedFile {
53
- fileId: string;
54
- agentName: string;
55
- messageType: string;
56
- content: string;
57
- headers: Record<string, string>;
58
- body: string;
59
- }
60
- export interface WatchdogEvents {
61
- 'file:discovered': (file: DiscoveredFile) => void;
62
- 'file:processing': (record: RelayFileRecord) => void;
63
- 'file:delivered': (result: ProcessedFile) => void;
64
- 'file:failed': (record: RelayFileRecord, error: Error) => void;
65
- 'file:archived': (record: RelayFileRecord, archivePath: string) => void;
66
- 'watcher:overflow': (dir: string) => void;
67
- 'reconcile:complete': (stats: {
68
- discovered: number;
69
- failed: number;
70
- }) => void;
71
- error: (error: Error) => void;
72
- }
73
- export declare class RelayWatchdog extends EventEmitter {
74
- private config;
75
- private relayPaths;
76
- private ledger;
77
- private watchers;
78
- private pendingFiles;
79
- private reconcileTimer?;
80
- private cleanupTimer?;
81
- private running;
82
- constructor(config?: WatchdogConfig);
83
- /**
84
- * Resolve symlinks in relay paths for cloud/production workspace support
85
- * This ensures we work with canonical paths even when directories are symlinked
86
- */
87
- private resolveRelayPaths;
88
- /**
89
- * Start the watchdog
90
- */
91
- start(): Promise<void>;
92
- /**
93
- * Stop the watchdog
94
- */
95
- stop(): Promise<void>;
96
- /**
97
- * Get ledger statistics
98
- */
99
- getStats(): Record<string, number>;
100
- /**
101
- * Get pending file count
102
- */
103
- getPendingCount(): number;
104
- private ensureDirectories;
105
- private startRootWatcher;
106
- private startAgentWatchers;
107
- private checkAndWatchAgentDir;
108
- private startAgentWatcher;
109
- private handleFileEvent;
110
- private processDiscoveredFile;
111
- private validateFile;
112
- private calculateFileHash;
113
- private processFile;
114
- private parseFileContent;
115
- private archiveFile;
116
- private fullReconciliation;
117
- private cleanupOrphanedFiles;
118
- private shouldIgnore;
119
- private log;
120
- }
121
- export interface RelayWatchdog {
122
- on<K extends keyof WatchdogEvents>(event: K, listener: WatchdogEvents[K]): this;
123
- emit<K extends keyof WatchdogEvents>(event: K, ...args: Parameters<WatchdogEvents[K]>): boolean;
124
- }
125
- //# sourceMappingURL=relay-watchdog.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"relay-watchdog.d.ts","sourceRoot":"","sources":["../src/relay-watchdog.ts"],"names":[],"mappings":"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"}