@winspan/claude-forge 8.54.4 → 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 (880) hide show
  1. package/DEVELOPMENT.md +649 -33
  2. package/README.md +154 -16
  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-openspec.md +0 -89
  801. package/dist/skills/official/official-performance-optimization.md +0 -30
  802. package/dist/skills/official/official-pr-review.md +0 -35
  803. package/dist/skills/official/official-release-checklist.md +0 -30
  804. package/dist/skills/official/official-security-hardening.md +0 -32
  805. package/dist/skills/official/official-spec-driven-design.md +0 -31
  806. package/dist/skills/official/planning-with-files.md +0 -241
  807. package/dist/skills/official/ui-ux-pro-max.md +0 -105
  808. package/dist/skills/official/webapp-testing.md +0 -96
  809. package/dist/skills/official-skills.d.ts +0 -26
  810. package/dist/skills/official-skills.d.ts.map +0 -1
  811. package/dist/skills/official-skills.js +0 -74
  812. package/dist/skills/official-skills.js.map +0 -1
  813. package/dist/skills/semantic-matcher.d.ts +0 -60
  814. package/dist/skills/semantic-matcher.d.ts.map +0 -1
  815. package/dist/skills/semantic-matcher.js +0 -192
  816. package/dist/skills/semantic-matcher.js.map +0 -1
  817. package/dist/skills/upgrade-engine.d.ts +0 -93
  818. package/dist/skills/upgrade-engine.d.ts.map +0 -1
  819. package/dist/skills/upgrade-engine.js +0 -447
  820. package/dist/skills/upgrade-engine.js.map +0 -1
  821. package/dist/skills/upgrade-prompt.d.ts +0 -20
  822. package/dist/skills/upgrade-prompt.d.ts.map +0 -1
  823. package/dist/skills/upgrade-prompt.js +0 -75
  824. package/dist/skills/upgrade-prompt.js.map +0 -1
  825. package/dist/web/routes/ai.d.ts +0 -10
  826. package/dist/web/routes/ai.d.ts.map +0 -1
  827. package/dist/web/routes/ai.js +0 -186
  828. package/dist/web/routes/ai.js.map +0 -1
  829. package/dist/web/routes/token-usage.d.ts +0 -7
  830. package/dist/web/routes/token-usage.d.ts.map +0 -1
  831. package/dist/web/routes/token-usage.js +0 -18
  832. package/dist/web/routes/token-usage.js.map +0 -1
  833. package/dist/web/ssrf-guard.d.ts +0 -35
  834. package/dist/web/ssrf-guard.d.ts.map +0 -1
  835. package/dist/web/ssrf-guard.js +0 -93
  836. package/dist/web/ssrf-guard.js.map +0 -1
  837. package/dist/web/static/assets/AIConfig-CdDWzJyO.js +0 -2
  838. package/dist/web/static/assets/AIConfig-CdDWzJyO.js.map +0 -1
  839. package/dist/web/static/assets/Dashboard-CoEmmIDt.js +0 -2
  840. package/dist/web/static/assets/Dashboard-CoEmmIDt.js.map +0 -1
  841. package/dist/web/static/assets/Drawer-DdRTzlLB.js +0 -2
  842. package/dist/web/static/assets/Drawer-DdRTzlLB.js.map +0 -1
  843. package/dist/web/static/assets/Events-DrIq1SUS.js +0 -2
  844. package/dist/web/static/assets/Events-DrIq1SUS.js.map +0 -1
  845. package/dist/web/static/assets/Reports-DFBM3MDK.js +0 -2
  846. package/dist/web/static/assets/Reports-DFBM3MDK.js.map +0 -1
  847. package/dist/web/static/assets/SearchInput-qCj_jAcf.js +0 -2
  848. package/dist/web/static/assets/SearchInput-qCj_jAcf.js.map +0 -1
  849. package/dist/web/static/assets/SessionDetail-CCzwdoT7.js +0 -2
  850. package/dist/web/static/assets/SessionDetail-CCzwdoT7.js.map +0 -1
  851. package/dist/web/static/assets/Sessions-FfLYkAw9.js +0 -2
  852. package/dist/web/static/assets/Sessions-FfLYkAw9.js.map +0 -1
  853. package/dist/web/static/assets/Skills-C8Gvs3Qa.js +0 -2
  854. package/dist/web/static/assets/Skills-C8Gvs3Qa.js.map +0 -1
  855. package/dist/web/static/assets/TaskDetail-BS8pYhaR.js +0 -2
  856. package/dist/web/static/assets/TaskDetail-BS8pYhaR.js.map +0 -1
  857. package/dist/web/static/assets/Tasks-CyuhizG8.js +0 -2
  858. package/dist/web/static/assets/Tasks-CyuhizG8.js.map +0 -1
  859. package/dist/web/static/assets/charts-CLrM0_uM.js +0 -37
  860. package/dist/web/static/assets/charts-CLrM0_uM.js.map +0 -1
  861. package/dist/web/static/assets/date-fns-CZ_bHujz.js +0 -2
  862. package/dist/web/static/assets/date-fns-CZ_bHujz.js.map +0 -1
  863. package/dist/web/static/assets/export-L_VBD2p1.js +0 -4
  864. package/dist/web/static/assets/export-L_VBD2p1.js.map +0 -1
  865. package/dist/web/static/assets/index-CBX47X8l.js +0 -3
  866. package/dist/web/static/assets/index-CBX47X8l.js.map +0 -1
  867. package/dist/web/static/assets/index-DjIoMdoR.css +0 -1
  868. package/dist/web/static/assets/lucide-Bs_edTLa.js +0 -232
  869. package/dist/web/static/assets/lucide-Bs_edTLa.js.map +0 -1
  870. package/dist/web/static/assets/query-C99w429o.js +0 -2
  871. package/dist/web/static/assets/react-vendor-CSp-GLFF.js +0 -49
  872. package/dist/web/static/assets/react-vendor-CSp-GLFF.js.map +0 -1
  873. package/dist/web/static/assets/syntax-highlighter-44FakypI.js +0 -9
  874. package/dist/web/static/assets/syntax-highlighter-44FakypI.js.map +0 -1
  875. package/dist/web/static/assets/task-title-BhOcemuR.js +0 -2
  876. package/dist/web/static/assets/task-title-BhOcemuR.js.map +0 -1
  877. package/dist/web/static/assets/time-Bxuk0M-C.js +0 -2
  878. package/dist/web/static/assets/time-Bxuk0M-C.js.map +0 -1
  879. package/dist/web/static/assets/vendor-CMMjVdZs.js +0 -64
  880. package/dist/web/static/assets/vendor-CMMjVdZs.js.map +0 -1
@@ -0,0 +1,178 @@
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 const OUTCOME_THRESHOLDS = {
46
+ /** Below this duration with few events → `abandoned/too_short`. */
47
+ MIN_DURATION_FOR_ABANDONED_SEC: 30,
48
+ /** Below this event count combined with short duration → `abandoned/too_short`. */
49
+ MIN_EVENT_FOR_ABANDONED: 5,
50
+ /** At or below this event count → `abandoned/no_work` (regardless of duration). */
51
+ 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 const EDIT_INTENT_THRESHOLD_FOR_WORK = 1;
62
+ /**
63
+ * Classify an outcome from aggregated signals. Pure function; no I/O.
64
+ *
65
+ * Decision tree (spec 1100 v2 — edit-intent-driven):
66
+ * 1. event_count <= 1 → abandoned/no_work
67
+ * 2. duration < 30s && event_count < 5 → abandoned/too_short
68
+ * 3. edit_intent == 0 → answered/no-change-expected
69
+ * 4. edit_intent > 0 → success/did-work
70
+ * (fallback: partial — effectively unreachable, defensive only)
71
+ *
72
+ * `null` / undefined / NaN inputs are coerced defensively (missing counts → 0,
73
+ * missing timestamps → durationSec = 0) so callers can pass partial data
74
+ * without blowing up.
75
+ */
76
+ export function classifyOutcome(input) {
77
+ const startMs = parseTs(input.start_time);
78
+ const endMs = parseTs(input.end_time);
79
+ const durationSec = startMs !== null && endMs !== null && endMs >= startMs
80
+ ? (endMs - startMs) / 1000
81
+ : 0;
82
+ const eventCount = nonNegInt(input.event_count);
83
+ // Primary signal: >0 means code was changed (Edit/Write/MultiEdit/Notebook),
84
+ // ==0 means a pure Q&A / research task. Reads only tool_name → gzip-safe.
85
+ const editIntent = nonNegInt(input.edit_intent_count);
86
+ const hasEditIntent = editIntent >= EDIT_INTENT_THRESHOLD_FOR_WORK;
87
+ // ── 1. abandoned ────────────────────────────────────────────────────────
88
+ if (eventCount <= OUTCOME_THRESHOLDS.ABSOLUTE_NO_WORK_EVENT_CAP) {
89
+ return { outcome: 'abandoned', reason: 'no_work' };
90
+ }
91
+ if (durationSec < OUTCOME_THRESHOLDS.MIN_DURATION_FOR_ABANDONED_SEC &&
92
+ eventCount < OUTCOME_THRESHOLDS.MIN_EVENT_FOR_ABANDONED) {
93
+ return { outcome: 'abandoned', reason: 'too_short' };
94
+ }
95
+ // ── 2. answered (pure Q&A / research — no change expected) ───────────────
96
+ // No edit intent → the task did exactly what was asked (answer / investigate)
97
+ // and legitimately produced no code change. NOT a failure.
98
+ if (!hasEditIntent) {
99
+ return { outcome: 'answered', reason: 'no-change-expected' };
100
+ }
101
+ // ── 3. success (code was changed) ────────────────────────────────────────
102
+ // edit_intent > 0 → the task (incl. sub-agents whose Edit/Write events are
103
+ // linked to this task) changed code. commit_count is surfaced in the reason
104
+ // for context but does NOT gate the verdict.
105
+ const commits = nonNegInt(input.commit_count);
106
+ const reason = commits > 0 ? `did-work+commit=${commits}` : 'did-work';
107
+ return { outcome: 'success', reason };
108
+ }
109
+ // ── Git signal gathering (informational only) ──────────────────────────────
110
+ //
111
+ // spec 1100 v2: the verdict no longer depends on git. `collectCommitStats` is
112
+ // kept ONLY as an informational session-level signal (other callers —
113
+ // backfill-outcomes.ts, idle-session-sweeper — still import it) so the success
114
+ // `reason` can optionally surface a commit count. The previous per-task
115
+ // file→commit attribution (`attributeCommitsToTasks`) was DELETED: it relied on
116
+ // decoding gzip `tool_input` for file paths, which silently failed and
117
+ // corrupted the verdict (0 commits attributed → real work judged failed).
118
+ import { execFile } from 'node:child_process';
119
+ import { promisify } from 'node:util';
120
+ import { existsSync } from 'node:fs';
121
+ const execFileAsync = promisify(execFile);
122
+ /** Subjects matching these patterns count as "reverted_commits" (case-insensitive). */
123
+ const REVERT_KEYWORDS_REGEX = /^(revert|hotfix|amend|fix\s+typo)/i;
124
+ /**
125
+ * Gather git commit stats for the time window `[startIso, endIso]` at
126
+ * `projectPath`. Returns `{ commit_count: 0, reverted_commits: 0 }` for any
127
+ * failure (non-git directory, missing path, git not installed, timeout, etc.) —
128
+ * outcome classifier handles "no signal" as the non-git fallback.
129
+ *
130
+ * Timeout: 5s total (per spec §2.5 prior art).
131
+ */
132
+ export async function collectCommitStats(projectPath, startIso, endIso) {
133
+ if (!projectPath || !existsSync(projectPath)) {
134
+ return { commit_count: 0, reverted_commits: 0 };
135
+ }
136
+ const opts = { cwd: projectPath, timeout: 5000 };
137
+ try {
138
+ // Confirm a git work-tree at projectPath; cheaper than letting `log` fail.
139
+ await execFileAsync('git', ['rev-parse', '--is-inside-work-tree'], opts);
140
+ }
141
+ catch {
142
+ return { commit_count: 0, reverted_commits: 0 };
143
+ }
144
+ try {
145
+ // `--all` so commits on non-HEAD branches still count (rare for our case
146
+ // but cheap to include). `%s` outputs subject only.
147
+ const { stdout } = await execFileAsync('git', [
148
+ 'log',
149
+ '--all',
150
+ '--since', startIso,
151
+ '--until', endIso,
152
+ '--pretty=format:%s',
153
+ ], opts);
154
+ const lines = stdout
155
+ .toString()
156
+ .split('\n')
157
+ .map((l) => l.trim())
158
+ .filter((l) => l.length > 0);
159
+ const reverted = lines.filter((subj) => REVERT_KEYWORDS_REGEX.test(subj)).length;
160
+ return { commit_count: lines.length, reverted_commits: reverted };
161
+ }
162
+ catch {
163
+ return { commit_count: 0, reverted_commits: 0 };
164
+ }
165
+ }
166
+ // ── Helpers ───────────────────────────────────────────────────────────────
167
+ function parseTs(s) {
168
+ if (typeof s !== 'string' || s.length === 0)
169
+ return null;
170
+ const t = Date.parse(s);
171
+ return Number.isFinite(t) ? t : null;
172
+ }
173
+ function nonNegInt(v) {
174
+ if (typeof v !== 'number' || !Number.isFinite(v) || v < 0)
175
+ return 0;
176
+ return Math.floor(v);
177
+ }
178
+ //# sourceMappingURL=outcome-classifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outcome-classifier.js","sourceRoot":"","sources":["../../../src/daemon/services/outcome-classifier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * OutcomeNudge — outcome-backfill soft-gate (decision 1ac6fc31, 2026-06-04).
3
+ *
4
+ * Closes the last gap in the harness learning loop: of ~12 resolved decisions,
5
+ * only 3 had their `outcome` back-filled (75% miss), so decision-maker's
6
+ * Step 1.5 precedent weighting ran empty. CLAUDE.md already mandates the
7
+ * implementing agent back-fill via `cf decisions outcome <id> --result ...`,
8
+ * but the document constraint alone failed.
9
+ *
10
+ * This is a PURE SOFT-GATE. It ONLY emits a `[OUTCOME NUDGE]` systemMessage
11
+ * reminding the human/agent to run `cf decisions outcome`. It NEVER:
12
+ * - writes / infers an outcome value (precedent f4614f7f deleted auto-
13
+ * attribution twice — this gate produces text only, never touches
14
+ * writeDecisionOutcome),
15
+ * - denies / blocks any tool (no `allow:false`, no PreToolUse rule).
16
+ *
17
+ * Two delivery paths, both surfacing at UserPromptSubmit (the only hook whose
18
+ * systemMessage Claude Code actually consumes — see OQ1 below):
19
+ *
20
+ * Option A (threshold, primary backstop): when a session/project has
21
+ * accumulated >= N (`outcome_nudge_threshold`, default 2) resolved-but-
22
+ * unfilled decisions, inject the nudge on the next UserPromptSubmit, subject
23
+ * to cooldown.
24
+ *
25
+ * Option B (completion nudge, DEGRADED): the Stop hook is the natural "just
26
+ * finished" moment, but OQ1 found that `stop.sh` only parses `allow`/`reason`
27
+ * from the daemon response — it never echoes systemMessage back to Claude
28
+ * Code. So Option B cannot deliver text at Stop. Degraded path: StopHandler
29
+ * calls `markStopPending()` to set an in-memory per-session flag; the next
30
+ * UserPromptSubmit consumes it and injects the nudge regardless of the
31
+ * threshold (completion timing is high-signal). The flag is transient (lost
32
+ * on daemon restart) — acceptable because Option A's threshold still catches
33
+ * the same backlog on the next prompt.
34
+ *
35
+ * Cooldown (anti-nag): per-session in-memory timestamp + the global
36
+ * `outcome_nudge_cooldown_seconds` (default 86400 = 24h). Within the cooldown
37
+ * window we do not re-nudge the same session. The cooldown is NOT applied to
38
+ * the degraded Option B path's first fire after a Stop — completion is the
39
+ * moment we most want the reminder — but it IS recorded so a follow-up prompt
40
+ * seconds later doesn't double-nudge.
41
+ *
42
+ * Fail-safe: every public method catches and degrades to "no nudge". The soft-
43
+ * gate must never break the prompt pipeline.
44
+ */
45
+ import type { SQLiteStorage } from '../../core/storage/sqlite.js';
46
+ /** forge_config key for the resolved-unfilled threshold (Option A). */
47
+ export declare const OUTCOME_NUDGE_THRESHOLD_KEY = "outcome_nudge_threshold";
48
+ /** Default Option A threshold — nudge once 2 decisions are awaiting back-fill. */
49
+ export declare const DEFAULT_OUTCOME_NUDGE_THRESHOLD = 2;
50
+ /** forge_config key for the per-session cooldown (seconds). */
51
+ export declare const OUTCOME_NUDGE_COOLDOWN_KEY = "outcome_nudge_cooldown_seconds";
52
+ /** Default cooldown — 24h between nudges for the same session. */
53
+ export declare const DEFAULT_OUTCOME_NUDGE_COOLDOWN_SECONDS = 86400;
54
+ /**
55
+ * Resolve the Option A threshold from forge_config, falling back to the
56
+ * default for missing / non-finite / < 1 values.
57
+ */
58
+ export declare function resolveOutcomeNudgeThreshold(storage?: SQLiteStorage | null): number;
59
+ /**
60
+ * Resolve the cooldown (seconds) from forge_config. Values <= 0 or above the
61
+ * hard bound fall back to the default.
62
+ */
63
+ export declare function resolveOutcomeNudgeCooldownSeconds(storage?: SQLiteStorage | null): number;
64
+ /**
65
+ * Format the `[OUTCOME NUDGE]` systemMessage. Independent `[OUTCOME NUDGE]`
66
+ * prefix (parallel to `[DECISION HINT]`) so the two never visually merge when
67
+ * both appear in the same systemMessage (OQ4). Pure / exported for tests.
68
+ *
69
+ * `reason` distinguishes the trigger purely for the leading line; the body
70
+ * (id list + command) is identical either way.
71
+ */
72
+ export declare function formatOutcomeNudge(ids: string[], reason: 'completion' | 'threshold'): string;
73
+ /**
74
+ * OutcomeNudgeService — owns the cooldown / Stop-pending state and computes the
75
+ * nudge message. One instance lives on UserPromptHandler; StopHandler reaches
76
+ * it through the existing userPromptHandler reference to set the Stop flag.
77
+ */
78
+ export declare class OutcomeNudgeService {
79
+ private readonly state;
80
+ private key;
81
+ /**
82
+ * Degraded Option B entry point. Called by StopHandler at completion. Sets an
83
+ * in-memory flag iff the session/project has resolved-unfilled decisions, so
84
+ * the NEXT UserPromptSubmit injects the nudge regardless of the threshold.
85
+ *
86
+ * Pure read of storage + flag set; NEVER writes an outcome. Fail-silent.
87
+ */
88
+ markStopPending(sessionId: string, projectPath: string, storage: SQLiteStorage | null): void;
89
+ /**
90
+ * UserPromptSubmit entry point. Returns the `[OUTCOME NUDGE]` message to
91
+ * append to systemMessage, or null when no nudge is warranted.
92
+ *
93
+ * Fires when EITHER:
94
+ * - the Stop-pending flag is set (degraded Option B, completion timing), OR
95
+ * - resolved-unfilled count >= threshold (Option A backstop)
96
+ * AND the per-session cooldown has elapsed.
97
+ *
98
+ * Side effects: clears the Stop-pending flag (consumed once) and records the
99
+ * nudge timestamp for cooldown. NEVER writes an outcome. Fail-silent → null.
100
+ */
101
+ evaluate(sessionId: string, projectPath: string, storage: SQLiteStorage | null, nowMs?: number): string | null;
102
+ /** Clear per-session state. Called by StopHandler.clearSession path is NOT
103
+ * used (we need the flag to survive into the next prompt); exposed for tests
104
+ * and for symmetry with other per-session caches. */
105
+ clearSession(sessionId: string, projectPath: string): void;
106
+ }
107
+ //# sourceMappingURL=outcome-nudge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outcome-nudge.d.ts","sourceRoot":"","sources":["../../../src/daemon/services/outcome-nudge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAGlE,uEAAuE;AACvE,eAAO,MAAM,2BAA2B,4BAA4B,CAAC;AAErE,kFAAkF;AAClF,eAAO,MAAM,+BAA+B,IAAI,CAAC;AAEjD,+DAA+D;AAC/D,eAAO,MAAM,0BAA0B,mCAAmC,CAAC;AAE3E,kEAAkE;AAClE,eAAO,MAAM,sCAAsC,QAAQ,CAAC;AAQ5D;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI,GAAG,MAAM,CAWnF;AAED;;;GAGG;AACH,wBAAgB,kCAAkC,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI,GAAG,MAAM,CAazF;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,EAAE,EACb,MAAM,EAAE,YAAY,GAAG,WAAW,GACjC,MAAM,CA4BR;AAaD;;;;GAIG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmC;IAEzD,OAAO,CAAC,GAAG;IAIX;;;;;;OAMG;IACH,eAAe,CACb,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,aAAa,GAAG,IAAI,GAC5B,IAAI;IAkBP;;;;;;;;;;;OAWG;IACH,QAAQ,CACN,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,aAAa,GAAG,IAAI,EAC7B,KAAK,GAAE,MAAmB,GACzB,MAAM,GAAG,IAAI;IAkEhB;;yDAEqD;IACrD,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI;CAG3D"}
@@ -0,0 +1,242 @@
1
+ /**
2
+ * OutcomeNudge — outcome-backfill soft-gate (decision 1ac6fc31, 2026-06-04).
3
+ *
4
+ * Closes the last gap in the harness learning loop: of ~12 resolved decisions,
5
+ * only 3 had their `outcome` back-filled (75% miss), so decision-maker's
6
+ * Step 1.5 precedent weighting ran empty. CLAUDE.md already mandates the
7
+ * implementing agent back-fill via `cf decisions outcome <id> --result ...`,
8
+ * but the document constraint alone failed.
9
+ *
10
+ * This is a PURE SOFT-GATE. It ONLY emits a `[OUTCOME NUDGE]` systemMessage
11
+ * reminding the human/agent to run `cf decisions outcome`. It NEVER:
12
+ * - writes / infers an outcome value (precedent f4614f7f deleted auto-
13
+ * attribution twice — this gate produces text only, never touches
14
+ * writeDecisionOutcome),
15
+ * - denies / blocks any tool (no `allow:false`, no PreToolUse rule).
16
+ *
17
+ * Two delivery paths, both surfacing at UserPromptSubmit (the only hook whose
18
+ * systemMessage Claude Code actually consumes — see OQ1 below):
19
+ *
20
+ * Option A (threshold, primary backstop): when a session/project has
21
+ * accumulated >= N (`outcome_nudge_threshold`, default 2) resolved-but-
22
+ * unfilled decisions, inject the nudge on the next UserPromptSubmit, subject
23
+ * to cooldown.
24
+ *
25
+ * Option B (completion nudge, DEGRADED): the Stop hook is the natural "just
26
+ * finished" moment, but OQ1 found that `stop.sh` only parses `allow`/`reason`
27
+ * from the daemon response — it never echoes systemMessage back to Claude
28
+ * Code. So Option B cannot deliver text at Stop. Degraded path: StopHandler
29
+ * calls `markStopPending()` to set an in-memory per-session flag; the next
30
+ * UserPromptSubmit consumes it and injects the nudge regardless of the
31
+ * threshold (completion timing is high-signal). The flag is transient (lost
32
+ * on daemon restart) — acceptable because Option A's threshold still catches
33
+ * the same backlog on the next prompt.
34
+ *
35
+ * Cooldown (anti-nag): per-session in-memory timestamp + the global
36
+ * `outcome_nudge_cooldown_seconds` (default 86400 = 24h). Within the cooldown
37
+ * window we do not re-nudge the same session. The cooldown is NOT applied to
38
+ * the degraded Option B path's first fire after a Stop — completion is the
39
+ * moment we most want the reminder — but it IS recorded so a follow-up prompt
40
+ * seconds later doesn't double-nudge.
41
+ *
42
+ * Fail-safe: every public method catches and degrades to "no nudge". The soft-
43
+ * gate must never break the prompt pipeline.
44
+ */
45
+ import { logger } from '../../core/utils/logger.js';
46
+ /** forge_config key for the resolved-unfilled threshold (Option A). */
47
+ export const OUTCOME_NUDGE_THRESHOLD_KEY = 'outcome_nudge_threshold';
48
+ /** Default Option A threshold — nudge once 2 decisions are awaiting back-fill. */
49
+ export const DEFAULT_OUTCOME_NUDGE_THRESHOLD = 2;
50
+ /** forge_config key for the per-session cooldown (seconds). */
51
+ export const OUTCOME_NUDGE_COOLDOWN_KEY = 'outcome_nudge_cooldown_seconds';
52
+ /** Default cooldown — 24h between nudges for the same session. */
53
+ export const DEFAULT_OUTCOME_NUDGE_COOLDOWN_SECONDS = 86400;
54
+ /** Hard upper bound for the cooldown override (7 days). */
55
+ const MAX_OUTCOME_NUDGE_COOLDOWN_SECONDS = 7 * 86400;
56
+ /** Max ids to list inline in the nudge message (keeps it readable). */
57
+ const MAX_IDS_IN_MESSAGE = 8;
58
+ /**
59
+ * Resolve the Option A threshold from forge_config, falling back to the
60
+ * default for missing / non-finite / < 1 values.
61
+ */
62
+ export function resolveOutcomeNudgeThreshold(storage) {
63
+ if (!storage)
64
+ return DEFAULT_OUTCOME_NUDGE_THRESHOLD;
65
+ try {
66
+ const raw = storage.readConfig(OUTCOME_NUDGE_THRESHOLD_KEY);
67
+ if (raw === undefined || raw === null)
68
+ return DEFAULT_OUTCOME_NUDGE_THRESHOLD;
69
+ const n = Number(raw);
70
+ if (Number.isFinite(n) && n >= 1)
71
+ return Math.floor(n);
72
+ }
73
+ catch {
74
+ // fail-silent
75
+ }
76
+ return DEFAULT_OUTCOME_NUDGE_THRESHOLD;
77
+ }
78
+ /**
79
+ * Resolve the cooldown (seconds) from forge_config. Values <= 0 or above the
80
+ * hard bound fall back to the default.
81
+ */
82
+ export function resolveOutcomeNudgeCooldownSeconds(storage) {
83
+ if (!storage)
84
+ return DEFAULT_OUTCOME_NUDGE_COOLDOWN_SECONDS;
85
+ try {
86
+ const raw = storage.readConfig(OUTCOME_NUDGE_COOLDOWN_KEY);
87
+ if (raw === undefined || raw === null)
88
+ return DEFAULT_OUTCOME_NUDGE_COOLDOWN_SECONDS;
89
+ const n = Number(raw);
90
+ if (!Number.isFinite(n))
91
+ return DEFAULT_OUTCOME_NUDGE_COOLDOWN_SECONDS;
92
+ if (n <= 0)
93
+ return DEFAULT_OUTCOME_NUDGE_COOLDOWN_SECONDS;
94
+ if (n > MAX_OUTCOME_NUDGE_COOLDOWN_SECONDS)
95
+ return DEFAULT_OUTCOME_NUDGE_COOLDOWN_SECONDS;
96
+ return Math.floor(n);
97
+ }
98
+ catch {
99
+ return DEFAULT_OUTCOME_NUDGE_COOLDOWN_SECONDS;
100
+ }
101
+ }
102
+ /**
103
+ * Format the `[OUTCOME NUDGE]` systemMessage. Independent `[OUTCOME NUDGE]`
104
+ * prefix (parallel to `[DECISION HINT]`) so the two never visually merge when
105
+ * both appear in the same systemMessage (OQ4). Pure / exported for tests.
106
+ *
107
+ * `reason` distinguishes the trigger purely for the leading line; the body
108
+ * (id list + command) is identical either way.
109
+ */
110
+ export function formatOutcomeNudge(ids, reason) {
111
+ const shown = ids.slice(0, MAX_IDS_IN_MESSAGE);
112
+ const extra = ids.length - shown.length;
113
+ const idList = shown.join(' ') + (extra > 0 ? ` (+${extra} more)` : '');
114
+ const lead = reason === 'completion'
115
+ ? `刚完工 — 有 ${ids.length} 个已批准(resolved)的决策还没回填实施结果(outcome)。`
116
+ : `已攒到 ${ids.length} 个已批准(resolved)但未回填 outcome 的决策。`;
117
+ const lines = [
118
+ '[OUTCOME NUDGE]',
119
+ '',
120
+ lead,
121
+ `回填能让 decision-maker 的历史先例加权(成功加权/失败警示)不空转。请就近回填:`,
122
+ '',
123
+ ...shown.map((id) => `cf decisions outcome ${id} --result success|failed|partial [--note ...]`),
124
+ ];
125
+ if (extra > 0) {
126
+ lines.push(`# 还有 ${extra} 个:cf decisions outcome --list-pending 查看全部`);
127
+ }
128
+ lines.push('');
129
+ lines.push(`(仅提示,不阻断;outcome 永不自动推断——必须你/实施 agent 明确回填)`);
130
+ lines.push(`<!-- outcome-nudge: ${idList} -->`);
131
+ return lines.join('\n');
132
+ }
133
+ /**
134
+ * OutcomeNudgeService — owns the cooldown / Stop-pending state and computes the
135
+ * nudge message. One instance lives on UserPromptHandler; StopHandler reaches
136
+ * it through the existing userPromptHandler reference to set the Stop flag.
137
+ */
138
+ export class OutcomeNudgeService {
139
+ state = new Map();
140
+ key(sessionId, projectPath) {
141
+ return `${sessionId}:${projectPath}`;
142
+ }
143
+ /**
144
+ * Degraded Option B entry point. Called by StopHandler at completion. Sets an
145
+ * in-memory flag iff the session/project has resolved-unfilled decisions, so
146
+ * the NEXT UserPromptSubmit injects the nudge regardless of the threshold.
147
+ *
148
+ * Pure read of storage + flag set; NEVER writes an outcome. Fail-silent.
149
+ */
150
+ markStopPending(sessionId, projectPath, storage) {
151
+ if (!storage || !sessionId)
152
+ return;
153
+ try {
154
+ const pending = storage.listResolvedUnfilledDecisions(sessionId, projectPath);
155
+ if (pending.length === 0)
156
+ return;
157
+ const k = this.key(sessionId, projectPath);
158
+ const s = this.state.get(k) ?? { lastNudgedMs: 0, stopPending: false };
159
+ s.stopPending = true;
160
+ this.state.set(k, s);
161
+ logger.debug(`[OutcomeNudge] Stop-pending flag set for ${sessionId} ` +
162
+ `(${pending.length} resolved-unfilled)`);
163
+ }
164
+ catch (err) {
165
+ logger.debug(`[OutcomeNudge] markStopPending failed (skipped): ${err}`);
166
+ }
167
+ }
168
+ /**
169
+ * UserPromptSubmit entry point. Returns the `[OUTCOME NUDGE]` message to
170
+ * append to systemMessage, or null when no nudge is warranted.
171
+ *
172
+ * Fires when EITHER:
173
+ * - the Stop-pending flag is set (degraded Option B, completion timing), OR
174
+ * - resolved-unfilled count >= threshold (Option A backstop)
175
+ * AND the per-session cooldown has elapsed.
176
+ *
177
+ * Side effects: clears the Stop-pending flag (consumed once) and records the
178
+ * nudge timestamp for cooldown. NEVER writes an outcome. Fail-silent → null.
179
+ */
180
+ evaluate(sessionId, projectPath, storage, nowMs = Date.now()) {
181
+ if (!storage || !sessionId)
182
+ return null;
183
+ try {
184
+ const k = this.key(sessionId, projectPath);
185
+ const s = this.state.get(k) ?? { lastNudgedMs: 0, stopPending: false };
186
+ const pending = storage.listResolvedUnfilledDecisions(sessionId, projectPath);
187
+ // Always clear a stale Stop flag when nothing is actually pending — keeps
188
+ // the flag from lingering if outcomes got filled out-of-band.
189
+ if (pending.length === 0) {
190
+ if (s.stopPending) {
191
+ s.stopPending = false;
192
+ this.state.set(k, s);
193
+ }
194
+ return null;
195
+ }
196
+ const threshold = resolveOutcomeNudgeThreshold(storage);
197
+ const reason = s.stopPending
198
+ ? 'completion'
199
+ : pending.length >= threshold
200
+ ? 'threshold'
201
+ : null;
202
+ if (reason === null)
203
+ return null;
204
+ // Cooldown gate (applies to BOTH paths — a Stop followed by an immediate
205
+ // prompt should not double-nudge). The Stop flag is consumed regardless,
206
+ // so a cooled-down completion still clears the flag (the threshold path
207
+ // will re-surface it later if the backlog persists).
208
+ const cooldownSeconds = resolveOutcomeNudgeCooldownSeconds(storage);
209
+ const elapsedMs = nowMs - s.lastNudgedMs;
210
+ const cooledDown = s.lastNudgedMs === 0 || elapsedMs >= cooldownSeconds * 1000;
211
+ if (!cooledDown) {
212
+ if (s.stopPending) {
213
+ s.stopPending = false; // consume — don't let it fire after cooldown stale
214
+ this.state.set(k, s);
215
+ }
216
+ logger.debug(`[OutcomeNudge] suppressed by cooldown (session=${sessionId}, ` +
217
+ `elapsed=${Math.round(elapsedMs / 1000)}s < ${cooldownSeconds}s)`);
218
+ return null;
219
+ }
220
+ const ids = pending.map((r) => r.id);
221
+ const message = formatOutcomeNudge(ids, reason);
222
+ // Record + consume.
223
+ s.lastNudgedMs = nowMs;
224
+ s.stopPending = false;
225
+ this.state.set(k, s);
226
+ logger.info(`[OutcomeNudge] emitted (reason=${reason}, count=${ids.length}, ` +
227
+ `session=${sessionId})`);
228
+ return message;
229
+ }
230
+ catch (err) {
231
+ logger.debug(`[OutcomeNudge] evaluate failed (skipped): ${err}`);
232
+ return null;
233
+ }
234
+ }
235
+ /** Clear per-session state. Called by StopHandler.clearSession path is NOT
236
+ * used (we need the flag to survive into the next prompt); exposed for tests
237
+ * and for symmetry with other per-session caches. */
238
+ clearSession(sessionId, projectPath) {
239
+ this.state.delete(this.key(sessionId, projectPath));
240
+ }
241
+ }
242
+ //# sourceMappingURL=outcome-nudge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outcome-nudge.js","sourceRoot":"","sources":["../../../src/daemon/services/outcome-nudge.ts"],"names":[],"mappings":"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"}