@winspan/claude-forge 8.41.0 → 8.50.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (804) hide show
  1. package/.claude/CLAUDE.md +17 -0
  2. package/.eslintrc.js +23 -0
  3. package/.prettierrc +8 -0
  4. package/ARCHITECTURE_ISSUES.md +249 -0
  5. package/CLAUDE.md +265 -0
  6. package/CLAUDE.md.backup +488 -0
  7. package/DEVELOPMENT.md +310 -0
  8. package/dist/claudemd/claudemd-generator.d.ts +38 -3
  9. package/dist/claudemd/claudemd-generator.d.ts.map +1 -1
  10. package/dist/claudemd/claudemd-generator.js +629 -11
  11. package/dist/claudemd/claudemd-generator.js.map +1 -1
  12. package/dist/claudemd/index.d.ts +2 -2
  13. package/dist/claudemd/index.d.ts.map +1 -1
  14. package/dist/claudemd/index.js.map +1 -1
  15. package/dist/claudemd/resume-manager.d.ts.map +1 -1
  16. package/dist/claudemd/resume-manager.js +5 -2
  17. package/dist/claudemd/resume-manager.js.map +1 -1
  18. package/dist/claudemd/tech-detector.d.ts +1 -0
  19. package/dist/claudemd/tech-detector.d.ts.map +1 -1
  20. package/dist/claudemd/tech-detector.js +53 -0
  21. package/dist/claudemd/tech-detector.js.map +1 -1
  22. package/dist/cli/commands/claudemd.js +2 -2
  23. package/dist/cli/commands/claudemd.js.map +1 -1
  24. package/dist/cli/commands/daemon.d.ts +28 -0
  25. package/dist/cli/commands/daemon.d.ts.map +1 -1
  26. package/dist/cli/commands/daemon.js +200 -8
  27. package/dist/cli/commands/daemon.js.map +1 -1
  28. package/dist/cli/commands/init.d.ts.map +1 -1
  29. package/dist/cli/commands/init.js +3 -35
  30. package/dist/cli/commands/init.js.map +1 -1
  31. package/dist/cli/commands/menu.js +10 -10
  32. package/dist/cli/commands/menu.js.map +1 -1
  33. package/dist/cli/commands/skills.d.ts.map +1 -1
  34. package/dist/cli/commands/skills.js +8 -2
  35. package/dist/cli/commands/skills.js.map +1 -1
  36. package/dist/cli/commands/stats.d.ts.map +1 -1
  37. package/dist/cli/commands/stats.js +0 -17
  38. package/dist/cli/commands/stats.js.map +1 -1
  39. package/dist/cli/commands/trace.d.ts +9 -0
  40. package/dist/cli/commands/trace.d.ts.map +1 -0
  41. package/dist/cli/commands/trace.js +137 -0
  42. package/dist/cli/commands/trace.js.map +1 -0
  43. package/dist/cli/index.js +2 -4
  44. package/dist/cli/index.js.map +1 -1
  45. package/dist/core/ai/provider.d.ts +10 -2
  46. package/dist/core/ai/provider.d.ts.map +1 -1
  47. package/dist/core/ai/provider.js.map +1 -1
  48. package/dist/core/ai/types.d.ts +1 -19
  49. package/dist/core/ai/types.d.ts.map +1 -1
  50. package/dist/core/ai/types.js +1 -1
  51. package/dist/core/config.d.ts +2 -1
  52. package/dist/core/config.d.ts.map +1 -1
  53. package/dist/core/config.js +23 -6
  54. package/dist/core/config.js.map +1 -1
  55. package/dist/core/constants.d.ts +2 -2
  56. package/dist/core/constants.js +2 -2
  57. package/dist/core/constants.js.map +1 -1
  58. package/dist/core/queue/index.d.ts +52 -0
  59. package/dist/core/queue/index.d.ts.map +1 -0
  60. package/dist/core/queue/index.js +176 -0
  61. package/dist/core/queue/index.js.map +1 -0
  62. package/dist/core/storage/base.d.ts +33 -0
  63. package/dist/core/storage/base.d.ts.map +1 -0
  64. package/dist/core/storage/base.js +211 -0
  65. package/dist/core/storage/base.js.map +1 -0
  66. package/dist/core/storage/events.d.ts +52 -0
  67. package/dist/core/storage/events.d.ts.map +1 -0
  68. package/dist/core/storage/events.js +201 -0
  69. package/dist/core/storage/events.js.map +1 -0
  70. package/dist/core/storage/injections.d.ts +27 -0
  71. package/dist/core/storage/injections.d.ts.map +1 -0
  72. package/dist/core/storage/injections.js +51 -0
  73. package/dist/core/storage/injections.js.map +1 -0
  74. package/dist/core/storage/maintenance.d.ts +21 -0
  75. package/dist/core/storage/maintenance.d.ts.map +1 -0
  76. package/dist/core/storage/maintenance.js +52 -0
  77. package/dist/core/storage/maintenance.js.map +1 -0
  78. package/dist/core/storage/routing.d.ts +71 -0
  79. package/dist/core/storage/routing.d.ts.map +1 -0
  80. package/dist/core/storage/routing.js +141 -0
  81. package/dist/core/storage/routing.js.map +1 -0
  82. package/dist/core/storage/rows.d.ts +0 -47
  83. package/dist/core/storage/rows.d.ts.map +1 -1
  84. package/dist/core/storage/schema.sql +74 -136
  85. package/dist/core/storage/sessions.d.ts +34 -0
  86. package/dist/core/storage/sessions.d.ts.map +1 -0
  87. package/dist/core/storage/sessions.js +78 -0
  88. package/dist/core/storage/sessions.js.map +1 -0
  89. package/dist/core/storage/skills.d.ts +40 -0
  90. package/dist/core/storage/skills.d.ts.map +1 -0
  91. package/dist/core/storage/skills.js +107 -0
  92. package/dist/core/storage/skills.js.map +1 -0
  93. package/dist/core/storage/sqlite.d.ts +63 -265
  94. package/dist/core/storage/sqlite.d.ts.map +1 -1
  95. package/dist/core/storage/sqlite.js +102 -759
  96. package/dist/core/storage/sqlite.js.map +1 -1
  97. package/dist/core/storage/tasks.d.ts +64 -0
  98. package/dist/core/storage/tasks.d.ts.map +1 -0
  99. package/dist/core/storage/tasks.js +134 -0
  100. package/dist/core/storage/tasks.js.map +1 -0
  101. package/dist/core/storage/token-usage.d.ts +36 -0
  102. package/dist/core/storage/token-usage.d.ts.map +1 -0
  103. package/dist/core/storage/token-usage.js +59 -0
  104. package/dist/core/storage/token-usage.js.map +1 -0
  105. package/dist/core/types.d.ts +60 -4
  106. package/dist/core/types.d.ts.map +1 -1
  107. package/dist/core/types.js +24 -1
  108. package/dist/core/types.js.map +1 -1
  109. package/dist/core/utils/format.d.ts +28 -0
  110. package/dist/core/utils/format.d.ts.map +1 -0
  111. package/dist/core/utils/format.js +68 -0
  112. package/dist/core/utils/format.js.map +1 -0
  113. package/dist/core/utils/logger.d.ts +6 -1
  114. package/dist/core/utils/logger.d.ts.map +1 -1
  115. package/dist/core/utils/logger.js +72 -2
  116. package/dist/core/utils/logger.js.map +1 -1
  117. package/dist/core/utils/session.d.ts +16 -0
  118. package/dist/core/utils/session.d.ts.map +1 -0
  119. package/dist/core/utils/session.js +25 -0
  120. package/dist/core/utils/session.js.map +1 -0
  121. package/dist/core/utils/time.d.ts +22 -0
  122. package/dist/core/utils/time.d.ts.map +1 -0
  123. package/dist/core/utils/time.js +38 -0
  124. package/dist/core/utils/time.js.map +1 -0
  125. package/dist/daemon/handlers/history-exporter.d.ts.map +1 -1
  126. package/dist/daemon/handlers/history-exporter.js +6 -4
  127. package/dist/daemon/handlers/history-exporter.js.map +1 -1
  128. package/dist/daemon/handlers/post-tool-use.d.ts +5 -12
  129. package/dist/daemon/handlers/post-tool-use.d.ts.map +1 -1
  130. package/dist/daemon/handlers/post-tool-use.js +21 -79
  131. package/dist/daemon/handlers/post-tool-use.js.map +1 -1
  132. package/dist/daemon/handlers/stop.d.ts +24 -12
  133. package/dist/daemon/handlers/stop.d.ts.map +1 -1
  134. package/dist/daemon/handlers/stop.js +141 -42
  135. package/dist/daemon/handlers/stop.js.map +1 -1
  136. package/dist/daemon/handlers/user-prompt.d.ts +18 -19
  137. package/dist/daemon/handlers/user-prompt.d.ts.map +1 -1
  138. package/dist/daemon/handlers/user-prompt.js +103 -227
  139. package/dist/daemon/handlers/user-prompt.js.map +1 -1
  140. package/dist/daemon/index.d.ts +6 -2
  141. package/dist/daemon/index.d.ts.map +1 -1
  142. package/dist/daemon/index.js +76 -120
  143. package/dist/daemon/index.js.map +1 -1
  144. package/dist/daemon/launchd/com.claude-forge.daemon.plist.template +47 -0
  145. package/dist/daemon/launchd-installer.d.ts +61 -0
  146. package/dist/daemon/launchd-installer.d.ts.map +1 -0
  147. package/dist/daemon/launchd-installer.js +182 -0
  148. package/dist/daemon/launchd-installer.js.map +1 -0
  149. package/dist/daemon/lifecycle.d.ts +11 -0
  150. package/dist/daemon/lifecycle.d.ts.map +1 -1
  151. package/dist/daemon/lifecycle.js +44 -0
  152. package/dist/daemon/lifecycle.js.map +1 -1
  153. package/dist/daemon/router.d.ts +9 -2
  154. package/dist/daemon/router.d.ts.map +1 -1
  155. package/dist/daemon/router.js +27 -3
  156. package/dist/daemon/router.js.map +1 -1
  157. package/dist/daemon/server.d.ts.map +1 -1
  158. package/dist/daemon/server.js +6 -5
  159. package/dist/daemon/server.js.map +1 -1
  160. package/dist/daemon/services/anti-pattern-detector.d.ts +50 -0
  161. package/dist/daemon/services/anti-pattern-detector.d.ts.map +1 -0
  162. package/dist/daemon/services/anti-pattern-detector.js +357 -0
  163. package/dist/daemon/services/anti-pattern-detector.js.map +1 -0
  164. package/dist/daemon/services/drift-detector.d.ts +64 -0
  165. package/dist/daemon/services/drift-detector.d.ts.map +1 -0
  166. package/dist/daemon/services/drift-detector.js +201 -0
  167. package/dist/daemon/services/drift-detector.js.map +1 -0
  168. package/dist/{intelligence → daemon/services}/task-segmenter.d.ts +7 -1
  169. package/dist/daemon/services/task-segmenter.d.ts.map +1 -0
  170. package/dist/{intelligence → daemon/services}/task-segmenter.js +29 -6
  171. package/dist/daemon/services/task-segmenter.js.map +1 -0
  172. package/dist/daemon/services/weekly-report.d.ts +91 -0
  173. package/dist/daemon/services/weekly-report.d.ts.map +1 -0
  174. package/dist/daemon/services/weekly-report.js +327 -0
  175. package/dist/daemon/services/weekly-report.js.map +1 -0
  176. package/dist/hooks/hook-lib.sh +81 -0
  177. package/dist/hooks/notification.sh +7 -3
  178. package/dist/hooks/post-tool-use.sh +8 -4
  179. package/dist/hooks/pre-tool-use.sh +7 -4
  180. package/dist/hooks/stop.sh +1 -1
  181. package/dist/hooks/user-prompt-submit.sh +8 -9
  182. package/dist/mcp/server.d.ts +2 -2
  183. package/dist/mcp/server.d.ts.map +1 -1
  184. package/dist/mcp/server.js +71 -11
  185. package/dist/mcp/server.js.map +1 -1
  186. package/dist/skills/invocation-guard.d.ts +20 -0
  187. package/dist/skills/invocation-guard.d.ts.map +1 -1
  188. package/dist/skills/invocation-guard.js +63 -0
  189. package/dist/skills/invocation-guard.js.map +1 -1
  190. package/dist/skills/matcher.d.ts.map +1 -1
  191. package/dist/skills/matcher.js +12 -3
  192. package/dist/skills/matcher.js.map +1 -1
  193. package/dist/skills/official/code-simplifier.md +16 -0
  194. package/dist/skills/official/find-skills.md +23 -0
  195. package/dist/skills/official/official-api-design.md +17 -0
  196. package/dist/skills/official/official-architecture-decision.md +20 -0
  197. package/dist/skills/official/official-bmad.md +118 -0
  198. package/dist/skills/official/official-db-schema-design.md +16 -0
  199. package/dist/skills/official/official-debug.md +17 -0
  200. package/dist/skills/official/official-doc-driven.md +31 -0
  201. package/dist/skills/official/official-harness-engineering.md +108 -0
  202. package/dist/skills/official/official-performance-optimization.md +30 -0
  203. package/dist/skills/official/official-pr-review.md +35 -0
  204. package/dist/skills/official/official-release-checklist.md +30 -0
  205. package/dist/skills/official/official-security-hardening.md +26 -0
  206. package/dist/skills/official/official-spec-driven-design.md +31 -0
  207. package/dist/skills/official/planning-with-files.md +37 -0
  208. package/dist/skills/official/ui-ux-pro-max.md +18 -0
  209. package/dist/skills/official/webapp-testing.md +12 -0
  210. package/dist/skills/official-skills.d.ts +8 -4
  211. package/dist/skills/official-skills.d.ts.map +1 -1
  212. package/dist/skills/official-skills.js +48 -704
  213. package/dist/skills/official-skills.js.map +1 -1
  214. package/dist/skills/registry.d.ts +5 -0
  215. package/dist/skills/registry.d.ts.map +1 -1
  216. package/dist/skills/registry.js +48 -15
  217. package/dist/skills/registry.js.map +1 -1
  218. package/dist/skills/tools/pipeline-suggest.d.ts +30 -0
  219. package/dist/skills/tools/pipeline-suggest.d.ts.map +1 -0
  220. package/dist/skills/tools/pipeline-suggest.js +178 -0
  221. package/dist/skills/tools/pipeline-suggest.js.map +1 -0
  222. package/dist/web/routes/ai.d.ts.map +1 -1
  223. package/dist/web/routes/ai.js +16 -22
  224. package/dist/web/routes/ai.js.map +1 -1
  225. package/dist/web/routes/drift.d.ts +10 -0
  226. package/dist/web/routes/drift.d.ts.map +1 -0
  227. package/dist/web/routes/drift.js +21 -0
  228. package/dist/web/routes/drift.js.map +1 -0
  229. package/dist/web/routes/error-handler.d.ts +43 -0
  230. package/dist/web/routes/error-handler.d.ts.map +1 -0
  231. package/dist/web/routes/error-handler.js +99 -0
  232. package/dist/web/routes/error-handler.js.map +1 -0
  233. package/dist/web/routes/insights.d.ts +9 -0
  234. package/dist/web/routes/insights.d.ts.map +1 -0
  235. package/dist/web/routes/insights.js +34 -0
  236. package/dist/web/routes/insights.js.map +1 -0
  237. package/dist/web/routes/patch.js +2 -2
  238. package/dist/web/routes/patch.js.map +1 -1
  239. package/dist/web/routes/reports.d.ts +10 -0
  240. package/dist/web/routes/reports.d.ts.map +1 -0
  241. package/dist/web/routes/reports.js +27 -0
  242. package/dist/web/routes/reports.js.map +1 -0
  243. package/dist/web/routes/rules.d.ts +10 -3
  244. package/dist/web/routes/rules.d.ts.map +1 -1
  245. package/dist/web/routes/rules.js +80 -95
  246. package/dist/web/routes/rules.js.map +1 -1
  247. package/dist/web/routes/sessions.d.ts +1 -2
  248. package/dist/web/routes/sessions.d.ts.map +1 -1
  249. package/dist/web/routes/sessions.js +27 -39
  250. package/dist/web/routes/sessions.js.map +1 -1
  251. package/dist/web/routes/skill-stats.d.ts.map +1 -1
  252. package/dist/web/routes/skill-stats.js +38 -0
  253. package/dist/web/routes/skill-stats.js.map +1 -1
  254. package/dist/web/routes/skills.d.ts.map +1 -1
  255. package/dist/web/routes/skills.js +34 -0
  256. package/dist/web/routes/skills.js.map +1 -1
  257. package/dist/web/routes/stats.d.ts +7 -0
  258. package/dist/web/routes/stats.d.ts.map +1 -0
  259. package/dist/web/routes/stats.js +44 -0
  260. package/dist/web/routes/stats.js.map +1 -0
  261. package/dist/web/routes/status.js +1 -1
  262. package/dist/web/routes/status.js.map +1 -1
  263. package/dist/web/routes/tasks.d.ts +4 -0
  264. package/dist/web/routes/tasks.d.ts.map +1 -0
  265. package/dist/web/routes/tasks.js +181 -0
  266. package/dist/web/routes/tasks.js.map +1 -0
  267. package/dist/web/routes/trace.d.ts +10 -0
  268. package/dist/web/routes/trace.d.ts.map +1 -0
  269. package/dist/web/routes/trace.js +123 -0
  270. package/dist/web/routes/trace.js.map +1 -0
  271. package/dist/web/routes/types.d.ts +1 -14
  272. package/dist/web/routes/types.d.ts.map +1 -1
  273. package/dist/web/routes/types.js +8 -17
  274. package/dist/web/routes/types.js.map +1 -1
  275. package/dist/web/server.d.ts +1 -9
  276. package/dist/web/server.d.ts.map +1 -1
  277. package/dist/web/server.js +28 -28
  278. package/dist/web/server.js.map +1 -1
  279. package/dist/web/static/assets/AIConfig-BQCAQE9D.js +2 -0
  280. package/dist/web/static/assets/AIConfig-BQCAQE9D.js.map +1 -0
  281. package/dist/web/static/assets/Dashboard-D7Bo6Kan.js +2 -0
  282. package/dist/web/static/assets/Dashboard-D7Bo6Kan.js.map +1 -0
  283. package/dist/web/static/assets/{Drawer-DcU3ln98.js → Drawer-BeHRQxUS.js} +2 -2
  284. package/dist/web/static/assets/{Drawer-DcU3ln98.js.map → Drawer-BeHRQxUS.js.map} +1 -1
  285. package/dist/web/static/assets/Events-K_tCY2ti.js +2 -0
  286. package/dist/web/static/assets/Events-K_tCY2ti.js.map +1 -0
  287. package/dist/web/static/assets/Reports-BJCmBnc_.js +2 -0
  288. package/dist/web/static/assets/Reports-BJCmBnc_.js.map +1 -0
  289. package/dist/web/static/assets/SearchInput-BX2KhMkw.js +2 -0
  290. package/dist/web/static/assets/SearchInput-BX2KhMkw.js.map +1 -0
  291. package/dist/web/static/assets/SessionDetail-Bkr-kC7V.js +2 -0
  292. package/dist/web/static/assets/SessionDetail-Bkr-kC7V.js.map +1 -0
  293. package/dist/web/static/assets/Sessions-Chx9OCLH.js +2 -0
  294. package/dist/web/static/assets/Sessions-Chx9OCLH.js.map +1 -0
  295. package/dist/web/static/assets/Skills-O0GT1i7m.js +2 -0
  296. package/dist/web/static/assets/Skills-O0GT1i7m.js.map +1 -0
  297. package/dist/web/static/assets/TaskDetail-5SR8zGzv.js +2 -0
  298. package/dist/web/static/assets/TaskDetail-5SR8zGzv.js.map +1 -0
  299. package/dist/web/static/assets/Tasks-DCgDqvOZ.js +2 -0
  300. package/dist/web/static/assets/Tasks-DCgDqvOZ.js.map +1 -0
  301. package/dist/web/static/assets/export-L_VBD2p1.js +4 -0
  302. package/dist/web/static/assets/export-L_VBD2p1.js.map +1 -0
  303. package/dist/web/static/assets/index-D8AKj26b.css +1 -0
  304. package/dist/web/static/assets/index-DxIbmNmr.js +3 -0
  305. package/dist/web/static/assets/index-DxIbmNmr.js.map +1 -0
  306. package/dist/web/static/assets/{lucide-53bR2rki.js → lucide-fJlPI3H7.js} +68 -38
  307. package/dist/web/static/assets/lucide-fJlPI3H7.js.map +1 -0
  308. package/dist/web/static/assets/time-Bxuk0M-C.js +2 -0
  309. package/dist/web/static/assets/time-Bxuk0M-C.js.map +1 -0
  310. package/dist/web/static/index.html +3 -3
  311. package/docs/concurrent-agents.md +129 -0
  312. package/docs/design/architecture-review-20260516.md +232 -0
  313. package/docs/design/fix-skills-data-and-set-leak-spec-20260516-1300.md +219 -0
  314. package/docs/design/hook-failure-queue-spec-20260516-1530.md +204 -0
  315. package/docs/design/refactor-phase1-spec-20260515-1600.md +543 -0
  316. package/docs/design/refactor-phase2-spec-20260515-1700.md +424 -0
  317. package/docs/design/tasks-list-filter-pagination-spec-20260518-0930.md +208 -0
  318. package/docs/implementation/fix-skills-data-and-set-leak-changelog-20260516-1300.md +104 -0
  319. package/docs/implementation/hook-failure-queue-changelog-20260516-1530.md +196 -0
  320. package/docs/implementation/hotfix-daemon-event-reject-20260516-1430.md +56 -0
  321. package/docs/implementation/refactor-phase1-changelog-20260515-1630.md +354 -0
  322. package/docs/implementation/refactor-phase2-changelog-20260515-1705.md +421 -0
  323. package/docs/implementation/tasks-list-filter-pagination-changelog-20260518-0930.md +72 -0
  324. package/docs/reviews/claudemd-template-sync.md +54 -0
  325. package/docs/reviews/tasks-filter-pagination.md +80 -0
  326. package/docs/ruflo-learning-strategy.md +322 -0
  327. package/docs/skills-deduplication-analysis.md +83 -0
  328. package/docs/skills-multiformat-support.md +177 -0
  329. package/docs/skills-third-party.md +183 -0
  330. package/docs/testing/tasks-filter-pagination-test-report.md +86 -0
  331. package/forge +321 -0
  332. package/package.json +28 -62
  333. package/playwright.config.ts +40 -0
  334. package/scripts/demo-v2.ts +91 -0
  335. package/scripts/dev-daemon.sh +232 -0
  336. package/scripts/dev-web.ts +109 -0
  337. package/scripts/e2e-mcp-link.ts +423 -0
  338. package/scripts/e2e-methodology-quality.ts +253 -0
  339. package/scripts/e2e-routing.ts +456 -0
  340. package/scripts/e2e-user-methodology.ts +326 -0
  341. package/scripts/e2e-web-workflows.ts +299 -0
  342. package/scripts/migrate-legacy-to-dynamic.sql +108 -0
  343. package/scripts/regenerate-execution-docs.ts +116 -0
  344. package/scripts/sync-agent-skills.ts +193 -0
  345. package/scripts/test-hook.sh +71 -0
  346. package/scripts/verify-skill-loading.ts +62 -0
  347. package/src/claudemd/claudemd-generator.ts +777 -0
  348. package/src/claudemd/convention-extractor.ts +69 -0
  349. package/src/claudemd/index.ts +35 -0
  350. package/src/claudemd/persona-manager.ts +88 -0
  351. package/src/claudemd/resume-manager.ts +236 -0
  352. package/src/claudemd/tech-detector.ts +220 -0
  353. package/src/cli/commands/claudemd.ts +84 -0
  354. package/src/cli/commands/config.ts +46 -0
  355. package/src/cli/commands/daemon.ts +310 -0
  356. package/src/cli/commands/executions.ts +114 -0
  357. package/src/cli/commands/init.ts +204 -0
  358. package/src/cli/commands/logs.ts +181 -0
  359. package/src/cli/commands/mcp.ts +244 -0
  360. package/src/cli/commands/menu.ts +356 -0
  361. package/src/cli/commands/skills.ts +185 -0
  362. package/src/cli/commands/stats.ts +74 -0
  363. package/src/cli/commands/status.ts +69 -0
  364. package/src/cli/commands/template.ts +77 -0
  365. package/src/cli/commands/trace.ts +164 -0
  366. package/src/cli/index.ts +42 -0
  367. package/src/cli/init/hook-manager.ts +132 -0
  368. package/src/core/ai/provider.ts +308 -0
  369. package/src/core/ai/types.ts +51 -0
  370. package/src/core/config.ts +124 -0
  371. package/src/core/constants.ts +45 -0
  372. package/src/core/queue/index.ts +193 -0
  373. package/src/core/storage/base.ts +226 -0
  374. package/src/core/storage/events.ts +255 -0
  375. package/src/core/storage/injections.ts +78 -0
  376. package/src/core/storage/maintenance.ts +59 -0
  377. package/src/core/storage/migrations/002_add_skill_tracking.sql +6 -0
  378. package/src/core/storage/migrations/003_add_skill_invocations.sql +23 -0
  379. package/src/core/storage/performance-indexes.sql +23 -0
  380. package/src/core/storage/routing.ts +194 -0
  381. package/src/core/storage/rows.ts +112 -0
  382. package/src/core/storage/schema.sql +214 -0
  383. package/src/core/storage/sessions.ts +104 -0
  384. package/src/core/storage/skills.ts +164 -0
  385. package/src/core/storage/sqlite.ts +194 -0
  386. package/src/core/storage/tasks.ts +170 -0
  387. package/src/core/storage/token-usage.ts +93 -0
  388. package/src/core/types.ts +154 -0
  389. package/src/core/utils/error-handler.ts +256 -0
  390. package/src/core/utils/forge-resume-block.ts +74 -0
  391. package/src/core/utils/format.ts +69 -0
  392. package/src/core/utils/logger.ts +119 -0
  393. package/src/core/utils/lru-cache.ts +50 -0
  394. package/src/core/utils/path.ts +19 -0
  395. package/src/core/utils/session.ts +26 -0
  396. package/src/core/utils/time.ts +37 -0
  397. package/src/core/utils/token-tracker.ts +97 -0
  398. package/src/daemon/event-parser.ts +35 -0
  399. package/src/daemon/handlers/history-exporter.ts +117 -0
  400. package/src/daemon/handlers/post-tool-use.ts +50 -0
  401. package/src/daemon/handlers/stop.ts +215 -0
  402. package/src/daemon/handlers/user-prompt.ts +188 -0
  403. package/src/daemon/index.ts +278 -0
  404. package/src/daemon/launchd/com.claude-forge.daemon.plist.template +47 -0
  405. package/src/daemon/launchd-installer.ts +260 -0
  406. package/src/daemon/lifecycle.ts +128 -0
  407. package/src/daemon/router.ts +40 -0
  408. package/src/daemon/server.ts +209 -0
  409. package/src/daemon/services/anti-pattern-detector.ts +412 -0
  410. package/src/daemon/services/drift-detector.ts +232 -0
  411. package/src/daemon/services/task-segmenter.ts +112 -0
  412. package/src/daemon/services/weekly-report.ts +454 -0
  413. package/src/hooks/hook-lib.sh +81 -0
  414. package/src/hooks/notification.sh +35 -0
  415. package/src/hooks/post-tool-use.sh +61 -0
  416. package/src/hooks/pre-tool-use.sh +63 -0
  417. package/src/hooks/stop.sh +40 -0
  418. package/src/hooks/user-prompt-submit.sh +69 -0
  419. package/src/mcp/server.ts +322 -0
  420. package/src/skills/index.ts +2 -0
  421. package/src/skills/invocation-guard.ts +177 -0
  422. package/src/skills/matcher.ts +148 -0
  423. package/src/skills/official/code-simplifier.md +16 -0
  424. package/src/skills/official/find-skills.md +23 -0
  425. package/src/skills/official/official-api-design.md +17 -0
  426. package/src/skills/official/official-architecture-decision.md +20 -0
  427. package/src/skills/official/official-bmad.md +118 -0
  428. package/src/skills/official/official-db-schema-design.md +16 -0
  429. package/src/skills/official/official-debug.md +17 -0
  430. package/src/skills/official/official-doc-driven.md +31 -0
  431. package/src/skills/official/official-harness-engineering.md +108 -0
  432. package/src/skills/official/official-performance-optimization.md +30 -0
  433. package/src/skills/official/official-pr-review.md +35 -0
  434. package/src/skills/official/official-release-checklist.md +30 -0
  435. package/src/skills/official/official-security-hardening.md +26 -0
  436. package/src/skills/official/official-spec-driven-design.md +31 -0
  437. package/src/skills/official/planning-with-files.md +37 -0
  438. package/src/skills/official/ui-ux-pro-max.md +18 -0
  439. package/src/skills/official/webapp-testing.md +12 -0
  440. package/src/skills/official-skills.ts +89 -0
  441. package/src/skills/registry.ts +355 -0
  442. package/src/skills/semantic-matcher.ts +231 -0
  443. package/src/skills/tools/pipeline-suggest.ts +226 -0
  444. package/src/skills/tools/skill-invoke.ts +168 -0
  445. package/src/skills/tools/skill-list.ts +59 -0
  446. package/src/templates/go.yaml +53 -0
  447. package/src/templates/python.yaml +59 -0
  448. package/src/templates/react.yaml +55 -0
  449. package/src/templates/template-manager.ts +170 -0
  450. package/src/web/auth-middleware.ts +55 -0
  451. package/src/web/routes/ai.ts +204 -0
  452. package/src/web/routes/auth.ts +22 -0
  453. package/src/web/routes/drift.ts +25 -0
  454. package/src/web/routes/error-handler.ts +120 -0
  455. package/src/web/routes/events.ts +47 -0
  456. package/src/web/routes/insights.ts +43 -0
  457. package/src/web/routes/patch.ts +117 -0
  458. package/src/web/routes/reports.ts +34 -0
  459. package/src/web/routes/rules.ts +101 -0
  460. package/src/web/routes/sessions.ts +262 -0
  461. package/src/web/routes/skill-stats.ts +132 -0
  462. package/src/web/routes/skills.ts +349 -0
  463. package/src/web/routes/static.ts +67 -0
  464. package/src/web/routes/stats.ts +60 -0
  465. package/src/web/routes/status.ts +30 -0
  466. package/src/web/routes/tasks.ts +218 -0
  467. package/src/web/routes/token-usage.ts +20 -0
  468. package/src/web/routes/trace.ts +138 -0
  469. package/src/web/routes/types.ts +56 -0
  470. package/src/web/server.ts +134 -0
  471. package/src/web/ssrf-guard.ts +112 -0
  472. package/src/web/static/index.html +3251 -0
  473. package/src/web/static/vendor/chart.umd.min.js +20 -0
  474. package/tests/e2e/dashboard.spec.ts +205 -0
  475. package/tests/e2e/routing-skill-e2e.test.ts +39 -0
  476. package/tests/helpers/mock-ai.ts +92 -0
  477. package/tests/helpers/mock-storage.ts +159 -0
  478. package/tests/integration/queue-replay.integration.test.ts +193 -0
  479. package/tests/integration/tasks-filter.integration.test.ts +154 -0
  480. package/tests/performance/database.benchmark.ts +161 -0
  481. package/tests/semantic-matcher.test.ts +99 -0
  482. package/tests/skill-matcher.test.ts +110 -0
  483. package/tests/unit/ai-provider-retry.test.ts +194 -0
  484. package/tests/unit/ai-provider-vision.test.ts +224 -0
  485. package/tests/unit/claudemd-generator.test.ts +68 -0
  486. package/tests/unit/cli-mcp.test.ts +141 -0
  487. package/tests/unit/handlers.test.ts +171 -0
  488. package/tests/unit/invocation-guard.test.ts +125 -0
  489. package/tests/unit/queue.test.ts +272 -0
  490. package/tests/unit/router.test.ts +138 -0
  491. package/tests/unit/security.test.ts +128 -0
  492. package/tests/unit/skill-invocations-workflow.test.ts +495 -0
  493. package/tests/unit/skill-registry.test.ts +94 -0
  494. package/tests/unit/skills/invocation-guard-ttl.test.ts +211 -0
  495. package/tests/unit/skills/official-skills-loader.test.ts +126 -0
  496. package/tests/unit/skills/registry-multiformat.test.ts +92 -0
  497. package/tests/unit/storage/sessions-aggregate.test.ts +435 -0
  498. package/tests/unit/storage/sqlite-refactor-harness.test.ts +314 -0
  499. package/tests/unit/storage.test.ts +172 -0
  500. package/tests/unit/token-usage.test.ts +144 -0
  501. package/tests/unit/type-guards.test.ts +201 -0
  502. package/tests/unit/utils/format.test.ts +189 -0
  503. package/tests/unit/utils/session.test.ts +89 -0
  504. package/tests/unit/utils/time.test.ts +112 -0
  505. package/tests/unit/web/routes-auth.test.ts +93 -0
  506. package/tests/unit/web/routes-events.test.ts +101 -0
  507. package/tests/unit/web/routes-sessions.test.ts +181 -0
  508. package/tests/unit/web/routes-skill-stats.test.ts +179 -0
  509. package/tests/unit/web/routes-stats.test.ts +92 -0
  510. package/tests/unit/web/routes-tasks.test.ts +351 -0
  511. package/tsconfig.json +22 -0
  512. package/vitest.config.ts +21 -0
  513. package/vitest.integration.config.ts +16 -0
  514. package/web/CLAUDE.md +20 -0
  515. package/web/index.html +13 -0
  516. package/web/package-lock.json +4854 -0
  517. package/web/package.json +35 -0
  518. package/web/postcss.config.js +6 -0
  519. package/web/src/App.tsx +110 -0
  520. package/web/src/components/CodeBlock.tsx +31 -0
  521. package/web/src/components/Confirm.tsx +96 -0
  522. package/web/src/components/Drawer.tsx +60 -0
  523. package/web/src/components/Layout.tsx +145 -0
  524. package/web/src/components/MarkdownRenderer.tsx +77 -0
  525. package/web/src/components/SearchInput.tsx +31 -0
  526. package/web/src/components/SessionDetailContent.tsx +157 -0
  527. package/web/src/components/Toast.tsx +92 -0
  528. package/web/src/index.css +19 -0
  529. package/web/src/main.tsx +31 -0
  530. package/web/src/pages/AIConfig.tsx +233 -0
  531. package/web/src/pages/Dashboard.tsx +572 -0
  532. package/web/src/pages/Events.tsx +271 -0
  533. package/web/src/pages/Reports.tsx +428 -0
  534. package/web/src/pages/SessionDetail.tsx +162 -0
  535. package/web/src/pages/Sessions.tsx +205 -0
  536. package/web/src/pages/Skills.tsx +180 -0
  537. package/web/src/pages/TaskDetail.tsx +511 -0
  538. package/web/src/pages/Tasks.tsx +150 -0
  539. package/web/src/utils/auth.ts +59 -0
  540. package/web/src/utils/export.ts +54 -0
  541. package/web/src/utils/time.ts +13 -0
  542. package/web/tailwind.config.js +11 -0
  543. package/web/tsconfig.json +21 -0
  544. package/web/tsconfig.node.json +10 -0
  545. package/web/vite.config.ts +76 -0
  546. package/winspan-claude-forge-8.43.0.tgz +0 -0
  547. package/dist/agents/definition.d.ts +0 -62
  548. package/dist/agents/definition.d.ts.map +0 -1
  549. package/dist/agents/definition.js +0 -27
  550. package/dist/agents/definition.js.map +0 -1
  551. package/dist/agents/distributor.d.ts +0 -23
  552. package/dist/agents/distributor.d.ts.map +0 -1
  553. package/dist/agents/distributor.js +0 -85
  554. package/dist/agents/distributor.js.map +0 -1
  555. package/dist/agents/index.d.ts +0 -5
  556. package/dist/agents/index.d.ts.map +0 -1
  557. package/dist/agents/index.js +0 -5
  558. package/dist/agents/index.js.map +0 -1
  559. package/dist/agents/methodologies/agent-builder.d.ts +0 -21
  560. package/dist/agents/methodologies/agent-builder.d.ts.map +0 -1
  561. package/dist/agents/methodologies/agent-builder.js +0 -149
  562. package/dist/agents/methodologies/agent-builder.js.map +0 -1
  563. package/dist/agents/methodologies/phases/bmad/analyze.d.ts +0 -3
  564. package/dist/agents/methodologies/phases/bmad/analyze.d.ts.map +0 -1
  565. package/dist/agents/methodologies/phases/bmad/analyze.js +0 -19
  566. package/dist/agents/methodologies/phases/bmad/analyze.js.map +0 -1
  567. package/dist/agents/methodologies/phases/bmad/design.d.ts +0 -3
  568. package/dist/agents/methodologies/phases/bmad/design.d.ts.map +0 -1
  569. package/dist/agents/methodologies/phases/bmad/design.js +0 -18
  570. package/dist/agents/methodologies/phases/bmad/design.js.map +0 -1
  571. package/dist/agents/methodologies/phases/bmad/implement.d.ts +0 -3
  572. package/dist/agents/methodologies/phases/bmad/implement.d.ts.map +0 -1
  573. package/dist/agents/methodologies/phases/bmad/implement.js +0 -17
  574. package/dist/agents/methodologies/phases/bmad/implement.js.map +0 -1
  575. package/dist/agents/methodologies/phases/bmad/index.d.ts +0 -6
  576. package/dist/agents/methodologies/phases/bmad/index.d.ts.map +0 -1
  577. package/dist/agents/methodologies/phases/bmad/index.js +0 -6
  578. package/dist/agents/methodologies/phases/bmad/index.js.map +0 -1
  579. package/dist/agents/methodologies/phases/bmad/review.d.ts +0 -3
  580. package/dist/agents/methodologies/phases/bmad/review.d.ts.map +0 -1
  581. package/dist/agents/methodologies/phases/bmad/review.js +0 -17
  582. package/dist/agents/methodologies/phases/bmad/review.js.map +0 -1
  583. package/dist/agents/methodologies/phases/bmad/test.d.ts +0 -3
  584. package/dist/agents/methodologies/phases/bmad/test.d.ts.map +0 -1
  585. package/dist/agents/methodologies/phases/bmad/test.js +0 -21
  586. package/dist/agents/methodologies/phases/bmad/test.js.map +0 -1
  587. package/dist/agents/methodologies/phases/harness/fix.d.ts +0 -3
  588. package/dist/agents/methodologies/phases/harness/fix.d.ts.map +0 -1
  589. package/dist/agents/methodologies/phases/harness/fix.js +0 -17
  590. package/dist/agents/methodologies/phases/harness/fix.js.map +0 -1
  591. package/dist/agents/methodologies/phases/harness/index.d.ts +0 -6
  592. package/dist/agents/methodologies/phases/harness/index.d.ts.map +0 -1
  593. package/dist/agents/methodologies/phases/harness/index.js +0 -6
  594. package/dist/agents/methodologies/phases/harness/index.js.map +0 -1
  595. package/dist/agents/methodologies/phases/harness/reproduce.d.ts +0 -3
  596. package/dist/agents/methodologies/phases/harness/reproduce.d.ts.map +0 -1
  597. package/dist/agents/methodologies/phases/harness/reproduce.js +0 -20
  598. package/dist/agents/methodologies/phases/harness/reproduce.js.map +0 -1
  599. package/dist/agents/methodologies/phases/harness/root-cause.d.ts +0 -3
  600. package/dist/agents/methodologies/phases/harness/root-cause.d.ts.map +0 -1
  601. package/dist/agents/methodologies/phases/harness/root-cause.js +0 -21
  602. package/dist/agents/methodologies/phases/harness/root-cause.js.map +0 -1
  603. package/dist/agents/methodologies/phases/harness/safety-net.d.ts +0 -3
  604. package/dist/agents/methodologies/phases/harness/safety-net.d.ts.map +0 -1
  605. package/dist/agents/methodologies/phases/harness/safety-net.js +0 -17
  606. package/dist/agents/methodologies/phases/harness/safety-net.js.map +0 -1
  607. package/dist/agents/methodologies/phases/harness/verify.d.ts +0 -3
  608. package/dist/agents/methodologies/phases/harness/verify.d.ts.map +0 -1
  609. package/dist/agents/methodologies/phases/harness/verify.js +0 -22
  610. package/dist/agents/methodologies/phases/harness/verify.js.map +0 -1
  611. package/dist/agents/methodologies/presets.d.ts +0 -10
  612. package/dist/agents/methodologies/presets.d.ts.map +0 -1
  613. package/dist/agents/methodologies/presets.js +0 -79
  614. package/dist/agents/methodologies/presets.js.map +0 -1
  615. package/dist/agents/methodologies/types.d.ts +0 -45
  616. package/dist/agents/methodologies/types.d.ts.map +0 -1
  617. package/dist/agents/methodologies/types.js +0 -10
  618. package/dist/agents/methodologies/types.js.map +0 -1
  619. package/dist/agents/methodologies/user-config-loader.d.ts +0 -30
  620. package/dist/agents/methodologies/user-config-loader.d.ts.map +0 -1
  621. package/dist/agents/methodologies/user-config-loader.js +0 -159
  622. package/dist/agents/methodologies/user-config-loader.js.map +0 -1
  623. package/dist/agents/official-agents.d.ts +0 -4
  624. package/dist/agents/official-agents.d.ts.map +0 -1
  625. package/dist/agents/official-agents.js +0 -559
  626. package/dist/agents/official-agents.js.map +0 -1
  627. package/dist/agents/registry.d.ts +0 -57
  628. package/dist/agents/registry.d.ts.map +0 -1
  629. package/dist/agents/registry.js +0 -271
  630. package/dist/agents/registry.js.map +0 -1
  631. package/dist/capability/index.d.ts +0 -10
  632. package/dist/capability/index.d.ts.map +0 -1
  633. package/dist/capability/index.js +0 -10
  634. package/dist/capability/index.js.map +0 -1
  635. package/dist/capability/types.d.ts +0 -10
  636. package/dist/capability/types.d.ts.map +0 -1
  637. package/dist/capability/types.js +0 -10
  638. package/dist/capability/types.js.map +0 -1
  639. package/dist/cli/commands/agents.d.ts +0 -3
  640. package/dist/cli/commands/agents.d.ts.map +0 -1
  641. package/dist/cli/commands/agents.js +0 -62
  642. package/dist/cli/commands/agents.js.map +0 -1
  643. package/dist/cli/commands/rules.d.ts +0 -8
  644. package/dist/cli/commands/rules.d.ts.map +0 -1
  645. package/dist/cli/commands/rules.js +0 -89
  646. package/dist/cli/commands/rules.js.map +0 -1
  647. package/dist/daemon/auto-disable-scheduler.d.ts +0 -53
  648. package/dist/daemon/auto-disable-scheduler.d.ts.map +0 -1
  649. package/dist/daemon/auto-disable-scheduler.js +0 -114
  650. package/dist/daemon/auto-disable-scheduler.js.map +0 -1
  651. package/dist/daemon/handlers/pre-tool-use.d.ts +0 -39
  652. package/dist/daemon/handlers/pre-tool-use.d.ts.map +0 -1
  653. package/dist/daemon/handlers/pre-tool-use.js +0 -166
  654. package/dist/daemon/handlers/pre-tool-use.js.map +0 -1
  655. package/dist/daemon/routing-observer.d.ts +0 -42
  656. package/dist/daemon/routing-observer.d.ts.map +0 -1
  657. package/dist/daemon/routing-observer.js +0 -264
  658. package/dist/daemon/routing-observer.js.map +0 -1
  659. package/dist/daemon/routing-state.d.ts +0 -64
  660. package/dist/daemon/routing-state.d.ts.map +0 -1
  661. package/dist/daemon/routing-state.js +0 -240
  662. package/dist/daemon/routing-state.js.map +0 -1
  663. package/dist/engine/agent-router.d.ts +0 -142
  664. package/dist/engine/agent-router.d.ts.map +0 -1
  665. package/dist/engine/agent-router.js +0 -276
  666. package/dist/engine/agent-router.js.map +0 -1
  667. package/dist/engine/context-builder.d.ts +0 -23
  668. package/dist/engine/context-builder.d.ts.map +0 -1
  669. package/dist/engine/context-builder.js +0 -63
  670. package/dist/engine/context-builder.js.map +0 -1
  671. package/dist/engine/conventions/basic-security.yaml +0 -109
  672. package/dist/engine/conventions/code-quality.yaml +0 -123
  673. package/dist/engine/conventions/database-safety.yaml +0 -74
  674. package/dist/engine/conventions/dependency-safety.yaml +0 -132
  675. package/dist/engine/conventions/docker-safety.yaml +0 -69
  676. package/dist/engine/conventions/git-safety.yaml +0 -118
  677. package/dist/engine/conventions/go-best-practices.yaml +0 -84
  678. package/dist/engine/conventions/python-best-practices.yaml +0 -96
  679. package/dist/engine/conventions/react-best-practices.yaml +0 -96
  680. package/dist/engine/conventions/routing.yaml +0 -378
  681. package/dist/engine/conventions/strict-security.yaml +0 -30
  682. package/dist/engine/conventions/ts-quality.yaml +0 -49
  683. package/dist/engine/dsl/compiler.d.ts +0 -34
  684. package/dist/engine/dsl/compiler.d.ts.map +0 -1
  685. package/dist/engine/dsl/compiler.js +0 -702
  686. package/dist/engine/dsl/compiler.js.map +0 -1
  687. package/dist/engine/dsl/parser.d.ts +0 -25
  688. package/dist/engine/dsl/parser.d.ts.map +0 -1
  689. package/dist/engine/dsl/parser.js +0 -208
  690. package/dist/engine/dsl/parser.js.map +0 -1
  691. package/dist/engine/dsl/runtime.d.ts +0 -46
  692. package/dist/engine/dsl/runtime.d.ts.map +0 -1
  693. package/dist/engine/dsl/runtime.js +0 -173
  694. package/dist/engine/dsl/runtime.js.map +0 -1
  695. package/dist/engine/dsl/types.d.ts +0 -139
  696. package/dist/engine/dsl/types.d.ts.map +0 -1
  697. package/dist/engine/dsl/types.js +0 -11
  698. package/dist/engine/dsl/types.js.map +0 -1
  699. package/dist/engine/evidence-store.d.ts +0 -44
  700. package/dist/engine/evidence-store.d.ts.map +0 -1
  701. package/dist/engine/evidence-store.js +0 -109
  702. package/dist/engine/evidence-store.js.map +0 -1
  703. package/dist/engine/experiment-router.d.ts +0 -102
  704. package/dist/engine/experiment-router.d.ts.map +0 -1
  705. package/dist/engine/experiment-router.js +0 -289
  706. package/dist/engine/experiment-router.js.map +0 -1
  707. package/dist/engine/recommender.d.ts +0 -52
  708. package/dist/engine/recommender.d.ts.map +0 -1
  709. package/dist/engine/recommender.js +0 -162
  710. package/dist/engine/recommender.js.map +0 -1
  711. package/dist/engine/rule-engine.d.ts +0 -33
  712. package/dist/engine/rule-engine.d.ts.map +0 -1
  713. package/dist/engine/rule-engine.js +0 -250
  714. package/dist/engine/rule-engine.js.map +0 -1
  715. package/dist/engine/security-gates.d.ts +0 -42
  716. package/dist/engine/security-gates.d.ts.map +0 -1
  717. package/dist/engine/security-gates.js +0 -210
  718. package/dist/engine/security-gates.js.map +0 -1
  719. package/dist/intelligence/classifier.d.ts +0 -75
  720. package/dist/intelligence/classifier.d.ts.map +0 -1
  721. package/dist/intelligence/classifier.js +0 -352
  722. package/dist/intelligence/classifier.js.map +0 -1
  723. package/dist/intelligence/context-gatherer.d.ts +0 -101
  724. package/dist/intelligence/context-gatherer.d.ts.map +0 -1
  725. package/dist/intelligence/context-gatherer.js +0 -417
  726. package/dist/intelligence/context-gatherer.js.map +0 -1
  727. package/dist/intelligence/cot-classifier.d.ts +0 -95
  728. package/dist/intelligence/cot-classifier.d.ts.map +0 -1
  729. package/dist/intelligence/cot-classifier.js +0 -391
  730. package/dist/intelligence/cot-classifier.js.map +0 -1
  731. package/dist/intelligence/distiller.d.ts +0 -22
  732. package/dist/intelligence/distiller.d.ts.map +0 -1
  733. package/dist/intelligence/distiller.js +0 -108
  734. package/dist/intelligence/distiller.js.map +0 -1
  735. package/dist/intelligence/execution-doc-builder.d.ts +0 -151
  736. package/dist/intelligence/execution-doc-builder.d.ts.map +0 -1
  737. package/dist/intelligence/execution-doc-builder.js +0 -1018
  738. package/dist/intelligence/execution-doc-builder.js.map +0 -1
  739. package/dist/intelligence/intent-types.d.ts +0 -13
  740. package/dist/intelligence/intent-types.d.ts.map +0 -1
  741. package/dist/intelligence/intent-types.js +0 -19
  742. package/dist/intelligence/intent-types.js.map +0 -1
  743. package/dist/intelligence/multimodal-parser.d.ts +0 -105
  744. package/dist/intelligence/multimodal-parser.d.ts.map +0 -1
  745. package/dist/intelligence/multimodal-parser.js +0 -425
  746. package/dist/intelligence/multimodal-parser.js.map +0 -1
  747. package/dist/intelligence/quality-gate.d.ts +0 -45
  748. package/dist/intelligence/quality-gate.d.ts.map +0 -1
  749. package/dist/intelligence/quality-gate.js +0 -193
  750. package/dist/intelligence/quality-gate.js.map +0 -1
  751. package/dist/intelligence/task-segmenter.d.ts.map +0 -1
  752. package/dist/intelligence/task-segmenter.js.map +0 -1
  753. package/dist/web/routes/agents.d.ts +0 -7
  754. package/dist/web/routes/agents.d.ts.map +0 -1
  755. package/dist/web/routes/agents.js +0 -209
  756. package/dist/web/routes/agents.js.map +0 -1
  757. package/dist/web/routes/execution-trace.d.ts +0 -21
  758. package/dist/web/routes/execution-trace.d.ts.map +0 -1
  759. package/dist/web/routes/execution-trace.js +0 -353
  760. package/dist/web/routes/execution-trace.js.map +0 -1
  761. package/dist/web/routes/experiments.d.ts +0 -15
  762. package/dist/web/routes/experiments.d.ts.map +0 -1
  763. package/dist/web/routes/experiments.js +0 -187
  764. package/dist/web/routes/experiments.js.map +0 -1
  765. package/dist/web/routes/routing.d.ts +0 -17
  766. package/dist/web/routes/routing.d.ts.map +0 -1
  767. package/dist/web/routes/routing.js +0 -592
  768. package/dist/web/routes/routing.js.map +0 -1
  769. package/dist/web/routes/workflows.d.ts +0 -19
  770. package/dist/web/routes/workflows.d.ts.map +0 -1
  771. package/dist/web/routes/workflows.js +0 -86
  772. package/dist/web/routes/workflows.js.map +0 -1
  773. package/dist/web/static/assets/AIConfig-R5wZ3ZKT.js +0 -2
  774. package/dist/web/static/assets/AIConfig-R5wZ3ZKT.js.map +0 -1
  775. package/dist/web/static/assets/Agents-Beg34V1g.js +0 -2
  776. package/dist/web/static/assets/Agents-Beg34V1g.js.map +0 -1
  777. package/dist/web/static/assets/CodeBlock--H53gk46.js +0 -2
  778. package/dist/web/static/assets/CodeBlock--H53gk46.js.map +0 -1
  779. package/dist/web/static/assets/Dashboard-Cy1xsj1J.js +0 -2
  780. package/dist/web/static/assets/Dashboard-Cy1xsj1J.js.map +0 -1
  781. package/dist/web/static/assets/Events-mFhXl4zI.js +0 -2
  782. package/dist/web/static/assets/Events-mFhXl4zI.js.map +0 -1
  783. package/dist/web/static/assets/ExecutionTrace-DG901hLR.js +0 -3
  784. package/dist/web/static/assets/ExecutionTrace-DG901hLR.js.map +0 -1
  785. package/dist/web/static/assets/MarkdownRenderer-CCIz1MOz.js +0 -2
  786. package/dist/web/static/assets/MarkdownRenderer-CCIz1MOz.js.map +0 -1
  787. package/dist/web/static/assets/Routing-B7BFLfjh.js +0 -2
  788. package/dist/web/static/assets/Routing-B7BFLfjh.js.map +0 -1
  789. package/dist/web/static/assets/SessionDetail-BT0l4RrK.js +0 -2
  790. package/dist/web/static/assets/SessionDetail-BT0l4RrK.js.map +0 -1
  791. package/dist/web/static/assets/Sessions-C6J_HQ_u.js +0 -2
  792. package/dist/web/static/assets/Sessions-C6J_HQ_u.js.map +0 -1
  793. package/dist/web/static/assets/Skills-4DQWLaTv.js +0 -2
  794. package/dist/web/static/assets/Skills-4DQWLaTv.js.map +0 -1
  795. package/dist/web/static/assets/WorkflowDetail-zhNqUkBE.js +0 -2
  796. package/dist/web/static/assets/WorkflowDetail-zhNqUkBE.js.map +0 -1
  797. package/dist/web/static/assets/Workflows-Btvi-lGw.js +0 -2
  798. package/dist/web/static/assets/Workflows-Btvi-lGw.js.map +0 -1
  799. package/dist/web/static/assets/export-BQQZLaHV.js +0 -4
  800. package/dist/web/static/assets/export-BQQZLaHV.js.map +0 -1
  801. package/dist/web/static/assets/index-Cgr9qMtq.js +0 -3
  802. package/dist/web/static/assets/index-Cgr9qMtq.js.map +0 -1
  803. package/dist/web/static/assets/index-CngWb5gC.css +0 -1
  804. package/dist/web/static/assets/lucide-53bR2rki.js.map +0 -1
@@ -0,0 +1,214 @@
1
+ -- Claude Forge SQLite Schema (core tables)
2
+ -- Active tables: events, sessions, injections, tasks, task_events,
3
+ -- routing_events, token_usage, skill_invocations
4
+ --
5
+ -- ── Table Relationships ──────────────────────────────────────────────────────
6
+ --
7
+ -- events (core fact table)
8
+ -- └─ sessions.session_id — aggregated from events (app-layer, no FK)
9
+ -- └─ injections.event_id — FK ON DELETE CASCADE
10
+ -- └─ task_events.event_id — FK ON DELETE CASCADE
11
+ --
12
+ -- routing_events (agent routing decisions)
13
+ -- └─ routing_events.session_id → events.session_id (logical, no FK)
14
+ -- └─ skill_invocations.route_request_id → routing_events.route_request_id (logical, no FK)
15
+ --
16
+ -- skill_invocations (skill execution records)
17
+ -- └─ skill_invocations.session_id → events.session_id (logical, no FK)
18
+ -- └─ skill_invocations.route_request_id → routing_events.route_request_id (logical, no FK)
19
+ --
20
+ -- Why no FK on routing_events / skill_invocations:
21
+ -- 1. routing_events.route_request_id is nullable and not UNIQUE — cannot be FK target
22
+ -- 2. Write order is not guaranteed: skill_invocations may be written before routing_events
23
+ -- 3. session_id references are maintained by application logic; sessions is an aggregate
24
+ -- table that may lag behind event writes
25
+ -- 4. Indexes on join columns provide equivalent query performance to FK indexes
26
+ --
27
+
28
+ -- ── Events & Sessions ─────────────────────────────────────────────────────
29
+
30
+ CREATE TABLE IF NOT EXISTS events (
31
+ event_id TEXT PRIMARY KEY,
32
+ session_id TEXT NOT NULL,
33
+ project_path TEXT NOT NULL,
34
+ timestamp TEXT NOT NULL,
35
+ hook_type TEXT NOT NULL CHECK(hook_type IN ('PreToolUse', 'PostToolUse', 'UserPromptSubmit', 'Notification', 'Stop')),
36
+ tool_name TEXT,
37
+ tool_input TEXT,
38
+ tool_output TEXT,
39
+ user_prompt TEXT,
40
+ ai_response TEXT,
41
+ distilled INTEGER DEFAULT 0,
42
+ created_at TEXT DEFAULT (datetime('now'))
43
+ );
44
+
45
+ CREATE INDEX IF NOT EXISTS idx_events_session ON events(session_id);
46
+ CREATE INDEX IF NOT EXISTS idx_events_project ON events(project_path);
47
+ CREATE INDEX IF NOT EXISTS idx_events_timestamp ON events(timestamp DESC);
48
+ CREATE INDEX IF NOT EXISTS idx_events_distilled ON events(distilled);
49
+ CREATE INDEX IF NOT EXISTS idx_events_hook_type ON events(hook_type);
50
+
51
+ CREATE TABLE IF NOT EXISTS sessions (
52
+ session_id TEXT PRIMARY KEY,
53
+ project_path TEXT NOT NULL,
54
+ status TEXT NOT NULL DEFAULT 'active' CHECK(status IN ('active', 'completed', 'interrupted', 'resumed', 'abandoned')),
55
+ first_prompt TEXT,
56
+ start_time TEXT NOT NULL,
57
+ end_time TEXT,
58
+ last_event_time TEXT,
59
+ event_count INTEGER DEFAULT 0,
60
+ created_at TEXT DEFAULT (datetime('now')),
61
+ updated_at TEXT DEFAULT (datetime('now'))
62
+ );
63
+
64
+ CREATE INDEX IF NOT EXISTS idx_sessions_project ON sessions(project_path);
65
+ CREATE INDEX IF NOT EXISTS idx_sessions_status ON sessions(status);
66
+ CREATE INDEX IF NOT EXISTS idx_sessions_start_time ON sessions(start_time DESC);
67
+
68
+ -- ── Injections ─────────────────────────────────────────────────────
69
+
70
+ CREATE TABLE IF NOT EXISTS injections (
71
+ id TEXT PRIMARY KEY,
72
+ event_id TEXT,
73
+ session_id TEXT NOT NULL,
74
+ timestamp TEXT NOT NULL,
75
+ source_handler TEXT NOT NULL,
76
+ injection_type TEXT NOT NULL CHECK(injection_type IN ('systemMessage', 'additionalContext', 'reason')),
77
+ content TEXT NOT NULL,
78
+ created_at TEXT DEFAULT (datetime('now')),
79
+ FOREIGN KEY (event_id) REFERENCES events(event_id) ON DELETE CASCADE
80
+ );
81
+
82
+ CREATE INDEX IF NOT EXISTS idx_injections_session ON injections(session_id);
83
+ CREATE INDEX IF NOT EXISTS idx_injections_event ON injections(event_id);
84
+ CREATE INDEX IF NOT EXISTS idx_injections_timestamp ON injections(timestamp DESC);
85
+
86
+ -- ── Tasks ──────────────────────────────────────────────────────────
87
+
88
+ CREATE TABLE IF NOT EXISTS tasks (
89
+ id TEXT PRIMARY KEY,
90
+ session_id TEXT NOT NULL,
91
+ title TEXT NOT NULL,
92
+ description TEXT,
93
+ start_time TEXT NOT NULL,
94
+ end_time TEXT,
95
+ status TEXT DEFAULT 'active' CHECK(status IN ('active', 'completed', 'abandoned')),
96
+ event_count INTEGER DEFAULT 0,
97
+ created_at TEXT DEFAULT (datetime('now'))
98
+ );
99
+
100
+ CREATE TABLE IF NOT EXISTS task_events (
101
+ task_id TEXT NOT NULL,
102
+ event_id TEXT NOT NULL,
103
+ PRIMARY KEY (task_id, event_id),
104
+ FOREIGN KEY (task_id) REFERENCES tasks(id) ON DELETE CASCADE,
105
+ FOREIGN KEY (event_id) REFERENCES events(event_id) ON DELETE CASCADE
106
+ );
107
+
108
+ CREATE INDEX IF NOT EXISTS idx_tasks_session ON tasks(session_id);
109
+ CREATE INDEX IF NOT EXISTS idx_tasks_start_time ON tasks(start_time DESC);
110
+ CREATE INDEX IF NOT EXISTS idx_task_events_task ON task_events(task_id);
111
+ CREATE INDEX IF NOT EXISTS idx_task_events_event ON task_events(event_id);
112
+
113
+ -- ── Routing Events (agent routing observability) ─────────────────────────
114
+
115
+ CREATE TABLE IF NOT EXISTS routing_events (
116
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
117
+ session_id TEXT NOT NULL,
118
+ route_request_id TEXT,
119
+ project_path TEXT NOT NULL,
120
+ ts INTEGER NOT NULL,
121
+ prompt TEXT NOT NULL,
122
+ intent_json TEXT NOT NULL,
123
+ routed_to_type TEXT,
124
+ routed_to_name TEXT,
125
+ is_forced INTEGER DEFAULT 0,
126
+ obeyed INTEGER,
127
+ classification_ms INTEGER,
128
+ fallback_used INTEGER DEFAULT 0,
129
+ refusal_reason TEXT,
130
+ first_tool_name TEXT,
131
+ first_tool_ts INTEGER,
132
+ completed_ts INTEGER,
133
+ total_execution_ms INTEGER,
134
+ completion_reason TEXT,
135
+ downstream_task_chain TEXT,
136
+ injection_version TEXT,
137
+ experiment_id TEXT,
138
+ experiment_group TEXT,
139
+ skill_confidence REAL,
140
+ skill_source TEXT,
141
+ created_at TEXT DEFAULT (datetime('now'))
142
+ );
143
+
144
+ CREATE INDEX IF NOT EXISTS idx_routing_events_session ON routing_events(session_id);
145
+ CREATE INDEX IF NOT EXISTS idx_routing_events_route_request ON routing_events(route_request_id);
146
+ CREATE INDEX IF NOT EXISTS idx_routing_events_ts ON routing_events(ts DESC);
147
+ CREATE INDEX IF NOT EXISTS idx_routing_events_agent ON routing_events(routed_to_name, obeyed);
148
+ CREATE INDEX IF NOT EXISTS idx_routing_events_obeyed ON routing_events(obeyed);
149
+ CREATE INDEX IF NOT EXISTS idx_routing_events_experiment ON routing_events(experiment_id, experiment_group);
150
+
151
+ -- ── Token Usage ──────────────────────────────────────────────────────
152
+
153
+ CREATE TABLE IF NOT EXISTS token_usage (
154
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
155
+ session_id TEXT NOT NULL,
156
+ timestamp INTEGER NOT NULL,
157
+ input_tokens INTEGER NOT NULL,
158
+ output_tokens INTEGER NOT NULL,
159
+ total_tokens INTEGER NOT NULL,
160
+ model TEXT,
161
+ tool_name TEXT,
162
+ created_at TEXT DEFAULT (datetime('now'))
163
+ );
164
+
165
+ CREATE INDEX IF NOT EXISTS idx_token_usage_session ON token_usage(session_id);
166
+ CREATE INDEX IF NOT EXISTS idx_token_usage_timestamp ON token_usage(timestamp DESC);
167
+
168
+ -- ── Skill Invocations ─────────────────────────────────────────────────
169
+
170
+ CREATE TABLE IF NOT EXISTS skill_invocations (
171
+ id TEXT PRIMARY KEY,
172
+ route_request_id TEXT,
173
+ session_id TEXT NOT NULL,
174
+ agent_id TEXT,
175
+ skill_id TEXT NOT NULL,
176
+ invocation_type TEXT NOT NULL,
177
+ reason TEXT,
178
+ workflow TEXT,
179
+ phase TEXT,
180
+ feature_slug TEXT,
181
+ artifact_path TEXT,
182
+ depth INTEGER DEFAULT 0,
183
+ success INTEGER DEFAULT 1,
184
+ error TEXT,
185
+ timestamp INTEGER NOT NULL,
186
+ created_at TEXT DEFAULT (datetime('now'))
187
+ );
188
+
189
+ CREATE INDEX IF NOT EXISTS idx_skill_invocations_route_request ON skill_invocations(route_request_id);
190
+ CREATE INDEX IF NOT EXISTS idx_skill_invocations_session ON skill_invocations(session_id);
191
+ CREATE INDEX IF NOT EXISTS idx_skill_invocations_skill ON skill_invocations(skill_id);
192
+ CREATE INDEX IF NOT EXISTS idx_skill_invocations_timestamp ON skill_invocations(timestamp DESC);
193
+
194
+ -- ── Composite Indexes (high-frequency query optimization) ─────────────────────
195
+ -- These cover session-scoped queries that filter by session_id then sort by time.
196
+ -- Existing single-column indexes are retained for other query paths.
197
+
198
+ CREATE INDEX IF NOT EXISTS idx_events_session_ts ON events(session_id, timestamp DESC);
199
+ CREATE INDEX IF NOT EXISTS idx_routing_events_session_ts ON routing_events(session_id, ts DESC);
200
+ CREATE INDEX IF NOT EXISTS idx_skill_invocations_session_ts ON skill_invocations(session_id, timestamp DESC);
201
+
202
+ -- ── Additional Performance Indexes (Phase 1 Refactor) ─────────────────────
203
+
204
+ -- routing_events: optimize obeyed flag queries with time sorting
205
+ CREATE INDEX IF NOT EXISTS idx_routing_events_obeyed_ts ON routing_events(obeyed, ts DESC);
206
+
207
+ -- tasks: optimize filter+sort queries (start_time range filter + session join)
208
+ CREATE INDEX IF NOT EXISTS idx_tasks_start_time_session ON tasks(start_time DESC, session_id);
209
+
210
+ -- events: optimize session + hook_type composite queries
211
+ CREATE INDEX IF NOT EXISTS idx_events_session_hook ON events(session_id, hook_type, timestamp DESC);
212
+
213
+ -- injections: optimize session + handler composite queries
214
+ CREATE INDEX IF NOT EXISTS idx_injections_session_handler ON injections(session_id, source_handler);
@@ -0,0 +1,104 @@
1
+ /**
2
+ * SessionOperations — sessions 聚合表读写
3
+ *
4
+ * 拆分自 sqlite.ts。负责:
5
+ * - upsertSession:每次 writeEvent 后被调用,更新 sessions 聚合
6
+ * - querySessions:直接读聚合表,O(sessions) 而非 O(sessions × events)
7
+ */
8
+
9
+ import type Database from 'better-sqlite3';
10
+ import type { ForgeEvent } from '../types.js';
11
+
12
+ export interface SessionSummary {
13
+ session_id: string;
14
+ first_prompt: string;
15
+ event_count: number;
16
+ start_time: string;
17
+ end_time: string;
18
+ }
19
+
20
+ export class SessionOperations {
21
+ constructor(private db: Database.Database) {}
22
+
23
+ /**
24
+ * 将事件聚合到 sessions 表,供 querySessions 直接读取。
25
+ *
26
+ * 语义:
27
+ * - 首次出现 session_id → 插入一行
28
+ * - 已存在 → event_count += 1,end/last_event_time 取更晚的,first_prompt 只在
29
+ * 原值为 NULL 时才被 UserPromptSubmit 的前 200 字填充
30
+ */
31
+ upsertSession(event: ForgeEvent): void {
32
+ const firstPrompt =
33
+ event.hook_type === 'UserPromptSubmit' && event.user_prompt
34
+ ? event.user_prompt.slice(0, 200)
35
+ : null;
36
+
37
+ const stmt = this.db.prepare(`
38
+ INSERT INTO sessions (
39
+ session_id, project_path, status, first_prompt,
40
+ start_time, end_time, last_event_time, event_count
41
+ )
42
+ VALUES (?, ?, 'active', ?, ?, ?, ?, 1)
43
+ ON CONFLICT(session_id) DO UPDATE SET
44
+ end_time = CASE
45
+ WHEN excluded.end_time > COALESCE(sessions.end_time, '') THEN excluded.end_time
46
+ ELSE sessions.end_time
47
+ END,
48
+ last_event_time = CASE
49
+ WHEN excluded.last_event_time > COALESCE(sessions.last_event_time, '') THEN excluded.last_event_time
50
+ ELSE sessions.last_event_time
51
+ END,
52
+ event_count = COALESCE(sessions.event_count, 0) + 1,
53
+ first_prompt = COALESCE(sessions.first_prompt, excluded.first_prompt),
54
+ updated_at = datetime('now')
55
+ `);
56
+ stmt.run(
57
+ event.session_id,
58
+ event.project_path,
59
+ firstPrompt,
60
+ event.timestamp,
61
+ event.timestamp,
62
+ event.timestamp,
63
+ );
64
+ }
65
+
66
+ querySessions(filter: {
67
+ project_path?: string;
68
+ limit?: number;
69
+ } = {}): SessionSummary[] {
70
+ const conditions: string[] = [];
71
+ const params: unknown[] = [];
72
+
73
+ if (filter.project_path) {
74
+ conditions.push('project_path = ?');
75
+ params.push(filter.project_path);
76
+ }
77
+
78
+ const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
79
+ const limit = filter.limit ?? 10;
80
+
81
+ const sql = `
82
+ SELECT
83
+ session_id,
84
+ first_prompt,
85
+ event_count,
86
+ start_time,
87
+ COALESCE(end_time, last_event_time, start_time) AS end_time
88
+ FROM sessions
89
+ ${where}
90
+ ORDER BY start_time DESC
91
+ LIMIT ?
92
+ `;
93
+
94
+ params.push(limit);
95
+ const rows = this.db.prepare(sql).all(...params) as Array<Record<string, unknown>>;
96
+ return rows.map(r => ({
97
+ session_id: r.session_id as string,
98
+ first_prompt: (r.first_prompt as string) || '',
99
+ event_count: (r.event_count as number) ?? 0,
100
+ start_time: r.start_time as string,
101
+ end_time: r.end_time as string,
102
+ }));
103
+ }
104
+ }
@@ -0,0 +1,164 @@
1
+ /**
2
+ * SkillOperations — skill_invocations 表读写 + 工作流聚合查询
3
+ *
4
+ * 拆分自 sqlite.ts。
5
+ */
6
+
7
+ import type Database from 'better-sqlite3';
8
+ import type { SkillInvocationRow } from './rows.js';
9
+
10
+ export class SkillOperations {
11
+ constructor(private db: Database.Database) {}
12
+
13
+ writeSkillInvocation(row: Omit<SkillInvocationRow, 'created_at'>): void {
14
+ const sql = `INSERT INTO skill_invocations
15
+ (id, route_request_id, session_id, agent_id, skill_id, invocation_type,
16
+ reason, workflow, phase, feature_slug, artifact_path,
17
+ depth, success, error, timestamp)
18
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`;
19
+ this.db.prepare(sql).run(
20
+ row.id,
21
+ row.route_request_id,
22
+ row.session_id,
23
+ row.agent_id,
24
+ row.skill_id,
25
+ row.invocation_type,
26
+ row.reason,
27
+ row.workflow,
28
+ row.phase,
29
+ row.feature_slug,
30
+ row.artifact_path,
31
+ row.depth,
32
+ row.success,
33
+ row.error,
34
+ row.timestamp,
35
+ );
36
+ }
37
+
38
+ querySkillInvocations(filter: {
39
+ route_request_id?: string;
40
+ session_id?: string;
41
+ skill_id?: string;
42
+ since?: number;
43
+ limit?: number;
44
+ } = {}): SkillInvocationRow[] {
45
+ const conditions: string[] = [];
46
+ const params: unknown[] = [];
47
+
48
+ if (filter.route_request_id) {
49
+ conditions.push('route_request_id = ?');
50
+ params.push(filter.route_request_id);
51
+ }
52
+ if (filter.session_id) {
53
+ conditions.push('session_id = ?');
54
+ params.push(filter.session_id);
55
+ }
56
+ if (filter.skill_id) {
57
+ conditions.push('skill_id = ?');
58
+ params.push(filter.skill_id);
59
+ }
60
+ if (filter.since !== undefined) {
61
+ conditions.push('timestamp >= ?');
62
+ params.push(filter.since);
63
+ }
64
+
65
+ const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
66
+ const limit = filter.limit ?? 100;
67
+ const sql = `SELECT * FROM skill_invocations ${where} ORDER BY timestamp DESC LIMIT ?`;
68
+
69
+ params.push(limit);
70
+ return this.db.prepare(sql).all(...params) as SkillInvocationRow[];
71
+ }
72
+
73
+ /**
74
+ * 按 route_request_id 聚合工作流进度。
75
+ *
76
+ * 用途:Web UI 展示「某次路由 / 某个 session 走完了哪些 phase」。仅聚合
77
+ * `workflow IS NOT NULL` 的调用(工作流型 reason),普通调用不会被纳入。
78
+ */
79
+ queryWorkflowProgress(filter: {
80
+ session_id?: string;
81
+ workflow?: string;
82
+ limit?: number;
83
+ } = {}): Array<{
84
+ route_request_id: string;
85
+ workflow: string;
86
+ phases_completed: string[];
87
+ feature_slug: string | null;
88
+ total_invocations: number;
89
+ success_count: number;
90
+ first_at: number;
91
+ last_at: number;
92
+ }> {
93
+ const conditions: string[] = ['workflow IS NOT NULL', 'route_request_id IS NOT NULL'];
94
+ const params: unknown[] = [];
95
+
96
+ if (filter.session_id) {
97
+ conditions.push('session_id = ?');
98
+ params.push(filter.session_id);
99
+ }
100
+ if (filter.workflow) {
101
+ conditions.push('workflow = ?');
102
+ params.push(filter.workflow);
103
+ }
104
+
105
+ const where = `WHERE ${conditions.join(' AND ')}`;
106
+ const limit = filter.limit ?? 100;
107
+
108
+ const sql = `
109
+ SELECT
110
+ route_request_id,
111
+ workflow,
112
+ GROUP_CONCAT(phase, '||') AS phases_raw,
113
+ MIN(feature_slug) AS feature_slug,
114
+ COUNT(*) AS total_invocations,
115
+ SUM(success) AS success_count,
116
+ MIN(timestamp) AS first_at,
117
+ MAX(timestamp) AS last_at
118
+ FROM (
119
+ SELECT * FROM skill_invocations
120
+ ${where}
121
+ ORDER BY timestamp ASC
122
+ )
123
+ GROUP BY route_request_id, workflow
124
+ ORDER BY last_at DESC
125
+ LIMIT ?
126
+ `;
127
+
128
+ type AggRow = {
129
+ route_request_id: string;
130
+ workflow: string;
131
+ phases_raw: string | null;
132
+ feature_slug: string | null;
133
+ total_invocations: number;
134
+ success_count: number | null;
135
+ first_at: number;
136
+ last_at: number;
137
+ };
138
+
139
+ params.push(limit);
140
+ const rows = this.db.prepare(sql).all(...params) as AggRow[];
141
+
142
+ return rows.map(r => {
143
+ const phases = r.phases_raw ? r.phases_raw.split('||').filter(Boolean) : [];
144
+ const seen = new Set<string>();
145
+ const phases_completed: string[] = [];
146
+ for (const p of phases) {
147
+ if (!seen.has(p)) {
148
+ seen.add(p);
149
+ phases_completed.push(p);
150
+ }
151
+ }
152
+ return {
153
+ route_request_id: r.route_request_id,
154
+ workflow: r.workflow,
155
+ phases_completed,
156
+ feature_slug: r.feature_slug,
157
+ total_invocations: r.total_invocations,
158
+ success_count: r.success_count ?? 0,
159
+ first_at: r.first_at,
160
+ last_at: r.last_at,
161
+ };
162
+ });
163
+ }
164
+ }
@@ -0,0 +1,194 @@
1
+ /**
2
+ * SQLiteStorage — 装配入口(facade)
3
+ *
4
+ * 历史上这是一个 1000+ 行的单文件实现。重构后职责拆分到独立的 *Operations 类,
5
+ * 此文件保留为:
6
+ * - 组合 db 实例 + 各个 Operations
7
+ * - 保持原有 API 完全向后兼容(方法签名 / EventEmitter 行为 / 类型 re-export)
8
+ *
9
+ * 职责矩阵:
10
+ * base.ts — 数据库连接、schema、迁移
11
+ * events.ts — events 表读写
12
+ * sessions.ts — sessions 聚合表
13
+ * tasks.ts — tasks / task_events
14
+ * injections.ts — injections
15
+ * routing.ts — routing_events + experiment_assignments
16
+ * skills.ts — skill_invocations + workflow 聚合
17
+ * token-usage.ts — token_usage
18
+ * maintenance.ts — 清理 / VACUUM
19
+ */
20
+
21
+ import { EventEmitter } from 'node:events';
22
+ import type Database from 'better-sqlite3';
23
+ import type { ForgeEvent } from '../types.js';
24
+ import { SQLiteBase } from './base.js';
25
+ import { EventOperations } from './events.js';
26
+ import { SessionOperations } from './sessions.js';
27
+ import { TaskOperations } from './tasks.js';
28
+ import { InjectionOperations } from './injections.js';
29
+ import { RoutingOperations } from './routing.js';
30
+ import { SkillOperations } from './skills.js';
31
+ import { TokenUsageOperations } from './token-usage.js';
32
+ import { MaintenanceOperations } from './maintenance.js';
33
+ import { logger } from '../utils/logger.js';
34
+ import type { SkillInvocationRow } from './rows.js';
35
+ import type {
36
+ RoutingEventRecord,
37
+ RoutingEventRow,
38
+ } from './routing.js';
39
+ import type { SessionSummary } from './sessions.js';
40
+ import type { Injection } from './injections.js';
41
+ import type { TaskRecord } from './tasks.js';
42
+
43
+ // Re-export row types so existing consumers can import from './sqlite.js'.
44
+ export type {
45
+ EventRow,
46
+ SessionRow,
47
+ InjectionRow,
48
+ TaskRow,
49
+ TokenUsageRow,
50
+ SkillInvocationRow,
51
+ } from './rows.js';
52
+
53
+ // Re-export operation-level types from their new homes (向后兼容)
54
+ export type { SessionSummary } from './sessions.js';
55
+ export type { Injection } from './injections.js';
56
+ export type { TaskRecord, TaskFilter, TaskPage } from './tasks.js';
57
+ export type { RoutingEventRecord, RoutingEventRow } from './routing.js';
58
+
59
+ export class SQLiteStorage extends EventEmitter {
60
+ private base: SQLiteBase;
61
+ private events: EventOperations;
62
+ private sessions: SessionOperations;
63
+ private tasks: TaskOperations;
64
+ private injections: InjectionOperations;
65
+ private routing: RoutingOperations;
66
+ private skills: SkillOperations;
67
+ private tokenUsage: TokenUsageOperations;
68
+ private maintenance: MaintenanceOperations;
69
+
70
+ constructor(dbPath: string) {
71
+ super();
72
+ this.base = new SQLiteBase(dbPath);
73
+
74
+ const db = this.base.getDatabase();
75
+ this.sessions = new SessionOperations(db);
76
+ this.events = new EventOperations(db, this);
77
+ this.tasks = new TaskOperations(db);
78
+ this.injections = new InjectionOperations(db);
79
+ this.routing = new RoutingOperations(db);
80
+ this.skills = new SkillOperations(db);
81
+ this.tokenUsage = new TokenUsageOperations(db);
82
+ this.maintenance = new MaintenanceOperations(db, dbPath);
83
+ }
84
+
85
+ // ── Database accessors ─────────────────────────────────────────────────
86
+ getDatabase(): Database.Database { return this.base.getDatabase(); }
87
+ getDbPath(): string { return this.base.getDbPath(); }
88
+
89
+ // ── Event operations ────────────────────────────────────────────────────
90
+ writeEvent(event: ForgeEvent): void { this.events.writeEvent(event); }
91
+ queryEvents(filter: Parameters<EventOperations['queryEvents']>[0]): ForgeEvent[] {
92
+ return this.events.queryEvents(filter);
93
+ }
94
+ countEvents(filter?: Parameters<EventOperations['countEvents']>[0]): number { return this.events.countEvents(filter); }
95
+ searchEvents(filter: Parameters<EventOperations['searchEvents']>[0]): ForgeEvent[] {
96
+ return this.events.searchEvents(filter);
97
+ }
98
+
99
+ // ── Session operations ─────────────────────────────────────────────────
100
+ upsertSession(event: ForgeEvent): void { this.sessions.upsertSession(event); }
101
+ querySessions(filter: Parameters<SessionOperations['querySessions']>[0] = {}): SessionSummary[] {
102
+ return this.sessions.querySessions(filter);
103
+ }
104
+
105
+ // ── Injection operations ───────────────────────────────────────────────
106
+ writeInjection(injection: Injection): void { this.injections.writeInjection(injection); }
107
+ queryInjections(filter: Parameters<InjectionOperations['queryInjections']>[0] = {}): Injection[] {
108
+ return this.injections.queryInjections(filter);
109
+ }
110
+
111
+ // ── Task operations ─────────────────────────────────────────────────
112
+ writeTask(task: { id: string; session_id: string; title: string; start_time: string }): void {
113
+ this.tasks.writeTask(task);
114
+ }
115
+ updateTask(taskId: string, updates: { end_time?: string; status?: string; event_count?: number; title?: string }): void {
116
+ this.tasks.updateTask(taskId, updates);
117
+ }
118
+ linkEventToTask(taskId: string, eventId: string): void {
119
+ this.tasks.linkEventToTask(taskId, eventId);
120
+ }
121
+ queryTasks(filter: Parameters<TaskOperations['queryTasks']>[0] = {}): TaskRecord[] {
122
+ return this.tasks.queryTasks(filter);
123
+ }
124
+ queryTasksFiltered(filter: Parameters<TaskOperations['queryTasksFiltered']>[0] = {}): import('./tasks.js').TaskPage {
125
+ return this.tasks.queryTasksFiltered(filter);
126
+ }
127
+ queryTaskProjects(): string[] {
128
+ return this.tasks.queryTaskProjects();
129
+ }
130
+ getTaskEventIds(taskId: string): string[] { return this.tasks.getTaskEventIds(taskId); }
131
+
132
+ // ── Routing events ─────────────────────────────────────────────────────
133
+ writeRoutingEvent(record: RoutingEventRecord): number {
134
+ return this.routing.writeRoutingEvent(record);
135
+ }
136
+ updateRoutingEvent(id: number, patch: Partial<RoutingEventRecord>): void {
137
+ this.routing.updateRoutingEvent(id, patch);
138
+ }
139
+ queryRoutingEvents(filter: Parameters<RoutingOperations['queryRoutingEvents']>[0] = {}): RoutingEventRow[] {
140
+ return this.routing.queryRoutingEvents(filter);
141
+ }
142
+ findPendingRoutingEvents(ageMs: number): RoutingEventRow[] {
143
+ return this.routing.findPendingRoutingEvents(ageMs);
144
+ }
145
+ getRecentRoutingEvent(sessionId: string): { id: number } | null {
146
+ return this.routing.getRecentRoutingEvent(sessionId);
147
+ }
148
+
149
+ // ── Experiment assignments ─────────────────────────────────────────────
150
+ getExperimentAssignment(sessionId: string, experimentId: string): string | null {
151
+ return this.routing.getExperimentAssignment(sessionId, experimentId);
152
+ }
153
+ setExperimentAssignment(sessionId: string, experimentId: string, groupId: string): void {
154
+ this.routing.setExperimentAssignment(sessionId, experimentId, groupId);
155
+ }
156
+ queryExperimentStats(experimentId: string): ReturnType<RoutingOperations['queryExperimentStats']> {
157
+ return this.routing.queryExperimentStats(experimentId);
158
+ }
159
+
160
+ // ── Token usage ────────────────────────────────────────────────────────
161
+ recordTokenUsage(params: Parameters<TokenUsageOperations['recordTokenUsage']>[0]): void {
162
+ this.tokenUsage.recordTokenUsage(params);
163
+ }
164
+ getTokenUsageBySession(session_id: string): ReturnType<TokenUsageOperations['getTokenUsageBySession']> {
165
+ return this.tokenUsage.getTokenUsageBySession(session_id);
166
+ }
167
+ listTokenUsage(filter: Parameters<TokenUsageOperations['listTokenUsage']>[0] = {}): ReturnType<TokenUsageOperations['listTokenUsage']> {
168
+ return this.tokenUsage.listTokenUsage(filter);
169
+ }
170
+
171
+ // ── Skill invocations ──────────────────────────────────────────────────
172
+ writeSkillInvocation(row: Omit<SkillInvocationRow, 'created_at'>): void {
173
+ this.skills.writeSkillInvocation(row);
174
+ }
175
+ querySkillInvocations(filter: Parameters<SkillOperations['querySkillInvocations']>[0] = {}): SkillInvocationRow[] {
176
+ return this.skills.querySkillInvocations(filter);
177
+ }
178
+ queryWorkflowProgress(filter: Parameters<SkillOperations['queryWorkflowProgress']>[0] = {}): ReturnType<SkillOperations['queryWorkflowProgress']> {
179
+ return this.skills.queryWorkflowProgress(filter);
180
+ }
181
+
182
+ // ── Maintenance ────────────────────────────────────────────────────────
183
+ cleanOldEvents(daysToKeep: number = 30): number { return this.maintenance.cleanOldEvents(daysToKeep); }
184
+ runMaintenance(maxSizeMb: number): void { this.maintenance.runMaintenance(maxSizeMb); }
185
+ vacuum(): void { this.maintenance.vacuum(); }
186
+
187
+ close(): void {
188
+ try {
189
+ this.base.getDatabase().close();
190
+ } catch (err) {
191
+ logger.warn(`Failed to close database: ${err}`);
192
+ }
193
+ }
194
+ }