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,455 @@
1
+ // ── Infrastructure: Resilient API client ──────────────────────────────
2
+ //
3
+ // Contract → docs/api/hermes-api.openapi.yaml
4
+ // Design → AbortController timeouts, typed errors, network detection
5
+ // Auth → Hermes session-token (X-Hermes-Session-Token), auto-refresh on 401
6
+ // Proxy → Next.js rewrites /api/* → Hermes web server (:9119)
7
+ // Fallback → relative URLs (127.0.0.1 evita DNS roto en tiling WMs/Linux)
8
+ // Env → NEXT_PUBLIC_API_BASE (solo para WebSocket y token fetch)
9
+
10
+ // ── Env resolution ───────────────────────────────────────────────────
11
+ function resolveBase(): string {
12
+ // Hardcoded to FastAPI backend — env vars don't survive Turbopack HMR
13
+ return "http://localhost:8000";
14
+ }
15
+
16
+ const API_BASE = resolveBase();
17
+
18
+ // URL absoluta del backend (para token fetch y WebSocket)
19
+ const HERMES_SERVER = API_BASE || "http://127.0.0.1:8000";
20
+
21
+ // ── Session token (Hermes auth) ──────────────────────────────────────
22
+ let _sessionToken: string | null = null;
23
+ let _tokenPromise: Promise<string | null> | null = null;
24
+
25
+ async function fetchSessionToken(): Promise<string | null> {
26
+ try {
27
+ const res = await fetch("/api/auth/token", {
28
+ signal: AbortSignal.timeout(5_000),
29
+ });
30
+ if (!res.ok) return null;
31
+ const data = await res.json();
32
+ return data?.token ?? null;
33
+ } catch {
34
+ return null;
35
+ }
36
+ }
37
+
38
+ async function getSessionToken(): Promise<string | null> {
39
+ if (_sessionToken) return _sessionToken;
40
+ if (!_tokenPromise) {
41
+ _tokenPromise = fetchSessionToken().then((token) => {
42
+ _sessionToken = token;
43
+ _tokenPromise = null;
44
+ return token;
45
+ });
46
+ }
47
+ return _tokenPromise;
48
+ }
49
+
50
+ function invalidateToken(): void {
51
+ _sessionToken = null;
52
+ _tokenPromise = null;
53
+ }
54
+
55
+ // ── Defaults ─────────────────────────────────────────────────────────
56
+ const DEFAULT_TIMEOUT_MS = 15_000;
57
+
58
+ // ── Typed errors (contract: ApiError schema) ─────────────────────────
59
+ export type ErrorKind = "network" | "timeout" | "server" | "client";
60
+
61
+ export class ApiError extends Error {
62
+ readonly kind: ErrorKind;
63
+ readonly status?: number;
64
+ readonly endpoint: string;
65
+
66
+ constructor(kind: ErrorKind, message: string, endpoint: string, status?: number) {
67
+ super(message);
68
+ this.name = "ApiError";
69
+ this.kind = kind;
70
+ this.status = status;
71
+ this.endpoint = endpoint;
72
+ }
73
+ }
74
+
75
+ /** Type guard para distinguir errores de API de excepciones genéricas */
76
+ export function isApiError(err: unknown): err is ApiError {
77
+ return err instanceof ApiError;
78
+ }
79
+
80
+ // ── Core fetch wrapper ───────────────────────────────────────────────
81
+ interface ApiOptions extends Omit<RequestInit, "signal"> {
82
+ /** Timeout en ms. Default 15s. 0 = sin timeout. */
83
+ timeout?: number;
84
+ }
85
+
86
+ async function executeRequest<T>(
87
+ path: string,
88
+ init: RequestInit & { timeout?: number },
89
+ ): Promise<T> {
90
+ const url = `${API_BASE}${path}`;
91
+ const controller = new AbortController();
92
+ const timer =
93
+ init.timeout && init.timeout > 0
94
+ ? setTimeout(() => controller.abort(), init.timeout)
95
+ : null;
96
+ const signal = controller.signal;
97
+
98
+ try {
99
+ const res = await fetch(url, { ...init, signal });
100
+
101
+ if (timer) clearTimeout(timer);
102
+
103
+ if (!res.ok) {
104
+ const body = await res.text().catch(() => res.statusText);
105
+ const kind: ErrorKind = res.status >= 500 ? "server" : "client";
106
+ throw new ApiError(kind, `HTTP ${res.status}: ${body.slice(0, 200)}`, path, res.status);
107
+ }
108
+
109
+ return res.json() as T;
110
+ } finally {
111
+ if (timer) clearTimeout(timer);
112
+ }
113
+ }
114
+
115
+ export async function api<T>(path: string, options?: ApiOptions): Promise<T> {
116
+ const { timeout = DEFAULT_TIMEOUT_MS, ...init } = options ?? {};
117
+ const token = await getSessionToken();
118
+
119
+ const headers: Record<string, string> = {
120
+ "Content-Type": "application/json",
121
+ ...(token ? { "X-Hermes-Session-Token": token } : {}),
122
+ ...((init.headers as Record<string, string>) ?? {}),
123
+ };
124
+
125
+ try {
126
+ return await executeRequest<T>(path, { ...init, headers, timeout });
127
+ } catch (err: unknown) {
128
+ // Auto-refresh token on 401 and retry once
129
+ if (err instanceof ApiError && err.status === 401) {
130
+ invalidateToken();
131
+ const freshToken = await getSessionToken();
132
+ if (freshToken) {
133
+ headers["X-Hermes-Session-Token"] = freshToken;
134
+ return executeRequest<T>(path, { ...init, headers, timeout });
135
+ }
136
+ }
137
+
138
+ // Re-lanzar errores ya tipados
139
+ if (err instanceof ApiError) throw err;
140
+
141
+ // AbortController / timeout
142
+ if (err instanceof DOMException && err.name === "AbortError") {
143
+ throw new ApiError("timeout", `Request to ${path} timed out after ${timeout}ms`, path);
144
+ }
145
+
146
+ // TypeError (network unreachable, CORS, DNS)
147
+ if (err instanceof TypeError) {
148
+ throw new ApiError("network", `Cannot reach ${HERMES_SERVER} — ${err.message}`, path);
149
+ }
150
+
151
+ // Fallback
152
+ throw new ApiError("network", err instanceof Error ? err.message : "Unknown fetch error", path);
153
+ }
154
+ }
155
+
156
+ // ── WebSocket helper ─────────────────────────────────────────────────
157
+ let _wsToken: string | null = null;
158
+
159
+ export async function wsConnect(onMessage: (data: unknown) => void): Promise<WebSocket> {
160
+ // Lazy-load token
161
+ if (!_wsToken) {
162
+ _wsToken = await getSessionToken();
163
+ }
164
+ const tokenQs = _wsToken ? `?token=${encodeURIComponent(_wsToken)}` : "";
165
+ const wsUrl = HERMES_SERVER.replace(/^http/, "ws") + "/ws/stream" + tokenQs;
166
+ const ws = new WebSocket(wsUrl);
167
+
168
+ ws.onmessage = (event) => {
169
+ try {
170
+ onMessage(JSON.parse(event.data));
171
+ } catch {
172
+ // ignore parse errors
173
+ }
174
+ };
175
+
176
+ ws.onclose = () => {
177
+ // Auto-reconnect after 3s
178
+ setTimeout(() => wsConnect(onMessage), 3000);
179
+ };
180
+
181
+ return ws;
182
+ }
183
+
184
+ // ── Health check (for Circuit Breaker) ───────────────────────────────
185
+ //
186
+ // Uses /api/health which is public (no session token required), making it
187
+ // the ideal endpoint for connectivity checks.
188
+ export async function checkHealth(): Promise<{
189
+ ok: boolean;
190
+ kind?: ErrorKind;
191
+ message?: string;
192
+ }> {
193
+ try {
194
+ await api<unknown>("/api/health", { timeout: 5_000 });
195
+ return { ok: true };
196
+ } catch (err) {
197
+ if (err instanceof ApiError) {
198
+ return { ok: false, kind: err.kind, message: err.message };
199
+ }
200
+ return { ok: false, kind: "network", message: "Unknown error" };
201
+ }
202
+ }
203
+
204
+ // ── Typed API calls ──────────────────────────────────────────────────
205
+
206
+ export interface SkillInfo {
207
+ name: string;
208
+ path: string;
209
+ description: string;
210
+ size: number;
211
+ last_modified: string;
212
+ providers: string[];
213
+ provider_count: number;
214
+ category: string;
215
+ }
216
+
217
+ export interface SkillDetail {
218
+ name: string;
219
+ path: string;
220
+ frontmatter: Record<string, unknown>;
221
+ body: string;
222
+ raw: string;
223
+ size: number;
224
+ }
225
+
226
+ export interface EvolutionRun {
227
+ skill_name: string;
228
+ timestamp: string;
229
+ baseline_score: number;
230
+ evolved_score: number;
231
+ improvement: number;
232
+ elapsed_seconds: number;
233
+ constraints_passed: boolean;
234
+ iterations: number;
235
+ optimizer_model: string;
236
+ }
237
+
238
+ export interface MetricsData {
239
+ total_runs: number;
240
+ skills_evolved: number;
241
+ avg_improvement: number;
242
+ best_improvement: number;
243
+ total_time_seconds: number;
244
+ avg_time_seconds: number;
245
+ success_rate: number;
246
+ runs: EvolutionRun[];
247
+ }
248
+
249
+ export interface DatasetInfo {
250
+ skill: string;
251
+ path: string;
252
+ splits: Record<string, number>;
253
+ total: number;
254
+ }
255
+
256
+ export interface ConstraintResult {
257
+ passed: boolean;
258
+ constraint: string;
259
+ message: string;
260
+ details: string | null;
261
+ }
262
+
263
+ export const fetchSkills = () => api<SkillInfo[]>("/api/skills");
264
+ export const fetchSkill = (name: string) => api<SkillDetail>(`/api/skills/${name}`);
265
+ export const fetchSkillHistory = (name: string) =>
266
+ api<EvolutionRun[]>(`/api/skills/${name}/evolution-history`);
267
+
268
+ // Skill management helpers
269
+ export interface ProviderSummary {
270
+ name: string;
271
+ total: number;
272
+ enabled: number;
273
+ skills: {
274
+ name: string;
275
+ description: string;
276
+ enabled: boolean;
277
+ tags: string[];
278
+ is_fork?: boolean;
279
+ category: string;
280
+ }[];
281
+ }
282
+
283
+ export const fetchSkillProviders = () =>
284
+ api<{ status: string; providers: ProviderSummary[] }>("/api/skills/providers");
285
+
286
+ export const toggleSkillEnabled = (provider: string, skillName: string, enabled: boolean) =>
287
+ api<{ status: string; enabled: boolean }>("/api/skills/toggle", {
288
+ method: "POST",
289
+ body: JSON.stringify({ provider, skill_name: skillName, enabled }),
290
+ });
291
+
292
+ export const deleteProviderSkill = (provider: string, skillName: string) =>
293
+ api<{ status: string; message: string }>(`/api/skills/${provider}/${encodeURIComponent(skillName)}`, {
294
+ method: "DELETE",
295
+ });
296
+
297
+ export const deleteGlobalSkill = (skillName: string) =>
298
+ api<{ status: string; message: string }>(`/api/skills/global/${encodeURIComponent(skillName)}`, {
299
+ method: "DELETE",
300
+ });
301
+
302
+ export const refreshSkills = () =>
303
+ api<{ status: string; providers: ProviderSummary[] }>("/api/skills/refresh");
304
+ export const fetchEvolutionRuns = () => api<EvolutionRun[]>("/api/evolution/runs");
305
+
306
+ export interface SkillDiff {
307
+ skill_name: string;
308
+ run_dir: string;
309
+ baseline: string | null;
310
+ evolved: string | null;
311
+ metrics: Record<string, unknown> | null;
312
+ }
313
+
314
+ export const fetchSkillDiff = (skillName: string, runDir: string) =>
315
+ api<SkillDiff>(`/api/skills/${encodeURIComponent(skillName)}/evolution/${encodeURIComponent(runDir)}/diff`);
316
+
317
+ // ── Job tracking ─────────────────────────────────────────────────────
318
+
319
+ export interface EvolutionJob {
320
+ id: string;
321
+ skill_name: string;
322
+ status: string;
323
+ iterations: number;
324
+ current_iteration: number;
325
+ pid: number | null;
326
+ started_at: string;
327
+ completed_at: string;
328
+ baseline_score: number | null;
329
+ current_best_score: number | null;
330
+ evolved_score: number | null;
331
+ improvement: number | null;
332
+ error: string;
333
+ progress: number;
334
+ logs: string[];
335
+ }
336
+
337
+ export const fetchJobs = (activeOnly = false) =>
338
+ api<EvolutionJob[]>(`/api/jobs?active_only=${activeOnly}`);
339
+
340
+ export const fetchJob = (jobId: string) =>
341
+ api<EvolutionJob>(`/api/jobs/${jobId}`);
342
+
343
+ export const fetchJobLogs = (jobId: string, since = 0) =>
344
+ api<{ job_id: string; total_lines: number; logs: string[]; status: string; progress: number }>(
345
+ `/api/jobs/${jobId}/logs?since=${since}`
346
+ );
347
+
348
+ export const cancelJob = (jobId: string) =>
349
+ api<{ status: string; job_id: string }>(`/api/jobs/${jobId}`, { method: "DELETE" });
350
+
351
+ export const startEvolution = (skillName: string, iterations: number) =>
352
+ api<{ job_id: string; skill: string; status: string; error?: string }>("/api/evolution/start", {
353
+ method: "POST",
354
+ body: JSON.stringify({ skill_name: skillName, iterations, eval_source: "synthetic" }),
355
+ });
356
+ export const fetchMetrics = () => api<MetricsData>("/api/metrics");
357
+ export const fetchDatasets = () => api<DatasetInfo[]>("/api/datasets");
358
+ export const fetchDataset = (skill: string) =>
359
+ api<Record<string, unknown[]>>(`/api/datasets/${skill}`);
360
+ export const validateSkill = (name: string) =>
361
+ api<ConstraintResult[]>(`/api/constraints/validate/${name}`);
362
+ export const fetchHealth = () =>
363
+ api<{
364
+ status: string;
365
+ hermes_repo: string;
366
+ hermes_repo_exists: boolean;
367
+ evolution_dir: string;
368
+ evolution_dir_exists: boolean;
369
+ skills_count: number;
370
+ categories: Record<string, number>;
371
+ }>("/api/health");
372
+
373
+ // ── Curator API — Skill Lifecycle Management ──────────────────────
374
+
375
+ export interface CuratorStatus {
376
+ status: string;
377
+ last_run: { timestamp: string | null } | null;
378
+ last_run_dir: string | null;
379
+ stats: {
380
+ active: number;
381
+ stale: number;
382
+ archived: number;
383
+ total: number;
384
+ pinned: number;
385
+ };
386
+ pinned_skills: string[];
387
+ least_recently_used: Array<{
388
+ name: string;
389
+ last_used: string;
390
+ use_count: number;
391
+ view_count: number;
392
+ }>;
393
+ }
394
+
395
+ export interface CuratorSkillUsage {
396
+ name: string;
397
+ state: "active" | "stale" | "archived" | "untracked";
398
+ pinned: boolean;
399
+ use_count: number;
400
+ view_count: number;
401
+ patch_count: number;
402
+ last_used_at: string | null;
403
+ last_viewed_at: string | null;
404
+ last_patched_at: string | null;
405
+ created_at: string | null;
406
+ archived_at: string | null;
407
+ agent_created: boolean;
408
+ }
409
+
410
+ export interface CuratorReport {
411
+ id: string;
412
+ timestamp: string;
413
+ has_report: boolean;
414
+ has_run_data: boolean;
415
+ summary?: {
416
+ skills_reviewed: number;
417
+ archived: number;
418
+ patched: number;
419
+ consolidated: number;
420
+ };
421
+ }
422
+
423
+ export interface CuratorReportDetail {
424
+ id: string;
425
+ timestamp: string;
426
+ report_md?: string;
427
+ run_data?: Record<string, unknown>;
428
+ }
429
+
430
+ export const fetchCuratorStatus = () =>
431
+ api<CuratorStatus>("/api/curator/status");
432
+
433
+ export const fetchCuratorSkills = () =>
434
+ api<{ skills: CuratorSkillUsage[] }>("/api/curator/skills");
435
+
436
+ export const curatorPin = (skill: string) =>
437
+ api<{ status: string; pinned: boolean }>(`/api/curator/pin/${encodeURIComponent(skill)}`, { method: "POST" });
438
+
439
+ export const curatorUnpin = (skill: string) =>
440
+ api<{ status: string; pinned: boolean }>(`/api/curator/unpin/${encodeURIComponent(skill)}`, { method: "POST" });
441
+
442
+ export const curatorRestore = (skill: string) =>
443
+ api<{ status: string; restored: boolean }>(`/api/curator/restore/${encodeURIComponent(skill)}`, { method: "POST" });
444
+
445
+ export const curatorRun = (sync = false) =>
446
+ api<{ status: string; report_id?: string; transitions?: Record<string, string[]> }>(
447
+ `/api/curator/run?sync=${sync}`,
448
+ { method: "POST" }
449
+ );
450
+
451
+ export const fetchCuratorReports = (limit = 10) =>
452
+ api<{ reports: CuratorReport[] }>(`/api/curator/reports?limit=${limit}`);
453
+
454
+ export const fetchCuratorReport = (reportId: string) =>
455
+ api<CuratorReportDetail>(`/api/curator/reports/${reportId}`);
@@ -0,0 +1,12 @@
1
+ import { QueryClient } from '@tanstack/react-query'
2
+
3
+ export const queryClient = new QueryClient({
4
+ defaultOptions: {
5
+ queries: {
6
+ staleTime: 1000 * 60 * 5, // 5 minutes
7
+ gcTime: 1000 * 60 * 30, // 30 minutes
8
+ refetchOnWindowFocus: false,
9
+ retry: 1,
10
+ },
11
+ },
12
+ })
@@ -0,0 +1,6 @@
1
+ import { clsx, type ClassValue } from "clsx"
2
+ import { twMerge } from "tailwind-merge"
3
+
4
+ export function cn(...inputs: ClassValue[]) {
5
+ return twMerge(clsx(inputs))
6
+ }