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.
Files changed (140) hide show
  1. package/README.md +176 -6
  2. package/dist/bridge/config.d.ts +41 -0
  3. package/dist/bridge/config.d.ts.map +1 -0
  4. package/dist/bridge/config.js +143 -0
  5. package/dist/bridge/config.js.map +1 -0
  6. package/dist/bridge/index.d.ts +10 -0
  7. package/dist/bridge/index.d.ts.map +1 -0
  8. package/dist/bridge/index.js +10 -0
  9. package/dist/bridge/index.js.map +1 -0
  10. package/dist/bridge/multi-project-client.d.ts +99 -0
  11. package/dist/bridge/multi-project-client.d.ts.map +1 -0
  12. package/dist/bridge/multi-project-client.js +386 -0
  13. package/dist/bridge/multi-project-client.js.map +1 -0
  14. package/dist/bridge/spawner.d.ts +46 -0
  15. package/dist/bridge/spawner.d.ts.map +1 -0
  16. package/dist/bridge/spawner.js +223 -0
  17. package/dist/bridge/spawner.js.map +1 -0
  18. package/dist/bridge/types.d.ts +55 -0
  19. package/dist/bridge/types.d.ts.map +1 -0
  20. package/dist/bridge/types.js +6 -0
  21. package/dist/bridge/types.js.map +1 -0
  22. package/dist/bridge/utils.d.ts +30 -0
  23. package/dist/bridge/utils.d.ts.map +1 -0
  24. package/dist/bridge/utils.js +54 -0
  25. package/dist/bridge/utils.js.map +1 -0
  26. package/dist/cli/index.d.ts +2 -0
  27. package/dist/cli/index.d.ts.map +1 -1
  28. package/dist/cli/index.js +906 -6
  29. package/dist/cli/index.js.map +1 -1
  30. package/dist/daemon/agent-registry.d.ts +60 -0
  31. package/dist/daemon/agent-registry.d.ts.map +1 -0
  32. package/dist/daemon/agent-registry.js +163 -0
  33. package/dist/daemon/agent-registry.js.map +1 -0
  34. package/dist/daemon/connection.d.ts +33 -1
  35. package/dist/daemon/connection.d.ts.map +1 -1
  36. package/dist/daemon/connection.js +86 -11
  37. package/dist/daemon/connection.js.map +1 -1
  38. package/dist/daemon/index.d.ts +2 -0
  39. package/dist/daemon/index.d.ts.map +1 -1
  40. package/dist/daemon/index.js +2 -0
  41. package/dist/daemon/index.js.map +1 -1
  42. package/dist/daemon/registry.d.ts +9 -0
  43. package/dist/daemon/registry.d.ts.map +1 -0
  44. package/dist/daemon/registry.js +9 -0
  45. package/dist/daemon/registry.js.map +1 -0
  46. package/dist/daemon/router.d.ts +61 -2
  47. package/dist/daemon/router.d.ts.map +1 -1
  48. package/dist/daemon/router.js +219 -4
  49. package/dist/daemon/router.js.map +1 -1
  50. package/dist/daemon/server.d.ts +9 -0
  51. package/dist/daemon/server.d.ts.map +1 -1
  52. package/dist/daemon/server.js +135 -16
  53. package/dist/daemon/server.js.map +1 -1
  54. package/dist/dashboard/metrics.d.ts +105 -0
  55. package/dist/dashboard/metrics.d.ts.map +1 -0
  56. package/dist/dashboard/metrics.js +192 -0
  57. package/dist/dashboard/metrics.js.map +1 -0
  58. package/dist/dashboard/needs-attention.d.ts +24 -0
  59. package/dist/dashboard/needs-attention.d.ts.map +1 -0
  60. package/dist/dashboard/needs-attention.js +78 -0
  61. package/dist/dashboard/needs-attention.js.map +1 -0
  62. package/dist/dashboard/public/bridge.html +1272 -0
  63. package/dist/dashboard/public/index.html +2094 -347
  64. package/dist/dashboard/public/js/app.js +184 -0
  65. package/dist/dashboard/public/js/app.js.map +7 -0
  66. package/dist/dashboard/public/metrics.html +999 -0
  67. package/dist/dashboard/server.d.ts +14 -1
  68. package/dist/dashboard/server.d.ts.map +1 -1
  69. package/dist/dashboard/server.js +689 -16
  70. package/dist/dashboard/server.js.map +1 -1
  71. package/dist/dashboard/start.js +1 -1
  72. package/dist/dashboard/start.js.map +1 -1
  73. package/dist/dashboard-v2/index.d.ts +10 -0
  74. package/dist/dashboard-v2/index.d.ts.map +1 -0
  75. package/dist/dashboard-v2/index.js +54 -0
  76. package/dist/dashboard-v2/index.js.map +1 -0
  77. package/dist/dashboard-v2/lib/api.d.ts +95 -0
  78. package/dist/dashboard-v2/lib/api.d.ts.map +1 -0
  79. package/dist/dashboard-v2/lib/api.js +270 -0
  80. package/dist/dashboard-v2/lib/api.js.map +1 -0
  81. package/dist/dashboard-v2/lib/colors.d.ts +61 -0
  82. package/dist/dashboard-v2/lib/colors.d.ts.map +1 -0
  83. package/dist/dashboard-v2/lib/colors.js +198 -0
  84. package/dist/dashboard-v2/lib/colors.js.map +1 -0
  85. package/dist/dashboard-v2/lib/hierarchy.d.ts +74 -0
  86. package/dist/dashboard-v2/lib/hierarchy.d.ts.map +1 -0
  87. package/dist/dashboard-v2/lib/hierarchy.js +196 -0
  88. package/dist/dashboard-v2/lib/hierarchy.js.map +1 -0
  89. package/dist/dashboard-v2/types/index.d.ts +154 -0
  90. package/dist/dashboard-v2/types/index.d.ts.map +1 -0
  91. package/dist/dashboard-v2/types/index.js +6 -0
  92. package/dist/dashboard-v2/types/index.js.map +1 -0
  93. package/dist/index.d.ts +1 -0
  94. package/dist/index.d.ts.map +1 -1
  95. package/dist/protocol/types.d.ts +15 -1
  96. package/dist/protocol/types.d.ts.map +1 -1
  97. package/dist/storage/adapter.d.ts +74 -1
  98. package/dist/storage/adapter.d.ts.map +1 -1
  99. package/dist/storage/adapter.js +39 -0
  100. package/dist/storage/adapter.js.map +1 -1
  101. package/dist/storage/sqlite-adapter.d.ts +92 -1
  102. package/dist/storage/sqlite-adapter.d.ts.map +1 -1
  103. package/dist/storage/sqlite-adapter.js +615 -47
  104. package/dist/storage/sqlite-adapter.js.map +1 -1
  105. package/dist/utils/agent-config.d.ts +45 -0
  106. package/dist/utils/agent-config.d.ts.map +1 -0
  107. package/dist/utils/agent-config.js +118 -0
  108. package/dist/utils/agent-config.js.map +1 -0
  109. package/dist/utils/project-namespace.d.ts.map +1 -1
  110. package/dist/utils/project-namespace.js +22 -1
  111. package/dist/utils/project-namespace.js.map +1 -1
  112. package/dist/wrapper/client.d.ts +30 -3
  113. package/dist/wrapper/client.d.ts.map +1 -1
  114. package/dist/wrapper/client.js +85 -9
  115. package/dist/wrapper/client.js.map +1 -1
  116. package/dist/wrapper/parser.d.ts +127 -4
  117. package/dist/wrapper/parser.d.ts.map +1 -1
  118. package/dist/wrapper/parser.js +622 -86
  119. package/dist/wrapper/parser.js.map +1 -1
  120. package/dist/wrapper/tmux-wrapper.d.ts +136 -10
  121. package/dist/wrapper/tmux-wrapper.d.ts.map +1 -1
  122. package/dist/wrapper/tmux-wrapper.js +599 -79
  123. package/dist/wrapper/tmux-wrapper.js.map +1 -1
  124. package/docs/AGENTS.md +132 -27
  125. package/docs/ARCHITECTURE_DECISIONS.md +175 -0
  126. package/docs/CHANGELOG.md +1 -1
  127. package/docs/COMPETITIVE_ANALYSIS.md +897 -0
  128. package/docs/DESIGN_BRIDGE_STAFFING.md +878 -0
  129. package/docs/DESIGN_V2.md +1079 -0
  130. package/docs/INTEGRATION-GUIDE.md +926 -0
  131. package/docs/MONETIZATION.md +1679 -0
  132. package/docs/PROPOSAL-trajectories.md +1582 -0
  133. package/docs/PROTOCOL.md +3 -3
  134. package/docs/SCALING_ANALYSIS.md +280 -0
  135. package/docs/TMUX_IMPLEMENTATION_NOTES.md +9 -9
  136. package/docs/TMUX_IMPROVEMENTS.md +968 -0
  137. package/docs/agent-relay-snippet.md +61 -0
  138. package/docs/competitive-analysis-mcp-agent-mail.md +389 -0
  139. package/docs/dashboard-v2-plan.md +179 -0
  140. package/package.json +10 -3
@@ -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.config.teamDir)
51
+ if (!this.registry)
42
52
  return;
43
- const agentsPath = path.join(this.config.teamDir, 'agents.json');
44
- const agents = this.router.getAgents().map(name => {
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
- fs.writeFileSync(agentsPath, JSON.stringify({ agents }, null, 2));
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 connection = new Connection(socket, this.config);
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
- this.writeAgentsFile();
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
- this.writeAgentsFile();
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
- this.writeAgentsFile();
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":"AAAA;;;GAGG;AAIH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,KAAK,CAAC;QACpB,EAAE,EAAE,MAAM,CAAC;QACX,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,OAAO,GAAG,YAAY,GAAG,OAAO,CAAC;QAC5C,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,iBAAiB,CAAC;IAC9B,QAAQ,EAAE,cAAc,CAAC;IACzB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,GAAG,OAAO,GAAG,WAAW,CAAC;IACxC,MAAM,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAClE;AAKD;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,KAAK,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC,GACD,YAAY,EAAE,CAmBhB;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,KAAK,CAAC;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,iBAAiB,CA0BlG;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,KAAK,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,GAAG,YAAY,GAAG,OAAO,CAAC;IAC5C,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC,GACD,cAAc,CAmDhB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,KAAK,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC,EACF,QAAQ,EAAE,KAAK,CAAC;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,EACtC,QAAQ,GAAE,KAAK,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,GAAG,YAAY,GAAG,OAAO,CAAC;IAC5C,YAAY,EAAE,MAAM,CAAC;CACtB,CAAM,GACN,aAAa,CAkBf;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CA0EtE"}
@@ -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"}