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
@@ -1,18 +1,18 @@
1
1
  import path from "path";
2
2
  import fs from "fs";
3
3
  import { getConfiguredPaths } from "../utils/memory.js";
4
- import { computeTypesHash } from "../utils/fs.js";
4
+ import { computeTypesHash, writeJsonFile } from "../utils/fs.js";
5
+ import { ValidationError } from "../../shared/errors.js";
5
6
  /**
6
7
  * Verify type safety between backend and frontend contracts.
7
8
  */
8
- export function verifyApiContractCommand() {
9
+ export async function verifyApiContractCommand() {
9
10
  const projectRoot = process.cwd();
10
11
  const pathsMap = getConfiguredPaths();
11
12
  const sharedDir = path.join(projectRoot, pathsMap.backend, "src/types");
12
13
  const contractPath = path.join(projectRoot, pathsMap.backend, "contract.version.json");
13
14
  if (!fs.existsSync(sharedDir) || !fs.existsSync(contractPath)) {
14
- console.error("❌ Error: API types or contract version file missing.");
15
- process.exit(1);
15
+ throw new ValidationError("API types or contract version file missing.", null, "Ensure you have initialized the project and the backend directory is correctly configured in config.json.");
16
16
  }
17
17
  const currentHash = computeTypesHash(projectRoot, sharedDir);
18
18
  const contract = JSON.parse(fs.readFileSync(contractPath, "utf8"));
@@ -20,32 +20,26 @@ export function verifyApiContractCommand() {
20
20
  console.warn("✅ Contract is valid and synchronized.");
21
21
  }
22
22
  else {
23
- console.error("❌ Error: Contract drift detected!");
24
- console.error(` Stored: ${contract.contract_hash}`);
25
- console.error(` Actual: ${currentHash}`);
26
- console.warn("\n👉 Run 'npm run update-contract' to re-sync.");
27
- process.exit(1);
23
+ throw new ValidationError("Contract drift detected!", { stored: contract.contract_hash, actual: currentHash }, "Run 'npx agent-enderun update-contract' to re-synchronize the API contracts.");
28
24
  }
29
25
  }
30
26
  /**
31
27
  * Update and synchronize type safety between backend and frontend contracts.
32
28
  */
33
- export function updateApiContractCommand() {
29
+ export async function updateApiContractCommand() {
34
30
  const projectRoot = process.cwd();
35
31
  const pathsMap = getConfiguredPaths();
36
32
  const sharedDir = path.join(projectRoot, pathsMap.backend, "src/types");
37
33
  const contractPath = path.join(projectRoot, pathsMap.backend, "contract.version.json");
38
34
  if (!fs.existsSync(sharedDir)) {
39
- console.error("❌ Error: API types directory missing.");
40
- process.exit(1);
35
+ throw new ValidationError("API types directory missing.", null, "The directory specified for backend types does not exist. Check your framework configuration.");
41
36
  }
42
37
  const currentHash = computeTypesHash(projectRoot, sharedDir);
43
38
  const contractData = {
44
39
  contract_hash: currentHash,
45
40
  last_updated: new Date().toISOString()
46
41
  };
47
- fs.mkdirSync(path.dirname(contractPath), { recursive: true });
48
- fs.writeFileSync(contractPath, JSON.stringify(contractData, null, 2));
42
+ writeJsonFile(contractPath, contractData);
49
43
  console.warn(`✅ Contract successfully synchronized. New hash: ${currentHash}`);
50
44
  }
51
45
  //# sourceMappingURL=contract.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"contract.js","sourceRoot":"","sources":["../../../../src/cli/commands/contract.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"contract.js","sourceRoot":"","sources":["../../../../src/cli/commands/contract.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB;IAC1C,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAClC,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;IACtC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IACxE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,OAAO,EAAE,uBAAuB,CAAC,CAAC;IAEvF,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC5D,MAAM,IAAI,eAAe,CACrB,6CAA6C,EAC7C,IAAI,EACJ,2GAA2G,CAC9G,CAAC;IACN,CAAC;IAED,MAAM,WAAW,GAAG,gBAAgB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAC7D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;IAEnE,IAAI,QAAQ,CAAC,aAAa,KAAK,WAAW,EAAE,CAAC;QACzC,OAAO,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;IAC1D,CAAC;SAAM,CAAC;QACJ,MAAM,IAAI,eAAe,CACrB,0BAA0B,EAC1B,EAAE,MAAM,EAAE,QAAQ,CAAC,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,EACvD,8EAA8E,CACjF,CAAC;IACN,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB;IAC1C,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAClC,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;IACtC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IACxE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,OAAO,EAAE,uBAAuB,CAAC,CAAC;IAEvF,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,eAAe,CACrB,8BAA8B,EAC9B,IAAI,EACJ,+FAA+F,CAClG,CAAC;IACN,CAAC;IAED,MAAM,WAAW,GAAG,gBAAgB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAE7D,MAAM,YAAY,GAAG;QACjB,aAAa,EAAE,WAAW;QAC1B,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACzC,CAAC;IAEF,aAAa,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IAC1C,OAAO,CAAC,IAAI,CAAC,mDAAmD,WAAW,EAAE,CAAC,CAAC;AACnF,CAAC"}
@@ -0,0 +1,33 @@
1
+ export declare function parseProjectMemory(): {
2
+ error: string;
3
+ phase?: undefined;
4
+ traceId?: undefined;
5
+ managerState?: undefined;
6
+ tasks?: undefined;
7
+ history?: undefined;
8
+ } | {
9
+ phase: string;
10
+ traceId: string;
11
+ managerState: string;
12
+ tasks: {
13
+ traceId: string;
14
+ task: string;
15
+ agent: string;
16
+ priority: string;
17
+ status: string;
18
+ }[];
19
+ history: {
20
+ title: string;
21
+ body: string[];
22
+ }[];
23
+ error?: undefined;
24
+ };
25
+ export declare function readManagerLogs(): any;
26
+ export declare function listAgents(): {
27
+ name: any;
28
+ displayName: any;
29
+ description: any;
30
+ role: any;
31
+ capability: any;
32
+ tags: any;
33
+ }[];
@@ -0,0 +1,120 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import { getFrameworkDir } from "../../utils/memory.js";
4
+ export function parseProjectMemory() {
5
+ const frameworkDir = getFrameworkDir();
6
+ if (!frameworkDir)
7
+ return { error: "No framework directory found. Run init." };
8
+ const memPath = path.join(frameworkDir, "memory/PROJECT_MEMORY.md");
9
+ if (!fs.existsSync(memPath))
10
+ return { error: "PROJECT_MEMORY.md not found" };
11
+ try {
12
+ const content = fs.readFileSync(memPath, "utf8");
13
+ // Parse Phase & Trace ID
14
+ const phaseMatch = content.match(/Phase:\s*([^\n\r]+)/i);
15
+ const traceMatch = content.match(/Trace ID:\s*([^\n\r]+)/i);
16
+ const managerMatch = content.match(/@manager state:\s*([^\n\r]+)/i);
17
+ // Parse Active Tasks Table
18
+ const tasks = [];
19
+ const lines = content.split("\n");
20
+ let inTaskTable = false;
21
+ for (const line of lines) {
22
+ if (line.includes("| Trace ID | Task |")) {
23
+ inTaskTable = true;
24
+ continue;
25
+ }
26
+ if (inTaskTable && line.trim() === "") {
27
+ inTaskTable = false;
28
+ continue;
29
+ }
30
+ if (inTaskTable && line.startsWith("|") && !line.includes(":---")) {
31
+ const cols = line.split("|").map(c => c.trim()).filter(Boolean);
32
+ if (cols.length >= 5) {
33
+ tasks.push({
34
+ traceId: cols[0],
35
+ task: cols[1],
36
+ agent: cols[2],
37
+ priority: cols[3],
38
+ status: cols[4]
39
+ });
40
+ }
41
+ }
42
+ }
43
+ // Parse History Section
44
+ const history = [];
45
+ const historyParts = content.split(/##\s+HISTORY/i);
46
+ if (historyParts[1]) {
47
+ const histLines = historyParts[1].split("\n");
48
+ let currentItem = null;
49
+ for (const line of histLines) {
50
+ if (line.startsWith("###")) {
51
+ if (currentItem)
52
+ history.push(currentItem);
53
+ currentItem = { title: line.replace("###", "").trim(), body: [] };
54
+ }
55
+ else if (currentItem && line.trim() !== "") {
56
+ currentItem.body.push(line.trim());
57
+ }
58
+ }
59
+ if (currentItem)
60
+ history.push(currentItem);
61
+ }
62
+ return {
63
+ phase: phaseMatch ? phaseMatch[1].trim() : "PHASE_0",
64
+ traceId: traceMatch ? traceMatch[1].trim() : "N/A",
65
+ managerState: managerMatch ? managerMatch[1].trim() : "ACTIVE",
66
+ tasks,
67
+ history: history.slice(0, 15) // Return last 15 entries
68
+ };
69
+ }
70
+ catch (e) {
71
+ return { error: e instanceof Error ? e.message : String(e) };
72
+ }
73
+ }
74
+ export function readManagerLogs() {
75
+ const frameworkDir = getFrameworkDir();
76
+ if (!frameworkDir)
77
+ return [];
78
+ const logsPath = path.join(frameworkDir, "logs/manager.json");
79
+ if (!fs.existsSync(logsPath))
80
+ return [];
81
+ try {
82
+ const raw = fs.readFileSync(logsPath, "utf8");
83
+ // Handle both json array format and jsonl format
84
+ if (raw.trim().startsWith("[")) {
85
+ return JSON.parse(raw);
86
+ }
87
+ else {
88
+ return raw.split("\n").filter(Boolean).map(line => JSON.parse(line));
89
+ }
90
+ }
91
+ catch {
92
+ return [];
93
+ }
94
+ }
95
+ export function listAgents() {
96
+ const frameworkDir = getFrameworkDir();
97
+ if (!frameworkDir)
98
+ return [];
99
+ const agentsPath = path.join(frameworkDir, "agents");
100
+ if (!fs.existsSync(agentsPath))
101
+ return [];
102
+ try {
103
+ const files = fs.readdirSync(agentsPath).filter(f => f.endsWith(".json") && f !== "agent_army_schema.json");
104
+ return files.map(file => {
105
+ const content = JSON.parse(fs.readFileSync(path.join(agentsPath, file), "utf8"));
106
+ return {
107
+ name: content.name,
108
+ displayName: content.displayName || content.name,
109
+ description: content.description,
110
+ role: content.role,
111
+ capability: content.capability,
112
+ tags: content.tags || []
113
+ };
114
+ });
115
+ }
116
+ catch {
117
+ return [];
118
+ }
119
+ }
120
+ //# sourceMappingURL=data-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-service.js","sourceRoot":"","sources":["../../../../../src/cli/commands/dashboard/data-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Agent Enderun — Live Dashboard HTML Template
3
+ */
4
+ export declare const HTML_CONTENT = "\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Agent Enderun \u2014 Live Dashboard</title>\n <style>\n @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=Fira+Code:wght@400;500&display=swap');\n \n * {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n }\n\n body {\n background-color: #0b0c10;\n color: #c5c6c7;\n font-family: 'Inter', sans-serif;\n overflow-x: hidden;\n height: 100vh;\n display: flex;\n flex-direction: column;\n }\n\n /* Gradient background glows */\n body::before {\n content: '';\n position: absolute;\n width: 300px;\n height: 300px;\n background: radial-gradient(circle, rgba(139, 92, 246, 0.15) 0%, rgba(0,0,0,0) 70%);\n top: 10%;\n left: 5%;\n z-index: -1;\n pointer-events: none;\n }\n\n body::after {\n content: '';\n position: absolute;\n width: 400px;\n height: 400px;\n background: radial-gradient(circle, rgba(6, 182, 212, 0.1) 0%, rgba(0,0,0,0) 70%);\n bottom: 10%;\n right: 5%;\n z-index: -1;\n pointer-events: none;\n }\n\n header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 1.5rem 2rem;\n border-bottom: 1px solid rgba(255, 255, 255, 0.05);\n background: rgba(15, 17, 23, 0.7);\n backdrop-filter: blur(12px);\n }\n\n .logo-container {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n }\n\n .logo-icon {\n width: 32px;\n height: 32px;\n background: linear-gradient(135deg, #8b5cf6, #06b6d4);\n border-radius: 8px;\n box-shadow: 0 0 15px rgba(139, 92, 246, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n font-weight: 700;\n color: #fff;\n font-size: 1.1rem;\n }\n\n .logo-text {\n font-size: 1.25rem;\n font-weight: 700;\n background: linear-gradient(to right, #ffffff, #a5b4fc);\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n }\n\n .system-status {\n display: flex;\n align-items: center;\n gap: 1.5rem;\n font-size: 0.875rem;\n }\n\n .status-badge {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n background: rgba(16, 185, 129, 0.1);\n color: #10b981;\n padding: 0.35rem 0.75rem;\n border-radius: 9999px;\n border: 1px solid rgba(16, 185, 129, 0.2);\n font-weight: 500;\n }\n\n .status-dot {\n width: 8px;\n height: 8px;\n background-color: #10b981;\n border-radius: 50%;\n box-shadow: 0 0 8px #10b981;\n animation: pulse 1.8s infinite;\n }\n\n @keyframes pulse {\n 0% { transform: scale(0.9); opacity: 0.6; }\n 50% { transform: scale(1.1); opacity: 1; box-shadow: 0 0 12px #10b981; }\n 100% { transform: scale(0.9); opacity: 0.6; }\n }\n\n .main-layout {\n display: flex;\n flex: 1;\n padding: 1.5rem;\n gap: 1.5rem;\n height: calc(100vh - 80px);\n overflow: hidden;\n }\n\n /* Card panels */\n .panel {\n background: rgba(18, 20, 29, 0.6);\n border: 1px solid rgba(255, 255, 255, 0.05);\n border-radius: 16px;\n backdrop-filter: blur(16px);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);\n }\n\n .panel-header {\n padding: 1rem 1.25rem;\n border-bottom: 1px solid rgba(255, 255, 255, 0.05);\n display: flex;\n justify-content: space-between;\n align-items: center;\n font-weight: 600;\n font-size: 0.95rem;\n color: #ffffff;\n letter-spacing: 0.05em;\n text-transform: uppercase;\n }\n\n /* Left Panel - Agents list */\n .agents-panel {\n width: 300px;\n flex-shrink: 0;\n }\n\n .agent-list {\n padding: 1rem;\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n overflow-y: auto;\n flex: 1;\n }\n\n .agent-card {\n background: rgba(255, 255, 255, 0.02);\n border: 1px solid rgba(255, 255, 255, 0.03);\n border-radius: 10px;\n padding: 0.75rem 1rem;\n display: flex;\n align-items: center;\n justify-content: space-between;\n transition: all 0.25s ease;\n }\n\n .agent-card:hover {\n background: rgba(255, 255, 255, 0.04);\n border-color: rgba(139, 92, 246, 0.3);\n transform: translateX(4px);\n }\n\n .agent-info {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n }\n\n .agent-name {\n font-weight: 600;\n color: #e2e8f0;\n font-size: 0.9rem;\n }\n\n .agent-role {\n font-size: 0.75rem;\n color: #64748b;\n }\n\n .agent-state {\n display: flex;\n align-items: center;\n gap: 0.4rem;\n font-size: 0.75rem;\n font-weight: 600;\n padding: 0.25rem 0.5rem;\n border-radius: 6px;\n }\n\n .state-active { color: #10b981; background: rgba(16, 185, 129, 0.1); }\n .state-working { color: #f59e0b; background: rgba(245, 158, 11, 0.1); }\n .state-idle { color: #94a3b8; background: rgba(148, 163, 184, 0.1); }\n\n /* Middle Panel - Terminal Screen */\n .terminal-panel {\n flex: 1;\n display: flex;\n flex-direction: column;\n }\n\n .terminal-header-controls {\n display: flex;\n gap: 0.4rem;\n }\n\n .dot {\n width: 12px;\n height: 12px;\n border-radius: 50%;\n }\n .dot-red { background-color: #ef4444; }\n .dot-yellow { background-color: #f59e0b; }\n .dot-green { background-color: #10b981; }\n\n .terminal-screen {\n flex: 1;\n background: #050508;\n font-family: 'Fira Code', monospace;\n padding: 1.25rem;\n overflow-y: auto;\n font-size: 0.85rem;\n line-height: 1.6;\n color: #a7f3d0;\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n }\n\n .terminal-line {\n display: flex;\n gap: 0.5rem;\n align-items: flex-start;\n border-left: 2px solid transparent;\n padding-left: 0.5rem;\n }\n\n .line-timestamp {\n color: #64748b;\n flex-shrink: 0;\n font-size: 0.75rem;\n }\n\n .line-trace {\n color: #8b5cf6;\n font-weight: 600;\n flex-shrink: 0;\n font-size: 0.75rem;\n }\n\n .line-agent {\n color: #06b6d4;\n font-weight: 600;\n flex-shrink: 0;\n }\n\n .line-content {\n color: #e2e8f0;\n word-break: break-all;\n }\n\n .line-status-success {\n color: #10b981;\n font-weight: bold;\n }\n\n .line-status-failure {\n color: #ef4444;\n font-weight: bold;\n }\n\n /* Right Panel - Tasks & Metadata */\n .meta-panel {\n width: 320px;\n flex-shrink: 0;\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n background: transparent;\n border: none;\n box-shadow: none;\n overflow: visible;\n }\n\n .meta-card {\n background: rgba(18, 20, 29, 0.6);\n border: 1px solid rgba(255, 255, 255, 0.05);\n border-radius: 16px;\n backdrop-filter: blur(16px);\n padding: 1.25rem;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);\n }\n\n .meta-card-title {\n font-size: 0.85rem;\n font-weight: 600;\n color: #ffffff;\n letter-spacing: 0.05em;\n text-transform: uppercase;\n border-bottom: 1px solid rgba(255, 255, 255, 0.05);\n padding-bottom: 0.5rem;\n }\n\n /* Task layout */\n .task-list {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n }\n\n .task-item {\n background: rgba(255, 255, 255, 0.02);\n border: 1px solid rgba(255, 255, 255, 0.03);\n border-radius: 8px;\n padding: 0.75rem;\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n }\n\n .task-meta-top {\n display: flex;\n justify-content: space-between;\n align-items: center;\n font-size: 0.75rem;\n }\n\n .task-title {\n font-size: 0.825rem;\n font-weight: 500;\n color: #e2e8f0;\n }\n\n .task-agent-badge {\n color: #06b6d4;\n font-weight: 600;\n }\n\n .task-status-badge {\n font-size: 0.7rem;\n font-weight: bold;\n padding: 0.15rem 0.4rem;\n border-radius: 4px;\n text-transform: uppercase;\n }\n\n .status-inprogress { color: #3b82f6; background: rgba(59, 130, 246, 0.1); }\n .status-pending { color: #f59e0b; background: rgba(245, 158, 11, 0.1); }\n .status-completed { color: #10b981; background: rgba(16, 185, 129, 0.1); }\n\n /* Memory metrics */\n .metric-row {\n display: flex;\n flex-direction: column;\n gap: 0.4rem;\n }\n\n .metric-label-container {\n display: flex;\n justify-content: space-between;\n font-size: 0.8rem;\n color: #94a3b8;\n }\n\n .metric-bar-bg {\n height: 8px;\n background: rgba(255, 255, 255, 0.05);\n border-radius: 9999px;\n overflow: hidden;\n }\n\n .metric-bar-fill {\n height: 100%;\n background: linear-gradient(to right, #8b5cf6, #06b6d4);\n border-radius: 9999px;\n width: 0%;\n transition: width 0.5s ease;\n }\n\n /* Scrollbar styles */\n ::-webkit-scrollbar {\n width: 6px;\n }\n ::-webkit-scrollbar-track {\n background: transparent;\n }\n ::-webkit-scrollbar-thumb {\n background: rgba(255, 255, 255, 0.1);\n border-radius: 9999px;\n }\n ::-webkit-scrollbar-thumb:hover {\n background: rgba(255, 255, 255, 0.2);\n }\n\n </style>\n</head>\n<body>\n\n <header>\n <div class=\"logo-container\">\n <div class=\"logo-icon\">E</div>\n <div class=\"logo-text\">Agent Enderun Live Monitor</div>\n </div>\n <div class=\"system-status\">\n <div>Active Phase: <span id=\"system-phase\" style=\"color:#ffffff; font-weight:600;\">PHASE_0</span></div>\n <div>Trace ID: <span id=\"system-trace\" style=\"color:#8b5cf6; font-weight:600; font-family:'Fira Code',monospace;\">N/A</span></div>\n <div class=\"status-badge\">\n <span class=\"status-dot\"></span>\n <span>Live Connection</span>\n </div>\n </div>\n </header>\n\n <div class=\"main-layout\">\n \n <!-- Left Panel: Agents -->\n <div class=\"panel agents-panel\">\n <div class=\"panel-header\">\n <span>Army Agents</span>\n <span id=\"agents-online-count\" style=\"color: #10b981; font-size: 0.8rem;\">12 Online</span>\n </div>\n <div class=\"agent-list\" id=\"agent-list-container\">\n <!-- Dynamic Agents -->\n <div style=\"color:#64748b; font-size:0.875rem; text-align:center; padding:2rem;\">Loading...</div>\n </div>\n </div>\n\n <!-- Middle Panel: Terminal -->\n <div class=\"panel terminal-panel\">\n <div class=\"panel-header\">\n <span>Live Orchestration Logs</span>\n <div class=\"terminal-header-controls\">\n <span class=\"dot dot-red\"></span>\n <span class=\"dot dot-yellow\"></span>\n <span class=\"dot dot-green\"></span>\n </div>\n </div>\n <div class=\"terminal-screen\" id=\"terminal-screen-container\">\n <div class=\"terminal-line\">\n <span class=\"line-content\">> Initializing Agent Enderun orchestrator...</span>\n </div>\n </div>\n </div>\n\n <!-- Right Panel: Tasks & System Status -->\n <div class=\"meta-panel\">\n \n <!-- Active Tasks -->\n <div class=\"meta-card\">\n <div class=\"meta-card-title\">Active Tasks</div>\n <div class=\"task-list\" id=\"task-list-container\">\n <div style=\"color:#64748b; font-size:0.825rem; text-align:center; padding:1rem;\">No active tasks</div>\n </div>\n </div>\n\n <!-- Project Memory State -->\n <div class=\"meta-card\">\n <div class=\"meta-card-title\">Project Memory State</div>\n <div class=\"metric-row\">\n <div class=\"metric-label-container\">\n <span>Agent Compliance</span>\n <span id=\"metric-compliance\">100%</span>\n </div>\n <div class=\"metric-bar-bg\">\n <div class=\"metric-bar-fill\" id=\"compliance-bar\" style=\"width: 100%;\"></div>\n </div>\n </div>\n <div class=\"metric-row\">\n <div class=\"metric-label-container\">\n <span>Completed Tasks</span>\n <span id=\"metric-tasks-done\">100%</span>\n </div>\n <div class=\"metric-bar-bg\">\n <div class=\"metric-bar-fill\" id=\"tasks-done-bar\" style=\"width: 100%; background: linear-gradient(to right, #10b981, #059669);\"></div>\n </div>\n </div>\n </div>\n\n </div>\n\n </div>\n\n <script>\n const API_STATUS = '/api/status';\n const API_AGENTS = '/api/agents';\n\n // Predefined list of Agent Enderun core agents to ensure we display all 12 correctly\n const CORE_AGENTS = [\n { name: \"manager\", role: \"CTO / Orchestrator\", status: \"state-active\", stateLabel: \"Active\" },\n { name: \"backend\", role: \"Logic & API Specialist\", status: \"state-idle\", stateLabel: \"Idle\" },\n { name: \"frontend\", role: \"UI & UX Specialist\", status: \"state-idle\", stateLabel: \"Idle\" },\n { name: \"database\", role: \"SQL & Migration Specialist\", status: \"state-idle\", stateLabel: \"Idle\" },\n { name: \"quality\", role: \"QA & Compliance Specialist\", status: \"state-idle\", stateLabel: \"Idle\" },\n { name: \"devops\", role: \"CI/CD & Deploy Specialist\", status: \"state-idle\", stateLabel: \"Idle\" },\n { name: \"security\", role: \"Crypt & RLS Specialist\", status: \"state-idle\", stateLabel: \"Idle\" },\n { name: \"explorer\", role: \"Code Discovery Specialist\", status: \"state-idle\", stateLabel: \"Idle\" },\n { name: \"git\", role: \"Version Control Specialist\", status: \"state-idle\", stateLabel: \"Idle\" },\n { name: \"analyst\", role: \"Specs Verification Specialist\", status: \"state-idle\", stateLabel: \"Idle\" },\n { name: \"mobile\", role: \"Mobile Specialist\", status: \"state-idle\", stateLabel: \"Idle\" },\n { name: \"native\", role: \"Desktop wrapper Specialist\", status: \"state-idle\", stateLabel: \"Idle\" }\n ];\n\n let loadedAgents = [];\n\n async function fetchAgents() {\n try {\n const res = await fetch(API_AGENTS);\n loadedAgents = await res.json();\n renderAgents();\n } catch (e) {\n console.error(\"Agents fetch error\", e);\n renderAgents(); // Fallback to core agents list\n }\n }\n\n function renderAgents(activeAgentName = null) {\n const container = document.getElementById('agent-list-container');\n container.innerHTML = '';\n\n const displayList = CORE_AGENTS.map(core => {\n const found = loadedAgents.find(l => l.name === core.name);\n return {\n name: core.name,\n role: found ? found.role : core.role,\n displayName: found ? found.displayName : core.name.toUpperCase()\n };\n });\n\n displayList.forEach(agent => {\n let stateClass = 'state-idle';\n let stateLabel = 'Idle';\n\n if (agent.name === 'manager') {\n stateClass = 'state-active';\n stateLabel = 'Active';\n }\n \n if (activeAgentName && agent.name === activeAgentName.replace('@', '').toLowerCase()) {\n stateClass = 'state-working';\n stateLabel = 'Working';\n }\n\n const card = document.createElement('div');\n card.className = 'agent-card';\n card.innerHTML = `\n <div class=\"agent-info\">\n <span class=\"agent-name\">@${agent.name}</span>\n <span class=\"agent-role\">${agent.role}</span>\n </div>\n <span class=\"agent-state ${stateClass}\">${stateLabel}</span>\n `;\n container.appendChild(card);\n });\n\n document.getElementById('agents-online-count').innerText = `${displayList.length} Online`;\n }\n\n let renderedLogTimestamps = new Set();\n\n async function fetchStatus() {\n try {\n const res = await fetch(API_STATUS);\n const data = await res.json();\n\n if (data.error) {\n console.error(\"API error\", data.error);\n return;\n }\n\n // Update Header Status\n document.getElementById('system-phase').innerText = data.phase || 'PHASE_0';\n document.getElementById('system-trace').innerText = data.traceId || 'N/A';\n\n // Update Active Tasks\n const taskContainer = document.getElementById('task-list-container');\n if (data.tasks && data.tasks.length > 0) {\n taskContainer.innerHTML = '';\n data.tasks.forEach(task => {\n const statusClass = task.status.toLowerCase().includes('progress') ? 'status-inprogress' \n : task.status.toLowerCase().includes('pending') ? 'status-pending' \n : 'status-completed';\n const item = document.createElement('div');\n item.className = 'task-item';\n item.innerHTML = `\n <div class=\"task-meta-top\">\n <span class=\"task-agent-badge\">${task.agent}</span>\n <span class=\"task-status-badge ${statusClass}\">${task.status}</span>\n </div>\n <span class=\"task-title\">${task.task}</span>\n `;\n taskContainer.appendChild(item);\n });\n } else {\n taskContainer.innerHTML = '<div style=\"color:#64748b; font-size:0.825rem; text-align:center; padding:1rem;\">No active tasks</div>';\n }\n\n // Update Terminal logs dynamically with manager.json\n const terminal = document.getElementById('terminal-screen-container');\n \n if (data.logs && data.logs.length > 0) {\n // Filter and append new logs\n let activeAgent = null;\n data.logs.forEach(log => {\n const uniqueKey = log.timestamp + '-' + log.action;\n if (!renderedLogTimestamps.has(uniqueKey)) {\n renderedLogTimestamps.add(uniqueKey);\n \n const line = document.createElement('div');\n line.className = 'terminal-line';\n \n const cleanTime = new Date(log.timestamp).toLocaleTimeString();\n const cleanTrace = log.requestId ? log.requestId.slice(0, 8) : 'T-000';\n \n const statusColorClass = log.status === 'SUCCESS' ? 'line-status-success' : 'line-status-failure';\n \n line.innerHTML = `\n <span class=\"line-timestamp\">[${cleanTime}]</span>\n <span class=\"line-trace\">[TR-${cleanTrace}]</span>\n <span class=\"line-agent\">${log.agent}:</span>\n <span class=\"line-content\">${log.summary} <span class=\"${statusColorClass}\">[${log.status}]</span></span>\n `;\n terminal.appendChild(line);\n terminal.scrollTop = terminal.scrollHeight;\n \n activeAgent = log.agent;\n }\n });\n\n if (activeAgent) {\n renderAgents(activeAgent);\n }\n } else if (data.history && data.history.length > 0) {\n // Fallback to parsed project memory history\n data.history.forEach(hist => {\n const uniqueKey = hist.title;\n if (!renderedLogTimestamps.has(uniqueKey)) {\n renderedLogTimestamps.add(uniqueKey);\n \n const line = document.createElement('div');\n line.className = 'terminal-line';\n line.innerHTML = `\n <span class=\"line-timestamp\">[MEMORY]</span>\n <span class=\"line-agent\">\u270F\uFE0F ${hist.title}:</span>\n <span class=\"line-content\">${hist.body.join(' ')}</span>\n `;\n terminal.appendChild(line);\n terminal.scrollTop = terminal.scrollHeight;\n }\n });\n }\n } catch (e) {\n console.error(\"Status fetch error\", e);\n }\n }\n\n // Initialize and Start Polling\n fetchAgents().then(() => {\n fetchStatus();\n setInterval(fetchStatus, 2000);\n });\n </script>\n</body>\n</html>\n";