@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.
Files changed (367) hide show
  1. package/CLAUDE.md +7 -7
  2. package/dist/claudemd/claudemd-generator.d.ts.map +1 -1
  3. package/dist/claudemd/claudemd-generator.js +27 -237
  4. package/dist/claudemd/claudemd-generator.js.map +1 -1
  5. package/dist/claudemd/resume-manager.js +1 -1
  6. package/dist/claudemd/resume-manager.js.map +1 -1
  7. package/dist/claudemd/templates/swarm-protocol.md +222 -0
  8. package/dist/cli/commands/daemon.js +6 -6
  9. package/dist/cli/commands/daemon.js.map +1 -1
  10. package/dist/cli/commands/executions.d.ts.map +1 -1
  11. package/dist/cli/commands/executions.js +4 -3
  12. package/dist/cli/commands/executions.js.map +1 -1
  13. package/dist/cli/commands/init.js +2 -2
  14. package/dist/cli/commands/init.js.map +1 -1
  15. package/dist/cli/commands/logs.js.map +1 -1
  16. package/dist/cli/commands/mcp.d.ts.map +1 -1
  17. package/dist/cli/commands/mcp.js +3 -5
  18. package/dist/cli/commands/mcp.js.map +1 -1
  19. package/dist/cli/commands/menu.d.ts.map +1 -1
  20. package/dist/cli/commands/menu.js +4 -3
  21. package/dist/cli/commands/menu.js.map +1 -1
  22. package/dist/cli/commands/stats.d.ts.map +1 -1
  23. package/dist/cli/commands/stats.js +2 -3
  24. package/dist/cli/commands/stats.js.map +1 -1
  25. package/dist/cli/commands/status.js +2 -2
  26. package/dist/cli/commands/status.js.map +1 -1
  27. package/dist/cli/commands/trace.d.ts.map +1 -1
  28. package/dist/cli/commands/trace.js +11 -23
  29. package/dist/cli/commands/trace.js.map +1 -1
  30. package/dist/cli/init/hook-manager.d.ts.map +1 -1
  31. package/dist/cli/init/hook-manager.js +2 -2
  32. package/dist/cli/init/hook-manager.js.map +1 -1
  33. package/dist/core/ai/provider.js +2 -2
  34. package/dist/core/ai/provider.js.map +1 -1
  35. package/dist/core/constants.d.ts +12 -1
  36. package/dist/core/constants.d.ts.map +1 -1
  37. package/dist/core/constants.js +15 -1
  38. package/dist/core/constants.js.map +1 -1
  39. package/dist/core/event-fields.d.ts +16 -0
  40. package/dist/core/event-fields.d.ts.map +1 -0
  41. package/dist/core/event-fields.js +19 -0
  42. package/dist/core/event-fields.js.map +1 -0
  43. package/dist/core/queue/index.d.ts.map +1 -1
  44. package/dist/core/queue/index.js +3 -4
  45. package/dist/core/queue/index.js.map +1 -1
  46. package/dist/core/storage/base.d.ts +36 -3
  47. package/dist/core/storage/base.d.ts.map +1 -1
  48. package/dist/core/storage/base.js +101 -58
  49. package/dist/core/storage/base.js.map +1 -1
  50. package/dist/core/storage/events.d.ts +92 -3
  51. package/dist/core/storage/events.d.ts.map +1 -1
  52. package/dist/core/storage/events.js +147 -0
  53. package/dist/core/storage/events.js.map +1 -1
  54. package/dist/core/storage/routing.d.ts +54 -1
  55. package/dist/core/storage/routing.d.ts.map +1 -1
  56. package/dist/core/storage/routing.js +99 -1
  57. package/dist/core/storage/routing.js.map +1 -1
  58. package/dist/core/storage/schema.sql +12 -2
  59. package/dist/core/storage/sessions.d.ts +20 -0
  60. package/dist/core/storage/sessions.d.ts.map +1 -1
  61. package/dist/core/storage/sessions.js +59 -0
  62. package/dist/core/storage/sessions.js.map +1 -1
  63. package/dist/core/storage/skills.d.ts +23 -0
  64. package/dist/core/storage/skills.d.ts.map +1 -1
  65. package/dist/core/storage/skills.js +47 -0
  66. package/dist/core/storage/skills.js.map +1 -1
  67. package/dist/core/storage/sqlite.d.ts +35 -2
  68. package/dist/core/storage/sqlite.d.ts.map +1 -1
  69. package/dist/core/storage/sqlite.js +93 -4
  70. package/dist/core/storage/sqlite.js.map +1 -1
  71. package/dist/core/storage/tasks.d.ts +49 -0
  72. package/dist/core/storage/tasks.d.ts.map +1 -1
  73. package/dist/core/storage/tasks.js +143 -1
  74. package/dist/core/storage/tasks.js.map +1 -1
  75. package/dist/core/storage/token-usage.d.ts +1 -1
  76. package/dist/core/storage/token-usage.d.ts.map +1 -1
  77. package/dist/core/storage/token-usage.js +1 -1
  78. package/dist/core/storage/token-usage.js.map +1 -1
  79. package/dist/core/types.d.ts +24 -3
  80. package/dist/core/types.d.ts.map +1 -1
  81. package/dist/core/types.js.map +1 -1
  82. package/dist/core/utils/error-handler.d.ts.map +1 -1
  83. package/dist/core/utils/error-handler.js +3 -2
  84. package/dist/core/utils/error-handler.js.map +1 -1
  85. package/dist/core/utils/git.d.ts +10 -0
  86. package/dist/core/utils/git.d.ts.map +1 -0
  87. package/dist/core/utils/git.js +24 -0
  88. package/dist/core/utils/git.js.map +1 -0
  89. package/dist/core/utils/logger.d.ts.map +1 -1
  90. package/dist/core/utils/logger.js +15 -1
  91. package/dist/core/utils/logger.js.map +1 -1
  92. package/dist/core/utils/lru-cache.d.ts +1 -0
  93. package/dist/core/utils/lru-cache.d.ts.map +1 -1
  94. package/dist/core/utils/lru-cache.js +3 -0
  95. package/dist/core/utils/lru-cache.js.map +1 -1
  96. package/dist/core/utils/token-tracker.js +1 -1
  97. package/dist/core/utils/token-tracker.js.map +1 -1
  98. package/dist/daemon/event-parser.d.ts.map +1 -1
  99. package/dist/daemon/event-parser.js +2 -1
  100. package/dist/daemon/event-parser.js.map +1 -1
  101. package/dist/daemon/handlers/history-exporter.js.map +1 -1
  102. package/dist/daemon/handlers/post-tool-use.d.ts.map +1 -1
  103. package/dist/daemon/handlers/post-tool-use.js +7 -3
  104. package/dist/daemon/handlers/post-tool-use.js.map +1 -1
  105. package/dist/daemon/handlers/stop.d.ts +4 -0
  106. package/dist/daemon/handlers/stop.d.ts.map +1 -1
  107. package/dist/daemon/handlers/stop.js +23 -35
  108. package/dist/daemon/handlers/stop.js.map +1 -1
  109. package/dist/daemon/handlers/user-prompt.d.ts +3 -3
  110. package/dist/daemon/handlers/user-prompt.d.ts.map +1 -1
  111. package/dist/daemon/handlers/user-prompt.js +12 -22
  112. package/dist/daemon/handlers/user-prompt.js.map +1 -1
  113. package/dist/daemon/hook-sync.d.ts +17 -0
  114. package/dist/daemon/hook-sync.d.ts.map +1 -0
  115. package/dist/daemon/hook-sync.js +74 -0
  116. package/dist/daemon/hook-sync.js.map +1 -0
  117. package/dist/daemon/index.d.ts.map +1 -1
  118. package/dist/daemon/index.js +33 -9
  119. package/dist/daemon/index.js.map +1 -1
  120. package/dist/daemon/lifecycle.js +3 -4
  121. package/dist/daemon/lifecycle.js.map +1 -1
  122. package/dist/daemon/server.d.ts +6 -4
  123. package/dist/daemon/server.d.ts.map +1 -1
  124. package/dist/daemon/server.js +76 -85
  125. package/dist/daemon/server.js.map +1 -1
  126. package/dist/daemon/services/task-segmenter.js +1 -1
  127. package/dist/daemon/services/task-segmenter.js.map +1 -1
  128. package/dist/hooks/hook-lib.sh +37 -0
  129. package/dist/hooks/notification.sh +2 -2
  130. package/dist/hooks/post-tool-use.sh +2 -2
  131. package/dist/hooks/pre-tool-use.sh +2 -2
  132. package/dist/hooks/stop.sh +9 -6
  133. package/dist/hooks/user-prompt-submit.sh +2 -2
  134. package/dist/{daemon/services → web/analytics}/anti-pattern-detector.d.ts +3 -4
  135. package/dist/web/analytics/anti-pattern-detector.d.ts.map +1 -0
  136. package/dist/{daemon/services → web/analytics}/anti-pattern-detector.js +7 -46
  137. package/dist/{daemon/services → web/analytics}/anti-pattern-detector.js.map +1 -1
  138. package/dist/web/analytics/drift-detector.d.ts.map +1 -0
  139. package/dist/{daemon/services → web/analytics}/drift-detector.js +10 -13
  140. package/dist/web/analytics/drift-detector.js.map +1 -0
  141. package/dist/web/analytics/weekly-report.d.ts.map +1 -0
  142. package/dist/{daemon/services → web/analytics}/weekly-report.js +51 -50
  143. package/dist/web/analytics/weekly-report.js.map +1 -0
  144. package/dist/web/auth-middleware.d.ts.map +1 -1
  145. package/dist/web/auth-middleware.js +1 -2
  146. package/dist/web/auth-middleware.js.map +1 -1
  147. package/dist/web/routes/_helpers.d.ts +16 -0
  148. package/dist/web/routes/_helpers.d.ts.map +1 -0
  149. package/dist/web/routes/_helpers.js +32 -0
  150. package/dist/web/routes/_helpers.js.map +1 -0
  151. package/dist/web/routes/drift.js +1 -1
  152. package/dist/web/routes/drift.js.map +1 -1
  153. package/dist/web/routes/insights.js +1 -1
  154. package/dist/web/routes/insights.js.map +1 -1
  155. package/dist/web/routes/reports.js +1 -1
  156. package/dist/web/routes/reports.js.map +1 -1
  157. package/dist/web/routes/rules.d.ts +3 -0
  158. package/dist/web/routes/rules.d.ts.map +1 -1
  159. package/dist/web/routes/rules.js +28 -52
  160. package/dist/web/routes/rules.js.map +1 -1
  161. package/dist/web/routes/sessions.d.ts.map +1 -1
  162. package/dist/web/routes/sessions.js +16 -30
  163. package/dist/web/routes/sessions.js.map +1 -1
  164. package/dist/web/routes/skill-stats.d.ts +2 -0
  165. package/dist/web/routes/skill-stats.d.ts.map +1 -1
  166. package/dist/web/routes/skill-stats.js +28 -64
  167. package/dist/web/routes/skill-stats.js.map +1 -1
  168. package/dist/web/routes/skills.d.ts.map +1 -1
  169. package/dist/web/routes/skills.js +5 -4
  170. package/dist/web/routes/skills.js.map +1 -1
  171. package/dist/web/routes/stats.d.ts +4 -0
  172. package/dist/web/routes/stats.d.ts.map +1 -1
  173. package/dist/web/routes/stats.js +19 -21
  174. package/dist/web/routes/stats.js.map +1 -1
  175. package/dist/web/routes/tasks.d.ts.map +1 -1
  176. package/dist/web/routes/tasks.js +17 -42
  177. package/dist/web/routes/tasks.js.map +1 -1
  178. package/dist/web/routes/trace.d.ts.map +1 -1
  179. package/dist/web/routes/trace.js +7 -17
  180. package/dist/web/routes/trace.js.map +1 -1
  181. package/dist/web/routes/types.d.ts.map +1 -1
  182. package/dist/web/routes/types.js +4 -3
  183. package/dist/web/routes/types.js.map +1 -1
  184. package/dist/web/static/assets/{AIConfig-BQCAQE9D.js → AIConfig-CdDWzJyO.js} +2 -2
  185. package/dist/web/static/assets/{AIConfig-BQCAQE9D.js.map → AIConfig-CdDWzJyO.js.map} +1 -1
  186. package/dist/web/static/assets/{Dashboard-D7Bo6Kan.js → Dashboard-CoEmmIDt.js} +2 -2
  187. package/dist/web/static/assets/{Dashboard-D7Bo6Kan.js.map → Dashboard-CoEmmIDt.js.map} +1 -1
  188. package/dist/web/static/assets/{Drawer-BeHRQxUS.js → Drawer-DdRTzlLB.js} +2 -2
  189. package/dist/web/static/assets/{Drawer-BeHRQxUS.js.map → Drawer-DdRTzlLB.js.map} +1 -1
  190. package/dist/web/static/assets/{Events-K_tCY2ti.js → Events-DrIq1SUS.js} +2 -2
  191. package/dist/web/static/assets/{Events-K_tCY2ti.js.map → Events-DrIq1SUS.js.map} +1 -1
  192. package/dist/web/static/assets/{Reports-BJCmBnc_.js → Reports-DFBM3MDK.js} +2 -2
  193. package/dist/web/static/assets/{Reports-BJCmBnc_.js.map → Reports-DFBM3MDK.js.map} +1 -1
  194. package/dist/web/static/assets/{SearchInput-BX2KhMkw.js → SearchInput-qCj_jAcf.js} +2 -2
  195. package/dist/web/static/assets/{SearchInput-BX2KhMkw.js.map → SearchInput-qCj_jAcf.js.map} +1 -1
  196. package/dist/web/static/assets/{SessionDetail-Bkr-kC7V.js → SessionDetail-CCzwdoT7.js} +2 -2
  197. package/dist/web/static/assets/{SessionDetail-Bkr-kC7V.js.map → SessionDetail-CCzwdoT7.js.map} +1 -1
  198. package/dist/web/static/assets/{Sessions-Chx9OCLH.js → Sessions-FfLYkAw9.js} +2 -2
  199. package/dist/web/static/assets/{Sessions-Chx9OCLH.js.map → Sessions-FfLYkAw9.js.map} +1 -1
  200. package/dist/web/static/assets/{Skills-O0GT1i7m.js → Skills-C8Gvs3Qa.js} +2 -2
  201. package/dist/web/static/assets/{Skills-O0GT1i7m.js.map → Skills-C8Gvs3Qa.js.map} +1 -1
  202. package/dist/web/static/assets/TaskDetail-BS8pYhaR.js +2 -0
  203. package/dist/web/static/assets/TaskDetail-BS8pYhaR.js.map +1 -0
  204. package/dist/web/static/assets/Tasks-CyuhizG8.js +2 -0
  205. package/dist/web/static/assets/Tasks-CyuhizG8.js.map +1 -0
  206. package/dist/web/static/assets/index-CBX47X8l.js +3 -0
  207. package/dist/web/static/assets/{index-DxIbmNmr.js.map → index-CBX47X8l.js.map} +1 -1
  208. package/dist/web/static/assets/index-DjIoMdoR.css +1 -0
  209. package/dist/web/static/assets/{lucide-fJlPI3H7.js → lucide-Bs_edTLa.js} +44 -39
  210. package/dist/web/static/assets/lucide-Bs_edTLa.js.map +1 -0
  211. package/dist/web/static/assets/react-router-r79dBVy4.js +20 -0
  212. package/dist/web/static/assets/{react-router-I-HqunH7.js.map → react-router-r79dBVy4.js.map} +1 -1
  213. package/dist/web/static/assets/task-title-BhOcemuR.js +2 -0
  214. package/dist/web/static/assets/task-title-BhOcemuR.js.map +1 -0
  215. package/dist/web/static/index.html +4 -4
  216. package/docs/design/h1-storage-aggregation-spec-20260518-1121.md +299 -0
  217. package/docs/design/h2-getdatabase-encapsulation-spec-20260518-1450.md +191 -0
  218. package/docs/design/h3-fallback-removal-spec-20260518-1245.md +76 -0
  219. package/docs/design/h4-index-dedup-spec-20260518-1230.md +109 -0
  220. package/docs/design/h6-services-migration-spec-20260518-1355.md +82 -0
  221. package/docs/design/l1-swarm-protocol-extract-spec-20260518-1605.md +106 -0
  222. package/docs/design/m10-forge-paths-spec-20260518-1320.md +121 -0
  223. package/docs/design/m2-m3-tool-input-spec-20260518-1425.md +131 -0
  224. package/docs/design/m7-routing-event-association-spec-20260518-1545.md +103 -0
  225. package/docs/design/project-path-gitroot-spec-20260518-1715.md +134 -0
  226. package/docs/design/task-active-gc-spec-20260518-1745.md +146 -0
  227. package/docs/implementation/h1-storage-aggregation-changelog-20260518-1121.md +82 -0
  228. package/docs/implementation/h2-final-changelog-20260518-1530.md +61 -0
  229. package/docs/implementation/h2-phase1-safety-net-changelog-20260518-1450.md +70 -0
  230. package/docs/implementation/h2-phase2-operations-changelog-20260518-1450.md +120 -0
  231. package/docs/implementation/h2-phase3-callsites-changelog-20260518-1450.md +71 -0
  232. package/docs/implementation/h3-fallback-removal-changelog-20260518-1245.md +71 -0
  233. package/docs/implementation/h4-index-dedup-changelog-20260518-1230.md +60 -0
  234. package/docs/implementation/h6-services-migration-changelog-20260518-1355.md +46 -0
  235. package/docs/implementation/h7-m9-defaults-changelog-20260518-1300.md +46 -0
  236. package/docs/implementation/l1-swarm-protocol-extract-changelog-20260518-1605.md +45 -0
  237. package/docs/implementation/l3-l4-daemon-perf-changelog-20260518-1410.md +63 -0
  238. package/docs/implementation/l6-l8-final-cleanup-changelog-20260518-1640.md +38 -0
  239. package/docs/implementation/m1-m4-m5-l7-cleanup-changelog-20260518-1310.md +58 -0
  240. package/docs/implementation/m10-forge-paths-changelog-20260518-1320.md +60 -0
  241. package/docs/implementation/m2-m3-tool-input-changelog-20260518-1425.md +43 -0
  242. package/docs/implementation/m6-m8-naming-shutdown-changelog-20260518-1340.md +56 -0
  243. package/docs/implementation/m7-routing-association-changelog-20260518-1545.md +69 -0
  244. package/docs/implementation/project-path-gitroot-changelog-20260518-1715.md +63 -0
  245. package/docs/implementation/task-active-gc-changelog-20260518-1745.md +35 -0
  246. package/docs/implementation/task-title-summary-changelog-20260518-1130.md +39 -0
  247. package/docs/implementation/tasks-detail-back-loses-filters-changelog-20260518-1100.md +22 -0
  248. package/docs/implementation/tasks-page-white-screen-hotfix-changelog-20260518-1015.md +56 -0
  249. package/docs/reviews/task-title-summary.md +92 -0
  250. package/docs/reviews/tasks-detail-back-loses-filters.md +58 -0
  251. package/docs/reviews/tasks-page-white-screen-hotfix.md +126 -0
  252. package/package.json +2 -2
  253. package/src/claudemd/claudemd-generator.ts +29 -238
  254. package/src/claudemd/resume-manager.ts +1 -1
  255. package/src/claudemd/templates/swarm-protocol.md +222 -0
  256. package/src/cli/commands/daemon.ts +6 -6
  257. package/src/cli/commands/executions.ts +4 -3
  258. package/src/cli/commands/init.ts +2 -2
  259. package/src/cli/commands/logs.ts +1 -1
  260. package/src/cli/commands/mcp.ts +3 -5
  261. package/src/cli/commands/menu.ts +4 -3
  262. package/src/cli/commands/stats.ts +2 -3
  263. package/src/cli/commands/status.ts +2 -2
  264. package/src/cli/commands/trace.ts +10 -26
  265. package/src/cli/init/hook-manager.ts +2 -2
  266. package/src/core/ai/provider.ts +2 -2
  267. package/src/core/constants.ts +18 -1
  268. package/src/core/event-fields.ts +32 -0
  269. package/src/core/queue/index.ts +3 -4
  270. package/src/core/storage/base.ts +132 -56
  271. package/src/core/storage/events.ts +183 -4
  272. package/src/core/storage/routing.ts +129 -1
  273. package/src/core/storage/schema.sql +12 -2
  274. package/src/core/storage/sessions.ts +64 -0
  275. package/src/core/storage/skills.ts +69 -0
  276. package/src/core/storage/sqlite.ts +103 -4
  277. package/src/core/storage/tasks.ts +149 -1
  278. package/src/core/storage/token-usage.ts +1 -1
  279. package/src/core/types.ts +30 -3
  280. package/src/core/utils/error-handler.ts +3 -2
  281. package/src/core/utils/git.ts +23 -0
  282. package/src/core/utils/logger.ts +16 -1
  283. package/src/core/utils/lru-cache.ts +4 -0
  284. package/src/core/utils/token-tracker.ts +1 -1
  285. package/src/daemon/event-parser.ts +4 -3
  286. package/src/daemon/handlers/history-exporter.ts +1 -1
  287. package/src/daemon/handlers/post-tool-use.ts +7 -3
  288. package/src/daemon/handlers/stop.ts +32 -39
  289. package/src/daemon/handlers/user-prompt.ts +12 -22
  290. package/src/daemon/hook-sync.ts +91 -0
  291. package/src/daemon/index.ts +34 -10
  292. package/src/daemon/lifecycle.ts +3 -3
  293. package/src/daemon/server.ts +76 -89
  294. package/src/daemon/services/task-segmenter.ts +1 -1
  295. package/src/hooks/hook-lib.sh +37 -0
  296. package/src/hooks/notification.sh +2 -2
  297. package/src/hooks/post-tool-use.sh +2 -2
  298. package/src/hooks/pre-tool-use.sh +2 -2
  299. package/src/hooks/stop.sh +9 -6
  300. package/src/hooks/user-prompt-submit.sh +2 -2
  301. package/src/{daemon/services → web/analytics}/anti-pattern-detector.ts +9 -54
  302. package/src/{daemon/services → web/analytics}/drift-detector.ts +10 -23
  303. package/src/{daemon/services → web/analytics}/weekly-report.ts +52 -75
  304. package/src/web/auth-middleware.ts +1 -2
  305. package/src/web/routes/_helpers.ts +34 -0
  306. package/src/web/routes/drift.ts +1 -1
  307. package/src/web/routes/insights.ts +1 -1
  308. package/src/web/routes/reports.ts +1 -1
  309. package/src/web/routes/rules.ts +31 -56
  310. package/src/web/routes/sessions.ts +18 -30
  311. package/src/web/routes/skill-stats.ts +29 -69
  312. package/src/web/routes/skills.ts +5 -4
  313. package/src/web/routes/stats.ts +19 -29
  314. package/src/web/routes/tasks.ts +17 -42
  315. package/src/web/routes/trace.ts +7 -19
  316. package/src/web/routes/types.ts +4 -3
  317. package/tests/integration/claudemd-generator.test.ts +90 -0
  318. package/tests/integration/web-analytics.integration.test.ts +133 -0
  319. package/tests/integration/web-stats.integration.test.ts +135 -0
  320. package/tests/integration/web-trace.integration.test.ts +175 -0
  321. package/tests/unit/core/forge-paths.test.ts +99 -0
  322. package/tests/unit/daemon/hook-sync.test.ts +71 -0
  323. package/tests/unit/daemon/post-tool-use.test.ts +121 -0
  324. package/tests/unit/daemon/stop-handler-behavior-summary.test.ts +202 -0
  325. package/tests/unit/daemon/task-segmenter-recover.test.ts +84 -0
  326. package/tests/unit/event-fields.test.ts +88 -0
  327. package/tests/unit/event-parser.test.ts +55 -0
  328. package/tests/unit/hooks/resolve-project-path.test.ts +122 -0
  329. package/tests/unit/socket-server.test.ts +183 -0
  330. package/tests/unit/storage/event-operations-aggregates.test.ts +342 -0
  331. package/tests/unit/storage/migration-idempotent.test.ts +304 -0
  332. package/tests/unit/storage/routing-aggregates.test.ts +276 -0
  333. package/tests/unit/storage/routing.test.ts +117 -0
  334. package/tests/unit/storage/schema-missing.test.ts +81 -0
  335. package/tests/unit/storage/session-operations-aggregates.test.ts +120 -0
  336. package/tests/unit/storage/skill-operations-counts.test.ts +106 -0
  337. package/tests/unit/storage/skills-aggregates.test.ts +104 -0
  338. package/tests/unit/storage/sqlite-refactor-harness.test.ts +3 -3
  339. package/tests/unit/storage/task-operations-counts.test.ts +46 -0
  340. package/tests/unit/storage/tasks-getById.test.ts +343 -0
  341. package/tests/unit/storage/tasks-stale-gc.test.ts +86 -0
  342. package/tests/unit/token-usage.test.ts +6 -6
  343. package/tests/unit/web/navigation-back-contract.test.ts +134 -0
  344. package/tests/unit/web/routes-rules.test.ts +182 -0
  345. package/tests/unit/web/routes-tasks.test.ts +34 -0
  346. package/tests/unit/web/task-title-contract.test.ts +210 -0
  347. package/tests/unit/web/tasks-component-contract.test.ts +179 -0
  348. package/vitest.config.ts +1 -1
  349. package/web/src/pages/TaskDetail.tsx +9 -5
  350. package/web/src/pages/Tasks.tsx +315 -50
  351. package/web/src/utils/navigation.ts +25 -0
  352. package/web/src/utils/task-title.ts +49 -0
  353. package/dist/daemon/services/anti-pattern-detector.d.ts.map +0 -1
  354. package/dist/daemon/services/drift-detector.d.ts.map +0 -1
  355. package/dist/daemon/services/drift-detector.js.map +0 -1
  356. package/dist/daemon/services/weekly-report.d.ts.map +0 -1
  357. package/dist/daemon/services/weekly-report.js.map +0 -1
  358. package/dist/web/static/assets/TaskDetail-5SR8zGzv.js +0 -2
  359. package/dist/web/static/assets/TaskDetail-5SR8zGzv.js.map +0 -1
  360. package/dist/web/static/assets/Tasks-DCgDqvOZ.js +0 -2
  361. package/dist/web/static/assets/Tasks-DCgDqvOZ.js.map +0 -1
  362. package/dist/web/static/assets/index-D8AKj26b.css +0 -1
  363. package/dist/web/static/assets/index-DxIbmNmr.js +0 -3
  364. package/dist/web/static/assets/lucide-fJlPI3H7.js.map +0 -1
  365. package/dist/web/static/assets/react-router-I-HqunH7.js +0 -20
  366. /package/dist/{daemon/services → web/analytics}/drift-detector.d.ts +0 -0
  367. /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 或 inline fallback
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.runMigrations();
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
- const schema = readFileSync(schemaPath, 'utf-8');
46
- this.db.exec(schema);
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
- else {
49
- // Inline fallback — events table only
50
- this.db.exec(`
51
- CREATE TABLE IF NOT EXISTS events (
52
- event_id TEXT PRIMARY KEY, session_id TEXT NOT NULL,
53
- project_path TEXT NOT NULL, timestamp TEXT NOT NULL,
54
- hook_type TEXT NOT NULL, tool_name TEXT, tool_input TEXT,
55
- tool_output TEXT, user_prompt TEXT, ai_response TEXT,
56
- distilled INTEGER DEFAULT 0, created_at TEXT DEFAULT (datetime('now'))
57
- );
58
- CREATE INDEX IF NOT EXISTS idx_events_session ON events(session_id);
59
- CREATE INDEX IF NOT EXISTS idx_events_project ON events(project_path);
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
- * Incremental schema migrations. Kept idempotent so daemon restarts are safe.
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
- runMigrations() {
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
- try {
97
- this.db.exec(`CREATE INDEX IF NOT EXISTS idx_skill_invocations_workflow ON skill_invocations(workflow, phase);
98
- CREATE INDEX IF NOT EXISTS idx_skill_invocations_feature ON skill_invocations(feature_slug);`);
99
- }
100
- catch (err) {
101
- logger.warn(`[SQLiteStorage] migration: create skill_invocations workflow indexes failed: ${err}`);
102
- }
103
- try {
104
- this.db.exec('CREATE INDEX IF NOT EXISTS idx_sessions_start_time ON sessions(start_time DESC)');
105
- }
106
- catch (err) {
107
- logger.warn(`[SQLiteStorage] migration: create idx_sessions_start_time failed: ${err}`);
108
- }
109
- // Composite indexes for high-frequency session-scoped queries (idempotent)
110
- try {
111
- this.db.exec(`
112
- CREATE INDEX IF NOT EXISTS idx_events_session_ts ON events(session_id, timestamp DESC);
113
- CREATE INDEX IF NOT EXISTS idx_routing_events_session_ts ON routing_events(session_id, ts DESC);
114
- CREATE INDEX IF NOT EXISTS idx_skill_invocations_session_ts ON skill_invocations(session_id, timestamp DESC);
115
- `);
116
- }
117
- catch (err) {
118
- logger.warn(`[SQLiteStorage] migration: create composite indexes failed: ${err}`);
119
- }
120
- // Phase 1 Refactor: Additional performance indexes (idempotent)
121
- try {
122
- this.db.exec(`
123
- CREATE INDEX IF NOT EXISTS idx_routing_events_obeyed_ts ON routing_events(obeyed, ts DESC);
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":"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"}
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;AAG9C,UAAU,oBAAqB,SAAQ,YAAY;IACjD,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;CACxC;AAoCD,UAAU,oBAAqB,SAAQ,YAAY;IACjD,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;CACxC;AAED,qBAAa,eAAe;IAExB,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,OAAO;gBADP,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,OAAO,EAAE,oBAAoB;IAGvC,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAmDnC,WAAW,CAAC,MAAM,EAAE;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,UAAU,EAAE;IA2BhB,WAAW,CAAC,MAAM,CAAC,EAAE;QACnB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,GAAG,MAAM;IA4BV;;;OAGG;IACH,YAAY,CAAC,MAAM,EAAE;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,UAAU,EAAE;IA2BhB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,UAAU;CAkCrD"}
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;AAqC9C,UAAU,oBAAqB,SAAQ,YAAY;IACjD,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;CACxC;AAED,qBAAa,eAAe;IAExB,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,OAAO;gBADP,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,OAAO,EAAE,oBAAoB;IAGvC,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAmDnC,WAAW,CAAC,MAAM,EAAE;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,UAAU,EAAE;IA2BhB,WAAW,CAAC,MAAM,CAAC,EAAE;QACnB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,GAAG,MAAM;IA4BV;;;OAGG;IACH,YAAY,CAAC,MAAM,EAAE;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,UAAU,EAAE;IA6BhB,6BAA6B;IAC7B,cAAc,IAAI,MAAM;IAKxB;;;;;;OAMG;IACH,kBAAkB,CAAC,IAAI,GAAE;QACvB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,YAAY,GAAG,aAAa,CAAC;KACrC,GAAG,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAmBpD,4EAA4E;IAC5E,yBAAyB,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAa1G,mDAAmD;IACnD,0BAA0B,CAAC,UAAU,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAO3F,iGAAiG;IACjG,2BAA2B,CAAC,UAAU,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IASpG,8EAA8E;IAC9E,2BAA2B,CAAC,UAAU,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAQ5F,yEAAyE;IACzE,eAAe,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM;IAahE,2GAA2G;IAC3G,wBAAwB,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG;QAChE,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;KACnB;IAcD,qEAAqE;IACrE,qBAAqB,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,EAAE;IASvE;;;;;;;;OAQG;IACH,wBAAwB,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAuBxG;;;;OAIG;IACH,mBAAmB,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,KAAK,CAAC;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAWhH,8FAA8F;IAC9F,sBAAsB,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,UAAU,EAAE;IAY7E,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,UAAU;CAkCrD"}
@@ -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
- findPendingRoutingEvents(ageMs: number): RoutingEventRow[];
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;