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,176 @@
1
+ "use client";
2
+
3
+ import { useState, useEffect } from "react";
4
+ import { motion } from "framer-motion";
5
+ import { Terminal, Package, Download, CheckCircle2 } from "lucide-react";
6
+
7
+ interface LogLine {
8
+ text: string;
9
+ type: "info" | "success" | "warning" | "command";
10
+ }
11
+
12
+ const installLogs: LogLine[] = [
13
+ { text: "$ pip install -r requirements.txt", type: "command" },
14
+ { text: "Collecting dspy>=3.0.0...", type: "info" },
15
+ { text: " Downloading dspy-3.0.2-py3-none-any.whl (892 kB)", type: "info" },
16
+ { text: "Collecting openai>=1.0.0...", type: "info" },
17
+ { text: " Downloading openai-1.76.0-py3-none-any.whl (455 kB)", type: "info" },
18
+ { text: "Collecting pyyaml>=6.0...", type: "info" },
19
+ { text: " Downloading PyYAML-6.0.2-cp312-cp312-linux_x86_64.whl (752 kB)", type: "info" },
20
+ { text: "Installing collected packages: dspy, openai, pyyaml, click, rich", type: "info" },
21
+ { text: "Successfully installed dspy-3.0.2 openai-1.76.0", type: "success" },
22
+ { text: "✓ All dependencies resolved", type: "success" },
23
+ ];
24
+
25
+ const deps = [
26
+ { name: "dspy", version: "3.0.2", done: true },
27
+ { name: "openai", version: "1.76.0", done: true },
28
+ { name: "pyyaml", version: "6.0.2", done: true },
29
+ { name: "click", version: "8.1.8", done: true },
30
+ { name: "rich", version: "13.9.4", done: true },
31
+ ];
32
+
33
+ export default function EnvironmentStatus() {
34
+ const [visibleLines, setVisibleLines] = useState(0);
35
+ const [progress, setProgress] = useState(0);
36
+
37
+ useEffect(() => {
38
+ const interval = setInterval(() => {
39
+ setVisibleLines((prev) => {
40
+ if (prev >= installLogs.length) {
41
+ clearInterval(interval);
42
+ return prev;
43
+ }
44
+ return prev + 1;
45
+ });
46
+ }, 400);
47
+
48
+ return () => clearInterval(interval);
49
+ }, []);
50
+
51
+ useEffect(() => {
52
+ setProgress((visibleLines / installLogs.length) * 100);
53
+ }, [visibleLines]);
54
+
55
+ return (
56
+ <motion.div
57
+ initial={{ opacity: 0, y: 20 }}
58
+ animate={{ opacity: 1, y: 0 }}
59
+ transition={{ delay: 0.7, duration: 0.6 }}
60
+ className="glass-card rounded-2xl p-6 md:p-8"
61
+ >
62
+ {/* Header */}
63
+ <div className="flex items-center gap-3 mb-6">
64
+ <div className="w-8 h-8 rounded-lg bg-white/[0.05] flex items-center justify-center">
65
+ <Terminal className="w-4 h-4 text-muted-foreground" />
66
+ </div>
67
+ <div>
68
+ <h2 className="text-sm font-semibold tracking-wide uppercase">
69
+ Environment Status
70
+ </h2>
71
+ <p className="text-xs text-muted-foreground mt-0.5">
72
+ Dependency installation
73
+ </p>
74
+ </div>
75
+ </div>
76
+
77
+ {/* Progress bar */}
78
+ <div className="mb-4">
79
+ <div className="flex items-center justify-between mb-2">
80
+ <span className="text-xs text-muted-foreground flex items-center gap-2">
81
+ <Download className="w-3 h-3" />
82
+ Installing dependencies
83
+ </span>
84
+ <span className="text-xs font-mono text-accent-violet">
85
+ {Math.round(progress)}%
86
+ </span>
87
+ </div>
88
+ <div className="h-1 bg-white/[0.05] rounded-full overflow-hidden">
89
+ <motion.div
90
+ initial={{ width: 0 }}
91
+ animate={{ width: `${progress}%` }}
92
+ transition={{ duration: 0.3, ease: "easeOut" }}
93
+ className="h-full rounded-full progress-glow"
94
+ style={{
95
+ background: "linear-gradient(90deg, #8b5cf6, #06b6d4)",
96
+ }}
97
+ />
98
+ </div>
99
+ </div>
100
+
101
+ {/* Terminal */}
102
+ <div className="rounded-xl bg-black/50 border border-white/[0.04] overflow-hidden">
103
+ {/* Terminal header */}
104
+ <div className="flex items-center gap-2 px-4 py-2 border-b border-white/[0.04] bg-white/[0.02]">
105
+ <div className="flex gap-1.5">
106
+ <div className="w-2.5 h-2.5 rounded-full bg-error/60" />
107
+ <div className="w-2.5 h-2.5 rounded-full bg-warning/60" />
108
+ <div className="w-2.5 h-2.5 rounded-full bg-success/60" />
109
+ </div>
110
+ <span className="text-[10px] text-muted-foreground/50 ml-2 font-mono">
111
+ hermes-env — bash
112
+ </span>
113
+ </div>
114
+
115
+ {/* Terminal body */}
116
+ <div className="p-4 font-mono text-xs leading-relaxed h-48 overflow-y-auto">
117
+ {installLogs.slice(0, visibleLines).map((line, i) => (
118
+ <motion.div
119
+ key={i}
120
+ initial={{ opacity: 0, x: -5 }}
121
+ animate={{ opacity: 1, x: 0 }}
122
+ transition={{ duration: 0.2 }}
123
+ className={`${
124
+ line.type === "command"
125
+ ? "text-accent-cyan"
126
+ : line.type === "success"
127
+ ? "text-success"
128
+ : line.type === "warning"
129
+ ? "text-warning"
130
+ : "text-muted-foreground/70"
131
+ }`}
132
+ >
133
+ {line.text}
134
+ </motion.div>
135
+ ))}
136
+ {visibleLines < installLogs.length && (
137
+ <span className="cursor-blink text-muted-foreground/30" />
138
+ )}
139
+ </div>
140
+ </div>
141
+
142
+ {/* Dependencies list */}
143
+ <div className="mt-4 space-y-2">
144
+ {deps.map((dep, i) => (
145
+ <motion.div
146
+ key={dep.name}
147
+ initial={{ opacity: 0 }}
148
+ animate={{ opacity: visibleLines > i + 3 ? 1 : 0.3 }}
149
+ className="flex items-center justify-between py-1.5 px-3 rounded-lg bg-white/[0.01]"
150
+ >
151
+ <div className="flex items-center gap-2">
152
+ <Package className="w-3 h-3 text-muted-foreground/50" />
153
+ <span className="text-xs font-mono text-muted-foreground">
154
+ {dep.name}
155
+ </span>
156
+ </div>
157
+ <div className="flex items-center gap-2">
158
+ <span className="text-[10px] font-mono text-muted-foreground/40">
159
+ {dep.version}
160
+ </span>
161
+ {visibleLines > i + 3 && (
162
+ <motion.div
163
+ initial={{ scale: 0 }}
164
+ animate={{ scale: 1 }}
165
+ transition={{ type: "spring", stiffness: 500 }}
166
+ >
167
+ <CheckCircle2 className="w-3 h-3 text-success" />
168
+ </motion.div>
169
+ )}
170
+ </div>
171
+ </motion.div>
172
+ ))}
173
+ </div>
174
+ </motion.div>
175
+ );
176
+ }
@@ -0,0 +1 @@
1
+ // REMOVED — component was unused (never imported anywhere)
@@ -0,0 +1,24 @@
1
+ "use client";
2
+
3
+ import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
4
+ import { ReactNode, useState } from 'react';
5
+
6
+ export function ReactQueryProvider({ children }: { children: ReactNode }) {
7
+ // Creamos el QueryClient DENTRO del Client Component.
8
+ // Esto evita pasar la instancia desde un Server Component.
9
+ const [queryClient] = useState(
10
+ () =>
11
+ new QueryClient({
12
+ defaultOptions: {
13
+ queries: {
14
+ staleTime: 1000 * 60 * 5, // 5 minutes
15
+ gcTime: 1000 * 60 * 30, // 30 minutes
16
+ refetchOnWindowFocus: false,
17
+ retry: 1,
18
+ },
19
+ },
20
+ })
21
+ );
22
+
23
+ return <QueryClientProvider client={queryClient}>{children}</QueryClientProvider>;
24
+ }
@@ -0,0 +1,247 @@
1
+ "use client"
2
+
3
+ import * as React from "react"
4
+ import {
5
+ Layers,
6
+ GitBranch,
7
+ Database,
8
+ BarChart3,
9
+ Terminal,
10
+ Settings,
11
+ Dna,
12
+ Sparkles,
13
+ Cpu,
14
+ Bot,
15
+ BookOpen,
16
+ } from "lucide-react"
17
+
18
+ import {
19
+ Sidebar,
20
+ SidebarContent,
21
+ SidebarFooter,
22
+ SidebarGroup,
23
+ SidebarGroupContent,
24
+ SidebarGroupLabel,
25
+ SidebarHeader,
26
+ SidebarMenu,
27
+ SidebarMenuButton,
28
+ SidebarMenuItem,
29
+ SidebarProvider,
30
+ SidebarRail,
31
+ SidebarTrigger,
32
+ useSidebar,
33
+ } from "@/components/ui/sidebar"
34
+ import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"
35
+ import { useTheme } from "next-themes"
36
+ import { cn } from "@/lib/utils"
37
+
38
+ // ── Navigation Config ─────────────────────────────────────────────────
39
+ export type Page =
40
+ | "overview"
41
+ | "skills"
42
+ | "evolution"
43
+ | "datasets"
44
+ | "metrics"
45
+ | "logs"
46
+ | "settings"
47
+ | "curator"
48
+
49
+ interface NavItem {
50
+ id: Page
51
+ label: string
52
+ icon: React.ElementType
53
+ section: "main" | "tools" | "system"
54
+ }
55
+
56
+ const navItems: NavItem[] = [
57
+ { id: "overview", label: "Overview", icon: Layers, section: "main" },
58
+ { id: "skills", label: "Skill Hub", icon: Sparkles, section: "main" },
59
+ { id: "evolution", label: "Evolution", icon: GitBranch, section: "main" },
60
+ { id: "datasets", label: "Datasets", icon: Database, section: "tools" },
61
+ { id: "metrics", label: "Metrics", icon: BarChart3, section: "tools" },
62
+ { id: "logs", label: "Live Logs", icon: Terminal, section: "tools" },
63
+ { id: "curator", label: "Curator", icon: Dna, section: "system" },
64
+ { id: "settings", label: "Settings", icon: Settings, section: "system" },
65
+ ]
66
+
67
+ // ── Genoma Logo ───────────────────────────────────────────────────────
68
+ function GenomaLogo({ collapsed }: { collapsed: boolean }) {
69
+ return (
70
+ <div className="flex items-center gap-3 px-2">
71
+ {/* Logo mark — always visible */}
72
+ <div className="relative flex-shrink-0">
73
+ <div className="w-9 h-9 rounded-xl flex items-center justify-center
74
+ bg-gradient-to-br from-[#002444] to-[#1a3a5c]
75
+ shadow-lg shadow-[#002444]/20
76
+ dark:from-[#1a3a5c] dark:to-[#002444]">
77
+ <Dna className="w-5 h-5 text-[#fcf9f8]" />
78
+ </div>
79
+ {/* Streak dot — Genoma tertiary */}
80
+ <div className="absolute -top-0.5 -right-0.5 w-2.5 h-2.5 rounded-full
81
+ bg-[#ffb94c] border-2 border-sidebar" />
82
+ </div>
83
+
84
+ {/* Text — hidden when collapsed */}
85
+ {!collapsed && (
86
+ <div className="overflow-hidden min-w-0">
87
+ <p className="text-sm font-semibold tracking-tight text-sidebar-foreground truncate">
88
+ Genoma
89
+ </p>
90
+ <p className="text-[10px] text-sidebar-foreground/50 truncate">
91
+ Agent Evolution Dashboard
92
+ </p>
93
+ </div>
94
+ )}
95
+ </div>
96
+ )
97
+ }
98
+
99
+ // ── Nav Section ───────────────────────────────────────────────────────
100
+ function NavSection({
101
+ title,
102
+ items,
103
+ activePage,
104
+ onNavigate,
105
+ }: {
106
+ title: string
107
+ items: NavItem[]
108
+ activePage: Page
109
+ onNavigate: (page: Page) => void
110
+ }) {
111
+ const { state } = useSidebar()
112
+ const collapsed = state === "collapsed"
113
+
114
+ return (
115
+ <SidebarGroup>
116
+ {!collapsed && (
117
+ <SidebarGroupLabel className="text-[10px] uppercase tracking-[0.15em] text-sidebar-foreground/40 px-3 mb-1">
118
+ {title}
119
+ </SidebarGroupLabel>
120
+ )}
121
+ <SidebarGroupContent>
122
+ <SidebarMenu>
123
+ {items.map((item) => {
124
+ const isActive = activePage === item.id
125
+ return (
126
+ <SidebarMenuItem key={item.id}>
127
+ <SidebarMenuButton
128
+ tooltip={collapsed ? item.label : undefined}
129
+ isActive={isActive}
130
+ onClick={() => onNavigate(item.id)}
131
+ className={cn(
132
+ "transition-all duration-200",
133
+ isActive && [
134
+ "bg-gradient-to-r from-[#a93800]/15 to-transparent",
135
+ "text-sidebar-foreground font-medium",
136
+ "border-l-[3px] border-l-[#a93800]",
137
+ "shadow-[inset_0_0_0_1px_rgba(169,56,0,0.08)]",
138
+ ],
139
+ !isActive && [
140
+ "text-sidebar-foreground/60 hover:text-sidebar-foreground/90",
141
+ "hover:bg-sidebar-accent/50",
142
+ "border-l-[3px] border-l-transparent",
143
+ ]
144
+ )}
145
+ >
146
+ <item.icon
147
+ className={cn(
148
+ "h-4 w-4 flex-shrink-0",
149
+ isActive && "text-[#a93800]"
150
+ )}
151
+ />
152
+ <span className="truncate">{item.label}</span>
153
+ </SidebarMenuButton>
154
+ </SidebarMenuItem>
155
+ )
156
+ })}
157
+ </SidebarMenu>
158
+ </SidebarGroupContent>
159
+ </SidebarGroup>
160
+ )
161
+ }
162
+
163
+ // ── AppSidebar (inner) ─────────────────────────────────────────────────
164
+ function AppSidebarInner({
165
+ activePage,
166
+ onNavigate,
167
+ }: {
168
+ activePage: Page
169
+ onNavigate: (page: Page) => void
170
+ }) {
171
+ const { state } = useSidebar()
172
+ const collapsed = state === "collapsed"
173
+
174
+ const mainItems = navItems.filter((i) => i.section === "main")
175
+ const toolItems = navItems.filter((i) => i.section === "tools")
176
+ const systemItems = navItems.filter((i) => i.section === "system")
177
+
178
+ return (
179
+ <Sidebar
180
+ collapsible="icon"
181
+ className={cn(
182
+ "border-r-0",
183
+ // Genoma glass sidebar
184
+ "bg-[#002444]/95 dark:bg-[#001830]/95",
185
+ "backdrop-blur-2xl",
186
+ // Subtle inner highlight
187
+ "shadow-[inset_-1px_0_0_rgba(255,255,255,0.04)]",
188
+ )}
189
+ >
190
+ {/* ── Header ── */}
191
+ <SidebarHeader className="h-16 flex items-center border-b border-sidebar-border/20 px-3">
192
+ <GenomaLogo collapsed={collapsed} />
193
+ </SidebarHeader>
194
+
195
+ {/* ── Content ── */}
196
+ <SidebarContent className="py-3">
197
+ <NavSection title="Core" items={mainItems} activePage={activePage} onNavigate={onNavigate} />
198
+ <NavSection title="Analysis" items={toolItems} activePage={activePage} onNavigate={onNavigate} />
199
+ <NavSection title="System" items={systemItems} activePage={activePage} onNavigate={onNavigate} />
200
+ </SidebarContent>
201
+
202
+ {/* ── Footer ── */}
203
+ <SidebarFooter className="border-t border-sidebar-border/20 p-2">
204
+ <div className={cn(
205
+ "flex items-center gap-2 px-2 py-1.5 rounded-lg",
206
+ "text-[10px] text-sidebar-foreground/30",
207
+ collapsed && "justify-center"
208
+ )}>
209
+ <div className="w-1.5 h-1.5 rounded-full bg-[#22c55e] led-pulse" style={{color: "#22c55e"}} />
210
+ {!collapsed && <span className="truncate">Backend online</span>}
211
+ </div>
212
+ </SidebarFooter>
213
+
214
+ <SidebarRail className="hover:after:bg-[#a93800]/20 after:bg-sidebar-border/20" />
215
+ </Sidebar>
216
+ )
217
+ }
218
+
219
+ // ── Main Sidebar (with Provider) ──────────────────────────────────────
220
+ export interface AppSidebarProps {
221
+ activePage: Page
222
+ onNavigate: (page: Page) => void
223
+ children?: React.ReactNode
224
+ }
225
+
226
+ export default function AppSidebar({
227
+ activePage,
228
+ onNavigate,
229
+ children,
230
+ }: AppSidebarProps) {
231
+ return (
232
+ <SidebarProvider defaultOpen={true}>
233
+ <div className="flex h-screen w-full overflow-hidden">
234
+ <AppSidebarInner activePage={activePage} onNavigate={onNavigate} />
235
+ <main className="flex-1 overflow-y-auto">
236
+ <div className="flex items-center gap-2 h-12 px-4 border-b border-border/50 glass-header sticky top-0 z-10">
237
+ <SidebarTrigger className="text-sidebar-foreground hover:text-[#a93800]" />
238
+ <div className="flex-1" />
239
+ </div>
240
+ <div className="p-6 lg:p-8">
241
+ {children}
242
+ </div>
243
+ </main>
244
+ </div>
245
+ </SidebarProvider>
246
+ )
247
+ }
@@ -0,0 +1,154 @@
1
+ "use client";
2
+
3
+ import { useState, useEffect } from "react";
4
+ import { motion } from "framer-motion";
5
+ import {
6
+ GitBranch,
7
+ Loader2,
8
+ FileText,
9
+ Code2,
10
+ X,
11
+ } from "lucide-react";
12
+ import { fetchSkillDiff, type SkillDiff } from "@/lib/api";
13
+
14
+ interface SkillDiffViewerProps {
15
+ skillName: string;
16
+ runDir: string;
17
+ onClose: () => void;
18
+ }
19
+
20
+ export default function SkillDiffViewer({
21
+ skillName,
22
+ runDir,
23
+ onClose,
24
+ }: SkillDiffViewerProps) {
25
+ const [diff, setDiff] = useState<SkillDiff | null>(null);
26
+ const [loading, setLoading] = useState(true);
27
+ const [error, setError] = useState("");
28
+ const [activeTab, setActiveTab] = useState<"baseline" | "evolved" | "diff">("baseline");
29
+
30
+ useEffect(() => {
31
+ setLoading(true);
32
+ fetchSkillDiff(skillName, runDir)
33
+ .then(setDiff)
34
+ .catch((e) => setError(e.message))
35
+ .finally(() => setLoading(false));
36
+ }, [skillName, runDir]);
37
+
38
+ if (loading) {
39
+ return (
40
+ <div className="mt-3 p-4 rounded-xl bg-black/30 border border-white/[0.06] flex items-center gap-2 text-sm text-muted-foreground">
41
+ <Loader2 className="w-4 h-4 animate-spin" />
42
+ Loading diff...
43
+ </div>
44
+ );
45
+ }
46
+
47
+ if (error || !diff) {
48
+ return (
49
+ <div className="mt-3 p-4 rounded-xl bg-error/5 border border-error/10 text-sm text-error">
50
+ Failed to load diff: {error || "Unknown error"}
51
+ </div>
52
+ );
53
+ }
54
+
55
+ const computeDiff = () => {
56
+ if (!diff.baseline || !diff.evolved) return null;
57
+ const baseLines = diff.baseline.split("\n");
58
+ const evoLines = diff.evolved.split("\n");
59
+ const result: { type: "same" | "add" | "remove"; line: string; baseNum: number; evoNum: number }[] = [];
60
+ let bi = 0, ei = 0;
61
+ while (bi < baseLines.length || ei < evoLines.length) {
62
+ if (bi >= baseLines.length) {
63
+ result.push({ type: "add", line: evoLines[ei], baseNum: bi + 1, evoNum: ei + 1 });
64
+ ei++;
65
+ } else if (ei >= evoLines.length) {
66
+ result.push({ type: "remove", line: baseLines[bi], baseNum: bi + 1, evoNum: ei + 1 });
67
+ bi++;
68
+ } else if (baseLines[bi] === evoLines[ei]) {
69
+ result.push({ type: "same", line: baseLines[bi], baseNum: bi + 1, evoNum: ei + 1 });
70
+ bi++; ei++;
71
+ } else {
72
+ result.push({ type: "remove", line: baseLines[bi], baseNum: bi + 1, evoNum: ei + 1 });
73
+ result.push({ type: "add", line: evoLines[ei], baseNum: bi + 1, evoNum: ei + 1 });
74
+ bi++; ei++;
75
+ }
76
+ }
77
+ return result;
78
+ };
79
+
80
+ const diffLines = computeDiff();
81
+
82
+ return (
83
+ <motion.div
84
+ initial={{ opacity: 0, height: 0 }}
85
+ animate={{ opacity: 1, height: "auto" }}
86
+ exit={{ opacity: 0, height: 0 }}
87
+ className="mt-3 overflow-hidden"
88
+ >
89
+ <div className="rounded-xl bg-black/40 border border-white/[0.06] overflow-hidden">
90
+ <div className="flex items-center justify-between px-3 py-2 border-b border-white/[0.06]">
91
+ <div className="flex items-center gap-1">
92
+ <button
93
+ onClick={() => setActiveTab("baseline")}
94
+ className={`px-3 py-1 rounded-lg text-xs font-medium transition-colors ${
95
+ activeTab === "baseline" ? "bg-white/[0.08] text-foreground" : "text-muted-foreground hover:text-foreground"
96
+ }`}
97
+ >
98
+ <FileText className="w-3 h-3 inline mr-1" />
99
+ Before
100
+ </button>
101
+ <button
102
+ onClick={() => setActiveTab("evolved")}
103
+ className={`px-3 py-1 rounded-lg text-xs font-medium transition-colors ${
104
+ activeTab === "evolved" ? "bg-white/[0.08] text-foreground" : "text-muted-foreground hover:text-foreground"
105
+ }`}
106
+ >
107
+ <Code2 className="w-3 h-3 inline mr-1" />
108
+ After
109
+ </button>
110
+ {diffLines && (
111
+ <button
112
+ onClick={() => setActiveTab("diff")}
113
+ className={`px-3 py-1 rounded-lg text-xs font-medium transition-colors ${
114
+ activeTab === "diff" ? "bg-white/[0.08] text-foreground" : "text-muted-foreground hover:text-foreground"
115
+ }`}
116
+ >
117
+ <GitBranch className="w-3 h-3 inline mr-1" />
118
+ Diff
119
+ </button>
120
+ )}
121
+ </div>
122
+ <button onClick={onClose} className="p-1 rounded-lg text-muted-foreground hover:text-foreground hover:bg-white/[0.05] transition-colors">
123
+ <X className="w-3.5 h-3.5" />
124
+ </button>
125
+ </div>
126
+
127
+ <div className="max-h-96 overflow-y-auto">
128
+ {activeTab === "baseline" && diff.baseline && (
129
+ <pre className="p-4 text-xs font-mono leading-relaxed text-muted-foreground whitespace-pre-wrap">{diff.baseline}</pre>
130
+ )}
131
+ {activeTab === "evolved" && diff.evolved && (
132
+ <pre className="p-4 text-xs font-mono leading-relaxed text-muted-foreground whitespace-pre-wrap">{diff.evolved}</pre>
133
+ )}
134
+ {activeTab === "diff" && diffLines && (
135
+ <div className="p-4 text-xs font-mono leading-relaxed">
136
+ {diffLines.map((d, i) => (
137
+ <div
138
+ key={i}
139
+ className={`flex gap-2 px-1 -mx-1 rounded ${
140
+ d.type === "add" ? "bg-success/10 text-success" : d.type === "remove" ? "bg-error/10 text-error" : ""
141
+ }`}
142
+ >
143
+ <span className="text-muted-foreground/40 w-8 text-right select-none flex-shrink-0">{d.type === "add" ? d.evoNum : d.baseNum}</span>
144
+ <span className="text-muted-foreground/40 w-4 select-none flex-shrink-0">{d.type === "add" ? "+" : d.type === "remove" ? "-" : " "}</span>
145
+ <span className="break-all">{d.line}</span>
146
+ </div>
147
+ ))}
148
+ </div>
149
+ )}
150
+ </div>
151
+ </div>
152
+ </motion.div>
153
+ );
154
+ }
@@ -0,0 +1,67 @@
1
+ "use client";
2
+
3
+ import { useEffect, useState } from "react";
4
+
5
+ export default function ThemeAwareBackground() {
6
+ const [isDark, setIsDark] = useState(false);
7
+
8
+ useEffect(() => {
9
+ const html = document.documentElement;
10
+ const check = () => setIsDark(html.classList.contains("dark"));
11
+ check();
12
+ const observer = new MutationObserver(check);
13
+ observer.observe(html, { attributes: true, attributeFilter: ["class"] });
14
+ return () => observer.disconnect();
15
+ }, []);
16
+
17
+ return (
18
+ <div className="fixed inset-0 -z-10 pointer-events-none overflow-hidden">
19
+ {/* Light mode gradient */}
20
+ <div
21
+ className={`absolute inset-0 transition-opacity duration-500 ${
22
+ isDark ? "opacity-0" : "opacity-40"
23
+ }`}
24
+ style={{
25
+ background: `
26
+ radial-gradient(ellipse 80% 60% at 0% 20%, rgba(178, 255, 255, 0.6) 0%, transparent 60%),
27
+ radial-gradient(ellipse 60% 50% at 100% 40%, rgba(103, 232, 249, 0.4) 0%, transparent 50%),
28
+ radial-gradient(ellipse 50% 40% at 50% 80%, rgba(236, 254, 255, 0.3) 0%, transparent 50%),
29
+ transparent
30
+ `,
31
+ animation: "ambient-drift 12s ease-in-out infinite alternate",
32
+ }}
33
+ />
34
+ {/* Dark mode gradient */}
35
+ <div
36
+ className={`absolute inset-0 transition-opacity duration-500 ${
37
+ isDark ? "opacity-30" : "opacity-0"
38
+ }`}
39
+ style={{
40
+ background: `
41
+ radial-gradient(ellipse 70% 50% at 20% 30%, rgba(6, 182, 212, 0.15) 0%, transparent 60%),
42
+ radial-gradient(ellipse 50% 40% at 80% 60%, rgba(139, 92, 246, 0.1) 0%, transparent 50%),
43
+ transparent
44
+ `,
45
+ animation: "ambient-drift 15s ease-in-out infinite alternate-reverse",
46
+ }}
47
+ />
48
+ {/* Noise overlay */}
49
+ <div
50
+ className="absolute inset-0 opacity-[0.015]"
51
+ style={{
52
+ backgroundImage:
53
+ "url(\"data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)'/%3E%3C/svg%3E\")",
54
+ backgroundSize: "256px 256px",
55
+ }}
56
+ />
57
+ <style jsx>{`
58
+ @keyframes ambient-drift {
59
+ 0% { transform: translate(0, 0) scale(1); }
60
+ 33% { transform: translate(2%, -1%) scale(1.02); }
61
+ 66% { transform: translate(-1%, 2%) scale(0.98); }
62
+ 100% { transform: translate(1%, 1%) scale(1.01); }
63
+ }
64
+ `}</style>
65
+ </div>
66
+ );
67
+ }