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.
- package/.brv/.obsidian/app.json +1 -0
- package/.brv/.obsidian/appearance.json +1 -0
- package/.brv/.obsidian/core-plugins.json +33 -0
- package/.brv/.obsidian/graph.json +22 -0
- package/.brv/.obsidian/workspace.json +195 -0
- package/.brv/Sin ti/314/201tulo 1.canvas" +1 -0
- package/.brv/Sin ti/314/201tulo 2.canvas" +1 -0
- package/.brv/Sin ti/314/201tulo.canvas" +1 -0
- package/.brv/_queue_status.json +1 -0
- package/.brv/config.json +5 -0
- package/.brv/context-tree/_index.md +60 -0
- package/.brv/context-tree/_manifest.json +165 -0
- package/.brv/context-tree/backend/_index.md +24 -0
- package/.brv/context-tree/backend/backend/_index.md +40 -0
- package/.brv/context-tree/backend/backend/init.abstract.md +0 -0
- package/.brv/context-tree/backend/backend/init.md +27 -0
- package/.brv/context-tree/backend/backend/init.overview.md +29 -0
- package/.brv/context-tree/backend/backend/job_tracker.abstract.md +1 -0
- package/.brv/context-tree/backend/backend/job_tracker.md +273 -0
- package/.brv/context-tree/backend/backend/job_tracker.overview.md +31 -0
- package/.brv/context-tree/backend/backend/main.abstract.md +0 -0
- package/.brv/context-tree/backend/backend/main.md +1292 -0
- package/.brv/context-tree/backend/backend/main.overview.md +30 -0
- package/.brv/context-tree/backend/backend/requirements.abstract.md +1 -0
- package/.brv/context-tree/backend/backend/requirements.md +37 -0
- package/.brv/context-tree/backend/backend/requirements.overview.md +28 -0
- package/.brv/context-tree/docs/_index.md +37 -0
- package/.brv/context-tree/docs/api/_index.md +54 -0
- package/.brv/context-tree/docs/api/context.md +11 -0
- package/.brv/context-tree/docs/api/hermes_api_openapi_specification.abstract.md +0 -0
- package/.brv/context-tree/docs/api/hermes_api_openapi_specification.md +468 -0
- package/.brv/context-tree/docs/api/hermes_api_openapi_specification.overview.md +44 -0
- package/.brv/context-tree/frontend/_index.md +48 -0
- package/.brv/context-tree/frontend/hermes_dashboard/_index.md +31 -0
- package/.brv/context-tree/frontend/hermes_dashboard/architecture_overview.abstract.md +0 -0
- package/.brv/context-tree/frontend/hermes_dashboard/architecture_overview.md +41 -0
- package/.brv/context-tree/frontend/hermes_dashboard/architecture_overview.overview.md +34 -0
- package/.brv/context-tree/frontend/src/_index.md +53 -0
- package/.brv/context-tree/frontend/src/components/_index.md +52 -0
- package/.brv/context-tree/frontend/src/components/sidebar_navigation_component.abstract.md +0 -0
- package/.brv/context-tree/frontend/src/components/sidebar_navigation_component.md +161 -0
- package/.brv/context-tree/frontend/src/components/sidebar_navigation_component.overview.md +32 -0
- package/.brv/context-tree/frontend/src/context.md +10 -0
- package/.brv/context-tree/frontend/src/functioncallingpage.abstract.md +0 -0
- package/.brv/context-tree/frontend/src/functioncallingpage.md +34 -0
- package/.brv/context-tree/frontend/src/functioncallingpage.overview.md +26 -0
- package/.brv/context-tree/frontend/src/lib/_index.md +48 -0
- package/.brv/context-tree/frontend/src/lib/api_client_library.abstract.md +1 -0
- package/.brv/context-tree/frontend/src/lib/api_client_library.md +403 -0
- package/.brv/context-tree/frontend/src/lib/api_client_library.overview.md +69 -0
- package/.brv/context-tree/frontend/src/page.abstract.md +0 -0
- package/.brv/context-tree/frontend/src/page.md +103 -0
- package/.brv/context-tree/frontend/src/page.overview.md +7 -0
- package/.brv/context-tree/frontend/src/settingspage.abstract.md +0 -0
- package/.brv/context-tree/frontend/src/settingspage.md +124 -0
- package/.brv/context-tree/frontend/src/settingspage.overview.md +34 -0
- package/.brv/context-tree/frontend/src/sidebar.abstract.md +0 -0
- package/.brv/context-tree/frontend/src/sidebar.md +170 -0
- package/.brv/context-tree/frontend/src/sidebar.overview.md +25 -0
- package/.brv/context-tree/meta/_index.md +24 -0
- package/.brv/context-tree/meta/curation_context/_index.md +24 -0
- package/.brv/context-tree/meta/curation_context/empty_context.abstract.md +4 -0
- package/.brv/context-tree/meta/curation_context/empty_context.md +35 -0
- package/.brv/context-tree/meta/curation_context/empty_context.overview.md +20 -0
- package/.brv/dream-log/drm-1777341062653.json +33 -0
- package/.brv/dream-state.json +8 -0
- package/.brv/dream.lock +0 -0
- package/.brv/review-backups/docs/api/hermes_api_openapi_specification.md +468 -0
- package/.claude/settings.local.json +7 -0
- package/.claude/worktrees/phase-2-mcp/.brv/.obsidian/app.json +1 -0
- package/.claude/worktrees/phase-2-mcp/.brv/.obsidian/appearance.json +1 -0
- package/.claude/worktrees/phase-2-mcp/.brv/.obsidian/core-plugins.json +33 -0
- package/.claude/worktrees/phase-2-mcp/.brv/.obsidian/graph.json +22 -0
- package/.claude/worktrees/phase-2-mcp/.brv/.obsidian/workspace.json +195 -0
- package/.claude/worktrees/phase-2-mcp/.brv/Sin t/303/255tulo 1.canvas" +1 -0
- package/.claude/worktrees/phase-2-mcp/.brv/Sin t/303/255tulo 2.canvas" +1 -0
- package/.claude/worktrees/phase-2-mcp/.brv/Sin t/303/255tulo.canvas" +1 -0
- package/.claude/worktrees/phase-2-mcp/.brv/_queue_status.json +1 -0
- package/.claude/worktrees/phase-2-mcp/.brv/config.json +5 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/_index.md +60 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/_manifest.json +165 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/_index.md +24 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/backend/_index.md +40 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/backend/init.abstract.md +0 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/backend/init.md +27 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/backend/init.overview.md +29 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/backend/job_tracker.abstract.md +1 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/backend/job_tracker.md +273 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/backend/job_tracker.overview.md +31 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/backend/main.abstract.md +0 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/backend/main.md +1292 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/backend/main.overview.md +30 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/backend/requirements.abstract.md +1 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/backend/requirements.md +37 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/backend/requirements.overview.md +28 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/docs/_index.md +37 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/docs/api/_index.md +54 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/docs/api/context.md +11 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/docs/api/hermes_api_openapi_specification.abstract.md +0 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/docs/api/hermes_api_openapi_specification.md +468 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/docs/api/hermes_api_openapi_specification.overview.md +44 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/_index.md +48 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/hermes_dashboard/_index.md +31 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/hermes_dashboard/architecture_overview.abstract.md +0 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/hermes_dashboard/architecture_overview.md +41 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/hermes_dashboard/architecture_overview.overview.md +34 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/_index.md +53 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/components/_index.md +52 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/components/sidebar_navigation_component.abstract.md +0 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/components/sidebar_navigation_component.md +161 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/components/sidebar_navigation_component.overview.md +32 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/context.md +10 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/functioncallingpage.abstract.md +0 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/functioncallingpage.md +34 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/functioncallingpage.overview.md +26 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/lib/_index.md +48 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/lib/api_client_library.abstract.md +1 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/lib/api_client_library.md +403 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/lib/api_client_library.overview.md +69 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/page.abstract.md +0 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/page.md +103 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/page.overview.md +7 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/settingspage.abstract.md +0 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/settingspage.md +124 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/settingspage.overview.md +34 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/sidebar.abstract.md +0 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/sidebar.md +170 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/sidebar.overview.md +25 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/meta/_index.md +24 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/meta/curation_context/_index.md +24 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/meta/curation_context/empty_context.abstract.md +4 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/meta/curation_context/empty_context.md +35 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/meta/curation_context/empty_context.overview.md +20 -0
- package/.claude/worktrees/phase-2-mcp/.brv/dream-log/drm-1777341062653.json +33 -0
- package/.claude/worktrees/phase-2-mcp/.brv/dream-state.json +8 -0
- package/.claude/worktrees/phase-2-mcp/.brv/dream.lock +0 -0
- package/.claude/worktrees/phase-2-mcp/.brv/review-backups/docs/api/hermes_api_openapi_specification.md +468 -0
- package/.claude/worktrees/phase-2-mcp/.claude/settings.local.json +13 -0
- package/.claude/worktrees/phase-2-mcp/.kilocode/package-lock.json +378 -0
- package/.claude/worktrees/phase-2-mcp/.kilocode/package.json +5 -0
- package/.claude/worktrees/phase-2-mcp/AGENTS.md +5 -0
- package/.claude/worktrees/phase-2-mcp/CLAUDE.md +29 -0
- package/.claude/worktrees/phase-2-mcp/QA_AUDIT_PLAN.md +156 -0
- package/.claude/worktrees/phase-2-mcp/README.md +316 -0
- package/.claude/worktrees/phase-2-mcp/agent-agnostic-evolution-dashboard.md +405 -0
- package/.claude/worktrees/phase-2-mcp/backend/__init__.py +0 -0
- package/.claude/worktrees/phase-2-mcp/backend/collectors/__init__.py +0 -0
- package/.claude/worktrees/phase-2-mcp/backend/collectors/claude_code_collector.py +277 -0
- package/.claude/worktrees/phase-2-mcp/backend/collectors/hermes_collector.py +68 -0
- package/.claude/worktrees/phase-2-mcp/backend/curator.py +512 -0
- package/.claude/worktrees/phase-2-mcp/backend/eval/__init__.py +19 -0
- package/.claude/worktrees/phase-2-mcp/backend/eval/engine.py +116 -0
- package/.claude/worktrees/phase-2-mcp/backend/eval/scorers.py +201 -0
- package/.claude/worktrees/phase-2-mcp/backend/generate_dataset.py +86 -0
- package/.claude/worktrees/phase-2-mcp/backend/job_tracker.py +232 -0
- package/.claude/worktrees/phase-2-mcp/backend/main.py +1746 -0
- package/.claude/worktrees/phase-2-mcp/backend/mcp_server.py +250 -0
- package/.claude/worktrees/phase-2-mcp/backend/promethean/__init__.py +24 -0
- package/.claude/worktrees/phase-2-mcp/backend/promethean/cycle_orchestrator.py +270 -0
- package/.claude/worktrees/phase-2-mcp/backend/promethean/delta_validator.py +191 -0
- package/.claude/worktrees/phase-2-mcp/backend/promethean/dspy_compiler.py +315 -0
- package/.claude/worktrees/phase-2-mcp/backend/promethean/gepa_strategist.py +213 -0
- package/.claude/worktrees/phase-2-mcp/backend/promethean/models.py +260 -0
- package/.claude/worktrees/phase-2-mcp/backend/promethean/skill_deployer.py +195 -0
- package/.claude/worktrees/phase-2-mcp/backend/promethean/trace_ingestion.py +142 -0
- package/.claude/worktrees/phase-2-mcp/backend/requirements.txt +6 -0
- package/.claude/worktrees/phase-2-mcp/backend/sdd_evolve.py +459 -0
- package/.claude/worktrees/phase-2-mcp/backend/skill_detector.py +227 -0
- package/.claude/worktrees/phase-2-mcp/backend/skill_registry.py +289 -0
- package/.claude/worktrees/phase-2-mcp/backend/storage/__init__.py +5 -0
- package/.claude/worktrees/phase-2-mcp/backend/storage/run_store.py +393 -0
- package/.claude/worktrees/phase-2-mcp/backend/storage/schema.sql +99 -0
- package/.claude/worktrees/phase-2-mcp/backend/validate_evolution.py +267 -0
- package/.claude/worktrees/phase-2-mcp/components.json +28 -0
- package/.claude/worktrees/phase-2-mcp/docs/api/hermes-api.openapi.yaml +438 -0
- package/.claude/worktrees/phase-2-mcp/docs/hero.svg +148 -0
- package/.claude/worktrees/phase-2-mcp/eslint.config.mjs +18 -0
- package/.claude/worktrees/phase-2-mcp/install.sh +245 -0
- package/.claude/worktrees/phase-2-mcp/next-env.d.ts +6 -0
- package/.claude/worktrees/phase-2-mcp/next.config.ts +32 -0
- package/.claude/worktrees/phase-2-mcp/package-lock.json +11936 -0
- package/.claude/worktrees/phase-2-mcp/package.json +41 -0
- package/.claude/worktrees/phase-2-mcp/pnpm-workspace.yaml +4 -0
- package/.claude/worktrees/phase-2-mcp/postcss.config.mjs +7 -0
- package/.claude/worktrees/phase-2-mcp/public/file.svg +1 -0
- package/.claude/worktrees/phase-2-mcp/public/fonts/SF-Pro-Display-Bold.otf +0 -0
- package/.claude/worktrees/phase-2-mcp/public/fonts/SF-Pro-Display-Heavy.otf +0 -0
- package/.claude/worktrees/phase-2-mcp/public/fonts/SF-Pro-Display-Medium.otf +0 -0
- package/.claude/worktrees/phase-2-mcp/public/fonts/SF-Pro-Display-Regular.otf +0 -0
- package/.claude/worktrees/phase-2-mcp/public/fonts/SF-Pro-Display-Semibold.otf +0 -0
- package/.claude/worktrees/phase-2-mcp/public/fonts/SF-Pro-Text-Bold.otf +0 -0
- package/.claude/worktrees/phase-2-mcp/public/fonts/SF-Pro-Text-Heavy.otf +0 -0
- package/.claude/worktrees/phase-2-mcp/public/fonts/SF-Pro-Text-Medium.otf +0 -0
- package/.claude/worktrees/phase-2-mcp/public/fonts/SF-Pro-Text-Regular.otf +0 -0
- package/.claude/worktrees/phase-2-mcp/public/fonts/SF-Pro-Text-Semibold.otf +0 -0
- package/.claude/worktrees/phase-2-mcp/public/globe.svg +1 -0
- package/.claude/worktrees/phase-2-mcp/public/next.svg +1 -0
- package/.claude/worktrees/phase-2-mcp/public/theme-preview.html +257 -0
- package/.claude/worktrees/phase-2-mcp/public/vercel.svg +1 -0
- package/.claude/worktrees/phase-2-mcp/public/window.svg +1 -0
- package/.claude/worktrees/phase-2-mcp/run.sh +26 -0
- package/.claude/worktrees/phase-2-mcp/skills-lock.json +10 -0
- package/.claude/worktrees/phase-2-mcp/specs/event-schema.md +223 -0
- package/.claude/worktrees/phase-2-mcp/specs/examples/run.jsonl +3 -0
- package/.claude/worktrees/phase-2-mcp/src/app/api/[...path]/route.ts +55 -0
- package/.claude/worktrees/phase-2-mcp/src/app/api/auth/token/route.ts +22 -0
- package/.claude/worktrees/phase-2-mcp/src/app/evolution/page.tsx +589 -0
- package/.claude/worktrees/phase-2-mcp/src/app/favicon.ico +0 -0
- package/.claude/worktrees/phase-2-mcp/src/app/globals.css +321 -0
- package/.claude/worktrees/phase-2-mcp/src/app/layout.tsx +63 -0
- package/.claude/worktrees/phase-2-mcp/src/app/page.tsx +70 -0
- package/.claude/worktrees/phase-2-mcp/src/app/skills/page.tsx +369 -0
- package/.claude/worktrees/phase-2-mcp/src/components/ApiConfigCard.tsx +199 -0
- package/.claude/worktrees/phase-2-mcp/src/components/ColorBends.css +1 -0
- package/.claude/worktrees/phase-2-mcp/src/components/ColorBends.d.ts +1 -0
- package/.claude/worktrees/phase-2-mcp/src/components/ColorBends.jsx +1 -0
- package/.claude/worktrees/phase-2-mcp/src/components/CoreLoopToggle.tsx +111 -0
- package/.claude/worktrees/phase-2-mcp/src/components/EnvironmentStatus.tsx +176 -0
- package/.claude/worktrees/phase-2-mcp/src/components/EvolutionBackground.tsx +1 -0
- package/.claude/worktrees/phase-2-mcp/src/components/ReactQueryProvider.tsx +24 -0
- package/.claude/worktrees/phase-2-mcp/src/components/Sidebar.tsx +247 -0
- package/.claude/worktrees/phase-2-mcp/src/components/SkillDiffViewer.tsx +154 -0
- package/.claude/worktrees/phase-2-mcp/src/components/ThemeAwareBackground.tsx +67 -0
- package/.claude/worktrees/phase-2-mcp/src/components/ThemeToggle.tsx +54 -0
- package/.claude/worktrees/phase-2-mcp/src/components/WelcomeHero.tsx +77 -0
- package/.claude/worktrees/phase-2-mcp/src/components/bits/ClickSpark.tsx +116 -0
- package/.claude/worktrees/phase-2-mcp/src/components/bits/CountUp.tsx +98 -0
- package/.claude/worktrees/phase-2-mcp/src/components/bits/DarkSelect.tsx +95 -0
- package/.claude/worktrees/phase-2-mcp/src/components/bits/DecryptedText.tsx +161 -0
- package/.claude/worktrees/phase-2-mcp/src/components/bits/ElectricBorder.tsx +184 -0
- package/.claude/worktrees/phase-2-mcp/src/components/bits/GlitchText.tsx +34 -0
- package/.claude/worktrees/phase-2-mcp/src/components/bits/ShinyText.tsx +55 -0
- package/.claude/worktrees/phase-2-mcp/src/components/bits/SpotlightCard.tsx +42 -0
- package/.claude/worktrees/phase-2-mcp/src/components/bits/TextType.tsx +95 -0
- package/.claude/worktrees/phase-2-mcp/src/components/bits/index.ts +9 -0
- package/.claude/worktrees/phase-2-mcp/src/components/pages/CuratorPage.tsx +632 -0
- package/.claude/worktrees/phase-2-mcp/src/components/pages/DatasetPage.tsx +271 -0
- package/.claude/worktrees/phase-2-mcp/src/components/pages/EvolutionPage.tsx +676 -0
- package/.claude/worktrees/phase-2-mcp/src/components/pages/FunctionCallingPage.tsx +1 -0
- package/.claude/worktrees/phase-2-mcp/src/components/pages/LogsPage.tsx +272 -0
- package/.claude/worktrees/phase-2-mcp/src/components/pages/MetricsPage.tsx +246 -0
- package/.claude/worktrees/phase-2-mcp/src/components/pages/OverviewPage.tsx +420 -0
- package/.claude/worktrees/phase-2-mcp/src/components/pages/SettingsPage.tsx +88 -0
- package/.claude/worktrees/phase-2-mcp/src/components/pages/SkillStudioPage.tsx +376 -0
- package/.claude/worktrees/phase-2-mcp/src/components/ui/animated-theme-toggler.tsx +97 -0
- package/.claude/worktrees/phase-2-mcp/src/components/ui/button.tsx +67 -0
- package/.claude/worktrees/phase-2-mcp/src/components/ui/card.tsx +103 -0
- package/.claude/worktrees/phase-2-mcp/src/components/ui/input.tsx +19 -0
- package/.claude/worktrees/phase-2-mcp/src/components/ui/separator.tsx +28 -0
- package/.claude/worktrees/phase-2-mcp/src/components/ui/sheet.tsx +147 -0
- package/.claude/worktrees/phase-2-mcp/src/components/ui/sidebar.tsx +702 -0
- package/.claude/worktrees/phase-2-mcp/src/components/ui/skeleton.tsx +13 -0
- package/.claude/worktrees/phase-2-mcp/src/components/ui/theme-toggle.tsx +272 -0
- package/.claude/worktrees/phase-2-mcp/src/components/ui/tooltip.tsx +57 -0
- package/.claude/worktrees/phase-2-mcp/src/hooks/use-mobile.ts +19 -0
- package/.claude/worktrees/phase-2-mcp/src/lib/api.ts +455 -0
- package/.claude/worktrees/phase-2-mcp/src/lib/queryClient.ts +12 -0
- package/.claude/worktrees/phase-2-mcp/src/lib/utils.ts +6 -0
- package/.claude/worktrees/phase-2-mcp/stitch/agent_dashboard/DESIGN_SPEC.md +521 -0
- package/.claude/worktrees/phase-2-mcp/stitch/agent_dashboard/prototype.html +676 -0
- package/.claude/worktrees/phase-2-mcp/stitch/curator_workspace/code.html +448 -0
- package/.claude/worktrees/phase-2-mcp/stitch/curator_workspace/screen.png +0 -0
- package/.claude/worktrees/phase-2-mcp/stitch/datasets/code.html +479 -0
- package/.claude/worktrees/phase-2-mcp/stitch/datasets/screen.png +0 -0
- package/.claude/worktrees/phase-2-mcp/stitch/evolution_history/code.html +461 -0
- package/.claude/worktrees/phase-2-mcp/stitch/evolution_history/screen.png +0 -0
- package/.claude/worktrees/phase-2-mcp/stitch/hermes_dashboard/DESIGN.md +192 -0
- package/.claude/worktrees/phase-2-mcp/stitch/hermes_dashboard/DESIGN_SPEC.md +455 -0
- package/.claude/worktrees/phase-2-mcp/stitch/hermes_overview/code.html +399 -0
- package/.claude/worktrees/phase-2-mcp/stitch/hermes_overview/screen.png +0 -0
- package/.claude/worktrees/phase-2-mcp/stitch/live_logs/code.html +324 -0
- package/.claude/worktrees/phase-2-mcp/stitch/live_logs/screen.png +0 -0
- package/.claude/worktrees/phase-2-mcp/stitch/skill_hub/code.html +596 -0
- package/.claude/worktrees/phase-2-mcp/stitch/skill_hub/screen.png +0 -0
- package/.claude/worktrees/phase-2-mcp/stitch/system_metrics/code.html +527 -0
- package/.claude/worktrees/phase-2-mcp/stitch/system_metrics/screen.png +0 -0
- package/.claude/worktrees/phase-2-mcp/stitch/system_settings/code.html +257 -0
- package/.claude/worktrees/phase-2-mcp/stitch/system_settings/screen.png +0 -0
- package/.claude/worktrees/phase-2-mcp/test_dashboard.py +201 -0
- package/.claude/worktrees/phase-2-mcp/tests/collectors/__init__.py +0 -0
- package/.claude/worktrees/phase-2-mcp/tests/collectors/fixtures/sample_session.jsonl +7 -0
- package/.claude/worktrees/phase-2-mcp/tests/collectors/test_claude_code_collector.py +171 -0
- package/.claude/worktrees/phase-2-mcp/tests/collectors/test_hermes_collector.py +167 -0
- package/.claude/worktrees/phase-2-mcp/tests/eval/test_engine.py +234 -0
- package/.claude/worktrees/phase-2-mcp/tests/eval/test_scorers.py +249 -0
- package/.claude/worktrees/phase-2-mcp/tests/storage/__init__.py +0 -0
- package/.claude/worktrees/phase-2-mcp/tests/storage/test_run_store.py +359 -0
- package/.claude/worktrees/phase-2-mcp/tests/test_curator.py +559 -0
- package/.claude/worktrees/phase-2-mcp/tests/test_mcp_server.py +114 -0
- package/.claude/worktrees/phase-2-mcp/tsconfig.json +34 -0
- package/.env.example +72 -0
- package/.kilocode/package-lock.json +378 -0
- package/.kilocode/package.json +5 -0
- package/AGENTS.md +5 -0
- package/CLAUDE.md +29 -0
- package/QA_AUDIT_PLAN.md +156 -0
- package/README.md +355 -0
- package/agent-agnostic-evolution-dashboard.md +405 -0
- package/backend/__init__.py +0 -0
- package/backend/collectors/__init__.py +0 -0
- package/backend/collectors/claude_code_collector.py +277 -0
- package/backend/collectors/hermes_collector.py +68 -0
- package/backend/curator.py +512 -0
- package/backend/eval/__init__.py +19 -0
- package/backend/eval/engine.py +116 -0
- package/backend/eval/scorers.py +201 -0
- package/backend/generate_dataset.py +86 -0
- package/backend/job_tracker.py +232 -0
- package/backend/main.py +1746 -0
- package/backend/mcp_server.py +250 -0
- package/backend/promethean/__init__.py +24 -0
- package/backend/promethean/cycle_orchestrator.py +270 -0
- package/backend/promethean/delta_validator.py +191 -0
- package/backend/promethean/dspy_compiler.py +315 -0
- package/backend/promethean/gepa_strategist.py +213 -0
- package/backend/promethean/models.py +260 -0
- package/backend/promethean/skill_deployer.py +195 -0
- package/backend/promethean/trace_ingestion.py +142 -0
- package/backend/requirements.txt +6 -0
- package/backend/sdd_evolve.py +459 -0
- package/backend/skill_detector.py +227 -0
- package/backend/skill_registry.py +289 -0
- package/backend/storage/__init__.py +5 -0
- package/backend/storage/run_store.py +393 -0
- package/backend/storage/schema.sql +99 -0
- package/backend/validate_evolution.py +267 -0
- package/bin/genoma.js +250 -0
- package/components.json +28 -0
- package/docs/api/hermes-api.openapi.yaml +438 -0
- package/docs/hero.svg +148 -0
- package/eslint.config.mjs +18 -0
- package/install.sh +245 -0
- package/next-env.d.ts +6 -0
- package/next.config.ts +32 -0
- package/package.json +46 -0
- package/pnpm-workspace.yaml +4 -0
- package/postcss.config.mjs +7 -0
- package/public/file.svg +1 -0
- package/public/fonts/SF-Pro-Display-Bold.otf +0 -0
- package/public/fonts/SF-Pro-Display-Heavy.otf +0 -0
- package/public/fonts/SF-Pro-Display-Medium.otf +0 -0
- package/public/fonts/SF-Pro-Display-Regular.otf +0 -0
- package/public/fonts/SF-Pro-Display-Semibold.otf +0 -0
- package/public/fonts/SF-Pro-Text-Bold.otf +0 -0
- package/public/fonts/SF-Pro-Text-Heavy.otf +0 -0
- package/public/fonts/SF-Pro-Text-Medium.otf +0 -0
- package/public/fonts/SF-Pro-Text-Regular.otf +0 -0
- package/public/fonts/SF-Pro-Text-Semibold.otf +0 -0
- package/public/globe.svg +1 -0
- package/public/next.svg +1 -0
- package/public/theme-preview.html +257 -0
- package/public/vercel.svg +1 -0
- package/public/window.svg +1 -0
- package/run.sh +26 -0
- package/scripts/postinstall.js +50 -0
- package/skills-lock.json +10 -0
- package/specs/event-schema.md +223 -0
- package/specs/examples/run.jsonl +3 -0
- package/src/app/api/[...path]/route.ts +55 -0
- package/src/app/api/auth/token/route.ts +22 -0
- package/src/app/evolution/page.tsx +589 -0
- package/src/app/favicon.ico +0 -0
- package/src/app/globals.css +321 -0
- package/src/app/layout.tsx +63 -0
- package/src/app/page.tsx +70 -0
- package/src/app/skills/page.tsx +369 -0
- package/src/components/ApiConfigCard.tsx +199 -0
- package/src/components/ColorBends.css +1 -0
- package/src/components/ColorBends.d.ts +1 -0
- package/src/components/ColorBends.jsx +1 -0
- package/src/components/CoreLoopToggle.tsx +111 -0
- package/src/components/EnvironmentStatus.tsx +176 -0
- package/src/components/EvolutionBackground.tsx +1 -0
- package/src/components/ReactQueryProvider.tsx +24 -0
- package/src/components/Sidebar.tsx +247 -0
- package/src/components/SkillDiffViewer.tsx +154 -0
- package/src/components/ThemeAwareBackground.tsx +67 -0
- package/src/components/ThemeToggle.tsx +54 -0
- package/src/components/WelcomeHero.tsx +77 -0
- package/src/components/bits/ClickSpark.tsx +116 -0
- package/src/components/bits/CountUp.tsx +98 -0
- package/src/components/bits/DarkSelect.tsx +95 -0
- package/src/components/bits/DecryptedText.tsx +161 -0
- package/src/components/bits/ElectricBorder.tsx +184 -0
- package/src/components/bits/GlitchText.tsx +34 -0
- package/src/components/bits/ShinyText.tsx +55 -0
- package/src/components/bits/SpotlightCard.tsx +42 -0
- package/src/components/bits/TextType.tsx +95 -0
- package/src/components/bits/index.ts +9 -0
- package/src/components/pages/CuratorPage.tsx +632 -0
- package/src/components/pages/DatasetPage.tsx +271 -0
- package/src/components/pages/EvolutionPage.tsx +676 -0
- package/src/components/pages/FunctionCallingPage.tsx +1 -0
- package/src/components/pages/LogsPage.tsx +272 -0
- package/src/components/pages/MetricsPage.tsx +246 -0
- package/src/components/pages/OverviewPage.tsx +420 -0
- package/src/components/pages/SettingsPage.tsx +88 -0
- package/src/components/pages/SkillStudioPage.tsx +376 -0
- package/src/components/ui/animated-theme-toggler.tsx +97 -0
- package/src/components/ui/button.tsx +67 -0
- package/src/components/ui/card.tsx +103 -0
- package/src/components/ui/input.tsx +19 -0
- package/src/components/ui/separator.tsx +28 -0
- package/src/components/ui/sheet.tsx +147 -0
- package/src/components/ui/sidebar.tsx +702 -0
- package/src/components/ui/skeleton.tsx +13 -0
- package/src/components/ui/theme-toggle.tsx +272 -0
- package/src/components/ui/tooltip.tsx +57 -0
- package/src/hooks/use-mobile.ts +19 -0
- package/src/lib/api.ts +455 -0
- package/src/lib/queryClient.ts +12 -0
- package/src/lib/utils.ts +6 -0
- package/stitch/agent_dashboard/DESIGN_SPEC.md +521 -0
- package/stitch/agent_dashboard/prototype.html +676 -0
- package/stitch/curator_workspace/code.html +448 -0
- package/stitch/curator_workspace/screen.png +0 -0
- package/stitch/datasets/code.html +479 -0
- package/stitch/datasets/screen.png +0 -0
- package/stitch/evolution_history/code.html +461 -0
- package/stitch/evolution_history/screen.png +0 -0
- package/stitch/hermes_dashboard/DESIGN.md +192 -0
- package/stitch/hermes_dashboard/DESIGN_SPEC.md +455 -0
- package/stitch/hermes_overview/code.html +399 -0
- package/stitch/hermes_overview/screen.png +0 -0
- package/stitch/live_logs/code.html +324 -0
- package/stitch/live_logs/screen.png +0 -0
- package/stitch/skill_hub/code.html +596 -0
- package/stitch/skill_hub/screen.png +0 -0
- package/stitch/system_metrics/code.html +527 -0
- package/stitch/system_metrics/screen.png +0 -0
- package/stitch/system_settings/code.html +257 -0
- package/stitch/system_settings/screen.png +0 -0
- package/test_dashboard.py +201 -0
- package/tests/collectors/__init__.py +0 -0
- package/tests/collectors/fixtures/sample_session.jsonl +7 -0
- package/tests/collectors/test_claude_code_collector.py +171 -0
- package/tests/collectors/test_hermes_collector.py +167 -0
- package/tests/eval/test_engine.py +234 -0
- package/tests/eval/test_scorers.py +249 -0
- package/tests/storage/__init__.py +0 -0
- package/tests/storage/test_run_store.py +359 -0
- package/tests/test_curator.py +559 -0
- package/tests/test_e2e_npm.py +621 -0
- package/tests/test_mcp_server.py +114 -0
- package/tsconfig.json +34 -0
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { useState, useEffect, useRef, useCallback } from "react";
|
|
4
|
+
import { motion, AnimatePresence } from "framer-motion";
|
|
5
|
+
import { Terminal, Wifi, WifiOff, Trash2, ChevronDown, Activity, CheckCircle2, XCircle, Loader2 } from "lucide-react";
|
|
6
|
+
import { wsConnect, fetchJobs, fetchJobLogs, type EvolutionJob } from "@/lib/api";
|
|
7
|
+
|
|
8
|
+
const STATUS_COLORS: Record<string, string> = {
|
|
9
|
+
completed: "text-success",
|
|
10
|
+
failed: "text-error",
|
|
11
|
+
running: "text-accent-violet",
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export default function LogsPage() {
|
|
15
|
+
const [wsLogs, setWsLogs] = useState<string[]>([]);
|
|
16
|
+
const [connected, setConnected] = useState(false);
|
|
17
|
+
const [jobs, setJobs] = useState<EvolutionJob[]>([]);
|
|
18
|
+
const [selectedJob, setSelectedJob] = useState<string | null>(null);
|
|
19
|
+
const [jobLogs, setJobLogs] = useState<string[]>([]);
|
|
20
|
+
const [jobStatus, setJobStatus] = useState("");
|
|
21
|
+
const terminalRef = useRef<HTMLDivElement>(null);
|
|
22
|
+
const logIndex = useRef(0);
|
|
23
|
+
|
|
24
|
+
// Load all jobs on mount
|
|
25
|
+
useEffect(() => {
|
|
26
|
+
fetchJobs(false).then(setJobs).catch(() => {});
|
|
27
|
+
}, []);
|
|
28
|
+
|
|
29
|
+
// WebSocket for live stream
|
|
30
|
+
useEffect(() => {
|
|
31
|
+
let ws: WebSocket | null = null;
|
|
32
|
+
let cancelled = false;
|
|
33
|
+
|
|
34
|
+
wsConnect((data) => {
|
|
35
|
+
if (cancelled) return;
|
|
36
|
+
const entry = data as { type: string; message?: string; timestamp?: string; job_id?: string; skill?: string };
|
|
37
|
+
if (entry.type === "evolution_log" && entry.message) {
|
|
38
|
+
const ts = entry.timestamp?.slice(11, 19) || "";
|
|
39
|
+
const skill = entry.skill ? `[${entry.skill}] ` : "";
|
|
40
|
+
setWsLogs((prev) => [...prev.slice(-1000), `${ts} ${skill}${entry.message}`]);
|
|
41
|
+
|
|
42
|
+
// Refresh jobs list when new activity
|
|
43
|
+
fetchJobs(false).then(setJobs).catch(() => {});
|
|
44
|
+
}
|
|
45
|
+
if (entry.type === "evolution_complete" || entry.type === "evolution_cancelled") {
|
|
46
|
+
fetchJobs(false).then(setJobs).catch(() => {});
|
|
47
|
+
}
|
|
48
|
+
}).then((sock) => {
|
|
49
|
+
if (cancelled) { sock.close(); return; }
|
|
50
|
+
ws = sock;
|
|
51
|
+
sock.onopen = () => setConnected(true);
|
|
52
|
+
sock.onclose = () => setConnected(false);
|
|
53
|
+
sock.onerror = () => setConnected(false);
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
return () => { cancelled = true; ws?.close(); };
|
|
57
|
+
}, []);
|
|
58
|
+
|
|
59
|
+
// Load logs for selected job
|
|
60
|
+
useEffect(() => {
|
|
61
|
+
if (!selectedJob) {
|
|
62
|
+
setJobLogs([]);
|
|
63
|
+
setJobStatus("");
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const job = jobs.find((j) => j.id === selectedJob);
|
|
68
|
+
if (!job) return;
|
|
69
|
+
|
|
70
|
+
// Load initial logs
|
|
71
|
+
setJobLogs(job.logs || []);
|
|
72
|
+
logIndex.current = (job.logs || []).length;
|
|
73
|
+
setJobStatus(job.status);
|
|
74
|
+
|
|
75
|
+
// Poll for new logs if job is active
|
|
76
|
+
const isActive = job.status !== "completed" && job.status !== "failed";
|
|
77
|
+
if (!isActive) return;
|
|
78
|
+
|
|
79
|
+
const interval = setInterval(async () => {
|
|
80
|
+
try {
|
|
81
|
+
const data = await fetchJobLogs(selectedJob, logIndex.current);
|
|
82
|
+
if (data.logs?.length) {
|
|
83
|
+
setJobLogs((prev) => [...prev, ...data.logs]);
|
|
84
|
+
logIndex.current = data.total_lines;
|
|
85
|
+
}
|
|
86
|
+
setJobStatus(data.status);
|
|
87
|
+
|
|
88
|
+
// Refresh jobs list
|
|
89
|
+
if (data.status === "completed" || data.status === "failed") {
|
|
90
|
+
fetchJobs(false).then(setJobs).catch(() => {});
|
|
91
|
+
}
|
|
92
|
+
} catch {}
|
|
93
|
+
}, 1500);
|
|
94
|
+
|
|
95
|
+
return () => clearInterval(interval);
|
|
96
|
+
}, [selectedJob, jobs]);
|
|
97
|
+
|
|
98
|
+
// Auto-scroll
|
|
99
|
+
useEffect(() => {
|
|
100
|
+
if (terminalRef.current) terminalRef.current.scrollTop = terminalRef.current.scrollHeight;
|
|
101
|
+
}, [wsLogs, jobLogs]);
|
|
102
|
+
|
|
103
|
+
const activeJobs = jobs.filter((j) => j.status !== "completed" && j.status !== "failed");
|
|
104
|
+
const completedJobs = jobs.filter((j) => j.status === "completed" || j.status === "failed");
|
|
105
|
+
|
|
106
|
+
const formatTime = (iso: string) => {
|
|
107
|
+
if (!iso) return "";
|
|
108
|
+
return iso.slice(11, 19);
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
return (
|
|
112
|
+
<div className="flex gap-6 h-[calc(100vh-4rem)]">
|
|
113
|
+
{/* Job sidebar */}
|
|
114
|
+
<div className="w-72 flex-shrink-0 glass-card rounded-2xl flex flex-col overflow-hidden">
|
|
115
|
+
<div className="px-4 py-4 border-b border-white/[0.06]">
|
|
116
|
+
<h2 className="text-sm font-semibold uppercase tracking-wider flex items-center gap-2">
|
|
117
|
+
<Activity className="w-4 h-4 text-accent-violet" />
|
|
118
|
+
Evolution Jobs
|
|
119
|
+
</h2>
|
|
120
|
+
<p className="text-[10px] text-muted-foreground mt-1">{jobs.length} total · {activeJobs.length} active</p>
|
|
121
|
+
</div>
|
|
122
|
+
|
|
123
|
+
<div className="flex-1 overflow-y-auto p-2 space-y-1">
|
|
124
|
+
{/* Live stream option */}
|
|
125
|
+
<button
|
|
126
|
+
onClick={() => setSelectedJob(null)}
|
|
127
|
+
className={`w-full text-left px-3 py-2.5 rounded-xl text-sm transition-all ${
|
|
128
|
+
selectedJob === null ? "bg-white/[0.06] text-foreground" : "text-muted-foreground hover:text-foreground hover:bg-white/[0.03]"
|
|
129
|
+
}`}
|
|
130
|
+
>
|
|
131
|
+
<div className="flex items-center gap-2">
|
|
132
|
+
<Wifi className={`w-3 h-3 ${connected ? "text-success" : "text-error"}`} />
|
|
133
|
+
<span className="font-medium">Live Stream</span>
|
|
134
|
+
</div>
|
|
135
|
+
<p className="text-[10px] text-muted-foreground mt-0.5">WebSocket real-time</p>
|
|
136
|
+
</button>
|
|
137
|
+
|
|
138
|
+
{/* Active jobs */}
|
|
139
|
+
{activeJobs.length > 0 && (
|
|
140
|
+
<>
|
|
141
|
+
<p className="text-[10px] text-muted-foreground uppercase tracking-wider px-3 pt-2">Active</p>
|
|
142
|
+
{activeJobs.map((job) => (
|
|
143
|
+
<button
|
|
144
|
+
key={job.id}
|
|
145
|
+
onClick={() => setSelectedJob(job.id)}
|
|
146
|
+
className={`w-full text-left px-3 py-2.5 rounded-xl text-sm transition-all ${
|
|
147
|
+
selectedJob === job.id ? "bg-white/[0.06] text-foreground" : "text-muted-foreground hover:text-foreground hover:bg-white/[0.03]"
|
|
148
|
+
}`}
|
|
149
|
+
>
|
|
150
|
+
<div className="flex items-center gap-2">
|
|
151
|
+
<Loader2 className="w-3 h-3 text-accent-violet animate-spin" />
|
|
152
|
+
<span className="truncate">{job.skill_name}</span>
|
|
153
|
+
</div>
|
|
154
|
+
<div className="flex items-center gap-2 mt-0.5">
|
|
155
|
+
<span className="text-[10px] font-mono text-accent-violet">{job.status}</span>
|
|
156
|
+
{job.status === "optimizing" && (
|
|
157
|
+
<span className="text-[10px] font-mono text-muted-foreground">
|
|
158
|
+
{job.current_iteration}/{job.iterations}
|
|
159
|
+
</span>
|
|
160
|
+
)}
|
|
161
|
+
</div>
|
|
162
|
+
</button>
|
|
163
|
+
))}
|
|
164
|
+
</>
|
|
165
|
+
)}
|
|
166
|
+
|
|
167
|
+
{/* Completed jobs */}
|
|
168
|
+
{completedJobs.length > 0 && (
|
|
169
|
+
<>
|
|
170
|
+
<p className="text-[10px] text-muted-foreground uppercase tracking-wider px-3 pt-2">Completed</p>
|
|
171
|
+
{completedJobs.map((job) => (
|
|
172
|
+
<button
|
|
173
|
+
key={job.id}
|
|
174
|
+
onClick={() => setSelectedJob(job.id)}
|
|
175
|
+
className={`w-full text-left px-3 py-2.5 rounded-xl text-sm transition-all ${
|
|
176
|
+
selectedJob === job.id ? "bg-white/[0.06] text-foreground" : "text-muted-foreground hover:text-foreground hover:bg-white/[0.03]"
|
|
177
|
+
}`}
|
|
178
|
+
>
|
|
179
|
+
<div className="flex items-center gap-2">
|
|
180
|
+
{job.status === "completed" ? (
|
|
181
|
+
<CheckCircle2 className="w-3 h-3 text-success" />
|
|
182
|
+
) : (
|
|
183
|
+
<XCircle className="w-3 h-3 text-error" />
|
|
184
|
+
)}
|
|
185
|
+
<span className="truncate">{job.skill_name}</span>
|
|
186
|
+
</div>
|
|
187
|
+
<div className="flex items-center gap-2 mt-0.5">
|
|
188
|
+
<span className="text-[10px] font-mono text-muted-foreground">{formatTime(job.completed_at || job.started_at)}</span>
|
|
189
|
+
{job.improvement !== null && job.improvement !== 0 && (
|
|
190
|
+
<span className={`text-[10px] font-mono ${job.improvement > 0 ? "text-success" : "text-error"}`}>
|
|
191
|
+
{job.improvement > 0 ? "+" : ""}{(job.improvement * 100).toFixed(1)}%
|
|
192
|
+
</span>
|
|
193
|
+
)}
|
|
194
|
+
</div>
|
|
195
|
+
</button>
|
|
196
|
+
))}
|
|
197
|
+
</>
|
|
198
|
+
)}
|
|
199
|
+
|
|
200
|
+
{jobs.length === 0 && (
|
|
201
|
+
<p className="text-xs text-muted-foreground p-4 text-center">No jobs yet. Start an evolution.</p>
|
|
202
|
+
)}
|
|
203
|
+
</div>
|
|
204
|
+
</div>
|
|
205
|
+
|
|
206
|
+
{/* Terminal */}
|
|
207
|
+
<div className="flex-1 glass-card rounded-2xl overflow-hidden flex flex-col">
|
|
208
|
+
{/* Header */}
|
|
209
|
+
<div className="flex items-center justify-between px-4 py-3 border-b border-white/[0.06]">
|
|
210
|
+
<div className="flex items-center gap-3">
|
|
211
|
+
<Terminal className="w-4 h-4 text-muted-foreground" />
|
|
212
|
+
<span className="text-sm font-semibold">
|
|
213
|
+
{selectedJob ? jobs.find((j) => j.id === selectedJob)?.skill_name || "Job" : "Live Stream"}
|
|
214
|
+
</span>
|
|
215
|
+
{selectedJob && jobStatus && (
|
|
216
|
+
<span className={`text-[10px] font-mono px-2 py-0.5 rounded-full ${
|
|
217
|
+
jobStatus === "completed" ? "bg-success/10 text-success" :
|
|
218
|
+
jobStatus === "failed" ? "bg-error/10 text-error" :
|
|
219
|
+
"bg-accent-violet/10 text-accent-violet"
|
|
220
|
+
}`}>
|
|
221
|
+
{jobStatus}
|
|
222
|
+
</span>
|
|
223
|
+
)}
|
|
224
|
+
{!selectedJob && (
|
|
225
|
+
<div className="flex items-center gap-1.5">
|
|
226
|
+
{connected ? <Wifi className="w-3 h-3 text-success" /> : <WifiOff className="w-3 h-3 text-error" />}
|
|
227
|
+
<span className="text-[10px] text-muted-foreground">{connected ? "Connected" : "Disconnected"}</span>
|
|
228
|
+
</div>
|
|
229
|
+
)}
|
|
230
|
+
</div>
|
|
231
|
+
<button
|
|
232
|
+
onClick={() => selectedJob ? setJobLogs([]) : setWsLogs([])}
|
|
233
|
+
className="flex items-center gap-1.5 px-2 py-1 rounded-lg text-xs text-muted-foreground hover:text-foreground hover:bg-white/[0.05] transition-colors"
|
|
234
|
+
>
|
|
235
|
+
<Trash2 className="w-3 h-3" />
|
|
236
|
+
Clear
|
|
237
|
+
</button>
|
|
238
|
+
</div>
|
|
239
|
+
|
|
240
|
+
{/* Log output */}
|
|
241
|
+
<div ref={terminalRef} className="flex-1 overflow-y-auto p-4 font-mono text-xs leading-relaxed bg-black/30">
|
|
242
|
+
{(selectedJob ? jobLogs : wsLogs).length === 0 ? (
|
|
243
|
+
<div className="flex flex-col items-center justify-center h-full text-muted-foreground/40">
|
|
244
|
+
<Terminal className="w-8 h-8 mb-3" />
|
|
245
|
+
<p>{selectedJob ? "No logs for this job" : "Waiting for events..."}</p>
|
|
246
|
+
<p className="text-[10px] mt-1">{selectedJob ? "The job may not have produced output yet" : "Start an evolution to see live output"}</p>
|
|
247
|
+
</div>
|
|
248
|
+
) : (
|
|
249
|
+
(selectedJob ? jobLogs : wsLogs).map((line, i) => {
|
|
250
|
+
const isError = /✗|Error|error|FAILED|failed/.test(line);
|
|
251
|
+
const isSuccess = /✓|completed|Saved/.test(line);
|
|
252
|
+
const isPhase = /Loaded:|Building|Validating|Configuring|Running|Evaluating|Optimization|GEPA/.test(line);
|
|
253
|
+
return (
|
|
254
|
+
<div key={i} className={
|
|
255
|
+
isError ? "text-error" :
|
|
256
|
+
isSuccess ? "text-success" :
|
|
257
|
+
isPhase ? "text-accent-cyan font-semibold" :
|
|
258
|
+
"text-muted-foreground/70"
|
|
259
|
+
}>
|
|
260
|
+
{line}
|
|
261
|
+
</div>
|
|
262
|
+
);
|
|
263
|
+
})
|
|
264
|
+
)}
|
|
265
|
+
{(!selectedJob || (jobStatus !== "completed" && jobStatus !== "failed")) && (
|
|
266
|
+
<span className="cursor-blink text-muted-foreground/30" />
|
|
267
|
+
)}
|
|
268
|
+
</div>
|
|
269
|
+
</div>
|
|
270
|
+
</div>
|
|
271
|
+
);
|
|
272
|
+
}
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { useState, useEffect } from "react";
|
|
4
|
+
import { motion } from "framer-motion";
|
|
5
|
+
import {
|
|
6
|
+
BarChart3,
|
|
7
|
+
TrendingUp,
|
|
8
|
+
Clock,
|
|
9
|
+
Target,
|
|
10
|
+
Loader2,
|
|
11
|
+
CheckCircle2,
|
|
12
|
+
XCircle,
|
|
13
|
+
} from "lucide-react";
|
|
14
|
+
import { fetchMetrics, type MetricsData, type EvolutionRun } from "@/lib/api";
|
|
15
|
+
|
|
16
|
+
function BarChart({
|
|
17
|
+
data,
|
|
18
|
+
label,
|
|
19
|
+
color,
|
|
20
|
+
}: {
|
|
21
|
+
data: { label: string; value: number }[];
|
|
22
|
+
label: string;
|
|
23
|
+
color: string;
|
|
24
|
+
}) {
|
|
25
|
+
const max = Math.max(...data.map((d) => d.value), 1);
|
|
26
|
+
return (
|
|
27
|
+
<div>
|
|
28
|
+
<p className="text-xs text-muted-foreground mb-3 uppercase tracking-wider">
|
|
29
|
+
{label}
|
|
30
|
+
</p>
|
|
31
|
+
<div className="space-y-2">
|
|
32
|
+
{data.map((d, i) => (
|
|
33
|
+
<div key={i} className="flex items-center gap-3">
|
|
34
|
+
<span className="text-[10px] font-mono text-muted-foreground w-20 truncate">
|
|
35
|
+
{d.label}
|
|
36
|
+
</span>
|
|
37
|
+
<div className="flex-1 h-4 bg-white/[0.03] rounded-full overflow-hidden">
|
|
38
|
+
<motion.div
|
|
39
|
+
initial={{ width: 0 }}
|
|
40
|
+
animate={{ width: `${(d.value / max) * 100}%` }}
|
|
41
|
+
transition={{ delay: i * 0.1, duration: 0.5 }}
|
|
42
|
+
className="h-full rounded-full"
|
|
43
|
+
style={{ backgroundColor: color }}
|
|
44
|
+
/>
|
|
45
|
+
</div>
|
|
46
|
+
<span className="text-[10px] font-mono text-muted-foreground w-12 text-right">
|
|
47
|
+
{(d.value * 100).toFixed(0)}%
|
|
48
|
+
</span>
|
|
49
|
+
</div>
|
|
50
|
+
))}
|
|
51
|
+
</div>
|
|
52
|
+
</div>
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export default function MetricsPage() {
|
|
57
|
+
const [metrics, setMetrics] = useState<MetricsData | null>(null);
|
|
58
|
+
const [loading, setLoading] = useState(true);
|
|
59
|
+
|
|
60
|
+
useEffect(() => {
|
|
61
|
+
fetchMetrics()
|
|
62
|
+
.then(setMetrics)
|
|
63
|
+
.catch(() => {})
|
|
64
|
+
.finally(() => setLoading(false));
|
|
65
|
+
}, []);
|
|
66
|
+
|
|
67
|
+
// Aggregate scores by skill
|
|
68
|
+
const skillScores: Record<string, { total: number; count: number }> = {};
|
|
69
|
+
metrics?.runs.forEach((run) => {
|
|
70
|
+
if (!skillScores[run.skill_name])
|
|
71
|
+
skillScores[run.skill_name] = { total: 0, count: 0 };
|
|
72
|
+
skillScores[run.skill_name].total += run.evolved_score;
|
|
73
|
+
skillScores[run.skill_name].count += 1;
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
const skillChartData = Object.entries(skillScores).map(([name, s]) => ({
|
|
77
|
+
label: name,
|
|
78
|
+
value: s.total / s.count,
|
|
79
|
+
}));
|
|
80
|
+
|
|
81
|
+
// Improvement per run
|
|
82
|
+
const improvementData =
|
|
83
|
+
metrics?.runs.map((run) => ({
|
|
84
|
+
label: `${run.skill_name} ${run.timestamp?.slice(0, 8) || ""}`,
|
|
85
|
+
value: run.improvement ?? 0,
|
|
86
|
+
})) ?? [];
|
|
87
|
+
|
|
88
|
+
return (
|
|
89
|
+
<div className="space-y-6">
|
|
90
|
+
{/* Summary stats */}
|
|
91
|
+
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4">
|
|
92
|
+
{[
|
|
93
|
+
{
|
|
94
|
+
label: "Total Runs",
|
|
95
|
+
value: String(metrics?.total_runs ?? 0),
|
|
96
|
+
icon: <BarChart3 className="w-4 h-4" />,
|
|
97
|
+
color: "#8b5cf6",
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
label: "Success Rate",
|
|
101
|
+
value: `${((metrics?.success_rate ?? 0) * 100).toFixed(0)}%`,
|
|
102
|
+
icon: <Target className="w-4 h-4" />,
|
|
103
|
+
color: "#22c55e",
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
label: "Best Improvement",
|
|
107
|
+
value: `${((metrics?.best_improvement ?? 0) * 100).toFixed(1)}%`,
|
|
108
|
+
icon: <TrendingUp className="w-4 h-4" />,
|
|
109
|
+
color: "#06b6d4",
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
label: "Avg Time",
|
|
113
|
+
value: `${(metrics?.avg_time_seconds ?? 0).toFixed(0)}s`,
|
|
114
|
+
icon: <Clock className="w-4 h-4" />,
|
|
115
|
+
color: "#eab308",
|
|
116
|
+
},
|
|
117
|
+
].map((stat, i) => (
|
|
118
|
+
<motion.div
|
|
119
|
+
key={stat.label}
|
|
120
|
+
initial={{ opacity: 0, y: 10 }}
|
|
121
|
+
animate={{ opacity: 1, y: 0 }}
|
|
122
|
+
transition={{ delay: i * 0.1 }}
|
|
123
|
+
className="glass-card rounded-2xl p-5"
|
|
124
|
+
>
|
|
125
|
+
<div className="flex items-center justify-between mb-2">
|
|
126
|
+
<span className="text-xs text-muted-foreground uppercase tracking-wider">
|
|
127
|
+
{stat.label}
|
|
128
|
+
</span>
|
|
129
|
+
<span style={{ color: stat.color }}>{stat.icon}</span>
|
|
130
|
+
</div>
|
|
131
|
+
<p className="text-2xl font-bold font-mono">{stat.value}</p>
|
|
132
|
+
</motion.div>
|
|
133
|
+
))}
|
|
134
|
+
</div>
|
|
135
|
+
|
|
136
|
+
{/* Charts */}
|
|
137
|
+
<div className="grid grid-cols-1 lg:grid-cols-2 gap-6">
|
|
138
|
+
<motion.div
|
|
139
|
+
initial={{ opacity: 0, y: 15 }}
|
|
140
|
+
animate={{ opacity: 1, y: 0 }}
|
|
141
|
+
transition={{ delay: 0.3 }}
|
|
142
|
+
className="glass-card rounded-2xl p-6"
|
|
143
|
+
>
|
|
144
|
+
<h3 className="text-sm font-semibold uppercase tracking-wider mb-4">
|
|
145
|
+
Score by Skill
|
|
146
|
+
</h3>
|
|
147
|
+
{skillChartData.length ? (
|
|
148
|
+
<BarChart data={skillChartData} label="" color="#8b5cf6" />
|
|
149
|
+
) : (
|
|
150
|
+
<p className="text-sm text-muted-foreground py-8 text-center">
|
|
151
|
+
No data yet.
|
|
152
|
+
</p>
|
|
153
|
+
)}
|
|
154
|
+
</motion.div>
|
|
155
|
+
|
|
156
|
+
<motion.div
|
|
157
|
+
initial={{ opacity: 0, y: 15 }}
|
|
158
|
+
animate={{ opacity: 1, y: 0 }}
|
|
159
|
+
transition={{ delay: 0.4 }}
|
|
160
|
+
className="glass-card rounded-2xl p-6"
|
|
161
|
+
>
|
|
162
|
+
<h3 className="text-sm font-semibold uppercase tracking-wider mb-4">
|
|
163
|
+
Improvement per Run
|
|
164
|
+
</h3>
|
|
165
|
+
{improvementData.length ? (
|
|
166
|
+
<BarChart data={improvementData} label="" color="#06b6d4" />
|
|
167
|
+
) : (
|
|
168
|
+
<p className="text-sm text-muted-foreground py-8 text-center">
|
|
169
|
+
No data yet.
|
|
170
|
+
</p>
|
|
171
|
+
)}
|
|
172
|
+
</motion.div>
|
|
173
|
+
</div>
|
|
174
|
+
|
|
175
|
+
{/* Full run table */}
|
|
176
|
+
<motion.div
|
|
177
|
+
initial={{ opacity: 0, y: 15 }}
|
|
178
|
+
animate={{ opacity: 1, y: 0 }}
|
|
179
|
+
transition={{ delay: 0.5 }}
|
|
180
|
+
className="glass-card rounded-2xl p-6"
|
|
181
|
+
>
|
|
182
|
+
<h3 className="text-sm font-semibold uppercase tracking-wider mb-4">
|
|
183
|
+
All Runs
|
|
184
|
+
</h3>
|
|
185
|
+
{loading ? (
|
|
186
|
+
<div className="flex justify-center py-8">
|
|
187
|
+
<Loader2 className="w-5 h-5 animate-spin text-muted-foreground" />
|
|
188
|
+
</div>
|
|
189
|
+
) : metrics?.runs?.length ? (
|
|
190
|
+
<div className="overflow-x-auto">
|
|
191
|
+
<table className="w-full text-xs">
|
|
192
|
+
<thead>
|
|
193
|
+
<tr className="text-muted-foreground border-b border-white/[0.06]">
|
|
194
|
+
<th className="text-left py-2 px-3">Status</th>
|
|
195
|
+
<th className="text-left py-2 px-3">Skill</th>
|
|
196
|
+
<th className="text-left py-2 px-3">Timestamp</th>
|
|
197
|
+
<th className="text-right py-2 px-3">Baseline</th>
|
|
198
|
+
<th className="text-right py-2 px-3">Evolved</th>
|
|
199
|
+
<th className="text-right py-2 px-3">Δ</th>
|
|
200
|
+
<th className="text-right py-2 px-3">Time</th>
|
|
201
|
+
</tr>
|
|
202
|
+
</thead>
|
|
203
|
+
<tbody>
|
|
204
|
+
{metrics.runs.map((run, i) => (
|
|
205
|
+
<tr
|
|
206
|
+
key={i}
|
|
207
|
+
className="border-b border-white/[0.03] hover:bg-white/[0.02]"
|
|
208
|
+
>
|
|
209
|
+
<td className="py-2 px-3">
|
|
210
|
+
{run.constraints_passed ? (
|
|
211
|
+
<CheckCircle2 className="w-3.5 h-3.5 text-success" />
|
|
212
|
+
) : (
|
|
213
|
+
<XCircle className="w-3.5 h-3.5 text-error" />
|
|
214
|
+
)}
|
|
215
|
+
</td>
|
|
216
|
+
<td className="py-2 px-3 font-medium">{run.skill_name}</td>
|
|
217
|
+
<td className="py-2 px-3 font-mono text-muted-foreground">
|
|
218
|
+
{run.timestamp}
|
|
219
|
+
</td>
|
|
220
|
+
<td className="py-2 px-3 text-right font-mono">
|
|
221
|
+
{(run.baseline_score * 100).toFixed(0)}%
|
|
222
|
+
</td>
|
|
223
|
+
<td className="py-2 px-3 text-right font-mono text-accent-violet">
|
|
224
|
+
{(run.evolved_score * 100).toFixed(0)}%
|
|
225
|
+
</td>
|
|
226
|
+
<td className="py-2 px-3 text-right font-mono">
|
|
227
|
+
{(run.improvement ?? 0) > 0 ? "+" : ""}
|
|
228
|
+
{((run.improvement ?? 0) * 100).toFixed(1)}%
|
|
229
|
+
</td>
|
|
230
|
+
<td className="py-2 px-3 text-right font-mono text-muted-foreground">
|
|
231
|
+
{run.elapsed_seconds?.toFixed(0)}s
|
|
232
|
+
</td>
|
|
233
|
+
</tr>
|
|
234
|
+
))}
|
|
235
|
+
</tbody>
|
|
236
|
+
</table>
|
|
237
|
+
</div>
|
|
238
|
+
) : (
|
|
239
|
+
<p className="text-sm text-muted-foreground py-8 text-center">
|
|
240
|
+
No runs recorded.
|
|
241
|
+
</p>
|
|
242
|
+
)}
|
|
243
|
+
</motion.div>
|
|
244
|
+
</div>
|
|
245
|
+
);
|
|
246
|
+
}
|