@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.
- package/dist/agent-manager.d.ts +134 -0
- package/dist/agent-manager.d.ts.map +1 -0
- package/dist/agent-manager.js +578 -0
- package/dist/agent-manager.js.map +1 -0
- package/dist/agent-registry.d.ts +99 -0
- package/dist/agent-registry.d.ts.map +1 -0
- package/dist/agent-registry.js +213 -0
- package/dist/agent-registry.js.map +1 -0
- package/dist/agent-signing.d.ts +158 -0
- package/dist/agent-signing.d.ts.map +1 -0
- package/dist/agent-signing.js +523 -0
- package/dist/agent-signing.js.map +1 -0
- package/dist/api.d.ts +106 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +876 -0
- package/dist/api.js.map +1 -0
- package/dist/auth.d.ts +94 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +197 -0
- package/dist/auth.js.map +1 -0
- package/dist/channel-membership-store.d.ts +55 -0
- package/dist/channel-membership-store.d.ts.map +1 -0
- package/dist/channel-membership-store.js +176 -0
- package/dist/channel-membership-store.js.map +1 -0
- package/dist/cli-auth.d.ts +89 -0
- package/dist/cli-auth.d.ts.map +1 -0
- package/dist/cli-auth.js +792 -0
- package/dist/cli-auth.js.map +1 -0
- package/dist/cloud-sync.d.ts +150 -0
- package/dist/cloud-sync.d.ts.map +1 -0
- package/dist/cloud-sync.js +446 -0
- package/dist/cloud-sync.js.map +1 -0
- package/dist/connection.d.ts +130 -0
- package/dist/connection.d.ts.map +1 -0
- package/dist/connection.js +438 -0
- package/dist/connection.js.map +1 -0
- package/dist/consensus-integration.d.ts +167 -0
- package/dist/consensus-integration.d.ts.map +1 -0
- package/dist/consensus-integration.js +371 -0
- package/dist/consensus-integration.js.map +1 -0
- package/dist/consensus.d.ts +271 -0
- package/dist/consensus.d.ts.map +1 -0
- package/dist/consensus.js +632 -0
- package/dist/consensus.js.map +1 -0
- package/dist/delivery-tracker.d.ts +34 -0
- package/dist/delivery-tracker.d.ts.map +1 -0
- package/dist/delivery-tracker.js +104 -0
- package/dist/delivery-tracker.js.map +1 -0
- package/dist/enhanced-features.d.ts +118 -0
- package/dist/enhanced-features.d.ts.map +1 -0
- package/dist/enhanced-features.js +176 -0
- package/dist/enhanced-features.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/migrations/index.d.ts +73 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/index.js +241 -0
- package/dist/migrations/index.js.map +1 -0
- package/dist/orchestrator.d.ts +217 -0
- package/dist/orchestrator.d.ts.map +1 -0
- package/dist/orchestrator.js +1143 -0
- package/dist/orchestrator.js.map +1 -0
- package/dist/rate-limiter.d.ts +68 -0
- package/dist/rate-limiter.d.ts.map +1 -0
- package/dist/rate-limiter.js +130 -0
- package/dist/rate-limiter.js.map +1 -0
- package/dist/registry.d.ts +9 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +9 -0
- package/dist/registry.js.map +1 -0
- package/dist/relay-ledger.d.ts +261 -0
- package/dist/relay-ledger.d.ts.map +1 -0
- package/dist/relay-ledger.js +532 -0
- package/dist/relay-ledger.js.map +1 -0
- package/dist/relay-watchdog.d.ts +125 -0
- package/dist/relay-watchdog.d.ts.map +1 -0
- package/dist/relay-watchdog.js +611 -0
- package/dist/relay-watchdog.js.map +1 -0
- package/dist/repo-manager.d.ts +116 -0
- package/dist/repo-manager.d.ts.map +1 -0
- package/dist/repo-manager.js +384 -0
- package/dist/repo-manager.js.map +1 -0
- package/dist/router.d.ts +370 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.js +1437 -0
- package/dist/router.js.map +1 -0
- package/dist/server.d.ts +174 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +1001 -0
- package/dist/server.js.map +1 -0
- package/dist/spawn-manager.d.ts +78 -0
- package/dist/spawn-manager.d.ts.map +1 -0
- package/dist/spawn-manager.js +165 -0
- package/dist/spawn-manager.js.map +1 -0
- package/dist/sync-queue.d.ts +116 -0
- package/dist/sync-queue.d.ts.map +1 -0
- package/dist/sync-queue.js +361 -0
- package/dist/sync-queue.js.map +1 -0
- package/dist/types.d.ts +133 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/workspace-manager.d.ts +80 -0
- package/dist/workspace-manager.d.ts.map +1 -0
- package/dist/workspace-manager.js +314 -0
- package/dist/workspace-manager.js.map +1 -0
- 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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"}
|