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,393 @@
|
|
|
1
|
+
"""SQLite persistence layer for CanonicalRun events."""
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
import sqlite3
|
|
5
|
+
from datetime import datetime, timezone
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
from typing import Optional
|
|
8
|
+
|
|
9
|
+
from backend.promethean.models import CanonicalRun
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
DB_PATH = Path.home() / ".hermes" / "runs.db"
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class RunStore:
|
|
16
|
+
"""Persist and query CanonicalRun events in SQLite."""
|
|
17
|
+
|
|
18
|
+
def __init__(self, db_path: Path = DB_PATH):
|
|
19
|
+
self.db_path = db_path
|
|
20
|
+
self.db_path.parent.mkdir(parents=True, exist_ok=True)
|
|
21
|
+
self.schema_path = Path(__file__).parent / "schema.sql"
|
|
22
|
+
|
|
23
|
+
def connect(self) -> sqlite3.Connection:
|
|
24
|
+
"""Create connection and apply schema."""
|
|
25
|
+
conn = sqlite3.connect(self.db_path)
|
|
26
|
+
conn.row_factory = sqlite3.Row
|
|
27
|
+
# Enable WAL mode and foreign keys
|
|
28
|
+
conn.execute("PRAGMA journal_mode=WAL")
|
|
29
|
+
conn.execute("PRAGMA foreign_keys=ON")
|
|
30
|
+
# Apply schema
|
|
31
|
+
with open(self.schema_path) as f:
|
|
32
|
+
conn.executescript(f.read())
|
|
33
|
+
conn.commit()
|
|
34
|
+
return conn
|
|
35
|
+
|
|
36
|
+
def close(self, conn: sqlite3.Connection):
|
|
37
|
+
"""Close connection."""
|
|
38
|
+
if conn:
|
|
39
|
+
conn.close()
|
|
40
|
+
|
|
41
|
+
def upsert_run(self, run: CanonicalRun) -> bool:
|
|
42
|
+
"""Insert or update run. Return True if inserted, False if updated."""
|
|
43
|
+
conn = self.connect()
|
|
44
|
+
try:
|
|
45
|
+
# Check if run exists
|
|
46
|
+
cursor = conn.execute("SELECT 1 FROM runs WHERE run_id = ?", (run.run_id,))
|
|
47
|
+
exists = cursor.fetchone() is not None
|
|
48
|
+
|
|
49
|
+
context_json = json.dumps(run.context) if run.context else None
|
|
50
|
+
|
|
51
|
+
if exists:
|
|
52
|
+
# Update existing
|
|
53
|
+
conn.execute(
|
|
54
|
+
"""UPDATE runs SET
|
|
55
|
+
agent_name = ?, collector = ?, started_at = ?, ended_at = ?,
|
|
56
|
+
task_name = ?, outcome = ?, provider = ?, model = ?, repo = ?,
|
|
57
|
+
session_id = ?, agent_version = ?, collector_version = ?,
|
|
58
|
+
resolution = ?, context_json = ?, updated_at = datetime('now')
|
|
59
|
+
WHERE run_id = ?""",
|
|
60
|
+
(
|
|
61
|
+
run.agent_name,
|
|
62
|
+
run.collector,
|
|
63
|
+
run.started_at,
|
|
64
|
+
run.ended_at,
|
|
65
|
+
run.task_name,
|
|
66
|
+
run.outcome,
|
|
67
|
+
run.provider,
|
|
68
|
+
run.model,
|
|
69
|
+
run.repo,
|
|
70
|
+
run.session_id,
|
|
71
|
+
run.agent_version,
|
|
72
|
+
run.collector_version,
|
|
73
|
+
run.resolution,
|
|
74
|
+
context_json,
|
|
75
|
+
run.run_id,
|
|
76
|
+
),
|
|
77
|
+
)
|
|
78
|
+
# Delete and re-insert related records
|
|
79
|
+
conn.execute("DELETE FROM tool_calls WHERE run_id = ?", (run.run_id,))
|
|
80
|
+
conn.execute("DELETE FROM files_touched WHERE run_id = ?", (run.run_id,))
|
|
81
|
+
conn.execute("DELETE FROM run_metrics WHERE run_id = ?", (run.run_id,))
|
|
82
|
+
conn.execute("DELETE FROM run_errors WHERE run_id = ?", (run.run_id,))
|
|
83
|
+
else:
|
|
84
|
+
# Insert new
|
|
85
|
+
conn.execute(
|
|
86
|
+
"""INSERT INTO runs
|
|
87
|
+
(run_id, agent_name, collector, started_at, ended_at,
|
|
88
|
+
task_name, outcome, provider, model, repo, session_id,
|
|
89
|
+
agent_version, collector_version, resolution, context_json)
|
|
90
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
|
|
91
|
+
(
|
|
92
|
+
run.run_id,
|
|
93
|
+
run.agent_name,
|
|
94
|
+
run.collector,
|
|
95
|
+
run.started_at,
|
|
96
|
+
run.ended_at,
|
|
97
|
+
run.task_name,
|
|
98
|
+
run.outcome,
|
|
99
|
+
run.provider,
|
|
100
|
+
run.model,
|
|
101
|
+
run.repo,
|
|
102
|
+
run.session_id,
|
|
103
|
+
run.agent_version,
|
|
104
|
+
run.collector_version,
|
|
105
|
+
run.resolution,
|
|
106
|
+
context_json,
|
|
107
|
+
),
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
# Insert tool calls
|
|
111
|
+
for tool in run.tool_calls:
|
|
112
|
+
conn.execute(
|
|
113
|
+
"""INSERT INTO tool_calls
|
|
114
|
+
(run_id, tool_id, name, input_summary, duration_ms,
|
|
115
|
+
result_summary, error)
|
|
116
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)""",
|
|
117
|
+
(
|
|
118
|
+
run.run_id,
|
|
119
|
+
tool.id if hasattr(tool, "id") else None,
|
|
120
|
+
tool.name,
|
|
121
|
+
tool.input_summary if hasattr(tool, "input_summary") else None,
|
|
122
|
+
tool.duration_ms if hasattr(tool, "duration_ms") else None,
|
|
123
|
+
tool.result_summary if hasattr(tool, "result_summary") else None,
|
|
124
|
+
tool.error if hasattr(tool, "error") else None,
|
|
125
|
+
),
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
# Insert files touched
|
|
129
|
+
for file in run.files_touched:
|
|
130
|
+
conn.execute(
|
|
131
|
+
"""INSERT INTO files_touched (run_id, path, action, size_bytes)
|
|
132
|
+
VALUES (?, ?, ?, ?)""",
|
|
133
|
+
(
|
|
134
|
+
run.run_id,
|
|
135
|
+
file.path,
|
|
136
|
+
file.action if hasattr(file, "action") else "write",
|
|
137
|
+
file.size_bytes if hasattr(file, "size_bytes") else None,
|
|
138
|
+
),
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
# Insert metrics
|
|
142
|
+
if run.metrics:
|
|
143
|
+
conn.execute(
|
|
144
|
+
"""INSERT INTO run_metrics
|
|
145
|
+
(run_id, input_tokens, output_tokens, cache_tokens,
|
|
146
|
+
latency_ms, cost_usd, tool_call_count)
|
|
147
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)""",
|
|
148
|
+
(
|
|
149
|
+
run.run_id,
|
|
150
|
+
run.metrics.input_tokens,
|
|
151
|
+
run.metrics.output_tokens,
|
|
152
|
+
run.metrics.cache_tokens,
|
|
153
|
+
run.metrics.latency_ms if hasattr(run.metrics, "latency_ms") else None,
|
|
154
|
+
run.metrics.cost_usd if hasattr(run.metrics, "cost_usd") else None,
|
|
155
|
+
run.metrics.tool_call_count,
|
|
156
|
+
),
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
# Insert errors
|
|
160
|
+
for error in run.errors:
|
|
161
|
+
if isinstance(error, dict):
|
|
162
|
+
conn.execute(
|
|
163
|
+
"""INSERT INTO run_errors
|
|
164
|
+
(run_id, signature, message, stack_excerpt, count)
|
|
165
|
+
VALUES (?, ?, ?, ?, ?)""",
|
|
166
|
+
(
|
|
167
|
+
run.run_id,
|
|
168
|
+
error.get("signature"),
|
|
169
|
+
error.get("message"),
|
|
170
|
+
error.get("stack_excerpt"),
|
|
171
|
+
error.get("count", 1),
|
|
172
|
+
),
|
|
173
|
+
)
|
|
174
|
+
|
|
175
|
+
conn.commit()
|
|
176
|
+
return not exists
|
|
177
|
+
finally:
|
|
178
|
+
self.close(conn)
|
|
179
|
+
|
|
180
|
+
def upsert_batch(self, runs: list[CanonicalRun]) -> dict:
|
|
181
|
+
"""Insert/update batch of runs. Return {inserted, updated, failed}."""
|
|
182
|
+
result = {"inserted": 0, "updated": 0, "failed": 0}
|
|
183
|
+
for run in runs:
|
|
184
|
+
try:
|
|
185
|
+
is_new = self.upsert_run(run)
|
|
186
|
+
result["inserted" if is_new else "updated"] += 1
|
|
187
|
+
except Exception:
|
|
188
|
+
result["failed"] += 1
|
|
189
|
+
return result
|
|
190
|
+
|
|
191
|
+
def get_run(self, run_id: str) -> Optional[CanonicalRun]:
|
|
192
|
+
"""Fetch single run by ID."""
|
|
193
|
+
conn = self.connect()
|
|
194
|
+
try:
|
|
195
|
+
cursor = conn.execute("SELECT * FROM runs WHERE run_id = ?", (run_id,))
|
|
196
|
+
row = cursor.fetchone()
|
|
197
|
+
if not row:
|
|
198
|
+
return None
|
|
199
|
+
return self._row_to_canonical(conn, row)
|
|
200
|
+
finally:
|
|
201
|
+
self.close(conn)
|
|
202
|
+
|
|
203
|
+
def list_runs(
|
|
204
|
+
self,
|
|
205
|
+
agent_name: Optional[str] = None,
|
|
206
|
+
outcome: Optional[str] = None,
|
|
207
|
+
repo: Optional[str] = None,
|
|
208
|
+
since: Optional[str] = None,
|
|
209
|
+
until: Optional[str] = None,
|
|
210
|
+
limit: int = 50,
|
|
211
|
+
offset: int = 0,
|
|
212
|
+
) -> list[CanonicalRun]:
|
|
213
|
+
"""List runs with optional filters. Ordered by started_at DESC."""
|
|
214
|
+
conn = self.connect()
|
|
215
|
+
try:
|
|
216
|
+
query = "SELECT * FROM runs WHERE 1=1"
|
|
217
|
+
params = []
|
|
218
|
+
|
|
219
|
+
if agent_name:
|
|
220
|
+
query += " AND agent_name = ?"
|
|
221
|
+
params.append(agent_name)
|
|
222
|
+
if outcome:
|
|
223
|
+
query += " AND outcome = ?"
|
|
224
|
+
params.append(outcome)
|
|
225
|
+
if repo:
|
|
226
|
+
query += " AND repo = ?"
|
|
227
|
+
params.append(repo)
|
|
228
|
+
if since:
|
|
229
|
+
query += " AND started_at >= ?"
|
|
230
|
+
params.append(since)
|
|
231
|
+
if until:
|
|
232
|
+
query += " AND started_at <= ?"
|
|
233
|
+
params.append(until)
|
|
234
|
+
|
|
235
|
+
query += " ORDER BY started_at DESC LIMIT ? OFFSET ?"
|
|
236
|
+
params.extend([limit, offset])
|
|
237
|
+
|
|
238
|
+
cursor = conn.execute(query, params)
|
|
239
|
+
runs = [self._row_to_canonical(conn, row) for row in cursor.fetchall()]
|
|
240
|
+
return runs
|
|
241
|
+
finally:
|
|
242
|
+
self.close(conn)
|
|
243
|
+
|
|
244
|
+
def get_agent_summary(self) -> list[dict]:
|
|
245
|
+
"""Per-agent statistics: count, success_rate, avg_tokens."""
|
|
246
|
+
conn = self.connect()
|
|
247
|
+
try:
|
|
248
|
+
cursor = conn.execute(
|
|
249
|
+
"""SELECT
|
|
250
|
+
r.agent_name,
|
|
251
|
+
COUNT(*) as total_runs,
|
|
252
|
+
SUM(CASE WHEN r.outcome = 'success' THEN 1 ELSE 0 END) as success_count,
|
|
253
|
+
ROUND(CAST(SUM(CASE WHEN r.outcome = 'success' THEN 1 ELSE 0 END) AS FLOAT) / COUNT(*) * 100, 2) as success_rate,
|
|
254
|
+
ROUND(AVG(COALESCE(m.input_tokens, 0)), 0) as avg_input_tokens,
|
|
255
|
+
ROUND(AVG(COALESCE(m.output_tokens, 0)), 0) as avg_output_tokens
|
|
256
|
+
FROM runs r
|
|
257
|
+
LEFT JOIN run_metrics m ON r.run_id = m.run_id
|
|
258
|
+
GROUP BY r.agent_name
|
|
259
|
+
ORDER BY total_runs DESC"""
|
|
260
|
+
)
|
|
261
|
+
return [dict(row) for row in cursor.fetchall()]
|
|
262
|
+
finally:
|
|
263
|
+
self.close(conn)
|
|
264
|
+
|
|
265
|
+
def get_runs_count(self, agent_name: Optional[str] = None) -> int:
|
|
266
|
+
"""Count total runs, optionally filtered by agent."""
|
|
267
|
+
conn = self.connect()
|
|
268
|
+
try:
|
|
269
|
+
if agent_name:
|
|
270
|
+
cursor = conn.execute(
|
|
271
|
+
"SELECT COUNT(*) as cnt FROM runs WHERE agent_name = ?", (agent_name,)
|
|
272
|
+
)
|
|
273
|
+
else:
|
|
274
|
+
cursor = conn.execute("SELECT COUNT(*) as cnt FROM runs")
|
|
275
|
+
return cursor.fetchone()["cnt"]
|
|
276
|
+
finally:
|
|
277
|
+
self.close(conn)
|
|
278
|
+
|
|
279
|
+
def search_by_error_signature(self, sig: str, limit: int = 50) -> list[CanonicalRun]:
|
|
280
|
+
"""Find runs that encountered a specific error signature."""
|
|
281
|
+
conn = self.connect()
|
|
282
|
+
try:
|
|
283
|
+
cursor = conn.execute(
|
|
284
|
+
"""SELECT DISTINCT r.* FROM runs r
|
|
285
|
+
JOIN run_errors e ON r.run_id = e.run_id
|
|
286
|
+
WHERE e.signature LIKE ?
|
|
287
|
+
ORDER BY r.started_at DESC
|
|
288
|
+
LIMIT ?""",
|
|
289
|
+
(f"%{sig}%", limit),
|
|
290
|
+
)
|
|
291
|
+
return [self._row_to_canonical(conn, row) for row in cursor.fetchall()]
|
|
292
|
+
finally:
|
|
293
|
+
self.close(conn)
|
|
294
|
+
|
|
295
|
+
def _row_to_canonical(self, conn: sqlite3.Connection, row: sqlite3.Row) -> CanonicalRun:
|
|
296
|
+
"""Convert DB row to CanonicalRun object."""
|
|
297
|
+
run_id = row["run_id"]
|
|
298
|
+
|
|
299
|
+
# Fetch related records
|
|
300
|
+
tool_calls = []
|
|
301
|
+
cursor = conn.execute(
|
|
302
|
+
"SELECT * FROM tool_calls WHERE run_id = ? ORDER BY id", (run_id,)
|
|
303
|
+
)
|
|
304
|
+
for tool_row in cursor.fetchall():
|
|
305
|
+
from backend.promethean.models import ToolCallRecord
|
|
306
|
+
|
|
307
|
+
tool_calls.append(
|
|
308
|
+
ToolCallRecord(
|
|
309
|
+
id=tool_row["tool_id"],
|
|
310
|
+
name=tool_row["name"],
|
|
311
|
+
input_summary=tool_row["input_summary"],
|
|
312
|
+
duration_ms=tool_row["duration_ms"],
|
|
313
|
+
result_summary=tool_row["result_summary"],
|
|
314
|
+
error=tool_row["error"],
|
|
315
|
+
)
|
|
316
|
+
)
|
|
317
|
+
|
|
318
|
+
files_touched = []
|
|
319
|
+
cursor = conn.execute(
|
|
320
|
+
"SELECT * FROM files_touched WHERE run_id = ? ORDER BY id", (run_id,)
|
|
321
|
+
)
|
|
322
|
+
for file_row in cursor.fetchall():
|
|
323
|
+
from backend.promethean.models import FileTouchRecord
|
|
324
|
+
|
|
325
|
+
files_touched.append(
|
|
326
|
+
FileTouchRecord(
|
|
327
|
+
path=file_row["path"],
|
|
328
|
+
action=file_row["action"],
|
|
329
|
+
size_bytes=file_row["size_bytes"],
|
|
330
|
+
)
|
|
331
|
+
)
|
|
332
|
+
|
|
333
|
+
metrics = None
|
|
334
|
+
cursor = conn.execute("SELECT * FROM run_metrics WHERE run_id = ?", (run_id,))
|
|
335
|
+
metric_row = cursor.fetchone()
|
|
336
|
+
if metric_row:
|
|
337
|
+
from backend.promethean.models import RunMetrics
|
|
338
|
+
|
|
339
|
+
metrics = RunMetrics(
|
|
340
|
+
input_tokens=metric_row["input_tokens"],
|
|
341
|
+
output_tokens=metric_row["output_tokens"],
|
|
342
|
+
cache_tokens=metric_row["cache_tokens"],
|
|
343
|
+
latency_ms=metric_row["latency_ms"],
|
|
344
|
+
cost_usd=metric_row["cost_usd"],
|
|
345
|
+
tool_call_count=metric_row["tool_call_count"],
|
|
346
|
+
)
|
|
347
|
+
|
|
348
|
+
errors = []
|
|
349
|
+
cursor = conn.execute(
|
|
350
|
+
"SELECT signature, message, stack_excerpt, count FROM run_errors WHERE run_id = ?",
|
|
351
|
+
(run_id,),
|
|
352
|
+
)
|
|
353
|
+
for error_row in cursor.fetchall():
|
|
354
|
+
errors.append(
|
|
355
|
+
{
|
|
356
|
+
"signature": error_row["signature"],
|
|
357
|
+
"message": error_row["message"],
|
|
358
|
+
"stack_excerpt": error_row["stack_excerpt"],
|
|
359
|
+
"count": error_row["count"],
|
|
360
|
+
}
|
|
361
|
+
)
|
|
362
|
+
|
|
363
|
+
context = {}
|
|
364
|
+
if row["context_json"]:
|
|
365
|
+
try:
|
|
366
|
+
context = json.loads(row["context_json"])
|
|
367
|
+
except json.JSONDecodeError:
|
|
368
|
+
pass
|
|
369
|
+
|
|
370
|
+
return CanonicalRun(
|
|
371
|
+
run_id=row["run_id"],
|
|
372
|
+
agent_name=row["agent_name"],
|
|
373
|
+
agent_version=row["agent_version"],
|
|
374
|
+
collector=row["collector"],
|
|
375
|
+
collector_version=row["collector_version"],
|
|
376
|
+
started_at=row["started_at"],
|
|
377
|
+
ended_at=row["ended_at"],
|
|
378
|
+
task_name=row["task_name"],
|
|
379
|
+
outcome=row["outcome"],
|
|
380
|
+
provider=row["provider"],
|
|
381
|
+
model=row["model"],
|
|
382
|
+
repo=row["repo"],
|
|
383
|
+
session_id=row["session_id"],
|
|
384
|
+
tool_calls=tool_calls,
|
|
385
|
+
files_touched=files_touched,
|
|
386
|
+
artifacts=[],
|
|
387
|
+
errors=errors,
|
|
388
|
+
metrics=metrics,
|
|
389
|
+
eval_scores=[],
|
|
390
|
+
improvement_candidates=[],
|
|
391
|
+
context=context,
|
|
392
|
+
resolution=row["resolution"],
|
|
393
|
+
)
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
-- Canonical run records — normalized across all agents
|
|
2
|
+
CREATE TABLE IF NOT EXISTS runs (
|
|
3
|
+
run_id TEXT PRIMARY KEY,
|
|
4
|
+
agent_name TEXT NOT NULL,
|
|
5
|
+
collector TEXT NOT NULL,
|
|
6
|
+
started_at TEXT NOT NULL,
|
|
7
|
+
ended_at TEXT,
|
|
8
|
+
task_name TEXT NOT NULL,
|
|
9
|
+
outcome TEXT NOT NULL CHECK(outcome IN ('success', 'failure', 'partial', 'unknown')),
|
|
10
|
+
provider TEXT,
|
|
11
|
+
model TEXT,
|
|
12
|
+
repo TEXT,
|
|
13
|
+
session_id TEXT,
|
|
14
|
+
agent_version TEXT,
|
|
15
|
+
collector_version TEXT,
|
|
16
|
+
resolution TEXT,
|
|
17
|
+
context_json TEXT,
|
|
18
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
19
|
+
updated_at TEXT DEFAULT (datetime('now'))
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
CREATE INDEX IF NOT EXISTS idx_runs_agent ON runs(agent_name);
|
|
23
|
+
CREATE INDEX IF NOT EXISTS idx_runs_outcome ON runs(outcome);
|
|
24
|
+
CREATE INDEX IF NOT EXISTS idx_runs_started ON runs(started_at DESC);
|
|
25
|
+
CREATE INDEX IF NOT EXISTS idx_runs_repo ON runs(repo);
|
|
26
|
+
CREATE INDEX IF NOT EXISTS idx_runs_session ON runs(session_id);
|
|
27
|
+
|
|
28
|
+
-- Tool calls made during run execution
|
|
29
|
+
CREATE TABLE IF NOT EXISTS tool_calls (
|
|
30
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
31
|
+
run_id TEXT NOT NULL REFERENCES runs(run_id) ON DELETE CASCADE,
|
|
32
|
+
tool_id TEXT,
|
|
33
|
+
name TEXT NOT NULL,
|
|
34
|
+
input_summary TEXT,
|
|
35
|
+
duration_ms INTEGER,
|
|
36
|
+
result_summary TEXT,
|
|
37
|
+
error TEXT,
|
|
38
|
+
created_at TEXT DEFAULT (datetime('now'))
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
CREATE INDEX IF NOT EXISTS idx_tool_calls_run ON tool_calls(run_id);
|
|
42
|
+
CREATE INDEX IF NOT EXISTS idx_tool_calls_name ON tool_calls(name);
|
|
43
|
+
|
|
44
|
+
-- Files touched during run execution
|
|
45
|
+
CREATE TABLE IF NOT EXISTS files_touched (
|
|
46
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
47
|
+
run_id TEXT NOT NULL REFERENCES runs(run_id) ON DELETE CASCADE,
|
|
48
|
+
path TEXT NOT NULL,
|
|
49
|
+
action TEXT DEFAULT 'write' CHECK(action IN ('read', 'write', 'delete')),
|
|
50
|
+
size_bytes INTEGER,
|
|
51
|
+
created_at TEXT DEFAULT (datetime('now'))
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
CREATE INDEX IF NOT EXISTS idx_files_touched_run ON files_touched(run_id);
|
|
55
|
+
CREATE INDEX IF NOT EXISTS idx_files_touched_path ON files_touched(path);
|
|
56
|
+
|
|
57
|
+
-- Token counts and latency metrics
|
|
58
|
+
CREATE TABLE IF NOT EXISTS run_metrics (
|
|
59
|
+
run_id TEXT PRIMARY KEY REFERENCES runs(run_id) ON DELETE CASCADE,
|
|
60
|
+
input_tokens INTEGER,
|
|
61
|
+
output_tokens INTEGER,
|
|
62
|
+
cache_tokens INTEGER,
|
|
63
|
+
latency_ms INTEGER,
|
|
64
|
+
cost_usd REAL,
|
|
65
|
+
tool_call_count INTEGER DEFAULT 0,
|
|
66
|
+
created_at TEXT DEFAULT (datetime('now'))
|
|
67
|
+
);
|
|
68
|
+
|
|
69
|
+
-- Errors encountered during run
|
|
70
|
+
CREATE TABLE IF NOT EXISTS run_errors (
|
|
71
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
72
|
+
run_id TEXT NOT NULL REFERENCES runs(run_id) ON DELETE CASCADE,
|
|
73
|
+
signature TEXT,
|
|
74
|
+
message TEXT,
|
|
75
|
+
stack_excerpt TEXT,
|
|
76
|
+
count INTEGER DEFAULT 1,
|
|
77
|
+
created_at TEXT DEFAULT (datetime('now'))
|
|
78
|
+
);
|
|
79
|
+
|
|
80
|
+
CREATE INDEX IF NOT EXISTS idx_run_errors_sig ON run_errors(signature);
|
|
81
|
+
CREATE INDEX IF NOT EXISTS idx_run_errors_run ON run_errors(run_id);
|
|
82
|
+
|
|
83
|
+
-- Evaluation scores (populated by Phase 5 evaluation engine)
|
|
84
|
+
CREATE TABLE IF NOT EXISTS eval_scores (
|
|
85
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
86
|
+
run_id TEXT NOT NULL REFERENCES runs(run_id) ON DELETE CASCADE,
|
|
87
|
+
scorer TEXT NOT NULL,
|
|
88
|
+
score REAL,
|
|
89
|
+
passed INTEGER,
|
|
90
|
+
details TEXT,
|
|
91
|
+
created_at TEXT DEFAULT (datetime('now'))
|
|
92
|
+
);
|
|
93
|
+
|
|
94
|
+
CREATE INDEX IF NOT EXISTS idx_eval_scores_run ON eval_scores(run_id);
|
|
95
|
+
CREATE INDEX IF NOT EXISTS idx_eval_scores_scorer ON eval_scores(scorer);
|
|
96
|
+
|
|
97
|
+
-- Enable WAL mode for better concurrency
|
|
98
|
+
PRAGMA journal_mode=WAL;
|
|
99
|
+
PRAGMA foreign_keys=ON;
|