agent-relay 1.0.11 → 1.0.13

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 (104) hide show
  1. package/README.md +15 -7
  2. package/dist/bridge/config.d.ts.map +1 -1
  3. package/dist/bridge/multi-project-client.d.ts.map +1 -1
  4. package/dist/bridge/multi-project-client.js +1 -1
  5. package/dist/bridge/multi-project-client.js.map +1 -1
  6. package/dist/bridge/spawner.d.ts +51 -8
  7. package/dist/bridge/spawner.d.ts.map +1 -1
  8. package/dist/bridge/spawner.js +186 -73
  9. package/dist/bridge/spawner.js.map +1 -1
  10. package/dist/bridge/types.d.ts +4 -2
  11. package/dist/bridge/types.d.ts.map +1 -1
  12. package/dist/cli/index.js +162 -297
  13. package/dist/cli/index.js.map +1 -1
  14. package/dist/daemon/router.d.ts.map +1 -1
  15. package/dist/daemon/router.js.map +1 -1
  16. package/dist/dashboard/out/404.html +1 -0
  17. package/dist/dashboard/out/_next/static/VaJQUKoHpKVXkxkyQVNa4/_buildManifest.js +1 -0
  18. package/dist/dashboard/out/_next/static/VaJQUKoHpKVXkxkyQVNa4/_ssgManifest.js +1 -0
  19. package/dist/dashboard/out/_next/static/chunks/117-3bef7b19f3e60751.js +2 -0
  20. package/dist/dashboard/out/_next/static/chunks/648-6cf686106c891ad3.js +1 -0
  21. package/dist/dashboard/out/_next/static/chunks/app/_not-found/page-8ff6572bc7c9bc61.js +1 -0
  22. package/dist/dashboard/out/_next/static/chunks/app/layout-c9d8c5d95e48c6bf.js +1 -0
  23. package/dist/dashboard/out/_next/static/chunks/app/metrics/page-8aa9936bc6c771ab.js +1 -0
  24. package/dist/dashboard/out/_next/static/chunks/app/page-967d136fefe19b95.js +1 -0
  25. package/dist/dashboard/out/_next/static/chunks/fd9d1056-26bd8d656b496dba.js +1 -0
  26. package/dist/dashboard/out/_next/static/chunks/framework-f66176bb897dc684.js +1 -0
  27. package/dist/dashboard/out/_next/static/chunks/main-app-bae2e535de00de50.js +1 -0
  28. package/dist/dashboard/out/_next/static/chunks/main-e0a1f53fe0617a63.js +1 -0
  29. package/dist/dashboard/out/_next/static/chunks/pages/_app-72b849fbd24ac258.js +1 -0
  30. package/dist/dashboard/out/_next/static/chunks/pages/_error-7ba65e1336b92748.js +1 -0
  31. package/dist/dashboard/out/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
  32. package/dist/dashboard/out/_next/static/chunks/webpack-c81f7fd28659d64f.js +1 -0
  33. package/dist/dashboard/out/_next/static/css/34bb8e70353694d8.css +1 -0
  34. package/dist/dashboard/out/index.html +1 -0
  35. package/dist/dashboard/out/index.txt +7 -0
  36. package/dist/dashboard/out/metrics.html +515 -0
  37. package/dist/dashboard/out/metrics.txt +7 -0
  38. package/dist/dashboard-server/metrics.d.ts.map +1 -0
  39. package/dist/dashboard-server/metrics.js.map +1 -0
  40. package/dist/dashboard-server/needs-attention.d.ts.map +1 -0
  41. package/dist/dashboard-server/needs-attention.js.map +1 -0
  42. package/dist/dashboard-server/server.d.ts.map +1 -0
  43. package/dist/{dashboard → dashboard-server}/server.js +24 -40
  44. package/dist/dashboard-server/server.js.map +1 -0
  45. package/dist/dashboard-server/start.d.ts.map +1 -0
  46. package/dist/dashboard-server/start.js.map +1 -0
  47. package/dist/utils/update-checker.d.ts +26 -0
  48. package/dist/utils/update-checker.d.ts.map +1 -0
  49. package/dist/utils/update-checker.js +174 -0
  50. package/dist/utils/update-checker.js.map +1 -0
  51. package/dist/wrapper/pty-wrapper.d.ts +140 -0
  52. package/dist/wrapper/pty-wrapper.d.ts.map +1 -0
  53. package/dist/wrapper/pty-wrapper.js +508 -0
  54. package/dist/wrapper/pty-wrapper.js.map +1 -0
  55. package/dist/wrapper/tmux-wrapper.d.ts +1 -1
  56. package/dist/wrapper/tmux-wrapper.d.ts.map +1 -1
  57. package/dist/wrapper/tmux-wrapper.js +1 -1
  58. package/dist/wrapper/tmux-wrapper.js.map +1 -1
  59. package/docs/AGENTS.md +43 -30
  60. package/docs/INTEGRATION-GUIDE.md +1 -1
  61. package/docs/PROTOCOL.md +16 -10
  62. package/docs/agent-relay-snippet.md +21 -17
  63. package/package.json +7 -5
  64. package/scripts/postinstall.js +30 -1
  65. package/dist/dashboard/metrics.d.ts.map +0 -1
  66. package/dist/dashboard/metrics.js.map +0 -1
  67. package/dist/dashboard/needs-attention.d.ts.map +0 -1
  68. package/dist/dashboard/needs-attention.js.map +0 -1
  69. package/dist/dashboard/public/bridge.html +0 -1272
  70. package/dist/dashboard/public/index.html +0 -2262
  71. package/dist/dashboard/public/js/app.js +0 -184
  72. package/dist/dashboard/public/js/app.js.map +0 -7
  73. package/dist/dashboard/public/metrics.html +0 -999
  74. package/dist/dashboard/server.d.ts.map +0 -1
  75. package/dist/dashboard/server.js.map +0 -1
  76. package/dist/dashboard/start.d.ts.map +0 -1
  77. package/dist/dashboard/start.js.map +0 -1
  78. package/dist/dashboard-v2/index.d.ts +0 -10
  79. package/dist/dashboard-v2/index.d.ts.map +0 -1
  80. package/dist/dashboard-v2/index.js +0 -54
  81. package/dist/dashboard-v2/index.js.map +0 -1
  82. package/dist/dashboard-v2/lib/api.d.ts +0 -95
  83. package/dist/dashboard-v2/lib/api.d.ts.map +0 -1
  84. package/dist/dashboard-v2/lib/api.js +0 -270
  85. package/dist/dashboard-v2/lib/api.js.map +0 -1
  86. package/dist/dashboard-v2/lib/colors.d.ts +0 -61
  87. package/dist/dashboard-v2/lib/colors.d.ts.map +0 -1
  88. package/dist/dashboard-v2/lib/colors.js +0 -198
  89. package/dist/dashboard-v2/lib/colors.js.map +0 -1
  90. package/dist/dashboard-v2/lib/hierarchy.d.ts +0 -74
  91. package/dist/dashboard-v2/lib/hierarchy.d.ts.map +0 -1
  92. package/dist/dashboard-v2/lib/hierarchy.js +0 -196
  93. package/dist/dashboard-v2/lib/hierarchy.js.map +0 -1
  94. package/dist/dashboard-v2/types/index.d.ts +0 -154
  95. package/dist/dashboard-v2/types/index.d.ts.map +0 -1
  96. package/dist/dashboard-v2/types/index.js +0 -6
  97. package/dist/dashboard-v2/types/index.js.map +0 -1
  98. /package/dist/{dashboard → dashboard-server}/metrics.d.ts +0 -0
  99. /package/dist/{dashboard → dashboard-server}/metrics.js +0 -0
  100. /package/dist/{dashboard → dashboard-server}/needs-attention.d.ts +0 -0
  101. /package/dist/{dashboard → dashboard-server}/needs-attention.js +0 -0
  102. /package/dist/{dashboard → dashboard-server}/server.d.ts +0 -0
  103. /package/dist/{dashboard → dashboard-server}/start.d.ts +0 -0
  104. /package/dist/{dashboard → dashboard-server}/start.js +0 -0
@@ -0,0 +1,515 @@
1
+ <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/css/34bb8e70353694d8.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-c81f7fd28659d64f.js"/><script src="/_next/static/chunks/fd9d1056-26bd8d656b496dba.js" async=""></script><script src="/_next/static/chunks/117-3bef7b19f3e60751.js" async=""></script><script src="/_next/static/chunks/main-app-bae2e535de00de50.js" async=""></script><script src="/_next/static/chunks/648-6cf686106c891ad3.js" async=""></script><script src="/_next/static/chunks/app/metrics/page-8aa9936bc6c771ab.js" async=""></script><title>Agent Relay Dashboard</title><meta name="description" content="Fleet control dashboard for Agent Relay"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div class="metrics-page"><style>
2
+ .metrics-page {
3
+ min-height: 100vh;
4
+ background: #1a1d21;
5
+ color: #e8e8e8;
6
+ font-family: -apple-system, BlinkMacSystemFont, &#x27;Segoe UI&#x27;, Roboto, sans-serif;
7
+ }
8
+
9
+ .header {
10
+ position: sticky;
11
+ top: 0;
12
+ z-index: 100;
13
+ background: #1a1a2e;
14
+ border-bottom: 1px solid #2a2a3e;
15
+ padding: 16px 32px;
16
+ }
17
+
18
+ .header-content {
19
+ max-width: 1400px;
20
+ margin: 0 auto;
21
+ display: flex;
22
+ align-items: center;
23
+ justify-content: space-between;
24
+ }
25
+
26
+ .header-left {
27
+ display: flex;
28
+ align-items: center;
29
+ gap: 16px;
30
+ }
31
+
32
+ .back-link {
33
+ display: flex;
34
+ align-items: center;
35
+ gap: 8px;
36
+ color: #888;
37
+ text-decoration: none;
38
+ font-size: 14px;
39
+ font-weight: 500;
40
+ padding: 8px 12px;
41
+ border-radius: 6px;
42
+ transition: all 0.2s;
43
+ }
44
+
45
+ .back-link:hover {
46
+ color: #4a9eff;
47
+ background: rgba(74, 158, 255, 0.1);
48
+ }
49
+
50
+ .logo {
51
+ display: flex;
52
+ align-items: center;
53
+ gap: 12px;
54
+ }
55
+
56
+ .logo-icon {
57
+ width: 32px;
58
+ height: 32px;
59
+ background: linear-gradient(135deg, #1e3a5f 0%, #2a4a6e 100%);
60
+ border: 1px solid #3a5a7e;
61
+ border-radius: 8px;
62
+ display: flex;
63
+ align-items: center;
64
+ justify-content: center;
65
+ }
66
+
67
+ .logo-text {
68
+ font-size: 18px;
69
+ font-weight: 600;
70
+ letter-spacing: -0.3px;
71
+ }
72
+
73
+ .logo-text span {
74
+ color: #4a9eff;
75
+ }
76
+
77
+ .live-indicator {
78
+ display: flex;
79
+ align-items: center;
80
+ gap: 8px;
81
+ padding: 6px 12px;
82
+ background: rgba(34, 197, 94, 0.1);
83
+ border: 1px solid rgba(34, 197, 94, 0.3);
84
+ border-radius: 20px;
85
+ font-family: &#x27;IBM Plex Mono&#x27;, monospace;
86
+ font-size: 12px;
87
+ font-weight: 500;
88
+ color: #22c55e;
89
+ }
90
+
91
+ .live-dot {
92
+ width: 8px;
93
+ height: 8px;
94
+ background: #22c55e;
95
+ border-radius: 50%;
96
+ animation: pulse 2s ease-in-out infinite;
97
+ box-shadow: 0 0 10px rgba(34, 197, 94, 0.4);
98
+ }
99
+
100
+ @keyframes pulse {
101
+ 0%, 100% { opacity: 1; transform: scale(1); }
102
+ 50% { opacity: 0.5; transform: scale(0.9); }
103
+ }
104
+
105
+ .main {
106
+ position: relative;
107
+ z-index: 1;
108
+ max-width: 1400px;
109
+ margin: 0 auto;
110
+ padding: 24px 32px 48px;
111
+ }
112
+
113
+ .loading, .error-state {
114
+ display: flex;
115
+ flex-direction: column;
116
+ align-items: center;
117
+ justify-content: center;
118
+ height: 100vh;
119
+ gap: 16px;
120
+ }
121
+
122
+ .spinner {
123
+ width: 32px;
124
+ height: 32px;
125
+ border: 2px solid rgba(255, 255, 255, 0.1);
126
+ border-top-color: #4a9eff;
127
+ border-radius: 50%;
128
+ animation: spin 1s linear infinite;
129
+ }
130
+
131
+ @keyframes spin {
132
+ to { transform: rotate(360deg); }
133
+ }
134
+
135
+ .error-state button {
136
+ padding: 10px 20px;
137
+ background: #1264a3;
138
+ color: white;
139
+ border: none;
140
+ border-radius: 6px;
141
+ cursor: pointer;
142
+ }
143
+
144
+ .stats-grid {
145
+ display: grid;
146
+ grid-template-columns: repeat(4, 1fr);
147
+ gap: 16px;
148
+ margin-bottom: 24px;
149
+ }
150
+
151
+ .stat-card {
152
+ background: #222529;
153
+ border: 1px solid #2a2a3e;
154
+ border-radius: 8px;
155
+ padding: 20px;
156
+ transition: all 0.2s ease;
157
+ }
158
+
159
+ .stat-card:hover {
160
+ border-color: #3a3a4e;
161
+ background: #282c30;
162
+ }
163
+
164
+ .stat-label {
165
+ font-size: 11px;
166
+ font-weight: 600;
167
+ text-transform: uppercase;
168
+ letter-spacing: 0.5px;
169
+ color: #888;
170
+ margin-bottom: 8px;
171
+ }
172
+
173
+ .stat-value {
174
+ font-family: &#x27;IBM Plex Mono&#x27;, monospace;
175
+ font-size: 32px;
176
+ font-weight: 700;
177
+ line-height: 1;
178
+ }
179
+
180
+ .stat-value.accent-cyan { color: #4a9eff; }
181
+ .stat-value.accent-green { color: #22c55e; }
182
+ .stat-value.accent-orange { color: #f59e0b; }
183
+ .stat-value.accent-blue { color: #6366f1; }
184
+
185
+ .stat-subtext {
186
+ font-size: 12px;
187
+ color: #666;
188
+ margin-top: 8px;
189
+ font-family: &#x27;IBM Plex Mono&#x27;, monospace;
190
+ }
191
+
192
+ .section {
193
+ margin-bottom: 24px;
194
+ }
195
+
196
+ .section-header {
197
+ display: flex;
198
+ align-items: center;
199
+ justify-content: space-between;
200
+ margin-bottom: 12px;
201
+ }
202
+
203
+ .section-title {
204
+ font-size: 13px;
205
+ font-weight: 600;
206
+ text-transform: uppercase;
207
+ letter-spacing: 1px;
208
+ color: #888;
209
+ display: flex;
210
+ align-items: center;
211
+ gap: 10px;
212
+ }
213
+
214
+ .section-title::before {
215
+ content: &#x27;&#x27;;
216
+ width: 3px;
217
+ height: 14px;
218
+ background: #4a9eff;
219
+ border-radius: 2px;
220
+ }
221
+
222
+ .throughput-panel, .lifecycle-panel {
223
+ background: #222529;
224
+ border: 1px solid #2a2a3e;
225
+ border-radius: 8px;
226
+ padding: 24px;
227
+ }
228
+
229
+ .throughput-grid {
230
+ display: grid;
231
+ grid-template-columns: repeat(4, 1fr);
232
+ gap: 24px;
233
+ }
234
+
235
+ .throughput-item {
236
+ text-align: center;
237
+ }
238
+
239
+ .throughput-value {
240
+ font-family: &#x27;IBM Plex Mono&#x27;, monospace;
241
+ font-size: 40px;
242
+ font-weight: 700;
243
+ color: #4a9eff;
244
+ line-height: 1;
245
+ }
246
+
247
+ .throughput-label {
248
+ font-size: 12px;
249
+ color: #888;
250
+ margin-top: 8px;
251
+ text-transform: uppercase;
252
+ letter-spacing: 0.5px;
253
+ }
254
+
255
+ .throughput-bar {
256
+ height: 4px;
257
+ background: #2a2a3e;
258
+ border-radius: 2px;
259
+ margin-top: 12px;
260
+ overflow: hidden;
261
+ }
262
+
263
+ .throughput-bar-fill {
264
+ height: 100%;
265
+ background: linear-gradient(90deg, #4a9eff, #6366f1);
266
+ border-radius: 2px;
267
+ transition: width 0.5s ease;
268
+ }
269
+
270
+ .lifecycle-grid {
271
+ display: grid;
272
+ grid-template-columns: repeat(5, 1fr);
273
+ gap: 20px;
274
+ }
275
+
276
+ .lifecycle-item {
277
+ text-align: center;
278
+ }
279
+
280
+ .lifecycle-value {
281
+ font-family: &#x27;IBM Plex Mono&#x27;, monospace;
282
+ font-size: 32px;
283
+ font-weight: 700;
284
+ line-height: 1;
285
+ }
286
+
287
+ .lifecycle-value.accent-purple { color: #a78bfa; }
288
+ .lifecycle-value.accent-red { color: #ef4444; }
289
+
290
+ .lifecycle-label {
291
+ font-size: 11px;
292
+ color: #888;
293
+ margin-top: 8px;
294
+ text-transform: uppercase;
295
+ letter-spacing: 0.5px;
296
+ }
297
+
298
+ .error-rate-indicator {
299
+ display: inline-flex;
300
+ align-items: center;
301
+ gap: 6px;
302
+ padding: 4px 10px;
303
+ border-radius: 12px;
304
+ font-size: 12px;
305
+ font-weight: 600;
306
+ font-family: &#x27;IBM Plex Mono&#x27;, monospace;
307
+ }
308
+
309
+ .error-rate-indicator.healthy {
310
+ background: rgba(34, 197, 94, 0.15);
311
+ color: #22c55e;
312
+ }
313
+
314
+ .error-rate-indicator.warning {
315
+ background: rgba(245, 158, 11, 0.15);
316
+ color: #f59e0b;
317
+ }
318
+
319
+ .error-rate-indicator.critical {
320
+ background: rgba(239, 68, 68, 0.15);
321
+ color: #ef4444;
322
+ }
323
+
324
+ .sessions-table, .agents-table {
325
+ width: 100%;
326
+ border-collapse: collapse;
327
+ margin-top: 16px;
328
+ }
329
+
330
+ .sessions-table th, .sessions-table td,
331
+ .agents-table th, .agents-table td {
332
+ padding: 12px 16px;
333
+ text-align: left;
334
+ }
335
+
336
+ .sessions-table th, .agents-table th {
337
+ background: #1a1a2e;
338
+ font-size: 11px;
339
+ font-weight: 600;
340
+ text-transform: uppercase;
341
+ letter-spacing: 0.5px;
342
+ color: #888;
343
+ border-bottom: 1px solid #2a2a3e;
344
+ }
345
+
346
+ .sessions-table tr, .agents-table tr {
347
+ border-bottom: 1px solid #2a2a3e;
348
+ }
349
+
350
+ .sessions-table tr:last-child, .agents-table tr:last-child {
351
+ border-bottom: none;
352
+ }
353
+
354
+ .agents-table tr:hover {
355
+ background: rgba(74, 158, 255, 0.03);
356
+ }
357
+
358
+ .agents-table-container {
359
+ background: #222529;
360
+ border: 1px solid #2a2a3e;
361
+ border-radius: 8px;
362
+ overflow: hidden;
363
+ }
364
+
365
+ .agent-name {
366
+ display: flex;
367
+ align-items: center;
368
+ gap: 12px;
369
+ }
370
+
371
+ .agent-avatar {
372
+ width: 32px;
373
+ height: 32px;
374
+ border-radius: 6px;
375
+ display: flex;
376
+ align-items: center;
377
+ justify-content: center;
378
+ font-weight: 600;
379
+ font-size: 12px;
380
+ color: white;
381
+ }
382
+
383
+ .agent-name-text {
384
+ font-weight: 600;
385
+ font-family: &#x27;IBM Plex Mono&#x27;, monospace;
386
+ }
387
+
388
+ .status-badge {
389
+ display: inline-flex;
390
+ align-items: center;
391
+ gap: 6px;
392
+ padding: 4px 10px;
393
+ border-radius: 12px;
394
+ font-size: 12px;
395
+ font-weight: 500;
396
+ }
397
+
398
+ .status-badge.online {
399
+ background: rgba(34, 197, 94, 0.15);
400
+ color: #22c55e;
401
+ }
402
+
403
+ .status-badge.offline {
404
+ background: rgba(107, 114, 128, 0.15);
405
+ color: #6b7280;
406
+ }
407
+
408
+ .status-badge::before {
409
+ content: &#x27;&#x27;;
410
+ width: 6px;
411
+ height: 6px;
412
+ border-radius: 50%;
413
+ background: currentColor;
414
+ }
415
+
416
+ .closed-badge {
417
+ display: inline-flex;
418
+ align-items: center;
419
+ gap: 4px;
420
+ padding: 2px 8px;
421
+ border-radius: 10px;
422
+ font-size: 11px;
423
+ font-weight: 500;
424
+ }
425
+
426
+ .closed-badge.agent {
427
+ background: rgba(34, 197, 94, 0.15);
428
+ color: #22c55e;
429
+ }
430
+
431
+ .closed-badge.disconnect {
432
+ background: rgba(245, 158, 11, 0.15);
433
+ color: #f59e0b;
434
+ }
435
+
436
+ .closed-badge.error {
437
+ background: rgba(239, 68, 68, 0.15);
438
+ color: #ef4444;
439
+ }
440
+
441
+ .closed-badge.active {
442
+ background: rgba(74, 158, 255, 0.15);
443
+ color: #4a9eff;
444
+ }
445
+
446
+ .metric-cell {
447
+ font-family: &#x27;IBM Plex Mono&#x27;, monospace;
448
+ font-size: 14px;
449
+ }
450
+
451
+ .metric-cell.sent { color: #4a9eff; }
452
+ .metric-cell.received { color: #a78bfa; }
453
+
454
+ .uptime-cell {
455
+ font-family: &#x27;IBM Plex Mono&#x27;, monospace;
456
+ font-size: 13px;
457
+ color: #888;
458
+ }
459
+
460
+ .empty-state {
461
+ padding: 48px 32px;
462
+ text-align: center;
463
+ }
464
+
465
+ .empty-state-icon {
466
+ width: 48px;
467
+ height: 48px;
468
+ margin: 0 auto 16px;
469
+ color: #666;
470
+ opacity: 0.5;
471
+ }
472
+
473
+ .empty-state-text {
474
+ color: #666;
475
+ font-size: 14px;
476
+ }
477
+
478
+ .last-updated {
479
+ text-align: center;
480
+ padding: 20px;
481
+ font-size: 12px;
482
+ color: #666;
483
+ font-family: &#x27;IBM Plex Mono&#x27;, monospace;
484
+ }
485
+
486
+ @media (max-width: 1200px) {
487
+ .stats-grid {
488
+ grid-template-columns: repeat(2, 1fr);
489
+ }
490
+ .throughput-grid {
491
+ grid-template-columns: repeat(2, 1fr);
492
+ }
493
+ .lifecycle-grid {
494
+ grid-template-columns: repeat(3, 1fr);
495
+ }
496
+ }
497
+
498
+ @media (max-width: 768px) {
499
+ .header {
500
+ padding: 12px 16px;
501
+ }
502
+ .main {
503
+ padding: 16px;
504
+ }
505
+ .stats-grid {
506
+ grid-template-columns: 1fr;
507
+ }
508
+ .throughput-grid {
509
+ grid-template-columns: 1fr;
510
+ }
511
+ .lifecycle-grid {
512
+ grid-template-columns: repeat(2, 1fr);
513
+ }
514
+ }
515
+ </style><div class="loading"><div class="spinner"></div><p>Loading metrics...</p></div></div><script src="/_next/static/chunks/webpack-c81f7fd28659d64f.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0]);self.__next_f.push([2,null])</script><script>self.__next_f.push([1,"1:HL[\"/_next/static/css/34bb8e70353694d8.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"2:I[2846,[],\"\"]\n4:I[9107,[],\"ClientPageRoot\"]\n5:I[5804,[\"648\",\"static/chunks/648-6cf686106c891ad3.js\",\"860\",\"static/chunks/app/metrics/page-8aa9936bc6c771ab.js\"],\"default\",1]\n6:I[4707,[],\"\"]\n7:I[6423,[],\"\"]\n9:I[1060,[],\"\"]\na:[]\n"])</script><script>self.__next_f.push([1,"0:[\"$\",\"$L2\",null,{\"buildId\":\"VaJQUKoHpKVXkxkyQVNa4\",\"assetPrefix\":\"\",\"urlParts\":[\"\",\"metrics\"],\"initialTree\":[\"\",{\"children\":[\"metrics\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],\"initialSeedData\":[\"\",{\"children\":[\"metrics\",{\"children\":[\"__PAGE__\",{},[[\"$L3\",[\"$\",\"$L4\",null,{\"props\":{\"params\":{},\"searchParams\":{}},\"Component\":\"$5\"}],null],null],null]},[null,[\"$\",\"$L6\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"metrics\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L7\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\"}]],null]},[[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/34bb8e70353694d8.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[\"$\",\"body\",null,{\"children\":[\"$\",\"$L6\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L7\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],\"notFoundStyles\":[]}]}]}]],null],null],\"couldBeIntercepted\":false,\"initialHead\":[null,\"$L8\"],\"globalErrorComponent\":\"$9\",\"missingSlots\":\"$Wa\"}]\n"])</script><script>self.__next_f.push([1,"8:[[\"$\",\"meta\",\"0\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"1\",{\"charSet\":\"utf-8\"}],[\"$\",\"title\",\"2\",{\"children\":\"Agent Relay Dashboard\"}],[\"$\",\"meta\",\"3\",{\"name\":\"description\",\"content\":\"Fleet control dashboard for Agent Relay\"}]]\n3:null\n"])</script></body></html>
@@ -0,0 +1,7 @@
1
+ 2:I[9107,[],"ClientPageRoot"]
2
+ 3:I[5804,["648","static/chunks/648-6cf686106c891ad3.js","860","static/chunks/app/metrics/page-8aa9936bc6c771ab.js"],"default",1]
3
+ 4:I[4707,[],""]
4
+ 5:I[6423,[],""]
5
+ 0:["VaJQUKoHpKVXkxkyQVNa4",[[["",{"children":["metrics",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],["",{"children":["metrics",{"children":["__PAGE__",{},[["$L1",["$","$L2",null,{"props":{"params":{},"searchParams":{}},"Component":"$3"}],null],null],null]},[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","metrics","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","notFoundStyles":"$undefined"}]],null]},[[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/34bb8e70353694d8.css","precedence":"next","crossOrigin":"$undefined"}]],["$","html",null,{"lang":"en","children":["$","body",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[]}]}]}]],null],null],["$L6",null]]]]
6
+ 6:[["$","meta","0",{"name":"viewport","content":"width=device-width, initial-scale=1"}],["$","meta","1",{"charSet":"utf-8"}],["$","title","2",{"children":"Agent Relay Dashboard"}],["$","meta","3",{"name":"description","content":"Fleet control dashboard for Agent Relay"}]]
7
+ 1:null
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/dashboard-server/metrics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/dashboard-server/metrics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"needs-attention.d.ts","sourceRoot":"","sources":["../../src/dashboard-server/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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"needs-attention.js","sourceRoot":"","sources":["../../src/dashboard-server/needs-attention.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAaH,wEAAwE;AACxE,MAAM,mBAAmB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAE3C,SAAS,YAAY,CAAC,GAA8B,EAAE,KAAa,EAAE,GAAW,EAAE,EAAU;IAC1F,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,GAAG,EAAkB,CAAC;IAC7D,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC;IAC5C,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC;QACd,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACtB,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAA4B;IAChE,MAAM,aAAa,GAA8B,IAAI,GAAG,EAAE,CAAC,CAAE,uBAAuB;IACpF,MAAM,cAAc,GAA8B,IAAI,GAAG,EAAE,CAAC,CAAC,uBAAuB;IACpF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,UAAU,GAAG,GAAG,GAAG,mBAAmB,CAAC;IAE7C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACzC,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAAE,SAAS;QAE/B,oEAAoE;QACpE,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,EAAE,KAAK,GAAG,CAAC;QAE9D,qEAAqE;QACrE,kFAAkF;QAClF,yEAAyE;QACzE,IAAI,OAAO,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;YAC/B,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,UAAU,OAAO,CAAC,IAAI,EAAE,CAAC;YAC1F,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,EAAE,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;QAC1D,CAAC;QAED,mEAAmE;QACnE,oEAAoE;QACpE,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM;gBAChC,CAAC,CAAC,UAAU,OAAO,CAAC,MAAM,EAAE;gBAC5B,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC;oBAC5B,CAAC,CAAC,UAAU,OAAO,CAAC,EAAE,EAAE;oBACxB,CAAC,CAAC,IAAI,CAAC;YAEX,IAAI,WAAW,EAAE,CAAC;gBAChB,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;YAC9D,CAAC;YAED,8DAA8D;YAC9D,2DAA2D;YAC3D,IAAI,WAAW,EAAE,CAAC;gBAChB,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,IAAI,EAAE,eAAe,EAAE,EAAE,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IAEzC,aAAa,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;QACtC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,GAAG,EAAE,EAAE;YAChC,gEAAgE;YAChE,IAAI,SAAS,GAAG,UAAU;gBAAE,OAAO;YAEnC,MAAM,UAAU,GAAG,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC;YACpE,iEAAiE;YACjE,MAAM,WAAW,GAAG,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC;YACjF,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;YAEtD,IAAI,SAAS,GAAG,WAAW,EAAE,CAAC;gBAC5B,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,cAAc,CAAC;AACxB,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/dashboard-server/server.ts"],"names":[],"mappings":"AAqEA,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gCAAgC;IAChC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,qDAAqD;IACrD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oCAAoC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;AACvH,wBAAsB,cAAc,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC"}
@@ -20,23 +20,6 @@ export async function startDashboard(portOrOptions, dataDirArg, teamDirArg, dbPa
20
20
  : portOrOptions;
21
21
  const { port, dataDir, teamDir, dbPath, enableSpawner, projectRoot, tmuxSession } = options;
22
22
  console.log('Starting dashboard...');
23
- console.log('__dirname:', __dirname);
24
- const publicDir = path.join(__dirname, 'public');
25
- console.log('Public dir:', publicDir);
26
- // Verify public directory exists and contains expected files
27
- if (!fs.existsSync(publicDir)) {
28
- console.error(`[dashboard] ERROR: Public directory not found: ${publicDir}`);
29
- }
30
- else {
31
- const files = fs.readdirSync(publicDir);
32
- console.log('Public dir contents:', files.join(', '));
33
- if (!files.includes('metrics.html')) {
34
- console.error('[dashboard] WARNING: metrics.html not found in public directory');
35
- }
36
- if (!files.includes('bridge.html')) {
37
- console.error('[dashboard] WARNING: bridge.html not found in public directory');
38
- }
39
- }
40
23
  const storage = dbPath
41
24
  ? new SqliteStorageAdapter({ dbPath })
42
25
  : undefined;
@@ -96,9 +79,26 @@ export async function startDashboard(portOrOptions, dataDirArg, teamDirArg, dbPa
96
79
  if (storage) {
97
80
  await storage.init();
98
81
  }
99
- // Serve static files from public directory
100
- app.use(express.static(publicDir));
101
82
  app.use(express.json());
83
+ // Serve dashboard static files at root (built with `next build` in src/dashboard)
84
+ // __dirname is dist/dashboard-server, dashboard is at ../dashboard/out (relative to dist)
85
+ // But in source it's at ../dashboard/out (relative to src/dashboard-server)
86
+ const dashboardDistDir = path.join(__dirname, '..', 'dashboard', 'out');
87
+ const dashboardSourceDir = path.join(__dirname, '..', '..', 'src', 'dashboard', 'out');
88
+ // Check which path exists (dist or src)
89
+ const dashboardDir = fs.existsSync(dashboardDistDir) ? dashboardDistDir : dashboardSourceDir;
90
+ if (fs.existsSync(dashboardDir)) {
91
+ console.log(`[dashboard] Serving from: ${dashboardDir}`);
92
+ // Serve Next.js static export with .html extension handling
93
+ app.use(express.static(dashboardDir, { extensions: ['html'] }));
94
+ // Fallback for Next.js pages (e.g., /metrics -> /metrics.html)
95
+ app.get('/metrics', (req, res) => {
96
+ res.sendFile(path.join(dashboardDir, 'metrics.html'));
97
+ });
98
+ }
99
+ else {
100
+ console.error('[dashboard] Dashboard not found at:', dashboardDistDir, 'or', dashboardSourceDir);
101
+ }
102
102
  // Relay client for sending messages from dashboard
103
103
  const socketPath = path.join(dataDir, 'relay.sock');
104
104
  let relayClient;
@@ -456,7 +456,7 @@ export async function startDashboard(portOrOptions, dataDirArg, teamDirArg, dbPa
456
456
  }
457
457
  }
458
458
  }
459
- catch (err) {
459
+ catch (_err) {
460
460
  // Ignore errors reading processing state - it's optional
461
461
  }
462
462
  }
@@ -736,26 +736,6 @@ export async function startDashboard(portOrOptions, dataDirArg, teamDirArg, dbPa
736
736
  res.status(500).send('# Error computing metrics\n');
737
737
  }
738
738
  });
739
- // Metrics view route - serves metrics.html
740
- app.get('/metrics', (req, res) => {
741
- const filePath = path.join(publicDir, 'metrics.html');
742
- res.sendFile(filePath, (err) => {
743
- if (err) {
744
- console.error(`[dashboard] Failed to serve metrics.html from ${filePath}:`, err.message);
745
- res.status(404).send('Metrics page not found');
746
- }
747
- });
748
- });
749
- // Bridge view route - serves bridge.html
750
- app.get('/bridge', (req, res) => {
751
- const filePath = path.join(publicDir, 'bridge.html');
752
- res.sendFile(filePath, (err) => {
753
- if (err) {
754
- console.error(`[dashboard] Failed to serve bridge.html from ${filePath}:`, err.message);
755
- res.status(404).send('Bridge page not found');
756
- }
757
- });
758
- });
759
739
  // Bridge API endpoint - returns multi-project data
760
740
  // This is a placeholder that returns empty data when not in bridge mode
761
741
  // The actual bridge data comes from MultiProjectClient when running `agent-relay bridge`
@@ -941,6 +921,10 @@ export async function startDashboard(portOrOptions, dataDirArg, teamDirArg, dbPa
941
921
  server.listen(availablePort, () => {
942
922
  console.log(`Dashboard running at http://localhost:${availablePort}`);
943
923
  console.log(`Monitoring: ${dataDir}`);
924
+ // Set the dashboard port on spawner so spawned agents can use the API for nested spawns
925
+ if (spawner) {
926
+ spawner.setDashboardPort(availablePort);
927
+ }
944
928
  resolve(availablePort);
945
929
  });
946
930
  server.on('error', (err) => {