@agent-relay/daemon 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 (109) hide show
  1. package/dist/agent-manager.d.ts +134 -0
  2. package/dist/agent-manager.d.ts.map +1 -0
  3. package/dist/agent-manager.js +578 -0
  4. package/dist/agent-manager.js.map +1 -0
  5. package/dist/agent-registry.d.ts +99 -0
  6. package/dist/agent-registry.d.ts.map +1 -0
  7. package/dist/agent-registry.js +213 -0
  8. package/dist/agent-registry.js.map +1 -0
  9. package/dist/agent-signing.d.ts +158 -0
  10. package/dist/agent-signing.d.ts.map +1 -0
  11. package/dist/agent-signing.js +523 -0
  12. package/dist/agent-signing.js.map +1 -0
  13. package/dist/api.d.ts +106 -0
  14. package/dist/api.d.ts.map +1 -0
  15. package/dist/api.js +876 -0
  16. package/dist/api.js.map +1 -0
  17. package/dist/auth.d.ts +94 -0
  18. package/dist/auth.d.ts.map +1 -0
  19. package/dist/auth.js +197 -0
  20. package/dist/auth.js.map +1 -0
  21. package/dist/channel-membership-store.d.ts +55 -0
  22. package/dist/channel-membership-store.d.ts.map +1 -0
  23. package/dist/channel-membership-store.js +176 -0
  24. package/dist/channel-membership-store.js.map +1 -0
  25. package/dist/cli-auth.d.ts +89 -0
  26. package/dist/cli-auth.d.ts.map +1 -0
  27. package/dist/cli-auth.js +792 -0
  28. package/dist/cli-auth.js.map +1 -0
  29. package/dist/cloud-sync.d.ts +150 -0
  30. package/dist/cloud-sync.d.ts.map +1 -0
  31. package/dist/cloud-sync.js +446 -0
  32. package/dist/cloud-sync.js.map +1 -0
  33. package/dist/connection.d.ts +130 -0
  34. package/dist/connection.d.ts.map +1 -0
  35. package/dist/connection.js +438 -0
  36. package/dist/connection.js.map +1 -0
  37. package/dist/consensus-integration.d.ts +167 -0
  38. package/dist/consensus-integration.d.ts.map +1 -0
  39. package/dist/consensus-integration.js +371 -0
  40. package/dist/consensus-integration.js.map +1 -0
  41. package/dist/consensus.d.ts +271 -0
  42. package/dist/consensus.d.ts.map +1 -0
  43. package/dist/consensus.js +632 -0
  44. package/dist/consensus.js.map +1 -0
  45. package/dist/delivery-tracker.d.ts +34 -0
  46. package/dist/delivery-tracker.d.ts.map +1 -0
  47. package/dist/delivery-tracker.js +104 -0
  48. package/dist/delivery-tracker.js.map +1 -0
  49. package/dist/enhanced-features.d.ts +118 -0
  50. package/dist/enhanced-features.d.ts.map +1 -0
  51. package/dist/enhanced-features.js +176 -0
  52. package/dist/enhanced-features.js.map +1 -0
  53. package/dist/index.d.ts +31 -0
  54. package/dist/index.d.ts.map +1 -0
  55. package/dist/index.js +37 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/migrations/index.d.ts +73 -0
  58. package/dist/migrations/index.d.ts.map +1 -0
  59. package/dist/migrations/index.js +241 -0
  60. package/dist/migrations/index.js.map +1 -0
  61. package/dist/orchestrator.d.ts +217 -0
  62. package/dist/orchestrator.d.ts.map +1 -0
  63. package/dist/orchestrator.js +1143 -0
  64. package/dist/orchestrator.js.map +1 -0
  65. package/dist/rate-limiter.d.ts +68 -0
  66. package/dist/rate-limiter.d.ts.map +1 -0
  67. package/dist/rate-limiter.js +130 -0
  68. package/dist/rate-limiter.js.map +1 -0
  69. package/dist/registry.d.ts +9 -0
  70. package/dist/registry.d.ts.map +1 -0
  71. package/dist/registry.js +9 -0
  72. package/dist/registry.js.map +1 -0
  73. package/dist/relay-ledger.d.ts +261 -0
  74. package/dist/relay-ledger.d.ts.map +1 -0
  75. package/dist/relay-ledger.js +532 -0
  76. package/dist/relay-ledger.js.map +1 -0
  77. package/dist/relay-watchdog.d.ts +125 -0
  78. package/dist/relay-watchdog.d.ts.map +1 -0
  79. package/dist/relay-watchdog.js +611 -0
  80. package/dist/relay-watchdog.js.map +1 -0
  81. package/dist/repo-manager.d.ts +116 -0
  82. package/dist/repo-manager.d.ts.map +1 -0
  83. package/dist/repo-manager.js +384 -0
  84. package/dist/repo-manager.js.map +1 -0
  85. package/dist/router.d.ts +370 -0
  86. package/dist/router.d.ts.map +1 -0
  87. package/dist/router.js +1437 -0
  88. package/dist/router.js.map +1 -0
  89. package/dist/server.d.ts +174 -0
  90. package/dist/server.d.ts.map +1 -0
  91. package/dist/server.js +1001 -0
  92. package/dist/server.js.map +1 -0
  93. package/dist/spawn-manager.d.ts +78 -0
  94. package/dist/spawn-manager.d.ts.map +1 -0
  95. package/dist/spawn-manager.js +165 -0
  96. package/dist/spawn-manager.js.map +1 -0
  97. package/dist/sync-queue.d.ts +116 -0
  98. package/dist/sync-queue.d.ts.map +1 -0
  99. package/dist/sync-queue.js +361 -0
  100. package/dist/sync-queue.js.map +1 -0
  101. package/dist/types.d.ts +133 -0
  102. package/dist/types.d.ts.map +1 -0
  103. package/dist/types.js +6 -0
  104. package/dist/types.js.map +1 -0
  105. package/dist/workspace-manager.d.ts +80 -0
  106. package/dist/workspace-manager.d.ts.map +1 -0
  107. package/dist/workspace-manager.js +314 -0
  108. package/dist/workspace-manager.js.map +1 -0
  109. package/package.json +52 -0
@@ -0,0 +1,578 @@
1
+ /**
2
+ * Agent Manager
3
+ * Manages agents across workspaces with integrated resiliency.
4
+ */
5
+ import * as fs from 'fs';
6
+ import * as path from 'path';
7
+ import { EventEmitter } from 'events';
8
+ import { createLogger, getSupervisor, detectProvider } from '@agent-relay/resiliency';
9
+ import { RelayPtyOrchestrator } from '@agent-relay/wrapper';
10
+ import { resolveCommand } from '@agent-relay/utils/command-resolver';
11
+ const logger = createLogger('agent-manager');
12
+ function generateId() {
13
+ return Math.random().toString(36).substring(2, 15);
14
+ }
15
+ export class AgentManager extends EventEmitter {
16
+ agents = new Map();
17
+ supervisor = getSupervisor({
18
+ autoRestart: true,
19
+ maxRestarts: 5,
20
+ contextPersistence: {
21
+ enabled: true,
22
+ autoInjectOnRestart: true,
23
+ },
24
+ });
25
+ dataDir;
26
+ logsDir;
27
+ cloudPersistence;
28
+ constructor(dataDir) {
29
+ super();
30
+ this.dataDir = dataDir;
31
+ this.logsDir = path.join(dataDir, 'logs');
32
+ // Ensure directories exist
33
+ if (!fs.existsSync(this.logsDir)) {
34
+ fs.mkdirSync(this.logsDir, { recursive: true });
35
+ }
36
+ // Setup supervisor event handlers
37
+ this.setupSupervisorEvents();
38
+ // Start supervisor
39
+ this.supervisor.start();
40
+ logger.info('Agent manager initialized');
41
+ }
42
+ /**
43
+ * Set cloud persistence handler for forwarding RelayPtyOrchestrator events.
44
+ * When set, 'summary' and 'session-end' events from agents are forwarded
45
+ * to the handler for cloud persistence (PostgreSQL/Redis).
46
+ */
47
+ setCloudPersistence(handler) {
48
+ this.cloudPersistence = handler;
49
+ logger.info('Cloud persistence handler set');
50
+ }
51
+ /**
52
+ * Spawn a new agent in a workspace
53
+ */
54
+ async spawn(workspaceId, workspacePath, request) {
55
+ const { name, task } = request;
56
+ // Check if agent already exists
57
+ const existing = this.findByName(workspaceId, name);
58
+ if (existing) {
59
+ throw new Error(`Agent ${name} already exists in workspace`);
60
+ }
61
+ // Determine provider and CLI
62
+ const provider = request.provider || detectProvider(name);
63
+ const cli = this.getCliCommand(provider);
64
+ logger.info('Spawning agent', { name, workspaceId, provider, cli });
65
+ try {
66
+ // Parse CLI command
67
+ const cliParts = cli.split(' ');
68
+ const commandName = cliParts[0];
69
+ const args = [...cliParts.slice(1)];
70
+ // Resolve full path
71
+ const command = resolveCommand(commandName);
72
+ // Add required flags for non-interactive mode
73
+ if (provider === 'claude' && !args.includes('--dangerously-skip-permissions')) {
74
+ args.push('--dangerously-skip-permissions');
75
+ }
76
+ if (provider === 'codex' && !args.includes('--dangerously-bypass-approvals-and-sandbox')) {
77
+ args.push('--dangerously-bypass-approvals-and-sandbox');
78
+ }
79
+ if (provider === 'cursor' && !args.includes('--force')) {
80
+ args.push('--force');
81
+ }
82
+ // Create agent record
83
+ const agent = {
84
+ id: generateId(),
85
+ name,
86
+ workspaceId,
87
+ provider,
88
+ status: 'running',
89
+ spawnedAt: new Date(),
90
+ restartCount: 0,
91
+ task,
92
+ logFile: path.join(this.logsDir, `${name}-${Date.now()}.log`),
93
+ };
94
+ // Create PTY config
95
+ const ptyConfig = {
96
+ name,
97
+ command,
98
+ args,
99
+ cwd: workspacePath,
100
+ streamLogs: true,
101
+ // Skip continuity for cloud-managed agents
102
+ skipContinuity: true,
103
+ env: {
104
+ CLOUD_API_URL: process.env.CLOUD_API_URL || '',
105
+ WORKSPACE_TOKEN: process.env.WORKSPACE_TOKEN || '',
106
+ WORKSPACE_ID: workspaceId,
107
+ ...process.env,
108
+ },
109
+ onExit: (code) => {
110
+ logger.info('Agent process exited', { name, code });
111
+ this.handleAgentExit(agent.id, code);
112
+ },
113
+ };
114
+ // Create and start PTY
115
+ const pty = new RelayPtyOrchestrator(ptyConfig);
116
+ await pty.start();
117
+ agent.pid = pty.pid;
118
+ agent.pty = pty;
119
+ // Subscribe to RelayPtyOrchestrator events for cloud persistence
120
+ this.bindPtyEvents(agent.id, pty);
121
+ // Inject initial task
122
+ if (task && task.trim()) {
123
+ pty.write(task + '\r');
124
+ }
125
+ // Track agent
126
+ this.agents.set(agent.id, agent);
127
+ // Add to supervisor for health monitoring
128
+ this.supervisor.supervise({
129
+ name: agent.name,
130
+ cli,
131
+ task,
132
+ pid: agent.pid,
133
+ spawnedAt: agent.spawnedAt,
134
+ workingDir: workspacePath,
135
+ provider,
136
+ }, {
137
+ isAlive: () => {
138
+ try {
139
+ process.kill(agent.pid, 0);
140
+ return true;
141
+ }
142
+ catch {
143
+ return false;
144
+ }
145
+ },
146
+ kill: (signal) => {
147
+ try {
148
+ process.kill(agent.pid, signal);
149
+ }
150
+ catch {
151
+ // Already dead
152
+ }
153
+ },
154
+ restart: async () => {
155
+ await this.restartAgent(agent.id, workspacePath);
156
+ },
157
+ });
158
+ logger.info('Agent spawned', { id: agent.id, name, pid: agent.pid });
159
+ this.emitEvent({
160
+ type: 'agent:spawned',
161
+ workspaceId,
162
+ agentId: agent.id,
163
+ data: this.toPublicAgent(agent),
164
+ timestamp: new Date(),
165
+ });
166
+ return this.toPublicAgent(agent);
167
+ }
168
+ catch (err) {
169
+ logger.error('Failed to spawn agent', { name, error: String(err) });
170
+ throw err;
171
+ }
172
+ }
173
+ /**
174
+ * Stop an agent
175
+ */
176
+ async stop(agentId) {
177
+ const agent = this.agents.get(agentId);
178
+ if (!agent) {
179
+ return false;
180
+ }
181
+ logger.info('Stopping agent', { id: agentId, name: agent.name });
182
+ try {
183
+ // Remove from supervisor
184
+ this.supervisor.unsupervise(agent.name);
185
+ // Stop PTY (handles auto-save internally)
186
+ if (agent.pty) {
187
+ await agent.pty.stop();
188
+ // Force kill if still running
189
+ if (agent.pty.isRunning) {
190
+ await agent.pty.kill();
191
+ }
192
+ }
193
+ agent.status = 'stopped';
194
+ this.agents.delete(agentId);
195
+ this.emitEvent({
196
+ type: 'agent:stopped',
197
+ workspaceId: agent.workspaceId,
198
+ agentId,
199
+ data: { name: agent.name },
200
+ timestamp: new Date(),
201
+ });
202
+ return true;
203
+ }
204
+ catch (err) {
205
+ logger.error('Failed to stop agent', { id: agentId, error: String(err) });
206
+ return false;
207
+ }
208
+ }
209
+ /**
210
+ * Stop all agents in a workspace
211
+ */
212
+ async stopAllInWorkspace(workspaceId) {
213
+ const agents = this.getByWorkspace(workspaceId);
214
+ for (const agent of agents) {
215
+ await this.stop(agent.id);
216
+ }
217
+ }
218
+ /**
219
+ * Stop all agents
220
+ */
221
+ async stopAll() {
222
+ const agentIds = Array.from(this.agents.keys());
223
+ for (const id of agentIds) {
224
+ await this.stop(id);
225
+ }
226
+ }
227
+ /**
228
+ * Get an agent by ID
229
+ */
230
+ get(agentId) {
231
+ const agent = this.agents.get(agentId);
232
+ return agent ? this.toPublicAgent(agent) : undefined;
233
+ }
234
+ /**
235
+ * Get all agents in a workspace
236
+ */
237
+ getByWorkspace(workspaceId) {
238
+ return Array.from(this.agents.values())
239
+ .filter((a) => a.workspaceId === workspaceId)
240
+ .map((a) => this.toPublicAgent(a));
241
+ }
242
+ /**
243
+ * Get all agents
244
+ */
245
+ getAll() {
246
+ return Array.from(this.agents.values()).map((a) => this.toPublicAgent(a));
247
+ }
248
+ /**
249
+ * Find agent by name in a workspace
250
+ */
251
+ findByName(workspaceId, name) {
252
+ const agent = Array.from(this.agents.values()).find((a) => a.workspaceId === workspaceId && a.name === name);
253
+ return agent ? this.toPublicAgent(agent) : undefined;
254
+ }
255
+ /**
256
+ * Get agent output/logs
257
+ */
258
+ getOutput(agentId, limit) {
259
+ const agent = this.agents.get(agentId);
260
+ if (!agent?.pty)
261
+ return null;
262
+ return agent.pty.getOutput(limit);
263
+ }
264
+ /**
265
+ * Get raw output from agent
266
+ */
267
+ getRawOutput(agentId) {
268
+ const agent = this.agents.get(agentId);
269
+ if (!agent?.pty)
270
+ return null;
271
+ return agent.pty.getRawOutput();
272
+ }
273
+ /**
274
+ * Send input to an agent
275
+ */
276
+ sendInput(agentId, input) {
277
+ const agent = this.agents.get(agentId);
278
+ if (!agent?.pty)
279
+ return false;
280
+ agent.pty.write(input);
281
+ return true;
282
+ }
283
+ /**
284
+ * Interrupt an agent by sending Escape key twice.
285
+ * This breaks the agent out of their current task to allow refocusing.
286
+ * Uses Escape instead of Ctrl+C for better CLI compatibility (e.g., Claude CLI).
287
+ */
288
+ interrupt(agentId) {
289
+ const agent = this.agents.get(agentId);
290
+ if (!agent?.pty)
291
+ return false;
292
+ logger.info('Interrupting agent', { id: agentId, name: agent.name });
293
+ // Send Escape key twice (ASCII 0x1b) to interrupt current operation
294
+ // Double Escape ensures the CLI exits any nested mode/prompt
295
+ agent.pty.write('\x1b\x1b');
296
+ return true;
297
+ }
298
+ /**
299
+ * Find agent by name (global search across all workspaces)
300
+ */
301
+ findAgentByName(name) {
302
+ return Array.from(this.agents.values()).find((a) => a.name === name);
303
+ }
304
+ /**
305
+ * Interrupt an agent by name (searches across all workspaces).
306
+ * Useful for dashboard where only agent name is available.
307
+ */
308
+ interruptByName(name) {
309
+ const agent = this.findAgentByName(name);
310
+ if (!agent?.pty)
311
+ return false;
312
+ logger.info('Interrupting agent by name', { name, id: agent.id });
313
+ // Send Escape key twice (ASCII 0x1b) to interrupt current operation
314
+ // Double Escape ensures the CLI exits any nested mode/prompt
315
+ agent.pty.write('\x1b\x1b');
316
+ return true;
317
+ }
318
+ /**
319
+ * Restart an agent
320
+ */
321
+ async restartAgent(agentId, workspacePath) {
322
+ const agent = this.agents.get(agentId);
323
+ if (!agent)
324
+ return;
325
+ logger.info('Restarting agent', { id: agentId, name: agent.name });
326
+ agent.status = 'restarting';
327
+ agent.restartCount++;
328
+ try {
329
+ // Get CLI command
330
+ const cli = this.getCliCommand(agent.provider);
331
+ const cliParts = cli.split(' ');
332
+ const command = resolveCommand(cliParts[0]);
333
+ const args = [...cliParts.slice(1)];
334
+ if (agent.provider === 'claude' && !args.includes('--dangerously-skip-permissions')) {
335
+ args.push('--dangerously-skip-permissions');
336
+ }
337
+ if (agent.provider === 'codex' && !args.includes('--dangerously-bypass-approvals-and-sandbox')) {
338
+ args.push('--dangerously-bypass-approvals-and-sandbox');
339
+ }
340
+ if (agent.provider === 'cursor' && !args.includes('--force')) {
341
+ args.push('--force');
342
+ }
343
+ // Create new PTY
344
+ const ptyConfig = {
345
+ name: agent.name,
346
+ command,
347
+ args,
348
+ cwd: workspacePath,
349
+ streamLogs: true,
350
+ // Skip continuity for cloud-managed agents
351
+ skipContinuity: true,
352
+ env: {
353
+ CLOUD_API_URL: process.env.CLOUD_API_URL || '',
354
+ WORKSPACE_TOKEN: process.env.WORKSPACE_TOKEN || '',
355
+ WORKSPACE_ID: agent.workspaceId,
356
+ ...process.env,
357
+ },
358
+ onExit: (code) => {
359
+ this.handleAgentExit(agent.id, code);
360
+ },
361
+ };
362
+ const pty = new RelayPtyOrchestrator(ptyConfig);
363
+ await pty.start();
364
+ agent.pid = pty.pid;
365
+ agent.pty = pty;
366
+ agent.status = 'running';
367
+ agent.spawnedAt = new Date();
368
+ // Re-bind events for the new PTY
369
+ this.bindPtyEvents(agent.id, pty);
370
+ logger.info('Agent restarted', { id: agentId, name: agent.name, pid: agent.pid });
371
+ this.emitEvent({
372
+ type: 'agent:restarted',
373
+ workspaceId: agent.workspaceId,
374
+ agentId,
375
+ data: { name: agent.name, restartCount: agent.restartCount },
376
+ timestamp: new Date(),
377
+ });
378
+ }
379
+ catch (err) {
380
+ logger.error('Failed to restart agent', { id: agentId, error: String(err) });
381
+ agent.status = 'crashed';
382
+ }
383
+ }
384
+ /**
385
+ * Handle agent exit
386
+ */
387
+ handleAgentExit(agentId, code) {
388
+ const agent = this.agents.get(agentId);
389
+ if (!agent)
390
+ return;
391
+ if (agent.status === 'running') {
392
+ agent.status = code === 0 ? 'stopped' : 'crashed';
393
+ if (agent.status === 'crashed') {
394
+ // Get the continuity agentId for resume info
395
+ const continuityAgentId = agent.agentId ?? agent.pty?.getAgentId();
396
+ this.emitEvent({
397
+ type: 'agent:crashed',
398
+ workspaceId: agent.workspaceId,
399
+ agentId,
400
+ data: {
401
+ name: agent.name,
402
+ exitCode: code,
403
+ continuityAgentId,
404
+ resumeInstructions: continuityAgentId
405
+ ? `To resume this agent's work, use: --resume ${continuityAgentId}`
406
+ : undefined,
407
+ },
408
+ timestamp: new Date(),
409
+ });
410
+ }
411
+ }
412
+ }
413
+ /**
414
+ * Bind RelayPtyOrchestrator events to cloud persistence and daemon events.
415
+ *
416
+ * Events bound:
417
+ * - 'summary': Agent output a [[SUMMARY]] block
418
+ * - 'session-end': Agent output a [[SESSION_END]] block
419
+ * - 'injection-failed': Message injection failed after retries
420
+ */
421
+ bindPtyEvents(agentId, pty) {
422
+ const agent = this.agents.get(agentId);
423
+ if (!agent)
424
+ return;
425
+ // Forward output for streaming subscribers
426
+ pty.on('output', (output) => {
427
+ this.emitEvent({
428
+ type: 'agent:output',
429
+ workspaceId: agent.workspaceId,
430
+ agentId,
431
+ data: { output, agentName: agent.name },
432
+ timestamp: new Date(),
433
+ });
434
+ });
435
+ // Forward summary events
436
+ pty.on('summary', async (event) => {
437
+ logger.info('Agent summary', {
438
+ agentId,
439
+ name: event.agentName,
440
+ task: event.summary.currentTask,
441
+ });
442
+ // Emit daemon event
443
+ this.emitEvent({
444
+ type: 'agent:summary',
445
+ workspaceId: agent.workspaceId,
446
+ agentId,
447
+ data: { summary: event.summary },
448
+ timestamp: new Date(),
449
+ });
450
+ // Forward to cloud persistence if configured
451
+ if (this.cloudPersistence) {
452
+ try {
453
+ await this.cloudPersistence.onSummary(agentId, event);
454
+ }
455
+ catch (err) {
456
+ logger.error('Cloud persistence failed for summary', { agentId, error: String(err) });
457
+ }
458
+ }
459
+ });
460
+ // Forward session-end events
461
+ pty.on('session-end', async (event) => {
462
+ logger.info('Agent session ended', {
463
+ agentId,
464
+ name: event.agentName,
465
+ summary: event.marker.summary,
466
+ });
467
+ // Emit daemon event
468
+ this.emitEvent({
469
+ type: 'agent:session-end',
470
+ workspaceId: agent.workspaceId,
471
+ agentId,
472
+ data: { marker: event.marker },
473
+ timestamp: new Date(),
474
+ });
475
+ // Forward to cloud persistence if configured
476
+ if (this.cloudPersistence) {
477
+ try {
478
+ await this.cloudPersistence.onSessionEnd(agentId, event);
479
+ }
480
+ catch (err) {
481
+ logger.error('Cloud persistence failed for session-end', { agentId, error: String(err) });
482
+ }
483
+ }
484
+ });
485
+ // Log injection failures
486
+ pty.on('injection-failed', (event) => {
487
+ logger.warn('Message injection failed', {
488
+ agentId,
489
+ messageId: event.messageId,
490
+ from: event.from,
491
+ attempts: event.attempts,
492
+ });
493
+ this.emitEvent({
494
+ type: 'agent:injection-failed',
495
+ workspaceId: agent.workspaceId,
496
+ agentId,
497
+ data: event,
498
+ timestamp: new Date(),
499
+ });
500
+ });
501
+ }
502
+ /**
503
+ * Setup supervisor event handlers
504
+ */
505
+ setupSupervisorEvents() {
506
+ this.supervisor.on('died', ({ name, reason }) => {
507
+ logger.warn('Agent died (supervisor)', { name, reason });
508
+ });
509
+ this.supervisor.on('restarted', ({ name, pid }) => {
510
+ logger.info('Agent restarted (supervisor)', { name, pid });
511
+ });
512
+ this.supervisor.on('permanentlyDead', ({ name }) => {
513
+ logger.error('Agent permanently dead', { name });
514
+ // Find and update agent status
515
+ const agent = Array.from(this.agents.values()).find((a) => a.name === name);
516
+ if (agent) {
517
+ agent.status = 'crashed';
518
+ }
519
+ });
520
+ }
521
+ /**
522
+ * Get CLI command for provider
523
+ */
524
+ getCliCommand(provider) {
525
+ switch (provider) {
526
+ case 'claude':
527
+ return 'claude';
528
+ case 'codex':
529
+ return 'codex';
530
+ case 'gemini':
531
+ return 'gemini';
532
+ default:
533
+ return 'claude';
534
+ }
535
+ }
536
+ /**
537
+ * Convert internal agent to public agent (without pty reference)
538
+ */
539
+ toPublicAgent(agent) {
540
+ return {
541
+ id: agent.id,
542
+ name: agent.name,
543
+ workspaceId: agent.workspaceId,
544
+ provider: agent.provider,
545
+ status: agent.status,
546
+ pid: agent.pid,
547
+ task: agent.task,
548
+ spawnedAt: agent.spawnedAt,
549
+ lastHealthCheck: agent.lastHealthCheck,
550
+ restartCount: agent.restartCount,
551
+ logFile: agent.logFile,
552
+ agentId: agent.agentId ?? agent.pty?.getAgentId(),
553
+ };
554
+ }
555
+ /**
556
+ * Emit a daemon event
557
+ */
558
+ emitEvent(event) {
559
+ this.emit('event', event);
560
+ }
561
+ /**
562
+ * Shutdown the agent manager
563
+ */
564
+ async shutdown() {
565
+ logger.info('Shutting down agent manager');
566
+ await this.stopAll();
567
+ this.supervisor.stop();
568
+ }
569
+ }
570
+ let agentManagerInstance;
571
+ export function getAgentManager(dataDir) {
572
+ if (!agentManagerInstance) {
573
+ const dir = dataDir || path.join(process.env.HOME || '', '.agent-relay', 'daemon');
574
+ agentManagerInstance = new AgentManager(dir);
575
+ }
576
+ return agentManagerInstance;
577
+ }
578
+ //# sourceMappingURL=agent-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-manager.js","sourceRoot":"","sources":["../src/agent-manager.ts"],"names":[],"mappings":"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"}