@winspan/claude-forge 8.50.6 → 8.51.1
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.md +7 -7
- package/dist/claudemd/claudemd-generator.d.ts.map +1 -1
- package/dist/claudemd/claudemd-generator.js +27 -237
- package/dist/claudemd/claudemd-generator.js.map +1 -1
- package/dist/claudemd/resume-manager.js +1 -1
- package/dist/claudemd/resume-manager.js.map +1 -1
- package/dist/claudemd/templates/swarm-protocol.md +222 -0
- package/dist/cli/commands/daemon.js +6 -6
- package/dist/cli/commands/daemon.js.map +1 -1
- package/dist/cli/commands/executions.d.ts.map +1 -1
- package/dist/cli/commands/executions.js +4 -3
- package/dist/cli/commands/executions.js.map +1 -1
- package/dist/cli/commands/init.js +2 -2
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/logs.js.map +1 -1
- package/dist/cli/commands/mcp.d.ts.map +1 -1
- package/dist/cli/commands/mcp.js +3 -5
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/menu.d.ts.map +1 -1
- package/dist/cli/commands/menu.js +4 -3
- package/dist/cli/commands/menu.js.map +1 -1
- package/dist/cli/commands/stats.d.ts.map +1 -1
- package/dist/cli/commands/stats.js +2 -3
- package/dist/cli/commands/stats.js.map +1 -1
- package/dist/cli/commands/status.js +2 -2
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/trace.d.ts.map +1 -1
- package/dist/cli/commands/trace.js +11 -23
- package/dist/cli/commands/trace.js.map +1 -1
- package/dist/cli/init/hook-manager.d.ts.map +1 -1
- package/dist/cli/init/hook-manager.js +2 -2
- package/dist/cli/init/hook-manager.js.map +1 -1
- package/dist/core/ai/provider.js +2 -2
- package/dist/core/ai/provider.js.map +1 -1
- package/dist/core/constants.d.ts +12 -1
- package/dist/core/constants.d.ts.map +1 -1
- package/dist/core/constants.js +15 -1
- package/dist/core/constants.js.map +1 -1
- package/dist/core/event-fields.d.ts +16 -0
- package/dist/core/event-fields.d.ts.map +1 -0
- package/dist/core/event-fields.js +19 -0
- package/dist/core/event-fields.js.map +1 -0
- package/dist/core/queue/index.d.ts.map +1 -1
- package/dist/core/queue/index.js +3 -4
- package/dist/core/queue/index.js.map +1 -1
- package/dist/core/storage/base.d.ts +36 -3
- package/dist/core/storage/base.d.ts.map +1 -1
- package/dist/core/storage/base.js +101 -58
- package/dist/core/storage/base.js.map +1 -1
- package/dist/core/storage/events.d.ts +92 -3
- package/dist/core/storage/events.d.ts.map +1 -1
- package/dist/core/storage/events.js +147 -0
- package/dist/core/storage/events.js.map +1 -1
- package/dist/core/storage/routing.d.ts +54 -1
- package/dist/core/storage/routing.d.ts.map +1 -1
- package/dist/core/storage/routing.js +99 -1
- package/dist/core/storage/routing.js.map +1 -1
- package/dist/core/storage/schema.sql +12 -2
- package/dist/core/storage/sessions.d.ts +20 -0
- package/dist/core/storage/sessions.d.ts.map +1 -1
- package/dist/core/storage/sessions.js +59 -0
- package/dist/core/storage/sessions.js.map +1 -1
- package/dist/core/storage/skills.d.ts +23 -0
- package/dist/core/storage/skills.d.ts.map +1 -1
- package/dist/core/storage/skills.js +47 -0
- package/dist/core/storage/skills.js.map +1 -1
- package/dist/core/storage/sqlite.d.ts +35 -2
- package/dist/core/storage/sqlite.d.ts.map +1 -1
- package/dist/core/storage/sqlite.js +93 -4
- package/dist/core/storage/sqlite.js.map +1 -1
- package/dist/core/storage/tasks.d.ts +49 -0
- package/dist/core/storage/tasks.d.ts.map +1 -1
- package/dist/core/storage/tasks.js +143 -1
- package/dist/core/storage/tasks.js.map +1 -1
- package/dist/core/storage/token-usage.d.ts +1 -1
- package/dist/core/storage/token-usage.d.ts.map +1 -1
- package/dist/core/storage/token-usage.js +1 -1
- package/dist/core/storage/token-usage.js.map +1 -1
- package/dist/core/types.d.ts +24 -3
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/utils/error-handler.d.ts.map +1 -1
- package/dist/core/utils/error-handler.js +3 -2
- package/dist/core/utils/error-handler.js.map +1 -1
- package/dist/core/utils/git.d.ts +10 -0
- package/dist/core/utils/git.d.ts.map +1 -0
- package/dist/core/utils/git.js +24 -0
- package/dist/core/utils/git.js.map +1 -0
- package/dist/core/utils/logger.d.ts.map +1 -1
- package/dist/core/utils/logger.js +15 -1
- package/dist/core/utils/logger.js.map +1 -1
- package/dist/core/utils/lru-cache.d.ts +1 -0
- package/dist/core/utils/lru-cache.d.ts.map +1 -1
- package/dist/core/utils/lru-cache.js +3 -0
- package/dist/core/utils/lru-cache.js.map +1 -1
- package/dist/core/utils/token-tracker.js +1 -1
- package/dist/core/utils/token-tracker.js.map +1 -1
- package/dist/daemon/event-parser.d.ts.map +1 -1
- package/dist/daemon/event-parser.js +2 -1
- package/dist/daemon/event-parser.js.map +1 -1
- package/dist/daemon/handlers/history-exporter.js.map +1 -1
- package/dist/daemon/handlers/post-tool-use.d.ts.map +1 -1
- package/dist/daemon/handlers/post-tool-use.js +7 -3
- package/dist/daemon/handlers/post-tool-use.js.map +1 -1
- package/dist/daemon/handlers/stop.d.ts +4 -0
- package/dist/daemon/handlers/stop.d.ts.map +1 -1
- package/dist/daemon/handlers/stop.js +23 -35
- package/dist/daemon/handlers/stop.js.map +1 -1
- package/dist/daemon/handlers/user-prompt.d.ts +3 -3
- package/dist/daemon/handlers/user-prompt.d.ts.map +1 -1
- package/dist/daemon/handlers/user-prompt.js +12 -22
- package/dist/daemon/handlers/user-prompt.js.map +1 -1
- package/dist/daemon/hook-sync.d.ts +17 -0
- package/dist/daemon/hook-sync.d.ts.map +1 -0
- package/dist/daemon/hook-sync.js +74 -0
- package/dist/daemon/hook-sync.js.map +1 -0
- package/dist/daemon/index.d.ts.map +1 -1
- package/dist/daemon/index.js +33 -9
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/lifecycle.js +3 -4
- package/dist/daemon/lifecycle.js.map +1 -1
- package/dist/daemon/server.d.ts +6 -4
- package/dist/daemon/server.d.ts.map +1 -1
- package/dist/daemon/server.js +76 -85
- package/dist/daemon/server.js.map +1 -1
- package/dist/daemon/services/task-segmenter.js +1 -1
- package/dist/daemon/services/task-segmenter.js.map +1 -1
- package/dist/hooks/hook-lib.sh +37 -0
- package/dist/hooks/notification.sh +2 -2
- package/dist/hooks/post-tool-use.sh +2 -2
- package/dist/hooks/pre-tool-use.sh +2 -2
- package/dist/hooks/stop.sh +9 -6
- package/dist/hooks/user-prompt-submit.sh +2 -2
- package/dist/{daemon/services → web/analytics}/anti-pattern-detector.d.ts +3 -4
- package/dist/web/analytics/anti-pattern-detector.d.ts.map +1 -0
- package/dist/{daemon/services → web/analytics}/anti-pattern-detector.js +7 -46
- package/dist/{daemon/services → web/analytics}/anti-pattern-detector.js.map +1 -1
- package/dist/web/analytics/drift-detector.d.ts.map +1 -0
- package/dist/{daemon/services → web/analytics}/drift-detector.js +10 -13
- package/dist/web/analytics/drift-detector.js.map +1 -0
- package/dist/web/analytics/weekly-report.d.ts.map +1 -0
- package/dist/{daemon/services → web/analytics}/weekly-report.js +51 -50
- package/dist/web/analytics/weekly-report.js.map +1 -0
- package/dist/web/auth-middleware.d.ts.map +1 -1
- package/dist/web/auth-middleware.js +1 -2
- package/dist/web/auth-middleware.js.map +1 -1
- package/dist/web/routes/_helpers.d.ts +16 -0
- package/dist/web/routes/_helpers.d.ts.map +1 -0
- package/dist/web/routes/_helpers.js +32 -0
- package/dist/web/routes/_helpers.js.map +1 -0
- package/dist/web/routes/drift.js +1 -1
- package/dist/web/routes/drift.js.map +1 -1
- package/dist/web/routes/insights.js +1 -1
- package/dist/web/routes/insights.js.map +1 -1
- package/dist/web/routes/reports.js +1 -1
- package/dist/web/routes/reports.js.map +1 -1
- package/dist/web/routes/rules.d.ts +3 -0
- package/dist/web/routes/rules.d.ts.map +1 -1
- package/dist/web/routes/rules.js +28 -52
- package/dist/web/routes/rules.js.map +1 -1
- package/dist/web/routes/sessions.d.ts.map +1 -1
- package/dist/web/routes/sessions.js +16 -30
- package/dist/web/routes/sessions.js.map +1 -1
- package/dist/web/routes/skill-stats.d.ts +2 -0
- package/dist/web/routes/skill-stats.d.ts.map +1 -1
- package/dist/web/routes/skill-stats.js +28 -64
- 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 +5 -4
- package/dist/web/routes/skills.js.map +1 -1
- package/dist/web/routes/stats.d.ts +4 -0
- package/dist/web/routes/stats.d.ts.map +1 -1
- package/dist/web/routes/stats.js +19 -21
- package/dist/web/routes/stats.js.map +1 -1
- package/dist/web/routes/tasks.d.ts.map +1 -1
- package/dist/web/routes/tasks.js +17 -42
- package/dist/web/routes/tasks.js.map +1 -1
- package/dist/web/routes/trace.d.ts.map +1 -1
- package/dist/web/routes/trace.js +7 -17
- package/dist/web/routes/trace.js.map +1 -1
- package/dist/web/routes/types.d.ts.map +1 -1
- package/dist/web/routes/types.js +4 -3
- package/dist/web/routes/types.js.map +1 -1
- package/dist/web/static/assets/{AIConfig-BQCAQE9D.js → AIConfig-CdDWzJyO.js} +2 -2
- package/dist/web/static/assets/{AIConfig-BQCAQE9D.js.map → AIConfig-CdDWzJyO.js.map} +1 -1
- package/dist/web/static/assets/{Dashboard-D7Bo6Kan.js → Dashboard-CoEmmIDt.js} +2 -2
- package/dist/web/static/assets/{Dashboard-D7Bo6Kan.js.map → Dashboard-CoEmmIDt.js.map} +1 -1
- package/dist/web/static/assets/{Drawer-BeHRQxUS.js → Drawer-DdRTzlLB.js} +2 -2
- package/dist/web/static/assets/{Drawer-BeHRQxUS.js.map → Drawer-DdRTzlLB.js.map} +1 -1
- package/dist/web/static/assets/{Events-K_tCY2ti.js → Events-DrIq1SUS.js} +2 -2
- package/dist/web/static/assets/{Events-K_tCY2ti.js.map → Events-DrIq1SUS.js.map} +1 -1
- package/dist/web/static/assets/{Reports-BJCmBnc_.js → Reports-DFBM3MDK.js} +2 -2
- package/dist/web/static/assets/{Reports-BJCmBnc_.js.map → Reports-DFBM3MDK.js.map} +1 -1
- package/dist/web/static/assets/{SearchInput-BX2KhMkw.js → SearchInput-qCj_jAcf.js} +2 -2
- package/dist/web/static/assets/{SearchInput-BX2KhMkw.js.map → SearchInput-qCj_jAcf.js.map} +1 -1
- package/dist/web/static/assets/{SessionDetail-Bkr-kC7V.js → SessionDetail-CCzwdoT7.js} +2 -2
- package/dist/web/static/assets/{SessionDetail-Bkr-kC7V.js.map → SessionDetail-CCzwdoT7.js.map} +1 -1
- package/dist/web/static/assets/{Sessions-Chx9OCLH.js → Sessions-FfLYkAw9.js} +2 -2
- package/dist/web/static/assets/{Sessions-Chx9OCLH.js.map → Sessions-FfLYkAw9.js.map} +1 -1
- package/dist/web/static/assets/{Skills-O0GT1i7m.js → Skills-C8Gvs3Qa.js} +2 -2
- package/dist/web/static/assets/{Skills-O0GT1i7m.js.map → Skills-C8Gvs3Qa.js.map} +1 -1
- package/dist/web/static/assets/TaskDetail-BS8pYhaR.js +2 -0
- package/dist/web/static/assets/TaskDetail-BS8pYhaR.js.map +1 -0
- package/dist/web/static/assets/Tasks-CyuhizG8.js +2 -0
- package/dist/web/static/assets/Tasks-CyuhizG8.js.map +1 -0
- package/dist/web/static/assets/index-CBX47X8l.js +3 -0
- package/dist/web/static/assets/{index-DxIbmNmr.js.map → index-CBX47X8l.js.map} +1 -1
- package/dist/web/static/assets/index-DjIoMdoR.css +1 -0
- package/dist/web/static/assets/{lucide-fJlPI3H7.js → lucide-Bs_edTLa.js} +44 -39
- package/dist/web/static/assets/lucide-Bs_edTLa.js.map +1 -0
- package/dist/web/static/assets/react-router-r79dBVy4.js +20 -0
- package/dist/web/static/assets/{react-router-I-HqunH7.js.map → react-router-r79dBVy4.js.map} +1 -1
- package/dist/web/static/assets/task-title-BhOcemuR.js +2 -0
- package/dist/web/static/assets/task-title-BhOcemuR.js.map +1 -0
- package/dist/web/static/index.html +4 -4
- package/docs/design/h1-storage-aggregation-spec-20260518-1121.md +299 -0
- package/docs/design/h2-getdatabase-encapsulation-spec-20260518-1450.md +191 -0
- package/docs/design/h3-fallback-removal-spec-20260518-1245.md +76 -0
- package/docs/design/h4-index-dedup-spec-20260518-1230.md +109 -0
- package/docs/design/h6-services-migration-spec-20260518-1355.md +82 -0
- package/docs/design/l1-swarm-protocol-extract-spec-20260518-1605.md +106 -0
- package/docs/design/m10-forge-paths-spec-20260518-1320.md +121 -0
- package/docs/design/m2-m3-tool-input-spec-20260518-1425.md +131 -0
- package/docs/design/m7-routing-event-association-spec-20260518-1545.md +103 -0
- package/docs/design/project-path-gitroot-spec-20260518-1715.md +134 -0
- package/docs/design/task-active-gc-spec-20260518-1745.md +146 -0
- package/docs/implementation/h1-storage-aggregation-changelog-20260518-1121.md +82 -0
- package/docs/implementation/h2-final-changelog-20260518-1530.md +61 -0
- package/docs/implementation/h2-phase1-safety-net-changelog-20260518-1450.md +70 -0
- package/docs/implementation/h2-phase2-operations-changelog-20260518-1450.md +120 -0
- package/docs/implementation/h2-phase3-callsites-changelog-20260518-1450.md +71 -0
- package/docs/implementation/h3-fallback-removal-changelog-20260518-1245.md +71 -0
- package/docs/implementation/h4-index-dedup-changelog-20260518-1230.md +60 -0
- package/docs/implementation/h6-services-migration-changelog-20260518-1355.md +46 -0
- package/docs/implementation/h7-m9-defaults-changelog-20260518-1300.md +46 -0
- package/docs/implementation/l1-swarm-protocol-extract-changelog-20260518-1605.md +45 -0
- package/docs/implementation/l3-l4-daemon-perf-changelog-20260518-1410.md +63 -0
- package/docs/implementation/l6-l8-final-cleanup-changelog-20260518-1640.md +38 -0
- package/docs/implementation/m1-m4-m5-l7-cleanup-changelog-20260518-1310.md +58 -0
- package/docs/implementation/m10-forge-paths-changelog-20260518-1320.md +60 -0
- package/docs/implementation/m2-m3-tool-input-changelog-20260518-1425.md +43 -0
- package/docs/implementation/m6-m8-naming-shutdown-changelog-20260518-1340.md +56 -0
- package/docs/implementation/m7-routing-association-changelog-20260518-1545.md +69 -0
- package/docs/implementation/project-path-gitroot-changelog-20260518-1715.md +63 -0
- package/docs/implementation/task-active-gc-changelog-20260518-1745.md +35 -0
- package/docs/implementation/task-title-summary-changelog-20260518-1130.md +39 -0
- package/docs/implementation/tasks-detail-back-loses-filters-changelog-20260518-1100.md +22 -0
- package/docs/implementation/tasks-page-white-screen-hotfix-changelog-20260518-1015.md +56 -0
- package/docs/reviews/task-title-summary.md +92 -0
- package/docs/reviews/tasks-detail-back-loses-filters.md +58 -0
- package/docs/reviews/tasks-page-white-screen-hotfix.md +126 -0
- package/package.json +2 -2
- package/src/claudemd/claudemd-generator.ts +29 -238
- package/src/claudemd/resume-manager.ts +1 -1
- package/src/claudemd/templates/swarm-protocol.md +222 -0
- package/src/cli/commands/daemon.ts +6 -6
- package/src/cli/commands/executions.ts +4 -3
- package/src/cli/commands/init.ts +2 -2
- package/src/cli/commands/logs.ts +1 -1
- package/src/cli/commands/mcp.ts +3 -5
- package/src/cli/commands/menu.ts +4 -3
- package/src/cli/commands/stats.ts +2 -3
- package/src/cli/commands/status.ts +2 -2
- package/src/cli/commands/trace.ts +10 -26
- package/src/cli/init/hook-manager.ts +2 -2
- package/src/core/ai/provider.ts +2 -2
- package/src/core/constants.ts +18 -1
- package/src/core/event-fields.ts +32 -0
- package/src/core/queue/index.ts +3 -4
- package/src/core/storage/base.ts +132 -56
- package/src/core/storage/events.ts +183 -4
- package/src/core/storage/routing.ts +129 -1
- package/src/core/storage/schema.sql +12 -2
- package/src/core/storage/sessions.ts +64 -0
- package/src/core/storage/skills.ts +69 -0
- package/src/core/storage/sqlite.ts +103 -4
- package/src/core/storage/tasks.ts +149 -1
- package/src/core/storage/token-usage.ts +1 -1
- package/src/core/types.ts +30 -3
- package/src/core/utils/error-handler.ts +3 -2
- package/src/core/utils/git.ts +23 -0
- package/src/core/utils/logger.ts +16 -1
- package/src/core/utils/lru-cache.ts +4 -0
- package/src/core/utils/token-tracker.ts +1 -1
- package/src/daemon/event-parser.ts +4 -3
- package/src/daemon/handlers/history-exporter.ts +1 -1
- package/src/daemon/handlers/post-tool-use.ts +7 -3
- package/src/daemon/handlers/stop.ts +32 -39
- package/src/daemon/handlers/user-prompt.ts +12 -22
- package/src/daemon/hook-sync.ts +91 -0
- package/src/daemon/index.ts +34 -10
- package/src/daemon/lifecycle.ts +3 -3
- package/src/daemon/server.ts +76 -89
- package/src/daemon/services/task-segmenter.ts +1 -1
- package/src/hooks/hook-lib.sh +37 -0
- package/src/hooks/notification.sh +2 -2
- package/src/hooks/post-tool-use.sh +2 -2
- package/src/hooks/pre-tool-use.sh +2 -2
- package/src/hooks/stop.sh +9 -6
- package/src/hooks/user-prompt-submit.sh +2 -2
- package/src/{daemon/services → web/analytics}/anti-pattern-detector.ts +9 -54
- package/src/{daemon/services → web/analytics}/drift-detector.ts +10 -23
- package/src/{daemon/services → web/analytics}/weekly-report.ts +52 -75
- package/src/web/auth-middleware.ts +1 -2
- package/src/web/routes/_helpers.ts +34 -0
- package/src/web/routes/drift.ts +1 -1
- package/src/web/routes/insights.ts +1 -1
- package/src/web/routes/reports.ts +1 -1
- package/src/web/routes/rules.ts +31 -56
- package/src/web/routes/sessions.ts +18 -30
- package/src/web/routes/skill-stats.ts +29 -69
- package/src/web/routes/skills.ts +5 -4
- package/src/web/routes/stats.ts +19 -29
- package/src/web/routes/tasks.ts +17 -42
- package/src/web/routes/trace.ts +7 -19
- package/src/web/routes/types.ts +4 -3
- package/tests/integration/claudemd-generator.test.ts +90 -0
- package/tests/integration/web-analytics.integration.test.ts +133 -0
- package/tests/integration/web-stats.integration.test.ts +135 -0
- package/tests/integration/web-trace.integration.test.ts +175 -0
- package/tests/unit/core/forge-paths.test.ts +99 -0
- package/tests/unit/daemon/hook-sync.test.ts +71 -0
- package/tests/unit/daemon/post-tool-use.test.ts +121 -0
- package/tests/unit/daemon/stop-handler-behavior-summary.test.ts +202 -0
- package/tests/unit/daemon/task-segmenter-recover.test.ts +84 -0
- package/tests/unit/event-fields.test.ts +88 -0
- package/tests/unit/event-parser.test.ts +55 -0
- package/tests/unit/hooks/resolve-project-path.test.ts +122 -0
- package/tests/unit/socket-server.test.ts +183 -0
- package/tests/unit/storage/event-operations-aggregates.test.ts +342 -0
- package/tests/unit/storage/migration-idempotent.test.ts +304 -0
- package/tests/unit/storage/routing-aggregates.test.ts +276 -0
- package/tests/unit/storage/routing.test.ts +117 -0
- package/tests/unit/storage/schema-missing.test.ts +81 -0
- package/tests/unit/storage/session-operations-aggregates.test.ts +120 -0
- package/tests/unit/storage/skill-operations-counts.test.ts +106 -0
- package/tests/unit/storage/skills-aggregates.test.ts +104 -0
- package/tests/unit/storage/sqlite-refactor-harness.test.ts +3 -3
- package/tests/unit/storage/task-operations-counts.test.ts +46 -0
- package/tests/unit/storage/tasks-getById.test.ts +343 -0
- package/tests/unit/storage/tasks-stale-gc.test.ts +86 -0
- package/tests/unit/token-usage.test.ts +6 -6
- package/tests/unit/web/navigation-back-contract.test.ts +134 -0
- package/tests/unit/web/routes-rules.test.ts +182 -0
- package/tests/unit/web/routes-tasks.test.ts +34 -0
- package/tests/unit/web/task-title-contract.test.ts +210 -0
- package/tests/unit/web/tasks-component-contract.test.ts +179 -0
- package/vitest.config.ts +1 -1
- package/web/src/pages/TaskDetail.tsx +9 -5
- package/web/src/pages/Tasks.tsx +315 -50
- package/web/src/utils/navigation.ts +25 -0
- package/web/src/utils/task-title.ts +49 -0
- package/dist/daemon/services/anti-pattern-detector.d.ts.map +0 -1
- package/dist/daemon/services/drift-detector.d.ts.map +0 -1
- package/dist/daemon/services/drift-detector.js.map +0 -1
- package/dist/daemon/services/weekly-report.d.ts.map +0 -1
- package/dist/daemon/services/weekly-report.js.map +0 -1
- package/dist/web/static/assets/TaskDetail-5SR8zGzv.js +0 -2
- package/dist/web/static/assets/TaskDetail-5SR8zGzv.js.map +0 -1
- package/dist/web/static/assets/Tasks-DCgDqvOZ.js +0 -2
- package/dist/web/static/assets/Tasks-DCgDqvOZ.js.map +0 -1
- package/dist/web/static/assets/index-D8AKj26b.css +0 -1
- package/dist/web/static/assets/index-DxIbmNmr.js +0 -3
- package/dist/web/static/assets/lucide-fJlPI3H7.js.map +0 -1
- package/dist/web/static/assets/react-router-I-HqunH7.js +0 -20
- /package/dist/{daemon/services → web/analytics}/drift-detector.d.ts +0 -0
- /package/dist/{daemon/services → web/analytics}/weekly-report.d.ts +0 -0
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* 拆分自 sqlite.ts。仅负责:
|
|
5
5
|
* - 打开数据库连接 + 配置 PRAGMA
|
|
6
|
-
* - 加载 schema.sql
|
|
6
|
+
* - 加载 schema.sql(缺失则抛错)
|
|
7
7
|
* - 增量迁移(hasColumn / addColumnIfMissing)
|
|
8
8
|
* - 一次性 sessions 回填
|
|
9
9
|
*
|
|
@@ -35,31 +35,39 @@ export class SQLiteBase {
|
|
|
35
35
|
this.db.pragma('temp_store = MEMORY'); // Store temp tables in memory
|
|
36
36
|
this.db.pragma('mmap_size = 30000000000'); // 30GB memory-mapped I/O
|
|
37
37
|
this.db.pragma('page_size = 4096'); // Optimal page size for most systems
|
|
38
|
+
// Order matters:
|
|
39
|
+
// 1) runColumnMigrations() ALTERs missing columns on PRE-EXISTING tables.
|
|
40
|
+
// Must run BEFORE initSchema() because schema.sql contains indexes that
|
|
41
|
+
// reference new columns (e.g. idx_skill_invocations_workflow). On a
|
|
42
|
+
// legacy DB those CREATE INDEX statements would otherwise fail because
|
|
43
|
+
// CREATE TABLE IF NOT EXISTS skips the old table and never adds the column.
|
|
44
|
+
// 2) initSchema() applies schema.sql (idempotent CREATE TABLE/INDEX).
|
|
45
|
+
// 3) runIndexMigrations() patches indexes that may still be missing on
|
|
46
|
+
// legacy DBs (defensive; schema.sql already creates them on new DBs).
|
|
47
|
+
this.runColumnMigrations();
|
|
38
48
|
this.initSchema();
|
|
39
|
-
this.
|
|
49
|
+
this.runIndexMigrations();
|
|
50
|
+
this.runPostMigrations();
|
|
40
51
|
}
|
|
41
52
|
initSchema() {
|
|
42
53
|
const thisDir = dirname(fileURLToPath(import.meta.url));
|
|
43
54
|
const schemaPath = join(thisDir, 'schema.sql');
|
|
44
|
-
if (existsSync(schemaPath)) {
|
|
45
|
-
|
|
46
|
-
|
|
55
|
+
if (!existsSync(schemaPath)) {
|
|
56
|
+
throw new Error(`[SQLiteStorage] schema.sql not found at ${schemaPath}. ` +
|
|
57
|
+
`This indicates a broken build/install. Run \`npm run build\` or reinstall the package.`);
|
|
47
58
|
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
CREATE INDEX IF NOT EXISTS idx_events_timestamp ON events(timestamp DESC);
|
|
61
|
-
CREATE INDEX IF NOT EXISTS idx_events_distilled ON events(distilled);
|
|
62
|
-
`);
|
|
59
|
+
const schema = readFileSync(schemaPath, 'utf-8');
|
|
60
|
+
this.db.exec(schema);
|
|
61
|
+
}
|
|
62
|
+
hasTable(name) {
|
|
63
|
+
try {
|
|
64
|
+
const row = this.db
|
|
65
|
+
.prepare(`SELECT name FROM sqlite_master WHERE type='table' AND name = ?`)
|
|
66
|
+
.get(name);
|
|
67
|
+
return !!row;
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return false;
|
|
63
71
|
}
|
|
64
72
|
}
|
|
65
73
|
hasColumn(table, column) {
|
|
@@ -72,6 +80,11 @@ export class SQLiteBase {
|
|
|
72
80
|
}
|
|
73
81
|
}
|
|
74
82
|
addColumnIfMissing(table, column, definition) {
|
|
83
|
+
// Skip silently if the table doesn't exist yet — new DBs hit this path on
|
|
84
|
+
// first boot (initSchema runs after column migrations); the column will be
|
|
85
|
+
// created by schema.sql's CREATE TABLE.
|
|
86
|
+
if (!this.hasTable(table))
|
|
87
|
+
return;
|
|
75
88
|
if (!this.hasColumn(table, column)) {
|
|
76
89
|
try {
|
|
77
90
|
this.db.exec(`ALTER TABLE ${table} ADD COLUMN ${column} ${definition}`);
|
|
@@ -82,10 +95,39 @@ export class SQLiteBase {
|
|
|
82
95
|
}
|
|
83
96
|
}
|
|
84
97
|
}
|
|
98
|
+
hasIndex(name) {
|
|
99
|
+
try {
|
|
100
|
+
const row = this.db
|
|
101
|
+
.prepare(`SELECT name FROM sqlite_master WHERE type='index' AND name = ?`)
|
|
102
|
+
.get(name);
|
|
103
|
+
return !!row;
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
85
109
|
/**
|
|
86
|
-
*
|
|
110
|
+
* Create an index only if it's missing. The CREATE INDEX IF NOT EXISTS already
|
|
111
|
+
* makes this safe; the hasIndex guard makes it explicit which indexes are still
|
|
112
|
+
* being patched by migrations (vs. provided by schema.sql).
|
|
87
113
|
*/
|
|
88
|
-
|
|
114
|
+
createIndexIfMissing(name, ddl) {
|
|
115
|
+
if (this.hasIndex(name))
|
|
116
|
+
return;
|
|
117
|
+
try {
|
|
118
|
+
this.db.exec(ddl);
|
|
119
|
+
logger.debug(`[SQLiteStorage] migration created ${name}`);
|
|
120
|
+
}
|
|
121
|
+
catch (err) {
|
|
122
|
+
logger.warn(`[SQLiteStorage] migration: create ${name} failed: ${err}`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Column migrations run BEFORE initSchema() so legacy tables get missing
|
|
127
|
+
* columns (e.g. skill_invocations.workflow) before schema.sql's CREATE INDEX
|
|
128
|
+
* statements try to reference them.
|
|
129
|
+
*/
|
|
130
|
+
runColumnMigrations() {
|
|
89
131
|
this.addColumnIfMissing('sessions', 'first_prompt', 'TEXT');
|
|
90
132
|
this.addColumnIfMissing('routing_events', 'skill_confidence', 'REAL');
|
|
91
133
|
this.addColumnIfMissing('routing_events', 'skill_source', 'TEXT');
|
|
@@ -93,42 +135,34 @@ export class SQLiteBase {
|
|
|
93
135
|
this.addColumnIfMissing('skill_invocations', 'phase', 'TEXT');
|
|
94
136
|
this.addColumnIfMissing('skill_invocations', 'feature_slug', 'TEXT');
|
|
95
137
|
this.addColumnIfMissing('skill_invocations', 'artifact_path', 'TEXT');
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
CREATE INDEX IF NOT EXISTS
|
|
113
|
-
CREATE INDEX IF NOT EXISTS
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
CREATE INDEX IF NOT EXISTS idx_events_session_hook ON events(session_id, hook_type, timestamp DESC);
|
|
125
|
-
CREATE INDEX IF NOT EXISTS idx_injections_session_handler ON injections(session_id, source_handler);
|
|
126
|
-
`);
|
|
127
|
-
logger.info('[SQLiteStorage] Phase 1 performance indexes created');
|
|
128
|
-
}
|
|
129
|
-
catch (err) {
|
|
130
|
-
logger.warn(`[SQLiteStorage] migration: create Phase 1 performance indexes failed: ${err}`);
|
|
131
|
-
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Index migrations run AFTER initSchema(). Each call is guarded by hasIndex
|
|
141
|
+
* so:
|
|
142
|
+
* - new DBs: schema.sql already created the index → skipped
|
|
143
|
+
* - legacy DBs: schema.sql skipped (existing index) for indexes it tries to
|
|
144
|
+
* create or covered above; remaining migration-only / pre-H1 indexes are
|
|
145
|
+
* patched here.
|
|
146
|
+
* CREATE INDEX IF NOT EXISTS is preserved as a second line of defense.
|
|
147
|
+
*/
|
|
148
|
+
runIndexMigrations() {
|
|
149
|
+
this.createIndexIfMissing('idx_skill_invocations_workflow', `CREATE INDEX IF NOT EXISTS idx_skill_invocations_workflow ON skill_invocations(workflow, phase)`);
|
|
150
|
+
this.createIndexIfMissing('idx_skill_invocations_feature', `CREATE INDEX IF NOT EXISTS idx_skill_invocations_feature ON skill_invocations(feature_slug)`);
|
|
151
|
+
this.createIndexIfMissing('idx_sessions_start_time', `CREATE INDEX IF NOT EXISTS idx_sessions_start_time ON sessions(start_time DESC)`);
|
|
152
|
+
// Composite indexes for high-frequency session-scoped queries
|
|
153
|
+
this.createIndexIfMissing('idx_events_session_ts', `CREATE INDEX IF NOT EXISTS idx_events_session_ts ON events(session_id, timestamp DESC)`);
|
|
154
|
+
this.createIndexIfMissing('idx_routing_events_session_ts', `CREATE INDEX IF NOT EXISTS idx_routing_events_session_ts ON routing_events(session_id, ts DESC)`);
|
|
155
|
+
this.createIndexIfMissing('idx_skill_invocations_session_ts', `CREATE INDEX IF NOT EXISTS idx_skill_invocations_session_ts ON skill_invocations(session_id, timestamp DESC)`);
|
|
156
|
+
// Phase 1 Refactor: Additional performance indexes
|
|
157
|
+
this.createIndexIfMissing('idx_routing_events_obeyed_ts', `CREATE INDEX IF NOT EXISTS idx_routing_events_obeyed_ts ON routing_events(obeyed, ts DESC)`);
|
|
158
|
+
this.createIndexIfMissing('idx_events_session_hook', `CREATE INDEX IF NOT EXISTS idx_events_session_hook ON events(session_id, hook_type, timestamp DESC)`);
|
|
159
|
+
this.createIndexIfMissing('idx_injections_session_handler', `CREATE INDEX IF NOT EXISTS idx_injections_session_handler ON injections(session_id, source_handler)`);
|
|
160
|
+
this.createIndexIfMissing('idx_routing_events_type_ts', `CREATE INDEX IF NOT EXISTS idx_routing_events_type_ts ON routing_events(routed_to_type, ts DESC)`);
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* One-shot data migrations + deprecated table cleanup.
|
|
164
|
+
*/
|
|
165
|
+
runPostMigrations() {
|
|
132
166
|
this.backfillSessionsIfNeeded();
|
|
133
167
|
const deprecatedTables = [
|
|
134
168
|
'quality_issues', 'distill_results', 'v2_decisions',
|
|
@@ -196,6 +230,15 @@ export class SQLiteBase {
|
|
|
196
230
|
logger.warn(`[SQLiteStorage] backfillSessionsIfNeeded failed: ${err}`);
|
|
197
231
|
}
|
|
198
232
|
}
|
|
233
|
+
/**
|
|
234
|
+
* @internal 仅供 *Operations 子类、migration、初始化使用。
|
|
235
|
+
*
|
|
236
|
+
* Routes / Handlers / Analytics 禁止直接调用。需要查询请走 SQLiteStorage facade
|
|
237
|
+
* 上的具名方法(query* / get* / list* / count* / aggregate*);若 facade 缺方法,
|
|
238
|
+
* 应在对应 Operations 类下沉 SQL 并补 facade 转发,而不是 db.prepare() 直写。
|
|
239
|
+
*
|
|
240
|
+
* 历史:H2 (2026-05) 已收敛 27 处越权 SQL,新增越权请走同样的下沉模式。
|
|
241
|
+
*/
|
|
199
242
|
getDatabase() {
|
|
200
243
|
return this.db;
|
|
201
244
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/core/storage/base.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,OAAO,UAAU;IACX,EAAE,CAAoB;IACtB,MAAM,CAAS;IAEzB,YAAY,MAAc;QACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QAErB,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QAC5B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtC,CAAC;QAED,IAAI,CAAC,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;QAE/B,+CAA+C;QAC/C,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACrC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC;QACvC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,2BAA2B,CAAC,CAAC,CAAC,4CAA4C;QACzF,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,gBAAgB,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,kBAAkB,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC;QAE1D,uCAAuC;QACvC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC,8BAA8B;QACrE,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAC,CAAC,yBAAyB;QACpE,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC,qCAAqC;QAEzE,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/core/storage/base.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,9 +14,6 @@ import type { ForgeEvent } from '../types.js';
|
|
|
14
14
|
interface UpsertCapableEmitter extends EventEmitter {
|
|
15
15
|
upsertSession(event: ForgeEvent): void;
|
|
16
16
|
}
|
|
17
|
-
interface UpsertCapableEmitter extends EventEmitter {
|
|
18
|
-
upsertSession(event: ForgeEvent): void;
|
|
19
|
-
}
|
|
20
17
|
export declare class EventOperations {
|
|
21
18
|
private db;
|
|
22
19
|
private emitter;
|
|
@@ -46,6 +43,98 @@ export declare class EventOperations {
|
|
|
46
43
|
limit?: number;
|
|
47
44
|
offset?: number;
|
|
48
45
|
}): ForgeEvent[];
|
|
46
|
+
/** Total event row count. */
|
|
47
|
+
countAllEvents(): number;
|
|
48
|
+
/**
|
|
49
|
+
* Tool usage distribution (tool_name → count).
|
|
50
|
+
*
|
|
51
|
+
* - `since`: ISO timestamp, inclusive lower bound on `timestamp`. Omit for all-time.
|
|
52
|
+
* - `hook_type`: filter on hook_type (e.g. 'PreToolUse') — used by weekly-report.
|
|
53
|
+
* - `limit`: max distinct tools returned (default 100).
|
|
54
|
+
*/
|
|
55
|
+
aggregateToolUsage(opts?: {
|
|
56
|
+
since?: string;
|
|
57
|
+
limit?: number;
|
|
58
|
+
hook_type?: 'PreToolUse' | 'PostToolUse';
|
|
59
|
+
}): Array<{
|
|
60
|
+
tool_name: string;
|
|
61
|
+
count: number;
|
|
62
|
+
}>;
|
|
63
|
+
/** Per-day event counts (date(timestamp) → count) within [since, until). */
|
|
64
|
+
aggregateDailyEventCounts(opts: {
|
|
65
|
+
since: string;
|
|
66
|
+
until?: string;
|
|
67
|
+
}): Array<{
|
|
68
|
+
date: string;
|
|
69
|
+
count: number;
|
|
70
|
+
}>;
|
|
71
|
+
/** Hook type distribution for a single session. */
|
|
72
|
+
aggregateHookTypeBySession(session_id: string): Array<{
|
|
73
|
+
hook_type: string;
|
|
74
|
+
count: number;
|
|
75
|
+
}>;
|
|
76
|
+
/** Agent/Task subagent_type distribution for a single session (json_extract from tool_input). */
|
|
77
|
+
aggregateAgentTypeBySession(session_id: string): Array<{
|
|
78
|
+
agent_type: string | null;
|
|
79
|
+
count: number;
|
|
80
|
+
}>;
|
|
81
|
+
/** Tool usage distribution for a single session (non-null tool_name only). */
|
|
82
|
+
aggregateToolUsageBySession(session_id: string): Array<{
|
|
83
|
+
tool_name: string;
|
|
84
|
+
count: number;
|
|
85
|
+
}>;
|
|
86
|
+
/** Count of distinct active days (date(timestamp)) in [since, until). */
|
|
87
|
+
countActiveDays(opts: {
|
|
88
|
+
since: string;
|
|
89
|
+
until?: string;
|
|
90
|
+
}): number;
|
|
91
|
+
/** Composite overview within [since, until): event count + distinct session count + distinct day count. */
|
|
92
|
+
aggregateOverviewByRange(opts: {
|
|
93
|
+
since: string;
|
|
94
|
+
until: string;
|
|
95
|
+
}): {
|
|
96
|
+
event_count: number;
|
|
97
|
+
session_count: number;
|
|
98
|
+
day_count: number;
|
|
99
|
+
};
|
|
100
|
+
/** Distinct, non-empty project_path values within [since, until). */
|
|
101
|
+
queryDistinctProjects(opts: {
|
|
102
|
+
since: string;
|
|
103
|
+
until: string;
|
|
104
|
+
}): string[];
|
|
105
|
+
/**
|
|
106
|
+
* PostToolUse failure rate within [since, until).
|
|
107
|
+
*
|
|
108
|
+
* Failure detection uses three LIKE branches on tool_output (preserved from
|
|
109
|
+
* weekly-report.ts original SQL):
|
|
110
|
+
* - '%"error"%'
|
|
111
|
+
* - '%"is_error":true%'
|
|
112
|
+
* - '%"isError":true%'
|
|
113
|
+
*/
|
|
114
|
+
aggregateToolFailureRate(opts: {
|
|
115
|
+
since: string;
|
|
116
|
+
until: string;
|
|
117
|
+
}): {
|
|
118
|
+
post_total: number;
|
|
119
|
+
failed: number;
|
|
120
|
+
};
|
|
121
|
+
/**
|
|
122
|
+
* Raw tool_input JSON strings for file-edit tools within [since, until).
|
|
123
|
+
* Caller is responsible for JSON.parse / file_path extraction.
|
|
124
|
+
* Internal IN-list expansion of `tool_names`.
|
|
125
|
+
*/
|
|
126
|
+
queryFileEditInputs(opts: {
|
|
127
|
+
since: string;
|
|
128
|
+
until: string;
|
|
129
|
+
tool_names: string[];
|
|
130
|
+
}): Array<{
|
|
131
|
+
tool_input: string;
|
|
132
|
+
}>;
|
|
133
|
+
/** Full events in [since, until?), ascending by timestamp (used by anti-pattern-detector). */
|
|
134
|
+
queryEventsByTimeRange(opts: {
|
|
135
|
+
since: string;
|
|
136
|
+
until?: string;
|
|
137
|
+
}): ForgeEvent[];
|
|
49
138
|
rowToEvent(row: Record<string, unknown>): ForgeEvent;
|
|
50
139
|
}
|
|
51
140
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../src/core/storage/events.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../src/core/storage/events.ts"],"names":[],"mappings":"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"}
|
|
@@ -163,6 +163,153 @@ export class EventOperations {
|
|
|
163
163
|
const rows = this.db.prepare(sql).all(...params);
|
|
164
164
|
return rows.map((row) => this.rowToEvent(row));
|
|
165
165
|
}
|
|
166
|
+
// ── H2: 聚合 / 计数方法(消除 routes / handlers / analytics 越权 SQL)─────
|
|
167
|
+
/** Total event row count. */
|
|
168
|
+
countAllEvents() {
|
|
169
|
+
const row = this.db.prepare('SELECT COUNT(*) as cnt FROM events').get();
|
|
170
|
+
return row.cnt;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Tool usage distribution (tool_name → count).
|
|
174
|
+
*
|
|
175
|
+
* - `since`: ISO timestamp, inclusive lower bound on `timestamp`. Omit for all-time.
|
|
176
|
+
* - `hook_type`: filter on hook_type (e.g. 'PreToolUse') — used by weekly-report.
|
|
177
|
+
* - `limit`: max distinct tools returned (default 100).
|
|
178
|
+
*/
|
|
179
|
+
aggregateToolUsage(opts = {}) {
|
|
180
|
+
const conditions = [`tool_name IS NOT NULL`, `tool_name != ''`];
|
|
181
|
+
const params = [];
|
|
182
|
+
if (opts.since !== undefined) {
|
|
183
|
+
conditions.push('timestamp >= ?');
|
|
184
|
+
params.push(opts.since);
|
|
185
|
+
}
|
|
186
|
+
if (opts.hook_type) {
|
|
187
|
+
conditions.push('hook_type = ?');
|
|
188
|
+
params.push(opts.hook_type);
|
|
189
|
+
}
|
|
190
|
+
const limit = opts.limit ?? 100;
|
|
191
|
+
const sql = `SELECT tool_name, COUNT(*) as count FROM events
|
|
192
|
+
WHERE ${conditions.join(' AND ')}
|
|
193
|
+
GROUP BY tool_name ORDER BY count DESC LIMIT ?`;
|
|
194
|
+
params.push(limit);
|
|
195
|
+
return this.db.prepare(sql).all(...params);
|
|
196
|
+
}
|
|
197
|
+
/** Per-day event counts (date(timestamp) → count) within [since, until). */
|
|
198
|
+
aggregateDailyEventCounts(opts) {
|
|
199
|
+
const conditions = ['timestamp >= ?'];
|
|
200
|
+
const params = [opts.since];
|
|
201
|
+
if (opts.until !== undefined) {
|
|
202
|
+
conditions.push('timestamp < ?');
|
|
203
|
+
params.push(opts.until);
|
|
204
|
+
}
|
|
205
|
+
const sql = `SELECT date(timestamp) as date, COUNT(*) as count FROM events
|
|
206
|
+
WHERE ${conditions.join(' AND ')}
|
|
207
|
+
GROUP BY date ORDER BY date`;
|
|
208
|
+
return this.db.prepare(sql).all(...params);
|
|
209
|
+
}
|
|
210
|
+
/** Hook type distribution for a single session. */
|
|
211
|
+
aggregateHookTypeBySession(session_id) {
|
|
212
|
+
return this.db.prepare(`SELECT hook_type, COUNT(*) as count FROM events
|
|
213
|
+
WHERE session_id = ? GROUP BY hook_type`).all(session_id);
|
|
214
|
+
}
|
|
215
|
+
/** Agent/Task subagent_type distribution for a single session (json_extract from tool_input). */
|
|
216
|
+
aggregateAgentTypeBySession(session_id) {
|
|
217
|
+
return this.db.prepare(`SELECT json_extract(tool_input, '$.subagent_type') as agent_type, COUNT(*) as count
|
|
218
|
+
FROM events
|
|
219
|
+
WHERE session_id = ? AND tool_name IN ('Agent', 'Task') AND tool_input IS NOT NULL
|
|
220
|
+
GROUP BY agent_type`).all(session_id);
|
|
221
|
+
}
|
|
222
|
+
/** Tool usage distribution for a single session (non-null tool_name only). */
|
|
223
|
+
aggregateToolUsageBySession(session_id) {
|
|
224
|
+
return this.db.prepare(`SELECT tool_name, COUNT(*) as count FROM events
|
|
225
|
+
WHERE session_id = ? AND tool_name IS NOT NULL
|
|
226
|
+
GROUP BY tool_name ORDER BY count DESC`).all(session_id);
|
|
227
|
+
}
|
|
228
|
+
/** Count of distinct active days (date(timestamp)) in [since, until). */
|
|
229
|
+
countActiveDays(opts) {
|
|
230
|
+
const conditions = ['timestamp >= ?'];
|
|
231
|
+
const params = [opts.since];
|
|
232
|
+
if (opts.until !== undefined) {
|
|
233
|
+
conditions.push('timestamp < ?');
|
|
234
|
+
params.push(opts.until);
|
|
235
|
+
}
|
|
236
|
+
const sql = `SELECT COUNT(DISTINCT date(timestamp)) as cnt FROM events
|
|
237
|
+
WHERE ${conditions.join(' AND ')}`;
|
|
238
|
+
const row = this.db.prepare(sql).get(...params);
|
|
239
|
+
return row?.cnt ?? 0;
|
|
240
|
+
}
|
|
241
|
+
/** Composite overview within [since, until): event count + distinct session count + distinct day count. */
|
|
242
|
+
aggregateOverviewByRange(opts) {
|
|
243
|
+
const row = this.db.prepare(`SELECT COUNT(*) as cnt, COUNT(DISTINCT session_id) as sessionCount,
|
|
244
|
+
COUNT(DISTINCT date(timestamp)) as dayCount
|
|
245
|
+
FROM events
|
|
246
|
+
WHERE timestamp >= ? AND timestamp < ?`).get(opts.since, opts.until);
|
|
247
|
+
return {
|
|
248
|
+
event_count: row?.cnt ?? 0,
|
|
249
|
+
session_count: row?.sessionCount ?? 0,
|
|
250
|
+
day_count: row?.dayCount ?? 0,
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
/** Distinct, non-empty project_path values within [since, until). */
|
|
254
|
+
queryDistinctProjects(opts) {
|
|
255
|
+
const rows = this.db.prepare(`SELECT DISTINCT project_path FROM events
|
|
256
|
+
WHERE timestamp >= ? AND timestamp < ?
|
|
257
|
+
AND project_path IS NOT NULL AND project_path != ''`).all(opts.since, opts.until);
|
|
258
|
+
return rows.map(r => r.project_path);
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* PostToolUse failure rate within [since, until).
|
|
262
|
+
*
|
|
263
|
+
* Failure detection uses three LIKE branches on tool_output (preserved from
|
|
264
|
+
* weekly-report.ts original SQL):
|
|
265
|
+
* - '%"error"%'
|
|
266
|
+
* - '%"is_error":true%'
|
|
267
|
+
* - '%"isError":true%'
|
|
268
|
+
*/
|
|
269
|
+
aggregateToolFailureRate(opts) {
|
|
270
|
+
const totalRow = this.db.prepare(`SELECT COUNT(*) as total FROM events
|
|
271
|
+
WHERE timestamp >= ? AND timestamp < ?
|
|
272
|
+
AND hook_type = 'PostToolUse'`).get(opts.since, opts.until);
|
|
273
|
+
const failRow = this.db.prepare(`SELECT COUNT(*) as failed FROM events
|
|
274
|
+
WHERE timestamp >= ? AND timestamp < ?
|
|
275
|
+
AND hook_type = 'PostToolUse'
|
|
276
|
+
AND tool_output IS NOT NULL
|
|
277
|
+
AND (tool_output LIKE '%"error"%'
|
|
278
|
+
OR tool_output LIKE '%"is_error":true%'
|
|
279
|
+
OR tool_output LIKE '%"isError":true%')`).get(opts.since, opts.until);
|
|
280
|
+
return {
|
|
281
|
+
post_total: totalRow?.total ?? 0,
|
|
282
|
+
failed: failRow?.failed ?? 0,
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Raw tool_input JSON strings for file-edit tools within [since, until).
|
|
287
|
+
* Caller is responsible for JSON.parse / file_path extraction.
|
|
288
|
+
* Internal IN-list expansion of `tool_names`.
|
|
289
|
+
*/
|
|
290
|
+
queryFileEditInputs(opts) {
|
|
291
|
+
if (opts.tool_names.length === 0)
|
|
292
|
+
return [];
|
|
293
|
+
const placeholders = opts.tool_names.map(() => '?').join(',');
|
|
294
|
+
const sql = `SELECT tool_input FROM events
|
|
295
|
+
WHERE timestamp >= ? AND timestamp < ?
|
|
296
|
+
AND hook_type = 'PreToolUse'
|
|
297
|
+
AND tool_name IN (${placeholders})
|
|
298
|
+
AND tool_input IS NOT NULL`;
|
|
299
|
+
return this.db.prepare(sql).all(opts.since, opts.until, ...opts.tool_names);
|
|
300
|
+
}
|
|
301
|
+
/** Full events in [since, until?), ascending by timestamp (used by anti-pattern-detector). */
|
|
302
|
+
queryEventsByTimeRange(opts) {
|
|
303
|
+
const conditions = ['timestamp >= ?'];
|
|
304
|
+
const params = [opts.since];
|
|
305
|
+
if (opts.until !== undefined) {
|
|
306
|
+
conditions.push('timestamp < ?');
|
|
307
|
+
params.push(opts.until);
|
|
308
|
+
}
|
|
309
|
+
const sql = `SELECT * FROM events WHERE ${conditions.join(' AND ')} ORDER BY timestamp ASC`;
|
|
310
|
+
const rows = this.db.prepare(sql).all(...params);
|
|
311
|
+
return rows.map(r => this.rowToEvent(r));
|
|
312
|
+
}
|
|
166
313
|
rowToEvent(row) {
|
|
167
314
|
// Runtime validation of database row
|
|
168
315
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../../src/core/storage/events.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../../src/core/storage/events.ts"],"names":[],"mappings":"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"}
|
|
@@ -52,13 +52,66 @@ export declare class RoutingOperations {
|
|
|
52
52
|
limit?: number;
|
|
53
53
|
}): RoutingEventRow[];
|
|
54
54
|
/** Pending events with NULL obeyed within the last N seconds; used by daemon restart recovery. */
|
|
55
|
-
|
|
55
|
+
queryPendingRoutingEvents(ageMs: number): RoutingEventRow[];
|
|
56
56
|
/** Get the most recent routing_event for a session (used by Agent observation). */
|
|
57
57
|
getRecentRoutingEvent(sessionId: string): {
|
|
58
58
|
id: number;
|
|
59
59
|
} | null;
|
|
60
|
+
/**
|
|
61
|
+
* Get the most recent PENDING routing_event for a session (obeyed IS NULL).
|
|
62
|
+
*
|
|
63
|
+
* Used by PostToolUseHandler to associate Agent invocations with the
|
|
64
|
+
* still-unfilled routing_event from the current user prompt. Returning only
|
|
65
|
+
* pending rows prevents the handler from re-overwriting an already-completed
|
|
66
|
+
* event (e.g. when 2+ Agents fire within the same prompt, or when an old
|
|
67
|
+
* obeyed=1 row leaks past a missed UserPromptSubmit).
|
|
68
|
+
*
|
|
69
|
+
* Trade-off: in the "same-prompt multi-Agent" case, the 2nd+ Agent will not
|
|
70
|
+
* find a pending row and will be silently skipped. Recording every Agent
|
|
71
|
+
* call is M7 out-of-scope (would require INSERT in PostToolUse rather than
|
|
72
|
+
* UPDATE).
|
|
73
|
+
*/
|
|
74
|
+
getRecentPendingRoutingEvent(sessionId: string): {
|
|
75
|
+
id: number;
|
|
76
|
+
} | null;
|
|
60
77
|
getExperimentAssignment(sessionId: string, experimentId: string): string | null;
|
|
61
78
|
setExperimentAssignment(sessionId: string, experimentId: string, groupId: string): void;
|
|
79
|
+
/**
|
|
80
|
+
* 一次性返回 rules + skill-stats 共用的 routing 汇总(4 个独立聚合,
|
|
81
|
+
* 各走自己的索引)。不走 UNION ALL(SQLite 无 GROUPING SETS)。
|
|
82
|
+
*/
|
|
83
|
+
aggregateRoutingStats(filter: {
|
|
84
|
+
since_ts: number;
|
|
85
|
+
project_path?: string;
|
|
86
|
+
}): {
|
|
87
|
+
total: number;
|
|
88
|
+
obeyed: number;
|
|
89
|
+
refused: number;
|
|
90
|
+
unknown: number;
|
|
91
|
+
by_type: Array<{
|
|
92
|
+
type: 'agent' | 'skill' | 'none';
|
|
93
|
+
count: number;
|
|
94
|
+
}>;
|
|
95
|
+
by_agent: Array<{
|
|
96
|
+
agent: string;
|
|
97
|
+
count: number;
|
|
98
|
+
}>;
|
|
99
|
+
by_skill_routed: Array<{
|
|
100
|
+
skill: string;
|
|
101
|
+
count: number;
|
|
102
|
+
}>;
|
|
103
|
+
};
|
|
104
|
+
/**
|
|
105
|
+
* 按天聚合 routing 事件,用于 skill-stats trend chart。
|
|
106
|
+
* 时区固定 UTC(strftime + unixepoch),与旧实现的 `new Date(ts).toISOString().split('T')[0]` 一致。
|
|
107
|
+
*/
|
|
108
|
+
aggregateRoutingTrendByDay(filter: {
|
|
109
|
+
since_ts: number;
|
|
110
|
+
}): Array<{
|
|
111
|
+
day: string;
|
|
112
|
+
total: number;
|
|
113
|
+
skill: number;
|
|
114
|
+
}>;
|
|
62
115
|
queryExperimentStats(experimentId: string): Array<{
|
|
63
116
|
group_id: string;
|
|
64
117
|
total: number;
|