agent-relay 1.0.7 → 1.0.9
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 +176 -6
- package/dist/bridge/config.d.ts +41 -0
- package/dist/bridge/config.d.ts.map +1 -0
- package/dist/bridge/config.js +143 -0
- package/dist/bridge/config.js.map +1 -0
- package/dist/bridge/index.d.ts +10 -0
- package/dist/bridge/index.d.ts.map +1 -0
- package/dist/bridge/index.js +10 -0
- package/dist/bridge/index.js.map +1 -0
- package/dist/bridge/multi-project-client.d.ts +99 -0
- package/dist/bridge/multi-project-client.d.ts.map +1 -0
- package/dist/bridge/multi-project-client.js +386 -0
- package/dist/bridge/multi-project-client.js.map +1 -0
- package/dist/bridge/spawner.d.ts +46 -0
- package/dist/bridge/spawner.d.ts.map +1 -0
- package/dist/bridge/spawner.js +223 -0
- package/dist/bridge/spawner.js.map +1 -0
- package/dist/bridge/types.d.ts +55 -0
- package/dist/bridge/types.d.ts.map +1 -0
- package/dist/bridge/types.js +6 -0
- package/dist/bridge/types.js.map +1 -0
- package/dist/bridge/utils.d.ts +30 -0
- package/dist/bridge/utils.d.ts.map +1 -0
- package/dist/bridge/utils.js +54 -0
- package/dist/bridge/utils.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +906 -6
- 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 +163 -0
- package/dist/daemon/agent-registry.js.map +1 -0
- package/dist/daemon/connection.d.ts +33 -1
- package/dist/daemon/connection.d.ts.map +1 -1
- package/dist/daemon/connection.js +86 -11
- 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 +61 -2
- package/dist/daemon/router.d.ts.map +1 -1
- package/dist/daemon/router.js +219 -4
- package/dist/daemon/router.js.map +1 -1
- package/dist/daemon/server.d.ts +9 -0
- package/dist/daemon/server.d.ts.map +1 -1
- package/dist/daemon/server.js +135 -16
- package/dist/daemon/server.js.map +1 -1
- package/dist/dashboard/metrics.d.ts +105 -0
- package/dist/dashboard/metrics.d.ts.map +1 -0
- package/dist/dashboard/metrics.js +192 -0
- package/dist/dashboard/metrics.js.map +1 -0
- package/dist/dashboard/needs-attention.d.ts +24 -0
- package/dist/dashboard/needs-attention.d.ts.map +1 -0
- package/dist/dashboard/needs-attention.js +78 -0
- package/dist/dashboard/needs-attention.js.map +1 -0
- package/dist/dashboard/public/bridge.html +1272 -0
- package/dist/dashboard/public/index.html +2094 -347
- package/dist/dashboard/public/js/app.js +184 -0
- package/dist/dashboard/public/js/app.js.map +7 -0
- package/dist/dashboard/public/metrics.html +999 -0
- package/dist/dashboard/server.d.ts +14 -1
- package/dist/dashboard/server.d.ts.map +1 -1
- package/dist/dashboard/server.js +689 -16
- package/dist/dashboard/server.js.map +1 -1
- package/dist/dashboard/start.js +1 -1
- package/dist/dashboard/start.js.map +1 -1
- package/dist/dashboard-v2/index.d.ts +10 -0
- package/dist/dashboard-v2/index.d.ts.map +1 -0
- package/dist/dashboard-v2/index.js +54 -0
- package/dist/dashboard-v2/index.js.map +1 -0
- package/dist/dashboard-v2/lib/api.d.ts +95 -0
- package/dist/dashboard-v2/lib/api.d.ts.map +1 -0
- package/dist/dashboard-v2/lib/api.js +270 -0
- package/dist/dashboard-v2/lib/api.js.map +1 -0
- package/dist/dashboard-v2/lib/colors.d.ts +61 -0
- package/dist/dashboard-v2/lib/colors.d.ts.map +1 -0
- package/dist/dashboard-v2/lib/colors.js +198 -0
- package/dist/dashboard-v2/lib/colors.js.map +1 -0
- package/dist/dashboard-v2/lib/hierarchy.d.ts +74 -0
- package/dist/dashboard-v2/lib/hierarchy.d.ts.map +1 -0
- package/dist/dashboard-v2/lib/hierarchy.js +196 -0
- package/dist/dashboard-v2/lib/hierarchy.js.map +1 -0
- package/dist/dashboard-v2/types/index.d.ts +154 -0
- package/dist/dashboard-v2/types/index.d.ts.map +1 -0
- package/dist/dashboard-v2/types/index.js +6 -0
- package/dist/dashboard-v2/types/index.js.map +1 -0
- 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 +74 -1
- package/dist/storage/adapter.d.ts.map +1 -1
- package/dist/storage/adapter.js +39 -0
- package/dist/storage/adapter.js.map +1 -1
- package/dist/storage/sqlite-adapter.d.ts +92 -1
- package/dist/storage/sqlite-adapter.d.ts.map +1 -1
- package/dist/storage/sqlite-adapter.js +615 -47
- package/dist/storage/sqlite-adapter.js.map +1 -1
- package/dist/utils/agent-config.d.ts +45 -0
- package/dist/utils/agent-config.d.ts.map +1 -0
- package/dist/utils/agent-config.js +118 -0
- package/dist/utils/agent-config.js.map +1 -0
- 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 +30 -3
- package/dist/wrapper/client.d.ts.map +1 -1
- package/dist/wrapper/client.js +85 -9
- package/dist/wrapper/client.js.map +1 -1
- package/dist/wrapper/parser.d.ts +127 -4
- package/dist/wrapper/parser.d.ts.map +1 -1
- package/dist/wrapper/parser.js +622 -86
- package/dist/wrapper/parser.js.map +1 -1
- package/dist/wrapper/tmux-wrapper.d.ts +136 -10
- package/dist/wrapper/tmux-wrapper.d.ts.map +1 -1
- package/dist/wrapper/tmux-wrapper.js +599 -79
- package/dist/wrapper/tmux-wrapper.js.map +1 -1
- package/docs/AGENTS.md +132 -27
- package/docs/ARCHITECTURE_DECISIONS.md +175 -0
- package/docs/CHANGELOG.md +1 -1
- package/docs/COMPETITIVE_ANALYSIS.md +897 -0
- package/docs/DESIGN_BRIDGE_STAFFING.md +878 -0
- package/docs/DESIGN_V2.md +1079 -0
- package/docs/INTEGRATION-GUIDE.md +926 -0
- package/docs/MONETIZATION.md +1679 -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/agent-relay-snippet.md +61 -0
- package/docs/competitive-analysis-mcp-agent-mail.md +389 -0
- package/docs/dashboard-v2-plan.md +179 -0
- package/package.json +10 -3
package/dist/daemon/server.js
CHANGED
|
@@ -8,6 +8,9 @@ import path from 'node:path';
|
|
|
8
8
|
import { Connection, DEFAULT_CONFIG } from './connection.js';
|
|
9
9
|
import { Router } from './router.js';
|
|
10
10
|
import { createStorageAdapter } from '../storage/adapter.js';
|
|
11
|
+
import { SqliteStorageAdapter } from '../storage/sqlite-adapter.js';
|
|
12
|
+
import { getProjectPaths } from '../utils/project-namespace.js';
|
|
13
|
+
import { AgentRegistry } from './agent-registry.js';
|
|
11
14
|
export const DEFAULT_SOCKET_PATH = '/tmp/agent-relay.sock';
|
|
12
15
|
export const DEFAULT_DAEMON_CONFIG = {
|
|
13
16
|
...DEFAULT_CONFIG,
|
|
@@ -22,6 +25,10 @@ export class Daemon {
|
|
|
22
25
|
connections = new Set();
|
|
23
26
|
storage;
|
|
24
27
|
storageInitialized = false;
|
|
28
|
+
registry;
|
|
29
|
+
processingStateInterval;
|
|
30
|
+
/** Interval for writing processing state file (500ms for responsive UI) */
|
|
31
|
+
static PROCESSING_STATE_INTERVAL_MS = 500;
|
|
25
32
|
constructor(config = {}) {
|
|
26
33
|
this.config = { ...DEFAULT_DAEMON_CONFIG, ...config };
|
|
27
34
|
if (config.socketPath && !config.pidFilePath) {
|
|
@@ -31,6 +38,9 @@ export class Daemon {
|
|
|
31
38
|
if (!this.config.teamDir) {
|
|
32
39
|
this.config.teamDir = path.dirname(this.config.socketPath);
|
|
33
40
|
}
|
|
41
|
+
if (this.config.teamDir) {
|
|
42
|
+
this.registry = new AgentRegistry(this.config.teamDir);
|
|
43
|
+
}
|
|
34
44
|
// Storage is initialized lazily in start() to support async createStorageAdapter
|
|
35
45
|
this.server = net.createServer(this.handleConnection.bind(this));
|
|
36
46
|
}
|
|
@@ -38,24 +48,40 @@ export class Daemon {
|
|
|
38
48
|
* Write current agents to agents.json for dashboard consumption.
|
|
39
49
|
*/
|
|
40
50
|
writeAgentsFile() {
|
|
41
|
-
if (!this.
|
|
51
|
+
if (!this.registry)
|
|
42
52
|
return;
|
|
43
|
-
|
|
44
|
-
const agents = this.
|
|
45
|
-
const connection = this.router.getConnection(name);
|
|
46
|
-
return {
|
|
47
|
-
name,
|
|
48
|
-
cli: connection?.cli,
|
|
49
|
-
connectedAt: new Date().toISOString(),
|
|
50
|
-
};
|
|
51
|
-
});
|
|
53
|
+
// The registry persists on every update; this is a no-op helper for symmetry.
|
|
54
|
+
const agents = this.registry.getAgents();
|
|
52
55
|
try {
|
|
53
|
-
|
|
56
|
+
const targetPath = path.join(this.config.teamDir ?? path.dirname(this.config.socketPath), 'agents.json');
|
|
57
|
+
const data = JSON.stringify({ agents }, null, 2);
|
|
58
|
+
// Write atomically: write to temp file first, then rename
|
|
59
|
+
// This prevents race conditions where readers see partial/empty data
|
|
60
|
+
const tempPath = `${targetPath}.tmp`;
|
|
61
|
+
fs.writeFileSync(tempPath, data, 'utf-8');
|
|
62
|
+
fs.renameSync(tempPath, targetPath);
|
|
54
63
|
}
|
|
55
64
|
catch (err) {
|
|
56
65
|
console.error('[daemon] Failed to write agents.json:', err);
|
|
57
66
|
}
|
|
58
67
|
}
|
|
68
|
+
/**
|
|
69
|
+
* Write processing state to processing-state.json for dashboard consumption.
|
|
70
|
+
* This file contains agents currently processing/thinking after receiving a message.
|
|
71
|
+
*/
|
|
72
|
+
writeProcessingStateFile() {
|
|
73
|
+
try {
|
|
74
|
+
const processingAgents = this.router.getProcessingAgents();
|
|
75
|
+
const targetPath = path.join(this.config.teamDir ?? path.dirname(this.config.socketPath), 'processing-state.json');
|
|
76
|
+
const data = JSON.stringify({ processingAgents, updatedAt: Date.now() }, null, 2);
|
|
77
|
+
const tempPath = `${targetPath}.tmp`;
|
|
78
|
+
fs.writeFileSync(tempPath, data, 'utf-8');
|
|
79
|
+
fs.renameSync(tempPath, targetPath);
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
console.error('[daemon] Failed to write processing-state.json:', err);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
59
85
|
/**
|
|
60
86
|
* Initialize storage adapter (called during start).
|
|
61
87
|
*/
|
|
@@ -72,7 +98,7 @@ export class Daemon {
|
|
|
72
98
|
path.join(path.dirname(this.config.socketPath), 'agent-relay.sqlite');
|
|
73
99
|
this.storage = await createStorageAdapter(storagePath, this.config.storageConfig);
|
|
74
100
|
}
|
|
75
|
-
this.router = new Router({ storage: this.storage });
|
|
101
|
+
this.router = new Router({ storage: this.storage, registry: this.registry });
|
|
76
102
|
this.storageInitialized = true;
|
|
77
103
|
}
|
|
78
104
|
/**
|
|
@@ -103,6 +129,10 @@ export class Daemon {
|
|
|
103
129
|
// Set restrictive permissions
|
|
104
130
|
fs.chmodSync(this.config.socketPath, 0o600);
|
|
105
131
|
fs.writeFileSync(this.config.pidFilePath, `${process.pid}\n`, 'utf-8');
|
|
132
|
+
// Start periodic processing state updates for dashboard
|
|
133
|
+
this.processingStateInterval = setInterval(() => {
|
|
134
|
+
this.writeProcessingStateFile();
|
|
135
|
+
}, Daemon.PROCESSING_STATE_INTERVAL_MS);
|
|
106
136
|
console.log(`[daemon] Listening on ${this.config.socketPath}`);
|
|
107
137
|
resolve();
|
|
108
138
|
});
|
|
@@ -114,6 +144,11 @@ export class Daemon {
|
|
|
114
144
|
async stop() {
|
|
115
145
|
if (!this.running)
|
|
116
146
|
return;
|
|
147
|
+
// Stop processing state updates
|
|
148
|
+
if (this.processingStateInterval) {
|
|
149
|
+
clearInterval(this.processingStateInterval);
|
|
150
|
+
this.processingStateInterval = undefined;
|
|
151
|
+
}
|
|
117
152
|
// Close all active connections
|
|
118
153
|
for (const connection of this.connections) {
|
|
119
154
|
connection.close();
|
|
@@ -145,30 +180,114 @@ export class Daemon {
|
|
|
145
180
|
*/
|
|
146
181
|
handleConnection(socket) {
|
|
147
182
|
console.log('[daemon] New connection');
|
|
148
|
-
const
|
|
183
|
+
const resumeHandler = this.storage?.getSessionByResumeToken
|
|
184
|
+
? async ({ agent, resumeToken }) => {
|
|
185
|
+
const session = await this.storage.getSessionByResumeToken(resumeToken);
|
|
186
|
+
if (!session || session.agentName !== agent)
|
|
187
|
+
return null;
|
|
188
|
+
let seedSequences;
|
|
189
|
+
if (this.storage?.getMaxSeqByStream) {
|
|
190
|
+
const streams = await this.storage.getMaxSeqByStream(agent, session.id);
|
|
191
|
+
seedSequences = streams.map(s => ({
|
|
192
|
+
topic: s.topic ?? 'default',
|
|
193
|
+
peer: s.peer,
|
|
194
|
+
seq: s.maxSeq,
|
|
195
|
+
}));
|
|
196
|
+
}
|
|
197
|
+
return {
|
|
198
|
+
sessionId: session.id,
|
|
199
|
+
resumeToken: session.resumeToken ?? resumeToken,
|
|
200
|
+
seedSequences,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
: undefined;
|
|
204
|
+
const connection = new Connection(socket, { ...this.config, resumeHandler });
|
|
149
205
|
this.connections.add(connection);
|
|
150
206
|
connection.onMessage = (envelope) => {
|
|
151
207
|
this.handleMessage(connection, envelope);
|
|
152
208
|
};
|
|
209
|
+
connection.onAck = (envelope) => {
|
|
210
|
+
this.router.handleAck(connection, envelope);
|
|
211
|
+
};
|
|
212
|
+
// Update lastSeen on successful heartbeat to keep agent status fresh
|
|
213
|
+
connection.onPong = () => {
|
|
214
|
+
if (connection.agentName) {
|
|
215
|
+
this.registry?.touch(connection.agentName);
|
|
216
|
+
}
|
|
217
|
+
};
|
|
153
218
|
// Register agent when connection becomes active (after successful handshake)
|
|
154
219
|
connection.onActive = () => {
|
|
155
220
|
if (connection.agentName) {
|
|
156
221
|
this.router.register(connection);
|
|
157
222
|
console.log(`[daemon] Agent registered: ${connection.agentName}`);
|
|
158
|
-
|
|
223
|
+
// Registry handles persistence internally via save()
|
|
224
|
+
this.registry?.registerOrUpdate({
|
|
225
|
+
name: connection.agentName,
|
|
226
|
+
cli: connection.cli,
|
|
227
|
+
program: connection.program,
|
|
228
|
+
model: connection.model,
|
|
229
|
+
task: connection.task,
|
|
230
|
+
workingDirectory: connection.workingDirectory,
|
|
231
|
+
});
|
|
232
|
+
// Record session start
|
|
233
|
+
if (this.storage instanceof SqliteStorageAdapter) {
|
|
234
|
+
const projectPaths = getProjectPaths();
|
|
235
|
+
const storage = this.storage;
|
|
236
|
+
const persistSession = async () => {
|
|
237
|
+
let startedAt = Date.now();
|
|
238
|
+
if (connection.isResumed && storage.getSessionByResumeToken) {
|
|
239
|
+
const existing = await storage.getSessionByResumeToken(connection.resumeToken);
|
|
240
|
+
if (existing?.startedAt) {
|
|
241
|
+
startedAt = existing.startedAt;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
await storage.startSession({
|
|
245
|
+
id: connection.sessionId,
|
|
246
|
+
agentName: connection.agentName,
|
|
247
|
+
cli: connection.cli,
|
|
248
|
+
projectId: projectPaths.projectId,
|
|
249
|
+
projectRoot: projectPaths.projectRoot,
|
|
250
|
+
startedAt,
|
|
251
|
+
resumeToken: connection.resumeToken,
|
|
252
|
+
});
|
|
253
|
+
};
|
|
254
|
+
persistSession().catch(err => console.error('[daemon] Failed to record session start:', err));
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
// Replay pending deliveries for resumed sessions
|
|
258
|
+
if (connection.isResumed) {
|
|
259
|
+
this.router.replayPending(connection).catch(err => {
|
|
260
|
+
console.error('[daemon] Failed to replay pending messages', err);
|
|
261
|
+
});
|
|
159
262
|
}
|
|
160
263
|
};
|
|
161
264
|
connection.onClose = () => {
|
|
162
265
|
console.log(`[daemon] Connection closed: ${connection.agentName ?? connection.id}`);
|
|
163
266
|
this.connections.delete(connection);
|
|
164
267
|
this.router.unregister(connection);
|
|
165
|
-
|
|
268
|
+
// Registry handles persistence internally via touch() -> save()
|
|
269
|
+
if (connection.agentName) {
|
|
270
|
+
this.registry?.touch(connection.agentName);
|
|
271
|
+
}
|
|
272
|
+
// Record session end (disconnect - agent may still mark it closed explicitly)
|
|
273
|
+
if (this.storage instanceof SqliteStorageAdapter) {
|
|
274
|
+
this.storage.endSession(connection.sessionId, { closedBy: 'disconnect' })
|
|
275
|
+
.catch(err => console.error('[daemon] Failed to record session end:', err));
|
|
276
|
+
}
|
|
166
277
|
};
|
|
167
278
|
connection.onError = (error) => {
|
|
168
279
|
console.error(`[daemon] Connection error: ${error.message}`);
|
|
169
280
|
this.connections.delete(connection);
|
|
170
281
|
this.router.unregister(connection);
|
|
171
|
-
|
|
282
|
+
// Registry handles persistence internally via touch() -> save()
|
|
283
|
+
if (connection.agentName) {
|
|
284
|
+
this.registry?.touch(connection.agentName);
|
|
285
|
+
}
|
|
286
|
+
// Record session end on error
|
|
287
|
+
if (this.storage instanceof SqliteStorageAdapter) {
|
|
288
|
+
this.storage.endSession(connection.sessionId, { closedBy: 'error' })
|
|
289
|
+
.catch(err => console.error('[daemon] Failed to record session end:', err));
|
|
290
|
+
}
|
|
172
291
|
};
|
|
173
292
|
}
|
|
174
293
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/daemon/server.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/daemon/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Metrics collection and computation for the Agent Relay dashboard.
|
|
3
|
+
* Provides real-time metrics for monitoring: throughput, agent health, error rates.
|
|
4
|
+
*/
|
|
5
|
+
export interface AgentMetrics {
|
|
6
|
+
name: string;
|
|
7
|
+
messagesSent: number;
|
|
8
|
+
messagesReceived: number;
|
|
9
|
+
firstSeen: string;
|
|
10
|
+
lastSeen: string;
|
|
11
|
+
isOnline: boolean;
|
|
12
|
+
uptimeSeconds: number;
|
|
13
|
+
}
|
|
14
|
+
export interface ThroughputMetrics {
|
|
15
|
+
messagesLastMinute: number;
|
|
16
|
+
messagesLastHour: number;
|
|
17
|
+
messagesLast24Hours: number;
|
|
18
|
+
avgMessagesPerMinute: number;
|
|
19
|
+
}
|
|
20
|
+
export interface SessionMetrics {
|
|
21
|
+
totalSessions: number;
|
|
22
|
+
activeSessions: number;
|
|
23
|
+
closedByAgent: number;
|
|
24
|
+
closedByDisconnect: number;
|
|
25
|
+
closedByError: number;
|
|
26
|
+
errorRate: number;
|
|
27
|
+
recentSessions: Array<{
|
|
28
|
+
id: string;
|
|
29
|
+
agentName: string;
|
|
30
|
+
startedAt: string;
|
|
31
|
+
endedAt?: string;
|
|
32
|
+
closedBy?: 'agent' | 'disconnect' | 'error';
|
|
33
|
+
messageCount: number;
|
|
34
|
+
}>;
|
|
35
|
+
}
|
|
36
|
+
export interface SystemMetrics {
|
|
37
|
+
totalAgents: number;
|
|
38
|
+
onlineAgents: number;
|
|
39
|
+
offlineAgents: number;
|
|
40
|
+
totalMessages: number;
|
|
41
|
+
throughput: ThroughputMetrics;
|
|
42
|
+
sessions: SessionMetrics;
|
|
43
|
+
agents: AgentMetrics[];
|
|
44
|
+
timestamp: string;
|
|
45
|
+
}
|
|
46
|
+
export interface PrometheusMetric {
|
|
47
|
+
name: string;
|
|
48
|
+
help: string;
|
|
49
|
+
type: 'counter' | 'gauge' | 'histogram';
|
|
50
|
+
values: Array<{
|
|
51
|
+
labels: Record<string, string>;
|
|
52
|
+
value: number;
|
|
53
|
+
}>;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Compute agent-level metrics from registry data
|
|
57
|
+
*/
|
|
58
|
+
export declare function computeAgentMetrics(agents: Array<{
|
|
59
|
+
name: string;
|
|
60
|
+
messagesSent: number;
|
|
61
|
+
messagesReceived: number;
|
|
62
|
+
firstSeen: string;
|
|
63
|
+
lastSeen: string;
|
|
64
|
+
}>): AgentMetrics[];
|
|
65
|
+
/**
|
|
66
|
+
* Compute throughput metrics from message history
|
|
67
|
+
*/
|
|
68
|
+
export declare function computeThroughputMetrics(messages: Array<{
|
|
69
|
+
timestamp: string;
|
|
70
|
+
}>): ThroughputMetrics;
|
|
71
|
+
/**
|
|
72
|
+
* Compute session lifecycle metrics from session history
|
|
73
|
+
*/
|
|
74
|
+
export declare function computeSessionMetrics(sessions: Array<{
|
|
75
|
+
id: string;
|
|
76
|
+
agentName: string;
|
|
77
|
+
startedAt: number;
|
|
78
|
+
endedAt?: number;
|
|
79
|
+
closedBy?: 'agent' | 'disconnect' | 'error';
|
|
80
|
+
messageCount: number;
|
|
81
|
+
}>): SessionMetrics;
|
|
82
|
+
/**
|
|
83
|
+
* Compute full system metrics
|
|
84
|
+
*/
|
|
85
|
+
export declare function computeSystemMetrics(agents: Array<{
|
|
86
|
+
name: string;
|
|
87
|
+
messagesSent: number;
|
|
88
|
+
messagesReceived: number;
|
|
89
|
+
firstSeen: string;
|
|
90
|
+
lastSeen: string;
|
|
91
|
+
}>, messages: Array<{
|
|
92
|
+
timestamp: string;
|
|
93
|
+
}>, sessions?: Array<{
|
|
94
|
+
id: string;
|
|
95
|
+
agentName: string;
|
|
96
|
+
startedAt: number;
|
|
97
|
+
endedAt?: number;
|
|
98
|
+
closedBy?: 'agent' | 'disconnect' | 'error';
|
|
99
|
+
messageCount: number;
|
|
100
|
+
}>): SystemMetrics;
|
|
101
|
+
/**
|
|
102
|
+
* Format metrics in Prometheus exposition format
|
|
103
|
+
*/
|
|
104
|
+
export declare function formatPrometheusMetrics(metrics: SystemMetrics): string;
|
|
105
|
+
//# sourceMappingURL=metrics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/dashboard/metrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Metrics collection and computation for the Agent Relay dashboard.
|
|
3
|
+
* Provides real-time metrics for monitoring: throughput, agent health, error rates.
|
|
4
|
+
*/
|
|
5
|
+
// Consider agents offline after 5 minutes of inactivity
|
|
6
|
+
const OFFLINE_THRESHOLD_MS = 5 * 60 * 1000;
|
|
7
|
+
/**
|
|
8
|
+
* Compute agent-level metrics from registry data
|
|
9
|
+
*/
|
|
10
|
+
export function computeAgentMetrics(agents) {
|
|
11
|
+
const now = Date.now();
|
|
12
|
+
return agents.map((agent) => {
|
|
13
|
+
const lastSeenTime = new Date(agent.lastSeen).getTime();
|
|
14
|
+
const firstSeenTime = new Date(agent.firstSeen).getTime();
|
|
15
|
+
const isOnline = now - lastSeenTime < OFFLINE_THRESHOLD_MS;
|
|
16
|
+
const uptimeSeconds = Math.floor((now - firstSeenTime) / 1000);
|
|
17
|
+
return {
|
|
18
|
+
name: agent.name,
|
|
19
|
+
messagesSent: agent.messagesSent,
|
|
20
|
+
messagesReceived: agent.messagesReceived,
|
|
21
|
+
firstSeen: agent.firstSeen,
|
|
22
|
+
lastSeen: agent.lastSeen,
|
|
23
|
+
isOnline,
|
|
24
|
+
uptimeSeconds,
|
|
25
|
+
};
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Compute throughput metrics from message history
|
|
30
|
+
*/
|
|
31
|
+
export function computeThroughputMetrics(messages) {
|
|
32
|
+
const now = Date.now();
|
|
33
|
+
const oneMinuteAgo = now - 60 * 1000;
|
|
34
|
+
const oneHourAgo = now - 60 * 60 * 1000;
|
|
35
|
+
const oneDayAgo = now - 24 * 60 * 60 * 1000;
|
|
36
|
+
let lastMinute = 0;
|
|
37
|
+
let lastHour = 0;
|
|
38
|
+
let last24Hours = 0;
|
|
39
|
+
for (const msg of messages) {
|
|
40
|
+
const ts = new Date(msg.timestamp).getTime();
|
|
41
|
+
if (ts >= oneMinuteAgo)
|
|
42
|
+
lastMinute++;
|
|
43
|
+
if (ts >= oneHourAgo)
|
|
44
|
+
lastHour++;
|
|
45
|
+
if (ts >= oneDayAgo)
|
|
46
|
+
last24Hours++;
|
|
47
|
+
}
|
|
48
|
+
// Calculate average messages per minute over the last hour
|
|
49
|
+
const avgMessagesPerMinute = lastHour / 60;
|
|
50
|
+
return {
|
|
51
|
+
messagesLastMinute: lastMinute,
|
|
52
|
+
messagesLastHour: lastHour,
|
|
53
|
+
messagesLast24Hours: last24Hours,
|
|
54
|
+
avgMessagesPerMinute: Math.round(avgMessagesPerMinute * 100) / 100,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Compute session lifecycle metrics from session history
|
|
59
|
+
*/
|
|
60
|
+
export function computeSessionMetrics(sessions) {
|
|
61
|
+
let activeSessions = 0;
|
|
62
|
+
let closedByAgent = 0;
|
|
63
|
+
let closedByDisconnect = 0;
|
|
64
|
+
let closedByError = 0;
|
|
65
|
+
for (const session of sessions) {
|
|
66
|
+
if (!session.endedAt) {
|
|
67
|
+
activeSessions++;
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
switch (session.closedBy) {
|
|
71
|
+
case 'agent':
|
|
72
|
+
closedByAgent++;
|
|
73
|
+
break;
|
|
74
|
+
case 'disconnect':
|
|
75
|
+
closedByDisconnect++;
|
|
76
|
+
break;
|
|
77
|
+
case 'error':
|
|
78
|
+
closedByError++;
|
|
79
|
+
break;
|
|
80
|
+
default:
|
|
81
|
+
// Ended but no closedBy - treat as disconnect
|
|
82
|
+
closedByDisconnect++;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
const closedSessions = closedByAgent + closedByDisconnect + closedByError;
|
|
87
|
+
const errorRate = closedSessions > 0 ? (closedByError / closedSessions) * 100 : 0;
|
|
88
|
+
// Format recent sessions for display (most recent 10)
|
|
89
|
+
const recentSessions = sessions
|
|
90
|
+
.slice(0, 10)
|
|
91
|
+
.map((s) => ({
|
|
92
|
+
id: s.id,
|
|
93
|
+
agentName: s.agentName,
|
|
94
|
+
startedAt: new Date(s.startedAt).toISOString(),
|
|
95
|
+
endedAt: s.endedAt ? new Date(s.endedAt).toISOString() : undefined,
|
|
96
|
+
closedBy: s.closedBy,
|
|
97
|
+
messageCount: s.messageCount,
|
|
98
|
+
}));
|
|
99
|
+
return {
|
|
100
|
+
totalSessions: sessions.length,
|
|
101
|
+
activeSessions,
|
|
102
|
+
closedByAgent,
|
|
103
|
+
closedByDisconnect,
|
|
104
|
+
closedByError,
|
|
105
|
+
errorRate: Math.round(errorRate * 100) / 100,
|
|
106
|
+
recentSessions,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Compute full system metrics
|
|
111
|
+
*/
|
|
112
|
+
export function computeSystemMetrics(agents, messages, sessions = []) {
|
|
113
|
+
const agentMetrics = computeAgentMetrics(agents);
|
|
114
|
+
const throughput = computeThroughputMetrics(messages);
|
|
115
|
+
const sessionMetrics = computeSessionMetrics(sessions);
|
|
116
|
+
const onlineAgents = agentMetrics.filter((a) => a.isOnline).length;
|
|
117
|
+
const totalMessages = agents.reduce((sum, a) => sum + a.messagesSent + a.messagesReceived, 0) / 2; // Divide by 2 since each message is counted twice (sent + received)
|
|
118
|
+
return {
|
|
119
|
+
totalAgents: agents.length,
|
|
120
|
+
onlineAgents,
|
|
121
|
+
offlineAgents: agents.length - onlineAgents,
|
|
122
|
+
totalMessages: Math.round(totalMessages),
|
|
123
|
+
throughput,
|
|
124
|
+
sessions: sessionMetrics,
|
|
125
|
+
agents: agentMetrics,
|
|
126
|
+
timestamp: new Date().toISOString(),
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Format metrics in Prometheus exposition format
|
|
131
|
+
*/
|
|
132
|
+
export function formatPrometheusMetrics(metrics) {
|
|
133
|
+
const lines = [];
|
|
134
|
+
// Agent counts
|
|
135
|
+
lines.push('# HELP agent_relay_agents_total Total number of registered agents');
|
|
136
|
+
lines.push('# TYPE agent_relay_agents_total gauge');
|
|
137
|
+
lines.push(`agent_relay_agents_total ${metrics.totalAgents}`);
|
|
138
|
+
lines.push('# HELP agent_relay_agents_online Number of online agents');
|
|
139
|
+
lines.push('# TYPE agent_relay_agents_online gauge');
|
|
140
|
+
lines.push(`agent_relay_agents_online ${metrics.onlineAgents}`);
|
|
141
|
+
// Message throughput
|
|
142
|
+
lines.push('# HELP agent_relay_messages_total Total messages processed');
|
|
143
|
+
lines.push('# TYPE agent_relay_messages_total counter');
|
|
144
|
+
lines.push(`agent_relay_messages_total ${metrics.totalMessages}`);
|
|
145
|
+
lines.push('# HELP agent_relay_messages_last_minute Messages in last minute');
|
|
146
|
+
lines.push('# TYPE agent_relay_messages_last_minute gauge');
|
|
147
|
+
lines.push(`agent_relay_messages_last_minute ${metrics.throughput.messagesLastMinute}`);
|
|
148
|
+
lines.push('# HELP agent_relay_messages_last_hour Messages in last hour');
|
|
149
|
+
lines.push('# TYPE agent_relay_messages_last_hour gauge');
|
|
150
|
+
lines.push(`agent_relay_messages_last_hour ${metrics.throughput.messagesLastHour}`);
|
|
151
|
+
lines.push('# HELP agent_relay_messages_avg_per_minute Average messages per minute');
|
|
152
|
+
lines.push('# TYPE agent_relay_messages_avg_per_minute gauge');
|
|
153
|
+
lines.push(`agent_relay_messages_avg_per_minute ${metrics.throughput.avgMessagesPerMinute}`);
|
|
154
|
+
// Per-agent metrics
|
|
155
|
+
lines.push('# HELP agent_relay_agent_messages_sent Messages sent by agent');
|
|
156
|
+
lines.push('# TYPE agent_relay_agent_messages_sent counter');
|
|
157
|
+
for (const agent of metrics.agents) {
|
|
158
|
+
lines.push(`agent_relay_agent_messages_sent{agent="${agent.name}"} ${agent.messagesSent}`);
|
|
159
|
+
}
|
|
160
|
+
lines.push('# HELP agent_relay_agent_messages_received Messages received by agent');
|
|
161
|
+
lines.push('# TYPE agent_relay_agent_messages_received counter');
|
|
162
|
+
for (const agent of metrics.agents) {
|
|
163
|
+
lines.push(`agent_relay_agent_messages_received{agent="${agent.name}"} ${agent.messagesReceived}`);
|
|
164
|
+
}
|
|
165
|
+
lines.push('# HELP agent_relay_agent_online Agent online status (1=online, 0=offline)');
|
|
166
|
+
lines.push('# TYPE agent_relay_agent_online gauge');
|
|
167
|
+
for (const agent of metrics.agents) {
|
|
168
|
+
lines.push(`agent_relay_agent_online{agent="${agent.name}"} ${agent.isOnline ? 1 : 0}`);
|
|
169
|
+
}
|
|
170
|
+
lines.push('# HELP agent_relay_agent_uptime_seconds Agent uptime in seconds');
|
|
171
|
+
lines.push('# TYPE agent_relay_agent_uptime_seconds gauge');
|
|
172
|
+
for (const agent of metrics.agents) {
|
|
173
|
+
lines.push(`agent_relay_agent_uptime_seconds{agent="${agent.name}"} ${agent.uptimeSeconds}`);
|
|
174
|
+
}
|
|
175
|
+
// Session lifecycle metrics
|
|
176
|
+
lines.push('# HELP agent_relay_sessions_total Total number of sessions');
|
|
177
|
+
lines.push('# TYPE agent_relay_sessions_total counter');
|
|
178
|
+
lines.push(`agent_relay_sessions_total ${metrics.sessions.totalSessions}`);
|
|
179
|
+
lines.push('# HELP agent_relay_sessions_active Number of active sessions');
|
|
180
|
+
lines.push('# TYPE agent_relay_sessions_active gauge');
|
|
181
|
+
lines.push(`agent_relay_sessions_active ${metrics.sessions.activeSessions}`);
|
|
182
|
+
lines.push('# HELP agent_relay_sessions_closed_total Sessions closed by type');
|
|
183
|
+
lines.push('# TYPE agent_relay_sessions_closed_total counter');
|
|
184
|
+
lines.push(`agent_relay_sessions_closed_total{closed_by="agent"} ${metrics.sessions.closedByAgent}`);
|
|
185
|
+
lines.push(`agent_relay_sessions_closed_total{closed_by="disconnect"} ${metrics.sessions.closedByDisconnect}`);
|
|
186
|
+
lines.push(`agent_relay_sessions_closed_total{closed_by="error"} ${metrics.sessions.closedByError}`);
|
|
187
|
+
lines.push('# HELP agent_relay_sessions_error_rate Percentage of sessions closed by error');
|
|
188
|
+
lines.push('# TYPE agent_relay_sessions_error_rate gauge');
|
|
189
|
+
lines.push(`agent_relay_sessions_error_rate ${metrics.sessions.errorRate}`);
|
|
190
|
+
return lines.join('\n') + '\n';
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/dashboard/metrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Derive which agents currently need attention based on message history.
|
|
3
|
+
*
|
|
4
|
+
* Heuristic:
|
|
5
|
+
* - Track the most recent inbound message to an agent for each conversation key.
|
|
6
|
+
* - Conversation key is thread ID if present, otherwise the counterparty agent.
|
|
7
|
+
* - Track the most recent outbound message from the agent for the same key.
|
|
8
|
+
* - An agent needs attention if their latest inbound message for any key is newer
|
|
9
|
+
* than their latest outbound message for that key.
|
|
10
|
+
*/
|
|
11
|
+
export interface AttentionMessage {
|
|
12
|
+
from: string;
|
|
13
|
+
to: string;
|
|
14
|
+
timestamp: string;
|
|
15
|
+
thread?: string;
|
|
16
|
+
/** Whether the message was sent as a broadcast (to: '*') */
|
|
17
|
+
isBroadcast?: boolean;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Compute which agents have pending inbound messages they haven't answered.
|
|
21
|
+
* Only considers messages within the attention window (last 30 minutes).
|
|
22
|
+
*/
|
|
23
|
+
export declare function computeNeedsAttention(messages: AttentionMessage[]): Set<string>;
|
|
24
|
+
//# sourceMappingURL=needs-attention.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"needs-attention.d.ts","sourceRoot":"","sources":["../../src/dashboard/needs-attention.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4DAA4D;IAC5D,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAgBD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CA6D/E"}
|