agent-relay 0.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 (143) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/LICENSE +22 -0
  3. package/PROTOCOL.md +319 -0
  4. package/README.md +791 -0
  5. package/dist/cli/index.d.ts +7 -0
  6. package/dist/cli/index.d.ts.map +1 -0
  7. package/dist/cli/index.js +1591 -0
  8. package/dist/cli/index.js.map +1 -0
  9. package/dist/daemon/connection.d.ts +60 -0
  10. package/dist/daemon/connection.d.ts.map +1 -0
  11. package/dist/daemon/connection.js +245 -0
  12. package/dist/daemon/connection.js.map +1 -0
  13. package/dist/daemon/index.d.ts +4 -0
  14. package/dist/daemon/index.d.ts.map +1 -0
  15. package/dist/daemon/index.js +4 -0
  16. package/dist/daemon/index.js.map +1 -0
  17. package/dist/daemon/router.d.ts +72 -0
  18. package/dist/daemon/router.d.ts.map +1 -0
  19. package/dist/daemon/router.js +183 -0
  20. package/dist/daemon/router.js.map +1 -0
  21. package/dist/daemon/server.d.ts +52 -0
  22. package/dist/daemon/server.d.ts.map +1 -0
  23. package/dist/daemon/server.js +186 -0
  24. package/dist/daemon/server.js.map +1 -0
  25. package/dist/dashboard/public/index.html +690 -0
  26. package/dist/dashboard/server.d.ts +2 -0
  27. package/dist/dashboard/server.d.ts.map +1 -0
  28. package/dist/dashboard/server.js +220 -0
  29. package/dist/dashboard/server.js.map +1 -0
  30. package/dist/games/index.d.ts +2 -0
  31. package/dist/games/index.d.ts.map +1 -0
  32. package/dist/games/index.js +2 -0
  33. package/dist/games/index.js.map +1 -0
  34. package/dist/games/tictactoe.d.ts +24 -0
  35. package/dist/games/tictactoe.d.ts.map +1 -0
  36. package/dist/games/tictactoe.js +160 -0
  37. package/dist/games/tictactoe.js.map +1 -0
  38. package/dist/hooks/inbox-check/hook.d.ts +28 -0
  39. package/dist/hooks/inbox-check/hook.d.ts.map +1 -0
  40. package/dist/hooks/inbox-check/hook.js +97 -0
  41. package/dist/hooks/inbox-check/hook.js.map +1 -0
  42. package/dist/hooks/inbox-check/index.d.ts +8 -0
  43. package/dist/hooks/inbox-check/index.d.ts.map +1 -0
  44. package/dist/hooks/inbox-check/index.js +8 -0
  45. package/dist/hooks/inbox-check/index.js.map +1 -0
  46. package/dist/hooks/inbox-check/types.d.ts +31 -0
  47. package/dist/hooks/inbox-check/types.d.ts.map +1 -0
  48. package/dist/hooks/inbox-check/types.js +5 -0
  49. package/dist/hooks/inbox-check/types.js.map +1 -0
  50. package/dist/hooks/inbox-check/utils.d.ts +44 -0
  51. package/dist/hooks/inbox-check/utils.d.ts.map +1 -0
  52. package/dist/hooks/inbox-check/utils.js +107 -0
  53. package/dist/hooks/inbox-check/utils.js.map +1 -0
  54. package/dist/index.d.ts +10 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +10 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/protocol/framing.d.ts +32 -0
  59. package/dist/protocol/framing.d.ts.map +1 -0
  60. package/dist/protocol/framing.js +71 -0
  61. package/dist/protocol/framing.js.map +1 -0
  62. package/dist/protocol/index.d.ts +3 -0
  63. package/dist/protocol/index.d.ts.map +1 -0
  64. package/dist/protocol/index.js +3 -0
  65. package/dist/protocol/index.js.map +1 -0
  66. package/dist/protocol/types.d.ts +104 -0
  67. package/dist/protocol/types.d.ts.map +1 -0
  68. package/dist/protocol/types.js +6 -0
  69. package/dist/protocol/types.js.map +1 -0
  70. package/dist/state/agent-state.d.ts +40 -0
  71. package/dist/state/agent-state.d.ts.map +1 -0
  72. package/dist/state/agent-state.js +120 -0
  73. package/dist/state/agent-state.js.map +1 -0
  74. package/dist/storage/adapter.d.ts +29 -0
  75. package/dist/storage/adapter.d.ts.map +1 -0
  76. package/dist/storage/adapter.js +2 -0
  77. package/dist/storage/adapter.js.map +1 -0
  78. package/dist/storage/sqlite-adapter.d.ts +15 -0
  79. package/dist/storage/sqlite-adapter.d.ts.map +1 -0
  80. package/dist/storage/sqlite-adapter.js +116 -0
  81. package/dist/storage/sqlite-adapter.js.map +1 -0
  82. package/dist/supervisor/inbox.d.ts +38 -0
  83. package/dist/supervisor/inbox.d.ts.map +1 -0
  84. package/dist/supervisor/inbox.js +162 -0
  85. package/dist/supervisor/inbox.js.map +1 -0
  86. package/dist/supervisor/index.d.ts +10 -0
  87. package/dist/supervisor/index.d.ts.map +1 -0
  88. package/dist/supervisor/index.js +10 -0
  89. package/dist/supervisor/index.js.map +1 -0
  90. package/dist/supervisor/spawner.d.ts +54 -0
  91. package/dist/supervisor/spawner.d.ts.map +1 -0
  92. package/dist/supervisor/spawner.js +282 -0
  93. package/dist/supervisor/spawner.js.map +1 -0
  94. package/dist/supervisor/state.d.ts +132 -0
  95. package/dist/supervisor/state.d.ts.map +1 -0
  96. package/dist/supervisor/state.js +465 -0
  97. package/dist/supervisor/state.js.map +1 -0
  98. package/dist/supervisor/supervisor.d.ts +67 -0
  99. package/dist/supervisor/supervisor.d.ts.map +1 -0
  100. package/dist/supervisor/supervisor.js +263 -0
  101. package/dist/supervisor/supervisor.js.map +1 -0
  102. package/dist/supervisor/types.d.ts +139 -0
  103. package/dist/supervisor/types.d.ts.map +1 -0
  104. package/dist/supervisor/types.js +12 -0
  105. package/dist/supervisor/types.js.map +1 -0
  106. package/dist/utils/index.d.ts +2 -0
  107. package/dist/utils/index.d.ts.map +1 -0
  108. package/dist/utils/index.js +2 -0
  109. package/dist/utils/index.js.map +1 -0
  110. package/dist/utils/name-generator.d.ts +17 -0
  111. package/dist/utils/name-generator.d.ts.map +1 -0
  112. package/dist/utils/name-generator.js +52 -0
  113. package/dist/utils/name-generator.js.map +1 -0
  114. package/dist/webhook/spawner.d.ts +79 -0
  115. package/dist/webhook/spawner.d.ts.map +1 -0
  116. package/dist/webhook/spawner.js +288 -0
  117. package/dist/webhook/spawner.js.map +1 -0
  118. package/dist/wrapper/client.d.ts +72 -0
  119. package/dist/wrapper/client.d.ts.map +1 -0
  120. package/dist/wrapper/client.js +306 -0
  121. package/dist/wrapper/client.js.map +1 -0
  122. package/dist/wrapper/inbox.d.ts +37 -0
  123. package/dist/wrapper/inbox.d.ts.map +1 -0
  124. package/dist/wrapper/inbox.js +73 -0
  125. package/dist/wrapper/inbox.js.map +1 -0
  126. package/dist/wrapper/index.d.ts +4 -0
  127. package/dist/wrapper/index.d.ts.map +1 -0
  128. package/dist/wrapper/index.js +7 -0
  129. package/dist/wrapper/index.js.map +1 -0
  130. package/dist/wrapper/parser.d.ts +94 -0
  131. package/dist/wrapper/parser.d.ts.map +1 -0
  132. package/dist/wrapper/parser.js +360 -0
  133. package/dist/wrapper/parser.js.map +1 -0
  134. package/dist/wrapper/pty-wrapper.d.ts +125 -0
  135. package/dist/wrapper/pty-wrapper.d.ts.map +1 -0
  136. package/dist/wrapper/pty-wrapper.js +494 -0
  137. package/dist/wrapper/pty-wrapper.js.map +1 -0
  138. package/dist/wrapper/tmux-wrapper.d.ts +131 -0
  139. package/dist/wrapper/tmux-wrapper.d.ts.map +1 -0
  140. package/dist/wrapper/tmux-wrapper.js +427 -0
  141. package/dist/wrapper/tmux-wrapper.js.map +1 -0
  142. package/install.sh +69 -0
  143. package/package.json +82 -0
@@ -0,0 +1,465 @@
1
+ /**
2
+ * Agent State Management
3
+ *
4
+ * Handles persistent state for spawn-per-message architecture.
5
+ * Each agent has a state.json that maintains context across spawns.
6
+ */
7
+ import fs from 'node:fs';
8
+ import path from 'node:path';
9
+ import { parseInboxMarkdown } from './inbox.js';
10
+ /** Current state schema version */
11
+ const STATE_VERSION = 1;
12
+ /**
13
+ * State Manager for a single agent
14
+ */
15
+ export class StateManager {
16
+ statePath;
17
+ lockPath;
18
+ config;
19
+ agentName;
20
+ constructor(agentName, config) {
21
+ this.agentName = agentName;
22
+ this.config = config;
23
+ const agentDir = path.join(config.dataDir, agentName);
24
+ this.statePath = path.join(agentDir, 'state.json');
25
+ this.lockPath = path.join(agentDir, 'agent.lock');
26
+ }
27
+ /**
28
+ * Initialize state directory
29
+ */
30
+ ensureDir() {
31
+ const dir = path.dirname(this.statePath);
32
+ if (!fs.existsSync(dir)) {
33
+ fs.mkdirSync(dir, { recursive: true });
34
+ }
35
+ }
36
+ /**
37
+ * Check if state file exists
38
+ */
39
+ exists() {
40
+ return fs.existsSync(this.statePath);
41
+ }
42
+ /**
43
+ * Load agent state from disk
44
+ */
45
+ load() {
46
+ if (!this.exists()) {
47
+ return null;
48
+ }
49
+ try {
50
+ const content = fs.readFileSync(this.statePath, 'utf-8');
51
+ const state = JSON.parse(content);
52
+ // Migrate older state formats
53
+ return this.migrateState(state);
54
+ }
55
+ catch (err) {
56
+ console.error(`[state] Failed to load state for ${this.agentName}:`, err);
57
+ return null;
58
+ }
59
+ }
60
+ /**
61
+ * Save agent state to disk
62
+ */
63
+ save(state) {
64
+ this.ensureDir();
65
+ const tmpPath = `${this.statePath}.tmp`;
66
+ fs.writeFileSync(tmpPath, JSON.stringify(state, null, 2), 'utf-8');
67
+ fs.renameSync(tmpPath, this.statePath);
68
+ }
69
+ /**
70
+ * Create initial state for a new agent
71
+ */
72
+ create(cli, cwd, customCommand) {
73
+ const now = new Date().toISOString();
74
+ const state = {
75
+ version: STATE_VERSION,
76
+ name: this.agentName,
77
+ cli,
78
+ summary: '',
79
+ recentMessages: [],
80
+ cwd,
81
+ customCommand,
82
+ lastActiveTs: now,
83
+ createdTs: now,
84
+ status: 'idle',
85
+ decisions: [],
86
+ openTodos: [],
87
+ filesModified: [],
88
+ externalRefs: [],
89
+ };
90
+ this.save(state);
91
+ return state;
92
+ }
93
+ /**
94
+ * Update state with a new relay exchange
95
+ */
96
+ addExchange(state, exchange) {
97
+ const updated = { ...state };
98
+ updated.recentMessages = [
99
+ ...state.recentMessages,
100
+ exchange,
101
+ ].slice(-this.config.maxRecentMessages);
102
+ updated.lastActiveTs = new Date().toISOString();
103
+ this.save(updated);
104
+ return updated;
105
+ }
106
+ /**
107
+ * Update the rolling summary
108
+ */
109
+ updateSummary(state, newSummary) {
110
+ const updated = { ...state };
111
+ // Truncate if too long
112
+ updated.summary = newSummary.length > this.config.maxSummaryLength
113
+ ? newSummary.substring(0, this.config.maxSummaryLength) + '...'
114
+ : newSummary;
115
+ updated.lastActiveTs = new Date().toISOString();
116
+ this.save(updated);
117
+ return updated;
118
+ }
119
+ /**
120
+ * Update supervisor-tracked status for the agent.
121
+ */
122
+ setStatus(state, status) {
123
+ const updated = { ...state, status };
124
+ updated.lastActiveTs = new Date().toISOString();
125
+ this.save(updated);
126
+ return updated;
127
+ }
128
+ /**
129
+ * Parse inbox content and record received exchanges into state.
130
+ */
131
+ recordInboxReceived(state, inboxContent) {
132
+ const messages = parseInboxMarkdown(inboxContent);
133
+ let updated = state;
134
+ for (const msg of messages) {
135
+ updated = this.addExchange(updated, {
136
+ direction: 'received',
137
+ peer: msg.from,
138
+ body: msg.body,
139
+ timestamp: msg.timestamp || new Date().toISOString(),
140
+ });
141
+ }
142
+ return updated;
143
+ }
144
+ /**
145
+ * Mark inbox as processed (for restart deduplication)
146
+ */
147
+ markInboxProcessed(state, timestamp) {
148
+ const updated = { ...state };
149
+ updated.lastProcessedInboxTs = timestamp || new Date().toISOString();
150
+ updated.lastActiveTs = new Date().toISOString();
151
+ this.save(updated);
152
+ return updated;
153
+ }
154
+ /**
155
+ * Check if messages should be skipped based on timestamp
156
+ * Returns true if the message timestamp is older than lastProcessedInboxTs
157
+ */
158
+ shouldSkipMessage(state, messageTs) {
159
+ if (!state.lastProcessedInboxTs)
160
+ return false;
161
+ return new Date(messageTs) <= new Date(state.lastProcessedInboxTs);
162
+ }
163
+ /**
164
+ * Add a decision (append-only)
165
+ */
166
+ addDecision(state, what, why) {
167
+ const updated = { ...state };
168
+ updated.decisions = [
169
+ ...state.decisions,
170
+ {
171
+ what,
172
+ why,
173
+ timestamp: new Date().toISOString(),
174
+ },
175
+ ];
176
+ updated.lastActiveTs = new Date().toISOString();
177
+ this.save(updated);
178
+ return updated;
179
+ }
180
+ /**
181
+ * Add a TODO item
182
+ */
183
+ addTodo(state, task, priority = 'normal', owner) {
184
+ const updated = { ...state };
185
+ updated.openTodos = [
186
+ ...state.openTodos,
187
+ {
188
+ task,
189
+ owner,
190
+ priority,
191
+ addedTs: new Date().toISOString(),
192
+ },
193
+ ];
194
+ updated.lastActiveTs = new Date().toISOString();
195
+ this.save(updated);
196
+ return updated;
197
+ }
198
+ /**
199
+ * Complete (remove) a TODO item by task text match
200
+ */
201
+ completeTodo(state, taskMatch) {
202
+ const updated = { ...state };
203
+ updated.openTodos = state.openTodos.filter((todo) => !todo.task.toLowerCase().includes(taskMatch.toLowerCase()));
204
+ updated.lastActiveTs = new Date().toISOString();
205
+ this.save(updated);
206
+ return updated;
207
+ }
208
+ /**
209
+ * Record a file modification
210
+ */
211
+ addFileModification(state, filePath, intent) {
212
+ const updated = { ...state };
213
+ // Replace existing entry for same path or append
214
+ const existing = state.filesModified.findIndex((f) => f.path === filePath);
215
+ if (existing >= 0) {
216
+ updated.filesModified = [...state.filesModified];
217
+ updated.filesModified[existing] = {
218
+ path: filePath,
219
+ intent,
220
+ timestamp: new Date().toISOString(),
221
+ };
222
+ }
223
+ else {
224
+ updated.filesModified = [
225
+ ...state.filesModified,
226
+ {
227
+ path: filePath,
228
+ intent,
229
+ timestamp: new Date().toISOString(),
230
+ },
231
+ ];
232
+ }
233
+ updated.lastActiveTs = new Date().toISOString();
234
+ this.save(updated);
235
+ return updated;
236
+ }
237
+ /**
238
+ * Record an external command/reference
239
+ */
240
+ addExternalRef(state, command, resultSummary, logPath) {
241
+ const updated = { ...state };
242
+ const maxRefs = 20; // Keep bounded
243
+ updated.externalRefs = [
244
+ ...state.externalRefs.slice(-maxRefs + 1),
245
+ {
246
+ command,
247
+ resultSummary,
248
+ timestamp: new Date().toISOString(),
249
+ logPath,
250
+ },
251
+ ];
252
+ updated.lastActiveTs = new Date().toISOString();
253
+ this.save(updated);
254
+ return updated;
255
+ }
256
+ /**
257
+ * Migrate old state to current version
258
+ */
259
+ migrateState(state) {
260
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
261
+ const s = state;
262
+ if (!s.version || s.version < STATE_VERSION) {
263
+ // Add missing fields from v1
264
+ s.version = STATE_VERSION;
265
+ s.status = s.status || 'idle';
266
+ s.decisions = s.decisions || [];
267
+ s.openTodos = s.openTodos || [];
268
+ s.filesModified = s.filesModified || [];
269
+ s.externalRefs = s.externalRefs || [];
270
+ this.save(s);
271
+ }
272
+ return s;
273
+ }
274
+ /**
275
+ * Try to acquire lock for this agent
276
+ * Returns true if lock acquired, false if already locked
277
+ */
278
+ tryLock() {
279
+ this.ensureDir();
280
+ try {
281
+ // Try to create lock file exclusively
282
+ const fd = fs.openSync(this.lockPath, 'wx');
283
+ fs.writeSync(fd, `${process.pid}\n${new Date().toISOString()}\n`);
284
+ fs.closeSync(fd);
285
+ return true;
286
+ }
287
+ catch (err) {
288
+ if (err.code === 'EEXIST') {
289
+ // Lock exists, check if stale (older than 5 minutes)
290
+ try {
291
+ const stat = fs.statSync(this.lockPath);
292
+ const age = Date.now() - stat.mtimeMs;
293
+ if (age > 5 * 60 * 1000) {
294
+ // Stale lock, remove and retry
295
+ fs.unlinkSync(this.lockPath);
296
+ return this.tryLock();
297
+ }
298
+ }
299
+ catch {
300
+ // Ignore stat errors
301
+ }
302
+ return false;
303
+ }
304
+ throw err;
305
+ }
306
+ }
307
+ /**
308
+ * Release lock for this agent
309
+ */
310
+ releaseLock() {
311
+ try {
312
+ if (fs.existsSync(this.lockPath)) {
313
+ fs.unlinkSync(this.lockPath);
314
+ }
315
+ }
316
+ catch (err) {
317
+ console.error(`[state] Failed to release lock for ${this.agentName}:`, err);
318
+ }
319
+ }
320
+ /**
321
+ * Check if agent is currently locked
322
+ */
323
+ isLocked() {
324
+ if (!fs.existsSync(this.lockPath)) {
325
+ return false;
326
+ }
327
+ // Check for stale lock
328
+ try {
329
+ const stat = fs.statSync(this.lockPath);
330
+ const age = Date.now() - stat.mtimeMs;
331
+ if (age > 5 * 60 * 1000) {
332
+ // Stale, consider unlocked
333
+ return false;
334
+ }
335
+ return true;
336
+ }
337
+ catch {
338
+ return false;
339
+ }
340
+ }
341
+ /**
342
+ * Get the inbox path for this agent
343
+ */
344
+ getInboxPath() {
345
+ return path.join(this.config.dataDir, this.agentName, 'inbox.md');
346
+ }
347
+ /**
348
+ * Get the state.json path for this agent
349
+ */
350
+ getStatePath() {
351
+ return this.statePath;
352
+ }
353
+ /**
354
+ * Get the lock path for this agent
355
+ */
356
+ getLockPath() {
357
+ return this.lockPath;
358
+ }
359
+ /**
360
+ * Build the initial prompt for a spawn including state context
361
+ */
362
+ buildSpawnPrompt(state, inboxContent) {
363
+ let prompt = '';
364
+ prompt += `You are ${state.name}, an AI agent collaborating with other CLI agents via agent-relay.\n`;
365
+ prompt += `Your job: read new relay messages and respond using @relay:AgentName <message>.\n`;
366
+ prompt += `\nCRITICAL: Do not wait for additional input. Process ALL messages and then exit.\n\n`;
367
+ // Add summary if present
368
+ if (state.summary) {
369
+ prompt += `## Context\n${state.summary}\n\n`;
370
+ }
371
+ // Add key decisions (stable context)
372
+ if (state.decisions.length > 0) {
373
+ prompt += `## Key Decisions Made\n`;
374
+ for (const decision of state.decisions.slice(-10)) {
375
+ prompt += `- **${decision.what}**: ${decision.why}\n`;
376
+ }
377
+ prompt += '\n';
378
+ }
379
+ // Add open TODOs
380
+ if (state.openTodos.length > 0) {
381
+ prompt += `## Open TODOs\n`;
382
+ for (const todo of state.openTodos) {
383
+ const priority = todo.priority === 'high' ? '[HIGH]' : todo.priority === 'low' ? '[low]' : '';
384
+ const owner = todo.owner ? ` (${todo.owner})` : '';
385
+ prompt += `- ${priority} ${todo.task}${owner}\n`;
386
+ }
387
+ prompt += '\n';
388
+ }
389
+ // Add files modified (for context on what we've touched)
390
+ if (state.filesModified.length > 0) {
391
+ prompt += `## Files Modified This Session\n`;
392
+ for (const file of state.filesModified.slice(-10)) {
393
+ prompt += `- \`${file.path}\`: ${file.intent}\n`;
394
+ }
395
+ prompt += '\n';
396
+ }
397
+ // Add recent external command references
398
+ if (state.externalRefs.length > 0) {
399
+ prompt += `## Recent Commands/Outputs\n`;
400
+ for (const ref of state.externalRefs.slice(-5)) {
401
+ prompt += `- \`${ref.command}\`: ${ref.resultSummary}\n`;
402
+ }
403
+ prompt += '\n';
404
+ }
405
+ // Add recent exchanges
406
+ if (state.recentMessages.length > 0) {
407
+ prompt += `## Recent Conversation\n`;
408
+ for (const exchange of state.recentMessages.slice(-10)) {
409
+ const direction = exchange.direction === 'sent' ? '→' : '←';
410
+ prompt += `[${exchange.timestamp}] ${direction} ${exchange.peer}: ${exchange.body}\n`;
411
+ }
412
+ prompt += '\n';
413
+ }
414
+ // Add inbox content
415
+ prompt += `## New Messages To Process\n${inboxContent}\n\n`;
416
+ // Add instructions
417
+ prompt += `## Instructions\n`;
418
+ prompt += `1. Read and understand each new message\n`;
419
+ prompt += `2. Respond using: @relay:AgentName Your reply\n`;
420
+ prompt += `3. When finished processing all messages, EXIT (do not wait)\n\n`;
421
+ prompt += `## Context Preservation\n`;
422
+ prompt += `After you respond, output an updated compact summary so future spawns keep context:\n`;
423
+ prompt += `[[SUMMARY]]<~1-2k chars: current goals, key decisions, current state, next steps>[[/SUMMARY]]\n\n`;
424
+ prompt += `Optional structured markers (only if helpful):\n`;
425
+ prompt += `- [[DECISION]]{\"what\":\"...\",\"why\":\"...\"}[[/DECISION]]\n`;
426
+ prompt += `- [[TODO]]{\"task\":\"...\",\"priority\":\"high|normal|low\",\"owner\":\"?\"}[[/TODO]]\n`;
427
+ prompt += `- [[DONE]]task substring[[/DONE]]\n`;
428
+ return prompt;
429
+ }
430
+ }
431
+ /**
432
+ * Global state registry for all agents
433
+ */
434
+ export class StateRegistry {
435
+ config;
436
+ managers = new Map();
437
+ constructor(config) {
438
+ this.config = config;
439
+ }
440
+ /**
441
+ * Get or create state manager for an agent
442
+ */
443
+ getManager(agentName) {
444
+ let manager = this.managers.get(agentName);
445
+ if (!manager) {
446
+ manager = new StateManager(agentName, this.config);
447
+ this.managers.set(agentName, manager);
448
+ }
449
+ return manager;
450
+ }
451
+ /**
452
+ * List all registered agents (from disk)
453
+ */
454
+ listAgents() {
455
+ if (!fs.existsSync(this.config.dataDir)) {
456
+ return [];
457
+ }
458
+ const entries = fs.readdirSync(this.config.dataDir, { withFileTypes: true });
459
+ return entries
460
+ .filter(e => e.isDirectory())
461
+ .filter(e => fs.existsSync(path.join(this.config.dataDir, e.name, 'state.json')))
462
+ .map(e => e.name);
463
+ }
464
+ }
465
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/supervisor/state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Agent Relay Supervisor
3
+ *
4
+ * Main supervisor loop that:
5
+ * 1. Watches registered agents for inbox messages
6
+ * 2. Spawns fresh CLI runs when messages arrive
7
+ * 3. Captures output and routes relay commands
8
+ * 4. Updates agent state for context preservation
9
+ */
10
+ import type { SupervisorConfig, AgentRegistration, AgentState } from './types.js';
11
+ export declare class Supervisor {
12
+ private config;
13
+ private registry;
14
+ private spawner;
15
+ private client;
16
+ private running;
17
+ private pollTimer?;
18
+ constructor(config?: Partial<SupervisorConfig>);
19
+ /**
20
+ * Start the supervisor
21
+ */
22
+ start(): Promise<void>;
23
+ /**
24
+ * Stop the supervisor
25
+ */
26
+ stop(): void;
27
+ /**
28
+ * Register a new agent
29
+ */
30
+ registerAgent(registration: AgentRegistration): AgentState;
31
+ /**
32
+ * Unregister an agent
33
+ */
34
+ unregisterAgent(name: string): void;
35
+ /**
36
+ * Schedule next poll
37
+ */
38
+ private schedulePoll;
39
+ /**
40
+ * Poll all agents for new messages
41
+ */
42
+ private poll;
43
+ /**
44
+ * Process a single agent's inbox
45
+ */
46
+ private processAgent;
47
+ /**
48
+ * Get list of registered agents
49
+ */
50
+ getAgents(): string[];
51
+ /**
52
+ * Get agent state
53
+ */
54
+ getAgentState(name: string): AgentState | null;
55
+ /**
56
+ * Get lightweight diagnostics for CLI display.
57
+ */
58
+ getAgentDiagnostics(name: string): {
59
+ state: AgentState | null;
60
+ locked: boolean;
61
+ inboxPath: string;
62
+ statePath: string;
63
+ lockPath: string;
64
+ hasUnreadInbox: boolean;
65
+ };
66
+ }
67
+ //# sourceMappingURL=supervisor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supervisor.d.ts","sourceRoot":"","sources":["../../src/supervisor/supervisor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAQH,OAAO,KAAK,EACV,gBAAgB,EAChB,iBAAiB,EACjB,UAAU,EACX,MAAM,YAAY,CAAC;AAEpB,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAC,CAAiB;gBAEvB,MAAM,GAAE,OAAO,CAAC,gBAAgB,CAAM;IAmBlD;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAoB5B;;OAEG;IACH,IAAI,IAAI,IAAI;IAgBZ;;OAEG;IACH,aAAa,CAAC,YAAY,EAAE,iBAAiB,GAAG,UAAU;IA2B1D;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQnC;;OAEG;IACH,OAAO,CAAC,YAAY;IASpB;;OAEG;YACW,IAAI;IAYlB;;OAEG;YACW,YAAY;IAkH1B;;OAEG;IACH,SAAS,IAAI,MAAM,EAAE;IAIrB;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAI9C;;OAEG;IACH,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG;QACjC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;QACzB,MAAM,EAAE,OAAO,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,cAAc,EAAE,OAAO,CAAC;KACzB;CAmBF"}