agent-enderun 1.1.10 → 1.10.0

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 (254) hide show
  1. package/README.md +294 -19
  2. package/bin/cli.js +7 -0
  3. package/bin/enderun-dashboard.js +16 -857
  4. package/bin/validate-agent-army.js +12 -12
  5. package/dist/framework-mcp/src/index.js +14 -2
  6. package/dist/framework-mcp/src/index.js.map +1 -1
  7. package/dist/framework-mcp/src/tools/file_system/batch_surgical_edit.js +2 -1
  8. package/dist/framework-mcp/src/tools/file_system/batch_surgical_edit.js.map +1 -1
  9. package/dist/framework-mcp/src/tools/file_system/replace_text.js +2 -1
  10. package/dist/framework-mcp/src/tools/file_system/replace_text.js.map +1 -1
  11. package/dist/framework-mcp/src/tools/file_system/write_file.js +3 -3
  12. package/dist/framework-mcp/src/tools/file_system/write_file.js.map +1 -1
  13. package/dist/framework-mcp/src/utils/fs.d.ts +16 -0
  14. package/dist/framework-mcp/src/utils/fs.js +45 -0
  15. package/dist/framework-mcp/src/utils/fs.js.map +1 -0
  16. package/dist/framework-mcp/src/utils/metrics.js.map +1 -1
  17. package/dist/src/cli/adapters/core.js.map +1 -1
  18. package/dist/src/cli/adapters/scaffold.js +4 -3
  19. package/dist/src/cli/adapters/scaffold.js.map +1 -1
  20. package/dist/src/cli/commands/app.js +20 -5
  21. package/dist/src/cli/commands/app.js.map +1 -1
  22. package/dist/src/cli/commands/approve.d.ts +1 -1
  23. package/dist/src/cli/commands/approve.js +7 -7
  24. package/dist/src/cli/commands/approve.js.map +1 -1
  25. package/dist/src/cli/commands/check.d.ts +1 -1
  26. package/dist/src/cli/commands/check.js +35 -4
  27. package/dist/src/cli/commands/check.js.map +1 -1
  28. package/dist/src/cli/commands/compliance.d.ts +1 -1
  29. package/dist/src/cli/commands/compliance.js +1 -1
  30. package/dist/src/cli/commands/compliance.js.map +1 -1
  31. package/dist/src/cli/commands/contract.d.ts +2 -2
  32. package/dist/src/cli/commands/contract.js +8 -14
  33. package/dist/src/cli/commands/contract.js.map +1 -1
  34. package/dist/src/cli/commands/dashboard/data-service.d.ts +33 -0
  35. package/dist/src/cli/commands/dashboard/data-service.js +120 -0
  36. package/dist/src/cli/commands/dashboard/data-service.js.map +1 -0
  37. package/dist/src/cli/commands/dashboard/html-template.d.ts +4 -0
  38. package/dist/src/cli/commands/dashboard/html-template.js +697 -0
  39. package/dist/src/cli/commands/dashboard/html-template.js.map +1 -0
  40. package/dist/src/cli/commands/dashboard/server.d.ts +2 -0
  41. package/dist/src/cli/commands/dashboard/server.js +38 -0
  42. package/dist/src/cli/commands/dashboard/server.js.map +1 -0
  43. package/dist/src/cli/commands/dashboard.d.ts +4 -0
  44. package/dist/src/cli/commands/dashboard.js +10 -0
  45. package/dist/src/cli/commands/dashboard.js.map +1 -0
  46. package/dist/src/cli/commands/explorer.d.ts +2 -2
  47. package/dist/src/cli/commands/explorer.js +2 -2
  48. package/dist/src/cli/commands/explorer.js.map +1 -1
  49. package/dist/src/cli/commands/git.d.ts +2 -2
  50. package/dist/src/cli/commands/git.js +2 -2
  51. package/dist/src/cli/commands/git.js.map +1 -1
  52. package/dist/src/cli/commands/init/scaffold-core.d.ts +4 -0
  53. package/dist/src/cli/commands/init/scaffold-core.js +65 -0
  54. package/dist/src/cli/commands/init/scaffold-core.js.map +1 -0
  55. package/dist/src/cli/commands/init/scaffold-ops.d.ts +1 -0
  56. package/dist/src/cli/commands/init/scaffold-ops.js +83 -0
  57. package/dist/src/cli/commands/init/scaffold-ops.js.map +1 -0
  58. package/dist/src/cli/commands/init/scaffold-standards.d.ts +2 -0
  59. package/dist/src/cli/commands/init/scaffold-standards.js +58 -0
  60. package/dist/src/cli/commands/init/scaffold-standards.js.map +1 -0
  61. package/dist/src/cli/commands/init.js +14 -275
  62. package/dist/src/cli/commands/init.js.map +1 -1
  63. package/dist/src/cli/commands/knowledge.d.ts +2 -2
  64. package/dist/src/cli/commands/knowledge.js +4 -3
  65. package/dist/src/cli/commands/knowledge.js.map +1 -1
  66. package/dist/src/cli/commands/lint.d.ts +1 -1
  67. package/dist/src/cli/commands/lint.js +2 -3
  68. package/dist/src/cli/commands/lint.js.map +1 -1
  69. package/dist/src/cli/commands/log.d.ts +1 -1
  70. package/dist/src/cli/commands/log.js +3 -2
  71. package/dist/src/cli/commands/log.js.map +1 -1
  72. package/dist/src/cli/commands/memory.d.ts +1 -1
  73. package/dist/src/cli/commands/memory.js +1 -1
  74. package/dist/src/cli/commands/memory.js.map +1 -1
  75. package/dist/src/cli/commands/orchestrate.js +169 -140
  76. package/dist/src/cli/commands/orchestrate.js.map +1 -1
  77. package/dist/src/cli/commands/plan.d.ts +1 -1
  78. package/dist/src/cli/commands/plan.js +1 -1
  79. package/dist/src/cli/commands/plan.js.map +1 -1
  80. package/dist/src/cli/commands/script.d.ts +1 -1
  81. package/dist/src/cli/commands/script.js +1 -1
  82. package/dist/src/cli/commands/script.js.map +1 -1
  83. package/dist/src/cli/commands/security.d.ts +1 -1
  84. package/dist/src/cli/commands/security.js +1 -1
  85. package/dist/src/cli/commands/security.js.map +1 -1
  86. package/dist/src/cli/commands/status.d.ts +1 -1
  87. package/dist/src/cli/commands/status.js +1 -1
  88. package/dist/src/cli/commands/status.js.map +1 -1
  89. package/dist/src/cli/commands/trace.d.ts +1 -1
  90. package/dist/src/cli/commands/trace.js +1 -1
  91. package/dist/src/cli/commands/trace.js.map +1 -1
  92. package/dist/src/cli/index.js +36 -21
  93. package/dist/src/cli/index.js.map +1 -1
  94. package/dist/src/cli/shims.js +6 -6
  95. package/dist/src/cli/utils/app-backend.js +7 -0
  96. package/dist/src/cli/utils/app-backend.js.map +1 -1
  97. package/dist/src/cli/utils/app-docs.js +23 -5
  98. package/dist/src/cli/utils/app-docs.js.map +1 -1
  99. package/dist/src/cli/utils/app-frontend.js +5 -0
  100. package/dist/src/cli/utils/app-frontend.js.map +1 -1
  101. package/dist/src/cli/utils/app-inferrer.d.ts +1 -0
  102. package/dist/src/cli/utils/app-inferrer.js +12 -1
  103. package/dist/src/cli/utils/app-inferrer.js.map +1 -1
  104. package/dist/src/cli/utils/app-mobile.d.ts +2 -0
  105. package/dist/src/cli/utils/app-mobile.js +106 -0
  106. package/dist/src/cli/utils/app-mobile.js.map +1 -0
  107. package/dist/src/cli/utils/app-types.js +8 -4
  108. package/dist/src/cli/utils/app-types.js.map +1 -1
  109. package/dist/src/cli/utils/app.d.ts +1 -0
  110. package/dist/src/cli/utils/app.js +1 -0
  111. package/dist/src/cli/utils/app.js.map +1 -1
  112. package/dist/src/cli/utils/claude.js +2 -1
  113. package/dist/src/cli/utils/claude.js.map +1 -1
  114. package/dist/src/cli/utils/compliance.js +37 -6
  115. package/dist/src/cli/utils/compliance.js.map +1 -1
  116. package/dist/src/cli/utils/config-schema.d.ts +3 -3
  117. package/dist/src/cli/utils/config-schema.js +3 -3
  118. package/dist/src/cli/utils/config-schema.js.map +1 -1
  119. package/dist/src/cli/utils/fs.d.ts +2 -2
  120. package/dist/src/cli/utils/fs.js +9 -13
  121. package/dist/src/cli/utils/fs.js.map +1 -1
  122. package/dist/src/cli/utils/memory.d.ts +9 -2
  123. package/dist/src/cli/utils/memory.js +87 -16
  124. package/dist/src/cli/utils/memory.js.map +1 -1
  125. package/dist/src/cli/utils/pkg.js +14 -13
  126. package/dist/src/cli/utils/pkg.js.map +1 -1
  127. package/dist/src/cli/utils/string.js +1 -1
  128. package/dist/src/cli/utils/string.js.map +1 -1
  129. package/dist/src/cli/utils/ui.d.ts +1 -1
  130. package/dist/src/cli/utils/ui.js +1 -1
  131. package/dist/src/modules/adapters/shared.js +7 -7
  132. package/dist/src/modules/adapters/shared.js.map +1 -1
  133. package/dist/src/modules/agents/definitions.d.ts +3 -34
  134. package/dist/src/modules/agents/definitions.js +35 -511
  135. package/dist/src/modules/agents/definitions.js.map +1 -1
  136. package/dist/src/modules/agents/registry/analyst.d.ts +2 -0
  137. package/dist/src/modules/agents/registry/analyst.js +36 -0
  138. package/dist/src/modules/agents/registry/analyst.js.map +1 -0
  139. package/dist/src/modules/agents/registry/architect.d.ts +2 -0
  140. package/dist/src/modules/agents/registry/architect.js +42 -0
  141. package/dist/src/modules/agents/registry/architect.js.map +1 -0
  142. package/dist/src/modules/agents/registry/backend.d.ts +2 -0
  143. package/dist/src/modules/agents/registry/backend.js +43 -0
  144. package/dist/src/modules/agents/registry/backend.js.map +1 -0
  145. package/dist/src/modules/agents/registry/database.d.ts +2 -0
  146. package/dist/src/modules/agents/registry/database.js +38 -0
  147. package/dist/src/modules/agents/registry/database.js.map +1 -0
  148. package/dist/src/modules/agents/registry/devops.d.ts +2 -0
  149. package/dist/src/modules/agents/registry/devops.js +38 -0
  150. package/dist/src/modules/agents/registry/devops.js.map +1 -0
  151. package/dist/src/modules/agents/registry/explorer.d.ts +2 -0
  152. package/dist/src/modules/agents/registry/explorer.js +36 -0
  153. package/dist/src/modules/agents/registry/explorer.js.map +1 -0
  154. package/dist/src/modules/agents/registry/frontend.d.ts +2 -0
  155. package/dist/src/modules/agents/registry/frontend.js +44 -0
  156. package/dist/src/modules/agents/registry/frontend.js.map +1 -0
  157. package/dist/src/modules/agents/registry/git.d.ts +2 -0
  158. package/dist/src/modules/agents/registry/git.js +35 -0
  159. package/dist/src/modules/agents/registry/git.js.map +1 -0
  160. package/dist/src/modules/agents/registry/manager.d.ts +2 -0
  161. package/dist/src/modules/agents/registry/manager.js +49 -0
  162. package/dist/src/modules/agents/registry/manager.js.map +1 -0
  163. package/dist/src/modules/agents/registry/mobile.d.ts +2 -0
  164. package/dist/src/modules/agents/registry/mobile.js +40 -0
  165. package/dist/src/modules/agents/registry/mobile.js.map +1 -0
  166. package/dist/src/modules/agents/registry/native.d.ts +2 -0
  167. package/dist/src/modules/agents/registry/native.js +36 -0
  168. package/dist/src/modules/agents/registry/native.js.map +1 -0
  169. package/dist/src/modules/agents/registry/quality.d.ts +2 -0
  170. package/dist/src/modules/agents/registry/quality.js +41 -0
  171. package/dist/src/modules/agents/registry/quality.js.map +1 -0
  172. package/dist/src/modules/agents/registry/security.d.ts +2 -0
  173. package/dist/src/modules/agents/registry/security.js +37 -0
  174. package/dist/src/modules/agents/registry/security.js.map +1 -0
  175. package/dist/src/modules/agents/types.d.ts +31 -0
  176. package/dist/src/modules/agents/types.js +2 -0
  177. package/dist/src/modules/agents/types.js.map +1 -0
  178. package/dist/src/modules/skills/definitions.d.ts +1 -1
  179. package/dist/src/modules/skills/definitions.js +1 -1
  180. package/dist/src/shared/errors.d.ts +8 -6
  181. package/dist/src/shared/errors.js +13 -10
  182. package/dist/src/shared/errors.js.map +1 -1
  183. package/dist/src/shared/fs.d.ts +4 -0
  184. package/dist/src/shared/fs.js +17 -2
  185. package/dist/src/shared/fs.js.map +1 -1
  186. package/dist/src/shared/types.d.ts +19 -0
  187. package/dist/src/shared/types.js +13 -0
  188. package/dist/src/shared/types.js.map +1 -0
  189. package/package.json +3 -5
  190. package/src/cli/adapters/core.ts +0 -1
  191. package/src/cli/adapters/scaffold.ts +4 -3
  192. package/src/cli/commands/app.ts +23 -5
  193. package/src/cli/commands/approve.ts +15 -7
  194. package/src/cli/commands/check.ts +38 -5
  195. package/src/cli/commands/compliance.ts +1 -1
  196. package/src/cli/commands/contract.ts +20 -14
  197. package/src/cli/commands/dashboard/data-service.ts +119 -0
  198. package/src/cli/commands/dashboard/html-template.ts +696 -0
  199. package/src/cli/commands/dashboard/server.ts +43 -0
  200. package/src/cli/commands/dashboard.ts +11 -0
  201. package/src/cli/commands/explorer.ts +2 -2
  202. package/src/cli/commands/git.ts +2 -2
  203. package/src/cli/commands/init/scaffold-core.ts +71 -0
  204. package/src/cli/commands/init/scaffold-ops.ts +86 -0
  205. package/src/cli/commands/init/scaffold-standards.ts +59 -0
  206. package/src/cli/commands/init.ts +21 -292
  207. package/src/cli/commands/knowledge.ts +5 -3
  208. package/src/cli/commands/lint.ts +2 -4
  209. package/src/cli/commands/log.ts +4 -2
  210. package/src/cli/commands/memory.ts +1 -1
  211. package/src/cli/commands/orchestrate.ts +177 -142
  212. package/src/cli/commands/plan.ts +1 -1
  213. package/src/cli/commands/script.ts +1 -1
  214. package/src/cli/commands/security.ts +1 -1
  215. package/src/cli/commands/status.ts +1 -1
  216. package/src/cli/commands/trace.ts +1 -1
  217. package/src/cli/index.ts +37 -21
  218. package/src/cli/shims.ts +6 -6
  219. package/src/cli/utils/app-backend.ts +8 -0
  220. package/src/cli/utils/app-docs.ts +23 -5
  221. package/src/cli/utils/app-frontend.ts +6 -0
  222. package/src/cli/utils/app-inferrer.ts +11 -1
  223. package/src/cli/utils/app-mobile.ts +113 -0
  224. package/src/cli/utils/app-types.ts +9 -4
  225. package/src/cli/utils/app.ts +1 -0
  226. package/src/cli/utils/claude.ts +2 -1
  227. package/src/cli/utils/compliance.ts +38 -7
  228. package/src/cli/utils/config-schema.ts +4 -4
  229. package/src/cli/utils/fs.ts +9 -14
  230. package/src/cli/utils/memory.ts +103 -20
  231. package/src/cli/utils/pkg.ts +14 -13
  232. package/src/cli/utils/string.ts +1 -1
  233. package/src/cli/utils/ui.ts +1 -1
  234. package/src/modules/adapters/shared.ts +7 -7
  235. package/src/modules/agents/definitions.ts +39 -598
  236. package/src/modules/agents/registry/analyst.ts +40 -0
  237. package/src/modules/agents/registry/architect.ts +46 -0
  238. package/src/modules/agents/registry/backend.ts +47 -0
  239. package/src/modules/agents/registry/database.ts +42 -0
  240. package/src/modules/agents/registry/devops.ts +42 -0
  241. package/src/modules/agents/registry/explorer.ts +40 -0
  242. package/src/modules/agents/registry/frontend.ts +48 -0
  243. package/src/modules/agents/registry/git.ts +39 -0
  244. package/src/modules/agents/registry/manager.ts +53 -0
  245. package/src/modules/agents/registry/mobile.ts +44 -0
  246. package/src/modules/agents/registry/native.ts +40 -0
  247. package/src/modules/agents/registry/quality.ts +45 -0
  248. package/src/modules/agents/registry/security.ts +41 -0
  249. package/src/modules/agents/types.ts +37 -0
  250. package/src/modules/skills/definitions.ts +1 -1
  251. package/src/shared/errors.ts +13 -10
  252. package/src/shared/fs.ts +17 -2
  253. package/src/shared/types.ts +20 -0
  254. package/bin/utils/docgen.ts +0 -24
@@ -0,0 +1,696 @@
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
+ `;