@winspan/claude-forge 8.51.1 → 8.54.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (409) hide show
  1. package/DEVELOPMENT.md +290 -221
  2. package/README.md +50 -8
  3. package/dist/cli/commands/skills.d.ts.map +1 -1
  4. package/dist/cli/commands/skills.js +121 -2
  5. package/dist/cli/commands/skills.js.map +1 -1
  6. package/dist/cli/init/hook-manager.d.ts +1 -1
  7. package/dist/cli/init/hook-manager.d.ts.map +1 -1
  8. package/dist/cli/init/hook-manager.js +1 -0
  9. package/dist/cli/init/hook-manager.js.map +1 -1
  10. package/dist/core/constants.d.ts +2 -0
  11. package/dist/core/constants.d.ts.map +1 -1
  12. package/dist/core/constants.js +4 -0
  13. package/dist/core/constants.js.map +1 -1
  14. package/dist/core/storage/events.d.ts.map +1 -1
  15. package/dist/core/storage/events.js +0 -1
  16. package/dist/core/storage/events.js.map +1 -1
  17. package/dist/core/storage/maintenance.d.ts +25 -3
  18. package/dist/core/storage/maintenance.d.ts.map +1 -1
  19. package/dist/core/storage/maintenance.js +33 -4
  20. package/dist/core/storage/maintenance.js.map +1 -1
  21. package/dist/core/storage/routing.d.ts +4 -0
  22. package/dist/core/storage/routing.d.ts.map +1 -1
  23. package/dist/core/storage/routing.js +10 -4
  24. package/dist/core/storage/routing.js.map +1 -1
  25. package/dist/core/storage/sessions.d.ts +17 -0
  26. package/dist/core/storage/sessions.d.ts.map +1 -1
  27. package/dist/core/storage/sessions.js +64 -0
  28. package/dist/core/storage/sessions.js.map +1 -1
  29. package/dist/core/storage/skills.d.ts +4 -0
  30. package/dist/core/storage/skills.d.ts.map +1 -1
  31. package/dist/core/storage/skills.js +10 -2
  32. package/dist/core/storage/skills.js.map +1 -1
  33. package/dist/core/storage/sqlite.d.ts +5 -0
  34. package/dist/core/storage/sqlite.d.ts.map +1 -1
  35. package/dist/core/storage/sqlite.js +6 -0
  36. package/dist/core/storage/sqlite.js.map +1 -1
  37. package/dist/core/storage/tasks.d.ts.map +1 -1
  38. package/dist/core/storage/tasks.js +2 -0
  39. package/dist/core/storage/tasks.js.map +1 -1
  40. package/dist/core/types.d.ts +7 -0
  41. package/dist/core/types.d.ts.map +1 -1
  42. package/dist/daemon/index.d.ts.map +1 -1
  43. package/dist/daemon/index.js +30 -5
  44. package/dist/daemon/index.js.map +1 -1
  45. package/dist/daemon/skill-sync.d.ts +21 -0
  46. package/dist/daemon/skill-sync.d.ts.map +1 -0
  47. package/dist/daemon/skill-sync.js +75 -0
  48. package/dist/daemon/skill-sync.js.map +1 -0
  49. package/dist/hooks/notification.sh +1 -1
  50. package/dist/hooks/post-tool-use.sh +1 -1
  51. package/dist/hooks/pre-tool-use.sh +1 -1
  52. package/dist/hooks/stop.sh +1 -1
  53. package/dist/hooks/user-prompt-submit.sh +1 -1
  54. package/dist/skills/official/code-simplifier.md +37 -1
  55. package/dist/skills/official/find-skills.md +120 -1
  56. package/dist/skills/official/official-api-design.md +14 -1
  57. package/dist/skills/official/official-architecture-decision.md +22 -1
  58. package/dist/skills/official/official-db-schema-design.md +19 -1
  59. package/dist/skills/official/official-debug.md +9 -1
  60. package/dist/skills/official/official-pr-review.md +1 -1
  61. package/dist/skills/official/official-security-hardening.md +7 -1
  62. package/dist/skills/official/planning-with-files.md +206 -2
  63. package/dist/skills/official/ui-ux-pro-max.md +88 -1
  64. package/dist/skills/official/webapp-testing.md +85 -1
  65. package/dist/skills/registry.d.ts +1 -1
  66. package/dist/skills/registry.d.ts.map +1 -1
  67. package/dist/skills/registry.js +15 -4
  68. package/dist/skills/registry.js.map +1 -1
  69. package/dist/skills/semantic-matcher.d.ts +4 -3
  70. package/dist/skills/semantic-matcher.d.ts.map +1 -1
  71. package/dist/skills/semantic-matcher.js +20 -22
  72. package/dist/skills/semantic-matcher.js.map +1 -1
  73. package/dist/skills/upgrade-engine.d.ts +93 -0
  74. package/dist/skills/upgrade-engine.d.ts.map +1 -0
  75. package/dist/skills/upgrade-engine.js +447 -0
  76. package/dist/skills/upgrade-engine.js.map +1 -0
  77. package/dist/skills/upgrade-prompt.d.ts +20 -0
  78. package/dist/skills/upgrade-prompt.d.ts.map +1 -0
  79. package/dist/skills/upgrade-prompt.js +75 -0
  80. package/dist/skills/upgrade-prompt.js.map +1 -0
  81. package/dist/web/analytics/weekly-report.d.ts.map +1 -1
  82. package/dist/web/analytics/weekly-report.js +21 -29
  83. package/dist/web/analytics/weekly-report.js.map +1 -1
  84. package/dist/web/routes/patch.d.ts.map +1 -1
  85. package/dist/web/routes/patch.js +32 -2
  86. package/dist/web/routes/patch.js.map +1 -1
  87. package/dist/web/routes/sessions.d.ts.map +1 -1
  88. package/dist/web/routes/sessions.js +9 -7
  89. package/dist/web/routes/sessions.js.map +1 -1
  90. package/dist/web/routes/trace.d.ts.map +1 -1
  91. package/dist/web/routes/trace.js +2 -3
  92. package/dist/web/routes/trace.js.map +1 -1
  93. package/dist/web/server.d.ts.map +1 -1
  94. package/dist/web/server.js +3 -2
  95. package/dist/web/server.js.map +1 -1
  96. package/package.json +12 -2
  97. package/scripts/postinstall.cjs +21 -0
  98. package/.claude/CLAUDE.md +0 -17
  99. package/.eslintrc.js +0 -23
  100. package/.prettierrc +0 -8
  101. package/ARCHITECTURE_ISSUES.md +0 -249
  102. package/CLAUDE.md +0 -265
  103. package/CLAUDE.md.backup +0 -488
  104. package/docs/concurrent-agents.md +0 -129
  105. package/docs/design/architecture-review-20260516.md +0 -232
  106. package/docs/design/fix-skills-data-and-set-leak-spec-20260516-1300.md +0 -219
  107. package/docs/design/h1-storage-aggregation-spec-20260518-1121.md +0 -299
  108. package/docs/design/h2-getdatabase-encapsulation-spec-20260518-1450.md +0 -191
  109. package/docs/design/h3-fallback-removal-spec-20260518-1245.md +0 -76
  110. package/docs/design/h4-index-dedup-spec-20260518-1230.md +0 -109
  111. package/docs/design/h6-services-migration-spec-20260518-1355.md +0 -82
  112. package/docs/design/hook-failure-queue-spec-20260516-1530.md +0 -204
  113. package/docs/design/l1-swarm-protocol-extract-spec-20260518-1605.md +0 -106
  114. package/docs/design/m10-forge-paths-spec-20260518-1320.md +0 -121
  115. package/docs/design/m2-m3-tool-input-spec-20260518-1425.md +0 -131
  116. package/docs/design/m7-routing-event-association-spec-20260518-1545.md +0 -103
  117. package/docs/design/project-path-gitroot-spec-20260518-1715.md +0 -134
  118. package/docs/design/refactor-phase1-spec-20260515-1600.md +0 -543
  119. package/docs/design/refactor-phase2-spec-20260515-1700.md +0 -424
  120. package/docs/design/task-active-gc-spec-20260518-1745.md +0 -146
  121. package/docs/design/tasks-list-filter-pagination-spec-20260518-0930.md +0 -208
  122. package/docs/implementation/fix-skills-data-and-set-leak-changelog-20260516-1300.md +0 -104
  123. package/docs/implementation/h1-storage-aggregation-changelog-20260518-1121.md +0 -82
  124. package/docs/implementation/h2-final-changelog-20260518-1530.md +0 -61
  125. package/docs/implementation/h2-phase1-safety-net-changelog-20260518-1450.md +0 -70
  126. package/docs/implementation/h2-phase2-operations-changelog-20260518-1450.md +0 -120
  127. package/docs/implementation/h2-phase3-callsites-changelog-20260518-1450.md +0 -71
  128. package/docs/implementation/h3-fallback-removal-changelog-20260518-1245.md +0 -71
  129. package/docs/implementation/h4-index-dedup-changelog-20260518-1230.md +0 -60
  130. package/docs/implementation/h6-services-migration-changelog-20260518-1355.md +0 -46
  131. package/docs/implementation/h7-m9-defaults-changelog-20260518-1300.md +0 -46
  132. package/docs/implementation/hook-failure-queue-changelog-20260516-1530.md +0 -196
  133. package/docs/implementation/hotfix-daemon-event-reject-20260516-1430.md +0 -56
  134. package/docs/implementation/l1-swarm-protocol-extract-changelog-20260518-1605.md +0 -45
  135. package/docs/implementation/l3-l4-daemon-perf-changelog-20260518-1410.md +0 -63
  136. package/docs/implementation/l6-l8-final-cleanup-changelog-20260518-1640.md +0 -38
  137. package/docs/implementation/m1-m4-m5-l7-cleanup-changelog-20260518-1310.md +0 -58
  138. package/docs/implementation/m10-forge-paths-changelog-20260518-1320.md +0 -60
  139. package/docs/implementation/m2-m3-tool-input-changelog-20260518-1425.md +0 -43
  140. package/docs/implementation/m6-m8-naming-shutdown-changelog-20260518-1340.md +0 -56
  141. package/docs/implementation/m7-routing-association-changelog-20260518-1545.md +0 -69
  142. package/docs/implementation/project-path-gitroot-changelog-20260518-1715.md +0 -63
  143. package/docs/implementation/refactor-phase1-changelog-20260515-1630.md +0 -354
  144. package/docs/implementation/refactor-phase2-changelog-20260515-1705.md +0 -421
  145. package/docs/implementation/task-active-gc-changelog-20260518-1745.md +0 -35
  146. package/docs/implementation/task-title-summary-changelog-20260518-1130.md +0 -39
  147. package/docs/implementation/tasks-detail-back-loses-filters-changelog-20260518-1100.md +0 -22
  148. package/docs/implementation/tasks-list-filter-pagination-changelog-20260518-0930.md +0 -72
  149. package/docs/implementation/tasks-page-white-screen-hotfix-changelog-20260518-1015.md +0 -56
  150. package/docs/reviews/claudemd-template-sync.md +0 -54
  151. package/docs/reviews/task-title-summary.md +0 -92
  152. package/docs/reviews/tasks-detail-back-loses-filters.md +0 -58
  153. package/docs/reviews/tasks-filter-pagination.md +0 -80
  154. package/docs/reviews/tasks-page-white-screen-hotfix.md +0 -126
  155. package/docs/ruflo-learning-strategy.md +0 -322
  156. package/docs/skills-deduplication-analysis.md +0 -83
  157. package/docs/skills-multiformat-support.md +0 -177
  158. package/docs/skills-third-party.md +0 -183
  159. package/docs/testing/tasks-filter-pagination-test-report.md +0 -86
  160. package/forge +0 -321
  161. package/playwright.config.ts +0 -40
  162. package/scripts/demo-v2.ts +0 -91
  163. package/scripts/dev-daemon.sh +0 -232
  164. package/scripts/dev-web.ts +0 -109
  165. package/scripts/e2e-mcp-link.ts +0 -423
  166. package/scripts/e2e-methodology-quality.ts +0 -253
  167. package/scripts/e2e-routing.ts +0 -456
  168. package/scripts/e2e-user-methodology.ts +0 -326
  169. package/scripts/e2e-web-workflows.ts +0 -299
  170. package/scripts/migrate-legacy-to-dynamic.sql +0 -108
  171. package/scripts/regenerate-execution-docs.ts +0 -116
  172. package/scripts/sync-agent-skills.ts +0 -193
  173. package/scripts/test-hook.sh +0 -71
  174. package/scripts/verify-skill-loading.ts +0 -62
  175. package/src/claudemd/claudemd-generator.ts +0 -568
  176. package/src/claudemd/convention-extractor.ts +0 -69
  177. package/src/claudemd/index.ts +0 -35
  178. package/src/claudemd/persona-manager.ts +0 -88
  179. package/src/claudemd/resume-manager.ts +0 -236
  180. package/src/claudemd/tech-detector.ts +0 -220
  181. package/src/claudemd/templates/swarm-protocol.md +0 -222
  182. package/src/cli/commands/claudemd.ts +0 -84
  183. package/src/cli/commands/config.ts +0 -46
  184. package/src/cli/commands/daemon.ts +0 -310
  185. package/src/cli/commands/executions.ts +0 -115
  186. package/src/cli/commands/init.ts +0 -204
  187. package/src/cli/commands/logs.ts +0 -181
  188. package/src/cli/commands/mcp.ts +0 -242
  189. package/src/cli/commands/menu.ts +0 -357
  190. package/src/cli/commands/skills.ts +0 -185
  191. package/src/cli/commands/stats.ts +0 -73
  192. package/src/cli/commands/status.ts +0 -69
  193. package/src/cli/commands/template.ts +0 -77
  194. package/src/cli/commands/trace.ts +0 -148
  195. package/src/cli/index.ts +0 -42
  196. package/src/cli/init/hook-manager.ts +0 -132
  197. package/src/core/ai/provider.ts +0 -308
  198. package/src/core/ai/types.ts +0 -51
  199. package/src/core/config.ts +0 -124
  200. package/src/core/constants.ts +0 -62
  201. package/src/core/event-fields.ts +0 -32
  202. package/src/core/queue/index.ts +0 -192
  203. package/src/core/storage/base.ts +0 -302
  204. package/src/core/storage/events.ts +0 -434
  205. package/src/core/storage/injections.ts +0 -78
  206. package/src/core/storage/maintenance.ts +0 -59
  207. package/src/core/storage/migrations/002_add_skill_tracking.sql +0 -6
  208. package/src/core/storage/migrations/003_add_skill_invocations.sql +0 -23
  209. package/src/core/storage/performance-indexes.sql +0 -23
  210. package/src/core/storage/routing.ts +0 -322
  211. package/src/core/storage/rows.ts +0 -112
  212. package/src/core/storage/schema.sql +0 -224
  213. package/src/core/storage/sessions.ts +0 -168
  214. package/src/core/storage/skills.ts +0 -233
  215. package/src/core/storage/sqlite.ts +0 -293
  216. package/src/core/storage/tasks.ts +0 -318
  217. package/src/core/storage/token-usage.ts +0 -93
  218. package/src/core/types.ts +0 -181
  219. package/src/core/utils/error-handler.ts +0 -257
  220. package/src/core/utils/forge-resume-block.ts +0 -74
  221. package/src/core/utils/format.ts +0 -69
  222. package/src/core/utils/git.ts +0 -23
  223. package/src/core/utils/logger.ts +0 -134
  224. package/src/core/utils/lru-cache.ts +0 -54
  225. package/src/core/utils/path.ts +0 -19
  226. package/src/core/utils/session.ts +0 -26
  227. package/src/core/utils/time.ts +0 -37
  228. package/src/core/utils/token-tracker.ts +0 -97
  229. package/src/daemon/event-parser.ts +0 -36
  230. package/src/daemon/handlers/history-exporter.ts +0 -117
  231. package/src/daemon/handlers/post-tool-use.ts +0 -54
  232. package/src/daemon/handlers/stop.ts +0 -208
  233. package/src/daemon/handlers/user-prompt.ts +0 -178
  234. package/src/daemon/hook-sync.ts +0 -91
  235. package/src/daemon/index.ts +0 -302
  236. package/src/daemon/launchd/com.claude-forge.daemon.plist.template +0 -47
  237. package/src/daemon/launchd-installer.ts +0 -260
  238. package/src/daemon/lifecycle.ts +0 -128
  239. package/src/daemon/router.ts +0 -40
  240. package/src/daemon/server.ts +0 -196
  241. package/src/daemon/services/task-segmenter.ts +0 -112
  242. package/src/hooks/hook-lib.sh +0 -118
  243. package/src/hooks/notification.sh +0 -35
  244. package/src/hooks/post-tool-use.sh +0 -61
  245. package/src/hooks/pre-tool-use.sh +0 -63
  246. package/src/hooks/stop.sh +0 -43
  247. package/src/hooks/user-prompt-submit.sh +0 -69
  248. package/src/mcp/server.ts +0 -322
  249. package/src/skills/index.ts +0 -2
  250. package/src/skills/invocation-guard.ts +0 -177
  251. package/src/skills/matcher.ts +0 -148
  252. package/src/skills/official/code-simplifier.md +0 -16
  253. package/src/skills/official/find-skills.md +0 -23
  254. package/src/skills/official/official-api-design.md +0 -17
  255. package/src/skills/official/official-architecture-decision.md +0 -20
  256. package/src/skills/official/official-bmad.md +0 -118
  257. package/src/skills/official/official-db-schema-design.md +0 -16
  258. package/src/skills/official/official-debug.md +0 -17
  259. package/src/skills/official/official-doc-driven.md +0 -31
  260. package/src/skills/official/official-harness-engineering.md +0 -108
  261. package/src/skills/official/official-performance-optimization.md +0 -30
  262. package/src/skills/official/official-pr-review.md +0 -35
  263. package/src/skills/official/official-release-checklist.md +0 -30
  264. package/src/skills/official/official-security-hardening.md +0 -26
  265. package/src/skills/official/official-spec-driven-design.md +0 -31
  266. package/src/skills/official/planning-with-files.md +0 -37
  267. package/src/skills/official/ui-ux-pro-max.md +0 -18
  268. package/src/skills/official/webapp-testing.md +0 -12
  269. package/src/skills/official-skills.ts +0 -89
  270. package/src/skills/registry.ts +0 -355
  271. package/src/skills/semantic-matcher.ts +0 -231
  272. package/src/skills/tools/pipeline-suggest.ts +0 -226
  273. package/src/skills/tools/skill-invoke.ts +0 -168
  274. package/src/skills/tools/skill-list.ts +0 -59
  275. package/src/templates/go.yaml +0 -53
  276. package/src/templates/python.yaml +0 -59
  277. package/src/templates/react.yaml +0 -55
  278. package/src/templates/template-manager.ts +0 -170
  279. package/src/web/analytics/anti-pattern-detector.ts +0 -367
  280. package/src/web/analytics/drift-detector.ts +0 -219
  281. package/src/web/analytics/weekly-report.ts +0 -431
  282. package/src/web/auth-middleware.ts +0 -54
  283. package/src/web/routes/_helpers.ts +0 -34
  284. package/src/web/routes/ai.ts +0 -204
  285. package/src/web/routes/auth.ts +0 -22
  286. package/src/web/routes/drift.ts +0 -25
  287. package/src/web/routes/error-handler.ts +0 -120
  288. package/src/web/routes/events.ts +0 -47
  289. package/src/web/routes/insights.ts +0 -43
  290. package/src/web/routes/patch.ts +0 -117
  291. package/src/web/routes/reports.ts +0 -34
  292. package/src/web/routes/rules.ts +0 -76
  293. package/src/web/routes/sessions.ts +0 -250
  294. package/src/web/routes/skill-stats.ts +0 -92
  295. package/src/web/routes/skills.ts +0 -350
  296. package/src/web/routes/static.ts +0 -67
  297. package/src/web/routes/stats.ts +0 -50
  298. package/src/web/routes/status.ts +0 -30
  299. package/src/web/routes/tasks.ts +0 -193
  300. package/src/web/routes/token-usage.ts +0 -20
  301. package/src/web/routes/trace.ts +0 -126
  302. package/src/web/routes/types.ts +0 -57
  303. package/src/web/server.ts +0 -134
  304. package/src/web/ssrf-guard.ts +0 -112
  305. package/src/web/static/index.html +0 -3251
  306. package/src/web/static/vendor/chart.umd.min.js +0 -20
  307. package/tests/e2e/dashboard.spec.ts +0 -205
  308. package/tests/e2e/routing-skill-e2e.test.ts +0 -39
  309. package/tests/helpers/mock-ai.ts +0 -92
  310. package/tests/helpers/mock-storage.ts +0 -159
  311. package/tests/integration/claudemd-generator.test.ts +0 -90
  312. package/tests/integration/queue-replay.integration.test.ts +0 -193
  313. package/tests/integration/tasks-filter.integration.test.ts +0 -154
  314. package/tests/integration/web-analytics.integration.test.ts +0 -133
  315. package/tests/integration/web-stats.integration.test.ts +0 -135
  316. package/tests/integration/web-trace.integration.test.ts +0 -175
  317. package/tests/performance/database.benchmark.ts +0 -161
  318. package/tests/semantic-matcher.test.ts +0 -99
  319. package/tests/skill-matcher.test.ts +0 -110
  320. package/tests/unit/ai-provider-retry.test.ts +0 -194
  321. package/tests/unit/ai-provider-vision.test.ts +0 -224
  322. package/tests/unit/claudemd-generator.test.ts +0 -68
  323. package/tests/unit/cli-mcp.test.ts +0 -141
  324. package/tests/unit/core/forge-paths.test.ts +0 -99
  325. package/tests/unit/daemon/hook-sync.test.ts +0 -71
  326. package/tests/unit/daemon/post-tool-use.test.ts +0 -121
  327. package/tests/unit/daemon/stop-handler-behavior-summary.test.ts +0 -202
  328. package/tests/unit/daemon/task-segmenter-recover.test.ts +0 -84
  329. package/tests/unit/event-fields.test.ts +0 -88
  330. package/tests/unit/event-parser.test.ts +0 -55
  331. package/tests/unit/handlers.test.ts +0 -171
  332. package/tests/unit/hooks/resolve-project-path.test.ts +0 -122
  333. package/tests/unit/invocation-guard.test.ts +0 -125
  334. package/tests/unit/queue.test.ts +0 -272
  335. package/tests/unit/router.test.ts +0 -138
  336. package/tests/unit/security.test.ts +0 -128
  337. package/tests/unit/skill-invocations-workflow.test.ts +0 -495
  338. package/tests/unit/skill-registry.test.ts +0 -94
  339. package/tests/unit/skills/invocation-guard-ttl.test.ts +0 -211
  340. package/tests/unit/skills/official-skills-loader.test.ts +0 -126
  341. package/tests/unit/skills/registry-multiformat.test.ts +0 -92
  342. package/tests/unit/socket-server.test.ts +0 -183
  343. package/tests/unit/storage/event-operations-aggregates.test.ts +0 -342
  344. package/tests/unit/storage/migration-idempotent.test.ts +0 -304
  345. package/tests/unit/storage/routing-aggregates.test.ts +0 -276
  346. package/tests/unit/storage/routing.test.ts +0 -117
  347. package/tests/unit/storage/schema-missing.test.ts +0 -81
  348. package/tests/unit/storage/session-operations-aggregates.test.ts +0 -120
  349. package/tests/unit/storage/sessions-aggregate.test.ts +0 -435
  350. package/tests/unit/storage/skill-operations-counts.test.ts +0 -106
  351. package/tests/unit/storage/skills-aggregates.test.ts +0 -104
  352. package/tests/unit/storage/sqlite-refactor-harness.test.ts +0 -314
  353. package/tests/unit/storage/task-operations-counts.test.ts +0 -46
  354. package/tests/unit/storage/tasks-getById.test.ts +0 -343
  355. package/tests/unit/storage/tasks-stale-gc.test.ts +0 -86
  356. package/tests/unit/storage.test.ts +0 -172
  357. package/tests/unit/token-usage.test.ts +0 -144
  358. package/tests/unit/type-guards.test.ts +0 -201
  359. package/tests/unit/utils/format.test.ts +0 -189
  360. package/tests/unit/utils/session.test.ts +0 -89
  361. package/tests/unit/utils/time.test.ts +0 -112
  362. package/tests/unit/web/navigation-back-contract.test.ts +0 -134
  363. package/tests/unit/web/routes-auth.test.ts +0 -93
  364. package/tests/unit/web/routes-events.test.ts +0 -101
  365. package/tests/unit/web/routes-rules.test.ts +0 -182
  366. package/tests/unit/web/routes-sessions.test.ts +0 -181
  367. package/tests/unit/web/routes-skill-stats.test.ts +0 -179
  368. package/tests/unit/web/routes-stats.test.ts +0 -92
  369. package/tests/unit/web/routes-tasks.test.ts +0 -385
  370. package/tests/unit/web/task-title-contract.test.ts +0 -210
  371. package/tests/unit/web/tasks-component-contract.test.ts +0 -179
  372. package/tsconfig.json +0 -22
  373. package/vitest.config.ts +0 -21
  374. package/vitest.integration.config.ts +0 -16
  375. package/web/CLAUDE.md +0 -20
  376. package/web/index.html +0 -13
  377. package/web/package-lock.json +0 -4854
  378. package/web/package.json +0 -35
  379. package/web/postcss.config.js +0 -6
  380. package/web/src/App.tsx +0 -110
  381. package/web/src/components/CodeBlock.tsx +0 -31
  382. package/web/src/components/Confirm.tsx +0 -96
  383. package/web/src/components/Drawer.tsx +0 -60
  384. package/web/src/components/Layout.tsx +0 -145
  385. package/web/src/components/MarkdownRenderer.tsx +0 -77
  386. package/web/src/components/SearchInput.tsx +0 -31
  387. package/web/src/components/SessionDetailContent.tsx +0 -157
  388. package/web/src/components/Toast.tsx +0 -92
  389. package/web/src/index.css +0 -19
  390. package/web/src/main.tsx +0 -31
  391. package/web/src/pages/AIConfig.tsx +0 -233
  392. package/web/src/pages/Dashboard.tsx +0 -572
  393. package/web/src/pages/Events.tsx +0 -271
  394. package/web/src/pages/Reports.tsx +0 -428
  395. package/web/src/pages/SessionDetail.tsx +0 -162
  396. package/web/src/pages/Sessions.tsx +0 -205
  397. package/web/src/pages/Skills.tsx +0 -180
  398. package/web/src/pages/TaskDetail.tsx +0 -515
  399. package/web/src/pages/Tasks.tsx +0 -415
  400. package/web/src/utils/auth.ts +0 -59
  401. package/web/src/utils/export.ts +0 -54
  402. package/web/src/utils/navigation.ts +0 -25
  403. package/web/src/utils/task-title.ts +0 -49
  404. package/web/src/utils/time.ts +0 -13
  405. package/web/tailwind.config.js +0 -11
  406. package/web/tsconfig.json +0 -21
  407. package/web/tsconfig.node.json +0 -10
  408. package/web/vite.config.ts +0 -76
  409. package/winspan-claude-forge-8.43.0.tgz +0 -0
@@ -1,322 +0,0 @@
1
- /**
2
- * RoutingOperations — routing_events + experiment_assignments 读写
3
- *
4
- * 拆分自 sqlite.ts。
5
- *
6
- * 注意:experiment_assignments 表在 base.ts 的 deprecated 列表里被 DROP 了,
7
- * 但保留访问方法以维持 API 向后兼容(旧库残留 / 不同 schema 版本)。
8
- */
9
-
10
- import type Database from 'better-sqlite3';
11
-
12
- export interface RoutingEventRecord {
13
- id?: number;
14
- session_id: string;
15
- route_request_id?: string | null;
16
- project_path: string;
17
- ts: number;
18
- prompt: string;
19
- intent_json: string;
20
- routed_to_type?: 'agent' | 'skill' | 'none' | null;
21
- routed_to_name?: string | null;
22
- is_forced?: number;
23
- obeyed?: number | null;
24
- classification_ms?: number | null;
25
- fallback_used?: number;
26
- refusal_reason?: string | null;
27
- first_tool_name?: string | null;
28
- first_tool_ts?: number | null;
29
- completed_ts?: number | null;
30
- total_execution_ms?: number | null;
31
- completion_reason?: string | null;
32
- downstream_task_chain?: string | null;
33
- injection_version?: string | null;
34
- experiment_id?: string | null;
35
- experiment_group?: string | null;
36
- skill_confidence?: number | null;
37
- skill_source?: 'auto' | 'slash_command' | 'agent_dependency' | null;
38
- }
39
-
40
- export interface RoutingEventRow extends RoutingEventRecord {
41
- id: number;
42
- created_at: string;
43
- }
44
-
45
- export class RoutingOperations {
46
- constructor(private db: Database.Database) {}
47
-
48
- writeRoutingEvent(record: RoutingEventRecord): number {
49
- const result = this.db.prepare(`
50
- INSERT INTO routing_events (
51
- session_id, route_request_id, project_path, ts, prompt, intent_json,
52
- routed_to_type, routed_to_name, is_forced, obeyed,
53
- classification_ms, fallback_used, refusal_reason,
54
- first_tool_name, first_tool_ts, completed_ts,
55
- total_execution_ms, completion_reason, downstream_task_chain,
56
- injection_version, experiment_id, experiment_group
57
- ) VALUES (
58
- @session_id, @route_request_id, @project_path, @ts, @prompt, @intent_json,
59
- @routed_to_type, @routed_to_name, @is_forced, @obeyed,
60
- @classification_ms, @fallback_used, @refusal_reason,
61
- @first_tool_name, @first_tool_ts, @completed_ts,
62
- @total_execution_ms, @completion_reason, @downstream_task_chain,
63
- @injection_version, @experiment_id, @experiment_group
64
- )
65
- `).run({
66
- session_id: record.session_id,
67
- route_request_id: record.route_request_id ?? null,
68
- project_path: record.project_path,
69
- ts: record.ts,
70
- prompt: record.prompt,
71
- intent_json: record.intent_json,
72
- routed_to_type: record.routed_to_type ?? null,
73
- routed_to_name: record.routed_to_name ?? null,
74
- is_forced: record.is_forced ?? 0,
75
- obeyed: record.obeyed ?? null,
76
- classification_ms: record.classification_ms ?? null,
77
- fallback_used: record.fallback_used ?? 0,
78
- refusal_reason: record.refusal_reason ?? null,
79
- first_tool_name: record.first_tool_name ?? null,
80
- first_tool_ts: record.first_tool_ts ?? null,
81
- completed_ts: record.completed_ts ?? null,
82
- total_execution_ms: record.total_execution_ms ?? null,
83
- completion_reason: record.completion_reason ?? null,
84
- downstream_task_chain: record.downstream_task_chain ?? null,
85
- injection_version: record.injection_version ?? null,
86
- experiment_id: record.experiment_id ?? null,
87
- experiment_group: record.experiment_group ?? null,
88
- });
89
- return Number(result.lastInsertRowid);
90
- }
91
-
92
- updateRoutingEvent(id: number, patch: Partial<RoutingEventRecord>): void {
93
- const fields = Object.keys(patch).filter((k) => k !== 'id');
94
- if (fields.length === 0) return;
95
- const setClause = fields.map((f) => `${f} = @${f}`).join(', ');
96
- this.db.prepare(`UPDATE routing_events SET ${setClause} WHERE id = @id`).run({
97
- ...patch,
98
- id,
99
- });
100
- }
101
-
102
- queryRoutingEvents(filter: {
103
- session_id?: string;
104
- project_path?: string;
105
- since_ts?: number;
106
- routed_to_name?: string;
107
- obeyed?: number | null;
108
- limit?: number;
109
- } = {}): RoutingEventRow[] {
110
- const conds: string[] = [];
111
- const params: Record<string, unknown> = {};
112
- if (filter.session_id) { conds.push('session_id = @session_id'); params.session_id = filter.session_id; }
113
- if (filter.project_path) { conds.push('project_path = @project_path'); params.project_path = filter.project_path; }
114
- if (filter.since_ts !== undefined) { conds.push('ts >= @since_ts'); params.since_ts = filter.since_ts; }
115
- if (filter.routed_to_name) { conds.push('routed_to_name = @routed_to_name'); params.routed_to_name = filter.routed_to_name; }
116
- if (filter.obeyed !== undefined) {
117
- if (filter.obeyed === null) conds.push('obeyed IS NULL');
118
- else { conds.push('obeyed = @obeyed'); params.obeyed = filter.obeyed; }
119
- }
120
- const where = conds.length > 0 ? `WHERE ${conds.join(' AND ')}` : '';
121
- const limit = filter.limit ?? 100;
122
- params.limit = limit;
123
- const rows = this.db.prepare(
124
- `SELECT * FROM routing_events ${where} ORDER BY ts DESC LIMIT @limit`
125
- ).all(params) as RoutingEventRow[];
126
- return rows;
127
- }
128
-
129
- /** Pending events with NULL obeyed within the last N seconds; used by daemon restart recovery. */
130
- queryPendingRoutingEvents(ageMs: number): RoutingEventRow[] {
131
- const cutoff = Date.now() - ageMs;
132
- return this.db.prepare(
133
- `SELECT * FROM routing_events WHERE obeyed IS NULL AND ts >= ? ORDER BY ts DESC`
134
- ).all(cutoff) as RoutingEventRow[];
135
- }
136
-
137
- /** Get the most recent routing_event for a session (used by Agent observation). */
138
- getRecentRoutingEvent(sessionId: string): { id: number } | null {
139
- const row = this.db.prepare(`
140
- SELECT id FROM routing_events
141
- WHERE session_id = ?
142
- ORDER BY ts DESC
143
- LIMIT 1
144
- `).get(sessionId) as { id: number } | undefined;
145
- return row ?? null;
146
- }
147
-
148
- /**
149
- * Get the most recent PENDING routing_event for a session (obeyed IS NULL).
150
- *
151
- * Used by PostToolUseHandler to associate Agent invocations with the
152
- * still-unfilled routing_event from the current user prompt. Returning only
153
- * pending rows prevents the handler from re-overwriting an already-completed
154
- * event (e.g. when 2+ Agents fire within the same prompt, or when an old
155
- * obeyed=1 row leaks past a missed UserPromptSubmit).
156
- *
157
- * Trade-off: in the "same-prompt multi-Agent" case, the 2nd+ Agent will not
158
- * find a pending row and will be silently skipped. Recording every Agent
159
- * call is M7 out-of-scope (would require INSERT in PostToolUse rather than
160
- * UPDATE).
161
- */
162
- getRecentPendingRoutingEvent(sessionId: string): { id: number } | null {
163
- const row = this.db.prepare(`
164
- SELECT id FROM routing_events
165
- WHERE session_id = ? AND obeyed IS NULL
166
- ORDER BY ts DESC
167
- LIMIT 1
168
- `).get(sessionId) as { id: number } | undefined;
169
- return row ?? null;
170
- }
171
-
172
- // ── Experiment Assignments ──────────────────────────────────────────────
173
-
174
- getExperimentAssignment(sessionId: string, experimentId: string): string | null {
175
- const row = this.db.prepare(
176
- `SELECT group_id FROM experiment_assignments WHERE session_id = ? AND experiment_id = ?`
177
- ).get(sessionId, experimentId) as { group_id: string } | undefined;
178
- return row ? row.group_id : null;
179
- }
180
-
181
- setExperimentAssignment(sessionId: string, experimentId: string, groupId: string): void {
182
- this.db.prepare(
183
- `INSERT OR IGNORE INTO experiment_assignments (session_id, experiment_id, group_id)
184
- VALUES (?, ?, ?)`
185
- ).run(sessionId, experimentId, groupId);
186
- }
187
-
188
- // ── Aggregates (H1: SQL-side GROUP BY for routes/rules/skill-stats) ───
189
- //
190
- // 这些 aggregate* 方法把原本 routes 层做的"全表 SELECT + JS reduce"下沉到
191
- // SQL 端,避免单进程内存放大。命名约定(spec H1 固化):
192
- // - aggregate* —— SQL 端 GROUP BY / COUNT,返回小结果
193
- // - query* —— 原始行返回(保留旧 API)
194
- //
195
- // 注意:所有方法都用 `ts > 0` 兜底,防止 strftime 在 ts<=0 时返回 NULL。
196
-
197
- /**
198
- * 一次性返回 rules + skill-stats 共用的 routing 汇总(4 个独立聚合,
199
- * 各走自己的索引)。不走 UNION ALL(SQLite 无 GROUPING SETS)。
200
- */
201
- aggregateRoutingStats(filter: { since_ts: number; project_path?: string }): {
202
- total: number;
203
- obeyed: number;
204
- refused: number;
205
- unknown: number;
206
- by_type: Array<{ type: 'agent' | 'skill' | 'none'; count: number }>;
207
- by_agent: Array<{ agent: string; count: number }>;
208
- by_skill_routed: Array<{ skill: string; count: number }>;
209
- } {
210
- const projectCond = filter.project_path ? 'AND project_path = @project' : '';
211
- const params = {
212
- since: filter.since_ts,
213
- project: filter.project_path ?? null,
214
- };
215
-
216
- const totalRow = this.db.prepare(`
217
- SELECT COUNT(*) AS total,
218
- SUM(CASE WHEN obeyed=1 THEN 1 ELSE 0 END) AS obeyed,
219
- SUM(CASE WHEN obeyed=0 THEN 1 ELSE 0 END) AS refused,
220
- SUM(CASE WHEN obeyed IS NULL THEN 1 ELSE 0 END) AS unknown
221
- FROM routing_events
222
- WHERE ts > 0 AND ts >= @since ${projectCond}
223
- `).get(params) as {
224
- total: number | null;
225
- obeyed: number | null;
226
- refused: number | null;
227
- unknown: number | null;
228
- };
229
-
230
- const byTypeRows = this.db.prepare(`
231
- SELECT COALESCE(routed_to_type, 'none') AS type, COUNT(*) AS count
232
- FROM routing_events
233
- WHERE ts > 0 AND ts >= @since ${projectCond}
234
- GROUP BY COALESCE(routed_to_type, 'none')
235
- ORDER BY count DESC
236
- `).all(params) as Array<{ type: 'agent' | 'skill' | 'none'; count: number }>;
237
-
238
- const byAgentRows = this.db.prepare(`
239
- SELECT routed_to_name AS agent, COUNT(*) AS count
240
- FROM routing_events
241
- WHERE ts > 0 AND ts >= @since AND obeyed = 1 AND routed_to_name IS NOT NULL ${projectCond}
242
- GROUP BY routed_to_name
243
- ORDER BY count DESC
244
- `).all(params) as Array<{ agent: string; count: number }>;
245
-
246
- const bySkillRoutedRows = this.db.prepare(`
247
- SELECT routed_to_name AS skill, COUNT(*) AS count
248
- FROM routing_events
249
- WHERE ts > 0 AND ts >= @since AND routed_to_type = 'skill' AND routed_to_name IS NOT NULL ${projectCond}
250
- GROUP BY routed_to_name
251
- ORDER BY count DESC
252
- `).all(params) as Array<{ skill: string; count: number }>;
253
-
254
- return {
255
- total: totalRow.total ?? 0,
256
- obeyed: totalRow.obeyed ?? 0,
257
- refused: totalRow.refused ?? 0,
258
- unknown: totalRow.unknown ?? 0,
259
- by_type: byTypeRows,
260
- by_agent: byAgentRows,
261
- by_skill_routed: bySkillRoutedRows,
262
- };
263
- }
264
-
265
- /**
266
- * 按天聚合 routing 事件,用于 skill-stats trend chart。
267
- * 时区固定 UTC(strftime + unixepoch),与旧实现的 `new Date(ts).toISOString().split('T')[0]` 一致。
268
- */
269
- aggregateRoutingTrendByDay(filter: { since_ts: number }): Array<{
270
- day: string;
271
- total: number;
272
- skill: number;
273
- }> {
274
- const rows = this.db.prepare(`
275
- SELECT strftime('%Y-%m-%d', ts / 1000, 'unixepoch') AS day,
276
- COUNT(*) AS total,
277
- SUM(CASE WHEN routed_to_type = 'skill' THEN 1 ELSE 0 END) AS skill
278
- FROM routing_events
279
- WHERE ts > 0 AND ts >= @since
280
- GROUP BY day
281
- ORDER BY day ASC
282
- `).all({ since: filter.since_ts }) as Array<{
283
- day: string | null;
284
- total: number;
285
- skill: number | null;
286
- }>;
287
- return rows
288
- .filter(r => r.day !== null)
289
- .map(r => ({ day: r.day as string, total: r.total, skill: r.skill ?? 0 }));
290
- }
291
-
292
- queryExperimentStats(experimentId: string): Array<{
293
- group_id: string;
294
- total: number;
295
- obeyed: number;
296
- refused: number;
297
- unknown: number;
298
- avg_classification_ms: number | null;
299
- }> {
300
- const rows = this.db.prepare(`
301
- SELECT
302
- experiment_group AS group_id,
303
- COUNT(*) AS total,
304
- SUM(CASE WHEN obeyed = 1 THEN 1 ELSE 0 END) AS obeyed,
305
- SUM(CASE WHEN obeyed = 0 THEN 1 ELSE 0 END) AS refused,
306
- SUM(CASE WHEN obeyed IS NULL THEN 1 ELSE 0 END) AS unknown,
307
- AVG(classification_ms) AS avg_classification_ms
308
- FROM routing_events
309
- WHERE experiment_id = ? AND experiment_group IS NOT NULL
310
- GROUP BY experiment_group
311
- ORDER BY experiment_group ASC
312
- `).all(experimentId) as Array<{
313
- group_id: string;
314
- total: number;
315
- obeyed: number;
316
- refused: number;
317
- unknown: number;
318
- avg_classification_ms: number | null;
319
- }>;
320
- return rows;
321
- }
322
- }
@@ -1,112 +0,0 @@
1
- /**
2
- * 数据库行的 TypeScript 类型定义。
3
- *
4
- * 每个 interface 对应一张表的查询结果行(shape 与 schema.sql + runMigrations 后
5
- * 的最终结构一致)。sqlite.ts 的所有 get/all 返回值都应该用这些类型而非 any,
6
- * 以确保 schema 变动能在编译期而不是运行期暴露。
7
- *
8
- * 约定:
9
- * - 字段可空性严格对齐 schema.sql 的 NOT NULL / DEFAULT NULL / 外键约束
10
- * - enum 字段(status / mode / trigger_type 等)使用 string literal union
11
- * - timestamp 字段按实际存储类型:文本时间戳 → string,Unix 毫秒数 → number
12
- */
13
-
14
- // ── events ────────────────────────────────────────────────────────────────
15
-
16
- export interface EventRow {
17
- event_id: string;
18
- session_id: string;
19
- project_path: string;
20
- timestamp: string;
21
- hook_type: 'PreToolUse' | 'PostToolUse' | 'UserPromptSubmit' | 'Notification' | 'Stop';
22
- tool_name: string | null;
23
- tool_input: string | null; // JSON string
24
- tool_output: string | null; // JSON string
25
- user_prompt: string | null;
26
- ai_response: string | null;
27
- created_at: string;
28
- }
29
-
30
- // ── sessions ──────────────────────────────────────────────────────────────
31
-
32
- export interface SessionRow {
33
- session_id: string;
34
- project_path: string;
35
- status: 'active' | 'completed' | 'interrupted' | 'resumed' | 'abandoned';
36
- first_prompt: string | null;
37
- start_time: string;
38
- end_time: string | null;
39
- last_event_time: string | null;
40
- event_count: number;
41
- created_at: string;
42
- updated_at: string;
43
- }
44
-
45
- // ── injections ────────────────────────────────────────────────────────────
46
-
47
- export interface InjectionRow {
48
- id: string;
49
- event_id: string | null;
50
- session_id: string;
51
- timestamp: string;
52
- source_handler: string;
53
- injection_type: 'systemMessage' | 'additionalContext' | 'reason';
54
- content: string;
55
- created_at: string;
56
- }
57
-
58
- // ── tasks ─────────────────────────────────────────────────────────────────
59
-
60
- export interface TaskRow {
61
- id: string;
62
- session_id: string;
63
- title: string;
64
- description: string | null;
65
- start_time: string;
66
- end_time: string | null;
67
- status: 'active' | 'completed' | 'abandoned';
68
- event_count: number;
69
- created_at: string;
70
- }
71
-
72
- // ── token_usage ───────────────────────────────────────────────────────────
73
-
74
- export interface TokenUsageRow {
75
- id: number;
76
- session_id: string;
77
- timestamp: number;
78
- input_tokens: number;
79
- output_tokens: number;
80
- total_tokens: number;
81
- model: string | null;
82
- tool_name: string | null;
83
- created_at: string;
84
- }
85
-
86
- // ── skill_invocations ─────────────────────────────────────────────────────
87
- // Skill 调用链路追踪:Agent 动态调用 Skill 的每一次记录。
88
- // invocation_type 区分静态依赖(agent frontmatter 声明)、动态调用(MCP 工具 `skill_invoke`)、
89
- // 以及 slash_command(用户直接通过 /skill-xxx 触发)。
90
-
91
- export interface SkillInvocationRow {
92
- id: string;
93
- route_request_id: string | null;
94
- session_id: string;
95
- agent_id: string | null;
96
- skill_id: string;
97
- invocation_type: 'static' | 'dynamic' | 'slash_command';
98
- reason: string | null;
99
-
100
- // 工作流追踪字段(v8.38+):从 reason 字段解析的 <workflow>/<phase>[:feature-slug] 元信息。
101
- // 解析失败或非工作流调用时所有字段为 null,以保持向后兼容。
102
- workflow: string | null; // 'bmad' / 'harness' / 其他工作流标识
103
- phase: string | null; // 'analyze' / 'design' / 'safety-net' 等
104
- feature_slug: string | null; // 可选,关联同一 feature 的多次调用
105
- artifact_path: string | null; // 可选,调用产出的文档路径
106
-
107
- depth: number;
108
- success: number; // SQLite 存储为 INTEGER (0 | 1)
109
- error: string | null;
110
- timestamp: number;
111
- created_at: string;
112
- }
@@ -1,224 +0,0 @@
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
- -- token_usage (LLM token accounting)
21
- -- └─ token_usage.session_id → events.session_id (logical, no FK)
22
- --
23
- -- Why no FK on routing_events / skill_invocations / token_usage:
24
- -- 1. routing_events.route_request_id is nullable and not UNIQUE — cannot be FK target
25
- -- 2. Write order is not guaranteed: skill_invocations may be written before routing_events
26
- -- 3. session_id references are maintained by application logic; sessions is an aggregate
27
- -- table that may lag behind event writes
28
- -- 4. Indexes on join columns provide equivalent query performance to FK indexes
29
- --
30
-
31
- -- ── Events & Sessions ─────────────────────────────────────────────────────
32
-
33
- CREATE TABLE IF NOT EXISTS events (
34
- event_id TEXT PRIMARY KEY,
35
- session_id TEXT NOT NULL,
36
- project_path TEXT NOT NULL,
37
- timestamp TEXT NOT NULL,
38
- hook_type TEXT NOT NULL CHECK(hook_type IN ('PreToolUse', 'PostToolUse', 'UserPromptSubmit', 'Notification', 'Stop')),
39
- tool_name TEXT,
40
- tool_input TEXT,
41
- tool_output TEXT,
42
- user_prompt TEXT,
43
- ai_response TEXT,
44
- distilled INTEGER DEFAULT 0,
45
- created_at TEXT DEFAULT (datetime('now'))
46
- );
47
-
48
- CREATE INDEX IF NOT EXISTS idx_events_session ON events(session_id);
49
- CREATE INDEX IF NOT EXISTS idx_events_project ON events(project_path);
50
- CREATE INDEX IF NOT EXISTS idx_events_timestamp ON events(timestamp DESC);
51
- CREATE INDEX IF NOT EXISTS idx_events_distilled ON events(distilled);
52
- CREATE INDEX IF NOT EXISTS idx_events_hook_type ON events(hook_type);
53
-
54
- CREATE TABLE IF NOT EXISTS sessions (
55
- session_id TEXT PRIMARY KEY,
56
- project_path TEXT NOT NULL,
57
- status TEXT NOT NULL DEFAULT 'active' CHECK(status IN ('active', 'completed', 'interrupted', 'resumed', 'abandoned')),
58
- first_prompt TEXT,
59
- start_time TEXT NOT NULL,
60
- end_time TEXT,
61
- last_event_time TEXT,
62
- event_count INTEGER DEFAULT 0,
63
- created_at TEXT DEFAULT (datetime('now')),
64
- updated_at TEXT DEFAULT (datetime('now'))
65
- );
66
-
67
- CREATE INDEX IF NOT EXISTS idx_sessions_project ON sessions(project_path);
68
- CREATE INDEX IF NOT EXISTS idx_sessions_status ON sessions(status);
69
- CREATE INDEX IF NOT EXISTS idx_sessions_start_time ON sessions(start_time DESC);
70
-
71
- -- ── Injections ─────────────────────────────────────────────────────
72
-
73
- CREATE TABLE IF NOT EXISTS injections (
74
- id TEXT PRIMARY KEY,
75
- event_id TEXT,
76
- session_id TEXT NOT NULL,
77
- timestamp TEXT NOT NULL,
78
- source_handler TEXT NOT NULL,
79
- injection_type TEXT NOT NULL CHECK(injection_type IN ('systemMessage', 'additionalContext', 'reason')),
80
- content TEXT NOT NULL,
81
- created_at TEXT DEFAULT (datetime('now')),
82
- FOREIGN KEY (event_id) REFERENCES events(event_id) ON DELETE CASCADE
83
- );
84
-
85
- CREATE INDEX IF NOT EXISTS idx_injections_session ON injections(session_id);
86
- CREATE INDEX IF NOT EXISTS idx_injections_event ON injections(event_id);
87
- CREATE INDEX IF NOT EXISTS idx_injections_timestamp ON injections(timestamp DESC);
88
-
89
- -- ── Tasks ──────────────────────────────────────────────────────────
90
-
91
- CREATE TABLE IF NOT EXISTS tasks (
92
- id TEXT PRIMARY KEY,
93
- session_id TEXT NOT NULL,
94
- title TEXT NOT NULL,
95
- description TEXT,
96
- start_time TEXT NOT NULL,
97
- end_time TEXT,
98
- status TEXT DEFAULT 'active' CHECK(status IN ('active', 'completed', 'abandoned')),
99
- event_count INTEGER DEFAULT 0,
100
- created_at TEXT DEFAULT (datetime('now'))
101
- );
102
-
103
- CREATE TABLE IF NOT EXISTS task_events (
104
- task_id TEXT NOT NULL,
105
- event_id TEXT NOT NULL,
106
- PRIMARY KEY (task_id, event_id),
107
- FOREIGN KEY (task_id) REFERENCES tasks(id) ON DELETE CASCADE,
108
- FOREIGN KEY (event_id) REFERENCES events(event_id) ON DELETE CASCADE
109
- );
110
-
111
- CREATE INDEX IF NOT EXISTS idx_tasks_session ON tasks(session_id);
112
- CREATE INDEX IF NOT EXISTS idx_tasks_start_time ON tasks(start_time DESC);
113
- CREATE INDEX IF NOT EXISTS idx_task_events_task ON task_events(task_id);
114
- CREATE INDEX IF NOT EXISTS idx_task_events_event ON task_events(event_id);
115
-
116
- -- ── Routing Events (agent routing observability) ─────────────────────────
117
-
118
- CREATE TABLE IF NOT EXISTS routing_events (
119
- id INTEGER PRIMARY KEY AUTOINCREMENT,
120
- session_id TEXT NOT NULL,
121
- route_request_id TEXT,
122
- project_path TEXT NOT NULL,
123
- ts INTEGER NOT NULL,
124
- prompt TEXT NOT NULL,
125
- intent_json TEXT NOT NULL,
126
- routed_to_type TEXT,
127
- routed_to_name TEXT,
128
- is_forced INTEGER DEFAULT 0,
129
- obeyed INTEGER,
130
- classification_ms INTEGER,
131
- fallback_used INTEGER DEFAULT 0,
132
- refusal_reason TEXT,
133
- first_tool_name TEXT,
134
- first_tool_ts INTEGER,
135
- completed_ts INTEGER,
136
- total_execution_ms INTEGER,
137
- completion_reason TEXT,
138
- downstream_task_chain TEXT,
139
- injection_version TEXT,
140
- experiment_id TEXT,
141
- experiment_group TEXT,
142
- skill_confidence REAL,
143
- skill_source TEXT,
144
- created_at TEXT DEFAULT (datetime('now'))
145
- );
146
-
147
- CREATE INDEX IF NOT EXISTS idx_routing_events_session ON routing_events(session_id);
148
- CREATE INDEX IF NOT EXISTS idx_routing_events_route_request ON routing_events(route_request_id);
149
- CREATE INDEX IF NOT EXISTS idx_routing_events_ts ON routing_events(ts DESC);
150
- CREATE INDEX IF NOT EXISTS idx_routing_events_agent ON routing_events(routed_to_name, obeyed);
151
- CREATE INDEX IF NOT EXISTS idx_routing_events_obeyed ON routing_events(obeyed);
152
- CREATE INDEX IF NOT EXISTS idx_routing_events_experiment ON routing_events(experiment_id, experiment_group);
153
-
154
- -- ── Token Usage ──────────────────────────────────────────────────────
155
-
156
- CREATE TABLE IF NOT EXISTS token_usage (
157
- id INTEGER PRIMARY KEY AUTOINCREMENT,
158
- session_id TEXT NOT NULL, -- logical ref → events.session_id; no FK due to write-order race (sessions is aggregate, may lag)
159
- timestamp INTEGER NOT NULL,
160
- input_tokens INTEGER NOT NULL,
161
- output_tokens INTEGER NOT NULL,
162
- total_tokens INTEGER NOT NULL,
163
- model TEXT,
164
- tool_name TEXT,
165
- created_at TEXT DEFAULT (datetime('now'))
166
- );
167
-
168
- CREATE INDEX IF NOT EXISTS idx_token_usage_session ON token_usage(session_id);
169
- CREATE INDEX IF NOT EXISTS idx_token_usage_timestamp ON token_usage(timestamp DESC);
170
-
171
- -- ── Skill Invocations ─────────────────────────────────────────────────
172
-
173
- CREATE TABLE IF NOT EXISTS skill_invocations (
174
- id TEXT PRIMARY KEY,
175
- route_request_id TEXT,
176
- session_id TEXT NOT NULL,
177
- agent_id TEXT,
178
- skill_id TEXT NOT NULL,
179
- invocation_type TEXT NOT NULL,
180
- reason TEXT,
181
- workflow TEXT,
182
- phase TEXT,
183
- feature_slug TEXT,
184
- artifact_path TEXT,
185
- depth INTEGER DEFAULT 0,
186
- success INTEGER DEFAULT 1,
187
- error TEXT,
188
- timestamp INTEGER NOT NULL,
189
- created_at TEXT DEFAULT (datetime('now'))
190
- );
191
-
192
- CREATE INDEX IF NOT EXISTS idx_skill_invocations_route_request ON skill_invocations(route_request_id);
193
- CREATE INDEX IF NOT EXISTS idx_skill_invocations_session ON skill_invocations(session_id);
194
- CREATE INDEX IF NOT EXISTS idx_skill_invocations_skill ON skill_invocations(skill_id);
195
- CREATE INDEX IF NOT EXISTS idx_skill_invocations_timestamp ON skill_invocations(timestamp DESC);
196
-
197
- -- ── Composite Indexes (high-frequency query optimization) ─────────────────────
198
- -- These cover session-scoped queries that filter by session_id then sort by time.
199
- -- Existing single-column indexes are retained for other query paths.
200
-
201
- CREATE INDEX IF NOT EXISTS idx_events_session_ts ON events(session_id, timestamp DESC);
202
- CREATE INDEX IF NOT EXISTS idx_routing_events_session_ts ON routing_events(session_id, ts DESC);
203
- CREATE INDEX IF NOT EXISTS idx_skill_invocations_session_ts ON skill_invocations(session_id, timestamp DESC);
204
-
205
- -- ── Additional Performance Indexes (Phase 1 Refactor) ─────────────────────
206
-
207
- -- routing_events: optimize obeyed flag queries with time sorting
208
- CREATE INDEX IF NOT EXISTS idx_routing_events_obeyed_ts ON routing_events(obeyed, ts DESC);
209
-
210
- -- tasks: optimize filter+sort queries (start_time range filter + session join)
211
- CREATE INDEX IF NOT EXISTS idx_tasks_start_time_session ON tasks(start_time DESC, session_id);
212
-
213
- -- events: optimize session + hook_type composite queries
214
- CREATE INDEX IF NOT EXISTS idx_events_session_hook ON events(session_id, hook_type, timestamp DESC);
215
-
216
- -- injections: optimize session + handler composite queries
217
- CREATE INDEX IF NOT EXISTS idx_injections_session_handler ON injections(session_id, source_handler);
218
-
219
- -- routing_events: optimize routed_to_type distribution (H1 aggregate path)
220
- CREATE INDEX IF NOT EXISTS idx_routing_events_type_ts ON routing_events(routed_to_type, ts DESC);
221
-
222
- -- skill_invocations: optimize workflow/phase and feature_slug queries (H4 dedup: previously migration-only)
223
- CREATE INDEX IF NOT EXISTS idx_skill_invocations_workflow ON skill_invocations(workflow, phase);
224
- CREATE INDEX IF NOT EXISTS idx_skill_invocations_feature ON skill_invocations(feature_slug);