@winspan/claude-forge 8.54.3 → 9.2.0

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 (879) hide show
  1. package/DEVELOPMENT.md +649 -33
  2. package/README.md +155 -17
  3. package/dist/catalogs/agents.json +72 -0
  4. package/dist/catalogs/skills.json +194 -0
  5. package/dist/claudemd/claudemd-generator.d.ts +45 -45
  6. package/dist/claudemd/claudemd-generator.d.ts.map +1 -1
  7. package/dist/claudemd/claudemd-generator.js +128 -449
  8. package/dist/claudemd/claudemd-generator.js.map +1 -1
  9. package/dist/claudemd/index.d.ts +14 -4
  10. package/dist/claudemd/index.d.ts.map +1 -1
  11. package/dist/claudemd/index.js +15 -4
  12. package/dist/claudemd/index.js.map +1 -1
  13. package/dist/claudemd/resume-manager.d.ts.map +1 -1
  14. package/dist/claudemd/resume-manager.js +37 -9
  15. package/dist/claudemd/resume-manager.js.map +1 -1
  16. package/dist/claudemd/templates/swarm-protocol.md +35 -186
  17. package/dist/claudemd/violations-manager.d.ts +40 -0
  18. package/dist/claudemd/violations-manager.d.ts.map +1 -0
  19. package/dist/claudemd/violations-manager.js +106 -0
  20. package/dist/claudemd/violations-manager.js.map +1 -0
  21. package/dist/cli/commands/admin.d.ts +15 -0
  22. package/dist/cli/commands/admin.d.ts.map +1 -0
  23. package/dist/cli/commands/admin.js +177 -0
  24. package/dist/cli/commands/admin.js.map +1 -0
  25. package/dist/cli/commands/agents.d.ts +18 -0
  26. package/dist/cli/commands/agents.d.ts.map +1 -0
  27. package/dist/cli/commands/agents.js +160 -0
  28. package/dist/cli/commands/agents.js.map +1 -0
  29. package/dist/cli/commands/bypass.d.ts +18 -0
  30. package/dist/cli/commands/bypass.d.ts.map +1 -0
  31. package/dist/cli/commands/bypass.js +87 -0
  32. package/dist/cli/commands/bypass.js.map +1 -0
  33. package/dist/cli/commands/claudemd.d.ts +60 -0
  34. package/dist/cli/commands/claudemd.d.ts.map +1 -1
  35. package/dist/cli/commands/claudemd.js +174 -37
  36. package/dist/cli/commands/claudemd.js.map +1 -1
  37. package/dist/cli/commands/config.d.ts.map +1 -1
  38. package/dist/cli/commands/config.js +94 -1
  39. package/dist/cli/commands/config.js.map +1 -1
  40. package/dist/cli/commands/daemon.d.ts +39 -0
  41. package/dist/cli/commands/daemon.d.ts.map +1 -1
  42. package/dist/cli/commands/daemon.js +167 -20
  43. package/dist/cli/commands/daemon.js.map +1 -1
  44. package/dist/cli/commands/decisions.d.ts +129 -0
  45. package/dist/cli/commands/decisions.d.ts.map +1 -0
  46. package/dist/cli/commands/decisions.js +669 -0
  47. package/dist/cli/commands/decisions.js.map +1 -0
  48. package/dist/cli/commands/doctor.d.ts +29 -0
  49. package/dist/cli/commands/doctor.d.ts.map +1 -0
  50. package/dist/cli/commands/doctor.js +124 -0
  51. package/dist/cli/commands/doctor.js.map +1 -0
  52. package/dist/cli/commands/entropy.d.ts +35 -0
  53. package/dist/cli/commands/entropy.d.ts.map +1 -0
  54. package/dist/cli/commands/entropy.js +121 -0
  55. package/dist/cli/commands/entropy.js.map +1 -0
  56. package/dist/cli/commands/executions.d.ts +1 -0
  57. package/dist/cli/commands/executions.d.ts.map +1 -1
  58. package/dist/cli/commands/executions.js +10 -1
  59. package/dist/cli/commands/executions.js.map +1 -1
  60. package/dist/cli/commands/fix.d.ts +31 -0
  61. package/dist/cli/commands/fix.d.ts.map +1 -0
  62. package/dist/cli/commands/fix.js +108 -0
  63. package/dist/cli/commands/fix.js.map +1 -0
  64. package/dist/cli/commands/governance.d.ts +21 -0
  65. package/dist/cli/commands/governance.d.ts.map +1 -0
  66. package/dist/cli/commands/governance.js +60 -0
  67. package/dist/cli/commands/governance.js.map +1 -0
  68. package/dist/cli/commands/init.d.ts +27 -0
  69. package/dist/cli/commands/init.d.ts.map +1 -1
  70. package/dist/cli/commands/init.js +158 -146
  71. package/dist/cli/commands/init.js.map +1 -1
  72. package/dist/cli/commands/insights-goal-check.d.ts +50 -0
  73. package/dist/cli/commands/insights-goal-check.d.ts.map +1 -0
  74. package/dist/cli/commands/insights-goal-check.js +318 -0
  75. package/dist/cli/commands/insights-goal-check.js.map +1 -0
  76. package/dist/cli/commands/insights.d.ts +15 -0
  77. package/dist/cli/commands/insights.d.ts.map +1 -0
  78. package/dist/cli/commands/insights.js +127 -0
  79. package/dist/cli/commands/insights.js.map +1 -0
  80. package/dist/cli/commands/knowledge.d.ts +66 -0
  81. package/dist/cli/commands/knowledge.d.ts.map +1 -0
  82. package/dist/cli/commands/knowledge.js +897 -0
  83. package/dist/cli/commands/knowledge.js.map +1 -0
  84. package/dist/cli/commands/mcp.d.ts +0 -12
  85. package/dist/cli/commands/mcp.d.ts.map +1 -1
  86. package/dist/cli/commands/mcp.js +11 -5
  87. package/dist/cli/commands/mcp.js.map +1 -1
  88. package/dist/cli/commands/menu.d.ts.map +1 -1
  89. package/dist/cli/commands/menu.js +10 -184
  90. package/dist/cli/commands/menu.js.map +1 -1
  91. package/dist/cli/commands/project.d.ts +98 -0
  92. package/dist/cli/commands/project.d.ts.map +1 -0
  93. package/dist/cli/commands/project.js +382 -0
  94. package/dist/cli/commands/project.js.map +1 -0
  95. package/dist/cli/commands/skills.d.ts.map +1 -1
  96. package/dist/cli/commands/skills.js +14 -128
  97. package/dist/cli/commands/skills.js.map +1 -1
  98. package/dist/cli/commands/spec.d.ts +40 -0
  99. package/dist/cli/commands/spec.d.ts.map +1 -0
  100. package/dist/cli/commands/spec.js +49 -0
  101. package/dist/cli/commands/spec.js.map +1 -0
  102. package/dist/cli/commands/stats.d.ts.map +1 -1
  103. package/dist/cli/commands/stats.js +3 -2
  104. package/dist/cli/commands/stats.js.map +1 -1
  105. package/dist/cli/commands/status.d.ts.map +1 -1
  106. package/dist/cli/commands/status.js +17 -2
  107. package/dist/cli/commands/status.js.map +1 -1
  108. package/dist/cli/commands/trace.d.ts.map +1 -1
  109. package/dist/cli/commands/trace.js +4 -9
  110. package/dist/cli/commands/trace.js.map +1 -1
  111. package/dist/cli/commands/violations.d.ts +14 -0
  112. package/dist/cli/commands/violations.d.ts.map +1 -0
  113. package/dist/cli/commands/violations.js +43 -0
  114. package/dist/cli/commands/violations.js.map +1 -0
  115. package/dist/cli/index.js +26 -0
  116. package/dist/cli/index.js.map +1 -1
  117. package/dist/cli/init/hook-manager.d.ts +1 -1
  118. package/dist/cli/init/hook-manager.d.ts.map +1 -1
  119. package/dist/cli/init/hook-manager.js +6 -0
  120. package/dist/cli/init/hook-manager.js.map +1 -1
  121. package/dist/cli/utils/resolve-session.d.ts +32 -0
  122. package/dist/cli/utils/resolve-session.d.ts.map +1 -0
  123. package/dist/cli/utils/resolve-session.js +39 -0
  124. package/dist/cli/utils/resolve-session.js.map +1 -0
  125. package/dist/core/config.d.ts +4 -1
  126. package/dist/core/config.d.ts.map +1 -1
  127. package/dist/core/config.js +11 -23
  128. package/dist/core/config.js.map +1 -1
  129. package/dist/core/constants.d.ts +14 -13
  130. package/dist/core/constants.d.ts.map +1 -1
  131. package/dist/core/constants.js +20 -13
  132. package/dist/core/constants.js.map +1 -1
  133. package/dist/core/diagnostics/checks.d.ts +151 -0
  134. package/dist/core/diagnostics/checks.d.ts.map +1 -0
  135. package/dist/core/diagnostics/checks.js +765 -0
  136. package/dist/core/diagnostics/checks.js.map +1 -0
  137. package/dist/core/diagnostics/daemon-status.d.ts +77 -0
  138. package/dist/core/diagnostics/daemon-status.d.ts.map +1 -0
  139. package/dist/core/diagnostics/daemon-status.js +113 -0
  140. package/dist/core/diagnostics/daemon-status.js.map +1 -0
  141. package/dist/core/diagnostics/entropy-checks.d.ts +82 -0
  142. package/dist/core/diagnostics/entropy-checks.d.ts.map +1 -0
  143. package/dist/core/diagnostics/entropy-checks.js +395 -0
  144. package/dist/core/diagnostics/entropy-checks.js.map +1 -0
  145. package/dist/core/diagnostics/fix-runner.d.ts +54 -0
  146. package/dist/core/diagnostics/fix-runner.d.ts.map +1 -0
  147. package/dist/core/diagnostics/fix-runner.js +90 -0
  148. package/dist/core/diagnostics/fix-runner.js.map +1 -0
  149. package/dist/core/diagnostics/knip-runner.d.ts +49 -0
  150. package/dist/core/diagnostics/knip-runner.d.ts.map +1 -0
  151. package/dist/core/diagnostics/knip-runner.js +100 -0
  152. package/dist/core/diagnostics/knip-runner.js.map +1 -0
  153. package/dist/core/diagnostics/markers.d.ts +96 -0
  154. package/dist/core/diagnostics/markers.d.ts.map +1 -0
  155. package/dist/core/diagnostics/markers.js +153 -0
  156. package/dist/core/diagnostics/markers.js.map +1 -0
  157. package/dist/core/governance/global-inject.d.ts +60 -0
  158. package/dist/core/governance/global-inject.d.ts.map +1 -0
  159. package/dist/core/governance/global-inject.js +129 -0
  160. package/dist/core/governance/global-inject.js.map +1 -0
  161. package/dist/core/queue/index.d.ts +16 -3
  162. package/dist/core/queue/index.d.ts.map +1 -1
  163. package/dist/core/queue/index.js +14 -3
  164. package/dist/core/queue/index.js.map +1 -1
  165. package/dist/core/storage/base.d.ts +158 -0
  166. package/dist/core/storage/base.d.ts.map +1 -1
  167. package/dist/core/storage/base.js +570 -0
  168. package/dist/core/storage/base.js.map +1 -1
  169. package/dist/core/storage/codec/tool-input-codec.d.ts +93 -0
  170. package/dist/core/storage/codec/tool-input-codec.d.ts.map +1 -0
  171. package/dist/core/storage/codec/tool-input-codec.js +159 -0
  172. package/dist/core/storage/codec/tool-input-codec.js.map +1 -0
  173. package/dist/core/storage/decisions.d.ts +362 -0
  174. package/dist/core/storage/decisions.d.ts.map +1 -0
  175. package/dist/core/storage/decisions.js +502 -0
  176. package/dist/core/storage/decisions.js.map +1 -0
  177. package/dist/core/storage/events.d.ts +112 -8
  178. package/dist/core/storage/events.d.ts.map +1 -1
  179. package/dist/core/storage/events.js +390 -39
  180. package/dist/core/storage/events.js.map +1 -1
  181. package/dist/core/storage/feedback.d.ts +131 -0
  182. package/dist/core/storage/feedback.d.ts.map +1 -0
  183. package/dist/core/storage/feedback.js +187 -0
  184. package/dist/core/storage/feedback.js.map +1 -0
  185. package/dist/core/storage/forge-config.d.ts +40 -0
  186. package/dist/core/storage/forge-config.d.ts.map +1 -0
  187. package/dist/core/storage/forge-config.js +65 -0
  188. package/dist/core/storage/forge-config.js.map +1 -0
  189. package/dist/core/storage/injections.d.ts +28 -0
  190. package/dist/core/storage/injections.d.ts.map +1 -1
  191. package/dist/core/storage/injections.js +62 -5
  192. package/dist/core/storage/injections.js.map +1 -1
  193. package/dist/core/storage/knowledge.d.ts +106 -0
  194. package/dist/core/storage/knowledge.d.ts.map +1 -0
  195. package/dist/core/storage/knowledge.js +202 -0
  196. package/dist/core/storage/knowledge.js.map +1 -0
  197. package/dist/core/storage/maintenance.d.ts +36 -9
  198. package/dist/core/storage/maintenance.d.ts.map +1 -1
  199. package/dist/core/storage/maintenance.js +56 -24
  200. package/dist/core/storage/maintenance.js.map +1 -1
  201. package/dist/core/storage/pipeline-rollup.d.ts +117 -0
  202. package/dist/core/storage/pipeline-rollup.d.ts.map +1 -0
  203. package/dist/core/storage/pipeline-rollup.js +471 -0
  204. package/dist/core/storage/pipeline-rollup.js.map +1 -0
  205. package/dist/core/storage/routing.d.ts +16 -3
  206. package/dist/core/storage/routing.d.ts.map +1 -1
  207. package/dist/core/storage/routing.js +39 -8
  208. package/dist/core/storage/routing.js.map +1 -1
  209. package/dist/core/storage/rows.d.ts +50 -7
  210. package/dist/core/storage/rows.d.ts.map +1 -1
  211. package/dist/core/storage/schema.sql +302 -23
  212. package/dist/core/storage/sessions.d.ts +136 -0
  213. package/dist/core/storage/sessions.d.ts.map +1 -1
  214. package/dist/core/storage/sessions.js +351 -15
  215. package/dist/core/storage/sessions.js.map +1 -1
  216. package/dist/core/storage/skills.d.ts +1 -0
  217. package/dist/core/storage/skills.d.ts.map +1 -1
  218. package/dist/core/storage/skills.js +21 -6
  219. package/dist/core/storage/skills.js.map +1 -1
  220. package/dist/core/storage/sqlite.d.ts +253 -20
  221. package/dist/core/storage/sqlite.d.ts.map +1 -1
  222. package/dist/core/storage/sqlite.js +425 -16
  223. package/dist/core/storage/sqlite.js.map +1 -1
  224. package/dist/core/storage/tasks.d.ts +474 -2
  225. package/dist/core/storage/tasks.d.ts.map +1 -1
  226. package/dist/core/storage/tasks.js +1213 -18
  227. package/dist/core/storage/tasks.js.map +1 -1
  228. package/dist/core/storage/tool-intercepts.d.ts +69 -0
  229. package/dist/core/storage/tool-intercepts.d.ts.map +1 -0
  230. package/dist/core/storage/tool-intercepts.js +116 -0
  231. package/dist/core/storage/tool-intercepts.js.map +1 -0
  232. package/dist/core/storage/workflow-recommendations.d.ts +124 -0
  233. package/dist/core/storage/workflow-recommendations.d.ts.map +1 -0
  234. package/dist/core/storage/workflow-recommendations.js +274 -0
  235. package/dist/core/storage/workflow-recommendations.js.map +1 -0
  236. package/dist/core/types.d.ts +112 -17
  237. package/dist/core/types.d.ts.map +1 -1
  238. package/dist/core/types.js +12 -0
  239. package/dist/core/types.js.map +1 -1
  240. package/dist/core/utils/backup.d.ts +81 -0
  241. package/dist/core/utils/backup.d.ts.map +1 -0
  242. package/dist/core/utils/backup.js +98 -0
  243. package/dist/core/utils/backup.js.map +1 -0
  244. package/dist/core/utils/binary-paths.d.ts +92 -0
  245. package/dist/core/utils/binary-paths.d.ts.map +1 -0
  246. package/dist/core/utils/binary-paths.js +166 -0
  247. package/dist/core/utils/binary-paths.js.map +1 -0
  248. package/dist/core/utils/bypass-token.d.ts +75 -0
  249. package/dist/core/utils/bypass-token.d.ts.map +1 -0
  250. package/dist/core/utils/bypass-token.js +133 -0
  251. package/dist/core/utils/bypass-token.js.map +1 -0
  252. package/dist/core/utils/cc-builtin-agents.d.ts +3 -0
  253. package/dist/core/utils/cc-builtin-agents.d.ts.map +1 -0
  254. package/dist/core/utils/cc-builtin-agents.js +29 -0
  255. package/dist/core/utils/cc-builtin-agents.js.map +1 -0
  256. package/dist/core/utils/claude-cli-spawn.d.ts +106 -0
  257. package/dist/core/utils/claude-cli-spawn.d.ts.map +1 -0
  258. package/dist/core/utils/claude-cli-spawn.js +219 -0
  259. package/dist/core/utils/claude-cli-spawn.js.map +1 -0
  260. package/dist/core/utils/forge-resume-block.d.ts.map +1 -1
  261. package/dist/core/utils/forge-resume-block.js +3 -2
  262. package/dist/core/utils/forge-resume-block.js.map +1 -1
  263. package/dist/core/utils/logger.d.ts +15 -3
  264. package/dist/core/utils/logger.d.ts.map +1 -1
  265. package/dist/core/utils/logger.js +20 -2
  266. package/dist/core/utils/logger.js.map +1 -1
  267. package/dist/core/utils/noise-prompt.d.ts +97 -0
  268. package/dist/core/utils/noise-prompt.d.ts.map +1 -0
  269. package/dist/core/utils/noise-prompt.js +127 -0
  270. package/dist/core/utils/noise-prompt.js.map +1 -0
  271. package/dist/core/utils/path.d.ts +0 -4
  272. package/dist/core/utils/path.d.ts.map +1 -1
  273. package/dist/core/utils/path.js +0 -7
  274. package/dist/core/utils/path.js.map +1 -1
  275. package/dist/core/utils/time.d.ts +41 -0
  276. package/dist/core/utils/time.d.ts.map +1 -1
  277. package/dist/core/utils/time.js +114 -0
  278. package/dist/core/utils/time.js.map +1 -1
  279. package/dist/daemon/agent-sync.d.ts +24 -0
  280. package/dist/daemon/agent-sync.d.ts.map +1 -0
  281. package/dist/daemon/agent-sync.js +114 -0
  282. package/dist/daemon/agent-sync.js.map +1 -0
  283. package/dist/daemon/config-store.d.ts +55 -0
  284. package/dist/daemon/config-store.d.ts.map +1 -0
  285. package/dist/daemon/config-store.js +137 -0
  286. package/dist/daemon/config-store.js.map +1 -0
  287. package/dist/daemon/event-parser.d.ts +22 -0
  288. package/dist/daemon/event-parser.d.ts.map +1 -1
  289. package/dist/daemon/event-parser.js +49 -3
  290. package/dist/daemon/event-parser.js.map +1 -1
  291. package/dist/daemon/handlers/history-exporter.d.ts.map +1 -1
  292. package/dist/daemon/handlers/history-exporter.js +9 -8
  293. package/dist/daemon/handlers/history-exporter.js.map +1 -1
  294. package/dist/daemon/handlers/post-tool-use.d.ts +58 -4
  295. package/dist/daemon/handlers/post-tool-use.d.ts.map +1 -1
  296. package/dist/daemon/handlers/post-tool-use.js +261 -8
  297. package/dist/daemon/handlers/post-tool-use.js.map +1 -1
  298. package/dist/daemon/handlers/pre-tool-use.d.ts +156 -0
  299. package/dist/daemon/handlers/pre-tool-use.d.ts.map +1 -0
  300. package/dist/daemon/handlers/pre-tool-use.js +585 -0
  301. package/dist/daemon/handlers/pre-tool-use.js.map +1 -0
  302. package/dist/daemon/handlers/stop.d.ts +35 -7
  303. package/dist/daemon/handlers/stop.d.ts.map +1 -1
  304. package/dist/daemon/handlers/stop.js +157 -8
  305. package/dist/daemon/handlers/stop.js.map +1 -1
  306. package/dist/daemon/handlers/user-prompt.d.ts +36 -14
  307. package/dist/daemon/handlers/user-prompt.d.ts.map +1 -1
  308. package/dist/daemon/handlers/user-prompt.js +135 -48
  309. package/dist/daemon/handlers/user-prompt.js.map +1 -1
  310. package/dist/daemon/hook-sync.d.ts.map +1 -1
  311. package/dist/daemon/hook-sync.js +2 -1
  312. package/dist/daemon/hook-sync.js.map +1 -1
  313. package/dist/daemon/index.d.ts.map +1 -1
  314. package/dist/daemon/index.js +471 -43
  315. package/dist/daemon/index.js.map +1 -1
  316. package/dist/daemon/lifecycle.d.ts +48 -1
  317. package/dist/daemon/lifecycle.d.ts.map +1 -1
  318. package/dist/daemon/lifecycle.js +98 -2
  319. package/dist/daemon/lifecycle.js.map +1 -1
  320. package/dist/daemon/router.d.ts +4 -1
  321. package/dist/daemon/router.d.ts.map +1 -1
  322. package/dist/daemon/router.js +4 -2
  323. package/dist/daemon/router.js.map +1 -1
  324. package/dist/daemon/rules/defaults.d.ts +20 -0
  325. package/dist/daemon/rules/defaults.d.ts.map +1 -0
  326. package/dist/daemon/rules/defaults.js +692 -0
  327. package/dist/daemon/rules/defaults.js.map +1 -0
  328. package/dist/daemon/rules/registry.d.ts +47 -0
  329. package/dist/daemon/rules/registry.d.ts.map +1 -0
  330. package/dist/daemon/rules/registry.js +84 -0
  331. package/dist/daemon/rules/registry.js.map +1 -0
  332. package/dist/daemon/rules/types.d.ts +170 -0
  333. package/dist/daemon/rules/types.d.ts.map +1 -0
  334. package/dist/daemon/rules/types.js +15 -0
  335. package/dist/daemon/rules/types.js.map +1 -0
  336. package/dist/daemon/rules/whitelist.d.ts +101 -0
  337. package/dist/daemon/rules/whitelist.d.ts.map +1 -0
  338. package/dist/daemon/rules/whitelist.js +210 -0
  339. package/dist/daemon/rules/whitelist.js.map +1 -0
  340. package/dist/daemon/rules/workflow-defaults.d.ts +52 -0
  341. package/dist/daemon/rules/workflow-defaults.d.ts.map +1 -0
  342. package/dist/daemon/rules/workflow-defaults.js +521 -0
  343. package/dist/daemon/rules/workflow-defaults.js.map +1 -0
  344. package/dist/daemon/server.d.ts +11 -1
  345. package/dist/daemon/server.d.ts.map +1 -1
  346. package/dist/daemon/server.js +7 -1
  347. package/dist/daemon/server.js.map +1 -1
  348. package/dist/daemon/services/context-injector.d.ts +34 -0
  349. package/dist/daemon/services/context-injector.d.ts.map +1 -0
  350. package/dist/daemon/services/context-injector.js +61 -0
  351. package/dist/daemon/services/context-injector.js.map +1 -0
  352. package/dist/daemon/services/decision-hint.d.ts +203 -0
  353. package/dist/daemon/services/decision-hint.d.ts.map +1 -0
  354. package/dist/daemon/services/decision-hint.js +487 -0
  355. package/dist/daemon/services/decision-hint.js.map +1 -0
  356. package/dist/daemon/services/event-ttl-sweep.d.ts +86 -0
  357. package/dist/daemon/services/event-ttl-sweep.d.ts.map +1 -0
  358. package/dist/daemon/services/event-ttl-sweep.js +123 -0
  359. package/dist/daemon/services/event-ttl-sweep.js.map +1 -0
  360. package/dist/daemon/services/experience-extractor.d.ts +67 -0
  361. package/dist/daemon/services/experience-extractor.d.ts.map +1 -0
  362. package/dist/daemon/services/experience-extractor.js +323 -0
  363. package/dist/daemon/services/experience-extractor.js.map +1 -0
  364. package/dist/daemon/services/feedback-aggregator.d.ts +179 -0
  365. package/dist/daemon/services/feedback-aggregator.d.ts.map +1 -0
  366. package/dist/daemon/services/feedback-aggregator.js +455 -0
  367. package/dist/daemon/services/feedback-aggregator.js.map +1 -0
  368. package/dist/daemon/services/heartbeat-writer.d.ts +55 -0
  369. package/dist/daemon/services/heartbeat-writer.d.ts.map +1 -0
  370. package/dist/daemon/services/heartbeat-writer.js +111 -0
  371. package/dist/daemon/services/heartbeat-writer.js.map +1 -0
  372. package/dist/daemon/services/idle-session-sweeper.d.ts +61 -0
  373. package/dist/daemon/services/idle-session-sweeper.d.ts.map +1 -0
  374. package/dist/daemon/services/idle-session-sweeper.js +94 -0
  375. package/dist/daemon/services/idle-session-sweeper.js.map +1 -0
  376. package/dist/daemon/services/idle-task-budget.d.ts +50 -0
  377. package/dist/daemon/services/idle-task-budget.d.ts.map +1 -0
  378. package/dist/daemon/services/idle-task-budget.js +72 -0
  379. package/dist/daemon/services/idle-task-budget.js.map +1 -0
  380. package/dist/daemon/services/intercept-revive.d.ts +60 -0
  381. package/dist/daemon/services/intercept-revive.d.ts.map +1 -0
  382. package/dist/daemon/services/intercept-revive.js +86 -0
  383. package/dist/daemon/services/intercept-revive.js.map +1 -0
  384. package/dist/daemon/services/intercept-rollback-guard.d.ts +105 -0
  385. package/dist/daemon/services/intercept-rollback-guard.d.ts.map +1 -0
  386. package/dist/daemon/services/intercept-rollback-guard.js +152 -0
  387. package/dist/daemon/services/intercept-rollback-guard.js.map +1 -0
  388. package/dist/daemon/services/intercept-timeout-sweeper.d.ts +58 -0
  389. package/dist/daemon/services/intercept-timeout-sweeper.d.ts.map +1 -0
  390. package/dist/daemon/services/intercept-timeout-sweeper.js +83 -0
  391. package/dist/daemon/services/intercept-timeout-sweeper.js.map +1 -0
  392. package/dist/daemon/services/kb-injector.d.ts +57 -0
  393. package/dist/daemon/services/kb-injector.d.ts.map +1 -0
  394. package/dist/daemon/services/kb-injector.js +140 -0
  395. package/dist/daemon/services/kb-injector.js.map +1 -0
  396. package/dist/daemon/services/outcome-classification-service.d.ts +49 -0
  397. package/dist/daemon/services/outcome-classification-service.d.ts.map +1 -0
  398. package/dist/daemon/services/outcome-classification-service.js +214 -0
  399. package/dist/daemon/services/outcome-classification-service.js.map +1 -0
  400. package/dist/daemon/services/outcome-classifier.d.ts +136 -0
  401. package/dist/daemon/services/outcome-classifier.d.ts.map +1 -0
  402. package/dist/daemon/services/outcome-classifier.js +178 -0
  403. package/dist/daemon/services/outcome-classifier.js.map +1 -0
  404. package/dist/daemon/services/outcome-nudge.d.ts +107 -0
  405. package/dist/daemon/services/outcome-nudge.d.ts.map +1 -0
  406. package/dist/daemon/services/outcome-nudge.js +242 -0
  407. package/dist/daemon/services/outcome-nudge.js.map +1 -0
  408. package/dist/daemon/services/spec-approval.d.ts +127 -0
  409. package/dist/daemon/services/spec-approval.d.ts.map +1 -0
  410. package/dist/daemon/services/spec-approval.js +216 -0
  411. package/dist/daemon/services/spec-approval.js.map +1 -0
  412. package/dist/daemon/services/spec-gate.d.ts +54 -0
  413. package/dist/daemon/services/spec-gate.d.ts.map +1 -0
  414. package/dist/daemon/services/spec-gate.js +113 -0
  415. package/dist/daemon/services/spec-gate.js.map +1 -0
  416. package/dist/daemon/services/task-boundary-classifier.d.ts +78 -0
  417. package/dist/daemon/services/task-boundary-classifier.d.ts.map +1 -0
  418. package/dist/daemon/services/task-boundary-classifier.js +202 -0
  419. package/dist/daemon/services/task-boundary-classifier.js.map +1 -0
  420. package/dist/daemon/services/task-segmenter.d.ts +219 -1
  421. package/dist/daemon/services/task-segmenter.d.ts.map +1 -1
  422. package/dist/daemon/services/task-segmenter.js +481 -17
  423. package/dist/daemon/services/task-segmenter.js.map +1 -1
  424. package/dist/daemon/services/violation-reporter.d.ts +130 -0
  425. package/dist/daemon/services/violation-reporter.d.ts.map +1 -0
  426. package/dist/daemon/services/violation-reporter.js +339 -0
  427. package/dist/daemon/services/violation-reporter.js.map +1 -0
  428. package/dist/daemon/skill-sync.d.ts +7 -2
  429. package/dist/daemon/skill-sync.d.ts.map +1 -1
  430. package/dist/daemon/skill-sync.js +114 -9
  431. package/dist/daemon/skill-sync.js.map +1 -1
  432. package/dist/daemon/templates/agents/claudemd-writer.md +101 -0
  433. package/dist/daemon/templates/agents/coder.md +105 -0
  434. package/dist/daemon/templates/agents/decision-maker.md +460 -0
  435. package/dist/daemon/templates/agents/doc-reviewer.md +115 -0
  436. package/dist/daemon/templates/agents/harness-debug-full.md +114 -0
  437. package/dist/daemon/templates/agents/harness-hotfix.md +99 -0
  438. package/dist/daemon/templates/agents/hybrid-feature-with-safety.md +104 -0
  439. package/dist/daemon/templates/agents/knowledge-builder.md +119 -0
  440. package/dist/daemon/templates/agents/patch-applier.md +144 -0
  441. package/dist/daemon/templates/agents/planner.md +165 -0
  442. package/dist/daemon/templates/agents/refactor-specialist.md +98 -0
  443. package/dist/daemon/templates/agents/skill-distiller.md +113 -0
  444. package/dist/daemon/templates/agents/task-boundary-classifier.md +64 -0
  445. package/dist/daemon/templates/agents/verify-agent.md +136 -0
  446. package/dist/daemon/utils/inject-block.d.ts +39 -0
  447. package/dist/daemon/utils/inject-block.d.ts.map +1 -0
  448. package/dist/daemon/utils/inject-block.js +25 -0
  449. package/dist/daemon/utils/inject-block.js.map +1 -0
  450. package/dist/hooks/hook-lib.sh +8 -0
  451. package/dist/hooks/notification.sh +19 -8
  452. package/dist/hooks/post-tool-use.sh +41 -23
  453. package/dist/hooks/pre-tool-use.sh +54 -23
  454. package/dist/hooks/session-start.sh +68 -0
  455. package/dist/hooks/stop.sh +24 -10
  456. package/dist/hooks/user-prompt-submit.sh +37 -21
  457. package/dist/knowledge/adapters/go-adapter.d.ts +65 -0
  458. package/dist/knowledge/adapters/go-adapter.d.ts.map +1 -0
  459. package/dist/knowledge/adapters/go-adapter.js +294 -0
  460. package/dist/knowledge/adapters/go-adapter.js.map +1 -0
  461. package/dist/knowledge/adapters/index.d.ts +41 -0
  462. package/dist/knowledge/adapters/index.d.ts.map +1 -0
  463. package/dist/knowledge/adapters/index.js +71 -0
  464. package/dist/knowledge/adapters/index.js.map +1 -0
  465. package/dist/knowledge/adapters/java-adapter.d.ts +66 -0
  466. package/dist/knowledge/adapters/java-adapter.d.ts.map +1 -0
  467. package/dist/knowledge/adapters/java-adapter.js +260 -0
  468. package/dist/knowledge/adapters/java-adapter.js.map +1 -0
  469. package/dist/knowledge/adapters/js-vue-adapter.d.ts +56 -0
  470. package/dist/knowledge/adapters/js-vue-adapter.d.ts.map +1 -0
  471. package/dist/knowledge/adapters/js-vue-adapter.js +203 -0
  472. package/dist/knowledge/adapters/js-vue-adapter.js.map +1 -0
  473. package/dist/knowledge/adapters/kotlin-adapter.d.ts +55 -0
  474. package/dist/knowledge/adapters/kotlin-adapter.d.ts.map +1 -0
  475. package/dist/knowledge/adapters/kotlin-adapter.js +209 -0
  476. package/dist/knowledge/adapters/kotlin-adapter.js.map +1 -0
  477. package/dist/knowledge/adapters/monorepo-adapter.d.ts +77 -0
  478. package/dist/knowledge/adapters/monorepo-adapter.d.ts.map +1 -0
  479. package/dist/knowledge/adapters/monorepo-adapter.js +170 -0
  480. package/dist/knowledge/adapters/monorepo-adapter.js.map +1 -0
  481. package/dist/knowledge/adapters/python-adapter.d.ts +89 -0
  482. package/dist/knowledge/adapters/python-adapter.d.ts.map +1 -0
  483. package/dist/knowledge/adapters/python-adapter.js +358 -0
  484. package/dist/knowledge/adapters/python-adapter.js.map +1 -0
  485. package/dist/knowledge/adapters/rust-adapter.d.ts +73 -0
  486. package/dist/knowledge/adapters/rust-adapter.d.ts.map +1 -0
  487. package/dist/knowledge/adapters/rust-adapter.js +329 -0
  488. package/dist/knowledge/adapters/rust-adapter.js.map +1 -0
  489. package/dist/knowledge/adapters/types.d.ts +99 -0
  490. package/dist/knowledge/adapters/types.d.ts.map +1 -0
  491. package/dist/knowledge/adapters/types.js +17 -0
  492. package/dist/knowledge/adapters/types.js.map +1 -0
  493. package/dist/knowledge/adapters/typescript-adapter.d.ts +57 -0
  494. package/dist/knowledge/adapters/typescript-adapter.d.ts.map +1 -0
  495. package/dist/knowledge/adapters/typescript-adapter.js +171 -0
  496. package/dist/knowledge/adapters/typescript-adapter.js.map +1 -0
  497. package/dist/knowledge/audit-applier.d.ts +70 -0
  498. package/dist/knowledge/audit-applier.d.ts.map +1 -0
  499. package/dist/knowledge/audit-applier.js +251 -0
  500. package/dist/knowledge/audit-applier.js.map +1 -0
  501. package/dist/knowledge/builder.d.ts +261 -0
  502. package/dist/knowledge/builder.d.ts.map +1 -0
  503. package/dist/knowledge/builder.js +937 -0
  504. package/dist/knowledge/builder.js.map +1 -0
  505. package/dist/knowledge/cli-provider.d.ts +151 -0
  506. package/dist/knowledge/cli-provider.d.ts.map +1 -0
  507. package/dist/knowledge/cli-provider.js +313 -0
  508. package/dist/knowledge/cli-provider.js.map +1 -0
  509. package/dist/knowledge/constants.d.ts +73 -0
  510. package/dist/knowledge/constants.d.ts.map +1 -0
  511. package/dist/knowledge/constants.js +93 -0
  512. package/dist/knowledge/constants.js.map +1 -0
  513. package/dist/knowledge/cross-module.d.ts +139 -0
  514. package/dist/knowledge/cross-module.d.ts.map +1 -0
  515. package/dist/knowledge/cross-module.js +370 -0
  516. package/dist/knowledge/cross-module.js.map +1 -0
  517. package/dist/knowledge/git-hooks.d.ts +67 -0
  518. package/dist/knowledge/git-hooks.d.ts.map +1 -0
  519. package/dist/knowledge/git-hooks.js +258 -0
  520. package/dist/knowledge/git-hooks.js.map +1 -0
  521. package/dist/knowledge/module-hash.d.ts +88 -0
  522. package/dist/knowledge/module-hash.d.ts.map +1 -0
  523. package/dist/knowledge/module-hash.js +162 -0
  524. package/dist/knowledge/module-hash.js.map +1 -0
  525. package/dist/knowledge/project-detector.d.ts +101 -0
  526. package/dist/knowledge/project-detector.d.ts.map +1 -0
  527. package/dist/knowledge/project-detector.js +223 -0
  528. package/dist/knowledge/project-detector.js.map +1 -0
  529. package/dist/knowledge/prompt.d.ts +228 -0
  530. package/dist/knowledge/prompt.d.ts.map +1 -0
  531. package/dist/knowledge/prompt.js +404 -0
  532. package/dist/knowledge/prompt.js.map +1 -0
  533. package/dist/knowledge/query.d.ts +105 -0
  534. package/dist/knowledge/query.d.ts.map +1 -0
  535. package/dist/knowledge/query.js +341 -0
  536. package/dist/knowledge/query.js.map +1 -0
  537. package/dist/knowledge/repo-map.d.ts +91 -0
  538. package/dist/knowledge/repo-map.d.ts.map +1 -0
  539. package/dist/knowledge/repo-map.js +408 -0
  540. package/dist/knowledge/repo-map.js.map +1 -0
  541. package/dist/knowledge/tools/index.d.ts +14 -0
  542. package/dist/knowledge/tools/index.d.ts.map +1 -0
  543. package/dist/knowledge/tools/index.js +11 -0
  544. package/dist/knowledge/tools/index.js.map +1 -0
  545. package/dist/knowledge/tools/knowledge-get-page.d.ts +46 -0
  546. package/dist/knowledge/tools/knowledge-get-page.d.ts.map +1 -0
  547. package/dist/knowledge/tools/knowledge-get-page.js +101 -0
  548. package/dist/knowledge/tools/knowledge-get-page.js.map +1 -0
  549. package/dist/knowledge/tools/knowledge-query.d.ts +77 -0
  550. package/dist/knowledge/tools/knowledge-query.d.ts.map +1 -0
  551. package/dist/knowledge/tools/knowledge-query.js +104 -0
  552. package/dist/knowledge/tools/knowledge-query.js.map +1 -0
  553. package/dist/knowledge/tools/repo-map-lookup.d.ts +45 -0
  554. package/dist/knowledge/tools/repo-map-lookup.d.ts.map +1 -0
  555. package/dist/knowledge/tools/repo-map-lookup.js +82 -0
  556. package/dist/knowledge/tools/repo-map-lookup.js.map +1 -0
  557. package/dist/knowledge/types.d.ts +269 -0
  558. package/dist/knowledge/types.d.ts.map +1 -0
  559. package/dist/knowledge/types.js +10 -0
  560. package/dist/knowledge/types.js.map +1 -0
  561. package/dist/knowledge/validator.d.ts +90 -0
  562. package/dist/knowledge/validator.d.ts.map +1 -0
  563. package/dist/knowledge/validator.js +288 -0
  564. package/dist/knowledge/validator.js.map +1 -0
  565. package/dist/mcp/server.d.ts.map +1 -1
  566. package/dist/mcp/server.js +222 -1
  567. package/dist/mcp/server.js.map +1 -1
  568. package/dist/skills/builtin-skills.d.ts +35 -0
  569. package/dist/skills/builtin-skills.d.ts.map +1 -0
  570. package/dist/skills/builtin-skills.js +68 -0
  571. package/dist/skills/builtin-skills.js.map +1 -0
  572. package/dist/skills/distill/attribution.d.ts +59 -0
  573. package/dist/skills/distill/attribution.d.ts.map +1 -0
  574. package/dist/skills/distill/attribution.js +101 -0
  575. package/dist/skills/distill/attribution.js.map +1 -0
  576. package/dist/skills/distill/claude-cli-resolver.d.ts +26 -0
  577. package/dist/skills/distill/claude-cli-resolver.d.ts.map +1 -0
  578. package/dist/skills/distill/claude-cli-resolver.js +115 -0
  579. package/dist/skills/distill/claude-cli-resolver.js.map +1 -0
  580. package/dist/skills/distill/distiller.d.ts +161 -0
  581. package/dist/skills/distill/distiller.d.ts.map +1 -0
  582. package/dist/skills/distill/distiller.js +461 -0
  583. package/dist/skills/distill/distiller.js.map +1 -0
  584. package/dist/skills/distill/index.d.ts +223 -0
  585. package/dist/skills/distill/index.d.ts.map +1 -0
  586. package/dist/skills/distill/index.js +466 -0
  587. package/dist/skills/distill/index.js.map +1 -0
  588. package/dist/skills/distill/project-anchor-guard.d.ts +116 -0
  589. package/dist/skills/distill/project-anchor-guard.d.ts.map +1 -0
  590. package/dist/skills/distill/project-anchor-guard.js +334 -0
  591. package/dist/skills/distill/project-anchor-guard.js.map +1 -0
  592. package/dist/skills/distill/topic-deduper.d.ts +77 -0
  593. package/dist/skills/distill/topic-deduper.d.ts.map +1 -0
  594. package/dist/skills/distill/topic-deduper.js +119 -0
  595. package/dist/skills/distill/topic-deduper.js.map +1 -0
  596. package/dist/skills/distill/upstream-fetcher.d.ts +71 -0
  597. package/dist/skills/distill/upstream-fetcher.d.ts.map +1 -0
  598. package/dist/skills/distill/upstream-fetcher.js +202 -0
  599. package/dist/skills/distill/upstream-fetcher.js.map +1 -0
  600. package/dist/skills/distilled/distilled-api-design.md +491 -0
  601. package/dist/skills/distilled/distilled-architecture-decision.md +173 -0
  602. package/dist/skills/distilled/distilled-creator.md +178 -0
  603. package/dist/skills/distilled/distilled-db-schema-design.md +245 -0
  604. package/dist/skills/distilled/distilled-defi-amm-security.md +293 -0
  605. package/dist/skills/distilled/distilled-executing-plans.md +113 -0
  606. package/dist/skills/distilled/distilled-harness-engineering.md +242 -0
  607. package/dist/skills/distilled/distilled-karpathy-guidelines.md +104 -0
  608. package/dist/skills/distilled/distilled-performance-optimization.md +175 -0
  609. package/dist/skills/distilled/distilled-spec-driven-design.md +193 -0
  610. package/dist/skills/distilled/distilled-systematic-debugging.md +306 -0
  611. package/dist/skills/distilled/distilled-verification-before-completion.md +203 -0
  612. package/dist/skills/keyword-score.d.ts +29 -0
  613. package/dist/skills/keyword-score.d.ts.map +1 -0
  614. package/dist/skills/keyword-score.js +54 -0
  615. package/dist/skills/keyword-score.js.map +1 -0
  616. package/dist/skills/registry.d.ts +64 -20
  617. package/dist/skills/registry.d.ts.map +1 -1
  618. package/dist/skills/registry.js +102 -105
  619. package/dist/skills/registry.js.map +1 -1
  620. package/dist/skills/tools/pipeline-suggest.js +14 -14
  621. package/dist/skills/tools/skill-invoke.d.ts +1 -1
  622. package/dist/skills/tools/skill-invoke.js +1 -1
  623. package/dist/web/routes/agent-content.d.ts +30 -0
  624. package/dist/web/routes/agent-content.d.ts.map +1 -0
  625. package/dist/web/routes/agent-content.js +139 -0
  626. package/dist/web/routes/agent-content.js.map +1 -0
  627. package/dist/web/routes/decisions.d.ts +15 -0
  628. package/dist/web/routes/decisions.d.ts.map +1 -0
  629. package/dist/web/routes/decisions.js +181 -0
  630. package/dist/web/routes/decisions.js.map +1 -0
  631. package/dist/web/routes/diagnostics.d.ts +61 -0
  632. package/dist/web/routes/diagnostics.d.ts.map +1 -0
  633. package/dist/web/routes/diagnostics.js +203 -0
  634. package/dist/web/routes/diagnostics.js.map +1 -0
  635. package/dist/web/routes/events.d.ts.map +1 -1
  636. package/dist/web/routes/events.js +24 -0
  637. package/dist/web/routes/events.js.map +1 -1
  638. package/dist/web/routes/health.d.ts +33 -0
  639. package/dist/web/routes/health.d.ts.map +1 -0
  640. package/dist/web/routes/health.js +37 -0
  641. package/dist/web/routes/health.js.map +1 -0
  642. package/dist/web/routes/insights.d.ts +0 -5
  643. package/dist/web/routes/insights.d.ts.map +1 -1
  644. package/dist/web/routes/insights.js +783 -2
  645. package/dist/web/routes/insights.js.map +1 -1
  646. package/dist/web/routes/knowledge.d.ts +16 -0
  647. package/dist/web/routes/knowledge.d.ts.map +1 -0
  648. package/dist/web/routes/knowledge.js +661 -0
  649. package/dist/web/routes/knowledge.js.map +1 -0
  650. package/dist/web/routes/patch.d.ts +60 -1
  651. package/dist/web/routes/patch.d.ts.map +1 -1
  652. package/dist/web/routes/patch.js +170 -64
  653. package/dist/web/routes/patch.js.map +1 -1
  654. package/dist/web/routes/pipeline.d.ts +37 -0
  655. package/dist/web/routes/pipeline.d.ts.map +1 -0
  656. package/dist/web/routes/pipeline.js +149 -0
  657. package/dist/web/routes/pipeline.js.map +1 -0
  658. package/dist/web/routes/rules.d.ts.map +1 -1
  659. package/dist/web/routes/rules.js +6 -1
  660. package/dist/web/routes/rules.js.map +1 -1
  661. package/dist/web/routes/sessions.d.ts.map +1 -1
  662. package/dist/web/routes/sessions.js +9 -1
  663. package/dist/web/routes/sessions.js.map +1 -1
  664. package/dist/web/routes/skill-content.d.ts +30 -0
  665. package/dist/web/routes/skill-content.d.ts.map +1 -0
  666. package/dist/web/routes/skill-content.js +117 -0
  667. package/dist/web/routes/skill-content.js.map +1 -0
  668. package/dist/web/routes/skills-distill.d.ts +29 -0
  669. package/dist/web/routes/skills-distill.d.ts.map +1 -0
  670. package/dist/web/routes/skills-distill.js +552 -0
  671. package/dist/web/routes/skills-distill.js.map +1 -0
  672. package/dist/web/routes/skills.js +7 -7
  673. package/dist/web/routes/skills.js.map +1 -1
  674. package/dist/web/routes/task-timeline.d.ts +102 -0
  675. package/dist/web/routes/task-timeline.d.ts.map +1 -0
  676. package/dist/web/routes/task-timeline.js +274 -0
  677. package/dist/web/routes/task-timeline.js.map +1 -0
  678. package/dist/web/routes/tasks.d.ts.map +1 -1
  679. package/dist/web/routes/tasks.js +355 -8
  680. package/dist/web/routes/tasks.js.map +1 -1
  681. package/dist/web/routes/trace.d.ts.map +1 -1
  682. package/dist/web/routes/trace.js +3 -2
  683. package/dist/web/routes/trace.js.map +1 -1
  684. package/dist/web/routes/types.d.ts +0 -4
  685. package/dist/web/routes/types.d.ts.map +1 -1
  686. package/dist/web/routes/types.js +1 -1
  687. package/dist/web/routes/types.js.map +1 -1
  688. package/dist/web/routes/violations.d.ts +14 -0
  689. package/dist/web/routes/violations.d.ts.map +1 -0
  690. package/dist/web/routes/violations.js +111 -0
  691. package/dist/web/routes/violations.js.map +1 -0
  692. package/dist/web/server.d.ts.map +1 -1
  693. package/dist/web/server.js +79 -19
  694. package/dist/web/server.js.map +1 -1
  695. package/dist/web/services/build-manager.d.ts +72 -0
  696. package/dist/web/services/build-manager.d.ts.map +1 -0
  697. package/dist/web/services/build-manager.js +189 -0
  698. package/dist/web/services/build-manager.js.map +1 -0
  699. package/dist/web/services/distill-manager.d.ts +125 -0
  700. package/dist/web/services/distill-manager.d.ts.map +1 -0
  701. package/dist/web/services/distill-manager.js +308 -0
  702. package/dist/web/services/distill-manager.js.map +1 -0
  703. package/dist/web/static/assets/AgentContentPage-DkeRNxok.js +2 -0
  704. package/dist/web/static/assets/AgentContentPage-DkeRNxok.js.map +1 -0
  705. package/dist/web/static/assets/AgentDelegationTable-ByBa0x1l.js +2 -0
  706. package/dist/web/static/assets/AgentDelegationTable-ByBa0x1l.js.map +1 -0
  707. package/dist/web/static/assets/ContextInsightsPage-oUk7_I8u.js +3 -0
  708. package/dist/web/static/assets/ContextInsightsPage-oUk7_I8u.js.map +1 -0
  709. package/dist/web/static/assets/DaemonHealthPage-DG2fyOP7.js +2 -0
  710. package/dist/web/static/assets/DaemonHealthPage-DG2fyOP7.js.map +1 -0
  711. package/dist/web/static/assets/DecisionsPage-CMAPEnKb.js +2 -0
  712. package/dist/web/static/assets/DecisionsPage-CMAPEnKb.js.map +1 -0
  713. package/dist/web/static/assets/DiagnosticsPage-DQd-Zm4r.js +2 -0
  714. package/dist/web/static/assets/DiagnosticsPage-DQd-Zm4r.js.map +1 -0
  715. package/dist/web/static/assets/DriftTab-DqpepOhI.js +2 -0
  716. package/dist/web/static/assets/DriftTab-DqpepOhI.js.map +1 -0
  717. package/dist/web/static/assets/HealthHomePage-CN6zNIie.js +3 -0
  718. package/dist/web/static/assets/HealthHomePage-CN6zNIie.js.map +1 -0
  719. package/dist/web/static/assets/KbHitRateTable-ByEIWujF.js +2 -0
  720. package/dist/web/static/assets/KbHitRateTable-ByEIWujF.js.map +1 -0
  721. package/dist/web/static/assets/MarkdownRenderer-DZmTl-8J.js +3 -0
  722. package/dist/web/static/assets/MarkdownRenderer-DZmTl-8J.js.map +1 -0
  723. package/dist/web/static/assets/NotFound-BQPh0vaF.js +2 -0
  724. package/dist/web/static/assets/NotFound-BQPh0vaF.js.map +1 -0
  725. package/dist/web/static/assets/ProjectSwitcher-D3lZMFd3.js +2 -0
  726. package/dist/web/static/assets/ProjectSwitcher-D3lZMFd3.js.map +1 -0
  727. package/dist/web/static/assets/SettingsPage-oLJBNzQj.js +2 -0
  728. package/dist/web/static/assets/SettingsPage-oLJBNzQj.js.map +1 -0
  729. package/dist/web/static/assets/SkillContentPage-DK5rgfgw.js +2 -0
  730. package/dist/web/static/assets/SkillContentPage-DK5rgfgw.js.map +1 -0
  731. package/dist/web/static/assets/SkillStatsTable-DYMzjEUV.js +2 -0
  732. package/dist/web/static/assets/SkillStatsTable-DYMzjEUV.js.map +1 -0
  733. package/dist/web/static/assets/SkillsDistillTab-C7qaG8q3.js +2 -0
  734. package/dist/web/static/assets/SkillsDistillTab-C7qaG8q3.js.map +1 -0
  735. package/dist/web/static/assets/TasksHubPage-03wsRRsJ.js +6 -0
  736. package/dist/web/static/assets/TasksHubPage-03wsRRsJ.js.map +1 -0
  737. package/dist/web/static/assets/ViolationsPage-DSiLr-9O.js +3 -0
  738. package/dist/web/static/assets/ViolationsPage-DSiLr-9O.js.map +1 -0
  739. package/dist/web/static/assets/arco-Bhi3a6Qp.js +14 -0
  740. package/dist/web/static/assets/arco-Bhi3a6Qp.js.map +1 -0
  741. package/dist/web/static/assets/arco-DFQA6dO_.css +1 -0
  742. package/dist/web/static/assets/charts-BuHQWDbQ.js +37 -0
  743. package/dist/web/static/assets/charts-BuHQWDbQ.js.map +1 -0
  744. package/dist/web/static/assets/date-fns-sbWH3_uq.js +2 -0
  745. package/dist/web/static/assets/date-fns-sbWH3_uq.js.map +1 -0
  746. package/dist/web/static/assets/index-7bl3kbcx.css +1 -0
  747. package/dist/web/static/assets/index-BIYnq1Dx.js +4 -0
  748. package/dist/web/static/assets/index-BIYnq1Dx.js.map +1 -0
  749. package/dist/web/static/assets/lucide-CnlPQoG8.js +72 -0
  750. package/dist/web/static/assets/lucide-CnlPQoG8.js.map +1 -0
  751. package/dist/web/static/assets/outcome-DUn1NjlC.js +2 -0
  752. package/dist/web/static/assets/outcome-DUn1NjlC.js.map +1 -0
  753. package/dist/web/static/assets/query-S6X1S7K9.js +2 -0
  754. package/dist/web/static/assets/{query-C99w429o.js.map → query-S6X1S7K9.js.map} +1 -1
  755. package/dist/web/static/assets/{react-router-r79dBVy4.js → react-router-JVUrkhdd.js} +3 -3
  756. package/dist/web/static/assets/{react-router-r79dBVy4.js.map → react-router-JVUrkhdd.js.map} +1 -1
  757. package/dist/web/static/assets/react-vendor-tkvCrao7.js +57 -0
  758. package/dist/web/static/assets/react-vendor-tkvCrao7.js.map +1 -0
  759. package/dist/web/static/assets/syntax-highlighter-BkZfCDsz.js +6 -0
  760. package/dist/web/static/assets/syntax-highlighter-BkZfCDsz.js.map +1 -0
  761. package/dist/web/static/assets/useTabsParam-k8qte_0C.js +2 -0
  762. package/dist/web/static/assets/useTabsParam-k8qte_0C.js.map +1 -0
  763. package/dist/web/static/assets/vendor-DWgdB1eY.js +65 -0
  764. package/dist/web/static/assets/vendor-DWgdB1eY.js.map +1 -0
  765. package/dist/web/static/index.html +12 -8
  766. package/package.json +14 -3
  767. package/dist/core/ai/provider.d.ts +0 -63
  768. package/dist/core/ai/provider.d.ts.map +0 -1
  769. package/dist/core/ai/provider.js +0 -241
  770. package/dist/core/ai/provider.js.map +0 -1
  771. package/dist/core/ai/types.d.ts +0 -43
  772. package/dist/core/ai/types.d.ts.map +0 -1
  773. package/dist/core/ai/types.js +0 -5
  774. package/dist/core/ai/types.js.map +0 -1
  775. package/dist/core/storage/token-usage.d.ts +0 -36
  776. package/dist/core/storage/token-usage.d.ts.map +0 -1
  777. package/dist/core/storage/token-usage.js +0 -59
  778. package/dist/core/storage/token-usage.js.map +0 -1
  779. package/dist/core/utils/token-tracker.d.ts +0 -39
  780. package/dist/core/utils/token-tracker.d.ts.map +0 -1
  781. package/dist/core/utils/token-tracker.js +0 -69
  782. package/dist/core/utils/token-tracker.js.map +0 -1
  783. package/dist/skills/index.d.ts +0 -3
  784. package/dist/skills/index.d.ts.map +0 -1
  785. package/dist/skills/index.js +0 -3
  786. package/dist/skills/index.js.map +0 -1
  787. package/dist/skills/matcher.d.ts +0 -26
  788. package/dist/skills/matcher.d.ts.map +0 -1
  789. package/dist/skills/matcher.js +0 -113
  790. package/dist/skills/matcher.js.map +0 -1
  791. package/dist/skills/official/code-simplifier.md +0 -52
  792. package/dist/skills/official/find-skills.md +0 -142
  793. package/dist/skills/official/official-api-design.md +0 -30
  794. package/dist/skills/official/official-architecture-decision.md +0 -41
  795. package/dist/skills/official/official-bmad.md +0 -118
  796. package/dist/skills/official/official-db-schema-design.md +0 -34
  797. package/dist/skills/official/official-debug.md +0 -25
  798. package/dist/skills/official/official-doc-driven.md +0 -31
  799. package/dist/skills/official/official-harness-engineering.md +0 -108
  800. package/dist/skills/official/official-performance-optimization.md +0 -30
  801. package/dist/skills/official/official-pr-review.md +0 -35
  802. package/dist/skills/official/official-release-checklist.md +0 -30
  803. package/dist/skills/official/official-security-hardening.md +0 -32
  804. package/dist/skills/official/official-spec-driven-design.md +0 -31
  805. package/dist/skills/official/planning-with-files.md +0 -241
  806. package/dist/skills/official/ui-ux-pro-max.md +0 -105
  807. package/dist/skills/official/webapp-testing.md +0 -96
  808. package/dist/skills/official-skills.d.ts +0 -26
  809. package/dist/skills/official-skills.d.ts.map +0 -1
  810. package/dist/skills/official-skills.js +0 -73
  811. package/dist/skills/official-skills.js.map +0 -1
  812. package/dist/skills/semantic-matcher.d.ts +0 -60
  813. package/dist/skills/semantic-matcher.d.ts.map +0 -1
  814. package/dist/skills/semantic-matcher.js +0 -192
  815. package/dist/skills/semantic-matcher.js.map +0 -1
  816. package/dist/skills/upgrade-engine.d.ts +0 -93
  817. package/dist/skills/upgrade-engine.d.ts.map +0 -1
  818. package/dist/skills/upgrade-engine.js +0 -447
  819. package/dist/skills/upgrade-engine.js.map +0 -1
  820. package/dist/skills/upgrade-prompt.d.ts +0 -20
  821. package/dist/skills/upgrade-prompt.d.ts.map +0 -1
  822. package/dist/skills/upgrade-prompt.js +0 -75
  823. package/dist/skills/upgrade-prompt.js.map +0 -1
  824. package/dist/web/routes/ai.d.ts +0 -10
  825. package/dist/web/routes/ai.d.ts.map +0 -1
  826. package/dist/web/routes/ai.js +0 -186
  827. package/dist/web/routes/ai.js.map +0 -1
  828. package/dist/web/routes/token-usage.d.ts +0 -7
  829. package/dist/web/routes/token-usage.d.ts.map +0 -1
  830. package/dist/web/routes/token-usage.js +0 -18
  831. package/dist/web/routes/token-usage.js.map +0 -1
  832. package/dist/web/ssrf-guard.d.ts +0 -35
  833. package/dist/web/ssrf-guard.d.ts.map +0 -1
  834. package/dist/web/ssrf-guard.js +0 -93
  835. package/dist/web/ssrf-guard.js.map +0 -1
  836. package/dist/web/static/assets/AIConfig-CdDWzJyO.js +0 -2
  837. package/dist/web/static/assets/AIConfig-CdDWzJyO.js.map +0 -1
  838. package/dist/web/static/assets/Dashboard-CoEmmIDt.js +0 -2
  839. package/dist/web/static/assets/Dashboard-CoEmmIDt.js.map +0 -1
  840. package/dist/web/static/assets/Drawer-DdRTzlLB.js +0 -2
  841. package/dist/web/static/assets/Drawer-DdRTzlLB.js.map +0 -1
  842. package/dist/web/static/assets/Events-DrIq1SUS.js +0 -2
  843. package/dist/web/static/assets/Events-DrIq1SUS.js.map +0 -1
  844. package/dist/web/static/assets/Reports-DFBM3MDK.js +0 -2
  845. package/dist/web/static/assets/Reports-DFBM3MDK.js.map +0 -1
  846. package/dist/web/static/assets/SearchInput-qCj_jAcf.js +0 -2
  847. package/dist/web/static/assets/SearchInput-qCj_jAcf.js.map +0 -1
  848. package/dist/web/static/assets/SessionDetail-CCzwdoT7.js +0 -2
  849. package/dist/web/static/assets/SessionDetail-CCzwdoT7.js.map +0 -1
  850. package/dist/web/static/assets/Sessions-FfLYkAw9.js +0 -2
  851. package/dist/web/static/assets/Sessions-FfLYkAw9.js.map +0 -1
  852. package/dist/web/static/assets/Skills-C8Gvs3Qa.js +0 -2
  853. package/dist/web/static/assets/Skills-C8Gvs3Qa.js.map +0 -1
  854. package/dist/web/static/assets/TaskDetail-BS8pYhaR.js +0 -2
  855. package/dist/web/static/assets/TaskDetail-BS8pYhaR.js.map +0 -1
  856. package/dist/web/static/assets/Tasks-CyuhizG8.js +0 -2
  857. package/dist/web/static/assets/Tasks-CyuhizG8.js.map +0 -1
  858. package/dist/web/static/assets/charts-CLrM0_uM.js +0 -37
  859. package/dist/web/static/assets/charts-CLrM0_uM.js.map +0 -1
  860. package/dist/web/static/assets/date-fns-CZ_bHujz.js +0 -2
  861. package/dist/web/static/assets/date-fns-CZ_bHujz.js.map +0 -1
  862. package/dist/web/static/assets/export-L_VBD2p1.js +0 -4
  863. package/dist/web/static/assets/export-L_VBD2p1.js.map +0 -1
  864. package/dist/web/static/assets/index-CBX47X8l.js +0 -3
  865. package/dist/web/static/assets/index-CBX47X8l.js.map +0 -1
  866. package/dist/web/static/assets/index-DjIoMdoR.css +0 -1
  867. package/dist/web/static/assets/lucide-Bs_edTLa.js +0 -232
  868. package/dist/web/static/assets/lucide-Bs_edTLa.js.map +0 -1
  869. package/dist/web/static/assets/query-C99w429o.js +0 -2
  870. package/dist/web/static/assets/react-vendor-CSp-GLFF.js +0 -49
  871. package/dist/web/static/assets/react-vendor-CSp-GLFF.js.map +0 -1
  872. package/dist/web/static/assets/syntax-highlighter-44FakypI.js +0 -9
  873. package/dist/web/static/assets/syntax-highlighter-44FakypI.js.map +0 -1
  874. package/dist/web/static/assets/task-title-BhOcemuR.js +0 -2
  875. package/dist/web/static/assets/task-title-BhOcemuR.js.map +0 -1
  876. package/dist/web/static/assets/time-Bxuk0M-C.js +0 -2
  877. package/dist/web/static/assets/time-Bxuk0M-C.js.map +0 -1
  878. package/dist/web/static/assets/vendor-CMMjVdZs.js +0 -64
  879. package/dist/web/static/assets/vendor-CMMjVdZs.js.map +0 -1
@@ -0,0 +1,140 @@
1
+ /**
2
+ * KbInjector — queries the project knowledge base for a prompt and renders
3
+ * the additionalContext block.
4
+ *
5
+ * Extracted from `UserPromptHandler` (D-3 step 3). Single responsibility:
6
+ * 1. Probe `.forge-knowledge/` presence (cheap).
7
+ * 2. Run `queryKnowledge` (augmented with optional intent keywords).
8
+ * 3. Apply score threshold + return `{ block, hits }`.
9
+ *
10
+ * Caching: per-(session_id, prompt[:200]) LRU+TTL to dedupe consecutive
11
+ * Enter re-fires within 5 minutes. Bounded by 500 entries.
12
+ *
13
+ * The cache key includes `session_id` so different sessions never collide,
14
+ * but `kbQueryCache` is intentionally NOT cleared at Stop time — D-1 in the
15
+ * refactor spec resolved this: the 5-min TTL + 500-entry LRU bound is
16
+ * sufficient (worst case ~500KB held briefly), and enumerating session-
17
+ * prefixed keys would require a second index map.
18
+ */
19
+ // Namespace import (not named) so test code can `vi.spyOn(knowledgeQuery, ...)`
20
+ // and have the service see the stub — named imports bind eagerly under ESM.
21
+ import * as knowledgeQuery from '../../knowledge/query.js';
22
+ import { LRUCache } from '../../core/utils/lru-cache.js';
23
+ import { createHash } from 'node:crypto';
24
+ import { logger } from '../../core/utils/logger.js';
25
+ import { truncateString } from '../../core/utils/format.js';
26
+ import { wrapInjectBlock } from '../utils/inject-block.js';
27
+ export class KbInjector {
28
+ storage;
29
+ // ── KB injection (MVP1) ──────────────────────────────────────────────────
30
+ // Score threshold below which we don't inject. History:
31
+ // spec §4.1 estimated 30 → too strict (ASCII prompts maxed at ~30)
32
+ // 2026-05-22 calibration → 10 (CJK still dead because tokenize 无分词)
33
+ // 2026-05-22 KPI fix → 5, after CJK n-gram tokenize landed
34
+ // (n-gram tokens lower per-hit score; real CJK technical prompt
35
+ // "如何修复 daemon socket bug" hits modules/daemon.md @ score 7).
36
+ // Revisit when feedback-aggregator shows real score distribution.
37
+ static KB_SCORE_THRESHOLD = 5;
38
+ /** Cap on KB pages injected per prompt to avoid context bloat. */
39
+ static KB_MAX_RESULTS = 2;
40
+ /** Per-page content truncation (chars) — keeps the additionalContext modest. */
41
+ static KB_CONTENT_TRUNCATE = 800;
42
+ /** LRU+TTL cache TTL for de-duping Enter re-fires of the same prompt. */
43
+ static KB_CACHE_TTL_MS = 5 * 60 * 1000;
44
+ /** Cache capacity (entries). */
45
+ static KB_CACHE_MAX = 500;
46
+ kbQueryCache = new LRUCache(KbInjector.KB_CACHE_MAX);
47
+ constructor(storage = null) {
48
+ this.storage = storage;
49
+ }
50
+ /**
51
+ * Query the KB and (if any qualifying hits) return a formatted block ready
52
+ * to push onto `additionalContext`. Always fail-silent — KB failures must
53
+ * not break the prompt path.
54
+ *
55
+ * Returns `null` block when there are zero qualifying hits.
56
+ */
57
+ async inject(event, prompt, extraKeywords = []) {
58
+ const hits = await this.queryKbForPrompt(event.session_id, event.project_path, prompt, extraKeywords);
59
+ if (hits.length === 0)
60
+ return { block: null, hits: [] };
61
+ const block = formatKbBlock(hits, KbInjector.KB_CONTENT_TRUNCATE);
62
+ return { block, hits };
63
+ }
64
+ /**
65
+ * Query the project knowledge base, returning only hits at or above the
66
+ * MVP1 score threshold. Always fail-silent — KB failures must not break
67
+ * the UserPrompt pipeline (resume / convention / skill remain unaffected).
68
+ *
69
+ * Cache key is `${session_id}:${sha1(prompt[:200])}` with a 5-minute TTL.
70
+ * This dedupes consecutive Enter re-fires of the same prompt without
71
+ * leaking memory across sessions.
72
+ */
73
+ async queryKbForPrompt(sessionId, projectPath, prompt, extraKeywords) {
74
+ try {
75
+ if (!knowledgeQuery.isKnowledgeBuilt(projectPath))
76
+ return [];
77
+ const cacheKey = makeKbCacheKey(sessionId, prompt);
78
+ const now = Date.now();
79
+ const cached = this.kbQueryCache.get(cacheKey);
80
+ if (cached && cached.expiresAt > now) {
81
+ logger.debug(`[KbInjector] cache hit (${cached.hits.length} hits)`);
82
+ return cached.hits;
83
+ }
84
+ const augmentedQuery = extraKeywords.length > 0
85
+ ? `${prompt} ${extraKeywords.join(' ')}`
86
+ : prompt;
87
+ const result = await knowledgeQuery.queryKnowledge(augmentedQuery, {
88
+ projectRoot: projectPath,
89
+ maxResults: KbInjector.KB_MAX_RESULTS,
90
+ // Skip repo-map symbol hits in the inject path: pages already carry
91
+ // file:line refs and symbol noise would just lengthen the prompt.
92
+ includeRepoMap: false,
93
+ storage: this.storage ?? undefined,
94
+ });
95
+ const qualifying = result.pages.filter((h) => h.score >= KbInjector.KB_SCORE_THRESHOLD);
96
+ this.kbQueryCache.set(cacheKey, {
97
+ hits: qualifying,
98
+ expiresAt: now + KbInjector.KB_CACHE_TTL_MS,
99
+ });
100
+ return qualifying;
101
+ }
102
+ catch (err) {
103
+ logger.warn(`[KbInjector] KB query failed (silently skipped): ${err}`);
104
+ return [];
105
+ }
106
+ }
107
+ }
108
+ // ── Module-private helpers ──────────────────────────────────────────────────
109
+ /**
110
+ * Build a stable cache key from `sessionId` + the first 200 chars of `prompt`
111
+ * (hashed to keep the key small and avoid logging concerns).
112
+ */
113
+ function makeKbCacheKey(sessionId, prompt) {
114
+ const hash = createHash('sha1').update(prompt.slice(0, 200)).digest('hex');
115
+ return `${sessionId}:${hash}`;
116
+ }
117
+ /**
118
+ * Render KB query hits into the additionalContext block (spec §4.1).
119
+ * Layout mirrors CLAUDE.md:194-206 — banners, per-page header with score &
120
+ * matched keywords, truncated content, then a "关键文件" list of refs.
121
+ */
122
+ function formatKbBlock(hits, contentTruncate) {
123
+ const sections = hits.map((hit) => {
124
+ const matched = hit.matched_keywords.slice(0, 5).join(', ');
125
+ const header = `### ${hit.page.name}(score ${hit.score}${matched ? `, matched: ${matched}` : ''})`;
126
+ const body = truncateString(hit.page.content, contentTruncate);
127
+ const refLines = hit.page.refs.slice(0, 4).map((r) => {
128
+ const sym = r.symbol ? ` — ${r.symbol}` : '';
129
+ return `- ${r.file}:${r.lineStart}${sym}`;
130
+ });
131
+ const refs = refLines.length > 0 ? `\n关键文件:\n${refLines.join('\n')}` : '';
132
+ return `${header}\n\n${body}${refs}`;
133
+ });
134
+ return wrapInjectBlock({
135
+ openLine: '━━━ 项目背景(来自 .forge-knowledge/)━━━',
136
+ // Blank lines on both sides preserve the pre-refactor visual padding.
137
+ body: `\n${sections.join('\n\n')}\n`,
138
+ });
139
+ }
140
+ //# sourceMappingURL=kb-injector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kb-injector.js","sourceRoot":"","sources":["../../../src/daemon/services/kb-injector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * OutcomeClassificationService — Stop-time outcome instrumentation.
3
+ *
4
+ * Extracted from `StopHandler` (D-3) so the orchestrator stays thin.
5
+ * Single responsibility: gather signals + run `classifyOutcome` + persist
6
+ * outcome columns on `sessions` + `tasks`, plus the Phase 2 metrics rollup
7
+ * back-fill.
8
+ *
9
+ * Lifecycle: owned by `StopHandler` (constructed per-daemon, called per-event).
10
+ * Stateless — no per-call construction deps; each method receives storage +
11
+ * taskSegmenter explicitly so the service is trivially injectable in tests.
12
+ *
13
+ * Failure mode: every public method is fire-and-forget. Never throws; logs at
14
+ * debug level when storage / git subprocess hiccups.
15
+ */
16
+ import type { StopEvent } from '../../core/types.js';
17
+ import type { SQLiteStorage } from '../../core/storage/sqlite.js';
18
+ import type { TaskSegmenter } from './task-segmenter.js';
19
+ export declare class OutcomeClassificationService {
20
+ /**
21
+ * Classify the session's outcome at Stop time and persist to both
22
+ * `sessions` and the most recent task row. Also rolls up Phase 2 metrics
23
+ * (intercept_count / kb_inject_count / skill_match_count).
24
+ *
25
+ * Fire-and-forget; never throws (debug-logs on error).
26
+ */
27
+ classifySession(event: StopEvent, storage: SQLiteStorage, taskSegmenter: TaskSegmenter | null): Promise<void>;
28
+ /**
29
+ * Backfill outcome on all unclassified completed/abandoned tasks for the
30
+ * session. Without this, TaskSegmenter-completed tasks (the ones closed by a
31
+ * new-prompt switch) stay outcome=NULL forever.
32
+ *
33
+ * spec 1100 v2: classification is pure edit-intent — NO git subprocess per
34
+ * task. Gated to MAX_IDLE_TASKS_PER_RUN to bound the per-task edit-intent
35
+ * queries. Fire-and-forget; never throws.
36
+ */
37
+ classifyIdleTasks(event: StopEvent, storage: SQLiteStorage): Promise<void>;
38
+ /**
39
+ * Count a single task's Edit/Write intent events. Best-effort: 0 on error so
40
+ * classification never throws because of a storage hiccup.
41
+ */
42
+ private safeTaskEditIntent;
43
+ /**
44
+ * Session-level edit intent = COUNT of Edit/Write events across the session
45
+ * (tool_name only; gzip-safe). Best-effort, 0 on error.
46
+ */
47
+ private safeSessionEditIntent;
48
+ }
49
+ //# sourceMappingURL=outcome-classification-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outcome-classification-service.d.ts","sourceRoot":"","sources":["../../../src/daemon/services/outcome-classification-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAczD,qBAAa,4BAA4B;IACvC;;;;;;OAMG;IACG,eAAe,CACnB,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,aAAa,EACtB,aAAa,EAAE,aAAa,GAAG,IAAI,GAClC,OAAO,CAAC,IAAI,CAAC;IAwHhB;;;;;;;;OAQG;IACG,iBAAiB,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IA8ChF;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAS1B;;;OAGG;IACH,OAAO,CAAC,qBAAqB;CAQ9B"}
@@ -0,0 +1,214 @@
1
+ /**
2
+ * OutcomeClassificationService — Stop-time outcome instrumentation.
3
+ *
4
+ * Extracted from `StopHandler` (D-3) so the orchestrator stays thin.
5
+ * Single responsibility: gather signals + run `classifyOutcome` + persist
6
+ * outcome columns on `sessions` + `tasks`, plus the Phase 2 metrics rollup
7
+ * back-fill.
8
+ *
9
+ * Lifecycle: owned by `StopHandler` (constructed per-daemon, called per-event).
10
+ * Stateless — no per-call construction deps; each method receives storage +
11
+ * taskSegmenter explicitly so the service is trivially injectable in tests.
12
+ *
13
+ * Failure mode: every public method is fire-and-forget. Never throws; logs at
14
+ * debug level when storage / git subprocess hiccups.
15
+ */
16
+ import { logger } from '../../core/utils/logger.js';
17
+ import { formatError } from '../../core/utils/format.js';
18
+ import { truncateSessionId } from '../../core/utils/session.js';
19
+ import { collectViolations } from './violation-reporter.js';
20
+ import { classifyOutcome, collectCommitStats, } from './outcome-classifier.js';
21
+ /** Upper bound on idle tasks backfilled per Stop (mirrors original). */
22
+ const MAX_IDLE_TASKS_PER_RUN = 20;
23
+ export class OutcomeClassificationService {
24
+ /**
25
+ * Classify the session's outcome at Stop time and persist to both
26
+ * `sessions` and the most recent task row. Also rolls up Phase 2 metrics
27
+ * (intercept_count / kb_inject_count / skill_match_count).
28
+ *
29
+ * Fire-and-forget; never throws (debug-logs on error).
30
+ */
31
+ async classifySession(event, storage, taskSegmenter) {
32
+ try {
33
+ const session = storage.getSession(event.session_id);
34
+ if (!session) {
35
+ logger.debug(`[OutcomeClassification] skipped: session ${truncateSessionId(event.session_id)} not in aggregate`);
36
+ return;
37
+ }
38
+ const startIso = session.start_time;
39
+ const endIso = event.timestamp;
40
+ // Violations are collected ONLY for the persisted user_violation_count
41
+ // column (dashboard surfacing) — they NEVER influence the outcome verdict
42
+ // (governance interceptions inflate them). Best-effort.
43
+ let violationCount = 0;
44
+ try {
45
+ violationCount = collectViolations(storage, {
46
+ sessionId: event.session_id,
47
+ days: 365,
48
+ limit: 1000,
49
+ }).length;
50
+ }
51
+ catch (err) {
52
+ logger.debug(`[OutcomeClassification] violation collect failed: ${formatError(err)}`);
53
+ }
54
+ // Informational only: session-level git commit count (NOT load-bearing —
55
+ // see outcome-classifier v2). Surfaced in the reason / persisted column.
56
+ const commitStats = await collectCommitStats(event.project_path, startIso, endIso);
57
+ // PRIMARY signal: session-level edit intent (Edit/Write count via
58
+ // tool_name; gzip-safe). Drives success vs answered.
59
+ const sessionEditIntent = this.safeSessionEditIntent(storage, event.session_id);
60
+ const input = {
61
+ session_id: event.session_id,
62
+ start_time: startIso,
63
+ end_time: endIso,
64
+ event_count: session.event_count,
65
+ edit_intent_count: sessionEditIntent,
66
+ commit_count: commitStats.commit_count,
67
+ reverted_commits: commitStats.reverted_commits,
68
+ };
69
+ const result = classifyOutcome(input);
70
+ const classifiedAt = new Date().toISOString();
71
+ storage.updateSessionOutcome(event.session_id, {
72
+ outcome: result.outcome,
73
+ outcome_reason: result.reason,
74
+ commit_count: commitStats.commit_count,
75
+ reverted_commits: commitStats.reverted_commits,
76
+ user_violation_count: violationCount,
77
+ classified_at: classifiedAt,
78
+ });
79
+ // Stamp the CURRENT task with its OWN edit-intent signal (from
80
+ // task_events — includes sub-agent edits). This is the fix for "活跃 task
81
+ // 套 session result": a 干活 task is classified on whether IT changed
82
+ // code, independent of the session-level verdict.
83
+ const currentTaskId = taskSegmenter?.getCurrentTaskId(event.session_id) ?? null;
84
+ if (currentTaskId) {
85
+ try {
86
+ const taskEditIntent = this.safeTaskEditIntent(storage, currentTaskId);
87
+ const taskInput = {
88
+ session_id: event.session_id,
89
+ start_time: startIso,
90
+ end_time: endIso,
91
+ event_count: session.event_count,
92
+ edit_intent_count: taskEditIntent,
93
+ commit_count: commitStats.commit_count,
94
+ };
95
+ const taskResult = classifyOutcome(taskInput);
96
+ storage.updateTask(currentTaskId, {
97
+ outcome: taskResult.outcome,
98
+ outcome_reason: taskResult.reason,
99
+ user_violation_count: violationCount,
100
+ classified_at: classifiedAt,
101
+ });
102
+ }
103
+ catch (err) {
104
+ logger.debug(`[OutcomeClassification] task update failed: ${formatError(err)}`);
105
+ }
106
+ }
107
+ logger.info(`[OutcomeClassification] ${truncateSessionId(event.session_id)}: ` +
108
+ `${result.outcome} (${result.reason}) — ` +
109
+ `events=${session.event_count} edit_intent=${sessionEditIntent} ` +
110
+ `commits=${commitStats.commit_count}`);
111
+ // Phase 2 metrics rollup (master roadmap §2): aggregate row counts from
112
+ // the three Phase 0/1/MVP1 fact tables and back-fill sessions.* so the
113
+ // dashboard / weekly-report can SELECT directly instead of JOINing on
114
+ // every read. Pure analytics — always on, no feature flag.
115
+ try {
116
+ const interceptCount = storage.countToolInterceptsBySession(event.session_id);
117
+ const kbInjectCount = storage.countInjectionsBySessionByHandler(event.session_id, 'UserPromptSubmitHandler:kb');
118
+ const skillMatchCount = storage.countSkillInvocationsBySession(event.session_id);
119
+ storage.updateSessionMetrics(event.session_id, {
120
+ interceptCount,
121
+ kbInjectCount,
122
+ skillMatchCount,
123
+ });
124
+ logger.info(`[OutcomeClassification] Session metrics: ` +
125
+ `intercept=${interceptCount} kb=${kbInjectCount} skill=${skillMatchCount}`);
126
+ }
127
+ catch (err) {
128
+ logger.debug(`[OutcomeClassification] metrics rollup failed: ${formatError(err)}`);
129
+ }
130
+ }
131
+ catch (err) {
132
+ logger.debug(`[OutcomeClassification] failed: ${formatError(err)}`);
133
+ }
134
+ }
135
+ /**
136
+ * Backfill outcome on all unclassified completed/abandoned tasks for the
137
+ * session. Without this, TaskSegmenter-completed tasks (the ones closed by a
138
+ * new-prompt switch) stay outcome=NULL forever.
139
+ *
140
+ * spec 1100 v2: classification is pure edit-intent — NO git subprocess per
141
+ * task. Gated to MAX_IDLE_TASKS_PER_RUN to bound the per-task edit-intent
142
+ * queries. Fire-and-forget; never throws.
143
+ */
144
+ async classifyIdleTasks(event, storage) {
145
+ try {
146
+ const idle = storage.queryIdleUnclassifiedTasks(event.session_id);
147
+ if (idle.length === 0)
148
+ return;
149
+ const slice = idle.slice(0, MAX_IDLE_TASKS_PER_RUN);
150
+ const classifiedAt = new Date().toISOString();
151
+ let updated = 0;
152
+ for (const t of slice) {
153
+ try {
154
+ const startIso = t.start_time;
155
+ const endIso = t.end_time ?? event.timestamp;
156
+ // PRIMARY signal: per-task edit intent (task_events; gzip-safe).
157
+ const editIntent = this.safeTaskEditIntent(storage, t.id);
158
+ const input = {
159
+ session_id: event.session_id,
160
+ start_time: startIso,
161
+ end_time: endIso,
162
+ event_count: t.event_count ?? 0,
163
+ edit_intent_count: editIntent,
164
+ };
165
+ const result = classifyOutcome(input);
166
+ storage.updateTask(t.id, {
167
+ outcome: result.outcome,
168
+ outcome_reason: result.reason,
169
+ classified_at: classifiedAt,
170
+ });
171
+ updated += 1;
172
+ }
173
+ catch (err) {
174
+ logger.debug(`[OutcomeClassification] idle task classify failed for ${t.id}: ${formatError(err)}`);
175
+ }
176
+ }
177
+ if (updated > 0) {
178
+ logger.info(`[OutcomeClassification] Backfilled outcome for ${updated}/${idle.length} idle task(s) ` +
179
+ `on session ${truncateSessionId(event.session_id)}`);
180
+ }
181
+ }
182
+ catch (err) {
183
+ logger.debug(`[OutcomeClassification] idle task classification failed: ${formatError(err)}`);
184
+ }
185
+ }
186
+ // ── edit-intent helpers (spec 1100 v2) ────────────────────────────────
187
+ /**
188
+ * Count a single task's Edit/Write intent events. Best-effort: 0 on error so
189
+ * classification never throws because of a storage hiccup.
190
+ */
191
+ safeTaskEditIntent(storage, taskId) {
192
+ try {
193
+ return storage.countEditIntentEventsByTask(taskId);
194
+ }
195
+ catch (err) {
196
+ logger.debug(`[OutcomeClassification] edit-intent count failed for ${taskId}: ${formatError(err)}`);
197
+ return 0;
198
+ }
199
+ }
200
+ /**
201
+ * Session-level edit intent = COUNT of Edit/Write events across the session
202
+ * (tool_name only; gzip-safe). Best-effort, 0 on error.
203
+ */
204
+ safeSessionEditIntent(storage, sessionId) {
205
+ try {
206
+ return storage.countEditIntentEventsBySession(sessionId);
207
+ }
208
+ catch (err) {
209
+ logger.debug(`[OutcomeClassification] session edit-intent failed for ${sessionId}: ${formatError(err)}`);
210
+ return 0;
211
+ }
212
+ }
213
+ }
214
+ //# sourceMappingURL=outcome-classification-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outcome-classification-service.js","sourceRoot":"","sources":["../../../src/daemon/services/outcome-classification-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Outcome classifier (spec 1100 v2 — edit-intent-driven, 2026-06-02)
3
+ *
4
+ * Pure-function module that assigns one of
5
+ * `success | answered | abandoned (| partial)` to a session (or task) based on
6
+ * a tiny set of robust signals collected at Stop time.
7
+ *
8
+ * ## Why this rewrite
9
+ * The previous version keyed `success` off git `commit_count` attributed by a
10
+ * time window, then a v1.5 attempted to fix it with file→task commit
11
+ * attribution. A dry-run proved the attribution path is **broken**: `tool_input`
12
+ * (which holds `file_path`) is gzip-compressed, so file attribution silently
13
+ * fails → 0 commits attributed → genuine work judged failed AND ~105 real
14
+ * successes downgraded. We therefore **delete all commit attribution** and key
15
+ * the verdict off a signal that cannot be corrupted by gzip:
16
+ *
17
+ * `edit_intent_count` = COUNT(events WHERE tool_name IN
18
+ * ('Edit','Write','MultiEdit','NotebookEdit')) on the task's task_events.
19
+ * Only the `tool_name` column is read — never the compressed `tool_input` —
20
+ * so it is always correct. Sub-agent Edit/Write events are already linked to
21
+ * the parent task's task_events, so "did this task change code?" is captured.
22
+ *
23
+ * ## Design principles
24
+ * - **No LLM, no I/O**: classify is referentially transparent; signal
25
+ * gathering (edit-intent count) lives in the caller.
26
+ * - **Edit-intent is the primary signal**; `commit_count` is informational
27
+ * only and NOT load-bearing for the verdict.
28
+ * - **No violation-based downgrade**: daemon governance interceptions inflate
29
+ * `violation_count`, so it must not influence outcome.
30
+ * - **Tunable**: thresholds are exported constants.
31
+ *
32
+ * ## Priority chain (first matching branch wins)
33
+ * 1. abandoned/no_work — event_count <= 1
34
+ * 2. abandoned/too_short — duration < 30s && event_count < 5
35
+ * 3. answered/no-change-expected — edit_intent == 0 (pure Q&A / research)
36
+ * 4. success/did-work — edit_intent > 0
37
+ *
38
+ * The `partial` outcome is retained as a defensive fallback only (the chain
39
+ * above is total over valid inputs, so it is effectively unreachable).
40
+ */
41
+ /**
42
+ * Thresholds (exported for visibility in tests and for back-test tuning).
43
+ * Spec defaults — DO NOT casually mutate; the spec contains rationale.
44
+ */
45
+ export declare const OUTCOME_THRESHOLDS: {
46
+ /** Below this duration with few events → `abandoned/too_short`. */
47
+ readonly MIN_DURATION_FOR_ABANDONED_SEC: 30;
48
+ /** Below this event count combined with short duration → `abandoned/too_short`. */
49
+ readonly MIN_EVENT_FOR_ABANDONED: 5;
50
+ /** At or below this event count → `abandoned/no_work` (regardless of duration). */
51
+ readonly ABSOLUTE_NO_WORK_EVENT_CAP: 1;
52
+ };
53
+ /**
54
+ * Edit-intent threshold. A task with at least this many Edit/Write intents is
55
+ * treated as "code work was done" → `success`; below it (i.e. 0) the task is a
56
+ * pure Q&A / research task → `answered/no-change-expected`.
57
+ *
58
+ * Kept as a named constant (not a magic literal) so the answered-vs-success
59
+ * split can be retuned in one place. Currently 1 = "any edit counts".
60
+ */
61
+ export declare const EDIT_INTENT_THRESHOLD_FOR_WORK = 1;
62
+ export interface OutcomeInput {
63
+ /** Only used in `reason` strings; not load-bearing. */
64
+ session_id?: string;
65
+ /** ISO 8601 timestamp (parsed via Date.parse). */
66
+ start_time: string;
67
+ /** ISO 8601 timestamp (parsed via Date.parse). */
68
+ end_time: string;
69
+ /** Total events on this session (or task window). */
70
+ event_count: number;
71
+ /**
72
+ * Number of Edit/Write/MultiEdit/NotebookEdit events on this task (via
73
+ * task_events join). THE primary signal: >0 → success, ==0 → answered.
74
+ * Optional + defaults to 0 so legacy callers / unit tests stay green.
75
+ */
76
+ edit_intent_count?: number;
77
+ /**
78
+ * Informational only — NOT used by the verdict. Kept so callers can pass it
79
+ * through to persistence (sessions/tasks.commit_count column) and so the
80
+ * `reason` string can optionally surface a session-level commit count.
81
+ */
82
+ commit_count?: number;
83
+ /**
84
+ * Informational only — NOT used by the verdict. Retained for the persisted
85
+ * `reverted_commits` column; the previous per-task git revert signal was
86
+ * removed (it required per-task git subprocesses we deleted).
87
+ */
88
+ reverted_commits?: number;
89
+ /**
90
+ * Informational only — NOT used by the verdict. Daemon governance
91
+ * interceptions inflate this, so it must never downgrade an outcome.
92
+ */
93
+ violation_count?: number;
94
+ }
95
+ export interface OutcomeResult {
96
+ /**
97
+ * `answered` is a first-class outcome for pure Q&A / research tasks that
98
+ * legitimately produced no code change. `failed` / `partial` are retained in
99
+ * the union for back-compat with persisted historical rows and the defensive
100
+ * fallback, but the v2 chain only emits `success | answered | abandoned`.
101
+ * The schema `outcome` CHECK was relaxed to a non-empty-string guard so these
102
+ * values persist without a per-value table rebuild.
103
+ */
104
+ outcome: 'success' | 'partial' | 'failed' | 'abandoned' | 'answered';
105
+ /** Short, machine-stable text describing which rule fired. */
106
+ reason: string;
107
+ }
108
+ /**
109
+ * Classify an outcome from aggregated signals. Pure function; no I/O.
110
+ *
111
+ * Decision tree (spec 1100 v2 — edit-intent-driven):
112
+ * 1. event_count <= 1 → abandoned/no_work
113
+ * 2. duration < 30s && event_count < 5 → abandoned/too_short
114
+ * 3. edit_intent == 0 → answered/no-change-expected
115
+ * 4. edit_intent > 0 → success/did-work
116
+ * (fallback: partial — effectively unreachable, defensive only)
117
+ *
118
+ * `null` / undefined / NaN inputs are coerced defensively (missing counts → 0,
119
+ * missing timestamps → durationSec = 0) so callers can pass partial data
120
+ * without blowing up.
121
+ */
122
+ export declare function classifyOutcome(input: OutcomeInput): OutcomeResult;
123
+ export interface CommitStats {
124
+ commit_count: number;
125
+ reverted_commits: number;
126
+ }
127
+ /**
128
+ * Gather git commit stats for the time window `[startIso, endIso]` at
129
+ * `projectPath`. Returns `{ commit_count: 0, reverted_commits: 0 }` for any
130
+ * failure (non-git directory, missing path, git not installed, timeout, etc.) —
131
+ * outcome classifier handles "no signal" as the non-git fallback.
132
+ *
133
+ * Timeout: 5s total (per spec §2.5 prior art).
134
+ */
135
+ export declare function collectCommitStats(projectPath: string | null | undefined, startIso: string, endIso: string): Promise<CommitStats>;
136
+ //# sourceMappingURL=outcome-classifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outcome-classifier.d.ts","sourceRoot":"","sources":["../../../src/daemon/services/outcome-classifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAEH;;;GAGG;AACH,eAAO,MAAM,kBAAkB;IAC7B,mEAAmE;;IAEnE,mFAAmF;;IAEnF,mFAAmF;;CAE3E,CAAC;AAEX;;;;;;;GAOG;AACH,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAEhD,MAAM,WAAW,YAAY;IAC3B,uDAAuD;IACvD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,UAAU,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,QAAQ,EAAE,MAAM,CAAC;IACjB,qDAAqD;IACrD,WAAW,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B;;;;;;;OAOG;IACH,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,WAAW,GAAG,UAAU,CAAC;IACrE,8DAA8D;IAC9D,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG,aAAa,CAuClE;AAqBD,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACtC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,WAAW,CAAC,CAmCtB"}