genoma-evolution 1.0.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 (445) hide show
  1. package/.brv/.obsidian/app.json +1 -0
  2. package/.brv/.obsidian/appearance.json +1 -0
  3. package/.brv/.obsidian/core-plugins.json +33 -0
  4. package/.brv/.obsidian/graph.json +22 -0
  5. package/.brv/.obsidian/workspace.json +195 -0
  6. package/.brv/Sin ti/314/201tulo 1.canvas" +1 -0
  7. package/.brv/Sin ti/314/201tulo 2.canvas" +1 -0
  8. package/.brv/Sin ti/314/201tulo.canvas" +1 -0
  9. package/.brv/_queue_status.json +1 -0
  10. package/.brv/config.json +5 -0
  11. package/.brv/context-tree/_index.md +60 -0
  12. package/.brv/context-tree/_manifest.json +165 -0
  13. package/.brv/context-tree/backend/_index.md +24 -0
  14. package/.brv/context-tree/backend/backend/_index.md +40 -0
  15. package/.brv/context-tree/backend/backend/init.abstract.md +0 -0
  16. package/.brv/context-tree/backend/backend/init.md +27 -0
  17. package/.brv/context-tree/backend/backend/init.overview.md +29 -0
  18. package/.brv/context-tree/backend/backend/job_tracker.abstract.md +1 -0
  19. package/.brv/context-tree/backend/backend/job_tracker.md +273 -0
  20. package/.brv/context-tree/backend/backend/job_tracker.overview.md +31 -0
  21. package/.brv/context-tree/backend/backend/main.abstract.md +0 -0
  22. package/.brv/context-tree/backend/backend/main.md +1292 -0
  23. package/.brv/context-tree/backend/backend/main.overview.md +30 -0
  24. package/.brv/context-tree/backend/backend/requirements.abstract.md +1 -0
  25. package/.brv/context-tree/backend/backend/requirements.md +37 -0
  26. package/.brv/context-tree/backend/backend/requirements.overview.md +28 -0
  27. package/.brv/context-tree/docs/_index.md +37 -0
  28. package/.brv/context-tree/docs/api/_index.md +54 -0
  29. package/.brv/context-tree/docs/api/context.md +11 -0
  30. package/.brv/context-tree/docs/api/hermes_api_openapi_specification.abstract.md +0 -0
  31. package/.brv/context-tree/docs/api/hermes_api_openapi_specification.md +468 -0
  32. package/.brv/context-tree/docs/api/hermes_api_openapi_specification.overview.md +44 -0
  33. package/.brv/context-tree/frontend/_index.md +48 -0
  34. package/.brv/context-tree/frontend/hermes_dashboard/_index.md +31 -0
  35. package/.brv/context-tree/frontend/hermes_dashboard/architecture_overview.abstract.md +0 -0
  36. package/.brv/context-tree/frontend/hermes_dashboard/architecture_overview.md +41 -0
  37. package/.brv/context-tree/frontend/hermes_dashboard/architecture_overview.overview.md +34 -0
  38. package/.brv/context-tree/frontend/src/_index.md +53 -0
  39. package/.brv/context-tree/frontend/src/components/_index.md +52 -0
  40. package/.brv/context-tree/frontend/src/components/sidebar_navigation_component.abstract.md +0 -0
  41. package/.brv/context-tree/frontend/src/components/sidebar_navigation_component.md +161 -0
  42. package/.brv/context-tree/frontend/src/components/sidebar_navigation_component.overview.md +32 -0
  43. package/.brv/context-tree/frontend/src/context.md +10 -0
  44. package/.brv/context-tree/frontend/src/functioncallingpage.abstract.md +0 -0
  45. package/.brv/context-tree/frontend/src/functioncallingpage.md +34 -0
  46. package/.brv/context-tree/frontend/src/functioncallingpage.overview.md +26 -0
  47. package/.brv/context-tree/frontend/src/lib/_index.md +48 -0
  48. package/.brv/context-tree/frontend/src/lib/api_client_library.abstract.md +1 -0
  49. package/.brv/context-tree/frontend/src/lib/api_client_library.md +403 -0
  50. package/.brv/context-tree/frontend/src/lib/api_client_library.overview.md +69 -0
  51. package/.brv/context-tree/frontend/src/page.abstract.md +0 -0
  52. package/.brv/context-tree/frontend/src/page.md +103 -0
  53. package/.brv/context-tree/frontend/src/page.overview.md +7 -0
  54. package/.brv/context-tree/frontend/src/settingspage.abstract.md +0 -0
  55. package/.brv/context-tree/frontend/src/settingspage.md +124 -0
  56. package/.brv/context-tree/frontend/src/settingspage.overview.md +34 -0
  57. package/.brv/context-tree/frontend/src/sidebar.abstract.md +0 -0
  58. package/.brv/context-tree/frontend/src/sidebar.md +170 -0
  59. package/.brv/context-tree/frontend/src/sidebar.overview.md +25 -0
  60. package/.brv/context-tree/meta/_index.md +24 -0
  61. package/.brv/context-tree/meta/curation_context/_index.md +24 -0
  62. package/.brv/context-tree/meta/curation_context/empty_context.abstract.md +4 -0
  63. package/.brv/context-tree/meta/curation_context/empty_context.md +35 -0
  64. package/.brv/context-tree/meta/curation_context/empty_context.overview.md +20 -0
  65. package/.brv/dream-log/drm-1777341062653.json +33 -0
  66. package/.brv/dream-state.json +8 -0
  67. package/.brv/dream.lock +0 -0
  68. package/.brv/review-backups/docs/api/hermes_api_openapi_specification.md +468 -0
  69. package/.claude/settings.local.json +7 -0
  70. package/.claude/worktrees/phase-2-mcp/.brv/.obsidian/app.json +1 -0
  71. package/.claude/worktrees/phase-2-mcp/.brv/.obsidian/appearance.json +1 -0
  72. package/.claude/worktrees/phase-2-mcp/.brv/.obsidian/core-plugins.json +33 -0
  73. package/.claude/worktrees/phase-2-mcp/.brv/.obsidian/graph.json +22 -0
  74. package/.claude/worktrees/phase-2-mcp/.brv/.obsidian/workspace.json +195 -0
  75. package/.claude/worktrees/phase-2-mcp/.brv/Sin t/303/255tulo 1.canvas" +1 -0
  76. package/.claude/worktrees/phase-2-mcp/.brv/Sin t/303/255tulo 2.canvas" +1 -0
  77. package/.claude/worktrees/phase-2-mcp/.brv/Sin t/303/255tulo.canvas" +1 -0
  78. package/.claude/worktrees/phase-2-mcp/.brv/_queue_status.json +1 -0
  79. package/.claude/worktrees/phase-2-mcp/.brv/config.json +5 -0
  80. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/_index.md +60 -0
  81. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/_manifest.json +165 -0
  82. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/_index.md +24 -0
  83. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/backend/_index.md +40 -0
  84. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/backend/init.abstract.md +0 -0
  85. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/backend/init.md +27 -0
  86. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/backend/init.overview.md +29 -0
  87. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/backend/job_tracker.abstract.md +1 -0
  88. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/backend/job_tracker.md +273 -0
  89. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/backend/job_tracker.overview.md +31 -0
  90. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/backend/main.abstract.md +0 -0
  91. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/backend/main.md +1292 -0
  92. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/backend/main.overview.md +30 -0
  93. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/backend/requirements.abstract.md +1 -0
  94. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/backend/requirements.md +37 -0
  95. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/backend/requirements.overview.md +28 -0
  96. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/docs/_index.md +37 -0
  97. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/docs/api/_index.md +54 -0
  98. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/docs/api/context.md +11 -0
  99. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/docs/api/hermes_api_openapi_specification.abstract.md +0 -0
  100. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/docs/api/hermes_api_openapi_specification.md +468 -0
  101. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/docs/api/hermes_api_openapi_specification.overview.md +44 -0
  102. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/_index.md +48 -0
  103. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/hermes_dashboard/_index.md +31 -0
  104. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/hermes_dashboard/architecture_overview.abstract.md +0 -0
  105. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/hermes_dashboard/architecture_overview.md +41 -0
  106. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/hermes_dashboard/architecture_overview.overview.md +34 -0
  107. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/_index.md +53 -0
  108. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/components/_index.md +52 -0
  109. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/components/sidebar_navigation_component.abstract.md +0 -0
  110. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/components/sidebar_navigation_component.md +161 -0
  111. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/components/sidebar_navigation_component.overview.md +32 -0
  112. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/context.md +10 -0
  113. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/functioncallingpage.abstract.md +0 -0
  114. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/functioncallingpage.md +34 -0
  115. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/functioncallingpage.overview.md +26 -0
  116. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/lib/_index.md +48 -0
  117. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/lib/api_client_library.abstract.md +1 -0
  118. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/lib/api_client_library.md +403 -0
  119. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/lib/api_client_library.overview.md +69 -0
  120. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/page.abstract.md +0 -0
  121. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/page.md +103 -0
  122. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/page.overview.md +7 -0
  123. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/settingspage.abstract.md +0 -0
  124. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/settingspage.md +124 -0
  125. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/settingspage.overview.md +34 -0
  126. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/sidebar.abstract.md +0 -0
  127. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/sidebar.md +170 -0
  128. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/sidebar.overview.md +25 -0
  129. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/meta/_index.md +24 -0
  130. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/meta/curation_context/_index.md +24 -0
  131. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/meta/curation_context/empty_context.abstract.md +4 -0
  132. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/meta/curation_context/empty_context.md +35 -0
  133. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/meta/curation_context/empty_context.overview.md +20 -0
  134. package/.claude/worktrees/phase-2-mcp/.brv/dream-log/drm-1777341062653.json +33 -0
  135. package/.claude/worktrees/phase-2-mcp/.brv/dream-state.json +8 -0
  136. package/.claude/worktrees/phase-2-mcp/.brv/dream.lock +0 -0
  137. package/.claude/worktrees/phase-2-mcp/.brv/review-backups/docs/api/hermes_api_openapi_specification.md +468 -0
  138. package/.claude/worktrees/phase-2-mcp/.claude/settings.local.json +13 -0
  139. package/.claude/worktrees/phase-2-mcp/.kilocode/package-lock.json +378 -0
  140. package/.claude/worktrees/phase-2-mcp/.kilocode/package.json +5 -0
  141. package/.claude/worktrees/phase-2-mcp/AGENTS.md +5 -0
  142. package/.claude/worktrees/phase-2-mcp/CLAUDE.md +29 -0
  143. package/.claude/worktrees/phase-2-mcp/QA_AUDIT_PLAN.md +156 -0
  144. package/.claude/worktrees/phase-2-mcp/README.md +316 -0
  145. package/.claude/worktrees/phase-2-mcp/agent-agnostic-evolution-dashboard.md +405 -0
  146. package/.claude/worktrees/phase-2-mcp/backend/__init__.py +0 -0
  147. package/.claude/worktrees/phase-2-mcp/backend/collectors/__init__.py +0 -0
  148. package/.claude/worktrees/phase-2-mcp/backend/collectors/claude_code_collector.py +277 -0
  149. package/.claude/worktrees/phase-2-mcp/backend/collectors/hermes_collector.py +68 -0
  150. package/.claude/worktrees/phase-2-mcp/backend/curator.py +512 -0
  151. package/.claude/worktrees/phase-2-mcp/backend/eval/__init__.py +19 -0
  152. package/.claude/worktrees/phase-2-mcp/backend/eval/engine.py +116 -0
  153. package/.claude/worktrees/phase-2-mcp/backend/eval/scorers.py +201 -0
  154. package/.claude/worktrees/phase-2-mcp/backend/generate_dataset.py +86 -0
  155. package/.claude/worktrees/phase-2-mcp/backend/job_tracker.py +232 -0
  156. package/.claude/worktrees/phase-2-mcp/backend/main.py +1746 -0
  157. package/.claude/worktrees/phase-2-mcp/backend/mcp_server.py +250 -0
  158. package/.claude/worktrees/phase-2-mcp/backend/promethean/__init__.py +24 -0
  159. package/.claude/worktrees/phase-2-mcp/backend/promethean/cycle_orchestrator.py +270 -0
  160. package/.claude/worktrees/phase-2-mcp/backend/promethean/delta_validator.py +191 -0
  161. package/.claude/worktrees/phase-2-mcp/backend/promethean/dspy_compiler.py +315 -0
  162. package/.claude/worktrees/phase-2-mcp/backend/promethean/gepa_strategist.py +213 -0
  163. package/.claude/worktrees/phase-2-mcp/backend/promethean/models.py +260 -0
  164. package/.claude/worktrees/phase-2-mcp/backend/promethean/skill_deployer.py +195 -0
  165. package/.claude/worktrees/phase-2-mcp/backend/promethean/trace_ingestion.py +142 -0
  166. package/.claude/worktrees/phase-2-mcp/backend/requirements.txt +6 -0
  167. package/.claude/worktrees/phase-2-mcp/backend/sdd_evolve.py +459 -0
  168. package/.claude/worktrees/phase-2-mcp/backend/skill_detector.py +227 -0
  169. package/.claude/worktrees/phase-2-mcp/backend/skill_registry.py +289 -0
  170. package/.claude/worktrees/phase-2-mcp/backend/storage/__init__.py +5 -0
  171. package/.claude/worktrees/phase-2-mcp/backend/storage/run_store.py +393 -0
  172. package/.claude/worktrees/phase-2-mcp/backend/storage/schema.sql +99 -0
  173. package/.claude/worktrees/phase-2-mcp/backend/validate_evolution.py +267 -0
  174. package/.claude/worktrees/phase-2-mcp/components.json +28 -0
  175. package/.claude/worktrees/phase-2-mcp/docs/api/hermes-api.openapi.yaml +438 -0
  176. package/.claude/worktrees/phase-2-mcp/docs/hero.svg +148 -0
  177. package/.claude/worktrees/phase-2-mcp/eslint.config.mjs +18 -0
  178. package/.claude/worktrees/phase-2-mcp/install.sh +245 -0
  179. package/.claude/worktrees/phase-2-mcp/next-env.d.ts +6 -0
  180. package/.claude/worktrees/phase-2-mcp/next.config.ts +32 -0
  181. package/.claude/worktrees/phase-2-mcp/package-lock.json +11936 -0
  182. package/.claude/worktrees/phase-2-mcp/package.json +41 -0
  183. package/.claude/worktrees/phase-2-mcp/pnpm-workspace.yaml +4 -0
  184. package/.claude/worktrees/phase-2-mcp/postcss.config.mjs +7 -0
  185. package/.claude/worktrees/phase-2-mcp/public/file.svg +1 -0
  186. package/.claude/worktrees/phase-2-mcp/public/fonts/SF-Pro-Display-Bold.otf +0 -0
  187. package/.claude/worktrees/phase-2-mcp/public/fonts/SF-Pro-Display-Heavy.otf +0 -0
  188. package/.claude/worktrees/phase-2-mcp/public/fonts/SF-Pro-Display-Medium.otf +0 -0
  189. package/.claude/worktrees/phase-2-mcp/public/fonts/SF-Pro-Display-Regular.otf +0 -0
  190. package/.claude/worktrees/phase-2-mcp/public/fonts/SF-Pro-Display-Semibold.otf +0 -0
  191. package/.claude/worktrees/phase-2-mcp/public/fonts/SF-Pro-Text-Bold.otf +0 -0
  192. package/.claude/worktrees/phase-2-mcp/public/fonts/SF-Pro-Text-Heavy.otf +0 -0
  193. package/.claude/worktrees/phase-2-mcp/public/fonts/SF-Pro-Text-Medium.otf +0 -0
  194. package/.claude/worktrees/phase-2-mcp/public/fonts/SF-Pro-Text-Regular.otf +0 -0
  195. package/.claude/worktrees/phase-2-mcp/public/fonts/SF-Pro-Text-Semibold.otf +0 -0
  196. package/.claude/worktrees/phase-2-mcp/public/globe.svg +1 -0
  197. package/.claude/worktrees/phase-2-mcp/public/next.svg +1 -0
  198. package/.claude/worktrees/phase-2-mcp/public/theme-preview.html +257 -0
  199. package/.claude/worktrees/phase-2-mcp/public/vercel.svg +1 -0
  200. package/.claude/worktrees/phase-2-mcp/public/window.svg +1 -0
  201. package/.claude/worktrees/phase-2-mcp/run.sh +26 -0
  202. package/.claude/worktrees/phase-2-mcp/skills-lock.json +10 -0
  203. package/.claude/worktrees/phase-2-mcp/specs/event-schema.md +223 -0
  204. package/.claude/worktrees/phase-2-mcp/specs/examples/run.jsonl +3 -0
  205. package/.claude/worktrees/phase-2-mcp/src/app/api/[...path]/route.ts +55 -0
  206. package/.claude/worktrees/phase-2-mcp/src/app/api/auth/token/route.ts +22 -0
  207. package/.claude/worktrees/phase-2-mcp/src/app/evolution/page.tsx +589 -0
  208. package/.claude/worktrees/phase-2-mcp/src/app/favicon.ico +0 -0
  209. package/.claude/worktrees/phase-2-mcp/src/app/globals.css +321 -0
  210. package/.claude/worktrees/phase-2-mcp/src/app/layout.tsx +63 -0
  211. package/.claude/worktrees/phase-2-mcp/src/app/page.tsx +70 -0
  212. package/.claude/worktrees/phase-2-mcp/src/app/skills/page.tsx +369 -0
  213. package/.claude/worktrees/phase-2-mcp/src/components/ApiConfigCard.tsx +199 -0
  214. package/.claude/worktrees/phase-2-mcp/src/components/ColorBends.css +1 -0
  215. package/.claude/worktrees/phase-2-mcp/src/components/ColorBends.d.ts +1 -0
  216. package/.claude/worktrees/phase-2-mcp/src/components/ColorBends.jsx +1 -0
  217. package/.claude/worktrees/phase-2-mcp/src/components/CoreLoopToggle.tsx +111 -0
  218. package/.claude/worktrees/phase-2-mcp/src/components/EnvironmentStatus.tsx +176 -0
  219. package/.claude/worktrees/phase-2-mcp/src/components/EvolutionBackground.tsx +1 -0
  220. package/.claude/worktrees/phase-2-mcp/src/components/ReactQueryProvider.tsx +24 -0
  221. package/.claude/worktrees/phase-2-mcp/src/components/Sidebar.tsx +247 -0
  222. package/.claude/worktrees/phase-2-mcp/src/components/SkillDiffViewer.tsx +154 -0
  223. package/.claude/worktrees/phase-2-mcp/src/components/ThemeAwareBackground.tsx +67 -0
  224. package/.claude/worktrees/phase-2-mcp/src/components/ThemeToggle.tsx +54 -0
  225. package/.claude/worktrees/phase-2-mcp/src/components/WelcomeHero.tsx +77 -0
  226. package/.claude/worktrees/phase-2-mcp/src/components/bits/ClickSpark.tsx +116 -0
  227. package/.claude/worktrees/phase-2-mcp/src/components/bits/CountUp.tsx +98 -0
  228. package/.claude/worktrees/phase-2-mcp/src/components/bits/DarkSelect.tsx +95 -0
  229. package/.claude/worktrees/phase-2-mcp/src/components/bits/DecryptedText.tsx +161 -0
  230. package/.claude/worktrees/phase-2-mcp/src/components/bits/ElectricBorder.tsx +184 -0
  231. package/.claude/worktrees/phase-2-mcp/src/components/bits/GlitchText.tsx +34 -0
  232. package/.claude/worktrees/phase-2-mcp/src/components/bits/ShinyText.tsx +55 -0
  233. package/.claude/worktrees/phase-2-mcp/src/components/bits/SpotlightCard.tsx +42 -0
  234. package/.claude/worktrees/phase-2-mcp/src/components/bits/TextType.tsx +95 -0
  235. package/.claude/worktrees/phase-2-mcp/src/components/bits/index.ts +9 -0
  236. package/.claude/worktrees/phase-2-mcp/src/components/pages/CuratorPage.tsx +632 -0
  237. package/.claude/worktrees/phase-2-mcp/src/components/pages/DatasetPage.tsx +271 -0
  238. package/.claude/worktrees/phase-2-mcp/src/components/pages/EvolutionPage.tsx +676 -0
  239. package/.claude/worktrees/phase-2-mcp/src/components/pages/FunctionCallingPage.tsx +1 -0
  240. package/.claude/worktrees/phase-2-mcp/src/components/pages/LogsPage.tsx +272 -0
  241. package/.claude/worktrees/phase-2-mcp/src/components/pages/MetricsPage.tsx +246 -0
  242. package/.claude/worktrees/phase-2-mcp/src/components/pages/OverviewPage.tsx +420 -0
  243. package/.claude/worktrees/phase-2-mcp/src/components/pages/SettingsPage.tsx +88 -0
  244. package/.claude/worktrees/phase-2-mcp/src/components/pages/SkillStudioPage.tsx +376 -0
  245. package/.claude/worktrees/phase-2-mcp/src/components/ui/animated-theme-toggler.tsx +97 -0
  246. package/.claude/worktrees/phase-2-mcp/src/components/ui/button.tsx +67 -0
  247. package/.claude/worktrees/phase-2-mcp/src/components/ui/card.tsx +103 -0
  248. package/.claude/worktrees/phase-2-mcp/src/components/ui/input.tsx +19 -0
  249. package/.claude/worktrees/phase-2-mcp/src/components/ui/separator.tsx +28 -0
  250. package/.claude/worktrees/phase-2-mcp/src/components/ui/sheet.tsx +147 -0
  251. package/.claude/worktrees/phase-2-mcp/src/components/ui/sidebar.tsx +702 -0
  252. package/.claude/worktrees/phase-2-mcp/src/components/ui/skeleton.tsx +13 -0
  253. package/.claude/worktrees/phase-2-mcp/src/components/ui/theme-toggle.tsx +272 -0
  254. package/.claude/worktrees/phase-2-mcp/src/components/ui/tooltip.tsx +57 -0
  255. package/.claude/worktrees/phase-2-mcp/src/hooks/use-mobile.ts +19 -0
  256. package/.claude/worktrees/phase-2-mcp/src/lib/api.ts +455 -0
  257. package/.claude/worktrees/phase-2-mcp/src/lib/queryClient.ts +12 -0
  258. package/.claude/worktrees/phase-2-mcp/src/lib/utils.ts +6 -0
  259. package/.claude/worktrees/phase-2-mcp/stitch/agent_dashboard/DESIGN_SPEC.md +521 -0
  260. package/.claude/worktrees/phase-2-mcp/stitch/agent_dashboard/prototype.html +676 -0
  261. package/.claude/worktrees/phase-2-mcp/stitch/curator_workspace/code.html +448 -0
  262. package/.claude/worktrees/phase-2-mcp/stitch/curator_workspace/screen.png +0 -0
  263. package/.claude/worktrees/phase-2-mcp/stitch/datasets/code.html +479 -0
  264. package/.claude/worktrees/phase-2-mcp/stitch/datasets/screen.png +0 -0
  265. package/.claude/worktrees/phase-2-mcp/stitch/evolution_history/code.html +461 -0
  266. package/.claude/worktrees/phase-2-mcp/stitch/evolution_history/screen.png +0 -0
  267. package/.claude/worktrees/phase-2-mcp/stitch/hermes_dashboard/DESIGN.md +192 -0
  268. package/.claude/worktrees/phase-2-mcp/stitch/hermes_dashboard/DESIGN_SPEC.md +455 -0
  269. package/.claude/worktrees/phase-2-mcp/stitch/hermes_overview/code.html +399 -0
  270. package/.claude/worktrees/phase-2-mcp/stitch/hermes_overview/screen.png +0 -0
  271. package/.claude/worktrees/phase-2-mcp/stitch/live_logs/code.html +324 -0
  272. package/.claude/worktrees/phase-2-mcp/stitch/live_logs/screen.png +0 -0
  273. package/.claude/worktrees/phase-2-mcp/stitch/skill_hub/code.html +596 -0
  274. package/.claude/worktrees/phase-2-mcp/stitch/skill_hub/screen.png +0 -0
  275. package/.claude/worktrees/phase-2-mcp/stitch/system_metrics/code.html +527 -0
  276. package/.claude/worktrees/phase-2-mcp/stitch/system_metrics/screen.png +0 -0
  277. package/.claude/worktrees/phase-2-mcp/stitch/system_settings/code.html +257 -0
  278. package/.claude/worktrees/phase-2-mcp/stitch/system_settings/screen.png +0 -0
  279. package/.claude/worktrees/phase-2-mcp/test_dashboard.py +201 -0
  280. package/.claude/worktrees/phase-2-mcp/tests/collectors/__init__.py +0 -0
  281. package/.claude/worktrees/phase-2-mcp/tests/collectors/fixtures/sample_session.jsonl +7 -0
  282. package/.claude/worktrees/phase-2-mcp/tests/collectors/test_claude_code_collector.py +171 -0
  283. package/.claude/worktrees/phase-2-mcp/tests/collectors/test_hermes_collector.py +167 -0
  284. package/.claude/worktrees/phase-2-mcp/tests/eval/test_engine.py +234 -0
  285. package/.claude/worktrees/phase-2-mcp/tests/eval/test_scorers.py +249 -0
  286. package/.claude/worktrees/phase-2-mcp/tests/storage/__init__.py +0 -0
  287. package/.claude/worktrees/phase-2-mcp/tests/storage/test_run_store.py +359 -0
  288. package/.claude/worktrees/phase-2-mcp/tests/test_curator.py +559 -0
  289. package/.claude/worktrees/phase-2-mcp/tests/test_mcp_server.py +114 -0
  290. package/.claude/worktrees/phase-2-mcp/tsconfig.json +34 -0
  291. package/.env.example +72 -0
  292. package/.kilocode/package-lock.json +378 -0
  293. package/.kilocode/package.json +5 -0
  294. package/AGENTS.md +5 -0
  295. package/CLAUDE.md +29 -0
  296. package/QA_AUDIT_PLAN.md +156 -0
  297. package/README.md +355 -0
  298. package/agent-agnostic-evolution-dashboard.md +405 -0
  299. package/backend/__init__.py +0 -0
  300. package/backend/collectors/__init__.py +0 -0
  301. package/backend/collectors/claude_code_collector.py +277 -0
  302. package/backend/collectors/hermes_collector.py +68 -0
  303. package/backend/curator.py +512 -0
  304. package/backend/eval/__init__.py +19 -0
  305. package/backend/eval/engine.py +116 -0
  306. package/backend/eval/scorers.py +201 -0
  307. package/backend/generate_dataset.py +86 -0
  308. package/backend/job_tracker.py +232 -0
  309. package/backend/main.py +1746 -0
  310. package/backend/mcp_server.py +250 -0
  311. package/backend/promethean/__init__.py +24 -0
  312. package/backend/promethean/cycle_orchestrator.py +270 -0
  313. package/backend/promethean/delta_validator.py +191 -0
  314. package/backend/promethean/dspy_compiler.py +315 -0
  315. package/backend/promethean/gepa_strategist.py +213 -0
  316. package/backend/promethean/models.py +260 -0
  317. package/backend/promethean/skill_deployer.py +195 -0
  318. package/backend/promethean/trace_ingestion.py +142 -0
  319. package/backend/requirements.txt +6 -0
  320. package/backend/sdd_evolve.py +459 -0
  321. package/backend/skill_detector.py +227 -0
  322. package/backend/skill_registry.py +289 -0
  323. package/backend/storage/__init__.py +5 -0
  324. package/backend/storage/run_store.py +393 -0
  325. package/backend/storage/schema.sql +99 -0
  326. package/backend/validate_evolution.py +267 -0
  327. package/bin/genoma.js +250 -0
  328. package/components.json +28 -0
  329. package/docs/api/hermes-api.openapi.yaml +438 -0
  330. package/docs/hero.svg +148 -0
  331. package/eslint.config.mjs +18 -0
  332. package/install.sh +245 -0
  333. package/next-env.d.ts +6 -0
  334. package/next.config.ts +32 -0
  335. package/package.json +46 -0
  336. package/pnpm-workspace.yaml +4 -0
  337. package/postcss.config.mjs +7 -0
  338. package/public/file.svg +1 -0
  339. package/public/fonts/SF-Pro-Display-Bold.otf +0 -0
  340. package/public/fonts/SF-Pro-Display-Heavy.otf +0 -0
  341. package/public/fonts/SF-Pro-Display-Medium.otf +0 -0
  342. package/public/fonts/SF-Pro-Display-Regular.otf +0 -0
  343. package/public/fonts/SF-Pro-Display-Semibold.otf +0 -0
  344. package/public/fonts/SF-Pro-Text-Bold.otf +0 -0
  345. package/public/fonts/SF-Pro-Text-Heavy.otf +0 -0
  346. package/public/fonts/SF-Pro-Text-Medium.otf +0 -0
  347. package/public/fonts/SF-Pro-Text-Regular.otf +0 -0
  348. package/public/fonts/SF-Pro-Text-Semibold.otf +0 -0
  349. package/public/globe.svg +1 -0
  350. package/public/next.svg +1 -0
  351. package/public/theme-preview.html +257 -0
  352. package/public/vercel.svg +1 -0
  353. package/public/window.svg +1 -0
  354. package/run.sh +26 -0
  355. package/scripts/postinstall.js +50 -0
  356. package/skills-lock.json +10 -0
  357. package/specs/event-schema.md +223 -0
  358. package/specs/examples/run.jsonl +3 -0
  359. package/src/app/api/[...path]/route.ts +55 -0
  360. package/src/app/api/auth/token/route.ts +22 -0
  361. package/src/app/evolution/page.tsx +589 -0
  362. package/src/app/favicon.ico +0 -0
  363. package/src/app/globals.css +321 -0
  364. package/src/app/layout.tsx +63 -0
  365. package/src/app/page.tsx +70 -0
  366. package/src/app/skills/page.tsx +369 -0
  367. package/src/components/ApiConfigCard.tsx +199 -0
  368. package/src/components/ColorBends.css +1 -0
  369. package/src/components/ColorBends.d.ts +1 -0
  370. package/src/components/ColorBends.jsx +1 -0
  371. package/src/components/CoreLoopToggle.tsx +111 -0
  372. package/src/components/EnvironmentStatus.tsx +176 -0
  373. package/src/components/EvolutionBackground.tsx +1 -0
  374. package/src/components/ReactQueryProvider.tsx +24 -0
  375. package/src/components/Sidebar.tsx +247 -0
  376. package/src/components/SkillDiffViewer.tsx +154 -0
  377. package/src/components/ThemeAwareBackground.tsx +67 -0
  378. package/src/components/ThemeToggle.tsx +54 -0
  379. package/src/components/WelcomeHero.tsx +77 -0
  380. package/src/components/bits/ClickSpark.tsx +116 -0
  381. package/src/components/bits/CountUp.tsx +98 -0
  382. package/src/components/bits/DarkSelect.tsx +95 -0
  383. package/src/components/bits/DecryptedText.tsx +161 -0
  384. package/src/components/bits/ElectricBorder.tsx +184 -0
  385. package/src/components/bits/GlitchText.tsx +34 -0
  386. package/src/components/bits/ShinyText.tsx +55 -0
  387. package/src/components/bits/SpotlightCard.tsx +42 -0
  388. package/src/components/bits/TextType.tsx +95 -0
  389. package/src/components/bits/index.ts +9 -0
  390. package/src/components/pages/CuratorPage.tsx +632 -0
  391. package/src/components/pages/DatasetPage.tsx +271 -0
  392. package/src/components/pages/EvolutionPage.tsx +676 -0
  393. package/src/components/pages/FunctionCallingPage.tsx +1 -0
  394. package/src/components/pages/LogsPage.tsx +272 -0
  395. package/src/components/pages/MetricsPage.tsx +246 -0
  396. package/src/components/pages/OverviewPage.tsx +420 -0
  397. package/src/components/pages/SettingsPage.tsx +88 -0
  398. package/src/components/pages/SkillStudioPage.tsx +376 -0
  399. package/src/components/ui/animated-theme-toggler.tsx +97 -0
  400. package/src/components/ui/button.tsx +67 -0
  401. package/src/components/ui/card.tsx +103 -0
  402. package/src/components/ui/input.tsx +19 -0
  403. package/src/components/ui/separator.tsx +28 -0
  404. package/src/components/ui/sheet.tsx +147 -0
  405. package/src/components/ui/sidebar.tsx +702 -0
  406. package/src/components/ui/skeleton.tsx +13 -0
  407. package/src/components/ui/theme-toggle.tsx +272 -0
  408. package/src/components/ui/tooltip.tsx +57 -0
  409. package/src/hooks/use-mobile.ts +19 -0
  410. package/src/lib/api.ts +455 -0
  411. package/src/lib/queryClient.ts +12 -0
  412. package/src/lib/utils.ts +6 -0
  413. package/stitch/agent_dashboard/DESIGN_SPEC.md +521 -0
  414. package/stitch/agent_dashboard/prototype.html +676 -0
  415. package/stitch/curator_workspace/code.html +448 -0
  416. package/stitch/curator_workspace/screen.png +0 -0
  417. package/stitch/datasets/code.html +479 -0
  418. package/stitch/datasets/screen.png +0 -0
  419. package/stitch/evolution_history/code.html +461 -0
  420. package/stitch/evolution_history/screen.png +0 -0
  421. package/stitch/hermes_dashboard/DESIGN.md +192 -0
  422. package/stitch/hermes_dashboard/DESIGN_SPEC.md +455 -0
  423. package/stitch/hermes_overview/code.html +399 -0
  424. package/stitch/hermes_overview/screen.png +0 -0
  425. package/stitch/live_logs/code.html +324 -0
  426. package/stitch/live_logs/screen.png +0 -0
  427. package/stitch/skill_hub/code.html +596 -0
  428. package/stitch/skill_hub/screen.png +0 -0
  429. package/stitch/system_metrics/code.html +527 -0
  430. package/stitch/system_metrics/screen.png +0 -0
  431. package/stitch/system_settings/code.html +257 -0
  432. package/stitch/system_settings/screen.png +0 -0
  433. package/test_dashboard.py +201 -0
  434. package/tests/collectors/__init__.py +0 -0
  435. package/tests/collectors/fixtures/sample_session.jsonl +7 -0
  436. package/tests/collectors/test_claude_code_collector.py +171 -0
  437. package/tests/collectors/test_hermes_collector.py +167 -0
  438. package/tests/eval/test_engine.py +234 -0
  439. package/tests/eval/test_scorers.py +249 -0
  440. package/tests/storage/__init__.py +0 -0
  441. package/tests/storage/test_run_store.py +359 -0
  442. package/tests/test_curator.py +559 -0
  443. package/tests/test_e2e_npm.py +621 -0
  444. package/tests/test_mcp_server.py +114 -0
  445. package/tsconfig.json +34 -0
@@ -0,0 +1,420 @@
1
+ "use client"
2
+
3
+ import { useState, useEffect, useMemo, useCallback } from "react"
4
+ import { motion } from "framer-motion"
5
+ import { prepare } from "@chenglou/pretext"
6
+ import {
7
+ Activity,
8
+ GitBranch,
9
+ TrendingUp,
10
+ CheckCircle2,
11
+ XCircle,
12
+ Cpu,
13
+ Dna,
14
+ Layers,
15
+ Clock,
16
+ Zap,
17
+ ArrowUpRight,
18
+ } from "lucide-react"
19
+ import { fetchHealth, fetchMetrics, type MetricsData, type EvolutionRun } from "@/lib/api"
20
+ import { CountUp, SpotlightCard } from "@/components/bits"
21
+ import { cn } from "@/lib/utils"
22
+
23
+ // ═══════════════════════════════════════════════════════════════════
24
+ // Icon Registry
25
+ // ═══════════════════════════════════════════════════════════════════
26
+
27
+ const iconMap: Record<string, React.ElementType> = {
28
+ "git-branch": GitBranch,
29
+ cpu: Cpu,
30
+ "trending-up": TrendingUp,
31
+ activity: Activity,
32
+ clock: Clock,
33
+ zap: Zap,
34
+ layers: Layers,
35
+ dna: Dna,
36
+ }
37
+
38
+ function resolveIcon(key: string): React.ElementType {
39
+ return iconMap[key] ?? Activity
40
+ }
41
+
42
+ // ═══════════════════════════════════════════════════════════════════
43
+ // Components
44
+ // ═══════════════════════════════════════════════════════════════════
45
+
46
+ // ── Genoma Stat Card ──────────────────────────────────────────────────
47
+ function StatCard({
48
+ label,
49
+ value,
50
+ suffix = "",
51
+ icon,
52
+ color,
53
+ delay,
54
+ trend,
55
+ }: {
56
+ label: string
57
+ value: number
58
+ suffix?: string
59
+ icon: string
60
+ color: string
61
+ delay: number
62
+ trend?: number
63
+ }) {
64
+ const IconComponent = resolveIcon(icon)
65
+
66
+ return (
67
+ <motion.div
68
+ initial={{ opacity: 0, y: 12 }}
69
+ animate={{ opacity: 1, y: 0 }}
70
+ transition={{ delay, duration: 0.4, ease: "easeOut" }}
71
+ >
72
+ <SpotlightCard
73
+ spotlightColor={`${color}10`}
74
+ className={cn(
75
+ // Genoma glass card — no border
76
+ "relative overflow-hidden rounded-2xl p-5",
77
+ "bg-white/70 dark:bg-[#0f1a2e]/80",
78
+ "backdrop-blur-xl",
79
+ "editorial-shadow",
80
+ "group hover:shadow-lg transition-shadow duration-300",
81
+ )}
82
+ >
83
+ {/* Top row: label + icon */}
84
+ <div className="flex items-center justify-between mb-3">
85
+ <span className="text-[11px] font-medium text-muted-foreground uppercase tracking-[0.12em]">
86
+ {label}
87
+ </span>
88
+ <div
89
+ className="w-8 h-8 rounded-xl flex items-center justify-center"
90
+ style={{ backgroundColor: `${color}12` }}
91
+ >
92
+ <IconComponent className="w-4 h-4" style={{ color }} />
93
+ </div>
94
+ </div>
95
+
96
+ {/* Value — CountUp animation */}
97
+ <div className="flex items-baseline gap-1.5">
98
+ <p className="text-[1.75rem] font-bold font-heading tracking-tight stat-number"
99
+ style={{ color: "var(--genoma-primary, #002444)" }}>
100
+ <CountUp to={value} duration={1.2} delay={delay} />
101
+ {suffix}
102
+ </p>
103
+
104
+ {/* Trend pill */}
105
+ {trend !== undefined && trend !== 0 && (
106
+ <span className={cn(
107
+ "inline-flex items-center gap-0.5 text-[11px] font-medium px-1.5 py-0.5 rounded-full",
108
+ trend > 0
109
+ ? "text-[#16a34a] bg-[#16a34a]/8"
110
+ : "text-[#dc2626] bg-[#dc2626]/8"
111
+ )}>
112
+ <ArrowUpRight className={cn("w-3 h-3", trend < 0 && "rotate-180")} />
113
+ {Math.abs(trend)}%
114
+ </span>
115
+ )}
116
+ </div>
117
+ </SpotlightCard>
118
+ </motion.div>
119
+ )
120
+ }
121
+
122
+ // ── Run Row — Genoma style ────────────────────────────────────────────
123
+ function RunRow({
124
+ run,
125
+ index,
126
+ isExpanded,
127
+ onToggle,
128
+ }: {
129
+ run: EvolutionRun
130
+ index: number
131
+ isExpanded: boolean
132
+ onToggle: () => void
133
+ }) {
134
+ const improved = run.improvement > 0
135
+ const improvementPct = Math.round(run.improvement * 100)
136
+
137
+ return (
138
+ <motion.div
139
+ initial={{ opacity: 0, x: -8 }}
140
+ animate={{ opacity: 1, x: 0 }}
141
+ transition={{ delay: 0.5 + index * 0.05, duration: 0.3 }}
142
+ >
143
+ <button
144
+ onClick={onToggle}
145
+ className={cn(
146
+ "w-full text-left",
147
+ // Genoma card row — no dividers, spacing-based separation
148
+ "flex items-center gap-3 py-3.5 px-4 rounded-xl",
149
+ "bg-white/50 dark:bg-[#0f1a2e]/50",
150
+ "hover:bg-white/80 dark:hover:bg-[#0f1a2e]/80",
151
+ "transition-all duration-200",
152
+ "group",
153
+ isExpanded && "bg-[#fcf9f8] dark:bg-[#0a1525] shadow-sm",
154
+ )}
155
+ >
156
+ {/* Status dot */}
157
+ <div className="flex-shrink-0">
158
+ {run.constraints_passed ? (
159
+ <CheckCircle2 className="w-4 h-4 text-[#16a34a]" />
160
+ ) : (
161
+ <XCircle className="w-4 h-4 text-[#dc2626]" />
162
+ )}
163
+ </div>
164
+
165
+ {/* Skill name + timestamp */}
166
+ <div className="flex-1 min-w-0">
167
+ <p className="text-sm font-medium text-foreground truncate">
168
+ {run.skill_name}
169
+ </p>
170
+ <p className="text-[11px] text-muted-foreground font-mono">
171
+ {run.timestamp}
172
+ </p>
173
+ </div>
174
+
175
+ {/* Score delta — the money shot */}
176
+ <div className="text-right flex-shrink-0">
177
+ <div className="flex items-center gap-1.5">
178
+ <span className="text-xs text-muted-foreground font-mono">
179
+ {(run.baseline_score * 100).toFixed(0)}%
180
+ </span>
181
+ <span className="text-[10px] text-muted-foreground">→</span>
182
+ <span className={cn(
183
+ "text-sm font-semibold font-mono",
184
+ improved ? "text-[#16a34a]" : "text-[#dc2626]"
185
+ )}>
186
+ {(run.evolved_score * 100).toFixed(0)}%
187
+ </span>
188
+ </div>
189
+ <div className="flex items-center justify-end gap-2 mt-0.5">
190
+ {improved ? (
191
+ <span className="inline-flex items-center gap-0.5 text-[10px] font-medium text-[#16a34a]">
192
+ <TrendingUp className="w-3 h-3" />+{improvementPct}%
193
+ </span>
194
+ ) : (
195
+ <span className="text-[10px] text-muted-foreground">
196
+ {improvementPct}%
197
+ </span>
198
+ )}
199
+ <span className="text-[10px] text-muted-foreground/60 font-mono">
200
+ {run.iterations}it · {run.elapsed_seconds.toFixed(0)}s
201
+ </span>
202
+ </div>
203
+ </div>
204
+ </button>
205
+
206
+ {/* Expanded: inline detail (Pretext would handle this in prod) */}
207
+ {isExpanded && (
208
+ <motion.div
209
+ initial={{ height: 0, opacity: 0 }}
210
+ animate={{ height: "auto", opacity: 1 }}
211
+ exit={{ height: 0, opacity: 0 }}
212
+ className="overflow-hidden"
213
+ >
214
+ <div className="px-4 pb-3 pt-1">
215
+ <div className={cn(
216
+ "rounded-lg p-3 text-xs font-mono",
217
+ "bg-[#f6f3f2] dark:bg-[#0a1525]",
218
+ "border-l-[3px]",
219
+ run.constraints_passed
220
+ ? "border-l-[#16a34a]"
221
+ : "border-l-[#dc2626]"
222
+ )}>
223
+ <div className="flex gap-4 text-muted-foreground">
224
+ <span>Baseline: {(run.baseline_score * 100).toFixed(1)}%</span>
225
+ <span>Evolved: {(run.evolved_score * 100).toFixed(1)}%</span>
226
+ <span>Δ: {(run.improvement * 100).toFixed(1)}%</span>
227
+ <span>{run.iterations} iterations</span>
228
+ <span>{run.elapsed_seconds.toFixed(1)}s</span>
229
+ </div>
230
+ </div>
231
+ </div>
232
+ </motion.div>
233
+ )}
234
+ </motion.div>
235
+ )
236
+ }
237
+
238
+ // ═══════════════════════════════════════════════════════════════════
239
+ // OverviewPage
240
+ // ═══════════════════════════════════════════════════════════════════
241
+
242
+ export default function OverviewPage() {
243
+ const [health, setHealth] = useState<{
244
+ status: string
245
+ skills_count: number
246
+ categories: Record<string, number>
247
+ } | null>(null)
248
+ const [metrics, setMetrics] = useState<MetricsData | null>(null)
249
+ const [loading, setLoading] = useState(true)
250
+ const [expandedRun, setExpandedRun] = useState<number | null>(null)
251
+
252
+ useEffect(() => {
253
+ Promise.all([fetchHealth(), fetchMetrics()])
254
+ .then(([h, m]) => {
255
+ setHealth(h)
256
+ setMetrics(m)
257
+ })
258
+ .catch(() => {})
259
+ .finally(() => setLoading(false))
260
+ }, [])
261
+
262
+ // Derive stats for the card grid
263
+ const stats = useMemo(() => [
264
+ {
265
+ label: "Evolution Runs",
266
+ value: metrics?.total_runs ?? 0,
267
+ icon: "git-branch",
268
+ color: "#002444",
269
+ delay: 0.1,
270
+ },
271
+ {
272
+ label: "Skills Evolved",
273
+ value: metrics?.skills_evolved ?? 0,
274
+ icon: "cpu",
275
+ color: "#0891b2",
276
+ delay: 0.2,
277
+ },
278
+ {
279
+ label: "Avg Improvement",
280
+ value: Math.round((metrics?.avg_improvement ?? 0) * 100),
281
+ suffix: "%",
282
+ icon: "trending-up",
283
+ color: "#16a34a",
284
+ delay: 0.3,
285
+ },
286
+ {
287
+ label: "Success Rate",
288
+ value: Math.round((metrics?.success_rate ?? 0) * 100),
289
+ suffix: "%",
290
+ icon: "activity",
291
+ color: "#a93800",
292
+ delay: 0.4,
293
+ },
294
+ ], [metrics])
295
+
296
+ return (
297
+ <div className="space-y-6 max-w-6xl">
298
+ {/* ═══ Hero — Genoma Editorial ═══ */}
299
+ <motion.div
300
+ initial={{ opacity: 0, y: 16 }}
301
+ animate={{ opacity: 1, y: 0 }}
302
+ transition={{ duration: 0.5 }}
303
+ className="relative overflow-hidden rounded-2xl p-8 md:p-10
304
+ bg-[#002444] dark:bg-[#001830]
305
+ editorial-shadow"
306
+ >
307
+ {/* Ambient gradient blobs */}
308
+ <div className="absolute inset-0 overflow-hidden pointer-events-none">
309
+ <div
310
+ className="absolute -top-24 -right-24 w-80 h-80 rounded-full opacity-[0.07]"
311
+ style={{
312
+ background: "radial-gradient(circle, #a93800 0%, transparent 70%)",
313
+ }}
314
+ />
315
+ <div
316
+ className="absolute -bottom-16 -left-16 w-64 h-64 rounded-full opacity-[0.05]"
317
+ style={{
318
+ background: "radial-gradient(circle, #ffb94c 0%, transparent 70%)",
319
+ }}
320
+ />
321
+ </div>
322
+
323
+ <div className="relative">
324
+ {/* Badge */}
325
+ <div className="inline-flex items-center gap-2 mb-3 px-3 py-1 rounded-full
326
+ bg-[#a93800]/15 border border-[#a93800]/20">
327
+ <Dna className="w-3.5 h-3.5 text-[#fc713a]" />
328
+ <span className="text-[11px] font-medium text-[#fc713a] uppercase tracking-[0.1em]">
329
+ Autonomous Evolution Interface
330
+ </span>
331
+ </div>
332
+
333
+ <h1 className="text-3xl md:text-4xl font-bold font-heading text-[#fcf9f8] tracking-tight">
334
+ <span className="gradient-text">Genoma</span>
335
+ </h1>
336
+ <p className="text-[#fcf9f8]/60 mt-2 text-sm md:text-base max-w-lg">
337
+ Self-evolving intelligence. Full observability. Zero-friction evolution.
338
+ </p>
339
+
340
+ {/* Status row */}
341
+ <div className="flex items-center gap-2 mt-5">
342
+ <div
343
+ className={cn(
344
+ "w-2 h-2 rounded-full",
345
+ loading
346
+ ? "bg-[#ffb94c] animate-pulse"
347
+ : health
348
+ ? "bg-[#22c55e] led-pulse"
349
+ : "bg-[#dc2626]"
350
+ )}
351
+ style={{ color: health ? "#22c55e" : loading ? "#ffb94c" : "#dc2626" }}
352
+ />
353
+ <span className="text-xs text-[#fcf9f8]/50">
354
+ {loading
355
+ ? "Conectando..."
356
+ : health
357
+ ? `Backend online · ${health.skills_count} skills`
358
+ : "Backend offline"}
359
+ </span>
360
+ </div>
361
+ </div>
362
+ </motion.div>
363
+
364
+ {/* ═══ Stats Grid ═══ */}
365
+ <div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4">
366
+ {stats.map((stat) => (
367
+ <StatCard key={stat.label} {...stat} />
368
+ ))}
369
+ </div>
370
+
371
+ {/* ═══ Recent Evolution Runs ═══ */}
372
+ <motion.div
373
+ initial={{ opacity: 0, y: 12 }}
374
+ animate={{ opacity: 1, y: 0 }}
375
+ transition={{ delay: 0.5, duration: 0.4 }}
376
+ >
377
+ <div className="flex items-center justify-between mb-4">
378
+ <div className="flex items-center gap-2">
379
+ <Activity className="w-4 h-4 text-[#a93800]" />
380
+ <h2 className="text-sm font-semibold uppercase tracking-[0.1em] text-foreground/70">
381
+ Recent Evolution Runs
382
+ </h2>
383
+ </div>
384
+ {metrics?.runs?.length ? (
385
+ <span className="text-[11px] text-muted-foreground font-mono">
386
+ {metrics.runs.length} runs
387
+ </span>
388
+ ) : null}
389
+ </div>
390
+
391
+ {metrics?.runs?.length ? (
392
+ <div className="space-y-1.5">
393
+ {metrics.runs.slice(0, 8).map((run, i) => (
394
+ <RunRow
395
+ key={`${run.skill_name}-${run.timestamp}`}
396
+ run={run}
397
+ index={i}
398
+ isExpanded={expandedRun === i}
399
+ onToggle={() =>
400
+ setExpandedRun(expandedRun === i ? null : i)
401
+ }
402
+ />
403
+ ))}
404
+ </div>
405
+ ) : (
406
+ <div className={cn(
407
+ "rounded-2xl p-12 text-center",
408
+ "bg-white/40 dark:bg-[#0f1a2e]/50",
409
+ "editorial-shadow",
410
+ )}>
411
+ <Dna className="w-10 h-10 text-muted-foreground/30 mx-auto mb-3" />
412
+ <p className="text-sm text-muted-foreground">
413
+ No evolution runs yet. Start one from the Evolution tab.
414
+ </p>
415
+ </div>
416
+ )}
417
+ </motion.div>
418
+ </div>
419
+ )
420
+ }
@@ -0,0 +1,88 @@
1
+ "use client";
2
+
3
+ import { useState, useEffect } from "react";
4
+ import { motion } from "framer-motion";
5
+ import {
6
+ Settings,
7
+ Key,
8
+ Eye,
9
+ EyeOff,
10
+ Check,
11
+ X,
12
+ Server,
13
+ FolderOpen,
14
+ } from "lucide-react";
15
+ import { fetchHealth } from "@/lib/api";
16
+
17
+ interface EnvVar {
18
+ key: string;
19
+ value: string;
20
+ desc: string;
21
+ }
22
+
23
+ export default function SettingsPage() {
24
+ const [health, setHealth] = useState<{
25
+ status: string;
26
+ hermes_repo: string;
27
+ hermes_repo_exists: boolean;
28
+ evolution_dir: string;
29
+ evolution_dir_exists: boolean;
30
+ skills_count: number;
31
+ } | null>(null);
32
+
33
+ const [showKeys, setShowKeys] = useState<Record<string, boolean>>({});
34
+
35
+ useEffect(() => {
36
+ fetchHealth().then(setHealth).catch(() => {});
37
+ }, []);
38
+
39
+ const envVars: EnvVar[] = [
40
+ { key: "OPENAI_API_KEY", value: "sk-...", desc: "Used by DSPy for LLM calls" },
41
+ { key: "OPENAI_BASE_URL", value: "http://localhost:11434/v1", desc: "Ollama endpoint" },
42
+ { key: "HERMES_AGENT_REPO", value: health?.hermes_repo || "~/.hermes/hermes-agent", desc: "Path to hermes-agent repo" },
43
+ ];
44
+
45
+ return (
46
+ <div className="space-y-6 max-w-3xl">
47
+ {/* System Paths */}
48
+ <motion.div initial={{ opacity: 0, y: 15 }} animate={{ opacity: 1, y: 0 }} className="glass-card rounded-2xl p-6">
49
+ <h2 className="text-sm font-semibold uppercase tracking-wider flex items-center gap-2 mb-4"><Server className="w-4 h-4 text-accent-cyan" />System Paths</h2>
50
+ {health && (
51
+ <div className="space-y-3">
52
+ {[
53
+ { label: "Hermes Agent Repo", path: health.hermes_repo, exists: health.hermes_repo_exists },
54
+ { label: "Evolution Engine", path: health.evolution_dir, exists: health.evolution_dir_exists },
55
+ ].map((item) => (
56
+ <div key={item.label} className="flex items-center justify-between p-3 rounded-xl bg-white/[0.02] border border-white/[0.04]">
57
+ <div className="flex items-center gap-3"><FolderOpen className="w-4 h-4 text-muted-foreground" /><div><p className="text-sm font-medium">{item.label}</p><p className="text-[10px] font-mono text-muted-foreground">{item.path}</p></div></div>
58
+ {item.exists ? <Check className="w-4 h-4 text-success" /> : <X className="w-4 h-4 text-error" />}
59
+ </div>
60
+ ))}
61
+ <div className="flex items-center justify-between p-3 rounded-xl bg-white/[0.02] border border-white/[0.04]">
62
+ <div className="flex items-center gap-3"><FolderOpen className="w-4 h-4 text-muted-foreground" /><div><p className="text-sm font-medium">Skills Found</p></div></div>
63
+ <span className="text-sm font-mono text-accent-violet">{health.skills_count}</span>
64
+ </div>
65
+ </div>
66
+ )}
67
+ </motion.div>
68
+
69
+ {/* Environment Variables */}
70
+ <motion.div initial={{ opacity: 0, y: 15 }} animate={{ opacity: 1, y: 0 }} transition={{ delay: 0.1 }} className="glass-card rounded-2xl p-6">
71
+ <h2 className="text-sm font-semibold uppercase tracking-wider flex items-center gap-2 mb-4"><Key className="w-4 h-4 text-accent-violet" />Environment Variables</h2>
72
+ <div className="space-y-3">
73
+ {envVars.map((env) => (
74
+ <div key={env.key} className="p-3 rounded-xl bg-white/[0.02] border border-white/[0.04]">
75
+ <div className="flex items-center justify-between mb-1">
76
+ <span className="text-xs font-mono text-accent-cyan">{env.key}</span>
77
+ <button onClick={() => setShowKeys((prev) => ({ ...prev, [env.key]: !prev[env.key] }))} className="text-muted-foreground/50 hover:text-muted-foreground">{showKeys[env.key] ? <EyeOff className="w-3 h-3" /> : <Eye className="w-3 h-3" />}</button>
78
+ </div>
79
+ <p className="text-xs font-mono text-muted-foreground">{showKeys[env.key] ? env.value : "••••••••••••"}</p>
80
+ <p className="text-[10px] text-muted-foreground/50 mt-1">{env.desc}</p>
81
+ </div>
82
+ ))}
83
+ </div>
84
+ <p className="text-[10px] text-muted-foreground/40 mt-4">Set these in your shell or .env file. The backend reads them on startup.</p>
85
+ </motion.div>
86
+ </div>
87
+ );
88
+ }