@winspan/claude-forge 8.41.0 → 8.50.6
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/.claude/CLAUDE.md +17 -0
- package/.eslintrc.js +23 -0
- package/.prettierrc +8 -0
- package/ARCHITECTURE_ISSUES.md +249 -0
- package/CLAUDE.md +265 -0
- package/CLAUDE.md.backup +488 -0
- package/DEVELOPMENT.md +310 -0
- package/dist/claudemd/claudemd-generator.d.ts +38 -3
- package/dist/claudemd/claudemd-generator.d.ts.map +1 -1
- package/dist/claudemd/claudemd-generator.js +629 -11
- package/dist/claudemd/claudemd-generator.js.map +1 -1
- package/dist/claudemd/index.d.ts +2 -2
- package/dist/claudemd/index.d.ts.map +1 -1
- package/dist/claudemd/index.js.map +1 -1
- package/dist/claudemd/resume-manager.d.ts.map +1 -1
- package/dist/claudemd/resume-manager.js +5 -2
- package/dist/claudemd/resume-manager.js.map +1 -1
- package/dist/claudemd/tech-detector.d.ts +1 -0
- package/dist/claudemd/tech-detector.d.ts.map +1 -1
- package/dist/claudemd/tech-detector.js +53 -0
- package/dist/claudemd/tech-detector.js.map +1 -1
- package/dist/cli/commands/claudemd.js +2 -2
- package/dist/cli/commands/claudemd.js.map +1 -1
- package/dist/cli/commands/daemon.d.ts +28 -0
- package/dist/cli/commands/daemon.d.ts.map +1 -1
- package/dist/cli/commands/daemon.js +200 -8
- package/dist/cli/commands/daemon.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +3 -35
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/menu.js +10 -10
- package/dist/cli/commands/menu.js.map +1 -1
- package/dist/cli/commands/skills.d.ts.map +1 -1
- package/dist/cli/commands/skills.js +8 -2
- package/dist/cli/commands/skills.js.map +1 -1
- package/dist/cli/commands/stats.d.ts.map +1 -1
- package/dist/cli/commands/stats.js +0 -17
- package/dist/cli/commands/stats.js.map +1 -1
- package/dist/cli/commands/trace.d.ts +9 -0
- package/dist/cli/commands/trace.d.ts.map +1 -0
- package/dist/cli/commands/trace.js +137 -0
- package/dist/cli/commands/trace.js.map +1 -0
- package/dist/cli/index.js +2 -4
- package/dist/cli/index.js.map +1 -1
- package/dist/core/ai/provider.d.ts +10 -2
- package/dist/core/ai/provider.d.ts.map +1 -1
- package/dist/core/ai/provider.js.map +1 -1
- package/dist/core/ai/types.d.ts +1 -19
- package/dist/core/ai/types.d.ts.map +1 -1
- package/dist/core/ai/types.js +1 -1
- package/dist/core/config.d.ts +2 -1
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +23 -6
- package/dist/core/config.js.map +1 -1
- package/dist/core/constants.d.ts +2 -2
- package/dist/core/constants.js +2 -2
- package/dist/core/constants.js.map +1 -1
- package/dist/core/queue/index.d.ts +52 -0
- package/dist/core/queue/index.d.ts.map +1 -0
- package/dist/core/queue/index.js +176 -0
- package/dist/core/queue/index.js.map +1 -0
- package/dist/core/storage/base.d.ts +33 -0
- package/dist/core/storage/base.d.ts.map +1 -0
- package/dist/core/storage/base.js +211 -0
- package/dist/core/storage/base.js.map +1 -0
- package/dist/core/storage/events.d.ts +52 -0
- package/dist/core/storage/events.d.ts.map +1 -0
- package/dist/core/storage/events.js +201 -0
- package/dist/core/storage/events.js.map +1 -0
- package/dist/core/storage/injections.d.ts +27 -0
- package/dist/core/storage/injections.d.ts.map +1 -0
- package/dist/core/storage/injections.js +51 -0
- package/dist/core/storage/injections.js.map +1 -0
- package/dist/core/storage/maintenance.d.ts +21 -0
- package/dist/core/storage/maintenance.d.ts.map +1 -0
- package/dist/core/storage/maintenance.js +52 -0
- package/dist/core/storage/maintenance.js.map +1 -0
- package/dist/core/storage/routing.d.ts +71 -0
- package/dist/core/storage/routing.d.ts.map +1 -0
- package/dist/core/storage/routing.js +141 -0
- package/dist/core/storage/routing.js.map +1 -0
- package/dist/core/storage/rows.d.ts +0 -47
- package/dist/core/storage/rows.d.ts.map +1 -1
- package/dist/core/storage/schema.sql +74 -136
- package/dist/core/storage/sessions.d.ts +34 -0
- package/dist/core/storage/sessions.d.ts.map +1 -0
- package/dist/core/storage/sessions.js +78 -0
- package/dist/core/storage/sessions.js.map +1 -0
- package/dist/core/storage/skills.d.ts +40 -0
- package/dist/core/storage/skills.d.ts.map +1 -0
- package/dist/core/storage/skills.js +107 -0
- package/dist/core/storage/skills.js.map +1 -0
- package/dist/core/storage/sqlite.d.ts +63 -265
- package/dist/core/storage/sqlite.d.ts.map +1 -1
- package/dist/core/storage/sqlite.js +102 -759
- package/dist/core/storage/sqlite.js.map +1 -1
- package/dist/core/storage/tasks.d.ts +64 -0
- package/dist/core/storage/tasks.d.ts.map +1 -0
- package/dist/core/storage/tasks.js +134 -0
- package/dist/core/storage/tasks.js.map +1 -0
- package/dist/core/storage/token-usage.d.ts +36 -0
- package/dist/core/storage/token-usage.d.ts.map +1 -0
- package/dist/core/storage/token-usage.js +59 -0
- package/dist/core/storage/token-usage.js.map +1 -0
- package/dist/core/types.d.ts +60 -4
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +24 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/utils/format.d.ts +28 -0
- package/dist/core/utils/format.d.ts.map +1 -0
- package/dist/core/utils/format.js +68 -0
- package/dist/core/utils/format.js.map +1 -0
- package/dist/core/utils/logger.d.ts +6 -1
- package/dist/core/utils/logger.d.ts.map +1 -1
- package/dist/core/utils/logger.js +72 -2
- package/dist/core/utils/logger.js.map +1 -1
- package/dist/core/utils/session.d.ts +16 -0
- package/dist/core/utils/session.d.ts.map +1 -0
- package/dist/core/utils/session.js +25 -0
- package/dist/core/utils/session.js.map +1 -0
- package/dist/core/utils/time.d.ts +22 -0
- package/dist/core/utils/time.d.ts.map +1 -0
- package/dist/core/utils/time.js +38 -0
- package/dist/core/utils/time.js.map +1 -0
- package/dist/daemon/handlers/history-exporter.d.ts.map +1 -1
- package/dist/daemon/handlers/history-exporter.js +6 -4
- package/dist/daemon/handlers/history-exporter.js.map +1 -1
- package/dist/daemon/handlers/post-tool-use.d.ts +5 -12
- package/dist/daemon/handlers/post-tool-use.d.ts.map +1 -1
- package/dist/daemon/handlers/post-tool-use.js +21 -79
- package/dist/daemon/handlers/post-tool-use.js.map +1 -1
- package/dist/daemon/handlers/stop.d.ts +24 -12
- package/dist/daemon/handlers/stop.d.ts.map +1 -1
- package/dist/daemon/handlers/stop.js +141 -42
- package/dist/daemon/handlers/stop.js.map +1 -1
- package/dist/daemon/handlers/user-prompt.d.ts +18 -19
- package/dist/daemon/handlers/user-prompt.d.ts.map +1 -1
- package/dist/daemon/handlers/user-prompt.js +103 -227
- package/dist/daemon/handlers/user-prompt.js.map +1 -1
- package/dist/daemon/index.d.ts +6 -2
- package/dist/daemon/index.d.ts.map +1 -1
- package/dist/daemon/index.js +76 -120
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/launchd/com.claude-forge.daemon.plist.template +47 -0
- package/dist/daemon/launchd-installer.d.ts +61 -0
- package/dist/daemon/launchd-installer.d.ts.map +1 -0
- package/dist/daemon/launchd-installer.js +182 -0
- package/dist/daemon/launchd-installer.js.map +1 -0
- package/dist/daemon/lifecycle.d.ts +11 -0
- package/dist/daemon/lifecycle.d.ts.map +1 -1
- package/dist/daemon/lifecycle.js +44 -0
- package/dist/daemon/lifecycle.js.map +1 -1
- package/dist/daemon/router.d.ts +9 -2
- package/dist/daemon/router.d.ts.map +1 -1
- package/dist/daemon/router.js +27 -3
- package/dist/daemon/router.js.map +1 -1
- package/dist/daemon/server.d.ts.map +1 -1
- package/dist/daemon/server.js +6 -5
- package/dist/daemon/server.js.map +1 -1
- package/dist/daemon/services/anti-pattern-detector.d.ts +50 -0
- package/dist/daemon/services/anti-pattern-detector.d.ts.map +1 -0
- package/dist/daemon/services/anti-pattern-detector.js +357 -0
- package/dist/daemon/services/anti-pattern-detector.js.map +1 -0
- package/dist/daemon/services/drift-detector.d.ts +64 -0
- package/dist/daemon/services/drift-detector.d.ts.map +1 -0
- package/dist/daemon/services/drift-detector.js +201 -0
- package/dist/daemon/services/drift-detector.js.map +1 -0
- package/dist/{intelligence → daemon/services}/task-segmenter.d.ts +7 -1
- package/dist/daemon/services/task-segmenter.d.ts.map +1 -0
- package/dist/{intelligence → daemon/services}/task-segmenter.js +29 -6
- package/dist/daemon/services/task-segmenter.js.map +1 -0
- package/dist/daemon/services/weekly-report.d.ts +91 -0
- package/dist/daemon/services/weekly-report.d.ts.map +1 -0
- package/dist/daemon/services/weekly-report.js +327 -0
- package/dist/daemon/services/weekly-report.js.map +1 -0
- package/dist/hooks/hook-lib.sh +81 -0
- package/dist/hooks/notification.sh +7 -3
- package/dist/hooks/post-tool-use.sh +8 -4
- package/dist/hooks/pre-tool-use.sh +7 -4
- package/dist/hooks/stop.sh +1 -1
- package/dist/hooks/user-prompt-submit.sh +8 -9
- package/dist/mcp/server.d.ts +2 -2
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +71 -11
- package/dist/mcp/server.js.map +1 -1
- package/dist/skills/invocation-guard.d.ts +20 -0
- package/dist/skills/invocation-guard.d.ts.map +1 -1
- package/dist/skills/invocation-guard.js +63 -0
- package/dist/skills/invocation-guard.js.map +1 -1
- package/dist/skills/matcher.d.ts.map +1 -1
- package/dist/skills/matcher.js +12 -3
- package/dist/skills/matcher.js.map +1 -1
- package/dist/skills/official/code-simplifier.md +16 -0
- package/dist/skills/official/find-skills.md +23 -0
- package/dist/skills/official/official-api-design.md +17 -0
- package/dist/skills/official/official-architecture-decision.md +20 -0
- package/dist/skills/official/official-bmad.md +118 -0
- package/dist/skills/official/official-db-schema-design.md +16 -0
- package/dist/skills/official/official-debug.md +17 -0
- package/dist/skills/official/official-doc-driven.md +31 -0
- package/dist/skills/official/official-harness-engineering.md +108 -0
- package/dist/skills/official/official-performance-optimization.md +30 -0
- package/dist/skills/official/official-pr-review.md +35 -0
- package/dist/skills/official/official-release-checklist.md +30 -0
- package/dist/skills/official/official-security-hardening.md +26 -0
- package/dist/skills/official/official-spec-driven-design.md +31 -0
- package/dist/skills/official/planning-with-files.md +37 -0
- package/dist/skills/official/ui-ux-pro-max.md +18 -0
- package/dist/skills/official/webapp-testing.md +12 -0
- package/dist/skills/official-skills.d.ts +8 -4
- package/dist/skills/official-skills.d.ts.map +1 -1
- package/dist/skills/official-skills.js +48 -704
- package/dist/skills/official-skills.js.map +1 -1
- package/dist/skills/registry.d.ts +5 -0
- package/dist/skills/registry.d.ts.map +1 -1
- package/dist/skills/registry.js +48 -15
- package/dist/skills/registry.js.map +1 -1
- package/dist/skills/tools/pipeline-suggest.d.ts +30 -0
- package/dist/skills/tools/pipeline-suggest.d.ts.map +1 -0
- package/dist/skills/tools/pipeline-suggest.js +178 -0
- package/dist/skills/tools/pipeline-suggest.js.map +1 -0
- package/dist/web/routes/ai.d.ts.map +1 -1
- package/dist/web/routes/ai.js +16 -22
- package/dist/web/routes/ai.js.map +1 -1
- package/dist/web/routes/drift.d.ts +10 -0
- package/dist/web/routes/drift.d.ts.map +1 -0
- package/dist/web/routes/drift.js +21 -0
- package/dist/web/routes/drift.js.map +1 -0
- package/dist/web/routes/error-handler.d.ts +43 -0
- package/dist/web/routes/error-handler.d.ts.map +1 -0
- package/dist/web/routes/error-handler.js +99 -0
- package/dist/web/routes/error-handler.js.map +1 -0
- package/dist/web/routes/insights.d.ts +9 -0
- package/dist/web/routes/insights.d.ts.map +1 -0
- package/dist/web/routes/insights.js +34 -0
- package/dist/web/routes/insights.js.map +1 -0
- package/dist/web/routes/patch.js +2 -2
- package/dist/web/routes/patch.js.map +1 -1
- package/dist/web/routes/reports.d.ts +10 -0
- package/dist/web/routes/reports.d.ts.map +1 -0
- package/dist/web/routes/reports.js +27 -0
- package/dist/web/routes/reports.js.map +1 -0
- package/dist/web/routes/rules.d.ts +10 -3
- package/dist/web/routes/rules.d.ts.map +1 -1
- package/dist/web/routes/rules.js +80 -95
- package/dist/web/routes/rules.js.map +1 -1
- package/dist/web/routes/sessions.d.ts +1 -2
- package/dist/web/routes/sessions.d.ts.map +1 -1
- package/dist/web/routes/sessions.js +27 -39
- package/dist/web/routes/sessions.js.map +1 -1
- package/dist/web/routes/skill-stats.d.ts.map +1 -1
- package/dist/web/routes/skill-stats.js +38 -0
- package/dist/web/routes/skill-stats.js.map +1 -1
- package/dist/web/routes/skills.d.ts.map +1 -1
- package/dist/web/routes/skills.js +34 -0
- package/dist/web/routes/skills.js.map +1 -1
- package/dist/web/routes/stats.d.ts +7 -0
- package/dist/web/routes/stats.d.ts.map +1 -0
- package/dist/web/routes/stats.js +44 -0
- package/dist/web/routes/stats.js.map +1 -0
- package/dist/web/routes/status.js +1 -1
- package/dist/web/routes/status.js.map +1 -1
- package/dist/web/routes/tasks.d.ts +4 -0
- package/dist/web/routes/tasks.d.ts.map +1 -0
- package/dist/web/routes/tasks.js +181 -0
- package/dist/web/routes/tasks.js.map +1 -0
- package/dist/web/routes/trace.d.ts +10 -0
- package/dist/web/routes/trace.d.ts.map +1 -0
- package/dist/web/routes/trace.js +123 -0
- package/dist/web/routes/trace.js.map +1 -0
- package/dist/web/routes/types.d.ts +1 -14
- package/dist/web/routes/types.d.ts.map +1 -1
- package/dist/web/routes/types.js +8 -17
- package/dist/web/routes/types.js.map +1 -1
- package/dist/web/server.d.ts +1 -9
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +28 -28
- package/dist/web/server.js.map +1 -1
- package/dist/web/static/assets/AIConfig-BQCAQE9D.js +2 -0
- package/dist/web/static/assets/AIConfig-BQCAQE9D.js.map +1 -0
- package/dist/web/static/assets/Dashboard-D7Bo6Kan.js +2 -0
- package/dist/web/static/assets/Dashboard-D7Bo6Kan.js.map +1 -0
- package/dist/web/static/assets/{Drawer-DcU3ln98.js → Drawer-BeHRQxUS.js} +2 -2
- package/dist/web/static/assets/{Drawer-DcU3ln98.js.map → Drawer-BeHRQxUS.js.map} +1 -1
- package/dist/web/static/assets/Events-K_tCY2ti.js +2 -0
- package/dist/web/static/assets/Events-K_tCY2ti.js.map +1 -0
- package/dist/web/static/assets/Reports-BJCmBnc_.js +2 -0
- package/dist/web/static/assets/Reports-BJCmBnc_.js.map +1 -0
- package/dist/web/static/assets/SearchInput-BX2KhMkw.js +2 -0
- package/dist/web/static/assets/SearchInput-BX2KhMkw.js.map +1 -0
- package/dist/web/static/assets/SessionDetail-Bkr-kC7V.js +2 -0
- package/dist/web/static/assets/SessionDetail-Bkr-kC7V.js.map +1 -0
- package/dist/web/static/assets/Sessions-Chx9OCLH.js +2 -0
- package/dist/web/static/assets/Sessions-Chx9OCLH.js.map +1 -0
- package/dist/web/static/assets/Skills-O0GT1i7m.js +2 -0
- package/dist/web/static/assets/Skills-O0GT1i7m.js.map +1 -0
- package/dist/web/static/assets/TaskDetail-5SR8zGzv.js +2 -0
- package/dist/web/static/assets/TaskDetail-5SR8zGzv.js.map +1 -0
- package/dist/web/static/assets/Tasks-DCgDqvOZ.js +2 -0
- package/dist/web/static/assets/Tasks-DCgDqvOZ.js.map +1 -0
- package/dist/web/static/assets/export-L_VBD2p1.js +4 -0
- package/dist/web/static/assets/export-L_VBD2p1.js.map +1 -0
- package/dist/web/static/assets/index-D8AKj26b.css +1 -0
- package/dist/web/static/assets/index-DxIbmNmr.js +3 -0
- package/dist/web/static/assets/index-DxIbmNmr.js.map +1 -0
- package/dist/web/static/assets/{lucide-53bR2rki.js → lucide-fJlPI3H7.js} +68 -38
- package/dist/web/static/assets/lucide-fJlPI3H7.js.map +1 -0
- package/dist/web/static/assets/time-Bxuk0M-C.js +2 -0
- package/dist/web/static/assets/time-Bxuk0M-C.js.map +1 -0
- package/dist/web/static/index.html +3 -3
- package/docs/concurrent-agents.md +129 -0
- package/docs/design/architecture-review-20260516.md +232 -0
- package/docs/design/fix-skills-data-and-set-leak-spec-20260516-1300.md +219 -0
- package/docs/design/hook-failure-queue-spec-20260516-1530.md +204 -0
- package/docs/design/refactor-phase1-spec-20260515-1600.md +543 -0
- package/docs/design/refactor-phase2-spec-20260515-1700.md +424 -0
- package/docs/design/tasks-list-filter-pagination-spec-20260518-0930.md +208 -0
- package/docs/implementation/fix-skills-data-and-set-leak-changelog-20260516-1300.md +104 -0
- package/docs/implementation/hook-failure-queue-changelog-20260516-1530.md +196 -0
- package/docs/implementation/hotfix-daemon-event-reject-20260516-1430.md +56 -0
- package/docs/implementation/refactor-phase1-changelog-20260515-1630.md +354 -0
- package/docs/implementation/refactor-phase2-changelog-20260515-1705.md +421 -0
- package/docs/implementation/tasks-list-filter-pagination-changelog-20260518-0930.md +72 -0
- package/docs/reviews/claudemd-template-sync.md +54 -0
- package/docs/reviews/tasks-filter-pagination.md +80 -0
- package/docs/ruflo-learning-strategy.md +322 -0
- package/docs/skills-deduplication-analysis.md +83 -0
- package/docs/skills-multiformat-support.md +177 -0
- package/docs/skills-third-party.md +183 -0
- package/docs/testing/tasks-filter-pagination-test-report.md +86 -0
- package/forge +321 -0
- package/package.json +28 -62
- package/playwright.config.ts +40 -0
- package/scripts/demo-v2.ts +91 -0
- package/scripts/dev-daemon.sh +232 -0
- package/scripts/dev-web.ts +109 -0
- package/scripts/e2e-mcp-link.ts +423 -0
- package/scripts/e2e-methodology-quality.ts +253 -0
- package/scripts/e2e-routing.ts +456 -0
- package/scripts/e2e-user-methodology.ts +326 -0
- package/scripts/e2e-web-workflows.ts +299 -0
- package/scripts/migrate-legacy-to-dynamic.sql +108 -0
- package/scripts/regenerate-execution-docs.ts +116 -0
- package/scripts/sync-agent-skills.ts +193 -0
- package/scripts/test-hook.sh +71 -0
- package/scripts/verify-skill-loading.ts +62 -0
- package/src/claudemd/claudemd-generator.ts +777 -0
- package/src/claudemd/convention-extractor.ts +69 -0
- package/src/claudemd/index.ts +35 -0
- package/src/claudemd/persona-manager.ts +88 -0
- package/src/claudemd/resume-manager.ts +236 -0
- package/src/claudemd/tech-detector.ts +220 -0
- package/src/cli/commands/claudemd.ts +84 -0
- package/src/cli/commands/config.ts +46 -0
- package/src/cli/commands/daemon.ts +310 -0
- package/src/cli/commands/executions.ts +114 -0
- package/src/cli/commands/init.ts +204 -0
- package/src/cli/commands/logs.ts +181 -0
- package/src/cli/commands/mcp.ts +244 -0
- package/src/cli/commands/menu.ts +356 -0
- package/src/cli/commands/skills.ts +185 -0
- package/src/cli/commands/stats.ts +74 -0
- package/src/cli/commands/status.ts +69 -0
- package/src/cli/commands/template.ts +77 -0
- package/src/cli/commands/trace.ts +164 -0
- package/src/cli/index.ts +42 -0
- package/src/cli/init/hook-manager.ts +132 -0
- package/src/core/ai/provider.ts +308 -0
- package/src/core/ai/types.ts +51 -0
- package/src/core/config.ts +124 -0
- package/src/core/constants.ts +45 -0
- package/src/core/queue/index.ts +193 -0
- package/src/core/storage/base.ts +226 -0
- package/src/core/storage/events.ts +255 -0
- package/src/core/storage/injections.ts +78 -0
- package/src/core/storage/maintenance.ts +59 -0
- package/src/core/storage/migrations/002_add_skill_tracking.sql +6 -0
- package/src/core/storage/migrations/003_add_skill_invocations.sql +23 -0
- package/src/core/storage/performance-indexes.sql +23 -0
- package/src/core/storage/routing.ts +194 -0
- package/src/core/storage/rows.ts +112 -0
- package/src/core/storage/schema.sql +214 -0
- package/src/core/storage/sessions.ts +104 -0
- package/src/core/storage/skills.ts +164 -0
- package/src/core/storage/sqlite.ts +194 -0
- package/src/core/storage/tasks.ts +170 -0
- package/src/core/storage/token-usage.ts +93 -0
- package/src/core/types.ts +154 -0
- package/src/core/utils/error-handler.ts +256 -0
- package/src/core/utils/forge-resume-block.ts +74 -0
- package/src/core/utils/format.ts +69 -0
- package/src/core/utils/logger.ts +119 -0
- package/src/core/utils/lru-cache.ts +50 -0
- package/src/core/utils/path.ts +19 -0
- package/src/core/utils/session.ts +26 -0
- package/src/core/utils/time.ts +37 -0
- package/src/core/utils/token-tracker.ts +97 -0
- package/src/daemon/event-parser.ts +35 -0
- package/src/daemon/handlers/history-exporter.ts +117 -0
- package/src/daemon/handlers/post-tool-use.ts +50 -0
- package/src/daemon/handlers/stop.ts +215 -0
- package/src/daemon/handlers/user-prompt.ts +188 -0
- package/src/daemon/index.ts +278 -0
- package/src/daemon/launchd/com.claude-forge.daemon.plist.template +47 -0
- package/src/daemon/launchd-installer.ts +260 -0
- package/src/daemon/lifecycle.ts +128 -0
- package/src/daemon/router.ts +40 -0
- package/src/daemon/server.ts +209 -0
- package/src/daemon/services/anti-pattern-detector.ts +412 -0
- package/src/daemon/services/drift-detector.ts +232 -0
- package/src/daemon/services/task-segmenter.ts +112 -0
- package/src/daemon/services/weekly-report.ts +454 -0
- package/src/hooks/hook-lib.sh +81 -0
- package/src/hooks/notification.sh +35 -0
- package/src/hooks/post-tool-use.sh +61 -0
- package/src/hooks/pre-tool-use.sh +63 -0
- package/src/hooks/stop.sh +40 -0
- package/src/hooks/user-prompt-submit.sh +69 -0
- package/src/mcp/server.ts +322 -0
- package/src/skills/index.ts +2 -0
- package/src/skills/invocation-guard.ts +177 -0
- package/src/skills/matcher.ts +148 -0
- package/src/skills/official/code-simplifier.md +16 -0
- package/src/skills/official/find-skills.md +23 -0
- package/src/skills/official/official-api-design.md +17 -0
- package/src/skills/official/official-architecture-decision.md +20 -0
- package/src/skills/official/official-bmad.md +118 -0
- package/src/skills/official/official-db-schema-design.md +16 -0
- package/src/skills/official/official-debug.md +17 -0
- package/src/skills/official/official-doc-driven.md +31 -0
- package/src/skills/official/official-harness-engineering.md +108 -0
- package/src/skills/official/official-performance-optimization.md +30 -0
- package/src/skills/official/official-pr-review.md +35 -0
- package/src/skills/official/official-release-checklist.md +30 -0
- package/src/skills/official/official-security-hardening.md +26 -0
- package/src/skills/official/official-spec-driven-design.md +31 -0
- package/src/skills/official/planning-with-files.md +37 -0
- package/src/skills/official/ui-ux-pro-max.md +18 -0
- package/src/skills/official/webapp-testing.md +12 -0
- package/src/skills/official-skills.ts +89 -0
- package/src/skills/registry.ts +355 -0
- package/src/skills/semantic-matcher.ts +231 -0
- package/src/skills/tools/pipeline-suggest.ts +226 -0
- package/src/skills/tools/skill-invoke.ts +168 -0
- package/src/skills/tools/skill-list.ts +59 -0
- package/src/templates/go.yaml +53 -0
- package/src/templates/python.yaml +59 -0
- package/src/templates/react.yaml +55 -0
- package/src/templates/template-manager.ts +170 -0
- package/src/web/auth-middleware.ts +55 -0
- package/src/web/routes/ai.ts +204 -0
- package/src/web/routes/auth.ts +22 -0
- package/src/web/routes/drift.ts +25 -0
- package/src/web/routes/error-handler.ts +120 -0
- package/src/web/routes/events.ts +47 -0
- package/src/web/routes/insights.ts +43 -0
- package/src/web/routes/patch.ts +117 -0
- package/src/web/routes/reports.ts +34 -0
- package/src/web/routes/rules.ts +101 -0
- package/src/web/routes/sessions.ts +262 -0
- package/src/web/routes/skill-stats.ts +132 -0
- package/src/web/routes/skills.ts +349 -0
- package/src/web/routes/static.ts +67 -0
- package/src/web/routes/stats.ts +60 -0
- package/src/web/routes/status.ts +30 -0
- package/src/web/routes/tasks.ts +218 -0
- package/src/web/routes/token-usage.ts +20 -0
- package/src/web/routes/trace.ts +138 -0
- package/src/web/routes/types.ts +56 -0
- package/src/web/server.ts +134 -0
- package/src/web/ssrf-guard.ts +112 -0
- package/src/web/static/index.html +3251 -0
- package/src/web/static/vendor/chart.umd.min.js +20 -0
- package/tests/e2e/dashboard.spec.ts +205 -0
- package/tests/e2e/routing-skill-e2e.test.ts +39 -0
- package/tests/helpers/mock-ai.ts +92 -0
- package/tests/helpers/mock-storage.ts +159 -0
- package/tests/integration/queue-replay.integration.test.ts +193 -0
- package/tests/integration/tasks-filter.integration.test.ts +154 -0
- package/tests/performance/database.benchmark.ts +161 -0
- package/tests/semantic-matcher.test.ts +99 -0
- package/tests/skill-matcher.test.ts +110 -0
- package/tests/unit/ai-provider-retry.test.ts +194 -0
- package/tests/unit/ai-provider-vision.test.ts +224 -0
- package/tests/unit/claudemd-generator.test.ts +68 -0
- package/tests/unit/cli-mcp.test.ts +141 -0
- package/tests/unit/handlers.test.ts +171 -0
- package/tests/unit/invocation-guard.test.ts +125 -0
- package/tests/unit/queue.test.ts +272 -0
- package/tests/unit/router.test.ts +138 -0
- package/tests/unit/security.test.ts +128 -0
- package/tests/unit/skill-invocations-workflow.test.ts +495 -0
- package/tests/unit/skill-registry.test.ts +94 -0
- package/tests/unit/skills/invocation-guard-ttl.test.ts +211 -0
- package/tests/unit/skills/official-skills-loader.test.ts +126 -0
- package/tests/unit/skills/registry-multiformat.test.ts +92 -0
- package/tests/unit/storage/sessions-aggregate.test.ts +435 -0
- package/tests/unit/storage/sqlite-refactor-harness.test.ts +314 -0
- package/tests/unit/storage.test.ts +172 -0
- package/tests/unit/token-usage.test.ts +144 -0
- package/tests/unit/type-guards.test.ts +201 -0
- package/tests/unit/utils/format.test.ts +189 -0
- package/tests/unit/utils/session.test.ts +89 -0
- package/tests/unit/utils/time.test.ts +112 -0
- package/tests/unit/web/routes-auth.test.ts +93 -0
- package/tests/unit/web/routes-events.test.ts +101 -0
- package/tests/unit/web/routes-sessions.test.ts +181 -0
- package/tests/unit/web/routes-skill-stats.test.ts +179 -0
- package/tests/unit/web/routes-stats.test.ts +92 -0
- package/tests/unit/web/routes-tasks.test.ts +351 -0
- package/tsconfig.json +22 -0
- package/vitest.config.ts +21 -0
- package/vitest.integration.config.ts +16 -0
- package/web/CLAUDE.md +20 -0
- package/web/index.html +13 -0
- package/web/package-lock.json +4854 -0
- package/web/package.json +35 -0
- package/web/postcss.config.js +6 -0
- package/web/src/App.tsx +110 -0
- package/web/src/components/CodeBlock.tsx +31 -0
- package/web/src/components/Confirm.tsx +96 -0
- package/web/src/components/Drawer.tsx +60 -0
- package/web/src/components/Layout.tsx +145 -0
- package/web/src/components/MarkdownRenderer.tsx +77 -0
- package/web/src/components/SearchInput.tsx +31 -0
- package/web/src/components/SessionDetailContent.tsx +157 -0
- package/web/src/components/Toast.tsx +92 -0
- package/web/src/index.css +19 -0
- package/web/src/main.tsx +31 -0
- package/web/src/pages/AIConfig.tsx +233 -0
- package/web/src/pages/Dashboard.tsx +572 -0
- package/web/src/pages/Events.tsx +271 -0
- package/web/src/pages/Reports.tsx +428 -0
- package/web/src/pages/SessionDetail.tsx +162 -0
- package/web/src/pages/Sessions.tsx +205 -0
- package/web/src/pages/Skills.tsx +180 -0
- package/web/src/pages/TaskDetail.tsx +511 -0
- package/web/src/pages/Tasks.tsx +150 -0
- package/web/src/utils/auth.ts +59 -0
- package/web/src/utils/export.ts +54 -0
- package/web/src/utils/time.ts +13 -0
- package/web/tailwind.config.js +11 -0
- package/web/tsconfig.json +21 -0
- package/web/tsconfig.node.json +10 -0
- package/web/vite.config.ts +76 -0
- package/winspan-claude-forge-8.43.0.tgz +0 -0
- package/dist/agents/definition.d.ts +0 -62
- package/dist/agents/definition.d.ts.map +0 -1
- package/dist/agents/definition.js +0 -27
- package/dist/agents/definition.js.map +0 -1
- package/dist/agents/distributor.d.ts +0 -23
- package/dist/agents/distributor.d.ts.map +0 -1
- package/dist/agents/distributor.js +0 -85
- package/dist/agents/distributor.js.map +0 -1
- package/dist/agents/index.d.ts +0 -5
- package/dist/agents/index.d.ts.map +0 -1
- package/dist/agents/index.js +0 -5
- package/dist/agents/index.js.map +0 -1
- package/dist/agents/methodologies/agent-builder.d.ts +0 -21
- package/dist/agents/methodologies/agent-builder.d.ts.map +0 -1
- package/dist/agents/methodologies/agent-builder.js +0 -149
- package/dist/agents/methodologies/agent-builder.js.map +0 -1
- package/dist/agents/methodologies/phases/bmad/analyze.d.ts +0 -3
- package/dist/agents/methodologies/phases/bmad/analyze.d.ts.map +0 -1
- package/dist/agents/methodologies/phases/bmad/analyze.js +0 -19
- package/dist/agents/methodologies/phases/bmad/analyze.js.map +0 -1
- package/dist/agents/methodologies/phases/bmad/design.d.ts +0 -3
- package/dist/agents/methodologies/phases/bmad/design.d.ts.map +0 -1
- package/dist/agents/methodologies/phases/bmad/design.js +0 -18
- package/dist/agents/methodologies/phases/bmad/design.js.map +0 -1
- package/dist/agents/methodologies/phases/bmad/implement.d.ts +0 -3
- package/dist/agents/methodologies/phases/bmad/implement.d.ts.map +0 -1
- package/dist/agents/methodologies/phases/bmad/implement.js +0 -17
- package/dist/agents/methodologies/phases/bmad/implement.js.map +0 -1
- package/dist/agents/methodologies/phases/bmad/index.d.ts +0 -6
- package/dist/agents/methodologies/phases/bmad/index.d.ts.map +0 -1
- package/dist/agents/methodologies/phases/bmad/index.js +0 -6
- package/dist/agents/methodologies/phases/bmad/index.js.map +0 -1
- package/dist/agents/methodologies/phases/bmad/review.d.ts +0 -3
- package/dist/agents/methodologies/phases/bmad/review.d.ts.map +0 -1
- package/dist/agents/methodologies/phases/bmad/review.js +0 -17
- package/dist/agents/methodologies/phases/bmad/review.js.map +0 -1
- package/dist/agents/methodologies/phases/bmad/test.d.ts +0 -3
- package/dist/agents/methodologies/phases/bmad/test.d.ts.map +0 -1
- package/dist/agents/methodologies/phases/bmad/test.js +0 -21
- package/dist/agents/methodologies/phases/bmad/test.js.map +0 -1
- package/dist/agents/methodologies/phases/harness/fix.d.ts +0 -3
- package/dist/agents/methodologies/phases/harness/fix.d.ts.map +0 -1
- package/dist/agents/methodologies/phases/harness/fix.js +0 -17
- package/dist/agents/methodologies/phases/harness/fix.js.map +0 -1
- package/dist/agents/methodologies/phases/harness/index.d.ts +0 -6
- package/dist/agents/methodologies/phases/harness/index.d.ts.map +0 -1
- package/dist/agents/methodologies/phases/harness/index.js +0 -6
- package/dist/agents/methodologies/phases/harness/index.js.map +0 -1
- package/dist/agents/methodologies/phases/harness/reproduce.d.ts +0 -3
- package/dist/agents/methodologies/phases/harness/reproduce.d.ts.map +0 -1
- package/dist/agents/methodologies/phases/harness/reproduce.js +0 -20
- package/dist/agents/methodologies/phases/harness/reproduce.js.map +0 -1
- package/dist/agents/methodologies/phases/harness/root-cause.d.ts +0 -3
- package/dist/agents/methodologies/phases/harness/root-cause.d.ts.map +0 -1
- package/dist/agents/methodologies/phases/harness/root-cause.js +0 -21
- package/dist/agents/methodologies/phases/harness/root-cause.js.map +0 -1
- package/dist/agents/methodologies/phases/harness/safety-net.d.ts +0 -3
- package/dist/agents/methodologies/phases/harness/safety-net.d.ts.map +0 -1
- package/dist/agents/methodologies/phases/harness/safety-net.js +0 -17
- package/dist/agents/methodologies/phases/harness/safety-net.js.map +0 -1
- package/dist/agents/methodologies/phases/harness/verify.d.ts +0 -3
- package/dist/agents/methodologies/phases/harness/verify.d.ts.map +0 -1
- package/dist/agents/methodologies/phases/harness/verify.js +0 -22
- package/dist/agents/methodologies/phases/harness/verify.js.map +0 -1
- package/dist/agents/methodologies/presets.d.ts +0 -10
- package/dist/agents/methodologies/presets.d.ts.map +0 -1
- package/dist/agents/methodologies/presets.js +0 -79
- package/dist/agents/methodologies/presets.js.map +0 -1
- package/dist/agents/methodologies/types.d.ts +0 -45
- package/dist/agents/methodologies/types.d.ts.map +0 -1
- package/dist/agents/methodologies/types.js +0 -10
- package/dist/agents/methodologies/types.js.map +0 -1
- package/dist/agents/methodologies/user-config-loader.d.ts +0 -30
- package/dist/agents/methodologies/user-config-loader.d.ts.map +0 -1
- package/dist/agents/methodologies/user-config-loader.js +0 -159
- package/dist/agents/methodologies/user-config-loader.js.map +0 -1
- package/dist/agents/official-agents.d.ts +0 -4
- package/dist/agents/official-agents.d.ts.map +0 -1
- package/dist/agents/official-agents.js +0 -559
- package/dist/agents/official-agents.js.map +0 -1
- package/dist/agents/registry.d.ts +0 -57
- package/dist/agents/registry.d.ts.map +0 -1
- package/dist/agents/registry.js +0 -271
- package/dist/agents/registry.js.map +0 -1
- package/dist/capability/index.d.ts +0 -10
- package/dist/capability/index.d.ts.map +0 -1
- package/dist/capability/index.js +0 -10
- package/dist/capability/index.js.map +0 -1
- package/dist/capability/types.d.ts +0 -10
- package/dist/capability/types.d.ts.map +0 -1
- package/dist/capability/types.js +0 -10
- package/dist/capability/types.js.map +0 -1
- package/dist/cli/commands/agents.d.ts +0 -3
- package/dist/cli/commands/agents.d.ts.map +0 -1
- package/dist/cli/commands/agents.js +0 -62
- package/dist/cli/commands/agents.js.map +0 -1
- package/dist/cli/commands/rules.d.ts +0 -8
- package/dist/cli/commands/rules.d.ts.map +0 -1
- package/dist/cli/commands/rules.js +0 -89
- package/dist/cli/commands/rules.js.map +0 -1
- package/dist/daemon/auto-disable-scheduler.d.ts +0 -53
- package/dist/daemon/auto-disable-scheduler.d.ts.map +0 -1
- package/dist/daemon/auto-disable-scheduler.js +0 -114
- package/dist/daemon/auto-disable-scheduler.js.map +0 -1
- package/dist/daemon/handlers/pre-tool-use.d.ts +0 -39
- package/dist/daemon/handlers/pre-tool-use.d.ts.map +0 -1
- package/dist/daemon/handlers/pre-tool-use.js +0 -166
- package/dist/daemon/handlers/pre-tool-use.js.map +0 -1
- package/dist/daemon/routing-observer.d.ts +0 -42
- package/dist/daemon/routing-observer.d.ts.map +0 -1
- package/dist/daemon/routing-observer.js +0 -264
- package/dist/daemon/routing-observer.js.map +0 -1
- package/dist/daemon/routing-state.d.ts +0 -64
- package/dist/daemon/routing-state.d.ts.map +0 -1
- package/dist/daemon/routing-state.js +0 -240
- package/dist/daemon/routing-state.js.map +0 -1
- package/dist/engine/agent-router.d.ts +0 -142
- package/dist/engine/agent-router.d.ts.map +0 -1
- package/dist/engine/agent-router.js +0 -276
- package/dist/engine/agent-router.js.map +0 -1
- package/dist/engine/context-builder.d.ts +0 -23
- package/dist/engine/context-builder.d.ts.map +0 -1
- package/dist/engine/context-builder.js +0 -63
- package/dist/engine/context-builder.js.map +0 -1
- package/dist/engine/conventions/basic-security.yaml +0 -109
- package/dist/engine/conventions/code-quality.yaml +0 -123
- package/dist/engine/conventions/database-safety.yaml +0 -74
- package/dist/engine/conventions/dependency-safety.yaml +0 -132
- package/dist/engine/conventions/docker-safety.yaml +0 -69
- package/dist/engine/conventions/git-safety.yaml +0 -118
- package/dist/engine/conventions/go-best-practices.yaml +0 -84
- package/dist/engine/conventions/python-best-practices.yaml +0 -96
- package/dist/engine/conventions/react-best-practices.yaml +0 -96
- package/dist/engine/conventions/routing.yaml +0 -378
- package/dist/engine/conventions/strict-security.yaml +0 -30
- package/dist/engine/conventions/ts-quality.yaml +0 -49
- package/dist/engine/dsl/compiler.d.ts +0 -34
- package/dist/engine/dsl/compiler.d.ts.map +0 -1
- package/dist/engine/dsl/compiler.js +0 -702
- package/dist/engine/dsl/compiler.js.map +0 -1
- package/dist/engine/dsl/parser.d.ts +0 -25
- package/dist/engine/dsl/parser.d.ts.map +0 -1
- package/dist/engine/dsl/parser.js +0 -208
- package/dist/engine/dsl/parser.js.map +0 -1
- package/dist/engine/dsl/runtime.d.ts +0 -46
- package/dist/engine/dsl/runtime.d.ts.map +0 -1
- package/dist/engine/dsl/runtime.js +0 -173
- package/dist/engine/dsl/runtime.js.map +0 -1
- package/dist/engine/dsl/types.d.ts +0 -139
- package/dist/engine/dsl/types.d.ts.map +0 -1
- package/dist/engine/dsl/types.js +0 -11
- package/dist/engine/dsl/types.js.map +0 -1
- package/dist/engine/evidence-store.d.ts +0 -44
- package/dist/engine/evidence-store.d.ts.map +0 -1
- package/dist/engine/evidence-store.js +0 -109
- package/dist/engine/evidence-store.js.map +0 -1
- package/dist/engine/experiment-router.d.ts +0 -102
- package/dist/engine/experiment-router.d.ts.map +0 -1
- package/dist/engine/experiment-router.js +0 -289
- package/dist/engine/experiment-router.js.map +0 -1
- package/dist/engine/recommender.d.ts +0 -52
- package/dist/engine/recommender.d.ts.map +0 -1
- package/dist/engine/recommender.js +0 -162
- package/dist/engine/recommender.js.map +0 -1
- package/dist/engine/rule-engine.d.ts +0 -33
- package/dist/engine/rule-engine.d.ts.map +0 -1
- package/dist/engine/rule-engine.js +0 -250
- package/dist/engine/rule-engine.js.map +0 -1
- package/dist/engine/security-gates.d.ts +0 -42
- package/dist/engine/security-gates.d.ts.map +0 -1
- package/dist/engine/security-gates.js +0 -210
- package/dist/engine/security-gates.js.map +0 -1
- package/dist/intelligence/classifier.d.ts +0 -75
- package/dist/intelligence/classifier.d.ts.map +0 -1
- package/dist/intelligence/classifier.js +0 -352
- package/dist/intelligence/classifier.js.map +0 -1
- package/dist/intelligence/context-gatherer.d.ts +0 -101
- package/dist/intelligence/context-gatherer.d.ts.map +0 -1
- package/dist/intelligence/context-gatherer.js +0 -417
- package/dist/intelligence/context-gatherer.js.map +0 -1
- package/dist/intelligence/cot-classifier.d.ts +0 -95
- package/dist/intelligence/cot-classifier.d.ts.map +0 -1
- package/dist/intelligence/cot-classifier.js +0 -391
- package/dist/intelligence/cot-classifier.js.map +0 -1
- package/dist/intelligence/distiller.d.ts +0 -22
- package/dist/intelligence/distiller.d.ts.map +0 -1
- package/dist/intelligence/distiller.js +0 -108
- package/dist/intelligence/distiller.js.map +0 -1
- package/dist/intelligence/execution-doc-builder.d.ts +0 -151
- package/dist/intelligence/execution-doc-builder.d.ts.map +0 -1
- package/dist/intelligence/execution-doc-builder.js +0 -1018
- package/dist/intelligence/execution-doc-builder.js.map +0 -1
- package/dist/intelligence/intent-types.d.ts +0 -13
- package/dist/intelligence/intent-types.d.ts.map +0 -1
- package/dist/intelligence/intent-types.js +0 -19
- package/dist/intelligence/intent-types.js.map +0 -1
- package/dist/intelligence/multimodal-parser.d.ts +0 -105
- package/dist/intelligence/multimodal-parser.d.ts.map +0 -1
- package/dist/intelligence/multimodal-parser.js +0 -425
- package/dist/intelligence/multimodal-parser.js.map +0 -1
- package/dist/intelligence/quality-gate.d.ts +0 -45
- package/dist/intelligence/quality-gate.d.ts.map +0 -1
- package/dist/intelligence/quality-gate.js +0 -193
- package/dist/intelligence/quality-gate.js.map +0 -1
- package/dist/intelligence/task-segmenter.d.ts.map +0 -1
- package/dist/intelligence/task-segmenter.js.map +0 -1
- package/dist/web/routes/agents.d.ts +0 -7
- package/dist/web/routes/agents.d.ts.map +0 -1
- package/dist/web/routes/agents.js +0 -209
- package/dist/web/routes/agents.js.map +0 -1
- package/dist/web/routes/execution-trace.d.ts +0 -21
- package/dist/web/routes/execution-trace.d.ts.map +0 -1
- package/dist/web/routes/execution-trace.js +0 -353
- package/dist/web/routes/execution-trace.js.map +0 -1
- package/dist/web/routes/experiments.d.ts +0 -15
- package/dist/web/routes/experiments.d.ts.map +0 -1
- package/dist/web/routes/experiments.js +0 -187
- package/dist/web/routes/experiments.js.map +0 -1
- package/dist/web/routes/routing.d.ts +0 -17
- package/dist/web/routes/routing.d.ts.map +0 -1
- package/dist/web/routes/routing.js +0 -592
- package/dist/web/routes/routing.js.map +0 -1
- package/dist/web/routes/workflows.d.ts +0 -19
- package/dist/web/routes/workflows.d.ts.map +0 -1
- package/dist/web/routes/workflows.js +0 -86
- package/dist/web/routes/workflows.js.map +0 -1
- package/dist/web/static/assets/AIConfig-R5wZ3ZKT.js +0 -2
- package/dist/web/static/assets/AIConfig-R5wZ3ZKT.js.map +0 -1
- package/dist/web/static/assets/Agents-Beg34V1g.js +0 -2
- package/dist/web/static/assets/Agents-Beg34V1g.js.map +0 -1
- package/dist/web/static/assets/CodeBlock--H53gk46.js +0 -2
- package/dist/web/static/assets/CodeBlock--H53gk46.js.map +0 -1
- package/dist/web/static/assets/Dashboard-Cy1xsj1J.js +0 -2
- package/dist/web/static/assets/Dashboard-Cy1xsj1J.js.map +0 -1
- package/dist/web/static/assets/Events-mFhXl4zI.js +0 -2
- package/dist/web/static/assets/Events-mFhXl4zI.js.map +0 -1
- package/dist/web/static/assets/ExecutionTrace-DG901hLR.js +0 -3
- package/dist/web/static/assets/ExecutionTrace-DG901hLR.js.map +0 -1
- package/dist/web/static/assets/MarkdownRenderer-CCIz1MOz.js +0 -2
- package/dist/web/static/assets/MarkdownRenderer-CCIz1MOz.js.map +0 -1
- package/dist/web/static/assets/Routing-B7BFLfjh.js +0 -2
- package/dist/web/static/assets/Routing-B7BFLfjh.js.map +0 -1
- package/dist/web/static/assets/SessionDetail-BT0l4RrK.js +0 -2
- package/dist/web/static/assets/SessionDetail-BT0l4RrK.js.map +0 -1
- package/dist/web/static/assets/Sessions-C6J_HQ_u.js +0 -2
- package/dist/web/static/assets/Sessions-C6J_HQ_u.js.map +0 -1
- package/dist/web/static/assets/Skills-4DQWLaTv.js +0 -2
- package/dist/web/static/assets/Skills-4DQWLaTv.js.map +0 -1
- package/dist/web/static/assets/WorkflowDetail-zhNqUkBE.js +0 -2
- package/dist/web/static/assets/WorkflowDetail-zhNqUkBE.js.map +0 -1
- package/dist/web/static/assets/Workflows-Btvi-lGw.js +0 -2
- package/dist/web/static/assets/Workflows-Btvi-lGw.js.map +0 -1
- package/dist/web/static/assets/export-BQQZLaHV.js +0 -4
- package/dist/web/static/assets/export-BQQZLaHV.js.map +0 -1
- package/dist/web/static/assets/index-Cgr9qMtq.js +0 -3
- package/dist/web/static/assets/index-Cgr9qMtq.js.map +0 -1
- package/dist/web/static/assets/index-CngWb5gC.css +0 -1
- package/dist/web/static/assets/lucide-53bR2rki.js.map +0 -1
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
-- Claude Forge SQLite Schema (core tables)
|
|
2
|
+
-- Active tables: events, sessions, injections, tasks, task_events,
|
|
3
|
+
-- routing_events, token_usage, skill_invocations
|
|
4
|
+
--
|
|
5
|
+
-- ── Table Relationships ──────────────────────────────────────────────────────
|
|
6
|
+
--
|
|
7
|
+
-- events (core fact table)
|
|
8
|
+
-- └─ sessions.session_id — aggregated from events (app-layer, no FK)
|
|
9
|
+
-- └─ injections.event_id — FK ON DELETE CASCADE
|
|
10
|
+
-- └─ task_events.event_id — FK ON DELETE CASCADE
|
|
11
|
+
--
|
|
12
|
+
-- routing_events (agent routing decisions)
|
|
13
|
+
-- └─ routing_events.session_id → events.session_id (logical, no FK)
|
|
14
|
+
-- └─ skill_invocations.route_request_id → routing_events.route_request_id (logical, no FK)
|
|
15
|
+
--
|
|
16
|
+
-- skill_invocations (skill execution records)
|
|
17
|
+
-- └─ skill_invocations.session_id → events.session_id (logical, no FK)
|
|
18
|
+
-- └─ skill_invocations.route_request_id → routing_events.route_request_id (logical, no FK)
|
|
19
|
+
--
|
|
20
|
+
-- Why no FK on routing_events / skill_invocations:
|
|
21
|
+
-- 1. routing_events.route_request_id is nullable and not UNIQUE — cannot be FK target
|
|
22
|
+
-- 2. Write order is not guaranteed: skill_invocations may be written before routing_events
|
|
23
|
+
-- 3. session_id references are maintained by application logic; sessions is an aggregate
|
|
24
|
+
-- table that may lag behind event writes
|
|
25
|
+
-- 4. Indexes on join columns provide equivalent query performance to FK indexes
|
|
26
|
+
--
|
|
27
|
+
|
|
28
|
+
-- ── Events & Sessions ─────────────────────────────────────────────────────
|
|
29
|
+
|
|
30
|
+
CREATE TABLE IF NOT EXISTS events (
|
|
31
|
+
event_id TEXT PRIMARY KEY,
|
|
32
|
+
session_id TEXT NOT NULL,
|
|
33
|
+
project_path TEXT NOT NULL,
|
|
34
|
+
timestamp TEXT NOT NULL,
|
|
35
|
+
hook_type TEXT NOT NULL CHECK(hook_type IN ('PreToolUse', 'PostToolUse', 'UserPromptSubmit', 'Notification', 'Stop')),
|
|
36
|
+
tool_name TEXT,
|
|
37
|
+
tool_input TEXT,
|
|
38
|
+
tool_output TEXT,
|
|
39
|
+
user_prompt TEXT,
|
|
40
|
+
ai_response TEXT,
|
|
41
|
+
distilled INTEGER DEFAULT 0,
|
|
42
|
+
created_at TEXT DEFAULT (datetime('now'))
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
CREATE INDEX IF NOT EXISTS idx_events_session ON events(session_id);
|
|
46
|
+
CREATE INDEX IF NOT EXISTS idx_events_project ON events(project_path);
|
|
47
|
+
CREATE INDEX IF NOT EXISTS idx_events_timestamp ON events(timestamp DESC);
|
|
48
|
+
CREATE INDEX IF NOT EXISTS idx_events_distilled ON events(distilled);
|
|
49
|
+
CREATE INDEX IF NOT EXISTS idx_events_hook_type ON events(hook_type);
|
|
50
|
+
|
|
51
|
+
CREATE TABLE IF NOT EXISTS sessions (
|
|
52
|
+
session_id TEXT PRIMARY KEY,
|
|
53
|
+
project_path TEXT NOT NULL,
|
|
54
|
+
status TEXT NOT NULL DEFAULT 'active' CHECK(status IN ('active', 'completed', 'interrupted', 'resumed', 'abandoned')),
|
|
55
|
+
first_prompt TEXT,
|
|
56
|
+
start_time TEXT NOT NULL,
|
|
57
|
+
end_time TEXT,
|
|
58
|
+
last_event_time TEXT,
|
|
59
|
+
event_count INTEGER DEFAULT 0,
|
|
60
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
61
|
+
updated_at TEXT DEFAULT (datetime('now'))
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
CREATE INDEX IF NOT EXISTS idx_sessions_project ON sessions(project_path);
|
|
65
|
+
CREATE INDEX IF NOT EXISTS idx_sessions_status ON sessions(status);
|
|
66
|
+
CREATE INDEX IF NOT EXISTS idx_sessions_start_time ON sessions(start_time DESC);
|
|
67
|
+
|
|
68
|
+
-- ── Injections ─────────────────────────────────────────────────────
|
|
69
|
+
|
|
70
|
+
CREATE TABLE IF NOT EXISTS injections (
|
|
71
|
+
id TEXT PRIMARY KEY,
|
|
72
|
+
event_id TEXT,
|
|
73
|
+
session_id TEXT NOT NULL,
|
|
74
|
+
timestamp TEXT NOT NULL,
|
|
75
|
+
source_handler TEXT NOT NULL,
|
|
76
|
+
injection_type TEXT NOT NULL CHECK(injection_type IN ('systemMessage', 'additionalContext', 'reason')),
|
|
77
|
+
content TEXT NOT NULL,
|
|
78
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
79
|
+
FOREIGN KEY (event_id) REFERENCES events(event_id) ON DELETE CASCADE
|
|
80
|
+
);
|
|
81
|
+
|
|
82
|
+
CREATE INDEX IF NOT EXISTS idx_injections_session ON injections(session_id);
|
|
83
|
+
CREATE INDEX IF NOT EXISTS idx_injections_event ON injections(event_id);
|
|
84
|
+
CREATE INDEX IF NOT EXISTS idx_injections_timestamp ON injections(timestamp DESC);
|
|
85
|
+
|
|
86
|
+
-- ── Tasks ──────────────────────────────────────────────────────────
|
|
87
|
+
|
|
88
|
+
CREATE TABLE IF NOT EXISTS tasks (
|
|
89
|
+
id TEXT PRIMARY KEY,
|
|
90
|
+
session_id TEXT NOT NULL,
|
|
91
|
+
title TEXT NOT NULL,
|
|
92
|
+
description TEXT,
|
|
93
|
+
start_time TEXT NOT NULL,
|
|
94
|
+
end_time TEXT,
|
|
95
|
+
status TEXT DEFAULT 'active' CHECK(status IN ('active', 'completed', 'abandoned')),
|
|
96
|
+
event_count INTEGER DEFAULT 0,
|
|
97
|
+
created_at TEXT DEFAULT (datetime('now'))
|
|
98
|
+
);
|
|
99
|
+
|
|
100
|
+
CREATE TABLE IF NOT EXISTS task_events (
|
|
101
|
+
task_id TEXT NOT NULL,
|
|
102
|
+
event_id TEXT NOT NULL,
|
|
103
|
+
PRIMARY KEY (task_id, event_id),
|
|
104
|
+
FOREIGN KEY (task_id) REFERENCES tasks(id) ON DELETE CASCADE,
|
|
105
|
+
FOREIGN KEY (event_id) REFERENCES events(event_id) ON DELETE CASCADE
|
|
106
|
+
);
|
|
107
|
+
|
|
108
|
+
CREATE INDEX IF NOT EXISTS idx_tasks_session ON tasks(session_id);
|
|
109
|
+
CREATE INDEX IF NOT EXISTS idx_tasks_start_time ON tasks(start_time DESC);
|
|
110
|
+
CREATE INDEX IF NOT EXISTS idx_task_events_task ON task_events(task_id);
|
|
111
|
+
CREATE INDEX IF NOT EXISTS idx_task_events_event ON task_events(event_id);
|
|
112
|
+
|
|
113
|
+
-- ── Routing Events (agent routing observability) ─────────────────────────
|
|
114
|
+
|
|
115
|
+
CREATE TABLE IF NOT EXISTS routing_events (
|
|
116
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
117
|
+
session_id TEXT NOT NULL,
|
|
118
|
+
route_request_id TEXT,
|
|
119
|
+
project_path TEXT NOT NULL,
|
|
120
|
+
ts INTEGER NOT NULL,
|
|
121
|
+
prompt TEXT NOT NULL,
|
|
122
|
+
intent_json TEXT NOT NULL,
|
|
123
|
+
routed_to_type TEXT,
|
|
124
|
+
routed_to_name TEXT,
|
|
125
|
+
is_forced INTEGER DEFAULT 0,
|
|
126
|
+
obeyed INTEGER,
|
|
127
|
+
classification_ms INTEGER,
|
|
128
|
+
fallback_used INTEGER DEFAULT 0,
|
|
129
|
+
refusal_reason TEXT,
|
|
130
|
+
first_tool_name TEXT,
|
|
131
|
+
first_tool_ts INTEGER,
|
|
132
|
+
completed_ts INTEGER,
|
|
133
|
+
total_execution_ms INTEGER,
|
|
134
|
+
completion_reason TEXT,
|
|
135
|
+
downstream_task_chain TEXT,
|
|
136
|
+
injection_version TEXT,
|
|
137
|
+
experiment_id TEXT,
|
|
138
|
+
experiment_group TEXT,
|
|
139
|
+
skill_confidence REAL,
|
|
140
|
+
skill_source TEXT,
|
|
141
|
+
created_at TEXT DEFAULT (datetime('now'))
|
|
142
|
+
);
|
|
143
|
+
|
|
144
|
+
CREATE INDEX IF NOT EXISTS idx_routing_events_session ON routing_events(session_id);
|
|
145
|
+
CREATE INDEX IF NOT EXISTS idx_routing_events_route_request ON routing_events(route_request_id);
|
|
146
|
+
CREATE INDEX IF NOT EXISTS idx_routing_events_ts ON routing_events(ts DESC);
|
|
147
|
+
CREATE INDEX IF NOT EXISTS idx_routing_events_agent ON routing_events(routed_to_name, obeyed);
|
|
148
|
+
CREATE INDEX IF NOT EXISTS idx_routing_events_obeyed ON routing_events(obeyed);
|
|
149
|
+
CREATE INDEX IF NOT EXISTS idx_routing_events_experiment ON routing_events(experiment_id, experiment_group);
|
|
150
|
+
|
|
151
|
+
-- ── Token Usage ──────────────────────────────────────────────────────
|
|
152
|
+
|
|
153
|
+
CREATE TABLE IF NOT EXISTS token_usage (
|
|
154
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
155
|
+
session_id TEXT NOT NULL,
|
|
156
|
+
timestamp INTEGER NOT NULL,
|
|
157
|
+
input_tokens INTEGER NOT NULL,
|
|
158
|
+
output_tokens INTEGER NOT NULL,
|
|
159
|
+
total_tokens INTEGER NOT NULL,
|
|
160
|
+
model TEXT,
|
|
161
|
+
tool_name TEXT,
|
|
162
|
+
created_at TEXT DEFAULT (datetime('now'))
|
|
163
|
+
);
|
|
164
|
+
|
|
165
|
+
CREATE INDEX IF NOT EXISTS idx_token_usage_session ON token_usage(session_id);
|
|
166
|
+
CREATE INDEX IF NOT EXISTS idx_token_usage_timestamp ON token_usage(timestamp DESC);
|
|
167
|
+
|
|
168
|
+
-- ── Skill Invocations ─────────────────────────────────────────────────
|
|
169
|
+
|
|
170
|
+
CREATE TABLE IF NOT EXISTS skill_invocations (
|
|
171
|
+
id TEXT PRIMARY KEY,
|
|
172
|
+
route_request_id TEXT,
|
|
173
|
+
session_id TEXT NOT NULL,
|
|
174
|
+
agent_id TEXT,
|
|
175
|
+
skill_id TEXT NOT NULL,
|
|
176
|
+
invocation_type TEXT NOT NULL,
|
|
177
|
+
reason TEXT,
|
|
178
|
+
workflow TEXT,
|
|
179
|
+
phase TEXT,
|
|
180
|
+
feature_slug TEXT,
|
|
181
|
+
artifact_path TEXT,
|
|
182
|
+
depth INTEGER DEFAULT 0,
|
|
183
|
+
success INTEGER DEFAULT 1,
|
|
184
|
+
error TEXT,
|
|
185
|
+
timestamp INTEGER NOT NULL,
|
|
186
|
+
created_at TEXT DEFAULT (datetime('now'))
|
|
187
|
+
);
|
|
188
|
+
|
|
189
|
+
CREATE INDEX IF NOT EXISTS idx_skill_invocations_route_request ON skill_invocations(route_request_id);
|
|
190
|
+
CREATE INDEX IF NOT EXISTS idx_skill_invocations_session ON skill_invocations(session_id);
|
|
191
|
+
CREATE INDEX IF NOT EXISTS idx_skill_invocations_skill ON skill_invocations(skill_id);
|
|
192
|
+
CREATE INDEX IF NOT EXISTS idx_skill_invocations_timestamp ON skill_invocations(timestamp DESC);
|
|
193
|
+
|
|
194
|
+
-- ── Composite Indexes (high-frequency query optimization) ─────────────────────
|
|
195
|
+
-- These cover session-scoped queries that filter by session_id then sort by time.
|
|
196
|
+
-- Existing single-column indexes are retained for other query paths.
|
|
197
|
+
|
|
198
|
+
CREATE INDEX IF NOT EXISTS idx_events_session_ts ON events(session_id, timestamp DESC);
|
|
199
|
+
CREATE INDEX IF NOT EXISTS idx_routing_events_session_ts ON routing_events(session_id, ts DESC);
|
|
200
|
+
CREATE INDEX IF NOT EXISTS idx_skill_invocations_session_ts ON skill_invocations(session_id, timestamp DESC);
|
|
201
|
+
|
|
202
|
+
-- ── Additional Performance Indexes (Phase 1 Refactor) ─────────────────────
|
|
203
|
+
|
|
204
|
+
-- routing_events: optimize obeyed flag queries with time sorting
|
|
205
|
+
CREATE INDEX IF NOT EXISTS idx_routing_events_obeyed_ts ON routing_events(obeyed, ts DESC);
|
|
206
|
+
|
|
207
|
+
-- tasks: optimize filter+sort queries (start_time range filter + session join)
|
|
208
|
+
CREATE INDEX IF NOT EXISTS idx_tasks_start_time_session ON tasks(start_time DESC, session_id);
|
|
209
|
+
|
|
210
|
+
-- events: optimize session + hook_type composite queries
|
|
211
|
+
CREATE INDEX IF NOT EXISTS idx_events_session_hook ON events(session_id, hook_type, timestamp DESC);
|
|
212
|
+
|
|
213
|
+
-- injections: optimize session + handler composite queries
|
|
214
|
+
CREATE INDEX IF NOT EXISTS idx_injections_session_handler ON injections(session_id, source_handler);
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SessionOperations — sessions 聚合表读写
|
|
3
|
+
*
|
|
4
|
+
* 拆分自 sqlite.ts。负责:
|
|
5
|
+
* - upsertSession:每次 writeEvent 后被调用,更新 sessions 聚合
|
|
6
|
+
* - querySessions:直接读聚合表,O(sessions) 而非 O(sessions × events)
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type Database from 'better-sqlite3';
|
|
10
|
+
import type { ForgeEvent } from '../types.js';
|
|
11
|
+
|
|
12
|
+
export interface SessionSummary {
|
|
13
|
+
session_id: string;
|
|
14
|
+
first_prompt: string;
|
|
15
|
+
event_count: number;
|
|
16
|
+
start_time: string;
|
|
17
|
+
end_time: string;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export class SessionOperations {
|
|
21
|
+
constructor(private db: Database.Database) {}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* 将事件聚合到 sessions 表,供 querySessions 直接读取。
|
|
25
|
+
*
|
|
26
|
+
* 语义:
|
|
27
|
+
* - 首次出现 session_id → 插入一行
|
|
28
|
+
* - 已存在 → event_count += 1,end/last_event_time 取更晚的,first_prompt 只在
|
|
29
|
+
* 原值为 NULL 时才被 UserPromptSubmit 的前 200 字填充
|
|
30
|
+
*/
|
|
31
|
+
upsertSession(event: ForgeEvent): void {
|
|
32
|
+
const firstPrompt =
|
|
33
|
+
event.hook_type === 'UserPromptSubmit' && event.user_prompt
|
|
34
|
+
? event.user_prompt.slice(0, 200)
|
|
35
|
+
: null;
|
|
36
|
+
|
|
37
|
+
const stmt = this.db.prepare(`
|
|
38
|
+
INSERT INTO sessions (
|
|
39
|
+
session_id, project_path, status, first_prompt,
|
|
40
|
+
start_time, end_time, last_event_time, event_count
|
|
41
|
+
)
|
|
42
|
+
VALUES (?, ?, 'active', ?, ?, ?, ?, 1)
|
|
43
|
+
ON CONFLICT(session_id) DO UPDATE SET
|
|
44
|
+
end_time = CASE
|
|
45
|
+
WHEN excluded.end_time > COALESCE(sessions.end_time, '') THEN excluded.end_time
|
|
46
|
+
ELSE sessions.end_time
|
|
47
|
+
END,
|
|
48
|
+
last_event_time = CASE
|
|
49
|
+
WHEN excluded.last_event_time > COALESCE(sessions.last_event_time, '') THEN excluded.last_event_time
|
|
50
|
+
ELSE sessions.last_event_time
|
|
51
|
+
END,
|
|
52
|
+
event_count = COALESCE(sessions.event_count, 0) + 1,
|
|
53
|
+
first_prompt = COALESCE(sessions.first_prompt, excluded.first_prompt),
|
|
54
|
+
updated_at = datetime('now')
|
|
55
|
+
`);
|
|
56
|
+
stmt.run(
|
|
57
|
+
event.session_id,
|
|
58
|
+
event.project_path,
|
|
59
|
+
firstPrompt,
|
|
60
|
+
event.timestamp,
|
|
61
|
+
event.timestamp,
|
|
62
|
+
event.timestamp,
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
querySessions(filter: {
|
|
67
|
+
project_path?: string;
|
|
68
|
+
limit?: number;
|
|
69
|
+
} = {}): SessionSummary[] {
|
|
70
|
+
const conditions: string[] = [];
|
|
71
|
+
const params: unknown[] = [];
|
|
72
|
+
|
|
73
|
+
if (filter.project_path) {
|
|
74
|
+
conditions.push('project_path = ?');
|
|
75
|
+
params.push(filter.project_path);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
|
|
79
|
+
const limit = filter.limit ?? 10;
|
|
80
|
+
|
|
81
|
+
const sql = `
|
|
82
|
+
SELECT
|
|
83
|
+
session_id,
|
|
84
|
+
first_prompt,
|
|
85
|
+
event_count,
|
|
86
|
+
start_time,
|
|
87
|
+
COALESCE(end_time, last_event_time, start_time) AS end_time
|
|
88
|
+
FROM sessions
|
|
89
|
+
${where}
|
|
90
|
+
ORDER BY start_time DESC
|
|
91
|
+
LIMIT ?
|
|
92
|
+
`;
|
|
93
|
+
|
|
94
|
+
params.push(limit);
|
|
95
|
+
const rows = this.db.prepare(sql).all(...params) as Array<Record<string, unknown>>;
|
|
96
|
+
return rows.map(r => ({
|
|
97
|
+
session_id: r.session_id as string,
|
|
98
|
+
first_prompt: (r.first_prompt as string) || '',
|
|
99
|
+
event_count: (r.event_count as number) ?? 0,
|
|
100
|
+
start_time: r.start_time as string,
|
|
101
|
+
end_time: r.end_time as string,
|
|
102
|
+
}));
|
|
103
|
+
}
|
|
104
|
+
}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SkillOperations — skill_invocations 表读写 + 工作流聚合查询
|
|
3
|
+
*
|
|
4
|
+
* 拆分自 sqlite.ts。
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type Database from 'better-sqlite3';
|
|
8
|
+
import type { SkillInvocationRow } from './rows.js';
|
|
9
|
+
|
|
10
|
+
export class SkillOperations {
|
|
11
|
+
constructor(private db: Database.Database) {}
|
|
12
|
+
|
|
13
|
+
writeSkillInvocation(row: Omit<SkillInvocationRow, 'created_at'>): void {
|
|
14
|
+
const sql = `INSERT INTO skill_invocations
|
|
15
|
+
(id, route_request_id, session_id, agent_id, skill_id, invocation_type,
|
|
16
|
+
reason, workflow, phase, feature_slug, artifact_path,
|
|
17
|
+
depth, success, error, timestamp)
|
|
18
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`;
|
|
19
|
+
this.db.prepare(sql).run(
|
|
20
|
+
row.id,
|
|
21
|
+
row.route_request_id,
|
|
22
|
+
row.session_id,
|
|
23
|
+
row.agent_id,
|
|
24
|
+
row.skill_id,
|
|
25
|
+
row.invocation_type,
|
|
26
|
+
row.reason,
|
|
27
|
+
row.workflow,
|
|
28
|
+
row.phase,
|
|
29
|
+
row.feature_slug,
|
|
30
|
+
row.artifact_path,
|
|
31
|
+
row.depth,
|
|
32
|
+
row.success,
|
|
33
|
+
row.error,
|
|
34
|
+
row.timestamp,
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
querySkillInvocations(filter: {
|
|
39
|
+
route_request_id?: string;
|
|
40
|
+
session_id?: string;
|
|
41
|
+
skill_id?: string;
|
|
42
|
+
since?: number;
|
|
43
|
+
limit?: number;
|
|
44
|
+
} = {}): SkillInvocationRow[] {
|
|
45
|
+
const conditions: string[] = [];
|
|
46
|
+
const params: unknown[] = [];
|
|
47
|
+
|
|
48
|
+
if (filter.route_request_id) {
|
|
49
|
+
conditions.push('route_request_id = ?');
|
|
50
|
+
params.push(filter.route_request_id);
|
|
51
|
+
}
|
|
52
|
+
if (filter.session_id) {
|
|
53
|
+
conditions.push('session_id = ?');
|
|
54
|
+
params.push(filter.session_id);
|
|
55
|
+
}
|
|
56
|
+
if (filter.skill_id) {
|
|
57
|
+
conditions.push('skill_id = ?');
|
|
58
|
+
params.push(filter.skill_id);
|
|
59
|
+
}
|
|
60
|
+
if (filter.since !== undefined) {
|
|
61
|
+
conditions.push('timestamp >= ?');
|
|
62
|
+
params.push(filter.since);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
|
|
66
|
+
const limit = filter.limit ?? 100;
|
|
67
|
+
const sql = `SELECT * FROM skill_invocations ${where} ORDER BY timestamp DESC LIMIT ?`;
|
|
68
|
+
|
|
69
|
+
params.push(limit);
|
|
70
|
+
return this.db.prepare(sql).all(...params) as SkillInvocationRow[];
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* 按 route_request_id 聚合工作流进度。
|
|
75
|
+
*
|
|
76
|
+
* 用途:Web UI 展示「某次路由 / 某个 session 走完了哪些 phase」。仅聚合
|
|
77
|
+
* `workflow IS NOT NULL` 的调用(工作流型 reason),普通调用不会被纳入。
|
|
78
|
+
*/
|
|
79
|
+
queryWorkflowProgress(filter: {
|
|
80
|
+
session_id?: string;
|
|
81
|
+
workflow?: string;
|
|
82
|
+
limit?: number;
|
|
83
|
+
} = {}): Array<{
|
|
84
|
+
route_request_id: string;
|
|
85
|
+
workflow: string;
|
|
86
|
+
phases_completed: string[];
|
|
87
|
+
feature_slug: string | null;
|
|
88
|
+
total_invocations: number;
|
|
89
|
+
success_count: number;
|
|
90
|
+
first_at: number;
|
|
91
|
+
last_at: number;
|
|
92
|
+
}> {
|
|
93
|
+
const conditions: string[] = ['workflow IS NOT NULL', 'route_request_id IS NOT NULL'];
|
|
94
|
+
const params: unknown[] = [];
|
|
95
|
+
|
|
96
|
+
if (filter.session_id) {
|
|
97
|
+
conditions.push('session_id = ?');
|
|
98
|
+
params.push(filter.session_id);
|
|
99
|
+
}
|
|
100
|
+
if (filter.workflow) {
|
|
101
|
+
conditions.push('workflow = ?');
|
|
102
|
+
params.push(filter.workflow);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const where = `WHERE ${conditions.join(' AND ')}`;
|
|
106
|
+
const limit = filter.limit ?? 100;
|
|
107
|
+
|
|
108
|
+
const sql = `
|
|
109
|
+
SELECT
|
|
110
|
+
route_request_id,
|
|
111
|
+
workflow,
|
|
112
|
+
GROUP_CONCAT(phase, '||') AS phases_raw,
|
|
113
|
+
MIN(feature_slug) AS feature_slug,
|
|
114
|
+
COUNT(*) AS total_invocations,
|
|
115
|
+
SUM(success) AS success_count,
|
|
116
|
+
MIN(timestamp) AS first_at,
|
|
117
|
+
MAX(timestamp) AS last_at
|
|
118
|
+
FROM (
|
|
119
|
+
SELECT * FROM skill_invocations
|
|
120
|
+
${where}
|
|
121
|
+
ORDER BY timestamp ASC
|
|
122
|
+
)
|
|
123
|
+
GROUP BY route_request_id, workflow
|
|
124
|
+
ORDER BY last_at DESC
|
|
125
|
+
LIMIT ?
|
|
126
|
+
`;
|
|
127
|
+
|
|
128
|
+
type AggRow = {
|
|
129
|
+
route_request_id: string;
|
|
130
|
+
workflow: string;
|
|
131
|
+
phases_raw: string | null;
|
|
132
|
+
feature_slug: string | null;
|
|
133
|
+
total_invocations: number;
|
|
134
|
+
success_count: number | null;
|
|
135
|
+
first_at: number;
|
|
136
|
+
last_at: number;
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
params.push(limit);
|
|
140
|
+
const rows = this.db.prepare(sql).all(...params) as AggRow[];
|
|
141
|
+
|
|
142
|
+
return rows.map(r => {
|
|
143
|
+
const phases = r.phases_raw ? r.phases_raw.split('||').filter(Boolean) : [];
|
|
144
|
+
const seen = new Set<string>();
|
|
145
|
+
const phases_completed: string[] = [];
|
|
146
|
+
for (const p of phases) {
|
|
147
|
+
if (!seen.has(p)) {
|
|
148
|
+
seen.add(p);
|
|
149
|
+
phases_completed.push(p);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return {
|
|
153
|
+
route_request_id: r.route_request_id,
|
|
154
|
+
workflow: r.workflow,
|
|
155
|
+
phases_completed,
|
|
156
|
+
feature_slug: r.feature_slug,
|
|
157
|
+
total_invocations: r.total_invocations,
|
|
158
|
+
success_count: r.success_count ?? 0,
|
|
159
|
+
first_at: r.first_at,
|
|
160
|
+
last_at: r.last_at,
|
|
161
|
+
};
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLiteStorage — 装配入口(facade)
|
|
3
|
+
*
|
|
4
|
+
* 历史上这是一个 1000+ 行的单文件实现。重构后职责拆分到独立的 *Operations 类,
|
|
5
|
+
* 此文件保留为:
|
|
6
|
+
* - 组合 db 实例 + 各个 Operations
|
|
7
|
+
* - 保持原有 API 完全向后兼容(方法签名 / EventEmitter 行为 / 类型 re-export)
|
|
8
|
+
*
|
|
9
|
+
* 职责矩阵:
|
|
10
|
+
* base.ts — 数据库连接、schema、迁移
|
|
11
|
+
* events.ts — events 表读写
|
|
12
|
+
* sessions.ts — sessions 聚合表
|
|
13
|
+
* tasks.ts — tasks / task_events
|
|
14
|
+
* injections.ts — injections
|
|
15
|
+
* routing.ts — routing_events + experiment_assignments
|
|
16
|
+
* skills.ts — skill_invocations + workflow 聚合
|
|
17
|
+
* token-usage.ts — token_usage
|
|
18
|
+
* maintenance.ts — 清理 / VACUUM
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import { EventEmitter } from 'node:events';
|
|
22
|
+
import type Database from 'better-sqlite3';
|
|
23
|
+
import type { ForgeEvent } from '../types.js';
|
|
24
|
+
import { SQLiteBase } from './base.js';
|
|
25
|
+
import { EventOperations } from './events.js';
|
|
26
|
+
import { SessionOperations } from './sessions.js';
|
|
27
|
+
import { TaskOperations } from './tasks.js';
|
|
28
|
+
import { InjectionOperations } from './injections.js';
|
|
29
|
+
import { RoutingOperations } from './routing.js';
|
|
30
|
+
import { SkillOperations } from './skills.js';
|
|
31
|
+
import { TokenUsageOperations } from './token-usage.js';
|
|
32
|
+
import { MaintenanceOperations } from './maintenance.js';
|
|
33
|
+
import { logger } from '../utils/logger.js';
|
|
34
|
+
import type { SkillInvocationRow } from './rows.js';
|
|
35
|
+
import type {
|
|
36
|
+
RoutingEventRecord,
|
|
37
|
+
RoutingEventRow,
|
|
38
|
+
} from './routing.js';
|
|
39
|
+
import type { SessionSummary } from './sessions.js';
|
|
40
|
+
import type { Injection } from './injections.js';
|
|
41
|
+
import type { TaskRecord } from './tasks.js';
|
|
42
|
+
|
|
43
|
+
// Re-export row types so existing consumers can import from './sqlite.js'.
|
|
44
|
+
export type {
|
|
45
|
+
EventRow,
|
|
46
|
+
SessionRow,
|
|
47
|
+
InjectionRow,
|
|
48
|
+
TaskRow,
|
|
49
|
+
TokenUsageRow,
|
|
50
|
+
SkillInvocationRow,
|
|
51
|
+
} from './rows.js';
|
|
52
|
+
|
|
53
|
+
// Re-export operation-level types from their new homes (向后兼容)
|
|
54
|
+
export type { SessionSummary } from './sessions.js';
|
|
55
|
+
export type { Injection } from './injections.js';
|
|
56
|
+
export type { TaskRecord, TaskFilter, TaskPage } from './tasks.js';
|
|
57
|
+
export type { RoutingEventRecord, RoutingEventRow } from './routing.js';
|
|
58
|
+
|
|
59
|
+
export class SQLiteStorage extends EventEmitter {
|
|
60
|
+
private base: SQLiteBase;
|
|
61
|
+
private events: EventOperations;
|
|
62
|
+
private sessions: SessionOperations;
|
|
63
|
+
private tasks: TaskOperations;
|
|
64
|
+
private injections: InjectionOperations;
|
|
65
|
+
private routing: RoutingOperations;
|
|
66
|
+
private skills: SkillOperations;
|
|
67
|
+
private tokenUsage: TokenUsageOperations;
|
|
68
|
+
private maintenance: MaintenanceOperations;
|
|
69
|
+
|
|
70
|
+
constructor(dbPath: string) {
|
|
71
|
+
super();
|
|
72
|
+
this.base = new SQLiteBase(dbPath);
|
|
73
|
+
|
|
74
|
+
const db = this.base.getDatabase();
|
|
75
|
+
this.sessions = new SessionOperations(db);
|
|
76
|
+
this.events = new EventOperations(db, this);
|
|
77
|
+
this.tasks = new TaskOperations(db);
|
|
78
|
+
this.injections = new InjectionOperations(db);
|
|
79
|
+
this.routing = new RoutingOperations(db);
|
|
80
|
+
this.skills = new SkillOperations(db);
|
|
81
|
+
this.tokenUsage = new TokenUsageOperations(db);
|
|
82
|
+
this.maintenance = new MaintenanceOperations(db, dbPath);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// ── Database accessors ─────────────────────────────────────────────────
|
|
86
|
+
getDatabase(): Database.Database { return this.base.getDatabase(); }
|
|
87
|
+
getDbPath(): string { return this.base.getDbPath(); }
|
|
88
|
+
|
|
89
|
+
// ── Event operations ────────────────────────────────────────────────────
|
|
90
|
+
writeEvent(event: ForgeEvent): void { this.events.writeEvent(event); }
|
|
91
|
+
queryEvents(filter: Parameters<EventOperations['queryEvents']>[0]): ForgeEvent[] {
|
|
92
|
+
return this.events.queryEvents(filter);
|
|
93
|
+
}
|
|
94
|
+
countEvents(filter?: Parameters<EventOperations['countEvents']>[0]): number { return this.events.countEvents(filter); }
|
|
95
|
+
searchEvents(filter: Parameters<EventOperations['searchEvents']>[0]): ForgeEvent[] {
|
|
96
|
+
return this.events.searchEvents(filter);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// ── Session operations ─────────────────────────────────────────────────
|
|
100
|
+
upsertSession(event: ForgeEvent): void { this.sessions.upsertSession(event); }
|
|
101
|
+
querySessions(filter: Parameters<SessionOperations['querySessions']>[0] = {}): SessionSummary[] {
|
|
102
|
+
return this.sessions.querySessions(filter);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// ── Injection operations ───────────────────────────────────────────────
|
|
106
|
+
writeInjection(injection: Injection): void { this.injections.writeInjection(injection); }
|
|
107
|
+
queryInjections(filter: Parameters<InjectionOperations['queryInjections']>[0] = {}): Injection[] {
|
|
108
|
+
return this.injections.queryInjections(filter);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// ── Task operations ─────────────────────────────────────────────────
|
|
112
|
+
writeTask(task: { id: string; session_id: string; title: string; start_time: string }): void {
|
|
113
|
+
this.tasks.writeTask(task);
|
|
114
|
+
}
|
|
115
|
+
updateTask(taskId: string, updates: { end_time?: string; status?: string; event_count?: number; title?: string }): void {
|
|
116
|
+
this.tasks.updateTask(taskId, updates);
|
|
117
|
+
}
|
|
118
|
+
linkEventToTask(taskId: string, eventId: string): void {
|
|
119
|
+
this.tasks.linkEventToTask(taskId, eventId);
|
|
120
|
+
}
|
|
121
|
+
queryTasks(filter: Parameters<TaskOperations['queryTasks']>[0] = {}): TaskRecord[] {
|
|
122
|
+
return this.tasks.queryTasks(filter);
|
|
123
|
+
}
|
|
124
|
+
queryTasksFiltered(filter: Parameters<TaskOperations['queryTasksFiltered']>[0] = {}): import('./tasks.js').TaskPage {
|
|
125
|
+
return this.tasks.queryTasksFiltered(filter);
|
|
126
|
+
}
|
|
127
|
+
queryTaskProjects(): string[] {
|
|
128
|
+
return this.tasks.queryTaskProjects();
|
|
129
|
+
}
|
|
130
|
+
getTaskEventIds(taskId: string): string[] { return this.tasks.getTaskEventIds(taskId); }
|
|
131
|
+
|
|
132
|
+
// ── Routing events ─────────────────────────────────────────────────────
|
|
133
|
+
writeRoutingEvent(record: RoutingEventRecord): number {
|
|
134
|
+
return this.routing.writeRoutingEvent(record);
|
|
135
|
+
}
|
|
136
|
+
updateRoutingEvent(id: number, patch: Partial<RoutingEventRecord>): void {
|
|
137
|
+
this.routing.updateRoutingEvent(id, patch);
|
|
138
|
+
}
|
|
139
|
+
queryRoutingEvents(filter: Parameters<RoutingOperations['queryRoutingEvents']>[0] = {}): RoutingEventRow[] {
|
|
140
|
+
return this.routing.queryRoutingEvents(filter);
|
|
141
|
+
}
|
|
142
|
+
findPendingRoutingEvents(ageMs: number): RoutingEventRow[] {
|
|
143
|
+
return this.routing.findPendingRoutingEvents(ageMs);
|
|
144
|
+
}
|
|
145
|
+
getRecentRoutingEvent(sessionId: string): { id: number } | null {
|
|
146
|
+
return this.routing.getRecentRoutingEvent(sessionId);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// ── Experiment assignments ─────────────────────────────────────────────
|
|
150
|
+
getExperimentAssignment(sessionId: string, experimentId: string): string | null {
|
|
151
|
+
return this.routing.getExperimentAssignment(sessionId, experimentId);
|
|
152
|
+
}
|
|
153
|
+
setExperimentAssignment(sessionId: string, experimentId: string, groupId: string): void {
|
|
154
|
+
this.routing.setExperimentAssignment(sessionId, experimentId, groupId);
|
|
155
|
+
}
|
|
156
|
+
queryExperimentStats(experimentId: string): ReturnType<RoutingOperations['queryExperimentStats']> {
|
|
157
|
+
return this.routing.queryExperimentStats(experimentId);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// ── Token usage ────────────────────────────────────────────────────────
|
|
161
|
+
recordTokenUsage(params: Parameters<TokenUsageOperations['recordTokenUsage']>[0]): void {
|
|
162
|
+
this.tokenUsage.recordTokenUsage(params);
|
|
163
|
+
}
|
|
164
|
+
getTokenUsageBySession(session_id: string): ReturnType<TokenUsageOperations['getTokenUsageBySession']> {
|
|
165
|
+
return this.tokenUsage.getTokenUsageBySession(session_id);
|
|
166
|
+
}
|
|
167
|
+
listTokenUsage(filter: Parameters<TokenUsageOperations['listTokenUsage']>[0] = {}): ReturnType<TokenUsageOperations['listTokenUsage']> {
|
|
168
|
+
return this.tokenUsage.listTokenUsage(filter);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// ── Skill invocations ──────────────────────────────────────────────────
|
|
172
|
+
writeSkillInvocation(row: Omit<SkillInvocationRow, 'created_at'>): void {
|
|
173
|
+
this.skills.writeSkillInvocation(row);
|
|
174
|
+
}
|
|
175
|
+
querySkillInvocations(filter: Parameters<SkillOperations['querySkillInvocations']>[0] = {}): SkillInvocationRow[] {
|
|
176
|
+
return this.skills.querySkillInvocations(filter);
|
|
177
|
+
}
|
|
178
|
+
queryWorkflowProgress(filter: Parameters<SkillOperations['queryWorkflowProgress']>[0] = {}): ReturnType<SkillOperations['queryWorkflowProgress']> {
|
|
179
|
+
return this.skills.queryWorkflowProgress(filter);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// ── Maintenance ────────────────────────────────────────────────────────
|
|
183
|
+
cleanOldEvents(daysToKeep: number = 30): number { return this.maintenance.cleanOldEvents(daysToKeep); }
|
|
184
|
+
runMaintenance(maxSizeMb: number): void { this.maintenance.runMaintenance(maxSizeMb); }
|
|
185
|
+
vacuum(): void { this.maintenance.vacuum(); }
|
|
186
|
+
|
|
187
|
+
close(): void {
|
|
188
|
+
try {
|
|
189
|
+
this.base.getDatabase().close();
|
|
190
|
+
} catch (err) {
|
|
191
|
+
logger.warn(`Failed to close database: ${err}`);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|