agent-relay 1.0.6 → 1.0.8
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/README.md +18 -6
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +344 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/daemon/agent-registry.d.ts +60 -0
- package/dist/daemon/agent-registry.d.ts.map +1 -0
- package/dist/daemon/agent-registry.js +158 -0
- package/dist/daemon/agent-registry.js.map +1 -0
- package/dist/daemon/connection.d.ts +11 -1
- package/dist/daemon/connection.d.ts.map +1 -1
- package/dist/daemon/connection.js +31 -2
- package/dist/daemon/connection.js.map +1 -1
- package/dist/daemon/index.d.ts +2 -0
- package/dist/daemon/index.d.ts.map +1 -1
- package/dist/daemon/index.js +2 -0
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/registry.d.ts +9 -0
- package/dist/daemon/registry.d.ts.map +1 -0
- package/dist/daemon/registry.js +9 -0
- package/dist/daemon/registry.js.map +1 -0
- package/dist/daemon/router.d.ts +34 -2
- package/dist/daemon/router.d.ts.map +1 -1
- package/dist/daemon/router.js +111 -1
- package/dist/daemon/router.js.map +1 -1
- package/dist/daemon/server.d.ts +1 -0
- package/dist/daemon/server.d.ts.map +1 -1
- package/dist/daemon/server.js +60 -13
- package/dist/daemon/server.js.map +1 -1
- package/dist/dashboard/public/index.html +625 -16
- package/dist/dashboard/server.d.ts +1 -1
- package/dist/dashboard/server.d.ts.map +1 -1
- package/dist/dashboard/server.js +125 -7
- package/dist/dashboard/server.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/protocol/types.d.ts +15 -1
- package/dist/protocol/types.d.ts.map +1 -1
- package/dist/storage/adapter.d.ts +53 -0
- package/dist/storage/adapter.d.ts.map +1 -1
- package/dist/storage/adapter.js +3 -0
- package/dist/storage/adapter.js.map +1 -1
- package/dist/storage/sqlite-adapter.d.ts +58 -1
- package/dist/storage/sqlite-adapter.d.ts.map +1 -1
- package/dist/storage/sqlite-adapter.js +374 -47
- package/dist/storage/sqlite-adapter.js.map +1 -1
- package/dist/utils/project-namespace.d.ts.map +1 -1
- package/dist/utils/project-namespace.js +22 -1
- package/dist/utils/project-namespace.js.map +1 -1
- package/dist/wrapper/client.d.ts +22 -3
- package/dist/wrapper/client.d.ts.map +1 -1
- package/dist/wrapper/client.js +59 -9
- package/dist/wrapper/client.js.map +1 -1
- package/dist/wrapper/parser.d.ts +110 -4
- package/dist/wrapper/parser.d.ts.map +1 -1
- package/dist/wrapper/parser.js +296 -84
- package/dist/wrapper/parser.js.map +1 -1
- package/dist/wrapper/tmux-wrapper.d.ts +100 -9
- package/dist/wrapper/tmux-wrapper.d.ts.map +1 -1
- package/dist/wrapper/tmux-wrapper.js +441 -83
- package/dist/wrapper/tmux-wrapper.js.map +1 -1
- package/docs/AGENTS.md +27 -27
- package/docs/CHANGELOG.md +1 -1
- package/docs/DESIGN_V2.md +1079 -0
- package/docs/INTEGRATION-GUIDE.md +926 -0
- package/docs/PROPOSAL-trajectories.md +1582 -0
- package/docs/PROTOCOL.md +3 -3
- package/docs/SCALING_ANALYSIS.md +280 -0
- package/docs/TMUX_IMPLEMENTATION_NOTES.md +9 -9
- package/docs/TMUX_IMPROVEMENTS.md +968 -0
- package/docs/competitive-analysis-mcp-agent-mail.md +389 -0
- package/package.json +6 -2
package/README.md
CHANGED
|
@@ -23,11 +23,11 @@ agent-relay -n Alice claude
|
|
|
23
23
|
agent-relay -n Bob codex
|
|
24
24
|
```
|
|
25
25
|
|
|
26
|
-
Agents communicate by outputting
|
|
26
|
+
Agents communicate by outputting `->relay:` patterns:
|
|
27
27
|
|
|
28
28
|
```
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
->relay:Bob Hey, can you review my changes?
|
|
30
|
+
->relay:* Broadcasting to everyone
|
|
31
31
|
```
|
|
32
32
|
|
|
33
33
|
## CLI
|
|
@@ -44,7 +44,7 @@ Agents communicate by outputting `@relay:` patterns:
|
|
|
44
44
|
## How It Works
|
|
45
45
|
|
|
46
46
|
1. `agent-relay up` starts a daemon that routes messages via Unix socket
|
|
47
|
-
2. `agent-relay <cmd>` wraps your agent in tmux, parsing output for
|
|
47
|
+
2. `agent-relay <cmd>` wraps your agent in tmux, parsing output for `->relay:` patterns
|
|
48
48
|
3. Messages are injected into recipient terminals in real-time
|
|
49
49
|
|
|
50
50
|
```
|
|
@@ -67,13 +67,13 @@ Agents communicate by outputting `@relay:` patterns:
|
|
|
67
67
|
### Send Message
|
|
68
68
|
|
|
69
69
|
```
|
|
70
|
-
|
|
70
|
+
->relay:AgentName Your message here
|
|
71
71
|
```
|
|
72
72
|
|
|
73
73
|
### Broadcast
|
|
74
74
|
|
|
75
75
|
```
|
|
76
|
-
|
|
76
|
+
->relay:* Message to all agents
|
|
77
77
|
```
|
|
78
78
|
|
|
79
79
|
### Receive
|
|
@@ -96,6 +96,8 @@ agent-relay read abc123
|
|
|
96
96
|
|
|
97
97
|
`agent-relay up` starts a web dashboard at http://localhost:3888
|
|
98
98
|
|
|
99
|
+

|
|
100
|
+
|
|
99
101
|
## Troubleshooting
|
|
100
102
|
|
|
101
103
|
| Issue | Solution |
|
|
@@ -112,6 +114,16 @@ cd agent-relay
|
|
|
112
114
|
npm install && npm run build
|
|
113
115
|
```
|
|
114
116
|
|
|
117
|
+
## Inspiration
|
|
118
|
+
|
|
119
|
+
This project was inspired by some excellent work in the multi-agent coordination space:
|
|
120
|
+
|
|
121
|
+
- **[mcp_agent_mail](https://github.com/Dicklesworthstone/mcp_agent_mail)** - A brilliant MCP-based approach to agent messaging with file-based inboxes and structured message handling. Great patterns for durable, asynchronous agent communication.
|
|
122
|
+
|
|
123
|
+
- **[swarm-tools / swarm-mail](https://github.com/joelhooks/swarm-tools)** - An exceptional event-sourced coordination system with durable cursors, locks, deferred responses, and ask/respond patterns. The gold standard for robust multi-agent workflows with full audit trails.
|
|
124
|
+
|
|
125
|
+
Both projects informed our thinking around durability, message threading, and coordination primitives. Check them out!
|
|
126
|
+
|
|
115
127
|
## License
|
|
116
128
|
|
|
117
129
|
MIT
|
package/dist/cli/index.d.ts
CHANGED
|
@@ -7,6 +7,8 @@
|
|
|
7
7
|
* relay -n Name cmd - Wrap with specific agent name
|
|
8
8
|
* relay up - Start daemon + dashboard
|
|
9
9
|
* relay read <id> - Read full message by ID
|
|
10
|
+
* relay agents - List connected agents
|
|
11
|
+
* relay who - Show currently active agents
|
|
10
12
|
*/
|
|
11
13
|
export {};
|
|
12
14
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/cli/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;GAUG"}
|
package/dist/cli/index.js
CHANGED
|
@@ -7,6 +7,8 @@
|
|
|
7
7
|
* relay -n Name cmd - Wrap with specific agent name
|
|
8
8
|
* relay up - Start daemon + dashboard
|
|
9
9
|
* relay read <id> - Read full message by ID
|
|
10
|
+
* relay agents - List connected agents
|
|
11
|
+
* relay who - Show currently active agents
|
|
10
12
|
*/
|
|
11
13
|
import { Command } from 'commander';
|
|
12
14
|
import { config as dotenvConfig } from 'dotenv';
|
|
@@ -15,6 +17,8 @@ import { RelayClient } from '../wrapper/client.js';
|
|
|
15
17
|
import { generateAgentName } from '../utils/name-generator.js';
|
|
16
18
|
import fs from 'node:fs';
|
|
17
19
|
import path from 'node:path';
|
|
20
|
+
import { promisify } from 'node:util';
|
|
21
|
+
import { exec } from 'node:child_process';
|
|
18
22
|
import { fileURLToPath } from 'node:url';
|
|
19
23
|
dotenvConfig();
|
|
20
24
|
const DEFAULT_DASHBOARD_PORT = process.env.AGENT_RELAY_DASHBOARD_PORT || '3888';
|
|
@@ -24,6 +28,7 @@ const __dirname = path.dirname(__filename);
|
|
|
24
28
|
const packageJsonPath = path.resolve(__dirname, '../../package.json');
|
|
25
29
|
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
|
|
26
30
|
const VERSION = packageJson.version;
|
|
31
|
+
const execAsync = promisify(exec);
|
|
27
32
|
const program = new Command();
|
|
28
33
|
function pidFilePathForSocket(socketPath) {
|
|
29
34
|
return `${socketPath}.pid`;
|
|
@@ -36,6 +41,7 @@ program
|
|
|
36
41
|
program
|
|
37
42
|
.option('-n, --name <name>', 'Agent name (auto-generated if not set)')
|
|
38
43
|
.option('-q, --quiet', 'Disable debug output', false)
|
|
44
|
+
.option('--prefix <pattern>', 'Relay prefix pattern (default: ->relay:)')
|
|
39
45
|
.argument('[command...]', 'Command to wrap (e.g., claude)')
|
|
40
46
|
.action(async (commandParts, options) => {
|
|
41
47
|
// If no command provided, show help
|
|
@@ -55,7 +61,10 @@ program
|
|
|
55
61
|
command: mainCommand,
|
|
56
62
|
args: commandArgs,
|
|
57
63
|
socketPath: paths.socketPath,
|
|
58
|
-
debug:
|
|
64
|
+
debug: false, // Use -q to keep quiet (debug off by default)
|
|
65
|
+
relayPrefix: options.prefix,
|
|
66
|
+
useInbox: true,
|
|
67
|
+
inboxDir: paths.dataDir, // Use the project-specific data directory for the inbox
|
|
59
68
|
});
|
|
60
69
|
process.on('SIGINT', () => {
|
|
61
70
|
wrapper.stop();
|
|
@@ -99,8 +108,8 @@ program
|
|
|
99
108
|
if (options.dashboard !== false) {
|
|
100
109
|
const port = parseInt(options.port, 10);
|
|
101
110
|
const { startDashboard } = await import('../dashboard/server.js');
|
|
102
|
-
startDashboard(port, paths.teamDir, dbPath)
|
|
103
|
-
console.log(`Dashboard: http://localhost:${
|
|
111
|
+
const actualPort = await startDashboard(port, paths.dataDir, paths.teamDir, dbPath);
|
|
112
|
+
console.log(`Dashboard: http://localhost:${actualPort}`);
|
|
104
113
|
}
|
|
105
114
|
console.log('Press Ctrl+C to stop.');
|
|
106
115
|
await new Promise(() => { });
|
|
@@ -139,8 +148,10 @@ program
|
|
|
139
148
|
.action(async () => {
|
|
140
149
|
const { getProjectPaths } = await import('../utils/project-namespace.js');
|
|
141
150
|
const paths = getProjectPaths();
|
|
151
|
+
const relaySessions = await discoverRelaySessions();
|
|
142
152
|
if (!fs.existsSync(paths.socketPath)) {
|
|
143
153
|
console.log('Status: STOPPED');
|
|
154
|
+
logRelaySessions(relaySessions);
|
|
144
155
|
return;
|
|
145
156
|
}
|
|
146
157
|
const client = new RelayClient({
|
|
@@ -152,12 +163,81 @@ program
|
|
|
152
163
|
await client.connect();
|
|
153
164
|
console.log('Status: RUNNING');
|
|
154
165
|
console.log(`Socket: ${paths.socketPath}`);
|
|
166
|
+
logRelaySessions(relaySessions);
|
|
155
167
|
client.disconnect();
|
|
156
168
|
}
|
|
157
169
|
catch {
|
|
158
170
|
console.log('Status: STOPPED');
|
|
171
|
+
logRelaySessions(relaySessions);
|
|
159
172
|
}
|
|
160
173
|
});
|
|
174
|
+
// agents - List connected agents (from registry file)
|
|
175
|
+
program
|
|
176
|
+
.command('agents')
|
|
177
|
+
.description('List connected agents')
|
|
178
|
+
.option('--all', 'Include internal/CLI agents')
|
|
179
|
+
.option('--json', 'Output as JSON')
|
|
180
|
+
.action(async (options) => {
|
|
181
|
+
const { getProjectPaths } = await import('../utils/project-namespace.js');
|
|
182
|
+
const paths = getProjectPaths();
|
|
183
|
+
const agentsPath = path.join(paths.teamDir, 'agents.json');
|
|
184
|
+
const allAgents = loadAgents(agentsPath);
|
|
185
|
+
const agents = options.all
|
|
186
|
+
? allAgents
|
|
187
|
+
: allAgents.filter(isVisibleAgent);
|
|
188
|
+
if (options.json) {
|
|
189
|
+
console.log(JSON.stringify(agents.map(a => ({ ...a, status: getAgentStatus(a) })), null, 2));
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
if (!agents.length) {
|
|
193
|
+
const hint = options.all ? '' : ' (use --all to include internal/cli agents)';
|
|
194
|
+
console.log(`No agents found. Ensure the daemon is running and agents are connected${hint}.`);
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
console.log('NAME STATUS CLI LAST SEEN');
|
|
198
|
+
console.log('---------------------------------------------');
|
|
199
|
+
agents.forEach((agent) => {
|
|
200
|
+
const name = (agent.name ?? 'unknown').padEnd(15);
|
|
201
|
+
const status = getAgentStatus(agent).padEnd(8);
|
|
202
|
+
const cli = (agent.cli ?? '-').padEnd(8);
|
|
203
|
+
const lastSeen = formatRelativeTime(agent.lastSeen);
|
|
204
|
+
console.log(`${name} ${status} ${cli} ${lastSeen}`);
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
// who - Show currently active agents (online within last 30s)
|
|
208
|
+
program
|
|
209
|
+
.command('who')
|
|
210
|
+
.description('Show currently active agents (last seen within 30 seconds)')
|
|
211
|
+
.option('--all', 'Include internal/CLI agents')
|
|
212
|
+
.option('--json', 'Output as JSON')
|
|
213
|
+
.action(async (options) => {
|
|
214
|
+
const { getProjectPaths } = await import('../utils/project-namespace.js');
|
|
215
|
+
const paths = getProjectPaths();
|
|
216
|
+
const agentsPath = path.join(paths.teamDir, 'agents.json');
|
|
217
|
+
const allAgents = loadAgents(agentsPath);
|
|
218
|
+
const visibleAgents = options.all
|
|
219
|
+
? allAgents
|
|
220
|
+
: allAgents.filter(a => !isInternalAgent(a.name));
|
|
221
|
+
const onlineAgents = visibleAgents.filter(isAgentOnline);
|
|
222
|
+
if (options.json) {
|
|
223
|
+
console.log(JSON.stringify(onlineAgents.map(a => ({ ...a, status: getAgentStatus(a) })), null, 2));
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
if (!onlineAgents.length) {
|
|
227
|
+
const hint = options.all ? '' : ' (use --all to include internal/cli agents)';
|
|
228
|
+
console.log(`No active agents found${hint}.`);
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
console.log('NAME STATUS CLI LAST SEEN');
|
|
232
|
+
console.log('---------------------------------------------');
|
|
233
|
+
onlineAgents.forEach((agent) => {
|
|
234
|
+
const name = (agent.name ?? 'unknown').padEnd(15);
|
|
235
|
+
const status = getAgentStatus(agent).padEnd(8);
|
|
236
|
+
const cli = (agent.cli ?? '-').padEnd(8);
|
|
237
|
+
const lastSeen = formatRelativeTime(agent.lastSeen);
|
|
238
|
+
console.log(`${name} ${status} ${cli} ${lastSeen}`);
|
|
239
|
+
});
|
|
240
|
+
});
|
|
161
241
|
// read - Read full message by ID (for truncated messages)
|
|
162
242
|
program
|
|
163
243
|
.command('read')
|
|
@@ -184,6 +264,62 @@ program
|
|
|
184
264
|
console.log(msg.body);
|
|
185
265
|
await adapter.close?.();
|
|
186
266
|
});
|
|
267
|
+
// ============================================
|
|
268
|
+
// Hidden commands (for agents, not in --help)
|
|
269
|
+
// ============================================
|
|
270
|
+
// history - Show recent messages (hidden from help, for agent use)
|
|
271
|
+
program
|
|
272
|
+
.command('history', { hidden: true })
|
|
273
|
+
.description('Show recent messages')
|
|
274
|
+
.option('-n, --limit <count>', 'Number of messages to show', '50')
|
|
275
|
+
.option('-f, --from <agent>', 'Filter by sender')
|
|
276
|
+
.option('-t, --to <agent>', 'Filter by recipient')
|
|
277
|
+
.option('--since <time>', 'Since time (e.g., "1h", "2024-01-01")')
|
|
278
|
+
.option('--json', 'Output as JSON')
|
|
279
|
+
.action(async (options) => {
|
|
280
|
+
const { getProjectPaths } = await import('../utils/project-namespace.js');
|
|
281
|
+
const { createStorageAdapter } = await import('../storage/adapter.js');
|
|
282
|
+
const paths = getProjectPaths();
|
|
283
|
+
const adapter = await createStorageAdapter(paths.dbPath);
|
|
284
|
+
const limit = Number.parseInt(options.limit ?? '50', 10) || 50;
|
|
285
|
+
const sinceTs = parseSince(options.since);
|
|
286
|
+
try {
|
|
287
|
+
const messages = await adapter.getMessages({
|
|
288
|
+
limit,
|
|
289
|
+
from: options.from,
|
|
290
|
+
to: options.to,
|
|
291
|
+
sinceTs,
|
|
292
|
+
order: 'desc',
|
|
293
|
+
});
|
|
294
|
+
if (options.json) {
|
|
295
|
+
const payload = messages.map((m) => ({
|
|
296
|
+
id: m.id,
|
|
297
|
+
ts: m.ts,
|
|
298
|
+
timestamp: new Date(m.ts).toISOString(),
|
|
299
|
+
from: m.from,
|
|
300
|
+
to: m.to,
|
|
301
|
+
topic: m.topic,
|
|
302
|
+
thread: m.thread,
|
|
303
|
+
kind: m.kind,
|
|
304
|
+
body: m.body,
|
|
305
|
+
}));
|
|
306
|
+
console.log(JSON.stringify(payload, null, 2));
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
if (!messages.length) {
|
|
310
|
+
console.log('No messages found.');
|
|
311
|
+
return;
|
|
312
|
+
}
|
|
313
|
+
messages.forEach((msg) => {
|
|
314
|
+
const ts = new Date(msg.ts).toISOString();
|
|
315
|
+
const body = msg.body.length > 120 ? `${msg.body.slice(0, 117)}...` : msg.body;
|
|
316
|
+
console.log(`${ts} ${msg.from} -> ${msg.to}: ${body}`);
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
finally {
|
|
320
|
+
await adapter.close?.();
|
|
321
|
+
}
|
|
322
|
+
});
|
|
187
323
|
// version - Show version info
|
|
188
324
|
program
|
|
189
325
|
.command('version')
|
|
@@ -191,5 +327,210 @@ program
|
|
|
191
327
|
.action(() => {
|
|
192
328
|
console.log(`agent-relay v${VERSION}`);
|
|
193
329
|
});
|
|
330
|
+
// gc - Clean up orphaned tmux sessions (hidden - for agent use)
|
|
331
|
+
program
|
|
332
|
+
.command('gc', { hidden: true })
|
|
333
|
+
.description('Clean up orphaned tmux sessions (sessions with no connected agent)')
|
|
334
|
+
.option('--dry-run', 'Show what would be cleaned without actually doing it')
|
|
335
|
+
.option('--force', 'Kill all relay sessions regardless of connection status')
|
|
336
|
+
.action(async (options) => {
|
|
337
|
+
const { getProjectPaths } = await import('../utils/project-namespace.js');
|
|
338
|
+
const paths = getProjectPaths();
|
|
339
|
+
const agentsPath = path.join(paths.teamDir, 'agents.json');
|
|
340
|
+
// Get all relay tmux sessions
|
|
341
|
+
const sessions = await discoverRelaySessions();
|
|
342
|
+
if (!sessions.length) {
|
|
343
|
+
console.log('No relay tmux sessions found.');
|
|
344
|
+
return;
|
|
345
|
+
}
|
|
346
|
+
// Get connected agents
|
|
347
|
+
const connectedAgents = new Set();
|
|
348
|
+
if (!options.force) {
|
|
349
|
+
const agents = loadAgents(agentsPath);
|
|
350
|
+
// Consider an agent "connected" if last seen within 30 seconds
|
|
351
|
+
const staleThresholdMs = 30_000;
|
|
352
|
+
const now = Date.now();
|
|
353
|
+
agents.forEach(a => {
|
|
354
|
+
if (a.name && a.lastSeen) {
|
|
355
|
+
const lastSeenTs = Date.parse(a.lastSeen);
|
|
356
|
+
if (!Number.isNaN(lastSeenTs) && now - lastSeenTs < staleThresholdMs) {
|
|
357
|
+
connectedAgents.add(a.name);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
// Find orphaned sessions
|
|
363
|
+
const orphaned = sessions.filter(s => options.force || (s.agentName && !connectedAgents.has(s.agentName)));
|
|
364
|
+
if (!orphaned.length) {
|
|
365
|
+
console.log(`All ${sessions.length} session(s) have active agents.`);
|
|
366
|
+
return;
|
|
367
|
+
}
|
|
368
|
+
console.log(`Found ${orphaned.length} orphaned session(s):`);
|
|
369
|
+
for (const session of orphaned) {
|
|
370
|
+
console.log(` - ${session.sessionName} (agent: ${session.agentName ?? 'unknown'})`);
|
|
371
|
+
}
|
|
372
|
+
if (options.dryRun) {
|
|
373
|
+
console.log('\nDry run - no sessions killed.');
|
|
374
|
+
return;
|
|
375
|
+
}
|
|
376
|
+
// Kill orphaned sessions
|
|
377
|
+
let killed = 0;
|
|
378
|
+
for (const session of orphaned) {
|
|
379
|
+
try {
|
|
380
|
+
await execAsync(`tmux kill-session -t ${session.sessionName}`);
|
|
381
|
+
killed++;
|
|
382
|
+
console.log(`Killed: ${session.sessionName}`);
|
|
383
|
+
}
|
|
384
|
+
catch (err) {
|
|
385
|
+
console.error(`Failed to kill ${session.sessionName}: ${err.message}`);
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
console.log(`\nCleaned up ${killed}/${orphaned.length} session(s).`);
|
|
389
|
+
});
|
|
390
|
+
async function discoverRelaySessions() {
|
|
391
|
+
try {
|
|
392
|
+
const { stdout } = await execAsync('tmux list-sessions -F "#{session_name}"');
|
|
393
|
+
const sessionNames = stdout
|
|
394
|
+
.split('\n')
|
|
395
|
+
.map(s => s.trim())
|
|
396
|
+
.filter(Boolean);
|
|
397
|
+
const relaySessions = sessionNames
|
|
398
|
+
.map(name => {
|
|
399
|
+
const match = name.match(/^relay-(.+)$/);
|
|
400
|
+
if (!match)
|
|
401
|
+
return undefined;
|
|
402
|
+
return { sessionName: name, agentName: match[1] };
|
|
403
|
+
})
|
|
404
|
+
.filter((s) => Boolean(s));
|
|
405
|
+
return await Promise.all(relaySessions.map(async (session) => {
|
|
406
|
+
let cwd;
|
|
407
|
+
try {
|
|
408
|
+
const { stdout: cwdOut } = await execAsync(`tmux display-message -t ${session.sessionName} -p '#{pane_current_path}'`);
|
|
409
|
+
cwd = cwdOut.trim() || undefined;
|
|
410
|
+
}
|
|
411
|
+
catch {
|
|
412
|
+
cwd = undefined;
|
|
413
|
+
}
|
|
414
|
+
return { ...session, cwd };
|
|
415
|
+
}));
|
|
416
|
+
}
|
|
417
|
+
catch {
|
|
418
|
+
return [];
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
function logRelaySessions(sessions) {
|
|
422
|
+
if (!sessions.length) {
|
|
423
|
+
console.log('Relay tmux sessions: none detected');
|
|
424
|
+
return;
|
|
425
|
+
}
|
|
426
|
+
console.log('Relay tmux sessions:');
|
|
427
|
+
sessions.forEach((session) => {
|
|
428
|
+
const parts = [
|
|
429
|
+
`agent: ${session.agentName ?? 'unknown'}`,
|
|
430
|
+
session.cwd ? `cwd: ${session.cwd}` : undefined,
|
|
431
|
+
].filter(Boolean);
|
|
432
|
+
console.log(`- ${session.sessionName}${parts.length ? ` (${parts.join(', ')})` : ''}`);
|
|
433
|
+
});
|
|
434
|
+
}
|
|
435
|
+
function loadAgents(agentsPath) {
|
|
436
|
+
if (!fs.existsSync(agentsPath)) {
|
|
437
|
+
return [];
|
|
438
|
+
}
|
|
439
|
+
try {
|
|
440
|
+
const raw = JSON.parse(fs.readFileSync(agentsPath, 'utf-8'));
|
|
441
|
+
const agentsArray = Array.isArray(raw?.agents)
|
|
442
|
+
? raw.agents
|
|
443
|
+
: raw?.agents
|
|
444
|
+
? Object.values(raw.agents)
|
|
445
|
+
: [];
|
|
446
|
+
return agentsArray
|
|
447
|
+
.filter((a) => a?.name)
|
|
448
|
+
.map((a) => ({
|
|
449
|
+
id: a.id,
|
|
450
|
+
name: a.name,
|
|
451
|
+
cli: a.cli,
|
|
452
|
+
workingDirectory: a.workingDirectory,
|
|
453
|
+
firstSeen: a.firstSeen,
|
|
454
|
+
lastSeen: a.lastSeen,
|
|
455
|
+
messagesSent: typeof a.messagesSent === 'number' ? a.messagesSent : 0,
|
|
456
|
+
messagesReceived: typeof a.messagesReceived === 'number' ? a.messagesReceived : 0,
|
|
457
|
+
}));
|
|
458
|
+
}
|
|
459
|
+
catch (err) {
|
|
460
|
+
console.error('Failed to read agents.json:', err.message);
|
|
461
|
+
return [];
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
const STALE_THRESHOLD_MS = 30_000;
|
|
465
|
+
// Internal agents that should be hidden from `agents` and `who` by default
|
|
466
|
+
const INTERNAL_AGENTS = new Set(['cli', 'Dashboard']);
|
|
467
|
+
function isInternalAgent(name) {
|
|
468
|
+
if (!name)
|
|
469
|
+
return true;
|
|
470
|
+
if (name.startsWith('__'))
|
|
471
|
+
return true;
|
|
472
|
+
return INTERNAL_AGENTS.has(name);
|
|
473
|
+
}
|
|
474
|
+
function getAgentStatus(agent) {
|
|
475
|
+
if (!agent.lastSeen)
|
|
476
|
+
return 'UNKNOWN';
|
|
477
|
+
const ts = Date.parse(agent.lastSeen);
|
|
478
|
+
if (Number.isNaN(ts))
|
|
479
|
+
return 'UNKNOWN';
|
|
480
|
+
return Date.now() - ts < STALE_THRESHOLD_MS ? 'ONLINE' : 'STALE';
|
|
481
|
+
}
|
|
482
|
+
function isAgentOnline(agent) {
|
|
483
|
+
return getAgentStatus(agent) === 'ONLINE';
|
|
484
|
+
}
|
|
485
|
+
// Visible agents: not internal and not stale (used by `agents` command)
|
|
486
|
+
function isVisibleAgent(agent) {
|
|
487
|
+
if (isInternalAgent(agent.name))
|
|
488
|
+
return false;
|
|
489
|
+
if (getAgentStatus(agent) === 'STALE')
|
|
490
|
+
return false;
|
|
491
|
+
return true;
|
|
492
|
+
}
|
|
493
|
+
function formatRelativeTime(iso) {
|
|
494
|
+
if (!iso)
|
|
495
|
+
return 'unknown';
|
|
496
|
+
const ts = Date.parse(iso);
|
|
497
|
+
if (Number.isNaN(ts))
|
|
498
|
+
return 'unknown';
|
|
499
|
+
const diffMs = Date.now() - ts;
|
|
500
|
+
const diffSec = Math.floor(diffMs / 1000);
|
|
501
|
+
if (diffSec < 60)
|
|
502
|
+
return `${diffSec}s ago`;
|
|
503
|
+
const diffMin = Math.floor(diffSec / 60);
|
|
504
|
+
if (diffMin < 60)
|
|
505
|
+
return `${diffMin}m ago`;
|
|
506
|
+
const diffHours = Math.floor(diffMin / 60);
|
|
507
|
+
if (diffHours < 48)
|
|
508
|
+
return `${diffHours}h ago`;
|
|
509
|
+
const diffDays = Math.floor(diffHours / 24);
|
|
510
|
+
return `${diffDays}d ago`;
|
|
511
|
+
}
|
|
512
|
+
function parseSince(input) {
|
|
513
|
+
if (!input)
|
|
514
|
+
return undefined;
|
|
515
|
+
const trimmed = String(input).trim();
|
|
516
|
+
if (!trimmed)
|
|
517
|
+
return undefined;
|
|
518
|
+
const durationMatch = trimmed.match(/^(-?\d+)([smhd])$/i);
|
|
519
|
+
if (durationMatch) {
|
|
520
|
+
const value = Number(durationMatch[1]);
|
|
521
|
+
const unit = durationMatch[2].toLowerCase();
|
|
522
|
+
const multipliers = {
|
|
523
|
+
s: 1000,
|
|
524
|
+
m: 60_000,
|
|
525
|
+
h: 3_600_000,
|
|
526
|
+
d: 86_400_000,
|
|
527
|
+
};
|
|
528
|
+
return Date.now() - value * multipliers[unit];
|
|
529
|
+
}
|
|
530
|
+
const parsed = Date.parse(trimmed);
|
|
531
|
+
if (Number.isNaN(parsed))
|
|
532
|
+
return undefined;
|
|
533
|
+
return parsed;
|
|
534
|
+
}
|
|
194
535
|
program.parse();
|
|
195
536
|
//# sourceMappingURL=index.js.map
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Registry
|
|
3
|
+
* Persists agent metadata across daemon restarts.
|
|
4
|
+
*/
|
|
5
|
+
export interface AgentRecord {
|
|
6
|
+
id: string;
|
|
7
|
+
name: string;
|
|
8
|
+
cli?: string;
|
|
9
|
+
program?: string;
|
|
10
|
+
model?: string;
|
|
11
|
+
task?: string;
|
|
12
|
+
workingDirectory?: string;
|
|
13
|
+
firstSeen: string;
|
|
14
|
+
lastSeen: string;
|
|
15
|
+
messagesSent: number;
|
|
16
|
+
messagesReceived: number;
|
|
17
|
+
}
|
|
18
|
+
type AgentInput = {
|
|
19
|
+
name: string;
|
|
20
|
+
cli?: string;
|
|
21
|
+
program?: string;
|
|
22
|
+
model?: string;
|
|
23
|
+
task?: string;
|
|
24
|
+
workingDirectory?: string;
|
|
25
|
+
};
|
|
26
|
+
export declare class AgentRegistry {
|
|
27
|
+
private registryPath;
|
|
28
|
+
private agents;
|
|
29
|
+
constructor(teamDir: string);
|
|
30
|
+
/**
|
|
31
|
+
* Register or update an agent (public alias for registerOrUpdate to match docs).
|
|
32
|
+
*/
|
|
33
|
+
register(agent: AgentInput): AgentRecord;
|
|
34
|
+
/**
|
|
35
|
+
* Register or update an agent, refreshing lastSeen and metadata.
|
|
36
|
+
*/
|
|
37
|
+
registerOrUpdate(agent: AgentInput): AgentRecord;
|
|
38
|
+
/**
|
|
39
|
+
* Increment sent counter for an agent.
|
|
40
|
+
*/
|
|
41
|
+
recordSend(agentName: string): void;
|
|
42
|
+
/**
|
|
43
|
+
* Increment received counter for an agent.
|
|
44
|
+
*/
|
|
45
|
+
recordReceive(agentName: string): void;
|
|
46
|
+
/**
|
|
47
|
+
* Touch lastSeen for an agent (e.g., on disconnect).
|
|
48
|
+
*/
|
|
49
|
+
touch(agentName: string): void;
|
|
50
|
+
/**
|
|
51
|
+
* Get a snapshot of all agents.
|
|
52
|
+
*/
|
|
53
|
+
getAgents(): AgentRecord[];
|
|
54
|
+
private ensureRecord;
|
|
55
|
+
private ensureDir;
|
|
56
|
+
load(): void;
|
|
57
|
+
save(): void;
|
|
58
|
+
}
|
|
59
|
+
export {};
|
|
60
|
+
//# sourceMappingURL=agent-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-registry.d.ts","sourceRoot":"","sources":["../../src/daemon/agent-registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,KAAK,UAAU,GAAG;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,qBAAa,aAAa;IACxB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,MAAM,CAAuC;gBAEzC,OAAO,EAAE,MAAM;IAM3B;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,WAAW;IAIxC;;OAEG;IACH,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,WAAW;IAsChD;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAQnC;;OAEG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAQtC;;OAEG;IACH,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAO9B;;OAEG;IACH,SAAS,IAAI,WAAW,EAAE;IAI1B,OAAO,CAAC,YAAY;IAkBpB,OAAO,CAAC,SAAS;IAMjB,IAAI,IAAI,IAAI;IAmCZ,IAAI,IAAI,IAAI;CAWb"}
|