agent-enderun 1.11.2 → 1.11.4

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 (126) hide show
  1. package/README.md +5 -5
  2. package/bin/validate-agent-army.js +0 -1
  3. package/dist/framework-mcp/src/index.js +11 -1
  4. package/dist/framework-mcp/src/index.js.map +1 -1
  5. package/dist/framework-mcp/src/tools/definitions.js +0 -10
  6. package/dist/framework-mcp/src/tools/definitions.js.map +1 -1
  7. package/dist/framework-mcp/src/tools/index.js +0 -2
  8. package/dist/framework-mcp/src/tools/index.js.map +1 -1
  9. package/dist/framework-mcp/src/utils/compliance.d.ts +1 -1
  10. package/dist/framework-mcp/src/utils/compliance.js +68 -19
  11. package/dist/framework-mcp/src/utils/compliance.js.map +1 -1
  12. package/dist/src/cli/adapters/scaffold.d.ts +1 -1
  13. package/dist/src/cli/adapters/scaffold.js +8 -8
  14. package/dist/src/cli/adapters/scaffold.js.map +1 -1
  15. package/dist/src/cli/commands/check.js +25 -40
  16. package/dist/src/cli/commands/check.js.map +1 -1
  17. package/dist/src/cli/commands/contract.d.ts +3 -1
  18. package/dist/src/cli/commands/contract.js +8 -2
  19. package/dist/src/cli/commands/contract.js.map +1 -1
  20. package/dist/src/cli/commands/init/scaffold-ops.js +0 -2
  21. package/dist/src/cli/commands/init/scaffold-ops.js.map +1 -1
  22. package/dist/src/cli/commands/init.js +4 -3
  23. package/dist/src/cli/commands/init.js.map +1 -1
  24. package/dist/src/cli/commands/orchestrate.js +10 -3
  25. package/dist/src/cli/commands/orchestrate.js.map +1 -1
  26. package/dist/src/cli/commands/status.js.map +1 -1
  27. package/dist/src/cli/index.js +14 -19
  28. package/dist/src/cli/index.js.map +1 -1
  29. package/dist/src/cli/utils/compliance.d.ts +5 -1
  30. package/dist/src/cli/utils/compliance.js +90 -42
  31. package/dist/src/cli/utils/compliance.js.map +1 -1
  32. package/dist/src/cli/utils/ui.js +11 -11
  33. package/dist/src/cli/utils/ui.js.map +1 -1
  34. package/dist/src/modules/adapters/definitions.js +114 -113
  35. package/dist/src/modules/adapters/definitions.js.map +1 -1
  36. package/dist/src/modules/adapters/registry.d.ts +12 -0
  37. package/dist/src/modules/adapters/registry.js +19 -0
  38. package/dist/src/modules/adapters/registry.js.map +1 -0
  39. package/dist/src/modules/adapters/shared.js +5 -4
  40. package/dist/src/modules/adapters/shared.js.map +1 -1
  41. package/dist/src/modules/agents/definitions.d.ts +6 -6
  42. package/dist/src/modules/agents/definitions.js +49 -25
  43. package/dist/src/modules/agents/definitions.js.map +1 -1
  44. package/dist/src/modules/agents/registry/analyst.js +1 -1
  45. package/dist/src/modules/agents/registry/analyst.js.map +1 -1
  46. package/dist/src/modules/agents/registry/architect.js +1 -1
  47. package/dist/src/modules/agents/registry/architect.js.map +1 -1
  48. package/dist/src/modules/agents/registry/backend.js +1 -1
  49. package/dist/src/modules/agents/registry/backend.js.map +1 -1
  50. package/dist/src/modules/agents/registry/database.js +1 -1
  51. package/dist/src/modules/agents/registry/database.js.map +1 -1
  52. package/dist/src/modules/agents/registry/devops.js +1 -1
  53. package/dist/src/modules/agents/registry/devops.js.map +1 -1
  54. package/dist/src/modules/agents/registry/explorer.js +1 -1
  55. package/dist/src/modules/agents/registry/explorer.js.map +1 -1
  56. package/dist/src/modules/agents/registry/frontend.js +1 -1
  57. package/dist/src/modules/agents/registry/frontend.js.map +1 -1
  58. package/dist/src/modules/agents/registry/git.js +1 -1
  59. package/dist/src/modules/agents/registry/git.js.map +1 -1
  60. package/dist/src/modules/agents/registry/manager.js +1 -2
  61. package/dist/src/modules/agents/registry/manager.js.map +1 -1
  62. package/dist/src/modules/agents/registry/mobile.js +1 -1
  63. package/dist/src/modules/agents/registry/mobile.js.map +1 -1
  64. package/dist/src/modules/agents/registry/quality.js +1 -1
  65. package/dist/src/modules/agents/registry/quality.js.map +1 -1
  66. package/dist/src/modules/agents/registry/security.js +1 -1
  67. package/dist/src/modules/agents/registry/security.js.map +1 -1
  68. package/dist/src/shared/fs.js +4 -3
  69. package/dist/src/shared/fs.js.map +1 -1
  70. package/dist/tests/agents-definitions.test.js +2 -1
  71. package/dist/tests/agents-definitions.test.js.map +1 -1
  72. package/dist/tests/integration/hermes_locking.test.d.ts +1 -0
  73. package/dist/tests/integration/hermes_locking.test.js +62 -0
  74. package/dist/tests/integration/hermes_locking.test.js.map +1 -0
  75. package/dist/tests/orchestrate.test.js +9 -6
  76. package/dist/tests/orchestrate.test.js.map +1 -1
  77. package/framework-mcp/dist/index.js +11 -1
  78. package/framework-mcp/dist/tools/definitions.js +0 -10
  79. package/framework-mcp/dist/tools/index.js +0 -2
  80. package/framework-mcp/dist/utils/compliance.js +68 -19
  81. package/framework-mcp/node_modules/.package-lock.json +1179 -0
  82. package/framework-mcp/package-lock.json +1191 -0
  83. package/framework-mcp/package.json +2 -2
  84. package/framework-mcp/src/index.ts +13 -1
  85. package/framework-mcp/src/tools/definitions.ts +0 -10
  86. package/framework-mcp/src/tools/index.ts +0 -2
  87. package/framework-mcp/src/utils/compliance.ts +82 -24
  88. package/package.json +3 -4
  89. package/src/cli/adapters/scaffold.ts +9 -8
  90. package/src/cli/commands/check.ts +26 -48
  91. package/src/cli/commands/contract.ts +5 -2
  92. package/src/cli/commands/init/scaffold-ops.ts +0 -3
  93. package/src/cli/commands/init.ts +5 -3
  94. package/src/cli/commands/orchestrate.ts +12 -3
  95. package/src/cli/commands/status.ts +3 -2
  96. package/src/cli/index.ts +14 -20
  97. package/src/cli/utils/compliance.ts +101 -47
  98. package/src/cli/utils/ui.ts +11 -11
  99. package/src/modules/adapters/definitions.ts +82 -57
  100. package/src/modules/adapters/registry.ts +27 -0
  101. package/src/modules/adapters/shared.ts +5 -4
  102. package/src/modules/agents/definitions.ts +53 -24
  103. package/src/modules/agents/registry/analyst.ts +1 -1
  104. package/src/modules/agents/registry/architect.ts +1 -1
  105. package/src/modules/agents/registry/backend.ts +1 -1
  106. package/src/modules/agents/registry/database.ts +1 -1
  107. package/src/modules/agents/registry/devops.ts +1 -1
  108. package/src/modules/agents/registry/explorer.ts +1 -1
  109. package/src/modules/agents/registry/frontend.ts +1 -1
  110. package/src/modules/agents/registry/git.ts +1 -1
  111. package/src/modules/agents/registry/manager.ts +1 -2
  112. package/src/modules/agents/registry/mobile.ts +1 -1
  113. package/src/modules/agents/registry/quality.ts +1 -1
  114. package/src/modules/agents/registry/security.ts +1 -1
  115. package/src/shared/fs.ts +4 -3
  116. package/templates/standards/frontend-standards.md +7 -2
  117. package/templates/standards/governance-standards.md +27 -1
  118. package/templates/standards/logging-and-secrets.md +1 -1
  119. package/templates/standards/observability-standards.md +1 -1
  120. package/templates/standards/quality-standards.md +2 -1
  121. package/bin/enderun-dashboard.js +0 -25
  122. package/framework-mcp/src/tools/dashboard/start_dashboard.ts +0 -33
  123. package/src/cli/commands/dashboard/data-service.ts +0 -167
  124. package/src/cli/commands/dashboard/html-template.ts +0 -696
  125. package/src/cli/commands/dashboard/server.ts +0 -43
  126. package/src/cli/commands/dashboard.ts +0 -11
@@ -1,696 +0,0 @@
1
- /**
2
- * Agent Enderun — Live Dashboard HTML Template
3
- */
4
- export const HTML_CONTENT = `
5
- <!DOCTYPE html>
6
- <html lang="en">
7
- <head>
8
- <meta charset="UTF-8">
9
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
10
- <title>Agent Enderun — Live Dashboard</title>
11
- <style>
12
- @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=Fira+Code:wght@400;500&display=swap');
13
-
14
- * {
15
- box-sizing: border-box;
16
- margin: 0;
17
- padding: 0;
18
- }
19
-
20
- body {
21
- background-color: #0b0c10;
22
- color: #c5c6c7;
23
- font-family: 'Inter', sans-serif;
24
- overflow-x: hidden;
25
- height: 100vh;
26
- display: flex;
27
- flex-direction: column;
28
- }
29
-
30
- /* Gradient background glows */
31
- body::before {
32
- content: '';
33
- position: absolute;
34
- width: 300px;
35
- height: 300px;
36
- background: radial-gradient(circle, rgba(139, 92, 246, 0.15) 0%, rgba(0,0,0,0) 70%);
37
- top: 10%;
38
- left: 5%;
39
- z-index: -1;
40
- pointer-events: none;
41
- }
42
-
43
- body::after {
44
- content: '';
45
- position: absolute;
46
- width: 400px;
47
- height: 400px;
48
- background: radial-gradient(circle, rgba(6, 182, 212, 0.1) 0%, rgba(0,0,0,0) 70%);
49
- bottom: 10%;
50
- right: 5%;
51
- z-index: -1;
52
- pointer-events: none;
53
- }
54
-
55
- header {
56
- display: flex;
57
- justify-content: space-between;
58
- align-items: center;
59
- padding: 1.5rem 2rem;
60
- border-bottom: 1px solid rgba(255, 255, 255, 0.05);
61
- background: rgba(15, 17, 23, 0.7);
62
- backdrop-filter: blur(12px);
63
- }
64
-
65
- .logo-container {
66
- display: flex;
67
- align-items: center;
68
- gap: 0.75rem;
69
- }
70
-
71
- .logo-icon {
72
- width: 32px;
73
- height: 32px;
74
- background: linear-gradient(135deg, #8b5cf6, #06b6d4);
75
- border-radius: 8px;
76
- box-shadow: 0 0 15px rgba(139, 92, 246, 0.5);
77
- display: flex;
78
- align-items: center;
79
- justify-content: center;
80
- font-weight: 700;
81
- color: #fff;
82
- font-size: 1.1rem;
83
- }
84
-
85
- .logo-text {
86
- font-size: 1.25rem;
87
- font-weight: 700;
88
- background: linear-gradient(to right, #ffffff, #a5b4fc);
89
- -webkit-background-clip: text;
90
- -webkit-text-fill-color: transparent;
91
- }
92
-
93
- .system-status {
94
- display: flex;
95
- align-items: center;
96
- gap: 1.5rem;
97
- font-size: 0.875rem;
98
- }
99
-
100
- .status-badge {
101
- display: flex;
102
- align-items: center;
103
- gap: 0.5rem;
104
- background: rgba(16, 185, 129, 0.1);
105
- color: #10b981;
106
- padding: 0.35rem 0.75rem;
107
- border-radius: 9999px;
108
- border: 1px solid rgba(16, 185, 129, 0.2);
109
- font-weight: 500;
110
- }
111
-
112
- .status-dot {
113
- width: 8px;
114
- height: 8px;
115
- background-color: #10b981;
116
- border-radius: 50%;
117
- box-shadow: 0 0 8px #10b981;
118
- animation: pulse 1.8s infinite;
119
- }
120
-
121
- @keyframes pulse {
122
- 0% { transform: scale(0.9); opacity: 0.6; }
123
- 50% { transform: scale(1.1); opacity: 1; box-shadow: 0 0 12px #10b981; }
124
- 100% { transform: scale(0.9); opacity: 0.6; }
125
- }
126
-
127
- .main-layout {
128
- display: flex;
129
- flex: 1;
130
- padding: 1.5rem;
131
- gap: 1.5rem;
132
- height: calc(100vh - 80px);
133
- overflow: hidden;
134
- }
135
-
136
- /* Card panels */
137
- .panel {
138
- background: rgba(18, 20, 29, 0.6);
139
- border: 1px solid rgba(255, 255, 255, 0.05);
140
- border-radius: 16px;
141
- backdrop-filter: blur(16px);
142
- display: flex;
143
- flex-direction: column;
144
- overflow: hidden;
145
- box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
146
- }
147
-
148
- .panel-header {
149
- padding: 1rem 1.25rem;
150
- border-bottom: 1px solid rgba(255, 255, 255, 0.05);
151
- display: flex;
152
- justify-content: space-between;
153
- align-items: center;
154
- font-weight: 600;
155
- font-size: 0.95rem;
156
- color: #ffffff;
157
- letter-spacing: 0.05em;
158
- text-transform: uppercase;
159
- }
160
-
161
- /* Left Panel - Agents list */
162
- .agents-panel {
163
- width: 300px;
164
- flex-shrink: 0;
165
- }
166
-
167
- .agent-list {
168
- padding: 1rem;
169
- display: flex;
170
- flex-direction: column;
171
- gap: 0.75rem;
172
- overflow-y: auto;
173
- flex: 1;
174
- }
175
-
176
- .agent-card {
177
- background: rgba(255, 255, 255, 0.02);
178
- border: 1px solid rgba(255, 255, 255, 0.03);
179
- border-radius: 10px;
180
- padding: 0.75rem 1rem;
181
- display: flex;
182
- align-items: center;
183
- justify-content: space-between;
184
- transition: all 0.25s ease;
185
- }
186
-
187
- .agent-card:hover {
188
- background: rgba(255, 255, 255, 0.04);
189
- border-color: rgba(139, 92, 246, 0.3);
190
- transform: translateX(4px);
191
- }
192
-
193
- .agent-info {
194
- display: flex;
195
- flex-direction: column;
196
- gap: 0.25rem;
197
- }
198
-
199
- .agent-name {
200
- font-weight: 600;
201
- color: #e2e8f0;
202
- font-size: 0.9rem;
203
- }
204
-
205
- .agent-role {
206
- font-size: 0.75rem;
207
- color: #64748b;
208
- }
209
-
210
- .agent-state {
211
- display: flex;
212
- align-items: center;
213
- gap: 0.4rem;
214
- font-size: 0.75rem;
215
- font-weight: 600;
216
- padding: 0.25rem 0.5rem;
217
- border-radius: 6px;
218
- }
219
-
220
- .state-active { color: #10b981; background: rgba(16, 185, 129, 0.1); }
221
- .state-working { color: #f59e0b; background: rgba(245, 158, 11, 0.1); }
222
- .state-idle { color: #94a3b8; background: rgba(148, 163, 184, 0.1); }
223
-
224
- /* Middle Panel - Terminal Screen */
225
- .terminal-panel {
226
- flex: 1;
227
- display: flex;
228
- flex-direction: column;
229
- }
230
-
231
- .terminal-header-controls {
232
- display: flex;
233
- gap: 0.4rem;
234
- }
235
-
236
- .dot {
237
- width: 12px;
238
- height: 12px;
239
- border-radius: 50%;
240
- }
241
- .dot-red { background-color: #ef4444; }
242
- .dot-yellow { background-color: #f59e0b; }
243
- .dot-green { background-color: #10b981; }
244
-
245
- .terminal-screen {
246
- flex: 1;
247
- background: #050508;
248
- font-family: 'Fira Code', monospace;
249
- padding: 1.25rem;
250
- overflow-y: auto;
251
- font-size: 0.85rem;
252
- line-height: 1.6;
253
- color: #a7f3d0;
254
- display: flex;
255
- flex-direction: column;
256
- gap: 0.5rem;
257
- }
258
-
259
- .terminal-line {
260
- display: flex;
261
- gap: 0.5rem;
262
- align-items: flex-start;
263
- border-left: 2px solid transparent;
264
- padding-left: 0.5rem;
265
- }
266
-
267
- .line-timestamp {
268
- color: #64748b;
269
- flex-shrink: 0;
270
- font-size: 0.75rem;
271
- }
272
-
273
- .line-trace {
274
- color: #8b5cf6;
275
- font-weight: 600;
276
- flex-shrink: 0;
277
- font-size: 0.75rem;
278
- }
279
-
280
- .line-agent {
281
- color: #06b6d4;
282
- font-weight: 600;
283
- flex-shrink: 0;
284
- }
285
-
286
- .line-content {
287
- color: #e2e8f0;
288
- word-break: break-all;
289
- }
290
-
291
- .line-status-success {
292
- color: #10b981;
293
- font-weight: bold;
294
- }
295
-
296
- .line-status-failure {
297
- color: #ef4444;
298
- font-weight: bold;
299
- }
300
-
301
- /* Right Panel - Tasks & Metadata */
302
- .meta-panel {
303
- width: 320px;
304
- flex-shrink: 0;
305
- display: flex;
306
- flex-direction: column;
307
- gap: 1.5rem;
308
- background: transparent;
309
- border: none;
310
- box-shadow: none;
311
- overflow: visible;
312
- }
313
-
314
- .meta-card {
315
- background: rgba(18, 20, 29, 0.6);
316
- border: 1px solid rgba(255, 255, 255, 0.05);
317
- border-radius: 16px;
318
- backdrop-filter: blur(16px);
319
- padding: 1.25rem;
320
- display: flex;
321
- flex-direction: column;
322
- gap: 1rem;
323
- box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
324
- }
325
-
326
- .meta-card-title {
327
- font-size: 0.85rem;
328
- font-weight: 600;
329
- color: #ffffff;
330
- letter-spacing: 0.05em;
331
- text-transform: uppercase;
332
- border-bottom: 1px solid rgba(255, 255, 255, 0.05);
333
- padding-bottom: 0.5rem;
334
- }
335
-
336
- /* Task layout */
337
- .task-list {
338
- display: flex;
339
- flex-direction: column;
340
- gap: 0.75rem;
341
- }
342
-
343
- .task-item {
344
- background: rgba(255, 255, 255, 0.02);
345
- border: 1px solid rgba(255, 255, 255, 0.03);
346
- border-radius: 8px;
347
- padding: 0.75rem;
348
- display: flex;
349
- flex-direction: column;
350
- gap: 0.5rem;
351
- }
352
-
353
- .task-meta-top {
354
- display: flex;
355
- justify-content: space-between;
356
- align-items: center;
357
- font-size: 0.75rem;
358
- }
359
-
360
- .task-title {
361
- font-size: 0.825rem;
362
- font-weight: 500;
363
- color: #e2e8f0;
364
- }
365
-
366
- .task-agent-badge {
367
- color: #06b6d4;
368
- font-weight: 600;
369
- }
370
-
371
- .task-status-badge {
372
- font-size: 0.7rem;
373
- font-weight: bold;
374
- padding: 0.15rem 0.4rem;
375
- border-radius: 4px;
376
- text-transform: uppercase;
377
- }
378
-
379
- .status-inprogress { color: #3b82f6; background: rgba(59, 130, 246, 0.1); }
380
- .status-pending { color: #f59e0b; background: rgba(245, 158, 11, 0.1); }
381
- .status-completed { color: #10b981; background: rgba(16, 185, 129, 0.1); }
382
-
383
- /* Memory metrics */
384
- .metric-row {
385
- display: flex;
386
- flex-direction: column;
387
- gap: 0.4rem;
388
- }
389
-
390
- .metric-label-container {
391
- display: flex;
392
- justify-content: space-between;
393
- font-size: 0.8rem;
394
- color: #94a3b8;
395
- }
396
-
397
- .metric-bar-bg {
398
- height: 8px;
399
- background: rgba(255, 255, 255, 0.05);
400
- border-radius: 9999px;
401
- overflow: hidden;
402
- }
403
-
404
- .metric-bar-fill {
405
- height: 100%;
406
- background: linear-gradient(to right, #8b5cf6, #06b6d4);
407
- border-radius: 9999px;
408
- width: 0%;
409
- transition: width 0.5s ease;
410
- }
411
-
412
- /* Scrollbar styles */
413
- ::-webkit-scrollbar {
414
- width: 6px;
415
- }
416
- ::-webkit-scrollbar-track {
417
- background: transparent;
418
- }
419
- ::-webkit-scrollbar-thumb {
420
- background: rgba(255, 255, 255, 0.1);
421
- border-radius: 9999px;
422
- }
423
- ::-webkit-scrollbar-thumb:hover {
424
- background: rgba(255, 255, 255, 0.2);
425
- }
426
-
427
- </style>
428
- </head>
429
- <body>
430
-
431
- <header>
432
- <div class="logo-container">
433
- <div class="logo-icon">E</div>
434
- <div class="logo-text">Agent Enderun Live Monitor</div>
435
- </div>
436
- <div class="system-status">
437
- <div>Active Phase: <span id="system-phase" style="color:#ffffff; font-weight:600;">PHASE_0</span></div>
438
- <div>Trace ID: <span id="system-trace" style="color:#8b5cf6; font-weight:600; font-family:'Fira Code',monospace;">N/A</span></div>
439
- <div class="status-badge">
440
- <span class="status-dot"></span>
441
- <span>Live Connection</span>
442
- </div>
443
- </div>
444
- </header>
445
-
446
- <div class="main-layout">
447
-
448
- <!-- Left Panel: Agents -->
449
- <div class="panel agents-panel">
450
- <div class="panel-header">
451
- <span>Army Agents</span>
452
- <span id="agents-online-count" style="color: #10b981; font-size: 0.8rem;">12 Online</span>
453
- </div>
454
- <div class="agent-list" id="agent-list-container">
455
- <!-- Dynamic Agents -->
456
- <div style="color:#64748b; font-size:0.875rem; text-align:center; padding:2rem;">Loading...</div>
457
- </div>
458
- </div>
459
-
460
- <!-- Middle Panel: Terminal -->
461
- <div class="panel terminal-panel">
462
- <div class="panel-header">
463
- <span>Live Orchestration Logs</span>
464
- <div class="terminal-header-controls">
465
- <span class="dot dot-red"></span>
466
- <span class="dot dot-yellow"></span>
467
- <span class="dot dot-green"></span>
468
- </div>
469
- </div>
470
- <div class="terminal-screen" id="terminal-screen-container">
471
- <div class="terminal-line">
472
- <span class="line-content">> Initializing Agent Enderun orchestrator...</span>
473
- </div>
474
- </div>
475
- </div>
476
-
477
- <!-- Right Panel: Tasks & System Status -->
478
- <div class="meta-panel">
479
-
480
- <!-- Active Tasks -->
481
- <div class="meta-card">
482
- <div class="meta-card-title">Active Tasks</div>
483
- <div class="task-list" id="task-list-container">
484
- <div style="color:#64748b; font-size:0.825rem; text-align:center; padding:1rem;">No active tasks</div>
485
- </div>
486
- </div>
487
-
488
- <!-- Project Memory State -->
489
- <div class="meta-card">
490
- <div class="meta-card-title">Project Memory State</div>
491
- <div class="metric-row">
492
- <div class="metric-label-container">
493
- <span>Agent Compliance</span>
494
- <span id="metric-compliance">100%</span>
495
- </div>
496
- <div class="metric-bar-bg">
497
- <div class="metric-bar-fill" id="compliance-bar" style="width: 100%;"></div>
498
- </div>
499
- </div>
500
- <div class="metric-row">
501
- <div class="metric-label-container">
502
- <span>Completed Tasks</span>
503
- <span id="metric-tasks-done">100%</span>
504
- </div>
505
- <div class="metric-bar-bg">
506
- <div class="metric-bar-fill" id="tasks-done-bar" style="width: 100%; background: linear-gradient(to right, #10b981, #059669);"></div>
507
- </div>
508
- </div>
509
- </div>
510
-
511
- </div>
512
-
513
- </div>
514
-
515
- <script>
516
- const API_STATUS = '/api/status';
517
- const API_AGENTS = '/api/agents';
518
-
519
- // Predefined list of Agent Enderun core agents to ensure we display all 12 correctly
520
- const CORE_AGENTS = [
521
- { name: "manager", role: "CTO / Orchestrator", status: "state-active", stateLabel: "Active" },
522
- { name: "backend", role: "Logic & API Specialist", status: "state-idle", stateLabel: "Idle" },
523
- { name: "frontend", role: "UI & UX Specialist", status: "state-idle", stateLabel: "Idle" },
524
- { name: "database", role: "SQL & Migration Specialist", status: "state-idle", stateLabel: "Idle" },
525
- { name: "quality", role: "QA & Compliance Specialist", status: "state-idle", stateLabel: "Idle" },
526
- { name: "devops", role: "CI/CD & Deploy Specialist", status: "state-idle", stateLabel: "Idle" },
527
- { name: "security", role: "Crypt & RLS Specialist", status: "state-idle", stateLabel: "Idle" },
528
- { name: "explorer", role: "Code Discovery Specialist", status: "state-idle", stateLabel: "Idle" },
529
- { name: "git", role: "Version Control Specialist", status: "state-idle", stateLabel: "Idle" },
530
- { name: "analyst", role: "Specs Verification Specialist", status: "state-idle", stateLabel: "Idle" },
531
- { name: "mobile", role: "Mobile Specialist", status: "state-idle", stateLabel: "Idle" },
532
- { name: "native", role: "Desktop wrapper Specialist", status: "state-idle", stateLabel: "Idle" }
533
- ];
534
-
535
- let loadedAgents = [];
536
-
537
- async function fetchAgents() {
538
- try {
539
- const res = await fetch(API_AGENTS);
540
- loadedAgents = await res.json();
541
- renderAgents();
542
- } catch (e) {
543
- console.error("Agents fetch error", e);
544
- renderAgents(); // Fallback to core agents list
545
- }
546
- }
547
-
548
- function renderAgents(activeAgentName = null) {
549
- const container = document.getElementById('agent-list-container');
550
- container.innerHTML = '';
551
-
552
- const displayList = CORE_AGENTS.map(core => {
553
- const found = loadedAgents.find(l => l.name === core.name);
554
- return {
555
- name: core.name,
556
- role: found ? found.role : core.role,
557
- displayName: found ? found.displayName : core.name.toUpperCase()
558
- };
559
- });
560
-
561
- displayList.forEach(agent => {
562
- let stateClass = 'state-idle';
563
- let stateLabel = 'Idle';
564
-
565
- if (agent.name === 'manager') {
566
- stateClass = 'state-active';
567
- stateLabel = 'Active';
568
- }
569
-
570
- if (activeAgentName && agent.name === activeAgentName.replace('@', '').toLowerCase()) {
571
- stateClass = 'state-working';
572
- stateLabel = 'Working';
573
- }
574
-
575
- const card = document.createElement('div');
576
- card.className = 'agent-card';
577
- card.innerHTML = \`
578
- <div class="agent-info">
579
- <span class="agent-name">@\${agent.name}</span>
580
- <span class="agent-role">\${agent.role}</span>
581
- </div>
582
- <span class="agent-state \${stateClass}">\${stateLabel}</span>
583
- \`;
584
- container.appendChild(card);
585
- });
586
-
587
- document.getElementById('agents-online-count').innerText = \`\${displayList.length} Online\`;
588
- }
589
-
590
- let renderedLogTimestamps = new Set();
591
-
592
- async function fetchStatus() {
593
- try {
594
- const res = await fetch(API_STATUS);
595
- const data = await res.json();
596
-
597
- if (data.error) {
598
- console.error("API error", data.error);
599
- return;
600
- }
601
-
602
- // Update Header Status
603
- document.getElementById('system-phase').innerText = data.phase || 'PHASE_0';
604
- document.getElementById('system-trace').innerText = data.traceId || 'N/A';
605
-
606
- // Update Active Tasks
607
- const taskContainer = document.getElementById('task-list-container');
608
- if (data.tasks && data.tasks.length > 0) {
609
- taskContainer.innerHTML = '';
610
- data.tasks.forEach(task => {
611
- const statusClass = task.status.toLowerCase().includes('progress') ? 'status-inprogress'
612
- : task.status.toLowerCase().includes('pending') ? 'status-pending'
613
- : 'status-completed';
614
- const item = document.createElement('div');
615
- item.className = 'task-item';
616
- item.innerHTML = \`
617
- <div class="task-meta-top">
618
- <span class="task-agent-badge">\${task.agent}</span>
619
- <span class="task-status-badge \${statusClass}">\${task.status}</span>
620
- </div>
621
- <span class="task-title">\${task.task}</span>
622
- \`;
623
- taskContainer.appendChild(item);
624
- });
625
- } else {
626
- taskContainer.innerHTML = '<div style="color:#64748b; font-size:0.825rem; text-align:center; padding:1rem;">No active tasks</div>';
627
- }
628
-
629
- // Update Terminal logs dynamically with manager.json
630
- const terminal = document.getElementById('terminal-screen-container');
631
-
632
- if (data.logs && data.logs.length > 0) {
633
- // Filter and append new logs
634
- let activeAgent = null;
635
- data.logs.forEach(log => {
636
- const uniqueKey = log.timestamp + '-' + log.action;
637
- if (!renderedLogTimestamps.has(uniqueKey)) {
638
- renderedLogTimestamps.add(uniqueKey);
639
-
640
- const line = document.createElement('div');
641
- line.className = 'terminal-line';
642
-
643
- const cleanTime = new Date(log.timestamp).toLocaleTimeString();
644
- const cleanTrace = log.requestId ? log.requestId.slice(0, 8) : 'T-000';
645
-
646
- const statusColorClass = log.status === 'SUCCESS' ? 'line-status-success' : 'line-status-failure';
647
-
648
- line.innerHTML = \`
649
- <span class="line-timestamp">[\${cleanTime}]</span>
650
- <span class="line-trace">[TR-\${cleanTrace}]</span>
651
- <span class="line-agent">\${log.agent}:</span>
652
- <span class="line-content">\${log.summary} <span class="\${statusColorClass}">[\${log.status}]</span></span>
653
- \`;
654
- terminal.appendChild(line);
655
- terminal.scrollTop = terminal.scrollHeight;
656
-
657
- activeAgent = log.agent;
658
- }
659
- });
660
-
661
- if (activeAgent) {
662
- renderAgents(activeAgent);
663
- }
664
- } else if (data.history && data.history.length > 0) {
665
- // Fallback to parsed project memory history
666
- data.history.forEach(hist => {
667
- const uniqueKey = hist.title;
668
- if (!renderedLogTimestamps.has(uniqueKey)) {
669
- renderedLogTimestamps.add(uniqueKey);
670
-
671
- const line = document.createElement('div');
672
- line.className = 'terminal-line';
673
- line.innerHTML = \`
674
- <span class="line-timestamp">[MEMORY]</span>
675
- <span class="line-agent">✏️ \${hist.title}:</span>
676
- <span class="line-content">\${hist.body.join(' ')}</span>
677
- \`;
678
- terminal.appendChild(line);
679
- terminal.scrollTop = terminal.scrollHeight;
680
- }
681
- });
682
- }
683
- } catch (e) {
684
- console.error("Status fetch error", e);
685
- }
686
- }
687
-
688
- // Initialize and Start Polling
689
- fetchAgents().then(() => {
690
- fetchStatus();
691
- setInterval(fetchStatus, 2000);
692
- });
693
- </script>
694
- </body>
695
- </html>
696
- `;